2009-04-03 9 views
18

Question de base: Comment charger un modèle Excel à utiliser avec POI, puis l'enregistrer dans un fichier XLS?Utilisation de modèles Excel avec POI Apache

Edit:

La réponse est:

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

(. Il suffit de charger le modèle comme un classeur, puis écrire le classeur en tant que fichier XLS ailleurs)

Répondre

15

Avez-vous essayé le charger en tant que .xls standard en utilisant POI, l'amendant et l'enregistrant ensuite?

C'est l'approche que j'ai utilisée pour insérer des macros dans un fichier .xls généré par un POI. Je crée le fichier avec la macro (en tant que .xls), puis le charge dans mon application, le remplit avec des données et le sauvegarde en tant que fichier .xls nouvellement créé. Tout a bien fonctionné.

+0

J'ai essayé la même chose pour charger des macros avec poi 3.13 et 3.15 mais ça ne marche pas pour moi. Je veux dire après avoir enregistré le fichier, les macros sont manquantes. Avez-vous une idée? –

10

Vous pouvez directement charger un fichier .xls qui servira de modèle et le modifier.

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

Charge un xls, en préservant sa structure (macros incluses). Vous pouvez ensuite le modifier,

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

, puis enregistrez-le.

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

Espérons que cela aide.

3

Vous pouvez également utiliser le modèle interne en tant que ressource.

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

Et sauver que:

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

Vous pouvez créer un fichier XLS à partir d'un modèle XLS. Mais, pour ce faire, vous devez créer une copie du modèle chaque fois que vous avez besoin d'utiliser le gabarit. Sinon, vous allez modifier le modèle d'origine (ce que vous ne voulez pas).

Donc, vous devez d'abord obtenir votre fichier de modèle:

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

Copiez le fichier modèle:

try (FileOutputStream fileOutputStream = new FileOutputStream("/home/jake/fileCopiedFromTemplate.xls")) { 

    Files.copy(file.toPath(), fileOutputStream); 

    Workbook workbook = new HSSFWorkbook(); 
    workbook.write(fileOutputStream); 
} 

Accédez au nouveau fichier copié:

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

Créer une Workbook, afin que vous puissiez écrire dans votre nouveau fichier:

Workbook workbook = WorkbookFactory.create(inp); 

Après écriture dans votre classeur:

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

Une astuce pour créer un fichier modèle XLS est marquer le modèle avec une variable pour vous localiser la position que vous souhaitez remplir.Comme:

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

Excel-fichiers avec .xlsx utiliser les éléments suivants:

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

Vous pouvez utiliser XSSF en ajoutant poi-OOXML dépendance dans votre Maven pom.xml si vous voulez enregistrer en 2007 + format.

Si vous avez template.xlsx fichier avec une feuille de résumé dans ce xmls et que vous voulez changer une cellule particulière, vous pouvez le faire aussi:

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();