poi导入导出excel后记

来源:互联网 发布:windows 2008 编辑:程序博客网 时间:2024/04/29 09:45

续上一篇:在springmvc项目中使用poi导入导出excel

http://blog.csdn.net/kingson_wu/article/details/38942967


一.
导入时,发现了不少问题,如果是导出excel之后,在里面不删除行,只是简单的修改一些数据的话,则不会出问题,但如果是删除了一些行,或者excel表不是导出的,而是另外的excel文件,里面有很多数据ctrl+a,ctrl+v生成的,那么导入的时候就会出问题,因为里面虽然看起来的数据就那么多,但是有一些数据痕迹。很多行是空白的但是在导入的时候代码并不会认为它是空的,这样就会把空行的值转成数据导致出错。

先上一段解决了这个bug的代码:

private List<BrandMobileInfoEntity> readBrandPeriodSorXls(InputStream is)throws IOException, ParseException {HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);List<BrandMobileInfoEntity> brandMobileInfos = new ArrayList<BrandMobileInfoEntity>();BrandMobileInfoEntity brandMobileInfo = null;// 循环工作表Sheetfor (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);if (hssfSheet == null) {continue;}// 循环行Rowfor (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {HSSFRow hssfRow = hssfSheet.getRow(rowNum);int cellCount=hssfRow.getLastCellNum();if(-1==cellCount) continue;//解决空行的brandMobileInfo = new BrandMobileInfoEntity();for (int i = 0; i < cellCount; i++) {HSSFCell brandIdHSSFCell = hssfRow.getCell(i);if(brandIdHSSFCell==null){brandMobileInfo=null;break;//解决不是空行但是实际上是没数据的,即为null}if (i == 0) {//System.out.println("=================="+getCellValue(brandIdHSSFCell));if(getCellValue(brandIdHSSFCell)==null||!StringUtils.isNumeric(getCellValue(brandIdHSSFCell))||"".equals(getCellValue(brandIdHSSFCell))){i=17;continue;//第一列不合法,整行都不读取}else{brandMobileInfo.setBrandId(Integer.parseInt(getCellValue(brandIdHSSFCell)));}} else if (i == 1) {continue;} else if (i == 2) {continue;} else if (i == 3) {continue;} else if (i == 4) {continue;} else if (i == 5) {brandMobileInfo.setWarehouse(getCellValue(brandIdHSSFCell));} else if (i == 6) {if(StringUtils.isNumeric(getCellValue(brandIdHSSFCell))&&!"".equals(getCellValue(brandIdHSSFCell))){brandMobileInfo.setSortA1(Integer.parseInt(getCellValue(brandIdHSSFCell)));}} else if (i == 7) {if(StringUtils.isNumeric(getCellValue(brandIdHSSFCell))&&!"".equals(getCellValue(brandIdHSSFCell))){brandMobileInfo.setSortA2(Integer.parseInt(getCellValue(brandIdHSSFCell)));}} else if (i == 8) {if(StringUtils.isNumeric(getCellValue(brandIdHSSFCell))&&!"".equals(getCellValue(brandIdHSSFCell))){brandMobileInfo.setSortB(Integer.parseInt(getCellValue(brandIdHSSFCell)));}} else if (i == 9) {if(StringUtils.isNumeric(getCellValue(brandIdHSSFCell))&&!"".equals(getCellValue(brandIdHSSFCell))){brandMobileInfo.setSortC10(Integer.parseInt(getCellValue(brandIdHSSFCell)));}} else if (i == 10) {if(StringUtils.isNumeric(getCellValue(brandIdHSSFCell))&&!"".equals(getCellValue(brandIdHSSFCell))){brandMobileInfo.setSortC(Integer.parseInt(getCellValue(brandIdHSSFCell)));}} else if (i == 11) {if(StringUtils.isNumeric(getCellValue(brandIdHSSFCell))&&getCellValue(brandIdHSSFCell).length()<9)brandMobileInfo.setHitA(getCellValue(brandIdHSSFCell));} else if (i == 12) {if(StringUtils.isNumeric(getCellValue(brandIdHSSFCell))&&getCellValue(brandIdHSSFCell).length()<9)brandMobileInfo.setHitB(getCellValue(brandIdHSSFCell));} else if (i == 13) {if(StringUtils.isNumeric(getCellValue(brandIdHSSFCell))&&getCellValue(brandIdHSSFCell).length()<9)brandMobileInfo.setHitC(getCellValue(brandIdHSSFCell));} else if (i == 14) {String customSellType=getCellValue(brandIdHSSFCell);if("今日上新".equals(customSellType)){customSellType="today";}else if("正在热卖".equals(customSellType)){customSellType="yesterday";}else if("最后机会".equals(customSellType)){customSellType="lastday";}else {customSellType="no_defined";}brandMobileInfo.setCustomSellType(customSellType);}else if (i == 15) {                      continue;                    }else if (i == 16) {                    if(StringUtils.isNumeric(getCellValue(brandIdHSSFCell))&&!"".equals(getCellValue(brandIdHSSFCell))){                    brandMobileInfo.setChannelId(Integer.parseInt(getCellValue(brandIdHSSFCell)));}                    }}if(brandMobileInfo!=null){brandMobileInfos.add(brandMobileInfo);}}}return brandMobileInfos;}
这段代码中,有两段是解决这个bug的
(1)
  1. int cellCount=hssfRow.getLastCellNum();
  2. if(-1==cellCount)continue;//解决空行的
