SXSSFWorkbook写入xlsm文件

时间:2019-09-03 08:11:02

标签: java excel apache-poi

我将XSSFWorkbook复制到SXSSFWorkbook。在此过程中,我将像这样创建新的工作簿:

XSSFWorkbook readOnlyWb = (XSSFWorkbook) WorkbookFactory.create(f, null, true);
SXSSFWorkbook writeOnlyWb = new SXSSFWorkbook();

写入磁盘时,SXSSFWorkbook的内容类型始终为

/xl/workbook.xml - Content Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml

如果源工作簿是具有相同内容类型的.xlsx文件,则没有问题。

但是我也有.xlsm个文件要复制,应该保留为.xlsm个文件。这些文件的内容类型

/xl/workbook.xml - Content Type: application/vnd.ms-excel.sheet.macroEnabled.main+xml

所以基本上,我的问题是,在使用SXSSFWorkbook的同时动态获取每种文件类型的正确内容类型。

如何动态更改SXSSFWorkbook的内容类型?

1 个答案:

答案 0 :(得分:1)

您不能从头创建内容类型为SXSSFWorkbook的{​​{1}},也不能从头创建内容类型为*.xlsm的{​​{1}}。但是您可以从XSSFWorkbook文件中创建一个*.xlsm,这将保留所有内容,包括内容类型和XSSFWorkbook *.xlsm宏项目。然后,您可以使用构造函数SXSSFWorkbook(XSSFWorkbook workbook)从该模板vbaProject.bin创建VBA。之后,SXSSFWorkbook还将保留所有内容。

如果需要更改模板XSSFWorkbook的某些部分,则必须在从该模板创建SXSSFWorkbook之前完成。 XSSFWorkbook无法更改模板中已经存在的行。当SXSSFWorkbook完全包含在内存中时,可以在不更改模板文件的情况下在内存中完成此操作。如果是使用SXSSFWorkbook创建的,则属于这种情况。

以下代码显示了这一点。它使用XSSFWorkbookInputStream文件创建XSSFWorkbook。然后,它会在从模板创建*.xlsm之前更改模板的某些部分。然后,在FileInputStream中输入大量的日期。结果是SXSSFWorkbook文件具有正确的内容类型,并且也具有SXSSFWorkbook *.xlsm宏项目构成模板。

vbaProject.bin