【Java精品源码栏目提醒】:网学会员鉴于大家对Java精品源码十分关注,论文会员在此为大家搜集整理了“【精品】java对excel的操作源码 - 其它资料”一文,供大家参考学习
JAVA EXCEL API 简介
Java Excel 是一开放
源码项目,通过它
Java 开发人员可以读取 Excel 文件的内容、创建新的 Excel 文件、更新已经存在的 Excel 文件。
使用该 API 非 Windows操作系统也可以通过纯
Java 应用来处理 Excel 数据表。
因为是使用
Java 编写的,所以我们在 Web 应用中可以通过 JSP、 Servlet 来调用 API 实现对 Excel 数据表的访问。
现在发布的稳定版本是 V2.0,提供以下功能: 从 Excel 95、97、2000 等格式的文件中读取数据; 读取 Excel 公式(可以读取 Excel 97 以后的公式); 生成 Excel 数据表(格式为 Excel 97); 支持字体、数字、日期的格式化; 支持单元格的阴影操作,以及颜色操作; 修改已经存在的数据表;现在还不支持以下功能,但不久就会提供了: 1. 不能够读取图表信息; 2. 可以读,但是不能生成公式,任何类型公式最后的计算值都可以读出; 回页首应用示例1 从 Excel 文件读取数据表
Java Excel API 既可以从本地文件系统的一个文件.xls,也可以从输入流中读取 Excel 数据表。
工作薄, 读取 Excel 数据表的第一步是创建 Workbook术语:下面的代码片段举例说明了应该如何操作:完整代码见 ExcelReading.javaimport
java.io. import jxl. … … … … try //构建 Workbook 对象 只读 Workbook 对象 //直接从本地文件创建 Workbook //从输入流创建 Workbook InputStream is newFileInputStreamsourcefile jxl.Workbook rwb Workbook.getWorkbookis catch Exception e e.printStackTrace 一旦创建了 Workbook,我们就可以通过它来访问 Excel Sheet术语:工作表。
参考下面的代码片段://获取第一张 Sheet 表 Sheet rs rwb.getSheet0我们既可能通过 Sheet 的名称来访问它,也可以通过下标来访问它。
如果通过下标来访问的话,要注意的一点是下标从 0 开始,就像数组一样。
一旦得到了 Sheet,我们就可以通过它来访问 Excel Cell术语:单元格。
参考下面的代码片段://获取第一行,第一列的值 Cell c00 rs.getCell0 0 String strc00 c00.getContents //获取第一行,第二列的值 Cell c10 rs.getCell1 0 String strc10 c10.getContents //获取第二行,第二列的值 Cell c11 rs.getCell1 1 String strc11 c11.getContents System.out.printlnCell0 0 value : strc00 type : c00.getType System.out.printlnCell1 0 value : strc10 type : c10.getType System.out.printlnCell1 1 value : strc11 type : c11.getType如果仅仅是取得 Cell 的值,我们可以方便地通过 getContents方法,它可以 示例代码中 Cell0 0是文本型,将任何类型的 Cell 值都作为一个字符串返回。
Cell1 0是数字型,Cell11是日期型,通过 getContents,三种类型的返回值都是字符型。
如果有需要知道 Cell 内容的确切类型,API 也提供了一系列的方法。
参考下面的代码片段:String strc00 null double strc10 0.00 Date strc11 null Cell c00 rs.getCell0 0 Cell c10 rs.getCell1 0 Cell c11 rs.getCell1 1 ifc00.getType CellType.LABEL LabelCell labelc00 LabelCellc00 strc00 labelc00.getString ifc10.getType CellType.NUMBER NmberCell numc10 NumberCellc10 strc10 numc10.getValue ifc11.getType CellType.DATE DateCell datec11 DateCellc11 strc11 datec11.getDate System.out.printlnCell0 0 value : strc00 type : c00.getType System.out.printlnCell1 0 value : strc10 type : c10.getType System.out.printlnCell1 1 value : strc11 type : c11.getType在得到 Cell 对象后,通过 getType方法可以获得该单元格的类型,然后与 API提供的基本类型相匹配,强制转换成相应的类型,最后调用相应的取值方法getXXX,就可以得到确定类型的值。
API 提供了以下基本类型,与 Excel 的数据格式相对应,如下图所示:每种类型的具体意义,请参见
Java Excel API Document。
当你完成对 Excel 电子表格数据的处理后,一定要使用 close方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间, 在读取大量数据时显得尤为重要。
参考如下代码片段://操作完成时,关闭对象,释放占用的内存空间 rwb.closeJava Excel API 提供了许多访问 Excel 数据表的方法,在这里我只简要地介绍几个常用的方法,其它的方法请参考附录中的
Java Excel API Document。
Workbook 类提供的方法1. int getNumberOfSheets获得工作薄(Workbook)中工作表(Sheet)的个数,示例:jxl.Workbook rwb jxl.Workbook.getWorkbooknew Filesourcefile int sheets rwb.getNumberOfSheets2. Sheet getSheets返回工作薄(Workbook)中工作表(Sheet)对象数组,示例:jxl.Workbook rwb jxl.Workbook.getWorkbooknew Filesourcefile Sheet sheets rwb.getSheets3. String getVersion返回正在使用的 API 的版本号,好像是没什么太大的作用。
jxl.Workbook rwb jxl.Workbook.getWorkbooknew Filesourcefile String apiVersion rwb.getVersionSheet 接口提供的方法1 String getName获取 Sheet 的名称,示例:jxl.Workbook rwb jxl.Workbook.getWorkbooknew Filesourcefile jxl.Sheet rs rwb.getSheet0 String sheetName rs.getName2 int getColumns获取 Sheet 表中所包含的总列数,示例:jxl.Workbook rwb jxl.Workbook.getWorkbooknew Filesourcefile jxl.Sheet rs rwb.getSheet0 int rsColumns rs.getColumns3 Cell getColumnint column获取某一列的所有单元格,返回的是单元格对象数组,示例:jxl.Workbook rwb jxl.Workbook.getWorkbooknew Filesourcefile jxl.Sheet rs rwb.getSheet0 Cell cell rs.getColumn04 int getRows获取 Sheet 表中所包含的总行数,示例:jxl.Workbook rwb jxl.Workbook.getWorkbooknew Filesourcefile jxl.Sheet rs rwb.getSheet0 int rsRows rs.getRows5 Cell getRowint row获取某一行的所有单元格,返回的是单元格对象数组,示例子:jxl.Workbook rwb jxl.Workbook.getWorkbooknew Filesourcefile jxl.Sheet rs rwb.getSheet0 Cell cell rs.getRow06 Cell getCellint column int row获取指定单元格的对象引用,需要注意的是它的两个参数,第一个是列数,第二个是行数,这与通常的行、列组合有些不同。
jxl.Workbook rwb jxl.Workbook.getWorkbooknew Filesourcefile jxl.Sheet rs rwb.getSheet0 Cell cell rs.getCell0 02 生成新的 Excel 工作薄下面的代码主要是向大家介绍如何生成简单的 Excel 工作表, 在这里单元格的内容是不带任何修饰的如: 字体,颜色等等,所有的内容都作为字符串写入。
完整代码见 ExcelWriting.
java与读取 Excel 工作表相似,首先要使用 Workbook 类的工厂方法创建一个可写入的工作薄Workbook对象,这里要注意的是,只能通过 API 提供的工厂方法来创建 Workbook,而不能使用 WritableWorkbook 的构造函数,因为类WritableWorkbook 的构造函数为 protected 类型。
示例代码片段如下:import
java.io. import jxl. import jxl.write. try //构建 Workbook 对象 只读 Workbook 对象 //Method 1:创建可写入的 Excel 工作薄 jxl.write.WritableWorkbook wwb Workbook.createWorkbooknew Filetargetfile //Method 2:将 WritableWorkbook 直接写入到输出流 / OutputStream os newFileOutputStreamtargetfile jxl.write.WritableWorkbook wwb Workbook.createWorkbookos / catch Exception e e.printStackTrace API 提供了两种方式来处理可写入的输出流, 一种是直接生成本地文件, 如果文件名不带全路径的话, 缺省的文件会定位在当前目录, 如果文件名带有全路径的话,则生成的 Excel 文件则会定位在相应的目录; 另外一种是将 Excel 对象直接写入到输出流,例如:用户通过浏览器来访问 Web 服务器,如果 HTTP 头设置正确的话,浏览器自动调用客户端的 Excel 应用程序,来显示动态生成的 Excel电子表格。
接下来就是要创建工作表,创建工作表的方法与创建工作薄的方法几乎一样, 同样是通过工厂模式方法获得相应的对象,该方法需要两个参数, 一个是工作表的名称,另一个是工作表在工作薄中的位置,参考下面的代码片段://创建 Excel 工作表 jxl.write.WritableSheet ws wwb.createSheetTest Sheet 1 0这锅也支好了,材料也准备齐全了,可以开始下锅了!,现在要做的只是实例化 API 所提供的 Excel 基本数据类型,并将它们添加到工作表中就可以了,参考下面的代码片段://1.添加 Label 对象 jxl.write.Label labelC new jxl.write.Label00 This is a Label cell ws.addCelllabelC //添加带有字型 Formatting 的对象 jxl.write.WritableFont wf newjxl.write.WritableFontWritableFont.TIMES 18 WritableFont.BOLDtrue jxl.write.WritableCellFormat wcfF newjxl.write.WritableCellFormatwf jxl.write.Label labelCF new jxl.write.Label10 This is a Label Cell wcfF ws.addCelllabelCF //添加带有字体颜色 Formatting 的对象 jxl.write.WritableFont wfc newjxl.write.WritableFontWritableFont.ARIAL 10 WritableFont.NO_BOLDfalse UnderlineStyle.NO_UNDERLINEjxl.format.Colour.RED jxl.write.WritableCellFormat wcfFC newjxl.write.WritableCellFormatwfc jxl.write.Label labelCFC newjxl.write.Label1 0 This is a Label Cell wcfFC ws.addCelllabelCF //2.添加 Number 对象 jxl.write.Number labelN newjxl.write.Number0 1 3.1415926 ws.addCelllabelN //添加带有 formatting 的 Number 对象 jxl.write.NumberFormat nf newjxl.write.NumberFormat. jxl.write.WritableCellFormat wcfN newjxl.write.WritableCellFormatnf jxl.write.Number labelNF newjxl.write.Number1 1 3.1415926 wcfN ws.addCelllabelNF //3.添加 Boolean 对象 jxl.write.Boolean labelB newjxl.write.Boolean0 2 false ws.addCelllabelB //4.添加 DateTime 对象 jxl.write.DateTime labelDT newjxl.write.DateTime0 3 new
java.util.Date ws.addCelllabelDT //添加带有 formatting 的 DateFormat 对象 jxl.write.DateFormat df newjxl.write.DateFormatdd MM yyyy hh:mm:ss jxl.write.WritableCellFormat wcfDF newjxl.write.WritableCellFormatdf jxl.write.DateTime labelDTF newjxl.write.DateTime1 3 new
java.util.Date wcfDF ws.addCelllabelDTF这里有两点大家要引起大家的注意。
第一点,在构造单元格时,单元格在工作表中的位置就已经确定了。
一旦创建后,单元格的位置是不能够变更的,尽管单元格的内容是可以改变的。
第二点, 单元格的定位是按照下面这样的规律columnrow,而且下标都是从 0 开始,例如,A1 被存储在0 0,B1 被存储在1 0。
最后,不要忘记关闭打开的 Excel 工作薄对象,以释放占用的内存,参见下面的代码片段://写入 Exel 工作表 wwb.write //关闭 Excel 工作薄对象 wwb.close这可能与读取 Excel 文件的操作有少少不同, 在关闭 Excel 对象之前,你必须要先调用 write方法,因为先前的操作都是存储在缓存中的,所以要通过该方法将操作的内容保存在文件中。
如果你先关闭了 Excel 对象,那么只能得到一张空的工作薄了。
3 拷贝、更新 Excel 工作薄接下来简要介绍一下如何更新一个已经存在的工作薄,主要是下面二步操作, 第一步是构造只读的 Excel 工作薄, 第二步是利用已经创建的 Excel 工作薄创建新的可写入的 Excel 工作薄,参考下面的代码片段:完整代码见ExcelModifying.
java//创建只读的 Excel 工作薄的对象 jxl.Workbook rw jxl.Workbook.getWorkbooknewFilesourcefile //创建可写入的 Excel 工作薄对象 jxl.write.WritableWorkbook wwb Workbook.createWorkbooknew Filetargetfile rw //读取第一张工作表 jxl.write.WritableSheet ws wwb.getSheet0 //获得第一个单元格对象 jxl.write.WritableCell wc ws.getWritableCell0 0 //判断单元格的类型 做出相应的转化 ifwc.getType CellType.LABEL Label l Labelwc l.setStringThe value has been modified. //写入 Excel 对象 wwb.write //关闭可写入的 Excel 对象 wwb.close //关闭只读的 Excel 对象 rw.close之所以使用这种方式构建 Excel 对象, 完全是因为效率的原因, 因为上面的示例才是 API 的主要应用。
为了提高性能,在读取工作表时,与数据相关的一些输出信息,所有的格式信息,如:字体、颜色等等,是不被处理的,因为我们的目的是获得行数据的值,既使没有了修饰,也不会对行数据的值产生什么影响。
唯一的不利之处就是, 在内存中会同时保存两个同样的工作表,这样当工作表体积比较大时,会占用相当大的内存,但现在好像内存的大小并不是什么关键因素了。
一旦获得了可写入的工作表对象,我们就可以对单元格对象进行更新的操作了,在这里我们不必调用 API 提供的 add方法,因为单元格已经于工作表当中,所以我们只需要调用相应的 setXXX方法,就可以完成更新的操作了。
尽单元格原有的格式化修饰是不能去掉的, 我们还是可以将新的单元格修饰加上去,以使单元格的内容以不同的形式表现。
新生成的工作表对象是可写入的,我们除了更新原有的单元格外,还可以添加新的单元格到工作表中,这与示例 2 的操作是完全一样的。
最后,不要忘记调用 write方法,将更新的内容写入到文件中,然后关闭工作薄对象,这里有两个工作薄对象要关闭,一个是只读的,另外一个是可写入的。
参考资料 1.
Java Excel API 文档 2. http://www.andykhan.com/jexcelapi/