gpt4 book ai didi

java - 将值写入具有公式的 Excel 文件时出现延迟

转载 作者:行者123 更新时间:2023-12-02 06:14:08 28 4
gpt4 key购买 nike

用例:我有一个用 Excel 实现的成本计算器。我必须将大量输入插入到工作表中的输入单元格中,并从同一张工作表中获取输出。我有 3 张类似的 Excel 工作表,大小约为 3MB。 Excel 工作表采用 .xlsm 格式。

使用的技术:Java 1.8 和 Apache POI 4.0.1

问题:将输入值写入 >3MB 的 Excel 文件速度很快(大约 12 个输入大约需要 10 秒)。但对 Excel 文件执行相同的操作却慢了 <3MB(仅一次输入约 10 秒)。

我似乎有人在这里说使用SXSSFWorkbook。我用它替换了 XSSFWorkbook,但它给了我空指针异常。另外,这用于超过 100MB 的大型 Excel 工作表,对吗?

写入值的代码:

    public void setData1(String filePath, String sheetName, int rowNum, int colNum, Object data) throws IOException {
File file = new File(filePath);
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
} catch (FileNotFoundException e) {
Messages.terminate(file.getName() + " file is missing.");
}
Workbook workbook = new XSSFWorkbook(fis);
Sheet sheet = workbook.getSheet(sheetName);
Row row = sheet.getRow(rowNum);
Cell cell = row.getCell(colNum);
if(data instanceof Integer) {
cell.setCellValue((int)data);
}
else if (data instanceof String) {
cell.setCellValue(String.valueOf((String) data));
}
else if(data instanceof Double) {
if((double)data == Math.floor((double)data)) {
cell.setCellValue((int)Math.floor((double)data));
}
else {
cell.setCellValue((double)data);
}
}
FileOutputStream fos = new FileOutputStream(new File(filePath));
BaseFormulaEvaluator.evaluateAllFormulaCells(workbook);
workbook.write(fos);
workbook.close();
fos.close();
fis.close();
}

最佳答案

以下代码仅打开工作簿一次,而不是为输入的每个值重复打开和关闭它:

public void setData1(Workbook workbook, FileOutputStream fos, String filePath, String sheetName, int rowNum, int colNum, Object data) throws IOException {
Sheet sheet = workbook.getSheet(sheetName);
Row row = sheet.getRow(rowNum);
Cell cell = row.getCell(colNum);
if(data instanceof Integer) {
cell.setCellValue((int)data);
}
else if (data instanceof String) {
cell.setCellValue(String.valueOf((String) data));
}
else if(data instanceof Double) {
if((double)data == Math.floor((double)data)) {
cell.setCellValue((int)Math.floor((double)data));
}
else {
cell.setCellValue((double)data);
}
}
BaseFormulaEvaluator.evaluateAllFormulaCells(workbook); //I don't have enough context here, but if it does not cause any logical problems, move this line to *
workbook.write(fos);
}

public void callsSetData1() {
object Data = new Object()
File file = new File(filePath);
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
} catch (FileNotFoundException e) {
Messages.terminate(file.getName() + " file is missing.");
}
Workbook workbook = new XSSFWorkbook(fis);
FileOutputStream fos = new FileOutputStream(new File(filePath));
//*
for(i = 0; i < 10; i++) {
setData1(workbook, fos, "R:\andom\File\Path", "randomSheetName",0,0, data); //I'm assuming you are calling setData1() multiple times, as I do not have the code of the method that calls it, I've just used a for-loop for now
}
workbook.close();
fos.close();
fis.close();
}

我建议您还提供调用 setData1 的方法的代码。由于我没有,callsSetData1 可能包含一些逻辑错误。

重点是,您应该在调用 setData1 的方法中仅打开和关闭工作簿一次,并将其作为参数传递。这应该有助于延迟。

唯一的小缺点是,如果您在多个不同的方法中调用 setData1,您将需要多几行代码。

关于java - 将值写入具有公式的 Excel 文件时出现延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55882476/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com