我正在尝试实现一个递归函数,将每个后续数组添加到 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"]
您每次都编写相同的工作簿,第一次写入后它会关闭 - 因此第二次尝试时会出现异常。
当您打算写入多行时,更好的结构将用
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();