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最好是静态的,因为静态的才可以把所有的操作保存下来
  • 在应用退出之前,记得用ExcelWritermyBook写到磁盘上

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()读取的时候就会报错