3

使用 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;
    }  
4

2 回答 2

2

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

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

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);
于 2013-09-17T14:54:09.920 回答
0

您可以getPhysicalNumberOfRows()在类中使用 MethodXSSFSheet来获取最后更新的行号。现在通过增加这个值来添加新数据来创建一个新行。

于 2016-01-12T05:37:25.270 回答