You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:07:41