- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们使用 Spring Batch 和 Apache POI 开发了一个应用程序,用于从 DB(Oracle) 读取数据并将其写入 apache-poi 生成的 XLSX 文件中。
示例下方有一个读取器(从 DB ItemReader 读取数据)和写入器(ItemWriter)的作业:
@BeforeStep
public void beforeStep(StepExecution stepExecution) {
log.info("Calling analytic beforeStep");
cellProperties = new HashMap<String, Object>();
cellProperties.put(CellUtil.BORDER_LEFT, BorderStyle.THIN);
cellProperties.put(CellUtil.BORDER_RIGHT, BorderStyle.THIN);
cellProperties.put(CellUtil.BORDER_BOTTOM, BorderStyle.THIN);
cellProperties.put(CellUtil.BORDER_TOP, BorderStyle.THIN);
outputFilename = stepExecution.getJobExecution().getExecutionContext().getString("fileName");
File xlsxFile = new File(outputFilename);
if (xlsxFile.exists() && !xlsxFile.isDirectory()) {
log.info("ViewReportSalesAnalyticsExcelWriter File exist");
InputStream fileIn = null;
try {
fileIn = new BufferedInputStream(new FileInputStream(xlsxFile), 100);
workbook = new SXSSFWorkbook(new XSSFWorkbook(fileIn), 100);
} catch (Exception e) {
log.error("ViewReportSalesAnalyticsExcelWriter error: ", e);
} finally {
if (fileIn != null) {
try {
fileIn.close();
} catch (IOException e) {
log.error("ViewReportSalesAnalyticsExcelWriter error: ", e);
}
}
}
} else {
log.info("ViewReportSalesAnalyticsExcelWriter File not exist, creating");
workbook = new SXSSFWorkbook(100);
}
// temp files will be gzipped
workbook.setCompressTempFiles(true);
Sheet sheet = workbook.createSheet("Report POG - Analitico");
sheet.setFitToPage(true);
sheet.setDisplayGridlines(false);
sheet.setDefaultColumnWidth(23);
sheet.setDefaultRowHeight((short) 290);
addTitleToSheet(sheet);
//currRow++;
addHeaders(sheet);
//initDataStyle();
}
@Override
public void write(List<? extends ViewReportSalesAnalyticsDTO> items) throws Exception {
log.info("Analytic write, number of elements - {} ", items.size());
Sheet sheet = workbook.getSheetAt(1);
SimpleDateFormat spf = new SimpleDateFormat(PogEngineBatchConstants.DATE_FORMAT_REPORT);
Row row = null;
for (ViewReportSalesAnalyticsDTO data : items) {
int i = 0;
currRow++;
row = sheet.createRow(currRow);
createStringCell(row, data.getProductCode(), i++);
createStringCell(row, data.getProductDesc(), i++);
createStringCell(row, PogEngineBatchUtils.decodeFlagFactory(data.getFlagManufacturer()), i++);
for (String headerKey : dynamicHeaders) {
createStringCell(row, data.getSellingJson().get(headerKey) == null ? "OK" : //TODO always OK?
data.getSellingJson().get(headerKey), i++);
}
createStringCell(row, data.getMonitoringOutcome(), i++);
for (String headerKey : dynamicHeaders) {
createStringCell(row, data.getMonitorJson().get(headerKey) == null ? "OK" : //TODO always OK?
data.getMonitorJson().get(headerKey), i++);
}
}
}
@AfterStep
public void afterStep(StepExecution stepExecution) throws IOException {
FileOutputStream fos = new FileOutputStream(outputFilename);
log.info("ViewReportSalesAnalyticsExcelWriter afterStep, write records to file");
workbook.write(fos);
fos.close();
workbook.dispose();
workbook.close();
}
在 workbook.write(fos); 期间的 afterStep 中我们正在写大约 500.000 条记录,我们得到
GC 开销内存 .为了避免这个问题,我们将这个 VM 参数 -Xmx8192m 放在批处理启动器(sh)中,这需要很长时间,并且使用来自 VM(16 GB 和 8 CORE)的大量内存来结束进程并写入文件(约 110 MB)。
最佳答案
该代码与 https://keyholesoftware.com/2012/11/12/generating-large-excel-files-using-spring-batch-part-three/ 非常相似.这种方法确实 不是 遵循 Spring Batch 提出的面向 block 的处理模型。问题是 Writer.write
仅在内存中创建单元格,工作簿仅在 AfterStep
中写入磁盘打回来。显然,使用这种方法,所有项目都保存在内存中,直到整个步骤完成,然后才将它们写入磁盘。
项目应该在每个 block 之后而不是在整个步骤之后写入磁盘。
关于java - Apache POI SXSSFWorkbook 在 XLSX 文件内存问题中写入大约 500.000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66052083/
下面是创建 SXSSFWorkbook 的示例代码片段: try(SXSSFWorkbook wb = new SXSSFWorkbook()) { //... } finally {
我曾经使用过XSSFWorkbook,它在所有设备上都能正常工作(即使对于MAC),但现在我迁移到SXSSFWorkbook,所以现在我面临一个问题xlsx文件不可以在MAC上查看 In detail
有没有办法获取SXSSFWorkbook生成的Excel的大小。 我需要检查生成的文件的大小,并根据大小执行不同的操作,例如,如果大小较小,则直接发送电子邮件;如果大小超过一定限制,则上传到某个位置。
是否可以在流式 SXSSFWorkbook 上使用 autoSizeColumns?我实现了导出功能以将对象列表导出到 excel。起初我使用 XSSFWorkbook(不是流式处理),在创建所有单元
在我的项目中更大的代码流中,我试图创建一个空白的 SXSSFWorkbook 并创建工作表并向其写入数据,但我无法这样做,因为它给了我一个运行时异常:没有这样的文件或目录。我不明白为什么会发生这种情况
我正在自动化从 HDFS 读取文件到达时间,并在所有系统的 Excel 工作表中填充数据,并在超过阈值时间时对计时进行着色。我已经使用 shell 脚本和 java 进行 Excel 处理来完成这些工
我正在尝试使用 SXSSFWorkbook 从头开始编写 Excel 电子表格。 wb = SXSSFWorkbook(500) wb.isCompressTempFile
我需要将行追加到工作簿的工作表中。我正在使用 org.apache.poi.xssf.streaming.SXSSFWorkbook 但我无法实现低内存占用。代码如下: import java.io.
我有一个用作模板的现有工作簿。我试图更新现有行中的单元格值,这意味着相邻的单元格有一个值。问题是在创建文件并打开它之后,出现以下错误:“Excel 在...中发现不可读的内容。” 我假设原因是 SXS
我正在使用 Apache POI SXSSFWorkbook 生成 .xlsx Excel 电子表格,但我需要将该文件保存到 blob 中,而不是下载它。我还需要它能够扩展,因此如果我将 600,00
我正在使用 apache 的 POI API 来编写 XLSX 文件。由于我需要写入大文件,因此我使用 Streaming API (SXSSF)。为此,我关注 this指导。请注意,在示例的末尾有一
我必须创建一个包含两张表的 Excel 工作簿。我使用以下代码创建 Excel,然后将其下载。但是,已创建第一个工作表,但未创建第二个工作表。我无法理解确切的原因。以下是我创建两张表的部分。 impo
我们正在构建一个 Spring boot REST 端点,它会生成一个大型 XLS 文件(可能包含约 100 万行)并提供下载。当前解决方案使用 Apache POI 库的 SXSSF API 来创建
我正在尝试使用 POI 进行第一个读取大型 xlsx 文件的测试,但是要对一个小文件进行简单测试,我无法显示单元格的值。 有人可以告诉我我的错误是什么。欢迎所有的建议。谢谢。 测试.java: imp
我的应用程序创建了一个电子表格,这可能相当大(最多 500,000 行,每行分布在六张纸上,每张纸大约有 20 列)。 我使用 Apache Poi 并转而使用 SXSSFWorkBook 将数据写入
情况是这样的:我正在获取 SXSSFWorkbook 对象,并且我需要使用该对象创建数据透视表。我们有什么办法可以实现它吗? 我已经检查了以下链接: Apache POI - is there a w
HSSFWorkbook 与 XSSFWorkbook 以及 XSSFWorkbook 和 SXSSFWorkbook 的优点/缺点? 最佳答案 每个 API 功能的电子表格: 来源:https://
我是 Java 开发人员。我正在尝试写一个大的xlsx文件 (Excel) 使用 SXSSFWorkbook Apache POI 库的类。 我没有选择写大文件,因为有超过 200000 行。 但我需
我们使用 Spring Batch 和 Apache POI 开发了一个应用程序,用于从 DB(Oracle) 读取数据并将其写入 apache-poi 生成的 XLSX 文件中。 示例下方有一个读取
有几个相关问题,但我找不到反射(reflect)我情况的问题。 我正在使用 SXSSFWorkbook 和 SXSSFSheet 对象通过 Apache POI 编写 Excel“xlsx”文件。该文
我是一名优秀的程序员,十分优秀!