java - SXSSFWorkbook 写入 xlsm 文件
问题描述
我复制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
动态更改内容类型?
解决方案
您不能从头开始创建具有SXSSFWorkbook
内容类型,也不能从头开始创建具有内容类型。但是您可以创建一个文件格式,这将保留所有内容,包括内容类型和宏项目。然后,您可以使用构造函数SXSSFWorkbook(XSSFWorkbook workbook)从该模板创建。之后,也将保留所有内容。*.xlsm
XSSFWorkbook
*.xlsm
XSSFWorkbook
*.xlsm
vbaProject.bin
VBA
SXSSFWorkbook
XSSFWorkbook
SXSSFWorkbook
如果需要更改模板的某些部分XSSFWorkbook
,则必须SXSSFWorkbook
在从该模板创建之前完成。SXSSFWorkbook
无法更改模板中已经存在的行。XSSFWorkbook
当内存完全包含在内存中时,这可以在内存中完成,而无需更改模板文件。如果它是使用InputStream
.
以下代码显示了这一点。它使用. XSSFWorkbook
_ 然后它会在创建模板之前更改模板的某些部分。然后大量的日期流入. 结果是一个具有正确内容类型的文件,并且还具有 模板的宏项目。*.xlsm
FileInputStream
SXSSFWorkbook
SXSSFWorkbook
*.xlsm
vbaProject.bin
VBA
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.xssf.streaming.*;
public class CreateExcelSXSSFFromXLSM {
public static void main(String[] args) throws Exception {
XSSFWorkbook templateWorkbook = (XSSFWorkbook)WorkbookFactory.create(new FileInputStream("Workbook.xlsm"));
Sheet sheet = templateWorkbook.getSheet("Sheet1");
for (Row row : sheet) {
for (Cell cell : row) {
System.out.println(cell);
if (cell.getColumnIndex() == 0) cell.setCellValue("changed in template");
}
}
int lastRowInTemplate = sheet.getLastRowNum();
SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(templateWorkbook);
SXSSFSheet sxssfSheet = sxssfWorkbook.getSheet("Sheet1");
for (int r = lastRowInTemplate + 1; r < lastRowInTemplate + 10; r++) {
SXSSFRow row = sxssfSheet.createRow(r);
for (int c = 0; c < 10; c++) {
SXSSFCell cell = row.createCell(c);
cell.setCellValue("R" + (r+1) + "C" + (c+1));
}
}
FileOutputStream out = new FileOutputStream("WorkbookNew.xlsm");
sxssfWorkbook.write(out);
out.close();
sxssfWorkbook.close();
sxssfWorkbook.dispose();
}
}
推荐阅读
- r - 绑定2个不同行数的数据集
- javascript - 根据其值检查和取消选中复选框
- java - 如何从 Spark Structured Streaming 获取 Kafka 输出中的批处理 ID
- ios - Xcode 11 GM 2 - 上传时出错
- javascript - 如何使用函数开发评分算法
- c++ - 编译时专门针对函数指针引用以避免 -Waddress
- user-interface - 如何在 Windows 10 上安装 Glade 3.22?
- go - 迭代和更新 map[string]interface{} 值的属性
- r - 不在另一个标签中的 XML 标签的 R 正则表达式
- azure-active-directory - 如何在 Azure AD 中为从本地 Active Directory 同步的组添加组所有者