如何使用Apache POI将String数组转换为XLSX文件?
用String数组生成XLSX文件的问题与修正
我想用String数组创建XLSX文件,参考了Apache POI相关方案后写了代码,但生成的文件不符合预期。当前实现代码如下:
public void createXlsx(String[] resultSet) { SXSSFWorkbook workbook = new SXSSFWorkbook(); SXSSFSheet sheet = workbook.createSheet("Sheet"); AtomicReference<Integer> row = new AtomicReference<>(0); Stream.iterate(0, i -> i + 1).limit(resultSet.length) .forEach(i -> sheet.createRow(row.getAndSet(row.get() + 1)).createCell(i).setCellValue(resultSet[i])); try { OutputStream out = Files.newOutputStream(Path.of("/Documents/test.xlsx"), CREATE_NEW); workbook.write(out); out.flush(); } catch (IOException e) { throw new RuntimeException(e); } }
当前生成的Excel文件中,数组元素沿单元格对角线排列(第一个元素在第1行第1列,第二个在第2行第2列,以此类推),而非按行或列连续排布。
修正方案
问题根源
代码中同时用循环变量i作为行索引和列索引,导致每个元素被放置在(i,i)位置,形成对角线布局。只需分离行、列索引逻辑即可解决。
方案1:元素放在同一行的连续列
import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; import org.apache.poi.xssf.streaming.SXSSFCell; import org.apache.poi.xssf.streaming.SXSSFRow; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; public void createXlsx(String[] resultSet) { SXSSFWorkbook workbook = new SXSSFWorkbook(); SXSSFSheet sheet = workbook.createSheet("Sheet"); // 创建第一行,将所有数组元素放入该行的连续列中 SXSSFRow row = sheet.createRow(0); for (int colIndex = 0; colIndex < resultSet.length; colIndex++) { SXSSFCell cell = row.createCell(colIndex); cell.setCellValue(resultSet[colIndex]); } // 使用try-with-resources自动管理输出流 try (OutputStream out = Files.newOutputStream(Path.of("/Documents/test.xlsx"), StandardOpenOption.CREATE_NEW)) { workbook.write(out); } catch (IOException e) { throw new RuntimeException(e); } finally { // 清理SXSSF的临时文件,避免资源泄漏 workbook.dispose(); } }
方案2:元素放在同一列的连续行
import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; import org.apache.poi.xssf.streaming.SXSSFCell; import org.apache.poi.xssf.streaming.SXSSFRow; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; public void createXlsx(String[] resultSet) { SXSSFWorkbook workbook = new SXSSFWorkbook(); SXSSFSheet sheet = workbook.createSheet("Sheet"); // 遍历数组,每个元素放入连续行的第一列 for (int rowIndex = 0; rowIndex < resultSet.length; rowIndex++) { SXSSFRow row = sheet.createRow(rowIndex); SXSSFCell cell = row.createCell(0); cell.setCellValue(resultSet[rowIndex]); } try (OutputStream out = Files.newOutputStream(Path.of("/Documents/test.xlsx"), StandardOpenOption.CREATE_NEW)) { workbook.write(out); } catch (IOException e) { throw new RuntimeException(e); } finally { workbook.dispose(); } }
优化点说明
- 替换复杂的
Stream和AtomicReference为普通for循环,逻辑更清晰,避免索引混淆 - 使用try-with-resources自动关闭输出流,无需手动调用
flush - 添加
workbook.dispose()清理SXSSF临时文件,防止磁盘资源占用 - 明确导入
StandardOpenOption,避免编译报错
内容的提问来源于stack exchange,提问作者3oJIoTou
相关产品推荐
相关产品推荐

