Welcome to Apache POI Tutorial. Sometimes we need to read data from Microsoft Excel Files or we need to generate reports in Excel format, mostly for Business or Finance purposes. Java doesn’t provide built-in support for working with excel files, so we need to look for open source APIs for the job. When I started the hunt for Java APIs for excel, most of the people recommended JExcel or Apache POI.

 
After further research, I found that Apache POI is the way to go for following main reasons. There are some other reasons related to advanced features but let’s not go into that much detail.
 
Backing of Apache foundation.
JExcel doesn’t support xlsx format whereas POI supports both xls and xlsx formats.
Apache POI provides stream-based processing, that is suitable for large files and requires less memory.
Apache POI
 
Apache POI provides excellent support for working with Microsoft Excel documents. Apache POI is able to handle both XLS and XLSX formats of spreadsheets.
 
 
Some important points about Apache POI API are:
 
Apache POI contains HSSF implementation for Excel ’97(-2007) file format i.e XLS.
Apache POI XSSF implementation should be used for Excel 2007 OOXML (.xlsx) file format.
Apache POI HSSF and XSSF API provides mechanisms to read, write or modify excel spreadsheets.
Apache POI also provides SXSSF API that is an extension of XSSF to work with very large excel sheets. SXSSF API requires less memory and is suitable when working with very large spreadsheets and heap memory is limited.
There are two models to choose from – event model and user model. Event model requires less memory because the excel file is read in tokens and requires processing them. User model is more object oriented and easy to use and we will use this in our examples.
Apache POI provides excellent support for additional excel features such as working with Formulas, creating cell styles by filling colors and borders, fonts, headers and footers, data validations, images, hyperlinks etc.
Apache POI Maven Dependencies
 
If you are using maven, add below Apache POI dependencies.
 
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.10-FINAL</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.10-FINAL</version>
</dependency>
Current version of Apache POI is 3.10-FINAL. If you are having standalone java application, include jars from below image.
 
 
Apache POI Jars, Apache POI, Apache POI example, apache poi tutorial
 
Apache POI Example – Read Excel File
 
Let’s say we have an excel file “Sample.xlsx” with two sheets and having data like below image. We want to read the excel file and create the list of Countries. Sheet1 has some additional data, that we will ignore while parsing it.
 
Java Read Excel File, Apache POI, Apache POI Example, Apache POI tutorial
 
 
Java Read Excel File, Apache POI, Apache POI Example, Apache POI tutorial
 
Our Country java bean code is:
 
Country.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 example program to read excel file to the list of countries looks like below.
 
ReadExcelFileToList.java
 
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<Country> readExcelData(String fileName) {
List<Country> countriesList = new ArrayList<Country>();
 
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<Row> 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<Cell> 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<Country> list = readExcelData("Sample.xlsx");
System.out.println("Country List\n"+list);
}
 
}
The program is very easy to understand and contains following steps:
 
 
Create Workbook instance based on the file type. XSSFWorkbook for xlsx format and HSSFWorkbook for xls format. Notice that we could have created a wrapper class with factory pattern to get the workbook instance based on the file name.
Use workbook getNumberOfSheets() to get the number of sheets and then use for loop to parse each of the sheets. Get the Sheet instance using getSheetAt(int i) method.
Get Row iterator and then Cell iterator to get the Cell object. Apache POI is using iterator pattern here.
Use switch-case to read the type of Cell and the process it accordingly.
Now when we run above Apache POI example program, it produces following output on console.
 
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]
Apache POI Example – Write Excel File
 
Writing excel file in apache POI is similar to reading, except that here we first create the workbook. Then set sheets, rows and cells values and use FileOutputStream to write it to file. Let’s write a simple apache POI example where we will use list of countries from the above method to save into another file in a single sheet.
 
WriteListToExcelFile.java
 
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<Country> 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<Country> 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<Country> list = ReadExcelFileToList.readExcelData("Sample.xlsx");
WriteListToExcelFile.writeCountryListToFile("Countries.xls", list);
}
}
When I execute above apache POI example program, the excel file generated looks like below image.
 
Java Write Excel File, Apache POI, Apache POI Example, Apache POI tutorial
 
Apache POI Example – Read Excel Formula
 
Sometimes we need to handle complex excel files with formulas, let’s see a simple apache POI example to read the formula of a cell with it’s value.
 
Java Excel Read Formula, Apache POI, Apache POI Example, Apache POI tutorial
 
ReadExcelFormula.java
 
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<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext()) 
        {
Row row = rowIterator.next();
Iterator<Cell> 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");
}
}
When we execute above apache poi example program, we get following output.
 
1.0
2.0
3.0
4.0
Cell Formula=A1*A2*A3*A4
Cell Formula Result Type=0
Formula Value=24.0
Apache POI Example – Excel Write Formula
 
Sometimes, we need to do some calculations and then write the cell values. We can use the excel formulas to do this calculation and that will make it more accurate because values will change if the cell values used in calculations are changed.
 
