java導出excel示例

文章分類:Java編程

POI用的比較多一些,是apache的項目,一般如果你用Myeclipse的,給項目添加了spring的話會自動包含POI的包進去



java導出Excel

java 代碼 /* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass.vtl */ package com.axon.fable.sams.view.action; import java.io.IOException; import java.io.OutputStream; import java.util.List; import javax.serv ...


java導出Excel例舉方式
方法一:導出Excel數據的插件jexcelapi

程序實例如下:
public void exportClassroom(OutputStream os) throws PaikeException {

try {
WritableWorkbook wbook = Workbook.createWorkbook(os); //建立excel文件
WritableSheet wsheet = wbook.createSheet("教室信息表", 0); //工作表名稱
//設置Excel字體
WritableFont wfont = new WritableFont(WritableFont.ARIAL, 16,
WritableFont.BOLD, false,
jxl.format.UnderlineStyle.NO_UNDERLINE,
jxl.format.Colour.BLACK);
WritableCellFormat titleFormat = new WritableCellFormat(wfont);
String[] title = { "教室名", "容 量", "類 型", "其他說明" };
//設置Excel表頭
for (int i = 0; i < title.length; i++) {
Label excelTitle = new Label(i, 0, title[i], titleFormat);
wsheet.addCell(excelTitle);
}
int c = 1; //用於循環時Excel的行號
ClassroomService cs = new ClassroomService();
List list = cs.findAllClassroom(); //這個是從數據庫中取得要導出的數據
Iterator it = list.iterator();
while (it.hasNext()) {
ClassroomDTO crdto = (ClassroomDTO) it.next();
Label content1 = new Label(0, c, crdto.getRoomname());
Label content2 = new Label(1, c, crdto.getCapicity().toString());
Label content3 = new Label(2, c, crdto.getRoomTypeId()
.toString());
Label content4 = new Label(3, c, crdto.getRemark());
wsheet.addCell(content1);
wsheet.addCell(content2);
wsheet.addCell(content3);
wsheet.addCell(content4);
c++;
}

wbook.write(); //寫入文件
wbook.close();
os.close();
} catch (Exception e) {

throw new PaikeException("導出文件出錯");

}

}





根據excle模塊來導出excel:

Java操作Excel之理解JXL--讀取Excel 說到如何用JXL讀取Excel文件,
現在來看看如何讀取Excel模板然後把動態數據寫入到模板以生成特定格式的Excel。
同樣的思路,先來考慮下會涉及到那些對象,和上篇文章讀取相比這裏涉及到一個寫入的步驟,所以JXL必然會提供一個對象
來支持寫入,這就是WritableWorkbook。那麼如何得到到這個類的實例,查看APIDoc發現Workbook類提供了幾個
靜態的createWorkbook方法返回WritableWorkbook實例,可以看到衆多createWorkbook方法主要分爲兩類:一個參數
和兩個參數。簡單分析可以得知前者僅僅是用來直接生成Excel文件,後者先讀取模板再向模板寫入數據然後生成Excel。
(還有一個三參數方法加上一個用來設置workbook的參數)
現在按照上篇文章中所講述的流程來看看讀取模板並寫入需要那些步驟。

第一步:選擇模板文件:
Workbook wb = Workbook.getWorkbook(new File(realpath));

第二步:通過模板得到一個可寫的Workbook:
WritableWorkbook wwb = Workbook.createWorkbook(targetFile, wb);
第一個參數是一個輸出流對象,比如可以
ByteArrayOutputStream targetFile = new ByteArrayOutputStream();
這樣定義這個輸出流對象。第二個參數代表了要讀取的模板。


第三步:選擇模板中名稱爲StateResult的Sheet:
WritableSheet wws = wwb.getSheet("StateResult");
如果需要也可以創建Sheet
WritableSheet wws = wwb.createSheet("Sheet名稱",i);


第四步:選擇單元格,寫入動態值,根據單元格的不同類型轉換成相應類型的單元格:
Label A1 = (Label)wws.getWritableCell(0,0);
A1.setString("單元格內容")

