天天看點

Java操作Excel的一種方法

MS的電子表格(Excel)是Office的重要成員,是儲存統計資料的一種常用格式。作為辦公文檔,勢必要涉及到的電子文檔的交換,Excel是一種在企業中非常通用的檔案格式,列印和管理也比較友善。在一個Java應用中,将一部分資料生成Excel格式,是與其他系統無縫連接配接的重要手段。

在開源世界中,有兩套比較有影響的API可供使用,一個是POI,一個是jExcelAPI。其中jExcelAPI是一個南韓程式員的作品,雖然沒有 POI那樣血統高貴,但是在筆者的使用過程中,感覺簡單友善,對中文支援非常好,功能也比較強大。它的下載下傳位址是:http: //www.andykhan.com/jexcelapi/ 目前的最高版本是2.4。作者的網站上對它的特征有如下描述:

● 支援Excel 95-2000的所有版本

● 生成Excel 2000标準格式

● 支援字型、數字、日期操作

● 能夠修飾單元格屬性

● 支援圖像和圖表

應該說以上功能已經能夠大緻滿足我們的需要。最關鍵的是這套API是純Java的,并不依賴Windows系統,即使運作在Linux下,它同樣能夠正确的處理Excel檔案。另外需要說明的是,這套API對圖形和圖表的支援很有限,而且僅僅識别PNG格式。

搭建環境

将下載下傳後的檔案解包,得到jxl.jar,放入classpath,安裝就完成了。

基本操作

一、建立檔案

拟生成一個名為“測試資料.xls”的Excel檔案,其中第一個工作表被命名為“第一頁”,大緻效果如下:

代碼(CreateXLS.java):

//生成Excel的類

import java.io.*;

import jxl.*;

import jxl.write.*;

public class CreateXLS

{

public static void main(String args[])

try

//打開檔案

WritableWorkbook book=

Workbook.createWorkbook(new File(“測試.xls”));

//生成名為“第一頁”的工作表,參數0表示這是第一頁

WritableSheet sheet=book.createSheet(“第一頁”,0);

//在Label對象的構造子中指名單元格位置是第一列第一行(0,0)

//以及單元格内容為test

Label label=new Label(0,0,”test”);

//将定義好的單元格添加到工作表中

sheet.addCell(label);

/*生成一個儲存數字的單元格

必須使用Number的完整包路徑,否則有文法歧義

單元格位置是第二列,第一行,值為789.123*/

jxl.write.Number number = new jxl.write.Number(1,0,789.123);

sheet.addCell(number);

//寫入資料并關閉檔案

book.write();

book.close();

}catch(Exception e)

System.out.println(e);

}

編譯執行後,會在目前位置産生一個Excel檔案。

三、讀取檔案

以剛才我們建立的Excel檔案為例,做一個簡單的讀取操作,程式代碼如下:

//讀取Excel的類

public class ReadXLS

Workbook book=

Workbook.getWorkbook(new File(“測試.xls”));

//獲得第一個工作表對象

Sheet sheet=book.getSheet(0);

//得到第一列第一行的單元格

Cell cell1=sheet.getCell(0,0);

String result=cell1.getContents();

System.out.println(result);

程式執行結果:test

四、修改檔案

利用jExcelAPI可以修改已有的Excel檔案,修改Excel檔案的時候,除了打開檔案的方式不同之外,其他操作和建立Excel是一樣的。下面的例子是在我們已經生成的Excel檔案中添加一個工作表:

//修改Excel的類,添加一個工作表

public class UpdateXLS

//Excel獲得檔案

Workbook wb=Workbook.getWorkbook(new File(“測試.xls”));

//打開一個檔案的副本,并且指定資料寫回到原檔案

Workbook.createWorkbook(new File(“測試.xls”),wb);

//添加一個工作表

WritableSheet sheet=book.createSheet(“第二頁”,1);

sheet.addCell(new Label(0,0,”第二頁的測試資料”));

執行結果如圖:

進階操作

一、 資料格式化

在Excel中不涉及複雜的資料類型,能夠比較好的處理字串、數字和日期已經能夠滿足一般的應用。

1、 字串格式化

字元串的格式化涉及到的是字型、粗細、字号等元素,這些功能主要由WritableFont和WritableCellFormat類來負責。假設我們在生成一個含有字串的單元格時,使用如下語句,為友善叙述,我們為每一行指令加了編号:

WritableFont font1=

new WritableFont(WritableFont.TIMES,16,WritableFont.BOLD); ①

WritableCellFormat format1=new WritableCellFormat(font1); ②

Label label=new Label(0,0,”data 4 test”,format1) ③

其中①指定了字串格式:字型為TIMES,字号16,加粗顯示。WritableFont有非常豐富的構造子,供不同情況下使用,jExcelAPI的java-doc中有詳細清單,這裡不再列出。

②處代碼使用了WritableCellFormat類,這個類非常重要,通過它可以指定單元格的各種屬性,後面的單元格格式化中會有更多描述。

③處使用了Label類的構造子,指定了字串被賦予那種格式。

在WritableCellFormat類中,還有一個很重要的方法是指定資料的對齊方式,比如針對我們上面的執行個體,可以指定:

//把水準對齊方式指定為居中

format1.setAlignment(jxl.format.Alignment.CENTRE);

//把垂直對齊方式指定為居中

format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);

二、單元格操作

Excel中很重要的一部分是對單元格的操作,比如行高、列寬、單元格合并等,所幸jExcelAPI提供了這些支援。這些操作相對比較簡單,下面隻介紹一下相關的API。

1、 合并單元格

WritableSheet.mergeCells(int m,int n,int p,int q);

作用是從(m,n)到(p,q)的單元格全部合并,比如:

//合并第一列第一行到第六列第一行的所有單元格

sheet.mergeCells(0,0,5,0);

合并既可以是橫向的,也可以是縱向的。合并後的單元格不能再次進行合并,否則會觸發異常。

2、 行高和列寬

WritableSheet.setRowView(int i,int height);

作用是指定第i+1行的高度,比如:

//将第一行的高度設為200

sheet.setRowView(0,200);

WritableSheet.setColumnView(int i,int width);

作用是指定第i+1列的寬度,比如:

//将第一列的寬度設為30

sheet.setColumnView(0,30);

jExcelAPI還有其他的一些功能,比如插入圖檔等,這裡就不再一一介紹,讀者可以自己探索。