Автор оригинала: 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 List readExcelData(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, List countryList) 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);
Iterator rowIterator = 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, чтобы узнать больше об их функциях.