1. poi读取大数据量excel的方法
空的CELL不是不处理,这个数据是插入数据库的,所以有些是可以未空的,而且输入Excel表数据不是我输的,是客户输入的,如果用户不是对Excel很熟,等一下出现空行看上去没数据,其实空行上的CELL都市空值,poi也会读的,所以我想解决这个BUG
2. poi获取excel行数
(一)首先,将excel设置为最合适的行高,通过CTRow对象的setCustomHeight(false)函数实现,具体的代码如下:
XSSFWorkbook workbook = new XSSFWorkbook(文件路径或者文件流);
XSSFSheet sheet = workbook.getSheet(sheetIndex);
XSSFRow xssfRow = sheet.getRow(rowIndex);
CTRow ctRow = xssfRow.getCTRow();
ctRow.setCustomHeight(false);
(二)然后,循环每个sheet页的行,通过XSSFCell的setWrapText(true),就可以设置单元格自动换行,并且自动调整行高,将单元格内容全部显示出来;
(三)最后,对于合并的单元格,只能是通过XSSFRow的setHeight(行高值)来设置,这里说一下思路:
(1)通过sheet获取当前sheet页总共有哪些合并的单元格,例如List<CellRangeAddress> listCombineCell = sheet.getMergedRegions();
(2)计算合并单于格的高度和宽度,采用循环的方式求的每一行的高度之和或者是每一列的宽度之和;
(3)获取合并单元格的内容,首先统计中文字符的个数,然后使用String的getByte().length获取字节数,加上中文字符的个数,最后将这两者之和乘以256(为何要乘以256,可以看POI中获取列宽的源码,在里面除以列256),这样得到了内容的长度;
(4)若内容的长度小于合并单元格的宽度,就不需要进行行高设置了;若内容的长度大于合并单元格的宽度,那么通过合并单元格的宽度除以内容的长度,计算内容需要多少行才能全部显示出来,这里采用取比商大的最小整数,考虑到单元格有padding和margin距离,最好是再加上一行量;这里需要注意如何计算单元格中内容的宽度了,首先将字符串形式的内容按换行符转换成字符数组,接着计算字符数组中每一个元素的宽度,将它们的宽带和单元格实际宽度相除,这样就可以统计字符数组每个元素需要多少行来显示,最终将这些行数累加起来,最后还加上字符数组大小值,这样就得到了单元格内容需要的行数。
(5)计算合并单元格字体的高度,然后乘以内容需要的行数(第4步中求得的行数),得到内容需要的总高度;
(6)判断合并单元格是否是行合并(通过起始行号和终止行号是否相等来判断,若相等就不是行合并,否则就是行合并),若是行合并的情况,那么就需要计算是由多少行合并的(终止行号减去起始行号,再加一),接着计算每一行需要的平均高度(单元格内容的总高度除以行合并的单元格的行数),然后通过循环设置行合并的单元格区域的每一行所需要的平均高度。若不是行合并的单元格,那么直接将行高设置为单元格内容所需的总高度即可。
3. poi读取Excel
首先你要明白导入文件步骤:
1.实例化excel读取对象
2.加载excel文件
全部加载
选择加载
3.读取excel文件
全部读取
逐行读取
以下你看看那个更加适应你
顺便列出几个其他语言导入Excel文件,希望对你有帮助
PHP导入Excel文件
java把Excel文件数据导入数据库
PHP实现导出Excel文件通用方法
JXL生成的excel文件+JAVA文件下载功能
Java通用的Excel文件生成工具类,支持生成文件和浏览器直接下载
java处理Excel文件---excel文件的创建,删除,写入,读取
Java读取Excel文件
jxl解析Excel文件
JXL操作Excel文件
java POI读取Excel文件
java使用poi读取excel文件代码示例
用jxl生成Excel文件
PHP验证码文件类
PHP 下载远程文件
PHP获取远程文件的大小
php压缩CSS文件
PHP强制下载文件
php读取csv文件类
php 简单ftp文件上传范例
一个php 生成zip文件的类
4. poi读取excel的两种方式
首先要导入spring相关包,poi,和fileupload包,我是使用maven构建的。
一.导入excel
(1)使用spring上传文件
a.前台页面提交
<form name="excelImportForm" action="${pageContext.request.contextPath}/brand/importBrandSort" method="post" onsubmit="return checkImportPath();" enctype="multipart/form-data" id="excelImportForm">
<input type="hidden" name="ids" id="ids">
<div >
<div >
<label ><input id="excel_file" type="file" name="filename" accept="xls"/></label>
<div >
<input id="excel_button" type="submit" value="导入Excel"/>
</div>
</div>
</div>
<div >
<button type="button" data-dismiss="modal" onClick="uncheckBoxes();">取消</button>
</div>
b.后台spring的controller进行相关操作,这里主要讲的是使用spring上传文件,和读取文件信息。
使用spring上传文件之前,需要配置bean。
<bean id="multipartResolver" ></bean>@RequestMapping(value = "/importBrandSort", method = RequestMethod.POST)
public ModelAndView importBrandSort(@RequestParam("filename") MultipartFile file,
HttpServletRequest request,HttpServletResponse response) throws Exception {
String temp = request.getSession().getServletContext()
.getRealPath(File.separator)
+ "temp"; // 临时目录
File tempFile = new File(temp);
if (!tempFile.exists()) {
tempFile.mkdirs();
}
DiskFileUpload fu = new DiskFileUpload();
fu.setSizeMax(10 * 1024 * 1024); // 设置允许用户上传文件大小,单位:位
fu.setSizeThreshold(4096); // 设置最多只允许在内存中存储的数据,单位:位
fu.setRepositoryPath(temp); // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
// 开始读取上传信息
//
int index = 0;
/* List fileItems = null;
try {
fileItems = fu.parseRequest(request);
}
catch (Exception e) {
e.printStackTrace();
}
Iterator iter = fileItems.iterator(); // 依次处理每个上传的文件
FileItem fileItem = null;
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();// 忽略其他不是文件域的所有表单信息
if (!item.isFormField()) {
fileItem = item;
// index++;
}
}
if (fileItem == null)
return null;
*/
if (file == null)
return null;
logger.info(file.getOriginalFilename());
String name = file.getOriginalFilename();// 获取上传文件名,包括路径
//name = name.substring(name.lastIndexOf("\\") + 1);// 从全路径中提取文件名
long size = file.getSize();
if ((name == null || name.equals("")) && size == 0)
return null;
InputStream in = file.getInputStream();
List<BrandMobileInfoEntity> BrandMobileInfos = brandService
.importBrandPeriodSort(in);
// 改为人工刷新缓存KeyContextManager.clearPeriodCacheData(new
// PeriodDimensions());// 清理所有缓存
int count = BrandMobileInfos.size();
String strAlertMsg ="";
if(count!=0){
strAlertMsg= "成功导入" + count + "条!";
}else {
strAlertMsg = "导入失败!";
}
logger.info(strAlertMsg);
//request.setAttribute("brandPeriodSortList", BrandMobileInfos);
//request.setAttribute("strAlertMsg", strAlertMsg);
request.getSession().setAttribute("msg",strAlertMsg);
return get(request, response);
//return null;
}
代码中的注释部分是如果不使用spring的方式,如何拿到提交过来的文件名(需要是要apache的一些工具包),其实使用spring的也是一样,只是已经做好了封装,方便我们写代码。
代码中的后半部分是读取完上传文文件的信息和对数据库进行更新之后,输出到前台页面的信息。
上述代码中: InputStream in = file.getInputStream();
List<BrandMobileInfoEntity> BrandMobileInfos = brandService
.importBrandPeriodSort(in);读取excel的信息。
(2)使用poi读取excel
a.更新数据库
@Override
public List<BrandMobileInfoEntity> importBrandPeriodSort(InputStream in) throws Exception {
List<BrandMobileInfoEntity> brandMobileInfos = readBrandPeriodSorXls(in);
for (BrandMobileInfoEntity brandMobileInfo : brandMobileInfos) {
mapper.updateByConditions(brandMobileInfo);
}
return brandMobileInfos;
}
这部分是sevice层的代码,用于读取excel信息之后更新数据库数据,我这里是使用mybatis。定义一个类BrandMobileInfoEntity,用与保存excel表每一行的信息,而List< BrandMobileInfoEntity > 则保存了全部信息,利用这些信息对数据库进行更新。
b.读取excel信息
private List<BrandMobileInfoEntity> readBrandPeriodSorXls(InputStream is)
throws IOException, ParseException {
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
List<BrandMobileInfoEntity> brandMobileInfos = new ArrayList<BrandMobileInfoEntity>();
BrandMobileInfoEntity brandMobileInfo;
// 循环工作表Sheet
for (int numSheet = 0;
numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
// 循环行Row
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
brandMobileInfo = new BrandMobileInfoEntity();
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
for (int i = 0; i < hssfRow.getLastCellNum(); i++) {
HSSFCell brandIdHSSFCell = hssfRow.getCell(i);
if (i == 0) {
brandMobileInfo.setBrandId(Integer
.parseInt(getCellValue(brandIdHSSFCell)));
} else if (i == 1) {
continue;
} else if (i == 2) {
brandMobileInfo.setMobileShowFrom(Integer.parseInt(getCellValue(brandIdHSSFCell)));
} else if (i == 3) {
brandMobileInfo.setMobileShowTo(Integer.parseInt(getCellValue(brandIdHSSFCell)));
} else if (i == 4) {
brandMobileInfo.setSellMarkValue(getCellValue(brandIdHSSFCell));
} else if (i == 5) {
brandMobileInfo.setWarehouse(getCellValue(brandIdHSSFCell));
} else if (i ==
5. poi大数据量导出
限制它导入模板,可以通过设置关键词句限制。
6. poi将数据写入excel
但是导入EXCEL实例是要POI包,这是专门操作excel的
poi 提供的对应的excel操作方法,要完成一个任务,就得自己想办法利用这些方法了,其实好好思考 一下就行了。觉得首先得先熟悉poi的方法。这些基本操作供参考
// 创建新的Excel 工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 在Excel工作簿中建一工作表,其名为缺省值
// 如要新建一名为"效益指标"的工作表,其语句为:
HSSFSheet sheet = workbook.createSheet("效益指标");
// 在索引0的位置创建行(最顶端的行)
HSSFRow row = heet.createRow((short)0);
//在索引0的位置创建单元格(左上端)
HSSFCell cell = row.createCell((short)0);
// 定义单元格为字符串类型
cell.setCellTypeHSSFCell.CELL_TYPE_STRING);
// 在单元格中输入一些内容
cell.setCellValue("POI Excel Model");
//下一行
row=sheet.createRow( (short)1);
cell=row.createCell( (short)0);
//设置单元格内容
cell.setCellValue( "Powered by 夏天");
// 新建一输出文件流
FileOutputStream fOut = new FileOutputStream(outputFile);
// 把相应的Excel 工作簿存盘
workbook.write(fOut); fOut.flush();
// 操作结束,关闭文件
fOut.close();
7. poi导入大数据量excel
导出时自由选择路径的代码如下:
1、后台输出Excel文件代码:
OutputStream output = response.getOutputStream();
response.reset();
response.setHeader("Content-disposition", "attachment; filename=" + path);
response.setContentType("Content-Type:application/vnd.ms-excel ");
wb.write(output);
output.close();
2、前端代码:
window.open("getExcelList","_blank");
- 相关评论
- 我要评论
-