/** * 寫Excel文件 * * @param data 數據 * @param configs 列配置 * @param destFile 目標文件 * @param templateFile 模板文件 * @param onlyAlias 是否僅寫出有別名的列 * @param isWriteKeyAsHead 是否寫出標題行 * @return excel寫對象 */ private static BigExcelWriter writerExcel(Collection data, List<ExcelColumnConfig> configs, File destFile, File templateFile, boolean onlyAlias, boolean isWriteKeyAsHead, int startRowIndex) { BigExcelWriter writer = null; if (templateFile != null) { //根據模板寫數據 try { SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(new XSSFWorkbook(templateFile), -1); writer = new BigExcelWriter(sxssfWorkbook, "sheet1"); } catch (Exception ex) { log.error("構造BigExcelWriter異常:", ex); } log.info("exportExcel templateFile:" + templateFile); } else { //直接根據目標文件寫數據 writer = new BigExcelWriter(-1); log.info("exportExcel destFile:" + destFile); } //添加列別名 if (CollUtil.isNotEmpty(configs)) { for (ExcelColumnConfig config : configs) { writer.addHeaderAlias(config.getOrigin(), config.getAlias()); } } //設置起始行 writer.setCurrentRow(startRowIndex); // 只寫出加了別名的字段 writer.setOnlyAlias(onlyAlias); // 寫入數據 writer.write(data, isWriteKeyAsHead); // 調整列樣式(在寫入數據後方可調整樣式) if (CollUtil.isNotEmpty(configs)) { //從標題行下一行開始覆寫整列單元格樣式 if (isWriteKeyAsHead) { startRowIndex++; } int columnIndex = 0; for (ExcelColumnConfig config : configs) { //創建新樣式 CellStyle cellStyle = writer.createCellStyle(); //設置邊框 StyleUtil.setBorder(cellStyle, BorderStyle.THIN, IndexedColors.BLACK); //設置對齊方式 if (config.getHorizontalAlignment() != null) { cellStyle.setAlignment(config.getHorizontalAlignment()); cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); } //設置數據格式 if (config.getFmt() != null) { cellStyle.setDataFormat(config.getFmt()); } writer.setColumnStyleIfHasData(columnIndex, startRowIndex, cellStyle); //列號遞增 columnIndex++; } } //手動設置目標輸出文件 writer.setDestFile(destFile); log.info("exportExcel destFile:" + destFile); return writer; }
@Data @Accessors(chain = true) public class ExcelColumnConfig { /** * 屬性名 */ private String origin; /** * 列名 */ private String alias; /** * 水平對齊方式 */ private HorizontalAlignment horizontalAlignment; /** * 數據格式 * * @see BuiltinFormats */ private Short fmt; /** * 快速創建配置對象 * * @param origin 屬性名 * @param alias 別名 * @return 新建對象 */ public static ExcelColumnConfig makeConfig(String origin, String alias) { return new ExcelColumnConfig().setOrigin(origin).setAlias(alias); } /** * 快速創建配置對象 * * @param origin 屬性名 * @param alias 別名 * @param horizontalAlignment 水平對齊方式 * @return 新建對象 */ public static ExcelColumnConfig makeConfig(String origin, String alias, HorizontalAlignment horizontalAlignment) { return new ExcelColumnConfig().setOrigin(origin).setAlias(alias).setHorizontalAlignment(horizontalAlignment); } }