Apache
POI 工具包操作 Excel
测试用的版本是 3.16,目前版本最新为3.17。
2017年10月16日
大纲
- POI 工具包简介
- 导包
- 核心类
- 对象的创建
- 读取Excel数据
- 写出Excel文件
- 格式化Excel
style
#POI 工具包
JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI 。
- JXL 只能操作Excel 95、97、 2000也即以.xls为后缀的excel。
- POI 可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel。
#导包 点击下载 poi 3.16
- commons-collections4-4.1.jar
lib目录
- log4j-1.2.17.jar
lib目录
- poi-3.16.jar
- poi-ooxml-3.16.jar
- poi-ooxml-schemas-3.16.jar
- xmlbeans-2.6.0.jar
ooxml-lib目录
#核心类
每个接口都有两个实现类,分别用于 07前 HSS
版本和 07和07后 XSS
版本的操作,类名只是 H 和 X 的区别,下面不再赘述。
HSSFWorkbook 07前版本
.xls
XSSFWorkbook 07和07后版本.xlsx
- Workbook
接口
工作簿 - Sheet
接口
工作表 - Row
接口
行 - Cell
接口
单元格
#对象的创建
// 1. 创建工作簿对象
XSSFWorkbook workbook = new XSSFWorkbook();
// 2. 从工作簿对象创建工作表对象
XSSFSheet sheet = workbook.createSheet("成员表");
// 3. 从工作表对象创建行对象 从0开始
XSSFRow row = sheet.createRow(0);
// 4. 从行对象创建具体单元格对象 从0开始
XSSFCell cell = row.createCell(0);
#读取Excel数据
这里用的是接口而非类,WorkbookFactory.create()
工厂方法会识别文件版本返回相应的子对象。这样避免两个版本两份代码的问题。
public void readExel() throws IOException {
String fileName = "D:\\huangMP\\Desktop\\OutputExcelDemo.xls";
FileInputStream fileInputStream = new FileInputStream(fileName);
// 1. 创建工作簿
Workbook workbook = WorkbookFactory.create(fileInputStream);
// 2. 创建工作类
Sheet sheet = workbook.getSheetAt(0);
// 3. 创建行 , 第三行 注意:从0开始
Row row = sheet.getRow(2);
// 4. 创建单元格, 第三行第三列 注意:从0开始
Cell cell = row.getCell(2);
String cellString = getValue(cell);
System.out.println("第三行第三列的值为 : " + cellString );
workbook.close();
fileInputStream.close();
}
POI 需要按照数据类型获取数据,如果类型错误会抛异常,这里我们将表格数据全用String类型获取。
// 把单元格数据以字符串形式输出
private String getString(Cell cell) {
int cellType = cell.getCellType();
switch (cellType) {
case Cell.CELL_TYPE_STRING:
return cell.getStringCellValue();
case Cell.CELL_TYPE_BOOLEAN:
return cell.getBooleanCellValue() + "";
case Cell.CELL_TYPE_NUMERIC: {
// 为了美观 去掉数值类型末尾的.0
String value = cell.getNumericCellValue() + "";
return (value.charAt(value.length() - 2) == '.' ? value.substring(0, value.length() - 2) : value);
}
default:
return "";
}
}
#输出Excel文件
public void outputExcel() throws IOException {
// 1. 创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 2. 创建工作类
HSSFSheet sheet = workbook.createSheet("hello world");
// 3. 创建行 , 第三行 注意:从0开始
HSSFRow row = sheet.createRow(2);
// 4. 创建单元格, 第三行第三列 注意:从0开始
HSSFCell cell = row.createCell(2);
cell.setCellValue("Hello World");
String fileName = "D:\\huangMP\\Desktop\\OutputExcelDemo.xls";
FileOutputStream fileOutputSteam = new FileOutputStream(fileName);
workbook.write(fileOutputSteam);
workbook.close();
fileOutputSteam.close();
}
#格式化Excel style
##合并单元格
CellRanageAddress 类:单元格范围定义类
由 Sheet 类的 addMergedRegion()
方法添加进Excel。
// 合并单元格
/*
* 单元格范围对象
* 参1:起始行 0
* 参2:结束行 1
* 参3:起始列 0
* 参4:结束列 1
*/
CellRangeAddress address = new CellRangeAddress(0, 1, 0, 1);
sheet.addMergedRegion(address);
起始行和起始列得到左上点 0.0
结束行和结束列得到右下点 1.1
包括的范围就是单元格合并的范围
##设置单元格样式
XSSFCellStyle 类:单元格样式类
由XSSFWorkBook 类的 createCellStyle();方法得到
单元格居中
XSSFCellStyle cellStyle = workbook.createCellStyle();
// 水平居中
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
// 垂直居中
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
...
// 给单元格设置样式
cell.setCellStyle(cellStyle);
单元格字体
HSSFFont 类:字体类
由XSSFWorkBook 类的 createFont();方法得到
XSSFFont font = workbook.createFont();
// 粗体
font.setBold(true);
// 字体
font.setFontName("黑体");
// 字体大小
font.setFontHeight(12);
...
// 给单元格样式对象添加字体样式
cellStyle.setFont(font);
行高列宽
// 设置全局列宽
sheet.setDefaultColumnWidth(20 * 256);
// 设置全局行高
sheet.setDefaultRowHeightInPoints(30);
// 设置第 1 列的列宽
sheet.setColumnWidth(0, 20 * 256);
// 设置当前行的行高
row.setHeightInPoints(30);