用Java从模板创建Excel表格,Excel的新版本

9
我找到了以下代码,可以使用现有模板创建一个带有格式的Excel表格,并向其中添加数据,最后将其保存为一个新文件。
POIFSFileSystem fs = new POIFSFileSystem(
            new FileInputStream("template.xls"));
HSSFWorkbook wb = new  HSSFWorkbook(fs, true);
Will load an xls, preserving its structure (macros included). You can then modify it,

HSSFSheet sheet1 = wb.getSheet("Data"); ...

然后保存它。

FileOutputStream fileOut = new FileOutputStream("new.xls"); 
wb.write(fileOut);
fileOut.close();

这段代码的功能完全正常。但我现在遇到的问题是,我要处理新版本的excel。因此,我需要编写类似的代码来处理新版本的模板。有人能建议我怎么做吗?我尝试将HSSWorkbook更改为XSSFWorkbook,但XSSFWorkbook没有让我传递布尔值的构造函数。另外,当我尝试使用它时,它会复制数据,但包含数据的行不保留模板所具有的列的格式。

你使用的是哪个版本的POI? - oers
2个回答

9
这应该可以正常工作(尽管最好使用最新版本的POI以修复所有错误):
Workbook wb = new XSSFWorkbook( OPCPackage.open("template.xlsx") );
Sheet sheet = wb.getSheetAt(0);

// Make changes to the sheet
sheet.getRow(2).getCell(0).setCellValue("Changed value"); // For example

// All done
FileOutputStream fileOut = new FileOutputStream("new.xls"); 
wb.write(fileOut);
fileOut.close();

如果你按照接口编码,那么你只需要在构造函数中切换 HSSF 和 XSSF,你的代码就可以同时适用于两种格式。

我尝试了上述代码。我遇到了以下错误:异常线程"main"java.lang.NoClassDefFoundError:org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet 在java.lang.J9VMInternals.verifyImpl(Native Method) 在java.lang.J9VMInternals.verify(J9VMInternals.java:68) 在java.lang.J9VMInternals.initialize(J9VMInternals.java:129) 在com.caremark.eztest.common.utilities.CSVToExcelFileConverter.convertCSVToXLSComprehensive(CSVToExcelFileConverter.java:80) - cma3982
请确保您拥有最新版本的POI,并已包含所有的Jars及其依赖关系。链接 - Gagravarr
感谢 @Gagravarr 我注意到运行时环境中没有jar包。现在已经处理完该异常,但是该行上的getCell()返回null,因此我需要在该行中创建一个新单元格。 - cma3982
谢谢@Gagravarr,我注意到我在运行时环境中没有这个jar包。现在那个异常已经消失了,但是行上的getCell()返回null,所以我需要在行中创建一个新的单元格,并且它不会复制模板的格式。 - cma3982

3

我使用了XSSF,它运行良好。

        XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream("template.xlsx"));           
        FileOutputStream fileOut = new FileOutputStream("new.xlsx");
        //Sheet mySheet = wb.getSheetAt(0);
        XSSFSheet sheet1 = wb.getSheet("Summary");
        XSSFRow row = sheet1.getRow(15);
        XSSFCell cell = row.getCell(3);
        cell.setCellValue("Bharthan");

        wb.write(fileOut);
        log.info("Written xls file");
        fileOut.close();

只需要在Maven的pom.xml文件中添加这个依赖项即可。

<dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.8-beta4</version>
    </dependency>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接