Рубрики
Без рубрики

Учебник по POI Apache

Пример учебника по POI Apache. Apache POI Maven, Загрузка банок, Чтение файла Excel на Java, запись файла excel на Java, xls, xlsx, чтение и запись формул excel.

Автор оригинала: 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, заключаются в следующем:

  1. POI Apache содержит реализацию HSSF для формата файлов Excel ’97(-2007), т. е. XLS.
  2. Реализация Apache POI XSSF должна использоваться для формата файлов Excel 2007 OOXML (.xlsx).
  3. API Apache POI HSSF и XSSF предоставляет механизмы для чтения, записи или изменения электронных таблиц Excel.
  4. Apache POI также предоставляет API SXSSF, который является расширением XSSF для работы с очень большими листами excel. API SXSSF требует меньше памяти и подходит для работы с очень большими электронными таблицами, а объем оперативной памяти ограничен.
  5. Есть две модели на выбор – модель событий и модель пользователя. Модель событий требует меньше памяти, поскольку файл excel считывается в токенах и требует их обработки. Модель пользователя более объектно-ориентирована и проста в использовании, и мы будем использовать это в наших примерах.
  6. 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);
	}

}

Программа очень проста для понимания и содержит следующие шаги:

  1. Создайте Экземпляр рабочей книги на основе типа файла. XSSFWorkbook для формата xlsx и HSSFWorkbook для формата xls. Обратите внимание, что мы могли бы создать класс-оболочку с заводским шаблоном , чтобы получить экземпляр книги на основе имени файла.
  2. Используйте workbook getNumberOfSheets (), чтобы получить количество листов, а затем используйте цикл for для анализа каждого из листов. Получите экземпляр Sheet с помощью метода getSheetAt(int i).
  3. Получите Строку итератор, а затем Ячейку итератор, чтобы получить объект ячейки. POI Apache использует шаблон итератора здесь.
  4. Используйте переключатель для считывания типа ячейки и соответствующей обработки.

Теперь, когда мы запускаем примерную программу 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, чтобы узнать больше об их функциях.

Ссылки : Руководство для разработчиков POI Apache