1.認識
Java操作辦公軟件:jxl、poi
數據讀取用POI,只要不涉及單元格樣式的寫入使用jxl效率高點。POI讀取效率高,但是大數據量寫入Excel效率比jxl慢。
jxl只使用03版本、po使用所有版本
2.easypoi需要導入的jar包
1 <dependency> 2 <groupId>cn.afterturn</groupId> 3 <artifactId>easypoi-base</artifactId> 4 <version>3.2.0</version> 5 </dependency> 6 <dependency> 7 <groupId>cn.afterturn</groupId> 8 <artifactId>easypoi-web</artifactId> 9 <version>3.2.0</version> 10 </dependency> 11 <dependency> 12 <groupId>cn.afterturn</groupId> 13 <artifactId>easypoi-annotation</artifactId> 14 <version>3.2.0</version> 15 </dependency>
1 <!-- JSR 303 規范驗證包 Excel驗證--> 2 <dependency> 3 <groupId>org.hibernate</groupId> 4 <artifactId>hibernate-validator</artifactId> 5 <version>5.2.4.Final</version> 6 </dependency>
3.在需要操作的實體類進行配置注解
@Excel注解為需要導入或是導出的數據、name為表頭、
注意:type=2表示為圖片、format可以設置日期格式
2 public class Employee extends BaseDomain{ 3 @Excel(name = "用戶名") 4 @NotNull(message = "用戶名不能為空") 5 private String username; 6 private String password; 7 @Excel(name = "郵箱",width = 20) 8 private String email; 9 @Excel(name = "年齡") 10 @Max(value = 60,message = "年齡不能大於60") 11 @Min(value = 18,message = "年齡不能小於18") 12 private Integer age; 13 @Excel(name = "頭像",type = 2,height = 30) 14 private String headImage;
4.在applicationContex中配置view
1 <!--Excel導出的視圖解析器--> 2 <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0"></bean> 3 <!--掃描Excel的view--> 4 <context:component-scan base-package="cn.afterturn.easypoi.view"/>
5.導出
1 public String exportExcel(ModelMap map, SystemlogQuery query){ 2 //拿到數據 3 List<Systemlog> list = systemlogService.findAll(); 4 ExportParams params = new ExportParams("日志數據", "日志表", ExcelType.XSSF); 5 // params.setFreezeCol(5); //凍結 那條綠線 6 map.put(NormalExcelConstants.DATA_LIST, list); // 數據集合 7 map.put(NormalExcelConstants.CLASS, Systemlog.class);//導出實體 8 map.put(NormalExcelConstants.PARAMS, params);//參數 9 map.put(NormalExcelConstants.FILE_NAME, "日志信息");//文件名稱 10 return NormalExcelConstants.EASYPOI_EXCEL_VIEW;//需要配置新的視圖解析器並設置優先級和掃描 11 }
6.導入
1 //empFile名字與前台一致 2 public String importXlsx(MultipartFile empFile,HttpServletResponse response) throws Exception{ 3 //獲取參數 4 ImportParams params = new ImportParams(); 5 params.setHeadRows(1); //不要這行 6 //驗證開啟 7 params.setNeedVerfiy(true); 8 //自定義驗證 9 params.setVerifyHandler(employeeExcelVerifyHandler); 10 //導入參數 11 /*List<Employee> list = ExcelImportUtil.importExcel( 12 empFile.getInputStream(), 13 Employee.class, params);*/ 14 ExcelImportResult<Employee> result = ExcelImportUtil.importExcelMore( 15 empFile.getInputStream(), 16 Employee.class, params); 17 18 //獲取正確導入的集合 19 List<Employee> list = result.getList(); 20 for (Employee employee : list) { 21 employee.setPassword("123"); //默認密碼123 22 if(employee.getDepartment()!=null) { 23 //設置部門 24 Department department = departmentService.findByName(employee.getDepartment().getName()); 25 employee.setDepartment(department); 26 } 27 28 employeeService.save(employee); 29 } 30 //如果導入失敗 31 if(result.isVerfiyFail()){ 32 //獲取導入失敗的員工的Excel 33 Workbook failWorkbook = result.getFailWorkbook(); 34 //導出Excel表 35 //獲取輸出流 36 ServletOutputStream fos = response.getOutputStream(); 37 //響應類型 38 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); //mime類型 39 //告訴瀏覽器這是下載 40 response.setHeader("Content-disposition", "attachment;filename=errorx.xlsx"); 41 //不要緩存 42 response.setHeader("Pragma", "No-cache"); 43 failWorkbook.write(fos); 44 fos.flush(); 45 fos.close(); 46 } 47 return "import"; 48 }