Number A2 = (Number)wws.getWritableCell(0,1);//Number是jxl.write.Number
A2.setValue(3.3);
也可以創建新的單元格並且加入到Sheet中
Label C1 = new Label(2,0,"單元格內容");
wws.addCell(C1);

Number C1 = new Number(2,0,3.3);
wws.addCell(C1);

在生成Excel報表的時候還會遇到一種需求就是數據的格式問題,我們可能希望數值型單元格以某種格式顯示,而字符串型單元格以另

一種格式顯示。這些可以通過WritableFont、NumberFormat、WritableCellFormat等實現,下例給單元格A1、A2添加了不同的格式。

java 代碼
WritableFont font=newWritableFont(WritableFont.createFont("宋體"),10,WritableFont.NO_BOLD); NumberFormat format =newNumberFormat("###,##0.00");//NumberFormat是jxl.write.NumberFormat WritableCellFormat cellFormat1 =newWritableCellFormat(font,format); WritableCellFormat cellFormat2 =newWritableCellFormat(font); cellFormat1.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN);//Border是jxl.format.Border cellFormat2.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN);//Border是jxl.format.Border A2.setCellFormat(cellFormat1); A1.setCellFormat(cellFormat2);
還有不要忘記關閉WritableWorkbook和Workbook以釋放資源:
wwb.close();
wb.close();

最後就可以你需要的方式從輸出流targetFile中取得Excel,比如直接生成文件存本地,輸出到客戶端瀏覽器等。

如果還有其他需求,按照這種思路,再參照APIDoc相信可以很容易的解決。

至此,Java操作Excel之理解JXL就寫完了。


***********************************************************************************************************************************



在這裏說說兩種表單格式,第一種只需把數據填充就行了,第二種是循環輸出數據。

第一種表單如下:






//選擇模板文件:
String realpath = "D:/download/test.xls";
try{
Workbook wb = Workbook.getWorkbook(new File(realpath));
//第二步:通過模板得到一個可寫的Workbook:第一個參數是一個輸出流對象,第二個參數代表了要讀取的模板
File targetFile = new File("D:/download/test1.xls");
WritableWorkbook wwb = Workbook.createWorkbook(targetFile, wb);
//第三步:選擇模板中名稱爲StateResult的Sheet:
WritableSheet wws = wwb.getSheet(4);
// 如果需要也可以創建Sheet
// WritableSheet wws = wwb.createSheet("Sheet名稱",1);
//第四步:選擇單元格,寫入動態值,根據單元格的不同類型轉換成相應類型的單元格:
//(列,行)
Label A1 = (Label)wws.getWritableCell(0,0);
A1.setString(" 2009年 7 月****出單中心####公司結算表");
WritableFont font= new WritableFont(WritableFont.createFont("宋體"),18,WritableFont.BOLD);
WritableCellFormat cellFormat1 = new WritableCellFormat(font);
cellFormat1.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border
cellFormat1.setBackground(Colour.BLUE);//設置單元格背景顏色爲天藍色
cellFormat1.setAlignment(jxl.format.Alignment.CENTRE);//設置文本對其方式,左對齊還是右對齊
A1.setCellFormat(cellFormat1);

Label A2 = (Label)wws.getWritableCell(0,1);
A2.setString("結算日期:2009年 7月7日 至 2009年 7月31日");
WritableFont font2= new WritableFont(WritableFont.createFont("宋體"),12,WritableFont.BOLD);
WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
cellFormat2.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border
cellFormat2.setBackground(Colour.BLUE);//設置單元格背景顏色爲天藍色
cellFormat2.setAlignment(jxl.format.Alignment.RIGHT);//設置文本對其方式,左對齊還是右對齊
A2.setCellFormat(cellFormat2);

/********************************public*****************************/
jxl.write.NumberFormat format = new jxl.write.NumberFormat("#");
jxl.write.WritableCellFormat wcf = new jxl.write.WritableCellFormat(format);
WritableFont fonte= new WritableFont(WritableFont.createFont("宋體"),12,WritableFont.NO_BOLD);
WritableCellFormat cellFormat= new WritableCellFormat(fonte,format);
cellFormat.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border
cellFormat.setAlignment(jxl.format.Alignment.CENTRE);//設置文本對其方式,左對齊還是右對齊
/********************************public*****************************/


/********************************保單生產明細*****************************/
//份數
jxl.write.Number C4 = new jxl.write.Number(2,3,bean.getPieces(),wcf);
wws.addCell(C4);
C4.setCellFormat(cellFormat);

//保單總印量
jxl.write.Number C5 = new jxl.write.Number(2,4,bean.getAllprintnum(),wcf);
wws.addCell(C5);
C5.setCellFormat(cellFormat);

//.................以此類推


wwb.write();
wwb.close();
wb.close();
}catch(Exception e){
e.printStackTrace();
}
}



