Usando modelos do Excel com Apache POI
-
23-08-2019 - |
Pergunta
pergunta básica:? Como faço para carregar um modelo do Excel para uso com POI e guardá-la para um arquivo XLS
Editar:
A resposta é:
FileInputStream inputStream = new FileInputStream(new File(templateFile));
Workbook workbook = new HSSFWorkbook(inputStream);
(Basta carregar o modelo como uma pasta de trabalho e, em seguida, escrever o livro como um arquivo XLS em outro lugar.)
Solução
Você já tentou carregá-lo como um .xls padrão usando POI, altera-lo e depois salvá-lo?
Esta é a abordagem que eu usei para inserir macros em um .xls gerado-POI. Eu crio o arquivo com o macro (reconhecidamente como um .xls) e, em seguida, carregá-lo em meu aplicativo, preencher com dados e salvar como um .xls recém-criado. Isso tudo funcionou bem.
Outras dicas
Você pode carregar diretamente um .xls que atuará como o modelo e modificá-lo.
POIFSFileSystem fs = new POIFSFileSystem(
new FileInputStream("template.xls"));
HSSFWorkbook wb = new HSSFWorkbook(fs, true);
Será que carregar um xls, preservando sua estrutura (macros incluídas). Você pode, em seguida, modificá-lo,
HSSFSheet sheet1 = wb.getSheet("Data");
...
e depois salvá-lo.
FileOutputStream fileOut = new FileOutputStream("new.xls");
wb.write(fileOut);
fileOut.close();
Espero que isso ajude.
Você também pode usar o modelo interno como um recurso.
InputStream fis = ChartSample.class.getResourceAsStream("/templates.xls");
HSSFWorkbook wb = new HSSFWorkbook(fis);
fis.close();
HSSFSheet sh = wb.getSheetAt(0);
//Here you go
E a ressalva de que:
out = new FileOutputStream("./new.xls");
wb.write(out);
out.close();
Você pode criar um arquivo XLS partir de um modelo XLS.
Mas, para fazer isso, você precisa criar uma cópia do modelo de cada vez que você precisa para usar o modelo. Se não, você vai editar o modelo original (o que você não quer).
Então, você precisa primeiro obter o seu arquivo de modelo:
URL url = Thread.currentThread().getContextClassLoader().getResource("templates/template.xls");
File file = new File(url.getPath());
Copie o arquivo de modelo:
try (FileOutputStream fileOutputStream = new FileOutputStream("/home/jake/fileCopiedFromTemplate.xls")) {
Files.copy(file.toPath(), fileOutputStream);
Workbook workbook = new HSSFWorkbook();
workbook.write(fileOutputStream);
}
Acesse o novo arquivo copiado:
FileInputStream inp = new FileInputStream("/home/jake/fileCopiedFromTemplate.xls");
Criar um Workbook
, assim você pode escrever no seu novo arquivo:
Workbook workbook = WorkbookFactory.create(inp);
Depois de escrever em sua pasta de trabalho:
try (FileOutputStream fileOut = new FileOutputStream("/home/jake/fileCopiedFromTemplate.xls")) {
workbook.write(fileOut);
}
Uma dica para criar um arquivo de modelo XLS é marcar o modelo com alguma variável para você localizar a posição que você gostaria de preencher. Como:
------------------------------------
| | Columna A | Column B |
------------------------------------
| 1 | Some description |
------------------------------------
| 2 | {person.name} | {person.age} |
------------------------------------
Para o Excel-arquivos com o uso .xlsx
o seguinte:
FileInputStream inputStream = new FileInputStream(new File("template.xlsx"));
@SuppressWarnings("resource")
Workbook wb = new XSSFWorkbook(inputStream);
Sheet sheet = wb.getSheet("sheet1");
Você pode usar XSSF adicionando poi-OOXML dependência no seu pom.xml maven se você quer salvá-lo em formato 2007+.
Se você tem template.xlsx arquivo com uma folha de resumo neste xmls e você quer mudar uma célula especial que você pode fazê-lo como:
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();