poi导入导出excel后记

续上一篇:在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;
		// 循环工作表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++) {
				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

时间: 2024-10-12 20:12:28

poi导入导出excel后记的相关文章

Java利用POI导入导出Excel中的数据

     首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地址http://poi.apache.org/download.html,有兴趣的朋友也可以去看看其中的API.      下面分享一下在对POI进行基本操作时觉得需要注意的两点:       1.POI中针对xlsx/xls是需要create different Workbook instance

基于SSM的POI导入导出Excel实战第二篇-导出EXCEL

业务需求:这里我以产品信息为例,用于POI导入导出Excel实战的操作对象 需求分析:我们要导出的数据格式比较简单,其实就是待导出的表(视图)的数据,如下图所示: 实现思路:A.会发现待导出的数据列表是一个矩阵式的格式,即二维的形式 B.其中的头部id name unit price stock 等字段field是固定不变的,将会充当excel的头部 C.以数据行的角度观察数据列表,会发现每一行每一列的值都是B所指的那些字段一一对应的取值value D.由此可以得出这些数据组织是由每一行数据组成

基于SSM的POI导入导出Excel实战第一篇-SSM框架的整合

业务背景:在JavaWeb应用开发中,经常需要将应用系统中某些业务数据导出到Excel中,又或者需要将这些业务数据先收集到Excel然后一键导入到系统 业务需求:如何用Java实现导入导出Excel 需求分析:目前流行的Java导入导出Excel的框架有POI跟JXL,这两者的优缺点在这里我就不作比较了,感兴趣的童鞋可以自行搜索了解一下; 技术选型:从本文开始,我将分享一下如何基于SSM框架+POI实现Java应用导入导出Excel,数据库采用mysql5.6,应用服务器采用tomcat7 工具

基于SSM的POI导入导出Excel实战尾篇-其余功能实战(mvc三层开发模式体验)

业务需求:前几篇基本已经介绍完毕项目的核心功能,即POI导入导出Excel,为了整个项目的完整性,并让诸位童鞋体验体验企业级javaweb应用mvc三层模式的开发流程,本文将介绍一下项目的其余功能,包括搜索,新增,修改,删除 需求分析:作为程序员,在项目中经常接触的就是CRUD了,本篇博文将整合jquery-easyui框架(版本采用1.5.5.4)异步实现上述几个功能,给项目画上一个完整的句号!当然啦,在刚开始开发时,对于自己开发好的后端接口完全可以用Postman进行模拟(我就是这样做的),

java中使用poi导入导出excel文件_并自定义日期格式

Apache POI项目的使命是创造和保持java API操纵各种文件格式基于Office Open XML标准(OOXML)和微软的OLE复合文档格式(OLE2)2.总之,你可以读写Excel文件使用java.此外,您可以读取和写入MS Word和PowerPoint文件使用java.Apache POI是java Excel解决方案(Excel 97-2008). 需要jar: poi-3.9-20121203.jar 导出 public static void main(String[]

在springmvc项目中使用poi导入导出excel

首先要导入spring相关包,poi,和fileupload包,我是使用maven构建的. 一.导入excel (1)使用spring上传文件 a.前台页面提交 <form name="excelImportForm" action="${pageContext.request.contextPath}/brand/importBrandSort" method="post" onsubmit="return checkImpor

基于SSM的POI导入导出Excel实战第二篇-导入EXCEL

业务需求:上文已经实现了产品信息Excel的导出,接下来将用POI实现Excel导入 需求分析:导入其实是导出的逆过程,数据格式是一样的,均为矩阵式(二维)的数据格式,下面将以导出的模板作为Excel导入时数据填充的文件! 下面就直接进入正文,在阅读正文源码期间如果有相关问题可以加我QQ:1974544863 咨询我 或者加群:583522159 进行技术讨论.下面是我的个人公众号,感兴趣的童鞋可以关注(有干货以及项目实战分享哦) 好了,让我们进入代码实战吧! 在实战之前,介绍一下项目使用的"状

java poi 导入导出Excel xsl xslx

import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import o

SpringMvc 使用poi导入导出Excel

controller <pre name="code" class="java"> @ResponseBody @RequestMapping(value = "/chxm/exportAndUpdate") public void exportAndUpdate(@RequestParam(value = "projectId") String projectId, @RequestParam(value = &