第二種表單如下:



循環一個月內 每天的記錄,前面是寫死的填充數據,現在是循環輸出,也很簡單,寫個FOR循環就OK,關閉WritableWorkbook和Workbook釋放資源 要放在FOR循環之外,方法如下:

/**
* 月報表導出EXCEL
*
* 循環輸出的地方要採用新建單元格並且加入到Sheet的方式來實現
*
*/
public void reportMonthJXLWriteExcel(List list, List list2)
throws Exception {
// 選擇模板文件:
String realpath = "D:/download/test.xls";
try {
Workbook wb = Workbook.getWorkbook(new File(realpath));
// 第二步:通過模板得到一個可寫的Workbook:第一個參數是一個輸出流對象,第二個參數代表了要讀取的模板
File targetFile = new File("D:/download/test1.xls");
WritableWorkbook wwb = Workbook.createWorkbook(targetFile, wb);
// 第三步:選擇模板中名稱爲StateResult的Sheet:
WritableSheet wws = wwb.getSheet(3);
// 第四步:選擇單元格,寫入動態值,根據單元格的不同類型轉換成相應類型的單元格:
// (列,行)
Label A1 = (Label) wws.getWritableCell(0, 0);
A1.setString("2007年07月16日湖南出單中心長沙分公司生產月明細表");
WritableFont font = new WritableFont(WritableFont.createFont("宋體"),
18, WritableFont.BOLD);
WritableCellFormat cellFormat1 = new WritableCellFormat(font);
cellFormat1.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); // Border是jxl.format.Border
cellFormat1.setBackground(Colour.BLUE);// 設置單元格背景顏色爲天藍色
cellFormat1.setAlignment(jxl.format.Alignment.CENTRE);// 設置文本對其方式,左對齊還是右對齊
A1.setCellFormat(cellFormat1);

/** ******************************public**************************** */
jxl.write.NumberFormat format = new jxl.write.NumberFormat("#");
jxl.write.WritableCellFormat wcf = new jxl.write.WritableCellFormat(
format);
WritableFont fonte = new WritableFont(
WritableFont.createFont("宋體"), 10, WritableFont.NO_BOLD);
WritableCellFormat cellFormat = new WritableCellFormat(fonte,
format);
cellFormat.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); // Border是jxl.format.Border
cellFormat.setAlignment(jxl.format.Alignment.CENTRE);// 設置文本對其方式,左對齊還是右對齊
for (int c = 0; c < 18; c++) {
wws.setColumnView(c, 8);// 給每列設置寬度
}

/** ******************************public**************************** */

