java - 使用 SXSSFWorkbook 创建具有多个工作表的 Excel 工作簿

标签 java excel apache-poi

我必须创建一个包含两张表的 Excel 工作簿。我使用以下代码创建 Excel,然后将其下载。但是,已创建第一个工作表,但未创建第二个工作表。我无法理解确切的原因。以下是我创建两张表的部分。

import java.io.OutputStream;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
private static final String SECOND_SHEET_NAME = "Sheet 2";

private static final String FIRST_SHEET_NAME = "Sheet 1"

protected Sheet firstSheet;
protected Sheet secondSheet;
protected Workbook outWorkbook;

//creating workbook
outWorkbook = new SXSSFWorkbook(1);
//create first sheet
firstSheet = outWorkbook.createSheet(FIRST_SHEET_NAME);

//create second sheet
secondSheet = outWorkbook.createSheet(SECOND_SHEET_NAME);
//setting the second sheet as unhidden

outWorkbook.setSheetHidden(outWorkbook.getSheetIndex(SECOND_SHEET_NAME), false);
try
{
   outWorkbook.write(outputStream);
}
catch(IOException)
{
    String errorMsg = "Failed to write to workbook";
    log.error(errorMsg, e);
}

最佳答案

问题是您没有在此处正确导出工作表。

outWorkbook.setSheetHidden(outWorkbook.getSheetIndex(SECOND_SHEET_NAME), 
false);
try
{
   outWorkbook.write(outputStream);
}
catch(IOException)
{
    String errorMsg = "Failed to write to workbook";
    log.error(errorMsg, e);
}

如果在创建所有工作表之前未调用 dispose,则工作表应写入。这是我想出的一个例子供引用。

static String outPath = "path";
static String fileName = "test.xlsx";

public static void main(String[] args) throws Throwable {

    ApacheExample1 a = new ApacheExample1();

    a.runExport("test");

}

private void runExport(String tag) throws IOException {
    SXSSFWorkbook wb = new SXSSFWorkbook();
    Sheet sh1 = wb.createSheet("Sheet" + 1);
    Sheet sh2 = wb.createSheet("Sheet" + 2);
    String[] v1 = {"test", "one"};
    String[] v2 = {"test", "two"};
    writeSXSSLRow(0, 0, sh1, v1);
    writeSXSSLRow(0, 0, sh2, v2);

    writeToFile(wb);

}

private static void writeToFile(SXSSFWorkbook wb) throws IOException {
    File f = new File(outPath);
    if (!f.exists()) {
        f.createNewFile();
    }
    FileOutputStream out = new FileOutputStream(outPath + fileName);
    wb.write(out);
    out.close();

    //After everything is written, then we dispose the temp file.
    wb.dispose();
}

private static void writeSXSSLRow(int colStart, int cellRow, Sheet ws, String[] v) throws IOException {
    Row row = ws.createRow(cellRow);
    for (int col = colStart; col < colStart + v.length; col++) {
        Cell cell = row.createCell(col);
        cell.setCellValue(v[col - colStart]);
    }

}

关于java - 使用 SXSSFWorkbook 创建具有多个工作表的 Excel 工作簿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36532868/

相关文章:

java - 如何使用 apache poi 获取单元格的背景颜色?

java - 使用 APACHE POI 打印同一行不同列中的值

excel - 使用 vba 过滤和更新 excel 中的列

excel - OleDB Jet - 读取 Excel 数据时出现 float 问题

java - Flyway 是否知道数据库状态或它是否专门验证迁移文件的不变性?

java - 正确使用位掩码?

excel - 删除重复项并向上移动单元格

java - 根据单个单元格值获取整个 Excel 行

java - 在继承中,层次结构中什么是向上转型和向下转型?

java - 动态数组列表大小