是空行,就是说这一行的数据一列都没有,返回-1,这种情况是绝对没有数据的,要跳出。
(2)
  1. if(brandIdHSSFCell==null){
  2. brandMobileInfo=null;
  3. break;//解决不是空行但是实际上是没数据的,即为null
  4. }
  1. if(brandMobileInfo!=null){
  2. brandMobileInfos.add(brandMobileInfo);
  3. }

这一种是不是空行,这一行是有一定列数的,但是里面的单元格确实没有数据的,是null的,这种也要跳出。

二.导出时,表格进行一些优化。

(1)在excel表中生成下拉框。
public static HSSFSheet setHSSFValidation(HSSFSheet sheet,              String[] textlist, int firstRow, int endRow, int firstCol,              int endCol) {          // 加载下拉列表内容           DVConstraint constraint = DVConstraint.createExplicitListConstraint(textlist);          // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列           CellRangeAddressList regions = new CellRangeAddressList(firstRow,endRow, firstCol, endCol);          // 数据有效性对象           HSSFDataValidation data_validation_list = new HSSFDataValidation(regions, constraint);          sheet.addValidationData(data_validation_list);          return sheet;      }  




(2)数字填充在表格设置居中并且左上角没有小三角形

CellUtil.setAlignment(row.createCell(j), wb, CellStyle.ALIGN_CENTER);insertDataCell(row, j++, brandCompleteInfo.getSortA1());CellUtil.setAlignment(row.createCell(j), wb, CellStyle.ALIGN_CENTER);insertDataCell(row, j++, brandCompleteInfo.getSortA2());

private void insertDataCell(HSSFRow row,int i,int object){row.getCell(i).setCellValue(object);}



(3)对某些列设置合适的宽度

sheet.autoSizeColumn((short)0); //adjust width of the first column    //sheet.autoSizeColumn((short)1); //adjust width of the second column    sheet.setColumnWidth(1, 14000);    sheet.autoSizeColumn((short)2);     sheet.autoSizeColumn((short)3);     sheet.setColumnWidth((short)4, 3000);     sheet.autoSizeColumn((short)11);     sheet.autoSizeColumn((short)12);     sheet.autoSizeColumn((short)13);     sheet.setColumnWidth((short)14, 3500); 



更多的操作可以参考poi的官方文档:http://poi.apache.org/spreadsheet/quick-guide.html 


0 1
原创粉丝点击