1.情景:要做一个表格内容导入系统功能,但普通的读取发现excel格式文件会乱码,于是记录一下excel表数据上传读取的方法
2.前端H5:
<div class="modal fade" id="addModal"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h4 class="modal-title">导入</h4></div> <form class="form-horizontal" name="addDevOrderform" id="addDevOrderform" action="<%=path%>/admin/addXXX.html" method="POST" enctype="multipart/form-data" > <div class="modal-body"> <div class="alert m-b-0" > <h4> <i class="fa fa-pencil-square"></i>设备订单导入</h4> <p> <table class="table table-bordered"> <tbody> <tr> <td style="text-align: center;width: 18%;">订单文件:</td> <td style="text-align: center;width: 28%;"> <input type="file" name="orderFile"> </td> </tr> </tbody> </table> </p> </div> </div> </form> <div class="modal-footer"> <a href="javascript:;" class="btn btn-sm btn-success" type="submit" onclick="addDevOrder()" >添加</a> <a href="javascript:;" class="btn btn-sm btn-white" data-dismiss="modal">取消</a></div> </div> </div> </div>
js:
function addDevOrder(){ //省略其他参数验证
//表单提交 $("#addDevOrderform").submit(); }
maven:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</version> </dependency>
java:
/** * 批量导入订单 * @return * @throws Exception */ @RequestMapping("addXXX.html") public String addDevOrder(@RequestParam MultipartFile orderFile) throws Exception { InputStream inputStream=null; try { Map map = this.getParameterMap(); String path="/opt/xxx/xxx/"; String filename = orderFile.getOriginalFilename(); // 保存备份表格 File file = new File(path + filename); File parent = file.getParentFile(); // 获取父文件 if( !parent.exists() ){ parent.mkdirs();} //创建所有父文件夹 orderFile.transferTo(file.getAbsoluteFile()); //读取表格信息 inputStream=new FileInputStream( file); Workbook workbook=null; if (filename.endsWith("xlsx")){ workbook = new XSSFWorkbook(inputStream);//Excel 2007 }else if (filename.endsWith("xls")){ workbook = new HSSFWorkbook(inputStream);//Excel 2003 } ArrayList<Map<String, Object>> list = new ArrayList<>(); HashMap<String, Object> obj = new HashMap<>(); // 循环工作表Sheet for (int numSheet = 0; numSheet <workbook.getNumberOfSheets(); numSheet++) { //HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet); Sheet hssfSheet = workbook.getSheetAt(numSheet); if (hssfSheet == null) { continue; } // 循环行Row int lastRowNum = hssfSheet.getLastRowNum(); logger.info("lastRowNum:"+lastRowNum); DataFormatter dataFormatter = new DataFormatter(); dataFormatter.addFormat("###########", null); for (int rowNum = 1; rowNum < hssfSheet.getLastRowNum(); rowNum++) { //HSSFRow hssfRow = hssfSheet.getRow(rowNum); Row hssfRow = hssfSheet.getRow(rowNum); if (hssfRow != null) { obj = new HashMap<>(); //内容为空break;我测试的时候多个表格tab的时候后面的表格行数会累加前面的导致报空指针 int cellType = hssfRow.getCell(0).getCellType(); if (cellType==Cell.CELL_TYPE_BLANK){ break; }
//表格数据读取 obj.put("orderNo",hssfRow.getCell(0).toString()); obj.put("shelfLinkNo",hssfRow.getCell(1).toString()); obj.put("productAttributes",hssfRow.getCell(2).toString()); //防止手机号等文本格式被转成数字格式内容发生改变 String devId = dataFormatter.formatCellValue(hssfRow.getCell(3)); obj.put("devId",devId); list.add(obj); } } } int i = devOrderService.addXXX(list); logger.info("addDevOrder num:"+i); } catch (Exception e) { logger.error( e.getMessage(), e ); throw new Exception("出错啦..."); }finally { if (inputStream!=null){ inputStream.close(); } } return "redirect:xxxx.html"; }
大佬链接:https://blog.csdn.net/qq_19734597/article/details/81875224
附:Excel表格导出
//创建Excel @RequestMapping("/createExcel") public String createExcel(HttpServletResponse response) throws IOException { //创建HSSFWorkbook对象(excel的文档对象) HSSFWorkbook wb = new HSSFWorkbook(); //建立新的sheet对象(excel的表单) HSSFSheet sheet=wb.createSheet("成绩表"); //在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个 HSSFRow row1=sheet.createRow(0); //创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个 HSSFCell cell=row1.createCell(0); //设置单元格内容 cell.setCellValue("学员考试成绩一览表"); //合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列 sheet.addMergedRegion(new CellRangeAddress(0,0,0,3)); //在sheet里创建第二行 HSSFRow row2=sheet.createRow(1); //创建单元格并设置单元格内容 row2.createCell(0).setCellValue("姓名"); row2.createCell(1).setCellValue("班级"); row2.createCell(2).setCellValue("笔试成绩"); row2.createCell(3).setCellValue("机试成绩"); //在sheet里创建第三行 HSSFRow row3=sheet.createRow(2); row3.createCell(0).setCellValue("李明"); row3.createCell(1).setCellValue("As178"); row3.createCell(2).setCellValue(87); row3.createCell(3).setCellValue(78); //.....省略部分代码 //输出Excel文件 OutputStream output=response.getOutputStream(); response.reset(); response.setHeader("Content-disposition", "attachment; filename=details.xls"); response.setContentType("application/msexcel"); wb.write(output); output.close(); return null; }
结束
原文:https://www.cnblogs.com/dztHome/p/14251183.html