Автор оригинала: Pankaj Kumar.
Добро пожаловать в учебник по POI Apache. Иногда нам нужно считывать данные из Файлов Microsoft Excel или создавать отчеты в формате Excel, в основном для деловых или финансовых целей. Java не предоставляет встроенной поддержки для работы с файлами excel, поэтому нам нужно искать API с открытым исходным кодом для этой работы. Когда я начал поиск Java API для excel, большинство людей рекомендовали Excel или Apache POI.
После дальнейших исследований я обнаружил, что Apache POI-это правильный путь по следующим основным причинам. Есть и некоторые другие причины, связанные с расширенными функциями, но давайте не будем вдаваться в такие подробности.
- Поддержка фонда Apache.
- Excel не поддерживает формат xlsx, в то время как POI поддерживает форматы xls и xlsx.
- Apache POI обеспечивает потоковую обработку, которая подходит для больших файлов и требует меньше памяти.
POI Apache
Apache POI обеспечивает отличную поддержку для работы с документами Microsoft Excel. Apache POI способен обрабатывать электронные таблицы в форматах XLS и XLSX.
Некоторые важные моменты, касающиеся API POI Apache, заключаются в следующем:
- POI Apache содержит реализацию HSSF для формата файлов Excel ’97(-2007), т. е. XLS.
- Реализация Apache POI XSSF должна использоваться для формата файлов Excel 2007 OOXML (.xlsx).
- API Apache POI HSSF и XSSF предоставляет механизмы для чтения, записи или изменения электронных таблиц Excel.
- Apache POI также предоставляет API SXSSF, который является расширением XSSF для работы с очень большими листами excel. API SXSSF требует меньше памяти и подходит для работы с очень большими электронными таблицами, а объем оперативной памяти ограничен.
- Есть две модели на выбор – модель событий и модель пользователя. Модель событий требует меньше памяти, поскольку файл excel считывается в токенах и требует их обработки. Модель пользователя более объектно-ориентирована и проста в использовании, и мы будем использовать это в наших примерах.
- Apache POI обеспечивает отличную поддержку дополнительных функций excel, таких как работа с формулами, создание стилей ячеек путем заполнения цветов и границ, шрифтов, верхних и нижних колонтитулов, проверки данных, изображений, гиперссылок и т.д.
Зависимости Apache POI Maven
Если вы используете maven, добавьте ниже зависимости POI Apache.
org.apache.poi poi 3.10-FINAL org.apache.poi poi-ooxml 3.10-FINAL
Текущая версия POI Apache 3.10-ОКОНЧАТЕЛЬНАЯ. Если у вас есть автономное java-приложение, включите банки из изображения ниже.
Пример POI Apache – Чтение файла Excel
Допустим, у нас есть файл excel “Sample.xlsx” с двумя листами и данными, как показано на рисунке ниже. Мы хотим прочитать файл excel и создать список стран. Лист1 содержит некоторые дополнительные данные, которые мы будем игнорировать при его анализе.
Код java-бина нашей страны является:
Код java-бина нашей страны является:
package com.journaldev.excel.read; public class Country { private String name; private String shortCode; public Country(String n, String c){ this.name=n; this.shortCode=c; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getShortCode() { return shortCode; } public void setShortCode(String shortCode) { this.shortCode = shortCode; } @Override public String toString(){ return name + "::" + shortCode; } }
Пример программы Apache POI для чтения файла excel в список стран выглядит следующим образом.
Пример программы Apache POI для чтения файла excel в список стран выглядит следующим образом.
package com.journaldev.excel.read; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ReadExcelFileToList { public static ListreadExcelData(String fileName) { List countriesList = new ArrayList (); try { //Create the input stream from the xlsx/xls file FileInputStream fis = new FileInputStream(fileName); //Create Workbook instance for xlsx/xls file input stream Workbook workbook = null; if(fileName.toLowerCase().endsWith("xlsx")){ workbook = new XSSFWorkbook(fis); }else if(fileName.toLowerCase().endsWith("xls")){ workbook = new HSSFWorkbook(fis); } //Get the number of sheets in the xlsx file int numberOfSheets = workbook.getNumberOfSheets(); //loop through each of the sheets for(int i=0; i < numberOfSheets; i++){ //Get the nth sheet from the workbook Sheet sheet = workbook.getSheetAt(i); //every sheet has rows, iterate over them Iterator rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { String name = ""; String shortCode = ""; //Get the row object Row row = rowIterator.next(); //Every row has columns, get the column iterator and iterate over them Iterator
cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { //Get the Cell object Cell cell = cellIterator.next(); //check the cell type and process accordingly switch(cell.getCellType()){ case Cell.CELL_TYPE_STRING: if(shortCode.equalsIgnoreCase("")){ shortCode = cell.getStringCellValue().trim(); }else if(name.equalsIgnoreCase("")){ //2nd column name = cell.getStringCellValue().trim(); }else{ //random data, leave it System.out.println("Random data::"+cell.getStringCellValue()); } break; case Cell.CELL_TYPE_NUMERIC: System.out.println("Random data::"+cell.getNumericCellValue()); } } //end of cell iterator Country c = new Country(name, shortCode); countriesList.add(c); } //end of rows iterator } //end of sheets for loop //close file input stream fis.close(); } catch (IOException e) { e.printStackTrace(); } return countriesList; } public static void main(String args[]){ List | list = readExcelData("Sample.xlsx"); System.out.println("Country List\n"+list); } }
Программа очень проста для понимания и содержит следующие шаги:
- Создайте
Экземпляр рабочей книги
на основе типа файла.XSSFWorkbook
для формата xlsx иHSSFWorkbook
для формата xls. Обратите внимание, что мы могли бы создать класс-оболочку с заводским шаблоном , чтобы получить экземпляр книги на основе имени файла. - Используйте workbook getNumberOfSheets (), чтобы получить количество листов, а затем используйте цикл for для анализа каждого из листов. Получите экземпляр
Sheet
с помощью метода getSheetAt(int i). - Получите
Строку
итератор, а затемЯчейку
итератор, чтобы получить объект ячейки. POI Apache использует шаблон итератора здесь. - Используйте переключатель для считывания типа ячейки и соответствующей обработки.
Теперь, когда мы запускаем примерную программу Apache POI, она выдает следующий вывод на консоль.
Random data::1.0 Random data::2.0 Random data::3.0 Random data::4.0 Country List [India::IND, Afghanistan::AFG, United States of America::USA, Anguilla::AIA, Denmark ::DNK, Dominican Republic ::DOM, Algeria ::DZA, Ecuador ::ECU]
Пример POI Apache – Запись файла Excel
Запись файла excel в apache POI аналогична чтению, за исключением того, что здесь мы сначала создаем книгу. Затем задайте значения листов, строк и ячеек и используйте FileOutputStream для записи в файл. Давайте напишем простой пример POI apache, в котором мы будем использовать список стран из приведенного выше метода для сохранения в другой файл на одном листе.
Запись файла excel в apache POI аналогична чтению, за исключением того, что здесь мы сначала создаем книгу. Затем задайте значения листов, строк и ячеек и используйте FileOutputStream для записи в файл. Давайте напишем простой пример POI apache, в котором мы будем использовать список стран из приведенного выше метода для сохранения в другой файл на одном листе.
package com.journaldev.excel.read; import java.io.FileOutputStream; import java.util.Iterator; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class WriteListToExcelFile { public static void writeCountryListToFile(String fileName, ListcountryList) throws Exception{ Workbook workbook = null; if(fileName.endsWith("xlsx")){ workbook = new XSSFWorkbook(); }else if(fileName.endsWith("xls")){ workbook = new HSSFWorkbook(); }else{ throw new Exception("invalid file name, should be xls or xlsx"); } Sheet sheet = workbook.createSheet("Countries"); Iterator iterator = countryList.iterator(); int rowIndex = 0; while(iterator.hasNext()){ Country country = iterator.next(); Row row = sheet.createRow(rowIndex++); Cell cell0 = row.createCell(0); cell0.setCellValue(country.getName()); Cell cell1 = row.createCell(1); cell1.setCellValue(country.getShortCode()); } //lets write the excel data to file now FileOutputStream fos = new FileOutputStream(fileName); workbook.write(fos); fos.close(); System.out.println(fileName + " written successfully"); } public static void main(String args[]) throws Exception{ List list = ReadExcelFileToList.readExcelData("Sample.xlsx"); WriteListToExcelFile.writeCountryListToFile("Countries.xls", list); } }
Когда я выполняю пример программы apache POI, сгенерированный файл excel выглядит так, как показано на рисунке ниже.
Пример POI Apache – Прочитайте Формулу Excel
Иногда нам нужно обрабатывать сложные файлы excel с формулами, давайте рассмотрим простой пример apache POI, чтобы прочитать формулу ячейки с ее значением.
Иногда нам нужно обрабатывать сложные файлы excel с формулами, давайте рассмотрим простой пример apache POI, чтобы прочитать формулу ячейки с ее значением.
package com.journaldev.excel.read; import java.io.FileInputStream; import java.io.IOException; import java.util.Iterator; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ReadExcelFormula { public static void readExcelFormula(String fileName) throws IOException{ FileInputStream fis = new FileInputStream(fileName); //assuming xlsx file Workbook workbook = new XSSFWorkbook(fis); Sheet sheet = workbook.getSheetAt(0); IteratorrowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); Iterator
cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); switch(cell.getCellType()){ case Cell.CELL_TYPE_NUMERIC: System.out.println(cell.getNumericCellValue()); break; case Cell.CELL_TYPE_FORMULA: System.out.println("Cell Formula="+cell.getCellFormula()); System.out.println("Cell Formula Result Type="+cell.getCachedFormulaResultType()); if(cell.getCachedFormulaResultType() == Cell.CELL_TYPE_NUMERIC){ System.out.println("Formula Value="+cell.getNumericCellValue()); } } } } } public static void main(String args[]) throws IOException { readExcelFormula("FormulaMultiply.xlsx"); } } |
Когда мы выполняем приведенный выше пример программы apache poi, мы получаем следующий вывод.
1.0 2.0 3.0 4.0 Cell Formula=A1*A2*A3*A4 Cell Formula Result Type=0 Formula Value=24.0
Пример POI Apache – Формула записи в Excel
Иногда нам нужно выполнить некоторые вычисления, а затем записать значения ячеек. Мы можем использовать формулы excel для выполнения этого расчета, и это сделает его более точным, потому что значения изменятся, если будут изменены значения ячеек, используемые в расчетах.
Давайте рассмотрим простой пример записи файла excel с формулами с помощью api apache poi.
Давайте рассмотрим простой пример записи файла excel с формулами с помощью api apache poi.
package com.journaldev.excel.read; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class WriteExcelWithFormula { public static void writeExcelWithFormula(String fileName) throws IOException{ Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Numbers"); Row row = sheet.createRow(0); row.createCell(0).setCellValue(10); row.createCell(1).setCellValue(20); row.createCell(2).setCellValue(30); //set formula cell row.createCell(3).setCellFormula("A1*B1*C1"); //lets write to file FileOutputStream fos = new FileOutputStream(fileName); workbook.write(fos); fos.close(); System.out.println(fileName + " written successfully"); } public static void main(String[] args) throws IOException { writeExcelWithFormula("Formulas.xlsx"); } }
Файл excel, созданный с помощью приведенного выше примера программы Apache POI API, выглядит следующим образом.
Это все в учебнике Apache POI по работе с файлами Excel, ознакомьтесь с методами классов Apache POI, чтобы узнать больше об их функциях.