使用JAVA通过JXL(JExcel)动态生成Excel文件 转载至台湾某博客

王朝学院·作者佚名  2009-03-27
窄屏简体版  字體:   |    |    |  超大  

上次談過了使用iText產生PDF檔,這次換成來談談使用JExcel來產生EXCEL檔的方法。

首先,先到他的SourceForge主頁面download相關的API檔案。

http://sourceforge.net/projects/jexcelapi/

http://www.andykhan.com/jexcelapi/download.html

當然,他也是OpenSource的元件。

下列為其Tutorial教學:

http://www.andykhan.com/jexcelapi/tutorial.html

一切就緒後,那就準備上路了。

下載下來的壓縮檔解開後,可以找到jxl.jar,先將此檔案加入你的Classpath中吧!

1. 先建立Workbook

也就是整份的Excel檔案,可指定檔名。

Workbook workbook = Workbook.getWorkbook(new File("test.xls"));

2. 建立Sheet

也就是每個Excel檔案下面可以跳tag的sheet表。

Sheet sheet = workbook.createSheet("我的Excel表", 0);

第一個參數是sheet name,第二個參數是第幾張sheet,當然index是由0開始算。

3. 建立字型

WritableFont chFont11w = new WritableFont(WritableFont.TIMES, 11);

chFont11w.setColour(Colour.WHITE);

先建立一個WritableFont的instance,其constructor的第一個參數是指定字型,第二個是字型大小。

其中字型的部份,可以使用WritableFont所提供預設的一堆static常數來指定,

也可以直接輸入string,比如打"標楷體",到時產生的字型就會依照你所指定的來顯示。

而setColour是指定此字型的顏色,這個部份就麻煩。

(由colour這個字來看,很顯然的JExcel應是英國相關的人開發的:P 反正總之不會是美國)

顏色為什麼麻煩呢?在JExcel裡面,Colour class並不提供public constructor讓user自己指定RGB的顏色,

所以你只能從Colour中一堆的static常數顏色來指定,之前為了這個問題還研究了一下他的原始碼,

果然是不行,他的constructor是protected的,就連繼承之後雖然可以指定rgb顏色,但是仍然沒有作用。

(後來我看了一下Excel,發現原來這是因為Excel的標準調色盤就那些顏色

不像Word一樣可以讓使用者自訂顏色的關係)

查API doc就可以看到,他提供的顏色有:

static Colour AQUA

static Colour AUTOMATIC

static Colour BLACK

static Colour BLUE

static Colour BLUE_GREY

static Colour BLUE2

static Colour BRIGHT_GREEN

static Colour BROWN

static Colour CORAL

static Colour DARK_BLUE

static Colour DARK_BLUE2

static Colour DARK_GREEN

static Colour DARK_PURPLE

static Colour DARK_RED

static Colour DARK_RED2

static Colour DARK_TEAL

static Colour DARK_YELLOW

static Colour DEFAULT_BACKGROUND

static Colour DEFAULT_BACKGROUND1

static Colour GOLD

static Colour GRAY_25

static Colour GRAY_50

static Colour GRAY_80

static Colour GREEN

static Colour GREY_25_PERCENT

static Colour GREY_40_PERCENT

static Colour GREY_50_PERCENT

static Colour GREY_80_PERCENT

static Colour ICE_BLUE

static Colour INDIGO

static Colour IVORY

static Colour LAVENDER

static Colour LIGHT_BLUE

static Colour LIGHT_GREEN

static Colour LIGHT_ORANGE

static Colour LIGHT_TURQUOISE

static Colour LIGHT_TURQUOISE2

static Colour LIME

static Colour OCEAN_BLUE

static Colour OLIVE_GREEN

static Colour ORANGE

static Colour PALE_BLUE

static Colour PALETTE_BLACK

static Colour PERIWINKLE

static Colour PINK

static Colour PINK2

static Colour PLUM

static Colour PLUM2

static Colour RED

static Colour ROSE

static Colour SEA_GREEN

static Colour SKY_BLUE

static Colour TAN

static Colour TEAL

static Colour TEAL2

static Colour TURQOISE2

static Colour TURQUOISE

static Colour UNKNOWN

static Colour VERY_LIGHT_YELLOW

static Colour VIOLET

static Colour VIOLET2

static Colour WHITE

static Colour YELLOW

static Colour YELLOW2

上面列了這麼多,哪知道哪一個真正的顏色是怎麼樣?

除非自己邊試邊換才知,這太麻煩了,我寫了一隻程式把所有的顏色都印出來:

好了,但問題來了,上面提供的顏色如果對比較龜毛的人而言(比如我...),

一定是不足使用的,但如剛剛上述說的,Colour不提供自訂顏色的功能,

後來找了老半天文件,終於找到一個可以用的方式,

就是在workbook中,提供了一個setColourRGB的method,

但這個method並不是設定新的顏色,而是可以把上述提供的顏色重新覆寫其RGB設定值,

這個方法雖然不是挺好,但是終於有救了!

所以你就找個顏色來開刀,例如:

workbook.setColourRGB(Colour.DARK_GREEN, 0xDB, 0xF4, 0x8E);

我把DARK_GREEN的RGB改寫成#DBF48E (0x表示16進位)

(你要什麼顏色而有什麼16進位色碼,很多方法可以取得,比如:Photoshop、Dreamweaver等)

這樣一來,之後再使用Colour.DARK_GREEN,就會變成我們想要的顏色了。

4. 產生儲存格Cell的格式

WritableCellFormat cellFormat1 = new WritableCellFormat ();

cellFormat1.setFont(chFont11w);

cellFormat1.setBackground(Colour.DARK_GREEN);

cellFormat1.setAlignment(Alignment.CENTRE);

cellFormat1.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.GRAY_80);

這裡呢,要先產生你要的cell的格式,例如指定字型setFont,把我們剛剛產生的白色11大小的TIMES指定進去,

設定背景setBackground,把我們剛剛覆寫掉的DARK_GREEN指定進去,

指定對齊方式setAlignment為置中,

以及設定此cell的上下左右(Border.ALL)的框線以及顏色。

5. 增加一個文字儲存格Cell

Label label = new Label(2, 3, "我是rexmen", cellFormat1);

sheet.addCell(label);

此constructor的第一個參數是產生的儲存格的x的位置,2表示第3欄(index從0開始算)

第二個參數就是y的位置,3表示第4列。

用Excel的講法來說,就是「C4」那一格。

而第三個就是輸入的文字,而第四格就把我們剛剛產生的cell的format指定進去。

最後再把此label加入sheet中。使用addCell method。

6. 寫入及結束文件

把該作的都作完後,別忘了close掉文件,

workbook.write();

workbook.close();

先使用write()寫入後,再用colose關閉。

這樣就大功告成囉!最基本的JExcel就完成了。

其他的功能啦,插入圖片啦、試算的公式啦、有的沒的自己有空再試了!

其他:

若是在JSP上要讓User download這個動態產生的excel檔,

要用Servlet RequestDispatcher的方式,

若沒有設定正確表頭,導過去的檔案會會在browser上看到的是亂碥,

要記得設定 response.setContentType("application/vnd.ms-excel");

再導到正確的excel檔案位置

RequestDispatcher view = request.getRequestDispatcher("test.xls");

view.forward(request, response);

如此以來,在網址列上不會show出 test.xls 的檔名 (會按照你在web.xml裡設定的servlet對應mapping檔名),

而且可以正確的在browser裡看到Excel的內容。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航