1. 程式人生 > >table表匯出到excel的兩種辦法

table表匯出到excel的兩種辦法

 在web開發中經常需要將頁面上的表中的資料匯出到excel表,或生成excel表,本人在開發中使用過兩種方法:

方法一:
    在客戶端使用js指令碼,使用window的ActiveX技術,所以僅限用於.net平臺,需要在瀏覽器設定activeX相關的支援,但操作很簡單,只需要呼叫下面這個方法即可。有個缺點是:如果有分頁的話,而且使用的是真分頁,得到的可能是當前的分頁資料。


程式碼及註釋:
<script type="text/javascript" language="javascript">

    function exptoexcel() { 
//指定表的id值 並獲取該物件
        var curTbl = document.getElementById("表的id屬性值"); 
//新建excel 的ActiveX物件 
        var oXL = new ActiveXObject("Excel.Application");   
//新增一個Workbook 
        var oWB = oXL.Workbooks.Add(); 
//開啟一個sheet
        var oSheet = oWB.ActiveSheet; 
//copy curTbl的text到sheet
        var sel = document.body.createTextRange(); 
        sel.moveToElementText(curTbl); 
        sel.select(); 
        sel.execCommand("Copy"); 
        oSheet.Paste();

        oXL.Visible = true;

    } 
</script>


方法二:
    在伺服器段寫excel資料,作為資料流傳到客戶端開啟或下載,這樣的話很靈活,可以編輯標題,excle列名等等,也不收分頁的限制,但是要有基本api支援,jxl.jar就是這樣一個庫,他提供了很多excel操作的api,下面以個例項程式碼:

程式碼及註釋:
//檔名字
String fileName = "title";
String zbmc = fileName;
//獲得 OutputStream 最後把生成的excel通過這個寫出   
OutputStream os = resp.getOutputStream();
resp.setContentType("application/ms-excel;charset=gbk");
//httpResponse.reset(); 
//設定頭
resp.setHeader("Content-Disposition", "attachment;filename=" + java.net.URLEncoder.encode(fileName, "UTF-8") + ".xls");
    
//標題字型
jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.COURIER, 18, WritableFont.BOLD, true);
jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
wcfFC.setAlignment(jxl.format.Alignment.CENTRE);
wcfFC.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);

//欄位字型
jxl.write.WritableFont wfc1 = new jxl.write.WritableFont(WritableFont.COURIER, 10, WritableFont.BOLD, true);
jxl.write.WritableCellFormat wcfFC1 = new jxl.write.WritableCellFormat(wfc1);
wcfFC1.setAlignment(jxl.format.Alignment.CENTRE);
wcfFC1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);

//結果字型
jxl.write.WritableCellFormat wcfFC2 = new jxl.write.WritableCellFormat();
wcfFC2.setAlignment(jxl.format.Alignment.CENTRE);
wcfFC2.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);

//通過OutputStream物件os建立Workbook
WritableWorkbook wbook = Workbook.createWorkbook(os);
//建立sheet
WritableSheet wsheet = wbook.createSheet("sheet1", 0);

//列名    
String colName = "colum1-colum2-colum3-colum4-colum5-colum6-colum7....";
String[] splitColName = colName.split("-");
int colNum = splitColName.length;
int resSize = result.size();

//加入標題
wsheet.mergeCells(0, 0, colNum - 1, 0); //第一行合併
wsheet.addCell(new Label(0, 0, zbmc, wcfFC));//寫標題 看出座標是基於 0,0

//第一行寫入列名
for (int i = 0; i < colNum; i ++)
{
//加入欄位名
wsheet.addCell(new jxl.write.Label(i, 1, splitColName[i], wcfFC1));
//System.out.println(splistCharacterName);
}

//加入列印時間
//Date aaa = new Date();
//SimpleDateFormat aSimpleDateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//String today = aSimpleDateFormat.format(aaa);
//wsheet.addCell(new Label(colNum - 2, 1, "列印日期:"));
//wsheet.addCell(new Label(colNum - 1, 1, today));

//獲取結果
Vector<Hashtable<String,Object>> result =.......;
//下面開始輸出結果
for (int j = 0; j < resSize; j ++)
{
// 寫資料
}

//寫入流中
wbook.write();
wbook.close();
os.close();