CRM-POI基础
它是用来干什么的
JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI 。jxl 只能操作Excel 95, 97, 2000,即以.xls为后缀的excel。
而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel。
POI全称 Poor Obfuscation Implementation,直译为“可怜的模糊实现”,利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能。
即它是用来操作Excel的。
Excel简介
若想知道POI如何操作Excel,首先必须得对Excel的格式有所了解。
一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,
这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推。
行则使用数字表示,例如;A3 表示第三行第一列,E5表示第五行第五列。
POI的使用
1)jar包的引入
以3.10.1版本为例。
对于只操作2003 及以前版本的excel,只需要poi-3.10.1-20140818.jar ,
如果需要同时对2007及以后版本进行操作则需要另外添加:
poi-ooxml-3.10.1-20140818.jar,
poi-ooxml-schemas-3.10.1-20140818.jar,
以及在ooxml-lib目录下的xmlbeans-2.6.0.jar,dom4j-1.6.1.jar。
2)简单操作实例
对.xls的Excel的操作:
@Test
public void testWrite03Excel() throws Exception {
//1、创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//2、创建工作表
HSSFSheet sheet = workbook.createSheet("hello world");//指定工作表名
//3、创建行;创建第3行
HSSFRow row = sheet.createRow(2);
//4、创建单元格;创建第3行第3列
HSSFCell cell = row.createCell(2);
cell.setCellValue("Hello World");
//输出到硬盘
FileOutputStream outputStream = new FileOutputStream("D:\\itcast\\测试.xls");
//把excel输出到具体的地址
workbook.write(outputStream);
workbook.close();
outputStream.close();
}
@Test
public void testRead03Excel() throws Exception {
FileInputStream inputStream = new FileInputStream("D:\\itcast\\测试.xls");
//1、读取工作簿
HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
//2、读取第一个工作表
HSSFSheet sheet = workbook.getSheetAt(0);
//3、读取行;读取第3行
HSSFRow row = sheet.getRow(2);
//4、读取单元格;读取第3行第3列
HSSFCell cell = row.getCell(2);
System.out.println("第3行第3列单元格的内容为:" + cell.getStringCellValue());
workbook.close();
inputStream.close();
}
而对于.xlsx只是使用的对象稍有不同,步骤相同。(原来各对象的开头字母H变为X)
从上面的代码可以看出,POI中对象与Excel的对应关系为:
HSSFWorkbook Excel 工作簿workbook
HSSFSheet Excel 工作表 sheet
HSSFRow Excel 行
HSSFCell Excel 单元格
统一对03和07版的Excel的操作
从api文档中我们了解到:
HSSFWorkbook 和 XSSFWorkbook 都实现了Workbook接口;
HSSFSheet 和 XSSFSheet 实现了Sheet接口;
HSSFRow 和 XSSFRow 实现了Row接口;
HSSFCell 和 XSSFCell 实现了Cell接口;
因为这两类处理对象共同实现了对应的同一接口,届时将大大方便和简化了同时处理不同格式的excel文件的编码工作。
如;在处理03和07版本的excel文件时利用统一的接口就可以做到分析两个版本的excel数据。
同时兼容对03和07的对操作:
@Test
public void testRead03And07Excel() throws Exception {
String fileName = "D:\\itcast\\测试.xlsx";
if(fileName.matches("^.+\\.(?i)((xls)|(xlsx))$")){//判断是否excel文档
boolean is03Excel = fileName.matches("^.+\\.(?i)(xls)$");
FileInputStream inputStream = new FileInputStream(fileName);
//1、读取工作簿
Workbook workbook = is03Excel ?new HSSFWorkbook(inputStream):new XSSFWorkbook(inputStream);
//2、读取第一个工作表
Sheet sheet = workbook.getSheetAt(0);
//3、读取行;读取第3行
Row row = sheet.getRow(2);
//4、读取单元格;读取第3行第3列
Cell cell = row.getCell(2);
System.out.println("第3行第3列单元格的内容为:" + cell.getStringCellValue());
workbook.close();
inputStream.close();
}
}
POI样式
上面只是简单的解决了,利用POI向Excel的读和写。可是我们的需求可不简简单单是这些。
我们可能还希望在操作Excel是可以增加Excel文档的样式,比如合并单元格、设置单元格字体、边框,背景颜色等。
合并单元格
在POI中有一个CellRangeAddress对象,中文直译是 单元格范围地址,主要用于在单元格的合并上,
这个对象的构造方法CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) 有4个参数,
分别表示(起始行号,终止行号, 起始列号,终止列号), 设置这个对象中要合并的单元格范围后,
工作表对象sheet调用方法addMergedRegion(CellRangeAddress region) ,将上述设置的CellRangeAddress对象作为参数传入即可合并单元格。
NT:当我们合并完单元格后,其它被合并的单元格已经无效了,不能对无效单元格设置值。如果进行了设置将不显示。
设置单元格样式
首先要设置单元格样式则要先初始化POI中的单元格样式对象HSSFCellStyle,
然后在样式对象中设置不同的样式(内容位置、字体、背景、颜色、边框等)。单元格样式是由工作簿workbook创建的,一个工作簿可以创建多个样式。
设置单元格内容位置:
设置水平位置 setAlignment(short align) ,
设置垂直位置 setVerticalAlignment(short align)
设置单元格字体:
POI中的字体对象为HSSFFont,字体是由工作簿创建,可以用于多个单元格上。(要加载在样式上才能作用于单元格)
设置单元格背景色:
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); //设置背景填充模式
style.setFillBackgroundColor(HSSFColor.YELLOW.index); //设置填充背景色
style.setFillForegroundColor(HSSFColor.RED.index); //设置填充前景色
测试一下:
@Test
public void testExcelStyle() throws Exception {
//1、创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//1.1、创建合并单元格对象;合并第3行的第3列到第5列
CellRangeAddress cellRangeAddress = new CellRangeAddress(2, 2, 2, 4);//起始行号,结束行号,起始列号,结束列号
//1.2、创建单元格样式
HSSFCellStyle style = workbook.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
//1.3、创建字体
HSSFFont font = workbook.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗字体
font.setFontHeightInPoints((short) 16);//设置字体大小
//加载字体
style.setFont(font);
//单元格背景
//设置背景填充模式
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//设置填充背景色
style.setFillBackgroundColor(HSSFColor.YELLOW.index);
//设置填充前景色
style.setFillForegroundColor(HSSFColor.RED.index);
//2、创建工作表
HSSFSheet sheet = workbook.createSheet("Hello World");//指定工作表名
//2.1、加载合并单元格对象
sheet.addMergedRegion(cellRangeAddress); //合并后成为的单元格为C2
//3、创建行;创建第3行
HSSFRow row = sheet.createRow(2);
//4、创建单元格;创建第3行第3列
HSSFCell cell = row.createCell(2);
//加载样式
cell.setCellStyle(style);
cell.setCellValue("Hello World!");
//输出到硬盘
FileOutputStream outputStream = new FileOutputStream("D:\\itcast\\测试.xls");
//把excel输出到具体的地址
workbook.write(outputStream);
workbook.close();
outputStream.close();
}