記錄是為了更好的成長!
廢話不多說,直接進入主題:數據導出到excel表格的方式很多,具體的還需要看項目要求,合理選擇,導出excel表格可以在前端對table中的內容通過js進行導出,在后台的話可以通過java代碼進行導出。
1、通過js將table中的數據導出到excel
-
手寫原生js代碼(這種方式可以百度找js代碼,網上都可以找到)
-
使用jquery-table2excel插件 (獲取最新版本的地址為:https://github.com/rainabba/jquery-table2excel )
需要用到jquery和jquery_table2excel兩個js,附上一段我做demo時的源碼:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script src="js/jquery-3.3.1.min.js"></script> <script src="js/jquery.table2excel.js"></script> </head> <body> <table class="table2excel" border="1" cellspacing="0" width="100%"> <thead> <tr> <th>編號</th> <th>姓名</th> <th>年齡</th> <th>地址</th> <th>用戶名</th> <th>郵箱</th> <th>手機號</th> <th>電話號碼</th> <th class="ttt">編輯</th> </tr> </thead> <tbody> <tr> <td>編號</td> <td>姓名</td> <td>年齡</td> <td>地址</td> <td>用戶名</td> <td>郵箱</td> <td>手機號</td> <td>電話號碼</td> <td>編輯</td> </tr> </tbody> </table> <button class="btn">導出excel表格</button> <script> $(function() { $(".btn").click(function(){ $(".table2excel").table2excel({ // 不被導出的表格行的CSS class類 exclude: ".noExl", exclude:".ttt", // 導出的Excel文檔的名稱 name: "Excel Document Name", // Excel文件的名稱 filename: "test", //文件后綴名 fileext: ".xls", //是否排除導出圖片 exclude_img: false, //是否排除導出超鏈接 exclude_links: false, //是否排除導出輸入框中的內容 exclude_inputs: false }); }); }); </script> </body> </html>
注意:使用jquery.table2Excel插件導出文件時,文件導出成功之后js會重新請求到這個頁面的路徑,請確保參數不為null ;
比如請求RequestMapping("index") 之后來到index頁面進行導出,導出成功之后js會再去請求 RequestMapping("index") ,然后繼續來index頁面,如果控制層的方法中有參數的話,請確保參數不為null,否則導出完之后的請求會出錯。
2、通過java代碼實現導出excel,(后端實現方式不止一種,我這里用org.apache.poi來實現)
POI有兩種實現方式:HSSF和XSSF
HSSF是POI工程對Excel 97(-2007)文件操作的純Java實現
XSSF是POI工程對Excel 2007 OOXML (.xlsx)文件操作的純Java實現
從POI 3.8版本開始,提供了一種基於XSSF的低內存占用的API----SXSSF (這種沒用過)
引入mavan:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency>
附上我的java代碼:
public class ExcelUtil { /** * 導出Excel * @param sheetName sheet名稱 * @param title 標題 * @param values 內容 * @param wb HSSFWorkbook對象 * @return */ public static HSSFWorkbook getHSSFWorkbook(String sheetName,String []title,String [][]values, HSSFWorkbook wb){ // 第一步,創建一個HSSFWorkbook,對應一個Excel文件 if(wb == null){ wb = new HSSFWorkbook(); } // 第二步,在workbook中添加一個sheet,對應Excel文件中的sheet HSSFSheet sheet = wb.createSheet(sheetName); // 第三步,在sheet中添加表頭第0行,注意老版本poi對Excel的行數列數有限制 HSSFRow row = sheet.createRow(0); // 第四步,創建單元格,並設置值表頭 設置表頭居中 HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER_SELECTION);; // 創建一個居中格式 //聲明列對象 HSSFCell cell = null; //創建標題 for(int i=0;i<title.length;i++){ cell = row.createCell(i); cell.setCellValue(title[i]); cell.setCellStyle(style); } //創建內容 for(int i=0;i<values.length;i++){ row = sheet.createRow(i + 1); for(int j=0;j<values[i].length;j++){ //將內容按順序賦給對應的列對象 row.createCell(j).setCellValue(values[i][j]); } } return wb; } //發送響應流方法 public static void setResponseHeader(HttpServletResponse response, String fileName) { try { try { //設置表文件名的字符編碼,不然中文文件名會亂碼 fileName = new String(fileName.getBytes("utf-8"),"ISO-8859-1"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } response.setContentType("application/octet-stream;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename="+ fileName); response.addHeader("Pargam", "no-cache"); response.addHeader("Cache-Control", "no-cache"); } catch (Exception ex) { ex.printStackTrace(); } }
業務層導出方法:
public void export(HttpServletRequest request,HttpServletResponse response) { //獲取數據 List<Money> list = moneyMapper.selectByExample(null); //excel標題 String[] title = {"編號","價格","用戶id"}; //excel文件名 String fileName = "測試表.xls"; //sheet名 String sheetName = "測試表"; String[][] content=new String[list.size()][title.length]; for (int i = 0; i < list.size(); i++) { content[i][0] = list.get(i).getMid().toString(); content[i][1] = list.get(i).getMoney().toString(); content[i][2] = list.get(i).getUid().toString(); } //創建HSSFWorkbook HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null); //響應到客戶端 try { ExcelUtil.setResponseHeader(response, fileName); OutputStream os = response.getOutputStream(); wb.write(os); os.flush(); os.close(); }catch (Exception e) { e.printStackTrace(); } }
控制層調用:
/** * 導出報表 * @return */ @RequestMapping("export") @ResponseBody public void export(HttpServletRequest request,HttpServletResponse response) throws Exception { serviceAllImpl.export(request, response); }
頁面:
<body> <button onclick = "toExcel()">導出excel</button> <script> function toExcel() { window.location.href="export"; } </script> </body>
這是我的項目中從頁面到控制層再到業務層,工具類的一個實現。
可以參考大佬的博客:https://www.cnblogs.com/sunny-sl/p/7794249.html
以上內容代表個人觀點,僅供參考,不喜勿噴。。。