在Apache POI中使用Excel模板

基本问题:如何加载Excel模板以便与POI一起使用,然后将其保存到XLS文件中?

编辑:

答案是:

FileInputStream inputStream = new FileInputStream(new File(templateFile)); Workbook workbook = new HSSFWorkbook(inputStream); 

(只需将模板作为工作簿加载,然后将工作簿作为其他位置的XLS文件写入。)

你有没有尝试加载它作为一个标准.xls使用兴趣点,修改它,然后保存它?

这是我用来将macros插入到POI生成的.xls中的方法。 我使用macros创build文件(公认是.xls),然后将其加载到我的应用程序中,填充数据并保存为新创build的.xls文件。 这一切工作正常。

您可以直接加载一个.xls作为模板,并对其进行修改。

 POIFSFileSystem fs = new POIFSFileSystem( new FileInputStream("template.xls")); HSSFWorkbook wb = new HSSFWorkbook(fs, true); 

将加载xls,保留其结构(包括macros)。 你可以修改它,

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

然后保存。

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

希望这可以帮助。

您也可以使用内部模板作为资源。

 InputStream fis = ChartSample.class.getResourceAsStream("/templates.xls"); HSSFWorkbook wb = new HSSFWorkbook(fis); fis.close(); HSSFSheet sh = wb.getSheetAt(0); //Here you go 

并保存:

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

您可以从XLS模板创build一个XLS文件。

但是,要做到这一点,每次需要使用模板时都需要创build一个模板的副本。 如果没有,你将编辑原来的模板(你不想要的)。

所以,你需要先得到你的模板文件:

 URL url = Thread.currentThread().getContextClassLoader().getResource("templates/template.xls"); File file = new File(url.getPath()); 

复制模板文件:

 try (FileOutputStream fileOutputStream = new FileOutputStream("/home/jake/fileCopiedFromTemplate.xls")) { Files.copy(file.toPath(), fileOutputStream); Workbook workbook = new HSSFWorkbook(); workbook.write(fileOutputStream); } 

访问新的复制文件:

 FileInputStream inp = new FileInputStream("/home/jake/fileCopiedFromTemplate.xls"); 

创build一个Workbook ,所以你可以写在你的新文件:

 Workbook workbook = WorkbookFactory.create(inp); 

在您的工作簿中写入之后:

 try (FileOutputStream fileOut = new FileOutputStream("/home/jake/fileCopiedFromTemplate.xls")) { workbook.write(fileOut); } 

创buildXLS模板文件的提示是用一些variables标记模板,以便本地化您想要填充的位置。 喜欢:

 ------------------------------------ | | Columna A | Column B | ------------------------------------ | 1 | Some description | ------------------------------------ | 2 | {person.name} | {person.age} | ------------------------------------ 

对于使用.xlsx excel文件,请使用以下命令:

 FileInputStream inputStream = new FileInputStream(new File("template.xlsx")); @SuppressWarnings("resource") Workbook wb = new XSSFWorkbook(inputStream); Sheet sheet = wb.getSheet("sheet1"); 

如果你想以2007+格式保存,可以在maven pom.xml中添加poi-ooxml依赖项来使用XSSF。

如果在这个xmls中有一个带有汇总表的template.xlsx文件,并且想要更改特定的单元格,可以这样做:

 XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream("template.xlsx")); FileOutputStream fileOut = new FileOutputStream("new.xlsx"); 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();