工具类:
package com.zhxd.guaranteeStation.util; import java.io.IOException; import java.io.InputStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ParseExcel { /** * 解析文件的方法 *@param inputStream文件输入流 ,要解析的Excel文件输入流 *@param suffix 后缀名,xls或xlsx,代码决定使用什么方式解析Excel *@param startRow 从第几行开始读取数据 *@return List<String[]> 集合中的一个元素对应一行解析的数据 * 元素为字符串数组类型,数组中的每一个元素对应一列数据 * @throws IOException */ public List<String[]> parseExcel(InputStream inputStream,String suffix,int startRow) throws IOException{ //定义Excel对象变量 Workbook workbook=null; //判断后缀 决定使用的解析方式,决定如何创建具体的对象 if("xls".equals(suffix)) { //2003版的解析方式 workbook=new HSSFWorkbook(inputStream); }else if("xlsx".equals(suffix)) { //2007 workbook=new XSSFWorkbook(inputStream); }else { //未知内容 return null; } //获取工作表,Excel分为若干个表,sheet //得到第一个表格sheet Sheet sheet = workbook.getSheetAt(0); if(sheet==null) { return null; } //获取表格中最后一行的行号 int lastRowNum = sheet.getLastRowNum(); //最后一行的行号大于startRow if(lastRowNum<startRow) { return null; } List<String[]> result=new ArrayList<String[]>(); //定义行变量和单元格变量 Row row=null; Cell cell=null; //循环读取 for (int rowNum = startRow; rowNum <= lastRowNum; rowNum++) { row=sheet.getRow(rowNum); //获取当前行的第一列和最后一列的标记 short firstCellNum = row.getFirstCellNum(); short lastCellNum = row.getLastCellNum(); if(lastCellNum!=0) { String[] rowArray=new String[lastCellNum]; for(int cellNum=firstCellNum;cellNum<lastCellNum;cellNum++) { //拿到单元格的值 cell=row.getCell(cellNum); //判断单元格是否有数据 if(cell==null) { rowArray[cellNum]=null; }else { rowArray[cellNum]=parseCell(cell); } } result.add(rowArray); } } return result; } /** * 解析单元格数据(返回字符串) */ private String parseCell(Cell cell) { String cellStr=null; //判断单元格的类型 switch (cell.getCellType()) { case STRING : //字符串类型单元格 cellStr=cell.getRichStringCellValue().toString(); break; case BLANK : //空数据 cellStr=""; break; case NUMERIC : //数字类型 包含日期、时间、数字 //判断日期【年月日2016-12-20 | 时分10:20】类型 if(HSSFDateUtil.isCellDateFormatted(cell)) { //判断具体类型,是日期还是时间 SimpleDateFormat sdf=null; if(cell.getCellStyle().getDataFormat()==HSSFDataFormat.getBuiltinFormat("h:mm")) { //时间 sdf=new SimpleDateFormat("HH:mm"); }else { //日期 sdf=new SimpleDateFormat("yyyy-MM-dd"); } Date temp = cell.getDateCellValue(); cellStr=sdf.format(temp); }else { //数字 double temp=cell.getNumericCellValue(); //数字格式化工具 DecimalFormat format=new DecimalFormat(); //查看单元格中的具体样式类型 String formatStr=cell.getCellStyle().getDataFormatString(); if(formatStr.equals("General")) { /**这个判断是四舍五入的,根据自己业务决定是否去掉 * 定义格式化正则 * 保留一位小数 #.# * 保留两位小数#.## */ format.applyPattern("#"); } //保留小数点后三位 cellStr=format.format(temp); } break; default: cellStr=""; } return cellStr; } }
controller:
public Response uploadLineExcel(@RequestParam(value = "file") MultipartFile file, String taskId) throws Exception { List<BaozhangTaskGeneratrixLine> baozhangTaskGeneratrixLineList = new ArrayList<>(); ParseExcel parser=new ParseExcel(); InputStream inputStream = file.getInputStream(); String suffix="xlsx"; int startRow=1; List<String[]> result = parser.parseExcel(inputStream, suffix, startRow);
循环数组自己写