如何读写Excel 电子表格

开源社区已经创造了许多开源Java项目,从制表软件到游戏框架到文字处理。在这篇文章中,我介绍一个可以读写微软Excel电子表格的开源类库项目。

推荐一个电子表格类库

问题:我以前被要求去扩展我们公司的以Java为基础的电子表格软件,实现读写Excel电子表格的功能。你能推荐给我一个可以帮助我完成这个任务的开源Java类库吗?

回答:你可以考虑一下JExcelAPI,它是一个成熟的、以Java为基础的可以让你实现读写和更改Excel电子表格功能的开源类库。这里有一些它的特点:

  • 可以从Excel 95, 97, 2000, XP, 和2003工作簿读取数据
  • 可以读写公式(只支持Excel 97和之后的版本)
  • 可以以Excel 2000的格式生成电子表格
  • 支持字体,数字,和日期的格式化
  • 支持单元格拆分,单元格合并,和单元格着色
  • 更改存在的工作表
  • 支持复制图表
  • 支持向电子表格插入或者复制图片

JExcelAPI 是Andrew Kahn开发的,并且在GNU 通用公共许可协议下发布。

下载JExcelAPI类库

问题:我如何下载JExcelAPI?

回答:完全遵循下面的步骤下载JExcelAPI:

1.使用浏览器打开JExcelAPI的主页。

2.点击 jexcelapi 这个链接。

3.在结果页,点击任意一个文件夹链接。例如,我点击了 2.6.12 这个链接。

4.在结果页,点击分发文档文件名。例如,我点击了 jexcelapi_2_6_12.zip 这个链接。

5.稍微等待一下之后,你的浏览器会弹出对话框提醒你去保存这个文件。继续点击去保存这个文件即可。

下载完成后,解压这个文件。你会发现一个 jexcelapi 主目录在jexcelapi_2_6_12 目录下面。

使用 JExcelAPI 类库

问题: JExcelAPI 类库包括一些例子程序吗 ?

回答:JExcelAPI 的 jexcelapi 主目录包含一个叫 jxl.jar 的文件,这个文件包含一些读写和复制电子表格的例子程序。这个读取的例子读取的是一个已经存在的电子表格,并且通过 -csv 或者 -xml 命令行选项转换它为逗号分隔值(CSV)或者XML格式的文档。参考一下下面的例子:

    java -jar jxl.jar -csv budget.xls
    java -jar jxl.jar -xml budget.xls

这些例子读取 budget.xls 文件而且以CSV和XML格式输出它的内容到标准输出流。当 -csv-xml 都没有被指定的时候,默认使用 -csv

这个写入的例子创建一个包含公式,边界,图片,和更多其他元素的电子表格样本。这个电子表格通过指定 -write 命令行参数生成,就像下面使用的那样:

    java -jar jxl.jar -write sample.xls

图片1展现了 sample.xls 电子表格文件部分结果。

图片1:我使用 LibreOffice Calc 去打开 sample.xls 电子表格

这个复制的例子复制了和 jxl.jar 存储在同一目录下的样本 jxlrwtest.xls 电子表格成为一个新的电子表格。在这个复制完成后的电子表格中,第一个工作薄(原始的)没有改变然而第二个工作薄(改变了的)包含了改变后的内容。

这个例子通过指定 -rw 命令行参数后面加上 jxlrwtest.xls 和输出电子表格的名称而产生。参考下面的命令行:

    java -jar jxl.jar -rw jxlrwtest.xls copy.xls

这个命令行复制 jxlrwtest.xlscopy.xls。图表2展现了第二部分(修改了的)工作簿在 LibreOffice Calc 下面。

图表2: 点击原始和修改的标签去观察原始和修改后的工作簿

为编译执行引入JExcelAPI

问题:当我编译源代码和运行一个应用的时候如何引入 JExcelAPI 。

回答:当编译源代码和运行一个应用的时候引入 JExcelAPI ,做下面的其中一件事情:

  • 添加 jexcelapi 主目录里面的 jxl.jar 文件到你的 CLASSPATH 环境变量中。
  • 通过 javacjava 命令的 -cp 选项引入 jxl.jar

JExcelAPI 编程

问题:我如何创建使用 JExcelAPI 的Java项目。

