В прошлых двух статьях мы познакомились с библиотекой Apache POI, а также разобрались со считыванием данных из Excel документов в форматах .xls
и .xlsx
. Сегодня мы продолжим изучение возможностей этой библиотеки и попробуем создать новый Excel файл с формулами и стилями. Скачать проект Вы сможете в конце статьи.
Если Вы еще не знакомы с Apache POI, то рекомендую вкратце ознакомится с ее возможностями и способами ее подключения в проект по этой ссылке.
Создание нового Excel файла в Java
Внимание, код не очень красив и оптимизирован. Я хотел просто продемонстрировать возможности этой удобной библиотеки.
Для начала давайте создадим простой xls файл и запишем в него какие-то данные. А далее будем применять к нему стили и добавлять формулы.
Для удобной работы с данными нам потребуется дополнительный класс, который будет представлять собой модель данных, которую мы будем записывать в файл:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
package ua.com.prologistic.model; public class DataModel { private String name; private String surname; private String city; private Double salary; public DataModel() { } public DataModel(String name, String surname, String city, Double salary) { this.name = name; this.surname = surname; this.city = city; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public Double getSalary() { return salary; } public void setSalary(Double salary) { this.salary = salary; } } |
Как видим, это простой класс с полями для имени, фамилии, города и зарплаты какого-то человека.
Ниже представлен листинг класса, в котором создается сам Excel файл:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
package ua.com.prologistic.excel; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Row; import ua.com.prologistic.model.DataModel; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.text.ParseException; import java.util.ArrayList; import java.util.List; public class ExcelWorker { public static void main(String[] args) throws ParseException { // создание самого excel файла в памяти HSSFWorkbook workbook = new HSSFWorkbook(); // создание листа с названием "Просто лист" HSSFSheet sheet = workbook.createSheet("Просто лист"); // заполняем список какими-то данными List<DataModel> dataList = fillData(); // счетчик для строк int rowNum = 0; // создаем подписи к столбцам (это будет первая строчка в листе Excel файла) Row row = sheet.createRow(rowNum); row.createCell(0).setCellValue("Имя"); row.createCell(1).setCellValue("Фамилия"); row.createCell(2).setCellValue("Город"); row.createCell(3).setCellValue("Зарплата"); // заполняем лист данными for (DataModel dataModel : dataList) { createSheetHeader(sheet, ++rowNum, dataModel); } // записываем созданный в памяти Excel документ в файл try (FileOutputStream out = new FileOutputStream(new File("F:\\Apache POI Excel File.xls"))) { workbook.write(out); } catch (IOException e) { e.printStackTrace(); } System.out.println("Excel файл успешно создан!"); } // заполнение строки (rowNum) определенного листа (sheet) // данными из dataModel созданного в памяти Excel файла private static void createSheetHeader(HSSFSheet sheet, int rowNum, DataModel dataModel) { Row row = sheet.createRow(rowNum); row.createCell(0).setCellValue(dataModel.getName()); row.createCell(1).setCellValue(dataModel.getSurname()); row.createCell(2).setCellValue(dataModel.getCity()); row.createCell(3).setCellValue(dataModel.getSalary()); } // заполняем список рандомными данными // в реальных приложениях данные будут из БД или интернета private static List<DataModel> fillData() { List<DataModel> dataModels = new ArrayList<>(); dataModels.add(new DataModel("Howard", "Wolowitz", "Massachusetts", 90000.0)); dataModels.add(new DataModel("Leonard", "Hofstadter", "Massachusetts", 95000.0)); dataModels.add(new DataModel("Sheldon", "Cooper", "Massachusetts", 120000.0)); return dataModels; } } |
Обратите внимание, что мы использовали try with resources — одну из особенностей Java 7. А это значит, что нам не нужно беспокоится о закрытии файла вручную. В Java 7 конструкцию try-catch-finally можно не использовать, так как ей на смену пришла try with resources, которая сама закрывает открытые файлы или потоки без вашего вмешательства.
После запуска приведенной выше программы, в корне проекта создастся файл с названием Apache POI Excel File.xls. Давайте посмотрим на его содержимое:
Лист Excel файла называется «Просто лист», как мы и называли, а данные расположены правильно.
Добавление стилей в Excel документ на Java
Теперь давайте поупражняемся с обновлением файла, а именно добавлением стилей. Например, выделим имя столбцов из первой строки жирным.
Для этого нам понадобится еще один метод setBoldStyle():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
private static void setBoldStyle() throws IOException { // получаем файл с диска FileInputStream file = new FileInputStream(new File("F:\\Apache POI Excel File.xls")); // считываем его в память HSSFWorkbook workbook = new HSSFWorkbook(file); // говорим, что хотим работать с первым листом HSSFSheet sheet = workbook.getSheetAt(0); // создаем шрифт HSSFFont font = workbook.createFont(); // указываем, что хотим его видеть жирным font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // создаем стиль для ячейки HSSFCellStyle style = workbook.createCellStyle(); // и применяем к этому стилю жирный шрифт style.setFont(font); // получаем первую строку листа excel файла Row row = sheet.getRow(0); // проходим по всем ячейкам этой строки for (int i = 0; i < row.getPhysicalNumberOfCells(); i++) { // применяем созданный выше стиль к каждой ячейке row.getCell(i).setCellStyle(style); } // получаем доступ к excel файлу и обновляем его try (FileOutputStream out = new FileOutputStream(new File("F:\\Apache POI Excel File.xls"))) { workbook.write(out); } catch (IOException e) { e.printStackTrace(); } System.out.println("Excel файл успешно обновлен!"); } |
Как видите, мы просто обходим все ячейки первой строки и применяем к ней стиль BOLD.
Результат выполнения этого кода представлен ниже:
С помощью Apache POI это делается быстро и удобно.
Добавление формул в Excel документ на Java
Теперь попробуем разобраться с добавлением формул с помощью Apache POI.
Apache POI не позволяет устанавливать в ячейки значения из знаком равно: «=».
Пример:
Можно делать так:
1 |
cell.setCellFormula("D2+D3+D4"); |
и вот так:
1 |
cell.setCellFormula("SUM(D2:D4)"); |
Но если Вы попробуете написать так:
1 |
cell.setCellFormula("=D2*D3*D4"); |
то вылетит exception с сообщением о недопустимой операции. Apache POI не позволяет работать с формулами таким образом.
И так, в теории мы подкованы, теперь добавим простую формулу. Для этого напишем еще один метод setFormula():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
private static void setFormula() throws IOException { // получаем файл с диска FileInputStream file = new FileInputStream(new File("F:\\Apache POI Excel File.xls")); // считываем его в память HSSFWorkbook workbook = new HSSFWorkbook(file); // говорим, что хотим работать с первым листом HSSFSheet sheet = workbook.getSheetAt(0); // создаем 5ю строку листа excel файла // (сейчас она null, так как в ней нет никаких данных) Row row = sheet.createRow(4); // идем в 4ю ячейку строки и устанавливаем // формулу подсчета зарплат (столбец D) Cell sum = row.createCell(3); sum.setCellFormula("D2+D3+D4"); // создаем шрифт HSSFFont font = workbook.createFont(); // указываем, что хотим его видеть красным font.setColor(Font.COLOR_RED); // создаем стиль для ячейки HSSFCellStyle style = workbook.createCellStyle(); // и применяем к этому стилю жирный шрифт style.setFont(font); sum.setCellStyle(style); // получаем доступ к excel файлу и обновляем его try (FileOutputStream out = new FileOutputStream(new File("F:\\Apache POI Excel File.xls"))) { workbook.write(out); } catch (IOException e) { e.printStackTrace(); } System.out.println("Excel файл успешно обновлен!"); } |
В нем мы открываем файл, добавляем к нему еще одну строку с ячейкой для подсчета суммы зарплаты физиков. И да, выделяем ее красным цветом.
Результат выполнения представленного выше метода:
Урок по созданию нового Excel файла в Java с помощью Apache POI подошел к концу. Скачать рабочий проект можно по этой ссылке.
Подробнее о считывании Excel файлов Вы найдете здесь.
Подписывайтесь на обновления и получайте новые уроки по Java и Android сразу на почту!