Let’s see a simple example to write excel file with formulas using apache poi api.
 
WriteExcelWithFormula.java
 
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");
}
}
The excel file produced with above Apache POI API example program looks like below image.
 
java write excel formula, apache poi, apache poi tutorial, apache poi example
 
That’s all on Apache POI tutorial for working with excel files, look into Apache POI classes methods to learn more features of it.
 
References: Apache POI Developers Guide

转:Apache POI Tutorial的更多相关文章

  1. Read / Write Excel file in Java using Apache POI

    Read / Write Excel file in Java using Apache POI 2014-04-18 BY DINESH LEAVE A COMMENT About a year o ...

  2. 简单使用Apache POI

    Apache POI是一个纯Java编写用来操作Microsoft Office的框架,最常见的应用是让服务器后台按照特定的数据生成Excel表格提供给用户实用.前段时间因为项目的需要被大量使用,使用 ...

  3. 使用maven引入Apache poi jar包

    maven构建的项目-->pom.xml文件 eclipse提供Dependencies直接添加依赖jar包的工具:直接搜索poi以及poi-ooxml即可,maven会自动依赖需要的jar包: ...

  4. apache poi导出excel报表

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.POI为"P ...

  5. Apache POI 实现对 Excel 文件读写

    1. Apache POI 简介 Apache POI是Apache软件基金会的开放源码函式库. 提供API给Java应用程序对Microsoft Office格式档案读和写的功能. 老外起名字总是很 ...

  6. APACHE POI教程 --java应用程序用POI与Excel交互

    POI报表 --用POI与Excel交互 AURISOFT 第一章 POI简介 --Jakata Poi HSSF:纯java的Excel解决方案 在我们实际的开发中,表现层的解决方案虽然有多样,但是 ...

  7. apache poi 生成excel

    ExcelBuilder.Java package com.coracle.yk.xmanager.util.poi; import com.coracle.yk.xframework.util.Bl ...

  8. weblogic 12c下jxls导出excel报错Could not initialize class org.apache.poi.xssf.usermodel.XSSFVMLDrawing

    周一,开发反馈weblogic 12c下jxls导出excel报错,公司环境和UAT环境均报错,看日志如下: 2016-06-08 09:16:55,825 ERROR org.jxls.util.T ...

  9. [转]How to insert a row between two rows in an existing excel with HSSF (Apache POI)

    本文转自:http://stackoverflow.com/questions/5785724/how-to-insert-a-row-between-two-rows-in-an-existing- ...

随机推荐

  1. 用GitLab搭建自己的私有GitHub

    相信很多技术人员都知道有个github造福开发人员的git(分布式版本管理工具)代码管理社区,可以说现在git是开发人员的必备技能之一 本周有个朋友公司需要一个类似github的代码仓库管理系统,本人 ...

  2. Linq分组功能

    Linq在集合操作上很方便,很多语法都借鉴自sql,但linq的分组却与sql有一定的区别,故整理发布如下. 1.  Linq分组 分组后以Key属性访问分组键值. 每一组为一个IEnumberAbl ...

  3. php--mongodb的安装

    1.mongodb 安装 2.mongodb 扩展 http://pecl.php.net/package/mongo/1.6.14/windows

  4. mysql基本sql语句大全(提升用语篇)

    1.说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 法一:select * into b from a where 1<>1(仅用于SQlServer) 法二:s ...

  5. self.nsme 和 _name 的问题

    .h文件 @interface myclass:NSObject @property(nonatomic,retain)NSArray*MyArray; @end .m文件 @implementati ...

  6. Linux: 20 Iptables Examples For New SysAdmins

    Linux comes with a host based firewall called Netfilter. According to the official project site: net ...

  7. Asp.net MVC4 网站发布

    1.打开你的VS2012网站项目,右键点击项目-->发布: 2.弹出网站发布设置面板,点击<新建..>创建新的发布配置文件: 3.输入配置文件名称:(名称随便) 3.在发布方法中选“ ...

  8. asp.net mvc视图中嵌套分部视图

    asp.net mvc中Layout相当于webForm中母版页,分部视图相当于webForm中的用户控件. 下面例子是一个视图如何嵌套分部视图: A是分部视图,B是一般视图(A,B中的代码省略) 我 ...

  9. OpenGl的glMatrixMode()函数理解

    glMatrixMode()函数的参数,这个函数其实就是对接下来要做什么进行一下声明,也就是在要做下一步之前告诉计算机我要对“什么”进行操作了,这个“什么”在glMatrixMode的“()”里的选项 ...

  10. MOGRE学习笔记(2) - MOGRE基础知识总结

    前一篇配置了MOGRE的运行环境,这里记录一些MOGRE基础知识,仅仅是最基础的一些东西.由于本人接触ogre的时间比较短,对于很多知识都是一知半解,所以理解起来不免会有一些错误,本人也希望自己在对o ...