辰风君的笔记本

Cwind’s Technical Notes

Java读写Excel:Apache POI, JXL与OpenCSV

| Comments

前些日子把JXL替换为ApachePOI,原因很简单,JXL在2009年10月已经停止更新,并且不支持Excel 2007 OOXML (.xlsx)格式的文件。事实上把JXL与POI进行比较并不公平,因为JXL只能够操作OLE2格式的Excel(即.xls),而POI则是能够读写xls(x)、doc(x)、ppt(x)的一整套解决方案。

不同版本Excel的行列数限制:

   
+-----------------+-----------+--------------+---------------------+
|                 | Max. Rows | Max. Columns | Max. Cols by letter |
+-----------------+-----------+--------------+---------------------+
| Excel 365*      | 1,048,576 | 16,384       | XFD                 |
| Excel 2013      | 1,048,576 | 16,384       | XFD                 |
| Excel 2010      | 1,048,576 | 16,384       | XFD                 |
| Excel 2007      | 1,048,576 | 16,384       | XFD                 |
| Excel 2003      | 65,536    | 256          | IV                  |
| Excel 2002 (XP) | 65,536    | 256          | IV                  |
| Excel 2000      | 65,536    | 256          | IV                  |
| Excel 97        | 65,536    | 256          | IV                  |
| Excel 95        | 16,384    | 256          | IV                  |
| Excel 5         | 16,384    | 256          | IV                  |
+-----------------+-----------+--------------+---------------------+  

*Excel 365 unverified.

JXL - JExcelApi
Maven Repo
官方网站
最近更新:Oct 24,2009

   
<dependency>
 <groupId>net.sourceforge.jexcelapi</groupId>
 <artifactId>jxl</artifactId>
 <version>2.6.12</version>
</dependency>

JXL是一个日本人写的简单类库。作者主页POI和jxl.jar性能比较一贴中提到其性能较poi更高,内存消耗更少。当且仅当目标文档是行数接近但不超过65536的xls格式时成立。

类图:

JXL Demolink
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   
 public static void main(String[] args) {
  try {
   // create writable wookbook
   WritableWorkbook workbook 
    = Workbook.createWorkbook(new File("jxlOutput.xls"));
   
   // create writable sheet
   WritableSheet sheet = workbook.createSheet("First Sheet", 0);
   for(int i = 0; i < data.length; i++) {
    for(int j = 0; j < data[i].length; j++){
     
     // create a cell at position (i, j) and add to the sheet
     Label label = new Label(i, j, data[i][j]);
     sheet.addCell(label);
    }
   }
   workbook.write();
   workbook.close();
  } catch (IOException | WriteException e) {
   e.printStackTrace();
  }
 }

Apache POI
Maven Repo
官方网站
最近更新:Dec 17,2014

类图:

   
<dependency> 
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>3.10.1</version>
</dependency> 
 
 <dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-ooxml</artifactId>
     <version>3.9</version>
 </dependency>

Apache POI API的一些重点:

  • Apache POI包含 Excel 97(-2007)文件格式(.xls)的Java实现 – HSSF。(彩蛋:H指Horrible)
  • Apache POI包含 Excel 2007 OOXML文件格式(.xlsx)的Java实现 – XSSF。
  • Apache POI的HSSF和XSSF API提供了读写和修改Excel电子表格的功能。
  • Apache POI也提供了SXSSF API(流式XSSF),它是XSSF的扩展,用于写入非常大的excel文件。SXSSF API需求较小的内存,适用于在堆内存受限时处理较大excel文件的情况。
  • 可以选择两种模型:Event Model和User Model。Event Model需求较小的内存,流式读取并处理每个单元;User Model更具备面向对象的特征,方便操作。
  • Apache POI提供了对excel附加功能的完美支持,如公式、单元格样式、颜色、字体、数据验证、图像和超链接等。

SpreadSheet API 功能摘要:

以下是两个基于XSSF读写xlsx文件的例子:
读取xlsx文件
写入xlsx文件

OpenCSV:
CSV文件以纯文本形式存储表格数据(数字和文本)。OpenCSV是一个用于读写CSV文件的简单Java类库。
Maven Repo
官方网站
最近更新:Jul 28,2011

  
<dependency>
 <groupId>net.sf.opencsv</groupId>
 <artifactId>opencsv</artifactId>
 <version>2.3</version>
</dependency>

OpenCSV将CSV文件中的每一行读取为一个String数组。相应地,写文件时通过csvWriter.writeNext(array)把String数组内容作为一行写入CSV文件

读写CSV文件的例子:
读取csv文件内容
将xlsx文件内容写入csv

References:
1. POI-HSSF and POI-XSSF - Java API To Access Microsoft Excel Format Files
2. Java Read/Write Excel File using Apache POI API

Comments