alibaba/easyexcel

填充excel 设置不一次全加载到内存中,就会出现合并问题

Open

#3,620 opened on Dec 21, 2023

View on GitHub
 (1 comment) (0 reactions) (0 assignees)Java (7,599 forks)batch import
help wanted

Repository metrics

Stars
 (33,728 stars)
PR merge metrics
 (No merged PRs in 30d)

Description

image image

代码: // 每次查询的批大小 AtomicInteger number = new AtomicInteger(0); String pathName = "manage\src\main\resources\templates\成交率统计表.xlsx"; String name = "成交率统计表"; name = URLEncoder.encode(name, String.valueOf(StandardCharsets.UTF_8)) + ".xlsx"; response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + name); ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(pathName).build(); FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.FALSE).build(); WriteSheet writeSheet = EasyExcel.writerSheet().build(); for (int i = (int) page.getCurrent(); i < totalRecords;) { i += batchSize; int current = 0; // 分页查询数据 if (batchSize == 10000 && page.getCurrent() == 1) { current = (i / batchSize); } else if (batchSize == 10000 || page.getCurrent() > 1) { current = (i / batchSize) + 1; } else { current = (i / batchSize); } Page batchPage = new Page<>(current, batchSize); IPage<Map<String, Object>> res = tReportService.queryTransactionRateStatisticsTableList( batchPage, condition.getFieldList(), whereSql.toString(), condition.getFieldSord()); List<Map<String, Object>> records = res.getRecords(); excelWriter.fill(records, fillConfig, writeSheet); } if (fields.length() != 0) { List<Map<String, Object>> lists = tReportService.querySumDataAll( page, fields.toString(), "tmp_transaction_rate_statistics_table", whereSql.toString()); Map<String, Object> data = lists.get(0); data.put("chengjiaolv_sum", data.get("chengjiaolv_sum").toString() + "%"); excelWriter.fill(data, fillConfig, writeSheet); HashMap<String, Object> hashMap = new HashMap<>(); hashMap.put("date", DateUtil.now()); excelWriter.fill(hashMap, fillConfig, writeSheet); excelWriter.finish(); }

FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.FALSE).build(); 设置了这个为False 就会这样,因为我是分两次去填充的,设置true格式就正确,但是很慢。

Contributor guide