XLSX 服务从字符串数组 Java POI 递归编写

问题描述 投票:0回答:1

我正在尝试实现一个递归函数,将每个后续数组添加到 xlsx 文件路径。我有一个 ResultSet 转换为字符串数组,需要放入此文件中。 我有:

java.lang.RuntimeException:java.io.IOException:流已关闭

我发现这个错误来自workbook.write()
如何在递归中分离它?

import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;

public class XlsxService {

    private final Path outputFilePath;
    private SXSSFWorkbook workbook;
    private SXSSFSheet sheet;
    private Cell cell;
    private int rowNum = 0;

    public XlsxService(Path outputFilePath) {
        this.outputFilePath = outputFilePath;
    }

    public void generate(String[] resultSet) {
        if(workbook == null) {
            workbook = new SXSSFWorkbook();
            sheet = workbook.createSheet("Sheet");
        }
        writeToFile(resultSet);
        try (OutputStream fos = Files.newOutputStream(outputFilePath)) {
            workbook.write(fos);
            workbook.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public void writeToFile(String[] params) {       
        Row dataRow = sheet.createRow(rowNum);
        for (int i = 0; i < params.length; i++) {
            dataRow.createCell(i).setCellValue(params[i]);         
        }
        rowNum++;
    }
}

结果集示例:

    String[] resultSet1 = ["A1", "B1", "C1"]
    String[] resultSet2 = ["A2", "B2", "C2"]
    ...
    String[] resultSetN = ["AN", "BN", "CN"]

java excel performance apache-poi
1个回答
0
投票

您每次都编写相同的工作簿,第一次写入后它会关闭 - 因此第二次尝试时会出现异常。

当您打算写入多行时,更好的结构将用

writeToFile
替换
addRow
,并将
generate
替换为
save
:

// Initialise once in constructor:
private final SXSSFWorkbook workbook = new SXSSFWorkbook();
private final SXSSFSheet sheet = workbook.createSheet("Sheet");
...
// save replaces generate(String[])
public void save() throws IOException {
    try (OutputStream fos = Files.newOutputStream(outputFilePath)) {
        workbook.write(fos);
    }
    workbook.close();
}
// addRow replaces writeToFile 
public void addRow(String[] params) {
    Row dataRow = sheet.createRow(rowNum);
    for (int i = 0; i < params.length; i++) {
        dataRow.createCell(i).setCellValue(params[i]);
    }
    rowNum++;
}

那么您的调用就更简单了:- 根据需要多次使用 addRow,然后调用

save
一次。

XlsxService app = new XlsxService(Path.of("some.xlsx"));

// Multiple rows to add
app.addRow(new String[] {"A1", "B1", "C1"});
app.addRow(new String[] {"A2", "B2", "C2"});
app.addRow(new String[] {"A3", "B3", "C3"});

// One save:
app.save();
© www.soinside.com 2019 - 2024. All rights reserved.