【Hutool】:使用hutool實現復雜excel導出功能
轉自:https://blog.csdn.net/weixin_45511500/article/details/118884656
引入依賴
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> <scope>provided</scope> </dependency>
編寫pojo類
@Data @NoArgsConstructor @AllArgsConstructor public class Student { /** * 學號 */ private String sno; /** * 姓名 */ private String name; /** * 年齡 */ private Integer age; /** * 性別 */ private String gender; /** * 籍貫 */ private String nativePlace; /** * 入學時間 */ @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private Date enrollmentTime; private BigDecimal money; }
編寫實現類
@PostMapping("user_export_excel") @ResponseBody public void exportExcel(HttpServletResponse response) throws UnsupportedEncodingException, ParseException { // 設置響應類型 response.setContentType("application/vnd.ms-excel"); // 設置字符編碼 response.setCharacterEncoding("utf-8"); // 設置響應頭信息 response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + URLEncoder.encode("學生花名冊", "UTF-8") + ".xlsx"); List<Student> studentList = new ArrayList<Student>() { { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); add(new Student("1001", "張三", 23, "男", "陝西西安", dateFormat.parse("2020-09-01"), BigDecimal.valueOf(22.33))); add(new Student("1002", "李四", 22, "女", "陝西渭南", dateFormat.parse("2020-09-01"),BigDecimal.valueOf(11.99))); } }; // 寫入文件 ExcelWriter writer = ExcelUtil.getWriter(); // 設置合並單元格 // writer.merge(11, "BOM報價單", false); // writer.merge(3,"您上傳的BOM", false); // writer.merge(1, 1 ,4,9,"商城報價單", false); // 設置標題一樣式 CellStyle cellStyle1 = writer.createCellStyle(); cellStyle1.setVerticalAlignment(VerticalAlignment.CENTER); cellStyle1.setAlignment(HorizontalAlignment.CENTER); cellStyle1.setBorderLeft(writer.getCellStyle().getBorderLeft()); cellStyle1.setBorderRight(writer.getCellStyle().getBorderRight()); cellStyle1.setBorderBottom(writer.getCellStyle().getBorderBottom()); Font font = writer.createFont(); font.setBold(true); font.setFontHeightInPoints((short) 12); font.setFontName("微軟雅黑"); cellStyle1.setFont(font); // 設置“總價” 單元格樣式 CellStyle cellStyle = writer.createCellStyle(); cellStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.GOLD.getIndex()); cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); //設置垂直居中和水平居中 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); cellStyle.setAlignment(HorizontalAlignment.LEFT); //設置邊框 cellStyle.setBorderRight(writer.getCellStyle().getBorderRight()); cellStyle.setBorderBottom(writer.getCellStyle().getBorderBottom()); // 標題一 writer.merge(0,0,0,11, "BOM報價單", cellStyle1); // 標題二 writer.merge(1,1,0,3,"您上傳的BOM", cellStyle1); writer.merge(1, 1 ,4,9,"商城報價單", cellStyle1); writer.merge(1,1,10,11,"總價(含稅): "+ " 99.99",cellStyle); // 跳過前面兩行(為了設置標題樣式)原始的設置標題方法,不可以,例:merge(3, "標題名", false); writer.passRows(2); // 設置高度(行row) writer.setRowHeight(0, 50); writer.setRowHeight(1, 30); // 設置導出信息的表頭 writer.addHeaderAlias("sno", "學號"); writer.addHeaderAlias("name", "姓名"); writer.addHeaderAlias("age", "年齡"); writer.addHeaderAlias("gender", "性別"); writer.addHeaderAlias("nativePlace", "籍貫"); writer.addHeaderAlias("enrollmentTime", "入學時間"); writer.addHeaderAlias("money", "金錢"); // 設置列寬(Colum) writer.setColumnWidth(5, 20); writer.setColumnWidth(10, 10); writer.setColumnWidth(11, 10); // 設置導出表頭樣式,但不包括合並單元格 CellStyle headCellStyle = writer.getHeadCellStyle(); headCellStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.LIME.getIndex()); headCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 寫入 writer.write(studentList, true); // 主要針對自定義表頭設置 行高(必須要寫入完成后才可以設置) for (int i = 2; i < studentList.size(); i++) { writer.setRowHeight(i,20); } try { writer.flush(response.getOutputStream(), true); } catch (IOException e) { e.printStackTrace(); } finally { writer.close(); } }
效果圖