最近使用了POI来操作Excel表格,查阅了一些资料,总结一下怎样使用POI来操作Excel,并设置Excel的样式,使用的版本是3.10.1
Apache POI简介:
POI全称 Poor Obfuscation Implementation,直译为“可怜的模糊实现”。是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推。行则使用数字表示,例如;A3 表示第三行第一列,E5表示第五行第五列。poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel。
·工作簿 workbook
--sheet 工作表,一个workbook可以用多个sheet
--cell 单元格 一个sheet中包含的是cell,cell由行和列组成
在POI包中有如下几个主要对象和excel的几个对象对应:
HSSFWorkbook |
Excel 工作簿workbook |
HSSFSheet |
Excel 工作表 sheet |
HSSFRow |
Excel 行 |
HSSFCell |
Excel 单元格 |
我们可以利用以上几个对象,来完成对Excel表格的操作。
创建一个工作簿并向单元格中写入Hello POI:
//1、创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//创建工作表
HSSFSheet sheet = workbook.createSheet("sheet1");
//创建行,行号作为参数传给createdRow方法,第一行从0开始计算
HSSFRow row = sheet.createdRow(1);
//创建单元格,第一列从0开始计算
HSSFCell cell = row.createCell(1);
//设置单元格的值即B2的值
cell.setValue("Hello POI");
//创建输出流,将文件输出
FileOutputStream out = new FileOutputStream(D:\\test\\工作簿.xsl);
workbook.write(out);
out.close();
//读取excel文件
FileInputStream in = new FileInputStream();
//将输入流转换为workbook对象
HSSFWorkbook workbook = new HSSFWorkbook(in);
//获取工作表
HSSFSheet sheet = workbook.getSheetAt(0);
//获取行
HSSFRow row = sheet.getRow(1);
//读取单元格
HSSFCell cell = row.getCell(1);
//得到单元格的内容
String value = cell.getStringCellValue();
//打印到控制台
System.out.println("B2的单元格内容为:"+value);
到此就可以简单的对Excel进行写和读的操作。
遍历列和单元格:
很多时候我们操作Excel是对sheet页中所有的列和单元格进行遍历,这可以用一个for循环来实现。
幸运的是Row对象定义了一个CellIterator内部类用来处理单元格的遍历,可以通过row.cellIterator()来获得Iterator对象。
另外,Sheet 对象提供了一个 rowIterator()方法对所有列进行遍历;Sheet 和 Row 对象都实现了 java.lang.Iterable 接口,
因此如果您用的是 Java 1.5 及以上版本,您可以简单的调用内置的“foreach”来实现。
Sheet sheet = wrokboook.getSheetAt(0);
for (Iterator rit = sheet.rowIterator(); rit.hasNext(); )
{
Row row = rit.next();
for (Iterator cit = row.cellIterator();
cit.hasNext(); ) {
Cell cell = cit.next();
// Do something here
}
//或者用增强for循环来遍历:
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
// Do something here
}
}
//以上两种是查阅资料的,也可以用最简单的for循环开遍历
Sheet sheet = workbook.getSheetAt(0);
if(sheet.getPhysicalNumberOfRows() > 0){
for(int k = 2; k < sheet.getPhysicalNumberOfRows(); k++){
// 写入或读取数据
}
} |
格式化单元格:
CellRangeAddress cellRangeAddress = new CellRangeAddress(1, 1, 1, 4);
//加载合并单元格对象
sheet.addMergedRegion(cellRangeAddress);
设置单元格样式:
首先要设置单元格样式则要先初始化POI中的单元格样式对象HSSFCellStyle,然后在样式对象中设置不同的样式
(内容位置、字体、背景、颜色、边框等)。单元格样式是由工作簿workbook创建的,一个工作簿可以创建多个样式。
HSSFCellStyle style = workbook.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
//创建字体
HSSFFont font = workbook.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗字体
font.setFontHeightInPoints(fontSize);
//加载字体
style.setFont(font);
//传入单元格
cell.setCellStyle(style);
在应用到项目的饿时候,我们需要将数据写入Excel表格,或者从Excel表格中读取数据,也就是导入和导出功能;当导出数据的时候,用户需要把Excel表格下载下来。
在输出excel时,要设定要好respone的头部ContentType为application/octet-stream或者application/x-excel,Header的Content-Disposition要正确设置下载文件名称编码,以便可以在各大浏览器中都能够正确输出中文的下载文件名称。
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("application/x-execl");
response.setHeader("Content-Disposition", "attachment;filename=" + new String("数据表格.xls".getBytes(), "ISO-8859-1"));