poi导入过滤excel空值(poi导出Excel)

Excel表格网 2022-10-08 13:40 编辑:祝富 128阅读

1. poi导出Excel

合并单元格换行方式跟普通单元格的换行方式一样,有两种方式,一个是设置自动换行,一个是设置强制换行,下面分别介绍。

1、自动换行。

选中合并单元格,右键设置单元格格式,在对齐命令中,选中自动换行。这样改变合并单元格的列宽,数据就跟随列宽的大小自动换行。

2、强制换行。

选中合并单元格,将光标放在需要换行的位置,按下alt+enter键,强制换行。强制换行的数据,不会因单元格列宽的大小而改变。


2. poi导出excel速度特别慢

利用poi操作excel。同一个workbook 中创建的 cellstyle 不能超过4000 。估计你是遍历单元格创建生成的吧?可考虑创建map集合缓存必要cellstyle格式。已存在格式直接设置使用,不存在的再创建。一般情况下,一个workbook中使用到的cellstyle格式不会超过500!


3. POI导出excel,部分内容有问题

这个我做奖金,考勤系统的时候经常用到,是一个方法,希望能帮到你。用的apachepoi:/***将奖金列表转换为奖金报表*@parambonus*@returnbyte[]*/privatebyte[]mainProcessBonusListToReport(Listbonuses){HSSFWorkbookhssfWorkbook=newHSSFWorkbook();HSSFSheethssfSheet=hssfWorkbook.createSheet("总奖金报表单")

;/*第一行单元格合并*/hssfSheet.addMergedRegion(newCellRangeAddress(0,0,0,12))

;/*第一行*/HSSFRowhssfRow=hssfSheet.createRow(0);HSSFCellhssfCell=hssfRow.createCell(0);hssfCell.setCellValue("派单业务考核记录")

;/*第二行*/hssfRow=hssfSheet.createRow(1)

;/*列名*/String[]titles={"序号","工号","话务员姓名","规范奖考核","业务奖金","话务奖金","服务质量奖金","星级系数","组长津贴","总奖金","增资奖金","英语翻译","实发总奖金"}

;/*for循环生成列名*/for(inti=0;i


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导出excel内存溢出

你试试设置一下单元格的编码 cell.setCellType(HSSFCell.ENCODING_UTF_8);


6. 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");


7. POI导出excel文件格式和扩展名不匹配

不知道楼主知不知道舰娘?真是哔了poi个梗出自舰娘(舰队收藏)这部动漫(当然也有游戏,游戏很火之后再出的动漫)之中,来源是其中有一位舰娘名叫夕立,这位舰娘在说话时,会在句子的结尾加上poi这个语气词后缀,这个口癖让人觉得很萌,印象极为深刻,所以现在提到poi就是指夕立。

同时,舰队收藏对夕立有一个这样的说法,夕立稳如狗。所以夕立=poi=狗的等式就形成了。众所周知,现在网上又有一句很流行的俚语:真是日了狗了。“日”因为是不和谐的词,所以被哔这个音和谐掉了。而狗,参照前面给的等式,所以就转化成了poi。于是真是日了狗了,就成了真是哔了poi啦。


顶一下
(0)
0%
踩一下
(0)
0%
相关评论
我要评论
点击我更换图片