Java對(duì)Excel表格的操作
目前軟件開發(fā)多采用B/S架構(gòu)。正B/S架構(gòu)可以給軟件的開發(fā)部署帶來(lái)很大的便利,但是與此同時(shí)這種架構(gòu)也帶來(lái)了一些問(wèn)題,例如Web報(bào)表的處理等,在B/S架構(gòu)下,客戶端的開發(fā)并沒有豐富的、互動(dòng)性能良好的界面組件供開發(fā)人員調(diào)用,而且調(diào)用客戶端機(jī)器上的設(shè)備也很不方便。這些缺陷將會(huì)導(dǎo)致B/S架構(gòu)的軟件在客戶端的一些功能開發(fā)陷入困境。
Web報(bào)表的開發(fā)是一個(gè)比較常見的功能,然而在B/S架構(gòu)上實(shí)現(xiàn)這些功能并沒有在C/S架構(gòu)上那么簡(jiǎn)單,針對(duì)這樣的問(wèn)題,在下面的內(nèi)容中將介紹JSP與Excel的交互、圖形報(bào)表的制作和基本的Web打印功能,這些功能都不是很難,可以在掌握這些功能的基礎(chǔ)上舉一反三,思考其他新的應(yīng)用。
1JSP對(duì)Excel報(bào)表的處理
在應(yīng)用系統(tǒng)開發(fā)的過(guò)程中,很多客戶會(huì)提出把數(shù)據(jù)表格導(dǎo)出為Excel文件的需求,這樣就可以利用Excel的強(qiáng)大功能做一些統(tǒng)計(jì)計(jì)算。Java自帶的API中并沒直接操作Excel文檔的方法,如果要在Java中處理Excel文檔只有借助于第三方的解決方案。在接下來(lái)的章節(jié)中將要介紹的就是利用這些第三方的類庫(kù)處理Excel文檔的具體方法。
1.1JSP操作Excel工具匯總
在Java處理Excel這個(gè)領(lǐng)域已經(jīng)有很多開源的解決方案,目前在這方面做得比較出色的有ApachePOI和JExcelApi(jxl)。
ApachePOI是Apache基金組織Jakarta項(xiàng)目的子項(xiàng)目。POI包括一系列的API,可以操作多種格式的Microsoft Office文件,通過(guò)這些API可以在Java中很方便地讀寫Excel、Word等文件。POI是比較完整的Java Excel和Java Word解決方案。其子項(xiàng)目包括:POIFS、HSSF、HDF、HPSF。其中HSSF是Java到Microsoft Excel97/2002文件的接口,支持讀寫功能。
JExcelApi也是一個(gè)Java操作Excel的接口。它也是一個(gè)開源的解決方案,雖然在名氣方面比不上大名鼎鼎的ApachePOI,但是在操作Excel的功能上絲毫不比POI遜色,而且在某些方面做得比POI更出色,例如生成Excel文件時(shí)給合并單元格加邊框的問(wèn)題,在POI中這很難實(shí)現(xiàn)的,POI的官方僅僅承諾在以后的版本中會(huì)添加這個(gè)功能。然而在JExceApi中通過(guò)一個(gè)簡(jiǎn)單的設(shè)置語(yǔ)句就可以實(shí)現(xiàn)。而且總體上JExcelApi使用都是比較簡(jiǎn)單方便的。
利用Java進(jìn)行開發(fā),尤其當(dāng)使用第三方類的庫(kù)進(jìn)行開發(fā)的時(shí)候,最讓人頭疼的就是中文亂碼問(wèn)題,在這方面就連Apache POI也不例外,在生成Excel文件時(shí)必須經(jīng)過(guò)復(fù)雜的編碼設(shè)置才能看到中文顯示。但是使用JExcelApi就沒有這個(gè)問(wèn)題,只需要簡(jiǎn)單的選擇即可生成漂亮的中文Excel文件,這也是很多開發(fā)人員愿意選擇這個(gè)API的又一個(gè)重要原因。
采用這兩種工具都可以很方便地操作Excel文件,在這里只介紹JExcelApi的使用方法,其他類似的第三方類庫(kù)在使用方法上都很類似,參考其文檔都是很容易學(xué)習(xí)的。
1.2JExcelAPi開發(fā)環(huán)境簡(jiǎn)單配置
JExcelAPi是一個(gè)開源的項(xiàng)目,可以在官方網(wǎng)站下載其最新版本。在JExcelAPi的官方網(wǎng)站上提供各種版本的下載,例如要下載版本為2.4.2的JExcelApi,下載下來(lái)的文件為:
Jexcelapi-2-4-2.tar.gz,直接解壓這個(gè)壓軸文件即可。
其中docs目錄下是類庫(kù)參考檔案。Src目錄下是整個(gè)JExcelAPi的源代碼,在src目錄下有demo子目錄,里面是例子代碼,demo中的源代碼對(duì)初學(xué)者來(lái)說(shuō)是最好的教材,參考其中的例程可以實(shí)現(xiàn)其絕大部分功能。
JExcelAPi這個(gè)目錄下面可以看到jx1.jar文件,這個(gè)文件就是JExcelAPi打包的類庫(kù)文件,如果要在項(xiàng)目中使用JExcelAPi只需要把jx1.jar文件的路徑加入classpath中或項(xiàng)目lib目錄下。
1.3JSP生成Excel報(bào)表
在接下講解在JSP中使用JExcelApi生成不同格式的Excel文件.在WEB應(yīng)用開發(fā)過(guò)程中,可能會(huì)遇到各種各樣的報(bào)表需求,這些報(bào)表不僅布局格式復(fù)雜,而且數(shù)據(jù)類型也是多種多樣,甚至有些報(bào)表需要在指定的位置顯示圖片。當(dāng)這些報(bào)表需要導(dǎo)出為Excel的時(shí)候,相應(yīng)的的問(wèn)題就會(huì)出現(xiàn),而接下來(lái)要闡述的內(nèi)容就是怎樣使用JExcelApi來(lái)解決這些問(wèn)題。解決任何問(wèn)題的時(shí)候都是從簡(jiǎn)單到復(fù)雜,下面幾個(gè)示例也是按照這個(gè)原則組織的。
在實(shí)際應(yīng)用開發(fā)中,經(jīng)常需要把指定的數(shù)據(jù)生成Excel文件,并且可以下載生成的Excel文件。在本章的示例中。利用JavaBean生成的Excel文件,在JSP頁(yè)面上調(diào)用這個(gè)JavaBean生成的Excel文件,然后提供下載方式。當(dāng)訪問(wèn)這個(gè)JSP頁(yè)面的時(shí)候可以直接下載生成的Excel文件。
1. JSP生成簡(jiǎn)單的Excel文件
假設(shè)下面這種情形,要把表中的內(nèi)容導(dǎo)出為Excel文件。
學(xué)校 |
專業(yè) |
專業(yè)競(jìng)爭(zhēng)力 |
清華大學(xué) |
計(jì)算機(jī)專業(yè) |
高 |
北京大學(xué) |
法律專業(yè) |
中 |
北京理工大學(xué) |
航空專業(yè) |
低 |
在表中展示的內(nèi)容格式全是字符串。而且這個(gè)表格的格式也是相當(dāng)簡(jiǎn)單,沒有任何合并的單元格,也沒有顏色的設(shè)置。類似這種表格生成對(duì)應(yīng)的Excel文件是非常容易的,實(shí)現(xiàn)這個(gè)功能的JavaBean代碼如下所示。
package beans.excel;
import java.io.IOException;
import java.io.OutputStream;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
public class SimpleExcelWrite {
public void createExcel(OutputStream os) throws WriteException, IOException
{
//創(chuàng)建工作薄
WritableWorkbook workbook = Workbook.createWorkbook(os);
//創(chuàng)建新的一頁(yè)
WritableSheet sheet = workbook.createSheet("First Sheet", 0);
//創(chuàng)建要顯示的具體內(nèi)容
Label xuexiao = new Label(0, 0, "學(xué)校");
sheet.addCell(xuexiao);
Label zhuanye = new Label(1, 0, "專業(yè)");
sheet.addCell(zhuanye);
Label jingzhengli = new Label(2, 0, "專業(yè)競(jìng)爭(zhēng)力");
sheet.addCell(jingzhengli);
Label qinghua = new Label(0, 1, "清華大學(xué)");
sheet.addCell(qinghua);
Label jisuanji = new Label(1, 1, "計(jì)算機(jī)專業(yè)");
sheet.addCell(jisuanji);
Label gao = new Label(2, 1, "高");
sheet.addCell(gao);
Label beida = new Label(0, 2, "北京大學(xué)");
sheet.addCell(beida);
Label falv = new Label(1, 2, "法律專業(yè)");
sheet.addCell(falv);
Label zhong = new Label(2, 2, "中");
sheet.addCell(zhong);
Label ligong = new Label(0, 3, "北京理工大學(xué)");
sheet.addCell(ligong);
Label hangkong = new Label(1, 3, "航空專業(yè)");
sheet.addCell(hangkong);
Label di = new Label(2, 3, "低");
sheet.addCell(di);
//把創(chuàng)建的內(nèi)容寫入到輸出流中,并關(guān)閉輸出流
workbook.write();
workbook.close();
os.close();
}
}
|
上面這個(gè)JavaBean中的主要代碼解釋如下。
WritableWorkbook workbook = Workbook.createWorkbook(os); |
上面這行代碼創(chuàng)建一個(gè)Excel工作區(qū)(WorkBook)。在Excel中,所有的頁(yè)(Sheet)只能在工作區(qū)(WorkBook)中創(chuàng)建。
WritableSheet sheet = workbook.createSheet("First Sheet", 0); |
上面這行代碼在工作區(qū)(WorkBook)中創(chuàng)建新的一頁(yè)(Sheeet)其中新建的頁(yè)(Sheet)名稱為“First sheet”。這一頁(yè)的屬性是可以進(jìn)行寫操作的。在JExcelAPi中也可以創(chuàng)建只讀的頁(yè)。
Label xuexiao = new Label(0, 0, "學(xué)校");
sheet.addCell(xuexiao); |
上面這段代碼創(chuàng)建了一個(gè)單元格,并把這個(gè)單元格添加到指定的頁(yè)中,其中這個(gè)單元格的內(nèi)容是“學(xué)校”位置在第一行第一列,其中第1個(gè)參數(shù)是列坐標(biāo),第2個(gè)參數(shù)是行坐標(biāo),而且兩個(gè)坐標(biāo)都是從0開始計(jì)算。
workbook.write();
workbook.close();
os.close();
|
這3行代碼執(zhí)行的操作是把工作區(qū)中的內(nèi)容寫到輸出流中,然后關(guān)閉工作區(qū),最后關(guān)閉輸出流。
下面來(lái)看如何在JSP頁(yè)面上調(diào)用這個(gè)JavaBean,并且實(shí)現(xiàn)下載的功能。具體的JSP代碼如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@ page import="java.io.*" %>
<%@ page import="beans.excel.*" %>
<%
String fname = "學(xué)校專業(yè)競(jìng)爭(zhēng)力情況";
OutputStream os = response.getOutputStream();//取得輸出流
response.reset();//清空輸出流
//下面是對(duì)中文文件名的處理
response.setCharacterEncoding("UTF-8");
fname = java.net.URLEncoder.encode(fname, "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename="+ new String(fname.getBytes("UTF-8"), "GBK") + ".xls");
response.setContentType("application/msexcel");//定義輸出類型
SimpleExcelWrite sw = new SimpleExcelWrite();
sw.createExcel(os);
%>
<html>
<body>
</body>
</html>
|
上面這個(gè)JSP頁(yè)面實(shí)現(xiàn)的功能是調(diào)用JavaBean生成的Excel文件,并且提供下載。
String fname = "學(xué)校專業(yè)競(jìng)爭(zhēng)力情況"; |
上面這行設(shè)置生成Excel文件的文件名。
OutputStream os = response.getOutputStream();//取得輸出流
response.reset();//清空輸出流 |
上面兩行代碼取得輸出流,并且清空輸出流的男內(nèi)容。提供給后面生成的Excel文件使用。
response.setCharacterEncoding("UTF-8");
fname = java.net.URLEncoder.encode(fname, "UTF-8"); |
上面兩行代碼進(jìn)行的操作是中文顯示的處理,上面一行設(shè)置整個(gè)Excel的編碼格式,下面一行設(shè)置Excel文件名的編碼格式。這兩處編碼格式如果不進(jìn)行設(shè)置就會(huì)出現(xiàn)中文亂碼的情況。
response.setHeader("Content-Disposition", "attachment; filename="+ new String(fname.getBytes("UTF-8"), "GBK") + ".xls");
response.setContentType("application/msexcel");//定義輸出類型
|
上面這段代碼實(shí)現(xiàn)了下載的功能。
SimpleExcelWrite sw = new SimpleExcelWrite();
sw.createExcel(os); |
上面這段代碼調(diào)用SimpleExcelWrite這個(gè)JavaBean生成Excel文件,這里之所以沒有使用〈jsp:useBean〉標(biāo)簽是因?yàn)樵谶@個(gè)JavaBean中并沒有需要設(shè)置的屬性和用來(lái)獲取的屬性,所以用調(diào)用一般類的方法也是可以的,同樣可以調(diào)用到JavaBean中的方法。
2.JSP生成各種復(fù)雜數(shù)據(jù)格式的Excel文件
在上面的示例程序中,數(shù)據(jù)格式是非常簡(jiǎn)單的,僅僅只有字符串這一種格式,下面考慮這樣的情形,現(xiàn)在需要把表11.2中的數(shù)據(jù)導(dǎo)出為Excel文件
JExcelApi支持?jǐn)?shù)據(jù)格式列表
數(shù)據(jù)格式 |
浮點(diǎn)型 |
整型 |
布爾型 |
日期格式 |
數(shù)據(jù)示例 |
3.1415926535 |
15042699 |
true |
2007-7-15 |
實(shí)現(xiàn)這個(gè)操作比前一個(gè)例子中的要稍微麻煩一些,需要對(duì)各種數(shù)據(jù)類型進(jìn)行單獨(dú)的設(shè)置,不同的數(shù)據(jù)類型需要用不同的單元格的構(gòu)造方式。生成這個(gè)Excel的JavaBean具體代碼如下所示。
package beans.excel;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import jxl.Workbook;
import jxl.format.Colour;
import jxl.write.DateFormats;
import jxl.write.Label;
import jxl.write.NumberFormats;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.Number;
import jxl.write.Boolean;
import jxl.write.DateTime;
public class ComplexDataExcelWrite {
public void createExcel(OutputStream os) throws WriteException, IOException {
//創(chuàng)建工作薄
WritableWorkbook workbook = Workbook.createWorkbook(os);
//創(chuàng)建新的一頁(yè)
WritableSheet sheet = workbook.createSheet("First Sheet", 0);
//創(chuàng)建要顯示的具體內(nèi)容
Label formate = new Label(0, 0, "數(shù)據(jù)格式");
sheet.addCell(formate);
Label floats = new Label(1, 0, "浮點(diǎn)型");
sheet.addCell(floats);
Label integers = new Label(2, 0, "整型");
sheet.addCell(integers);
Label booleans = new Label(3, 0, "布爾型");
sheet.addCell(booleans);
Label dates = new Label(4, 0, "日期格式");
sheet.addCell(dates);
Label example = new Label(0, 1, "數(shù)據(jù)示例");
sheet.addCell(example);
//浮點(diǎn)數(shù)據(jù)
Number number = new Number(1, 1, 3.1415926535);
sheet.addCell(number);
//整型數(shù)據(jù)
Number ints = new Number(2, 1, 15042699);
sheet.addCell(ints);
//布爾型數(shù)據(jù)
Boolean bools = new Boolean(3, 1, true);
sheet.addCell(bools);
//日期型數(shù)據(jù)
Calendar c = Calendar.getInstance();
Date date = c.getTime();
WritableCellFormat cf1 = new WritableCellFormat(DateFormats.FORMAT1);
DateTime dt = new DateTime(4, 1, date, cf1);
sheet.addCell(dt);
//把創(chuàng)建的內(nèi)容寫入到輸出流中,并關(guān)閉輸出流
workbook.write();
workbook.close();
os.close();
}
}
|
這個(gè)程序的思路和前一個(gè)例子基本一樣,不同之處在于各種數(shù)據(jù)類型單元格的處理,這個(gè)在程序的注釋中已經(jīng)寫得很清楚了。具體不同數(shù)據(jù)類型的處理請(qǐng)參考上面的程序代碼。
這個(gè)JavaBean的調(diào)用方法和上一個(gè)例子一樣,只需要稍微改動(dòng)一下上一個(gè)例子中的JSP文件(SimpleExcelWrite.jsp)即可,所需改動(dòng)的僅僅有下面兩個(gè)地方:
String fname = "學(xué)校專業(yè)競(jìng)爭(zhēng)力情況"; |
把上面這句中的“學(xué)校專業(yè)競(jìng)爭(zhēng)力情況”改為“JExcelApi支持?jǐn)?shù)據(jù)格式列表”。
SimpleExcelWrite sw = new SimpleExcelWrite(); |
把上面這行代碼改為ComplexDataExcelWrite sw=newComplexDataExcelWrite()即可。經(jīng)過(guò)這樣的改動(dòng),就可以調(diào)用上面這個(gè)JavaBean。
3.JSP生成復(fù)雜布局和樣式的Excel文件
上面的示例程序只是展示了JExcelApi支持的各種數(shù)據(jù)類型,接下來(lái)將要展示JExcelApi對(duì)復(fù)雜的布局和樣式的支持。假設(shè)要把表中的數(shù)據(jù)導(dǎo)出為Excel文件
JExcelApi支持?jǐn)?shù)據(jù)類型詳細(xì)說(shuō)明
JExcelApi支持?jǐn)?shù)據(jù)類型詳細(xì)說(shuō)明 |
數(shù)據(jù)格式 |
浮點(diǎn)型 |
整型 |
布爾型 |
日期格式 |
數(shù)據(jù)示例 |
3.1415926535 |
15042699 |
true |
2007-7-15 |
在表中,表格的布局發(fā)生了變化,表頭占了5列,高度也明顯大于其他各行,同時(shí)各單元格的樣式也有了變化,采用了不同的字體類型、背景顏色。針對(duì)這樣的表格,在生成Excel文件的時(shí)候就要設(shè)置其布局和顯示的屬性。下面就是這個(gè)JavaBean的具體實(shí)現(xiàn)代碼。
package beans.excel;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import jxl.Workbook;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.write.DateFormats;
import jxl.write.Label;
import jxl.write.NumberFormats;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.Number;
import jxl.write.Boolean;
import jxl.write.DateTime;
public class MutiStyleExcelWrite {
public void createExcel(OutputStream os) throws WriteException, IOException {
//創(chuàng)建工作薄
WritableWorkbook workbook = Workbook.createWorkbook(os);
//創(chuàng)建新的一頁(yè)
WritableSheet sheet = workbook.createSheet("First Sheet", 0);
//構(gòu)造表頭
sheet.mergeCells(0, 0, 4, 0);//添加合并單元格
WritableFont bold = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD);//設(shè)置字體種類和黑體顯示
WritableCellFormat titleFormate = new WritableCellFormat (bold);
titleFormate.setAlignment(jxl.format.Alignment.CENTRE);//單元格中的內(nèi)容水平方向居中
titleFormate.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//單元格中的內(nèi)容垂直方向居中
Label title = new Label(0,0,"JExcelApi支持?jǐn)?shù)據(jù)類型詳細(xì)說(shuō)明",titleFormate);
sheet.setRowView(0,600,false);//設(shè)置第一行的高度
sheet.addCell(title);
//創(chuàng)建要顯示的具體內(nèi)容
WritableFont color = new WritableFont(WritableFont.ARIAL);//選擇字體
color.setColour(Colour.GOLD);//設(shè)置字體顏色為金黃色
WritableCellFormat colorFormat = new WritableCellFormat(color);
Label formate = new Label(0, 1, "數(shù)據(jù)格式",colorFormat);
sheet.addCell(formate);
Label floats = new Label(1, 1, "浮點(diǎn)型");
sheet.addCell(floats);
Label integers = new Label(2, 1, "整型");
sheet.addCell(integers);
Label booleans = new Label(3, 1, "布爾型");
sheet.addCell(booleans);
Label dates = new Label(4, 1, "日期格式");
sheet.addCell(dates);
Label example = new Label(0, 2, "數(shù)據(jù)示例",colorFormat);
sheet.addCell(example);
//浮點(diǎn)數(shù)據(jù)
WritableFont underline = new WritableFont(WritableFont.ARIAL, WritableFont.DEFAULT_POINT_SIZE,
WritableFont.NO_BOLD,false,UnderlineStyle.SINGLE);//設(shè)置下劃線
WritableCellFormat greyBackground = new WritableCellFormat(underline);
greyBackground.setBackground(Colour.GRAY_25);//設(shè)置背景顏色為灰色
Number number = new Number(1, 2, 3.1415926535,greyBackground);
sheet.addCell(number);
//整型數(shù)據(jù)
WritableFont boldNumber = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD);//設(shè)置黑體
WritableCellFormat boldNumberFomate = new WritableCellFormat (boldNumber);
Number ints = new Number(2, 2, 15042699,boldNumberFomate);
sheet.addCell(ints);
//布爾型數(shù)據(jù)
Boolean bools = new Boolean(3, 2, true);
sheet.addCell(bools);
//日期型數(shù)據(jù)
WritableFont boldDate = new WritableFont(WritableFont.ARIAL, WritableFont.DEFAULT_POINT_SIZE,
WritableFont.BOLD,false,UnderlineStyle.SINGLE);//設(shè)置黑體和下劃線
WritableCellFormat boldDateFomate = new WritableCellFormat (boldDate,DateFormats.FORMAT1);
Calendar c = Calendar.getInstance();
Date date = c.getTime();
DateTime dt = new DateTime(4, 2, date, boldDateFomate);
sheet.addCell(dt);
//把創(chuàng)建的內(nèi)容寫入到輸出流中,并關(guān)閉輸出流
workbook.write();
workbook.close();
os.close();
}
}
|
從上面的程序中可以看出JExcelApi設(shè)置格式和樣式的思路,如果需要天加合并單元格只需要在Sheet 上面添加mergeCells即可。而對(duì)單元格的樣式進(jìn)行設(shè)置的時(shí)候,只需要構(gòu)造一個(gè) WritableCellFormat即可,在這個(gè)對(duì)象里面可以進(jìn)行除字體外的各種樣式設(shè)置,如果需要設(shè)置字體,在構(gòu)造WritableCellFormat前就需要構(gòu)造 WritableFont,然后把字體設(shè)置完成的WritableFont對(duì)象作為參數(shù)傳給WritableCellFormat即可。
下面來(lái)解釋這個(gè)Java Bean的關(guān)鍵代碼。
sheet.mergeCells(0, 0, 4, 0);//添加合并單元格 |
上面這行代碼向頁(yè)(Sheet)里面添加一個(gè)合并單元格,這個(gè)合并單元格的區(qū)域是第一行到第五列。其中第一個(gè)參數(shù)是起始行,第三個(gè)參數(shù)是終止列,第四個(gè)參數(shù)是終止行。
WritableFont bold = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD); |
上面這行代碼構(gòu)造了一個(gè)字體對(duì)象,其中選擇的字體為ARIAL,字號(hào)大小為10,用黑體顯示。
WritableCellFormat titleFormate = new WritableCellFormat (bold); |
上面這行代碼利用前面構(gòu)造的字體對(duì)象生成一個(gè)單元格樣式控制對(duì)象。
titleFormate.setAlignment(jxl.format.Alignment.CENTRE);//單元格中的內(nèi)容水平方向居中
titleFormate.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//單元格中的內(nèi)容垂直方向居中
|
單元格樣式控制對(duì)象創(chuàng)建以后,就可以在這個(gè)對(duì)象上進(jìn)行各種樣式設(shè)置。上面的兩行代碼就是在前面創(chuàng)建的單元格樣式控制對(duì)象上進(jìn)行樣式設(shè)置。
Label title = new Label(0,0,"JExcelApi支持?jǐn)?shù)據(jù)類型詳細(xì)說(shuō)明",titleFormate); |
在樣式結(jié)束后,只需要在構(gòu)造單元格的時(shí)候選擇這個(gè)單元格樣式控制對(duì)象即可。上面這行代碼中的titleFormate就是前面已經(jīng)構(gòu)造并設(shè)置樣式的單元格樣式控制對(duì)象。
這個(gè)程序中其他樣式的設(shè)置思路和這個(gè)基本相同,只是選擇的具體參數(shù)不同。讀者可以仔細(xì)揣摩。
上面這個(gè)Java Bean的調(diào)用方法和前面兩個(gè)Excel文件生成示例的調(diào)用方法相同,只需要把SimpleExcelWrite.jsp這個(gè)JSP頁(yè)面做如下修改即可。
String fname = "學(xué)校專業(yè)競(jìng)爭(zhēng)力情況"; |
把上面這句中的“學(xué)校專業(yè)競(jìng)爭(zhēng)力情況”改為“JExcelApi支持?jǐn)?shù)據(jù)類型詳細(xì)說(shuō)明”
SimpleExcelWrite sw = new SimpleExcelWrite(); |
把上面這行代碼改為MutiStyleExcelWrite sw=newMutiStyleExcelWrite()即可。
4.JSP生成帶有圖片的Excel文件
在JExcelApi中,生成帶有圖片的Excel文件非常方便,只需構(gòu)造一個(gè)圖片單元格即可。具體構(gòu)造代碼如下所示。
WritableImage wi = new WritableImage(0,0,5,0,new File(“resource/123.jpg")); |
上面這段代碼構(gòu)造了一個(gè)圖片單元格,其所占區(qū)域?yàn)榈谝恍械牡谝涣械降谖辶校@里第一個(gè)參數(shù)為起始列,第二個(gè)參數(shù)為起始行,第三個(gè)參數(shù)為終止列,第四個(gè)參數(shù)為終止行,第五個(gè)參數(shù)是所要顯示圖片的文件對(duì)象,其中“resource/123.jpg”是文件的目錄。
添加圖象單元格的過(guò)程和普通的單元格沒有什么區(qū)別,讀者可以把上面這段代碼加入前面的例子中,正確指定顯示區(qū)域和圖片文件的路徑即可顯示。
11.1.4JSP讀取Excel報(bào)表、
這樣對(duì)所有的單元格都可以使用同一處理方法進(jìn)行處理。針對(duì)讀取Excel的操作沒有很多內(nèi)容,在這里把邏輯代碼放在JSP頁(yè)面進(jìn)行處理,具體的處理過(guò)程可以參考下面的代碼。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@ page import="java.io.File" %>
<%@ page import="jxl.Cell" %>
<%@ page import="jxl.Sheet" %>
<%@ page import="jxl.Workbook" %>
<html>
<body>
<font size="2">
<%
String fileName = "E:/Devolop Tool/Tomcat 5.0/webapps/chapt11/學(xué)校專業(yè)競(jìng)爭(zhēng)力情況.xls";
File file = new File(fileName);
Workbook wb = Workbook.getWorkbook(file);
Sheet sheet = wb.getSheet(0);
String outPut = "";
outPut = outPut + "<b>" + fileName + "</b><br>";
outPut = outPut + "第一個(gè)sheet的名稱為:" + sheet.getName() + "<br>";
outPut = outPut + "第一個(gè)sheet共有:"+sheet.getRows()+"行"+sheet.getColumns()+"列<br>";
outPut = outPut + "具體內(nèi)容如下:<br>";
for (int i = 0; i < sheet.getRows(); i++) {
for (int j = 0; j < sheet.getColumns(); j++) {
Cell cell = sheet.getCell(j, i);
outPut = outPut + cell.getContents()+" ";
}
outPut = outPut +"<br>";
}
out.println(outPut);
%>
</font>
</body>
</html> |
下面來(lái)解釋這段程序的關(guān)鍵代碼.
File file = new File(fileName); |
上面這行代碼就是一個(gè)簡(jiǎn)單的文件操作,根據(jù)文件名創(chuàng)建一個(gè)文件對(duì)象.
Workbook wb = Workbook.getWorkbook(file); |
上面這行代碼從文件流中取得Excel工作區(qū)對(duì)象(WorkBook)。
Sheet sheet = wb.getSheet(0); |
上面這行代碼從工作區(qū)中取得頁(yè)(Sheet),取得這個(gè)對(duì)象的時(shí)候既可以用名稱來(lái)獲得,也可以用序號(hào),在這里我們采用序號(hào),取得第一頁(yè)。
outPut = outPut + "第一個(gè)sheet的名稱為:" + sheet.getName() + "<br>"; |
上面這行代碼取出頁(yè)的名稱,并放入字符串,提供給后面進(jìn)行輸出。
outPut = outPut + "第一個(gè)sheet共有:"+sheet.getRows()+"行"+sheet.getColumns()+"列<br>"; |
上面這行代碼取出頁(yè)的行數(shù)和列數(shù),并放入字符串,提供給后面進(jìn)行輸出。
for (int i = 0; i < sheet.getRows(); i++) {
for (int j = 0; j < sheet.getColumns(); j++) {
Cell cell = sheet.getCell(j, i);
outPut = outPut + cell.getContents()+" ";
}
outPut = outPut +"<br>";
} |
上面這段代碼一次取出各行各列的內(nèi)容,并放入字符串,提供給后面進(jìn)行輸出。