版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaozhou_zi/article/details/80486140
1,引入poijar包
< dependency > < groupId > org.apache.poi </ groupId > < artifactId > poi </ artifactId > < version > $ {poi.version} </ version > </ dependency > < dependency > < groupId > org.apache。 poi </ groupId > < artifactId > poi-ooxml </ artifactId > <版本> $ {poi.version} </ version > </ dependency > < dependency > < groupId > org.apache.poi </ groupId > < artifactId > poi-ooxml-schemas </ artifactId > < version > $ {poi.version} </ version > </ dependency >
2,支持2007,2013,以及空格处理
包cn.com.base.util ; import org.apache.poi.hssf.usermodel.HSSFCell ; import org.apache.poi.hssf.usermodel.HSSFDataFormat ; import org.apache.poi.hssf.usermodel.HSSFDateUtil ; 导入org.apache.poi.hssf.usermodel.HSSFWorkbook ; 导入org.apache.poi.ss.usermodel。细胞; 导入org.apache.poi.ss.usermodel。排; 导入org.apache.poi.ss.usermodel。表单; 导入org.apache.poi.ss.usermodel。工作手册; 进口 org.apache.poi.xssf.usermodel.XSSFWorkbook ; 导入org.slf4j。记录器; import org.slf4j.LoggerFactory ; import java.io. InputStream ; import java.text.DecimalFormat ; import java.text.SimpleDateFormat ; import java.util.ArrayList ; import java.util.Date ; import java.util。列表; / ** * @类功能说明:execl读取工具 * @公司名称:南京华讯方舟通讯设备有限公司 * @作者:zhoujinbing * @创建时间:2018/5/18 上午10:01 * @版本:V1.0 * / public类ReadExcelUtils { 私人最终静态字符串excel2003L = 是“.xls” ; // 2003-版本的excel 私有最终静态字符串excel2007U = “.xlsx” ; // 2007 +版本的excel / ** * @description 获取IO流中的数据,组装成List <List <Object >对象 * @method getBankListByExcel * @param * @param in ?* @param fileName * @return List < 列表 < 对象 > > * @date:2018年5月18日10时07分03秒 * @author:zhoujinbing * / 公共 列表< 列表< 对象>> getBankListByExcel (InputStream的中,字符串文件名)抛出异常{ 列表< 列表< 对象>> list = null ; //创建Excel工作薄 Workbook work = this 。getWorkbook (in,fileName); if(null == work){ throw new Exception("创建Excel工作薄为空!"); } Sheet sheet = null; Row row = null; Cell cell = null; list = new ArrayList<List<Object>>(); //遍历Excel中所有的sheet for (int i = 0; i < work.getNumberOfSheets(); i++) { sheet = work.getSheetAt(0);//默认解析第一个sheet if(sheet==null){continue;} //遍历当前sheet中的所有行 for (int j = sheet.getFirstRowNum(); j < sheet.getLastRowNum()+1; j++) { row = sheet.getRow(j); //遍历所有的列 List<Object> li = new ArrayList<Object>(); for (int y = 0; y < sheet.getRow(0).getLastCellNum()-sheet.getRow(0).getFirstCellNum(); y++) { cell = row.getCell(y,Row.CREATE_NULL_AS_BLANK); if(cell == null || cell.equals("")) { li.add(""); continue; } li.add(this.getCellValue(cell)); } //校验最后一列是否为空,若为空,则添加一个控制 list.add(li); } } in.close(); return list; } /** * 描述:根据文件后缀,自适应上传文件的版本 * @param inStr,fileName * @return * @throws Exception */ public Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{ Workbook wb = null; String fileType = fileName.substring(fileName.lastIndexOf(".")); if(excel2003L.equals(fileType)){ wb = new HSSFWorkbook(inStr); //2003- }else if(excel2007U.equals(fileType)){ wb = new XSSFWorkbook(inStr); //2007+ }else{ throw new Exception("解析的文件格式有误!"); } return wb; } /** * 描述:对表格中数值进行格式化 * @param cell * @return */ public Object getCellValue(Cell cell){ Object value = null; DecimalFormat df = new DecimalFormat("0"); //格式化number String字符 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); //日期格式化 DecimalFormat df2 = new DecimalFormat("0.00"); //格式化数字 switch (cell.getCellType()) { case Cell.CELL_TYPE_STRING: value = cell.getRichStringCellValue().getString(); break; case Cell.CELL_TYPE_NUMERIC: if("General".equals(cell.getCellStyle().getDataFormatString())){ value = df.format(cell.getNumericCellValue()); }else if(HSSFDateUtil.isCellDateFormatted(cell)){ value = sdf.format(cell.getDateCellValue()); }else{ value = df2.format(cell.getNumericCellValue()); } break; case Cell.CELL_TYPE_BOOLEAN: value = cell.getBooleanCellValue(); break; case Cell.CELL_TYPE_BLANK: value = ""; break; default: break; } return value; } }
3,总结:
1)循环列时不能动态根据每一列获取总列数,根据第一列的列名条数去循环
2)POI解析execl时会过滤到空单元格,在get.cell时,默认为空的话,自动创建一个单元格,这样索引就对应了
扫描二维码关注公众号,回复:
3841401 查看本文章