引言
在Web应用日益盛行的今天,通过Web来操作Excel文件的需求越来越强烈,目前较为流行的操作是创建CSV(comma separated values)文件,并将这个文件以MIME,TEXT/CSV类型返回给浏览器。这样只是说可以访问到Excel文件,但是还不能真正的操纵Excel文件。本文将介绍一种功能强大的报表技术——POI,用它可以方便地操作Excel文件。
POI介绍
Apache POI是Apache软件基金会的开放源码函式库,是用Java编写的免费开源的跨平台的 Java API,POI提供API给Java程序对Microsoft Office格式档案进行各种操作。
POI主要用到的类有HSSFWorkbook、HSSFSheet、HSSHRow、HSSFCell,HSSFWorkbook是Excel文件对象、HSSFSheet是Excel文件内的分页sheet对象、HSSHRow是行对象、HSSFCell是单元格对象,它们都在org.apache.poi.hssf.usermodel这个package里面。
下面结合以上提及的四个类,介绍下POI对Excel文件的四个基本操作。
读操作
首先HSSFWorkbook要获取到文件的流,如HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(new File(“f:\\xx.xls”)));
然后通过wb对象对xx.xls Excel文件进行操作。
HSSFSheet是获取Excel的sheet分页,有两种方式可以获取sheet分页对象:
1.按分页名称来获取 wb.getsheet(“Name”);
2.按分页顺序来获取 wb.getsheet(0);
HSSHRow获取行对象,HSSHRow row = sheet.getRow(0);Excel文件行数是从0开始。最后获取到单元格对象HSSFCell cell = row.getCell(index);index是列数,也是从0开始。
HSSFCell通过cell.getCellType()获取单元格类型,有三种类型,0表示数字、1表示文本、2表示存入了公式,并提供方法获取到想要的信息:获取字符串cell.getRichStringCellValue()、获取数值cell.getNumericCellValue()、获取公式cell.getCellFormula(),这里需要注意的是空格是属于文本格式。
写操作
POI对Excel的写操作与读操作用到的对象都是这么几个。不同的是读操作是获取对象,而写操作是创建对象。
首先创建HSSFSheet对象,HSSFSheet sheet = wb.createSheet(“Name”);然后创建行对象HSSHRow row = sheet.createRow(rownum),rownum是第几行、从0开始算;再创建单元格对象HSSFCell cell = row.createCell(colnum),colnum是列数,从0开始,再对单元格赋值,文本型用cell.setCellValue(new HSSFRichTextString(“”))、数值用cell.setCellValue(16);最后把wb写入到一个输出流中,wb.write(new FileOutputStream(new File(path))),就生成了一个Excel文件了。
上传
Web方式对Excel的操作还是用流来操作Excel,只不过是换了个方式。
首先,在客户端加个file标签;然后把form的传输方式改为enctype="multipart/form-data";再在Struts Action层加个File属性private File myFile,名称要与标签的name一致,否则获取不到。这样在方法里通过getMyFile()就可以获取到上传的Excel文件了。
下载
有上传自然有下载,当然也是跟流有关,只不过流是服务器端的输出流。
首先,获取到服务器端的输出流对象ServletOutputStream ,ServletOutputStream os = this.getResponse().getOutputStream();然后设置文件内容类型this.getResponse().setContentType("application/octet-stream"),再对文件命名this.getResponse().setHeader("Content-disposition", "attachment;filename=" + fileName+ ".xls");最后把wb对象写入到os流中,就会下载到客户端。
POI对Excel的高级操作
以上简单介绍了POI的四个基本操作,虽然已能满足一般的功能要求,但对内容有格式要求的操作来说,就需要用HSSFCellStyle、HSSFDataFormat、HSSFFont这三个类,它们用来对单元格格式/样式进行操作。
单元格样式
对单元格样式的操作包括两个部分:创建单元格样式对象、创建字体对象。
创建单元格样式对象:HSSFCellStyle style =wb.createCellStyle(),设置边框(上、下、左、右):style.setBorderTop((short) 1)、style.setBorderBottom((short) 1)、
style.setBorderLeft((short) 1)、style.setBorderRight((short) 1)。
在遇到合并单元格时,还要设置垂直居中,垂直:style.setVerticalAlignment
(HSSFCellStyle.VERTICAL_CENTER)、居中:style.setAlignment(HSSFCellStyle
.ALIGN_CENTER)。
创建字体对象HSSFFont font = wb.createFont(),一般会用到一下三个方法 ,setFontName()设置字体、setFontHeightInPoints()设置字号、setBoldweight
(HSSFFont.BOLDWEIGHT_BOLD)加粗,style.setFont(font)保存刚才新建的字体样式。
合并单元格
合并单元格需要CellRangeAddress这个类,新建合并单元格对象c = new CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol),保存到Excel文件中sheet.addMergedRegion(c)。合并单元格后的值为合并区域的第一行第一列的值。
写入公式
在做财务报表时,还需要往单元格里填公式,用得最多的公式就是求和。POI公式的写入首先要设置下单元格为公式类型,cell.setCellType(HSSFCell.
CELL_TYPE_FORMULA),然后写入公式表达式就OK了,cell.setCellFormula
(expression),如expression = "SUM(C"+(i+1)+":F"+(i+1)+")",写入表达式需要注意的是公式的开始行是1,而程序里读取的行是从0开始的,所以在写入公式时,要把当前行+1再写入。
单元格格式
在合计的结果比较大时,还要格式化下数据,转换为英文的数字格式xxx,xxx,xxx,这种的格式转换就要用到HSSFDataFormat类,HSSFDataFormat df = wb.createDataFormat(),设置格式style.setDataFormat(df.getFormat("#,##0.00"))。
一些常用的格式还有"0.00%"、"d-mmm-yy"、"h:mm:ss AM/PM"等。
总结
通过上面的描述,相信你对POI的功能已有一个大致的了解,可以在你以后如何去选择适合自己项目的报表API过程中起到一定的参考作用。
以上只是对POI的一个简单介绍,提到的知识点是本人在做人力资源系统中运用到的,POI还有很多的功能没有提到,这里只是想跟大家分享下本人对POI的一个使用心得,有用POI做过项目、对POI有过研究的同学可以私下和我交流,大家共同学习、共同进步。
(PS:以上介绍的POI API版本是poi-3.2.jar)