int i = 0, j = 0;// i=描述單元格,j=獲取JAVA BEAN對象
for (i = 3, j = 0; i < list.size() + 3 && j < list.size(); i++, j++) {
ReportDayBean bean = (ReportDayBean) list.get(j);

Label A4 = new Label(0, i, bean.getBusitime());
wws.addCell(A4);
WritableFont font2 = new WritableFont(WritableFont
.createFont("宋體"), 10, WritableFont.NO_BOLD);
WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
cellFormat2.setBorder(Border.ALL,
jxl.format.BorderLineStyle.THIN); // Border是jxl.format.Border
cellFormat2.setAlignment(jxl.format.Alignment.CENTRE);// 設置文本對其方式,左對齊還是右對齊
A4.setCellFormat(cellFormat2);

// 份數
jxl.write.Number B4 = new jxl.write.Number(1, i, bean
.getPieces(), wcf);
wws.addCell(B4);
B4.setCellFormat(cellFormat);

// 總印量
jxl.write.Number C4 = new jxl.write.Number(2, i, bean
.getAllprintnum(), wcf);
wws.addCell(C4);
C4.setCellFormat(cellFormat);

// 超印量
jxl.write.Number D4 = new jxl.write.Number(3, i, bean
.getOverprintnum(), wcf);
wws.addCell(D4);
D4.setCellFormat(cellFormat);

// 清單印量
jxl.write.Number E4 = new jxl.write.Number(4, i, bean
.getListprintnum(), wcf);
wws.addCell(E4);
E4.setCellFormat(cellFormat);
// A4紙
jxl.write.Number F4 = new jxl.write.Number(5, i, bean
.getPaper(), wcf);
wws.addCell(F4);
F4.setCellFormat(cellFormat);

// 份數
jxl.write.Number G4 = new jxl.write.Number(6, i, bean
.getZ_pieces(), wcf);
wws.addCell(G4);
G4.setCellFormat(cellFormat);
// 印量
jxl.write.Number H4 = new jxl.write.Number(7, i, bean
.getZ_printnum(), wcf);
wws.addCell(H4);
H4.setCellFormat(cellFormat);
// 用紙
jxl.write.Number I4 = new jxl.write.Number(8, i, bean
.getZ_paper(), wcf);
wws.addCell(I4);
I4.setCellFormat(cellFormat);
// 本埠信函
jxl.write.Number J4 = new jxl.write.Number(9, i, bean
.getLocal(), wcf);
wws.addCell(J4);
J4.setCellFormat(cellFormat);
// 外埠信函
jxl.write.Number K4 = new jxl.write.Number(10, i, bean
.getForeign(), wcf);
wws.addCell(K4);
K4.setCellFormat(cellFormat);
// 印量
jxl.write.Number L4 = new jxl.write.Number(11, i, bean
.getPrintnum(), wcf);
wws.addCell(L4);
L4.setCellFormat(cellFormat);
// 預印用紙
jxl.write.Number M4 = new jxl.write.Number(12, i, bean
.getPrepaper(), wcf);
wws.addCell(M4);
M4.setCellFormat(cellFormat);
// 空白用紙
jxl.write.Number N4 = new jxl.write.Number(13, i, bean
.getBlankpaper(), wcf);
wws.addCell(N4);
N4.setCellFormat(cellFormat);
// 信封
jxl.write.Number O4 = new jxl.write.Number(14, i, bean
.getEnvelope(), wcf);
wws.addCell(O4);
O4.setCellFormat(cellFormat);
// 裝訂份數
jxl.write.Number P4 = new jxl.write.Number(15, i, bean
.getQ_pieces(), wcf);
wws.addCell(P4);
P4.setCellFormat(cellFormat);
// 印量
jxl.write.Number Q4 = new jxl.write.Number(16, i, bean
.getQ_printnum(), wcf);
wws.addCell(Q4);
Q4.setCellFormat(cellFormat);
// A4紙
jxl.write.Number R4 = new jxl.write.Number(17, i, bean
.getQ_paper(), wcf);
wws.addCell(R4);
R4.setCellFormat(cellFormat);

}

System.out.println("iiiiiiiiiiii=" + i);
ReportDayBean bean = (ReportDayBean) list2.get(0);

Label A4 = new Label(0, i, "小計");
wws.addCell(A4);
WritableFont font2 = new WritableFont(
WritableFont.createFont("宋體"), 12, WritableFont.NO_BOLD);
WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
cellFormat2.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); // Border是jxl.format.Border
cellFormat2.setAlignment(jxl.format.Alignment.CENTRE);// 設置文本對其方式,左對齊還是右對齊
A4.setCellFormat(cellFormat2);

