apache-poi - 兴趣点 : Append rows to existing workbook

标签 apache-poi

使用 XSSFWorkbook,是否可以将行附加到现有工作表?我正在进行多次写入(由于错误,这是一个需要解决的 PITA),虽然我可以多次写出新的工作表,但我似乎无法附加。

我目前正在做的事情如下:

  1. 阅读我的工作簿中的工作表。
  2. 加载工作簿。
  3. 将行追加到内存中的工作簿
  4. 再写一遍。

4 似乎不起作用,只是完全忽略它!

我知道 SXSSFWorkbook 存在,但尝试将现有的 XSSFWorkbook 转换为流工作簿会在写入时造成损坏。

这个难题有可能解决吗?

更新:根据建议更改了代码,但出现流关闭错误。

代码:(物理行正确返回,但没有写出任何内容)

private void writeToSheetMultipleTimes(SXSSFWorkbook wb,
            ReportTemplateStructure appA, File wbFile)
    {

        Sheet sheet = wb.getSheetAt(0);

        log.info("Attempting multi-write to sheet: " + sheet.getSheetName());
        for(int i = 0; i < 10; i++)
        {

            Row row = sheet.getRow(i);

            if (row == null) {
               row = sheet.createRow(i);
            }
            Cell cell = row.getCell(0, Row.CREATE_NULL_AS_BLANK);



            cell.setCellValue("Written value:" + i);

            int numRows = sheet.getPhysicalNumberOfRows();

            log.info("Current row count: " + numRows);

            try{
                XSSFWorkbook xssfBook = (XSSFWorkbook)writeOutAndReadBack(wb);
                wb.dispose();

                wb = new SXSSFWorkbook(xssfBook);
            } catch (Exception e)
            {
                log.error("Unable to perform multiple write to same sheet", e);
            }
        }


    }

   public Workbook writeOutAndReadBack(Workbook wb) {
        if(!(wb instanceof SXSSFWorkbook)) {
            throw new IllegalArgumentException("Expected an instance of SXSSFWorkbook");
        }

        Workbook result;
        try {
            FileOutputStream baos = new FileOutputStream(streamingWorkBookFile);
            wb.write(baos);
            InputStream is = new FileInputStream(streamingWorkBookFile);
            result = new XSSFWorkbook(is);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return result;
    }  

最佳答案

您似乎总是对 Sheet 0 进行更改,但每次都调用 createRow。如果那里已经有东西了,例如在你的第二次通过时,这将不会顺利!您要么需要每次添加一个新的工作表,要么首先调用 getRow(int) 检查 Row 是否存在,并且仅在它为 null 时才创建。

如果我们查看您的代码片段:

Sheet sheet = wb.getSheetAt(0);
for(int i = 0; i < 10; i++)
{
    Row row = sheet.createRow(i);
    Cell cell = row.createCell(0);

应该是这样的:

Sheet sheet = wb.createSheet();
for(int i = 0; i < 10; i++)
{
    Row row = sheet.createRow(i);
    Cell cell = row.createCell(0);

或者您应该首先检查并仅创建丢失的行/单元格,例如

Sheet sheet = wb.getSheetAt(0);
for(int i = 0; i < 10; i++)
{
    Row row = sheet.getRow(i);
    if (row == null) {
       row = sheet.createRow(i);
    }
    Cell cell = row.getCell(0, Row.CREATE_NULL_AS_BLANK);

关于apache-poi - 兴趣点 : Append rows to existing workbook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18794617/

相关文章:

java - 如何使用 Apache POI 缓存公式单元格

java - 如何在java中读取doc和docx

java - 使用 POI 写入现有 xls 文件

java - 为什么apache poi读取一行excel中的单元格数量较少

Java/Apache POI - 如何更改/设置特定单元格中的字体大小?

java - Apache POI 获取 NPE 读取 xls 文件

java - Apache POI - 保持原始图片比例,同时适应合并区域

java - 使用Java将Excel数据导入Mongodb

java - 我正在尝试使用 java 将多个 csv 文件作为不同的工作表合并到一个 Excel 工作簿中

java - 处理大型 xlsx 文件