之前是用Poi作Excel的操做、最近一個項目用jxl來作!如今項目完成了、作作總結!java
首先呢、須要的固然是jxl的.jar包!---------->jxl.jar<------------數據庫
代碼:由於此次的導出業務不怎麼複雜稍微把對Excel導出的操做提了一下 數組
- /**
- * @author 古道西風
- * @param file 文件對象
- * @param objData 導出內容數組
- * @param sheetName 導出工做表的名稱
- * @param columns 導出Excel的表頭數組
- * @return
- */
- public static int exportToExcel_3(File file, Object[] objData, String sheetName,
- String[] columns) {
- int flag = 0;
- //聲明工做簿jxl.write.WritableWorkbook
- WritableWorkbook wwb;
- try {
- //根據傳進來的file對象建立可寫入的Excel工做薄
- wwb = Workbook.createWorkbook(file);
- /*
- * 建立一個工做表、sheetName爲工做表的名稱、"0"爲第一個工做表
- * 打開Excel的時候會看到左下角默認有3個sheet、"sheet一、sheet二、sheet3"這樣
- * 代碼中的"0"就是sheet一、其它的一一對應。
- * createSheet(sheetName, 0)一個是工做表的名稱,另外一個是工做表在工做薄中的位置
- */
- WritableSheet ws = wwb.createSheet(sheetName, 0);
- //建立單元格樣式
- WritableCellFormat wcf = new WritableCellFormat();
- //背景顏色設置爲"那什麼"色
- wcf.setBackground(Colour.YELLOW);
- /*
- * 這個是單元格內容居中顯示
- * 還有不少不少樣式
- */
- wcf.setAlignment(Alignment.CENTRE);
- //判斷一下表頭數組是否有數據
- if (columns != null && columns.length > 0) {
- //循環寫入表頭
- for (int i = 0; i < columns.length; i++) {
- /*
- * 添加單元格(Cell)內容addCell()
- * 添加Label對象Label()
- * 數據的類型有不少種、在這裏你須要什麼類型就導入什麼類型
- * 如:jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
- * Label(i, 0, columns[i], wcf)
- * 其中i爲列、0爲行、columns[i]爲數據、wcf爲樣式
- * 合起來就是說將columns[i]添加到第一行(行、列下標都是從0開始)第i列、樣式爲何"色"內容居中
- */
- ws.addCell(new Label(i, 0, columns[i], wcf));
- }
- //判斷表中是否有數據
- if (objData != null && objData.length > 0) {
- //循環寫入表中數據
- for (int i = 0; i < objData.length; i++) {
- //我這裏直接用Object來接收了、由於狀況特殊沒有javaBean很痛苦、轉換事後獲得一條記錄
- Object obj[] = (Object[]) objData[i];
- //將獲得的記錄寫入Cell(單元格)中
- for (int j = 0; j < obj.length; j++) {
- //這裏不引用樣式了、j爲列、(i+1)爲行、由於表頭佔去了一行、因此後面的就+1
- ws.addCell(new Label(j, i + 1, String.valueOf(obj[j])));
- }
- }
- }
- //寫入Exel工做表
- wwb.write();
- //關閉Excel工做薄對象
- wwb.close();
- }
- } catch (Exception ex) {
- ex.printStackTrace();
- System.out.println(ex.getMessage());
- flag = 1;
- }
- return flag;
- }
- /**
- * 下載excel
- * @author 古道西風
- * @param response
- * @param url 文件存放路徑,如: request.getRealPath("/");
- * @param filename 文件名 ,如:20110808.xls
- * @param listData 數據源
- * @param sheetName 表頭名稱
- * @param columns 列名稱集合,如:{物品名稱,數量,單價}
- */
- public static void exportexcle_3(HttpServletResponse response,String url,String filename,Object[] listData,String sheetName,String[] columns)
- {
- //根據傳進來的文件路徑、建立文件
- File file = new File(url + filename);
- //調用上面的方法、生成Excel文件
- exportToExcel_3(file, listData, sheetName, columns);
- //聲明一個file對象
- File f=null;
- try {
- //根據剛剛的文件地址、建立一個file對象
- f = new File(url + filename);
- //若是文件不存在
- if (!f.exists()) {
- response.sendError(404, "File not found!");
- }
- //建立一個緩衝輸入流對象
- BufferedInputStream br = new BufferedInputStream(
- new FileInputStream(f));
- byte[] buf = new byte[1024];
- int len = 0;
- response.reset(); // 很是重要
- response.setContentType("application/x-msdownload");
- response.setHeader("Content-Disposition", "p_w_upload; filename="
- + f.getName());
- //建立輸出流對象
- OutputStream outStream = response.getOutputStream();
- //開始輸出
- while ((len = br.read(buf)) > 0)
- outStream.write(buf, 0, len);
- //關閉流對象
- br.close();
- outStream.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- if (f.exists()) {//下載完畢刪除文件
- f.delete();
- }
- }
在Action中只需在獲取完數據庫中的數據事後直接調用上面的方法、並傳入參數就Ok了!app
- Object[] repObj = report.queryMaintainUnit(obj,pageInfo);
- String[] strArr = {"流水號","路段名","維護站名","所屬系統",
- "故障等級","維護工區","派工時間","維修單位",
- "接修時間","處理結果","維修結果"};
- ExportDate expor = new ExportDate();
- expor.exportexcle_3(response,this.getUrl(),this.getFileName(),
- repObj,"維修單位明細表",strArr);
這是查詢出來的數據:ide
Excel:this
在加上分頁功能事後、數據出了問題、當點擊下一頁的時候、會多出一列、這一列是Oracle數據庫分頁時添加的rownum列、一、二、三、四、五、六、這樣!url
由於個人數據在輸出的時候沒有用到javaBean、用的是數組、因此輸出的時候、連後面的那一列也一塊兒輸出了!spa
這樣須要判斷一下、可是不知道爲何、第一頁的時候rownum列不會出現、第二頁還有後面的頁rownum就會跑出來!excel
雖然佔時解決了、可是懼怕它哪天不高興出點什麼亂子就老火了!orm