【问题标题】:Writing in memory XSSFWorkbooks to in memory zip将内存 XSSFWorkbooks 写入内存 zip
【发布时间】:2014-05-12 09:00:47
【问题描述】:

我正在读取数据库记录并在内存中创建 XSSFWorksbook。

完成后,我将编写此工作簿以压缩输出流。 zip 已正确创建,但 xlsx 文件未生成属性。它代替 excel 创建文件夹和文件,如 _rel、工作表、sharedStrings、样式和 workbook.xml

//Read records from db and create workbook
public static XSSFWorkbook buildReportDocuement(int reportIndex,
    List<Object> result) throws IOException {
    XSSFWorkbook workbook = new XSSFWorkbook();
    XSSFSheet excelSheet = workbook.createSheet(REPORT_NAME_PREFIX);
    setExcelHeader(excelSheet);
    processActivityReportData(result, excelSheet);      
    return workbook;
}

//reading worksbooks into bytearray and addign to in memory zip files
public static ByteArrayOutputStream zipWorkbooks(
    List<XSSFWorkbook> workbooks) throws IOException {

    int workBookIndex = 1;
    ByteArrayOutputStream byteOutputStream = null;
    FileOutputStream outputStream = new FileOutputStream("Reports");
    ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
    ZipEntry zipEntry = null;

    for (XSSFWorkbook current : workbooks) {
        zipEntry = new ZipEntry(REPORT_PREFIX + workBookIndex
            + EXCEL_EXTENSION);
        zipOutputStream.putNextEntry(zipEntry);
        byteOutputStream = new ByteArrayOutputStream();
        current.write(byteOutputStream);
        if (byteOutputStream != null) {
            zipEntry.setSize(byteOutputStream.size());
            zipOutputStream.write(byteOutputStream.toByteArray());
            zipOutputStream.closeEntry();
        }
    }
    zipOutputStream.close();
    return byteOutputStream;
}

我不应该将任何文件写入文件系统。请指导我。

【问题讨论】:

    标签: java excel java-io zip


    【解决方案1】:

    好吧,我终于想通了。问题出在我的逻辑上。我想念理解 ByteArrayOutputSram 的概念。我对函数 zipWorkbooks 进行了更改,它运行良好。变化是:

    公共静态 ByteArrayOutputStream zipWorkbooks( 列出工作簿)抛出 IOException { int workBookIndex = 1; ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream(); ByteArrayOutputStream 工作簿ByteArrayStream= null;
    ZipOutputStream zipOutputStream = new ZipOutputStream(byteOutputStream); ZipEntry zipEntry = null;

      for (XSSFWorkbook current : workbooks) {
         zipEntry = new ZipEntry(REPORT_PREFIX + workBookIndex
            + EXCEL_EXTENSION);
         zipOutputStream.putNextEntry(zipEntry);
         workbookByteArrayStream = new ByteArrayOutputStream();
         current.write(workbookByteArrayStream);            
         zipEntry.setSize(workbookByteArrayStream.size());
         zipOutputStream.write(workbookByteArrayStream.toByteArray());
         zipOutputStream.closeEntry();          
      }     
      zipOutputStream.close();
      return byteOutputStream;
    

    }

    【讨论】:

      猜你喜欢
      • 2019-06-18
      • 2013-08-29
      • 2023-01-17
      • 2011-12-15
      • 1970-01-01
      • 2023-01-03
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多