POI操作Excel知识点总结

最近使用了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();

这样我们就向D盘的test文件夹下输出了一个Excel表格。

再次利用上面的对象可以将Hello POI读取:

//读取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<Row> rit = sheet.rowIterator(); rit.hasNext(); )
{
    Row row = rit.next();
    for  (Iterator<Cell>  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++){
        // 写入或读取数据
    }
}
格式化单元格:

在POI中可以利用格式化对象来格式化excel文档;也即设置excel内容的样式。POI中主要的格式化对象常用的有合并单元格、设置单元格字体、边框,背景颜色等。

合并单元格:

在POI中有一个CellRangeAddress对象,中文直译是 单元格范围地址,主要用于在单元格的合并上,这个对象的构造方法CellRangeAddress(int firstRow,int lastRow, int firstCol, int lastCol) 有4个参数,分别表示(起始行号,终止行号,起始列号,终止列号), 设置这个对象中要合并的单元格范围后,工作表对象sheet调用方法addMergedRegion(CellRangeAddress region) ,将上述设置的CellRangeAddress对象作为参数传入即可合并单元格。

CellRangeAddress cellRangeAddress = new CellRangeAddress(1, 1, 1, 4);

//加载合并单元格对象
sheet.addMergedRegion(cellRangeAddress);

【注意:上图中合并单元格后,单元格的名称是第一个单元格;即上面中合并了第二行的第二列到第五列,合并后的单元格叫B2,而其它被合并的单元格已经无效了,不能对无效单元格设置值。如果进行了设置将不显示。】


设置单元格样式:

首先要设置单元格样式则要先初始化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"));

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值