使用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的內容。