// 份數
jxl.write.Number B4 = new jxl.write.Number(1, i, bean.getPieces(),
wcf);
wws.addCell(B4);
B4.setCellFormat(cellFormat);

// 總印量
jxl.write.Number C4 = new jxl.write.Number(2, i, bean
.getAllprintnum(), wcf);
wws.addCell(C4);
C4.setCellFormat(cellFormat);

// 超印量
jxl.write.Number D4 = new jxl.write.Number(3, i, bean
.getOverprintnum(), wcf);
wws.addCell(D4);
D4.setCellFormat(cellFormat);

// 清單印量
jxl.write.Number E4 = new jxl.write.Number(4, i, bean
.getListprintnum(), wcf);
wws.addCell(E4);
E4.setCellFormat(cellFormat);
// A4紙
jxl.write.Number F4 = new jxl.write.Number(5, i, bean.getPaper(),
wcf);
wws.addCell(F4);
F4.setCellFormat(cellFormat);

// 份數
jxl.write.Number G4 = new jxl.write.Number(6, i,
bean.getZ_pieces(), wcf);
wws.addCell(G4);
G4.setCellFormat(cellFormat);
// 印量
jxl.write.Number H4 = new jxl.write.Number(7, i, bean
.getZ_printnum(), wcf);
wws.addCell(H4);
H4.setCellFormat(cellFormat);
// 用紙
jxl.write.Number I4 = new jxl.write.Number(8, i, bean.getZ_paper(),
wcf);
wws.addCell(I4);
I4.setCellFormat(cellFormat);
// 本埠信函
jxl.write.Number J4 = new jxl.write.Number(9, i, bean.getLocal(),
wcf);
wws.addCell(J4);
J4.setCellFormat(cellFormat);
// 外埠信函
jxl.write.Number K4 = new jxl.write.Number(10, i,
bean.getForeign(), wcf);
wws.addCell(K4);
K4.setCellFormat(cellFormat);
// 印量
jxl.write.Number L4 = new jxl.write.Number(11, i, bean
.getPrintnum(), wcf);
wws.addCell(L4);
L4.setCellFormat(cellFormat);
// 預印用紙
jxl.write.Number M4 = new jxl.write.Number(12, i, bean
.getPrepaper(), wcf);
wws.addCell(M4);
M4.setCellFormat(cellFormat);
// 空白用紙
jxl.write.Number N4 = new jxl.write.Number(13, i, bean
.getBlankpaper(), wcf);
wws.addCell(N4);
N4.setCellFormat(cellFormat);
// 信封
jxl.write.Number O4 = new jxl.write.Number(14, i, bean
.getEnvelope(), wcf);
wws.addCell(O4);
O4.setCellFormat(cellFormat);
// 裝訂份數
jxl.write.Number P4 = new jxl.write.Number(15, i, bean
.getQ_pieces(), wcf);
wws.addCell(P4);
P4.setCellFormat(cellFormat);
// 印量
jxl.write.Number Q4 = new jxl.write.Number(16, i, bean
.getQ_printnum(), wcf);
wws.addCell(Q4);
Q4.setCellFormat(cellFormat);
// A4紙
jxl.write.Number R4 = new jxl.write.Number(17, i,
bean.getQ_paper(), wcf);
wws.addCell(R4);
R4.setCellFormat(cellFormat);

int k = i + 2;// 這裏是空一行再寫入製表人,審覈人......
wws.mergeCells(4, k, 17, k);
Label E14 = new Label(
4,
k,
"製表人:   審覈人: 機構負責人:    機構財務部負責人: ");
wws.addCell(E14);
WritableCellFormat cellFormatinfo = new WritableCellFormat(font2);
cellFormatinfo.setBorder(Border.ALL,
jxl.format.BorderLineStyle.NONE); // Border是jxl.format.Border
cellFormatinfo.setAlignment(jxl.format.Alignment.LEFT);// 設置文本對其方式,左對齊還是右對齊
E14.setCellFormat(cellFormatinfo);

wwb.write();
wwb.close();
wb.close();
} catch (Exception e) {
}

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章