记录自己在项目中遇到poi导入导出的流程 1.pom依赖
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2.</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency>导入设置
@PostMapping("/import") //数据导入 file是传过来的文件 public String dataImport(ModelMap mmap, @Param("queryId") Integer queryId, @RequestParam(value="filename") MultipartFile file){ //获取文件名 String fileName= file.getOriginalFilename(); try{ if(!(!fileName.toLowerCase().matches("^.+\\.(?i)(xls)$") || !fileName.toLowerCase().matches("^.+\\.(?i)(xlsx)$"))){ mmap.put("msg","导入的文件格式不正确!"); return prefix+"/DataImport"; } boolean isExcel2003=true; //如果后缀名是xlsx就是2007版本的 if(fileName.matches("^.+\\.(?i)(xlsx)$")){ isExcel2003=false; } InputStream inputStream=file.getInputStream(); Workbook wb=null; if(isExcel2003){ wb=new HSSFWorkbook(inputStream); }else { wb=new XSSFWorkbook(inputStream); } if(wb==null){ mmap.put("msg","导入的文件格式不正确!"); } mmap.put("msg",iQueryExportService.dataImport(wb,Tool.getSessionUser())); }catch(Exception e){ e.printStackTrace(); mmap.put("err", e.getMessage()); if(e.getMessage()!=null&&e.getMessage().indexOf("导入的模板没有主表设置")>=0){ mmap.put("msg", e.getMessage()); }else if(e.getMessage()!=null&&e.getMessage().indexOf("行数据导入时出错")>=0){ mmap.put("msg", e.getMessage().split("@#@")[0]); if(e.getMessage().split("@#@").length==2) { mmap.put("err", e.getMessage().split("@#@")[1]); } }else { mmap.put("msg", "导入的文件格式不正确!"); } } return prefix+"/DataImport"; }判断单元格类型
switch (row.getCell(j).getCellType()){ case NUMERIC: //数值型 if(HSSFDateUtil.isCellDateFormatted(row.getCell(j))){ //判断是否为时间类型 map1.put("value",dft.format(row.getCell(j).getDateCellValue())); }else { map1.put("value",row.getCell(j).getNumericCellValue()); } break; case STRING: //文本型 map1.put("value",row.getCell(j).getStringCellValue()); break; default: map1.put("value",row.getCell(j).getStringCellValue()); break; }导出模板:动态导入,根据用户选择的字段进行模板导出
@RequestMapping(value = "/queryexport") //导出 public void export(HttpServletResponse response, @RequestParam("tableHead") String tableHead, @RequestParam("templateName") String templateName,@RequestParam("id") String id ) throws IOException{ //判断是否导入主表,如果没有导入主表就报错 System.err.println("tableHead"+tableHead+"templateName"+templateName+"id"+id); //新建工作薄 HSSFWorkbook wb=new HSSFWorkbook(); //新建工作表 excel表单 HSSFSheet sheet=wb.createSheet(id); //excel的行 HSSFRow row=null; List<String> list=new ArrayList<String>(); List<List<String>> listRow=new ArrayList<List<String>>(); List<String> list1=new ArrayList<String>(); List<ImportField> importFields=iQueryExportService.queryReplaceNameAndAcName(Integer.valueOf(id)); //查询acName和取代值; //替换字段 for(int i=0;i<importFields.size();i++){ //获取传来的主表明细表的 if(i>0&&importFields.get(i).getFormId().intValue()!=importFields.get(i-1).getFormId().intValue()){ //不是同一张表了 存上一张表的数据 //listRow.add(importFields.get(i).getAcName()); listRow.add(list1); System.err.println("listRow.add(list1);"+list1); list1=null; list1=new ArrayList<String>(); } list1.add(importFields.get(i).getAcName()); if(i==importFields.size()-1){ listRow.add(list1); } if(importFields.get(i).getReplaceName()==null||"".equals(importFields.get(i).getReplaceName())){ list.add(importFields.get(i).getAcName()); }else{ list.add(importFields.get(i).getReplaceName()); } } //创建第一个单元格 行 row=sheet.createRow(0); row.createCell(0).setCellValue(tableHead); //把表头的值赋给第一个单元格 //设置表头为黑体 大小为14 居中 HSSFCellStyle titleStyle=wb.createCellStyle(); titleStyle.setAlignment(HorizontalAlignment.CENTER); //单元格内容水平居中 titleStyle.setVerticalAlignment(VerticalAlignment.CENTER); //设置单元格内容垂直居中 //创建字体 HSSFFont titleFont=wb.createFont(); titleFont.setFontHeightInPoints((short)14); //设置字体大小 titleFont.setFontName("黑体"); //字体为黑体 titleStyle.setFont(titleFont); /*为标题设计空间 * firstRow从第1行开始 * lastRow从第0行结束 * *从第1个单元格开始 * 从第3个单元格结束 */ if(list.size()>1) { //单元格数据大于1才会合并成功 CellRangeAddress rowRegion = new CellRangeAddress(0, 0, 0, list.size() - 1); //合并单元格 如果只有一条数据合并单元格就会失败 sheet.addMergedRegion(rowRegion); } row.setHeight((short)(26.25*20)); row.getCell(0).setCellStyle(titleStyle); row=sheet.createRow(1); //第二行的 row.setHeight((short)(22.50*20)); //设置行高 System.out.println(list); HSSFCellStyle Style=wb.createCellStyle(); for(int i=0;i<list.size();i++){ row.createCell(i).setCellValue(list.get(i)); if(i>=listRow.get(0).size()){ //设置背景颜色 Style.setFillPattern(FillPatternType.SOLID_FOREGROUND); Style.setFillForegroundColor(HSSFColor.HSSFColorPredefined.RED.getColor().getIndex()); row.getCell(i).setCellStyle(Style); } } response.setContentType("application/vnd.ms-excel;charset=utf-8"); OutputStream os = response.getOutputStream(); templateName= URLEncoder.encode(templateName,"UTF-8"); response.setHeader("Content-disposition", "attachment;filename="+templateName+".xls");//默认Excel名称 wb.write(os); os.flush(); os.close(); }