XSSFWorkbook 覆盖模板文件

XSSFWorkbook overriding the template file

我正在使用 XSSFWorkbook 创建一个 xlsx 文件,该文件存储 SQL 查询的结果 JAVA 8.

这个过程每个月都会完成,所以我使用模板 xslx 文件 template.xslx。

点它打开模板并将其另存为新文件。 它曾经有效,但现在模板也被修改并填充了数据(它应该保持为空,只有列大小、颜色、headers ...)。

我是这样做的:

ZipSecureFile.setMinInflateRatio(0);
OPCPackage pkg = OPCPackage.open(new File(excelMaquette));      // Template xlsx            
XSSFWorkbook wb = new XSSFWorkbook(pkg);                        // Fichier xlsx

excelFinal += "_"+dateDuJour+".xlsx";

FileOutputStream stream = new FileOutputStream(new File(excelFinal));

XSSFSheet sheet = wb.getSheetAt(0);             

XSSFCellStyle style = wb.createCellStyle();
            
//remplissage du tableau pour la feuille de détail
for (int i = 0 ; i <= nombreLigneResultat ; i++)
{
    XSSFRow row = sheet.createRow((short)i+1);
                
    for (int l = 0; l < nombreColonnes + 1; l ++)
    {
        XSSFCell  cell = row.createCell(l);         
        cell.setCellValue(tab[i][l]);   
        //System.out.println (" xls = " + tab[i][l]);
    }               
}
                
wb.write(stream);
stream.close();
wb.close();

谢谢你的帮助

编辑:我尝试重写和重命名我的文件,但它仍然是一样的...... 这很糟糕,因为有时新文件的数据会比前一个文件少,因此文件会显示新数据和额外的旧数据:(

为什么要使用 OPCPackage

OPCPackage是从templateFileREAD_WRITE模式打开的。如果这将被关闭,它也会被保存。

你可以这样做:

try (FileInputStream inputStream = new FileInputStream(templateFile);
            FileOutputStream outputStream = new FileOutputStream(new File(finalFile));
            Workbook workbook = new XSSFWorkbook(inputStream)) {
    wb.getSheetAt(0);

    /*
     *
     * Your POI related operations.
     *
     */

    wb.write(stream);
    outputStream.close();
    wb.close();
}