1.POI 简介(摘自百度百科)
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“可怜的模糊实现”。
Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008)。
2.POI结构(摘自百度百科)
HSSF - 提供读写Microsoft Excel XLS格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
HWPF - 提供读写Microsoft Word DOC格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读Microsoft Visio格式档案的功能。
HPBF - 提供读Microsoft Publisher格式档案的功能。
HSMF - 提供读Microsoft Outlook格式档案的功能。
3.一个Sheet对应一个Model
一份设计良好的Excel文档,每个Sheet对应着对一个任务,一个工作等的一个抽象,这与Java对象的功能不谋而合。所以一份设计良好的Excel文档,一个Sheet对应一个Java的Model。如下面的学成信息表1和迟到记录统计表2都都是做了很好的抽象的类。
良好的Excel文档特征总结:
- 每个sheet都有自己的名称
- 每个sheet的第一行是标题行
- 中间不要用空行或者空列
e.g.:
学生信息表1
姓名 | 班级 | 性别 | 年龄 |
小红 | 一班 | 女 | 12 |
小宝 | 二班 | 女 | 11 |
小白 | 三班 | 女 | 10 |
小黑 | 二班 | 女 | 11 |
迟到记录表2
日期 | 姓名 | 是否迟到 | 迟到原因 |
2014/5/29 | 小红 | 否 | |
2014/5/29 | 小黑 | 否 | |
2014/5/29 | 小宝 | 否 | |
2014/5/29 | 小白 | 否 |
代码块1
public class Student { private String name; private String classInfo; get...set }
代码块2
public class LaterRecode { private String Date; private String stuName; get...set }
4.ExcelReader/ExcelWriter/ExcelCheck/ExcelRemark
读取一个Excel到XSSFWorkbook实例中之后,对其进行注解,更改之后,想要把修改的内容保存下来,就需要把XSSFWorkbook在重新按原路径写回去,这叫保存,写到一个新的路径中,这叫另存为。
ExcelReader: 打开一个Excel文件,并将其保存在一个Workbook实例中,.xlsx 文件保存在XSSFWorkbook的实例中,.xls的文件,保存在HSSFWorkbook的实例中。这个实例暂且叫名字myBook。
- myBook最好是一个全局的,因为要对Excel做的任何操作都得和myBook挂钩,比如新建一个单元格格式,CellStyle cellstyle = myBook.createCellStyle();
- myBook最好是静态的,因为静态的才可以把所有的操作保存下来
- 在应用退出之前,记得用ExcelWriter把myBook写到磁盘上
ExcelCheck的作用是对Excel做格式校验
ExcelRemark是对Excel做格式更改,比如修改用底色标注单元格,添加批注等
5.息息相关的Workbook
Excel的操作中,出了Row,Cell是和Sheet相关的,其他的批注,样式等,都只能通过workbook的CreationHelper产生,与workbook关联。
e.g.:对Excel的单元格添加一个new出来的CellStyle时就会跑出异常,下面的代码创建的CellStyle则可以随意的添加到此workbook对应的任意单元格上
public static CellStyle cellstyle = null; public static CreationHelper helper = null; public static XSSFSheet currentSheet = null; public static void initStatic(XSSFWorkbook workbook) { helper = workbook.getCreationHelper(); cellstyle = workbook.createCellStyle(); cellstyle.setFillPattern(XSSFCellStyle.BORDER_THIN); cellstyle.setFillForegroundColor(IndexedColors.PINK.getIndex()); }
6.一些注意点
- Excel的空格和空行,Excel中看着空的空行不一定是空的,Excel看着空的单元格也不一定是空的。所以通过sheet.getLastRowNum()是没法判定Excel内容的结尾的。
int firstRowNumber = sheet.getFirstRowNum(); for(int i = firstRowNumber+1;;i++) { row = sheet.getRow(i); if(row == null || row.getCell(0) == null) //到最后一行了 { } }
- Excel单元格内容的读取与Excel编辑的时候单元格属性的设置息息相关,比如在一个Cell中输入100,但是将属性设置为了文本,用cell.getNumericCellValue()读取的时候就会报错