Web項目中數據導出Excel的實現方案


 

記錄是為了更好的成長! 

 

廢話不多說,直接進入主題:數據導出到excel表格的方式很多,具體的還需要看項目要求,合理選擇,導出excel表格可以在前端對table中的內容通過js進行導出,在后台的話可以通過java代碼進行導出。

 

1、通過js將table中的數據導出到excel

      需要用到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

 

以上內容代表個人觀點,僅供參考,不喜勿噴。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM