Использование шаблонов Excel с Apache POI - PullRequest
19 голосов
/ 03 апреля 2009

Основной вопрос: как загрузить шаблон Excel для использования с POI, а затем сохранить его в файл XLS?

Edit:

Ответ:

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

(Просто загрузите шаблон как рабочую книгу, а затем запишите рабочую книгу как файл XLS в другом месте.)

Ответы [ 6 ]

16 голосов
/ 03 апреля 2009

Вы пытались загрузить его как стандартный .xls с помощью POI, изменить его и затем сохранить?

Это подход, который я использовал для вставки макросов в POX-сгенерированные .xls. Я создаю файл с макросом (предположительно как .xls), а затем загружаю его в свое приложение, заполняю данными и сохраняю как вновь созданный .xls. Это все работало нормально.

13 голосов
/ 03 апреля 2009

Вы можете напрямую загрузить .xls, который будет действовать как шаблон, и изменить его.

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

Будет загружать xls, сохраняя его структуру (включая макросы). Вы можете изменить его,

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

и сохраните его.

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

Надеюсь, это поможет.

5 голосов
/ 16 января 2012

Вы также можете использовать внутренний шаблон в качестве ресурса.

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();
3 голосов
/ 05 ноября 2015

Вы можете создать файл XLS из шаблона XLS.

Но для этого вам нужно создавать копию шаблона каждый раз, когда вам нужно использовать шаблон. Если нет, то вы отредактируете оригинальный шаблон (что вам не нужно).

Итак, сначала вам нужно получить файл шаблона:

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

Создайте Workbook, чтобы вы могли написать в своем новом файле:

Workbook workbook = WorkbookFactory.create(inp);

После записи в своей рабочей тетради:

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

Совет по созданию файла шаблона XLS - пометьте шаблон некоторой переменной, чтобы вы локализовали позицию, которую вы хотели бы занять. Как:

------------------------------------
|   | Columna A     | Column B     |
------------------------------------
| 1 |  Some description            | 
------------------------------------
| 2 | {person.name} | {person.age} |
------------------------------------
2 голосов
/ 14 декабря 2016

Для Excel-файлов с .xlsx используйте следующее:

FileInputStream inputStream = new FileInputStream(new File("template.xlsx"));
        @SuppressWarnings("resource")
        Workbook wb = new XSSFWorkbook(inputStream);  
        Sheet sheet = wb.getSheet("sheet1");
1 голос
/ 09 января 2017

Вы можете использовать XSSF, добавив зависимость poi-ooxml в свой файл maven pom.xml, если хотите сохранить его в формате 2007+.

Если у вас есть файл template.xlsx со сводной таблицей в этой xmls, и вы хотите изменить определенную ячейку, вы можете сделать это следующим образом:

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