首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SXSSFWorkbook写xlsm文件

SXSSFWorkbook写xlsm文件
EN

Stack Overflow用户
提问于 2019-09-03 08:11:02
回答 1查看 1.1K关注 0票数 0

我把XSSFWorkbook复制到SXSSFWorkbook。在此过程中,我创建了如下所用的新工作簿:

代码语言:javascript
复制
XSSFWorkbook readOnlyWb = (XSSFWorkbook) WorkbookFactory.create(f, null, true);
SXSSFWorkbook writeOnlyWb = new SXSSFWorkbook();

写入磁盘时,SXSSFWorkbook的内容类型总是

代码语言:javascript
复制
/xl/workbook.xml - Content Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml

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

但是我也有我想要复制的.xlsm文件,它们应该仍然是.xlsm文件。这些文件具有内容类型。

代码语言:javascript
复制
/xl/workbook.xml - Content Type: application/vnd.ms-excel.sheet.macroEnabled.main+xml

因此,基本上,我遇到的问题是,在使用SXSSFWorkbook时,动态地为每个文件类型获取正确的内容类型。

如何更改SXSSFWorkbook dynamically? 的内容类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-03 10:42:41

您不能从头开始创建具有*.xlsm内容类型的XSSFWorkbook,也不能从头创建具有*.xlsm内容类型的XSSFWorkbook。但是您可以创建一个XSSFWorkbook表单,一个*.xlsm文件,这将保留包括内容类型和vbaProject.bin VBA宏项目在内的所有内容。然后,您可以使用构造函数SXSSFWorkbook从该模板XSSFWorkbook创建SXSSFWorkbook(XSSFWorkbook工作簿)。之后,SXSSFWorkbook还将保存所有内容。

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

下面的代码显示。它使用XSSFWorkbook*.xlsm文件创建FileInputStream。然后,在从模板创建SXSSFWorkbook之前,它会更改模板的某些部分。然后,大量的日期流在SXSSFWorkbook中。结果是一个具有正确内容类型的*.xlsm文件,以及模板中的vbaProject.bin VBA宏项目。

代码语言:javascript
复制
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();
 }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57767574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档