序言
上篇序言已经说明了我为什么要写这个教程了,如果想知道请戳这个链接:序言。那么废话就不多说开始吧。
POI Maven 依赖
POI官网:http://poi.apache.org/,我当前使用的版本是3.15。Maven依赖如下:
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
</dependencies>
POI读取Office2007以上版本的xlsx文件
实例代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
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.ss.usermodel.WorkbookFactory;
public class WorkbookExample {
/**
* 原始Excel模板地址
*/
private static String path = "D:/eclipse/workspace/example/resourcew/static/Example1.xlsx";
/**
* 导出的Excel模板地址
*/
private static String export = "D:/eclipse/workspace/example/resourcew/static/Example1-export.xlsx";
public static void main(String[] args) throws Exception {
//读入文件流
InputStream inputStream = new FileInputStream(new File(path));
//创建Excel对象
Workbook wb = WorkbookFactory.create(inputStream);
//一般Excel都会有一个默认的sheet,所以直接获取第一个sheet
Sheet sheet = wb.getSheetAt(0);
//创建第一行
Row row = sheet.createRow(0);
//设置A1的值
row.createCell(0).setCellValue("A1");
//输出文件
FileOutputStream out = new FileOutputStream(export);
wb.write(out);
System.out.println("----------------输出成功");
}
}
可见输出的文件:
打开之后可见A1的值为A1:
POI读取Office2007以下版本的xls文件
POI读取2007版本以下的Excel即可以使用Workbook类,也可以使用HSSFWorkbook类。但是注意,HSSFWorkbook不能读取*.xlsx后缀的文件,因为不兼容。
HSSFWorkbook实例代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
public class HSSFWorkbookExample {
/**
* 原始Excel模板地址
*/
private static String path = "D:/eclipse/workspace/example/resourcew/static/Example2.xls";
/**
* 导出的Excel模板地址
*/
private static String export = "D:/eclipse/workspace/example/resourcew/static/Example12-export.xls";
public static void main(String[] args) throws Exception {
//读入文件流
InputStream inputStream = new FileInputStream(new File(path));
//创建Excel对象
HSSFWorkbook wb = new HSSFWorkbook(inputStream);
//一般Excel都会有一个默认的sheet,所以直接获取第一个sheet
Sheet sheet = wb.getSheetAt(0);
//创建第一行
Row row = sheet.createRow(0);
//设置A1的值
row.createCell(0).setCellValue("A1");
//输出文件
FileOutputStream out = new FileOutputStream(export);
wb.write(out);
System.out.println("----------------输出成功");
}
}
运行后输出文件:
打开后可见输出结果:
如果HSSFWorkbook读取Excel2007版本以上的文件就会导致报错:
Exception in thread "main" org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:152)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:140)
at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:302)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:398)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:379)
at com.poi.example.HSSFWorkbookExample.main(HSSFWorkbookExample.java:27)
单元格合并
在POI的设定之中是需要先定义好合并单元格再创建行的。实例如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
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.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;
public class WorkbookExample2 {
/**
* 原始Excel模板地址
*/
private static String path = "D:/eclipse/workspace/example/resourcew/static/Example1.xlsx";
/**
* 导出的Excel模板地址
*/
private static String export = "D:/eclipse/workspace/example/resourcew/static/Example1-export.xlsx";
public static void main(String[] args) throws Exception {
//读入文件流
InputStream inputStream = new FileInputStream(new File(path));
//创建Excel对象
Workbook wb = WorkbookFactory.create(inputStream);
//一般Excel都会有一个默认的sheet,所以直接获取第一个sheet
Sheet sheet = wb.getSheetAt(0);
/*
* 这里 第一个参数是起始行,第二个参数是结束行。
* 第三个参数是起始列,第四个参数是结束列
* 本例中的含义是A1和A2合并
*
* */
sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0));
//创建第一行
Row row = sheet.createRow(0);
//设置A1的值
row.createCell(0).setCellValue("A1");
//输出文件
FileOutputStream out = new FileOutputStream(export);
wb.write(out);
System.out.println("----------------输出成功");
}
}
输出结果如下:
数据格式
数据格式网上有许多正确实例代码来说明各种数据类型是如何格式化的。此处只是提及一下如何引入格式化。实例代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataFormat;
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.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;
public class WorkbookExample3 {
/**
* 原始Excel模板地址
*/
private static String path = "D:/eclipse/workspace/example/resourcew/static/Example1.xlsx";
/**
* 导出的Excel模板地址
*/
private static String export = "D:/eclipse/workspace/example/resourcew/static/Example1-export.xlsx";
public static void main(String[] args) throws Exception {
//读入文件流
InputStream inputStream = new FileInputStream(new File(path));
//创建Excel对象
Workbook wb = WorkbookFactory.create(inputStream);
//一般Excel都会有一个默认的sheet,所以直接获取第一个sheet
Sheet sheet = wb.getSheetAt(0);
/*
* 这里 第一个参数是起始行,第二个参数是结束行。
* 第三个参数是起始列,第四个参数是结束列
* 本例中的含义是A1和A2合并
*
* */
sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0));
//创建第一行
Row row = sheet.createRow(0);
//设置A1的值
row.createCell(0).setCellValue(100.22222222222222222d);
//设置数据类型
//setCellType(0)是一个过时的方法,并不建议使用
//row.getCell(0).setCellType(0);
//设置保留2位小数
row.getCell(0).setCellType(CellType.NUMERIC);
//设置保留小数位
DataFormat format = wb.createDataFormat();
CellStyle style = wb.createCellStyle();
style.setDataFormat(format.getFormat("0.00"));
row.getCell(0).setCellStyle(style);
//输出文件
FileOutputStream out = new FileOutputStream(export);
wb.write(out);
System.out.println("----------------输出成功");
}
}
输出结果:
结束语
本篇文章先介绍到这里,后续的具体样式调整下一个篇幅再更新。