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

 

以上内容代表个人观点,仅供参考,不喜勿喷。。。

 

posted @ 2018-11-17 13:09  刚刚睡醒  阅读(10784)  评论(0编辑  收藏  举报