回答:这个 jexcelapi 主目录包含一个 tutorial.html 文件,它里面有对JExcelAPI编程的基本指导。这个手册告诉你如何读,写,和复制电子表格。这个手册也谈论了格式化。

jexcelapi 也包括一个 docs 子目录,它提供了查看更多的API文档的通道。使用你的浏览器访问这个目录下的index.html 文件你就可以查看到这个类库下的四个已经建立好文档的包:

  • jxl: 主要包的文档
  • jxl.demo: 各种demo的文档
  • jxl.format: 与格式化相关的文档
  • jxl.write: 与写电子表格相关的文档

注意一下这个列表不是详尽的。附加的包比如 jxl.read 是出现的但是没有建立好文档。想去了解附件的包,运行 jar tvf jxl.jar 然后再在生成的jar列表里面检查包的信息。

为了帮助你使用JExcelAPI,我已经创建了一个简单的JExcelAPIDemo应用,它示范创建一个保存到output.xls的新的电子表格然后再读取并且输出这个电子表格的内容。查看列表1。

    import java.io.File;
    import java.io.IOException;
    
    import jxl.Cell;
    import jxl.Sheet;
    import jxl.Workbook;
    
    import jxl.read.biff.BiffException;
    
    import jxl.write.Label;
    import jxl.write.Number;
    import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;
    import jxl.write.WriteException;
    
    public class JExcelAPIDemo
    {
       public static void main(String[] args) 
          throws BiffException, IOException, WriteException
       {
          WritableWorkbook wworkbook;
          wworkbook = Workbook.createWorkbook(new File("output.xls"));
          WritableSheet wsheet = wworkbook.createSheet("First Sheet", 0);
          Label label = new Label(0, 2, "A label record");
          wsheet.addCell(label);
          Number number = new Number(3, 4, 3.1459);
          wsheet.addCell(number);
          wworkbook.write();
          wworkbook.close();
    
          Workbook workbook = Workbook.getWorkbook(new File("output.xls"));
          Sheet sheet = workbook.getSheet(0);
          Cell cell1 = sheet.getCell(0, 2);
          System.out.println(cell1.getContents());
          Cell cell2 = sheet.getCell(3, 4);
          System.out.println(cell2.getContents());
          workbook.close();
        }
    }

列表1: 写和读取一个简单的电子表格

列表1的代码通过调用Workbook 的工厂方法首先创建了一个可写的工作簿。然后这个工作簿的一个可写单元被随后创建,然后一个标签名和一个数字被加入到工作簿中作为这个工作薄的两个单元的值。这个工作博随后被创建完成然后关闭。

列表1的代码继续关联output.xls文件工作簿然后读取它的内容。这个getSheet()方法连接电子表格的第一个工作簿。它的getCell()方法被调用去连接这两个单元,然后它的内容被读出。

假设jxl.jar 文件放在当前目录中,运行下面的命令去编译列表1的代码:

    javac -cp jxl.jar JExcelAPIDemo.java

如果成功之后,运行下面的命令启动JExcelAPIDemo:

    java -cp jxl.jar;. JExcelAPIDemo

你会发现下面的输出:

    A label record
    3.146

图片3展示 LibreOffice 打开的 output.xls的内容。

图片3: 独立的工作簿显示两个单元格的值

代码

你可以在这里下载这篇文章的代码。代码是在win 7 + jdk 7u6 环境下开发测试的。

原文链接: javaworld 翻译: ImportNew.com - 陈 显鹭
译文链接: http://www.importnew.com/11634.html
[ 转载请保留原文出处、译者和译文链接。]

关于作者: 陈 显鹭

(新浪微博:@bird1992),(博客:技术是我的毕生追求

查看陈 显鹭的更多文章 >>



可能感兴趣的文章

发表评论

Comment form

(*) 表示必填项

2 条评论

  1. anonymsean 说道:

    jExcelAPI虽然好用,但是不支持excel2007及以上版本,对于要处理65535条记录数据以上的无能为力。所以考虑数据量问题,可以选择poi.

    Thumb up 1 Thumb down 0

  2. shh 说道:

    以前也用jxl,但总感觉不如poi好一些,现在一直都在用poi,不知道是不是没用好

    Thumb up 0 Thumb down 0

跳到底部
返回顶部