我将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
的*.xlsm
,也不能从头开始创建内容类型为XSSFWorkbook
的*.xlsm
。但是您可以创建一个XSSFWorkbook
形式的*.xlsm
文件,这将保留所有内容,包括内容类型和vbaProject.bin
VBA
宏项目。然后,您可以使用构造函数SXSSFWorkbook(XSSFWorkbook workbook)从该模板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();
}
}