批量处理3——Excel文件导出

批量处理1——文件的上传(bootstrap+Ajax+SSM)
批量处理2——Java花式处理EXCEL
批量处理3——Excel文件导出
批量处理4——java处理压缩文件
Java知多少——相对路径和绝对路径
HTTP知多少——Content-disposition(文件下载)

点击文件导出时,需要将form表单的条件传递到后台,后台使用POI生成Excel文件,导出给用户。

1. 前端Ajax实现与后台的交互

1. 将form表单转化成JSON数据

$.fn.serializeJsonObj = function () {
    var o = {};
    var a = this.find("input:not(.data-submit-ignore),select:not(.data-submit-ignore),textarea:not(.data-submit-ignore)").serializeArray();
    $.each(a, function () {
        if (o[this.name]) {
            //如果o[label]不是嵌套在数组
            if (!o[this.name].push) {
                //将o[label]初始为嵌套数组,如o={a,[a,b,c]}
                o[this.name] = [o[this.name]];
            }
            //将值插入o[label]
            o[this.name].push($.trim(this.value) || '');
        } else {
            //第一次在o中插入o[label]
            o[this.name] = $.trim(this.value) || '';
        }
    });
    return o;
};

$.fn.serializeJsonStr = function () {
    //将Object对象转化为JSON对象
    return JSON.stringify(this.serializeJsonObj());
};

2. html代码

3. JS代码

function exportData() {

    var self = $('#exportDataBtn');
    if (self.hasClass("disabled")) return;

    if ($(".table-container").find("tr").size() <= 1) {
        layer.alert('您所查询的结果为空,请重新设置查询条件', {icon: 0});
        return;
    }

    layer.confirm('您是否确认以当前条件导出数据?', {
        icon: 3, title: '提示', btn: ['是', '否'], yes: function () {
            layer.closeAll('dialog');
            $.ajax({
                type: "POST",
                url: "XXX/exportCheck",  //校验是否可以导出
                data: $('#queryFrom').serializeJsonStr(),  //将表单转化成JSON串
                contentType: 'application/json;charset=utf-8', //设置请求头信息
                dataType: "json",
                success: (function (json) {
                    //允许导出
                    if (json.retcode == 200) {
                        $(".search-form").attr('action', './XXX/export'); 
                        $(".search-form").attr('method', 'POST');
                        $(".search-form").submit();
                        $(".search-form").attr('action', '');
                    } else {
                        layer.alert(json.message, {icon: 2});
                    }
                    self.removeClass("disabled");
                }),
                error: function (json) {
                    self.removeClass("disabled");
                    layer.alert("导出失败!", {icon: 2});
                },
                beforeSend: function () {
                    self.addClass("disabled");
                }
            });
        }
    });
}

2. 后台导出Excel文件

HTTP知多少——Content-disposition(文件下载)设置响应头,使得文件以下载的形式返回给用户。

      
            com.google.guava
            guava
            r09
        

lists.newarraylist()和new arraylist() 区别

  1. 获取Response输出流;
  2. 设置response的参数;
  3. 取数据库查询导出数据到List中;
  4. 创建List>对象;将User对象放入List中;
  5. 解析List集合为Excel记录;
    @RequestMapping("/export")
    public void exportData(User query, HttpServletRequest request, HttpServletResponse response) {
        try {
            OutputStream out = response.getOutputStream();// 取得输出流
            response.reset();// 清空输出流
            response.setHeader("Content-disposition",
                    "attachment; filename=" + ExcelUtil.toUtf8String("客户列表" + DateUtil.getCurrentTimeStr(), request) + ".xlsx");// 设定输出文件头
            response.setContentType("application/msexcel");// 定义输出类型
            /*根据query去数据库查询记录*/
            List users=userService.userList(query);
            /*按照Excel顺序,将User对象解析为List对象*/
            List> result = Lists.newArrayList();
            if (users != null || users.size() > 0) {
                for (int i = 0; i < users.size(); i++) {
                    List list = new ArrayList();
                    User user = User.get(i);
                    int count = 0;
                    list.add(count, i + 1 + "");
                    list.add(++count, user.getUserId());
                    result.add(list);
          }
      }
       //获取导出模板
       String fileName ="XXX.xlsx";
       //导出数据【填充输出流out】
       ExcelUtil.fillData(result, fileName, 2, 0, out);
      } catch (Exception e) {
            e.printStackTrace();
    }
}  
    public static String toUtf8String(String fileName, HttpServletRequest request) throws Exception {
        final String userAgent = request.getHeader("USER-AGENT");
        String finalFileName = null;
        if (StringUtils.contains(userAgent, "MSIE")) {// IE浏览器
            finalFileName = URLEncoder.encode(fileName, "UTF8");
        } else if (StringUtils.contains(userAgent, "Mozilla")) {// google,火狐浏览器
            finalFileName = new String(fileName.getBytes(), "ISO8859-1");
        } else {
            finalFileName = URLEncoder.encode(fileName, "UTF8");// 其他浏览器
        }
        return finalFileName;
    }
/**
 * 导出数据【填充输出流out】
*/
public static void fillData(List> result, String fileName int startRow, int startCell, OutputStream out) {
try{
//获取classpath下面的文件,转化成输入流
InputStream is = ExcelUtil.class.getClassLoader().getResourceAsStream(fileName);
XSSFWorkbook wb = new XSSFWorkbook(is);
XSSFSheet sheet = wb.getSheetAt(0);
for (List datas : result) {
   int firstCell = startCell;
   //获取单元格
   XSSFRow row = sheet.createRow(startRow);
   for (String data : datas) {
     XSSFCell cell = row.createCell(firstCell);
     //写入单元格内容
     cell.setCellType(XSSFCell.CELL_TYPE_STRING);
     cell.setCellValue(data);
     firstCell++;
    }
  startRow++;
}
 //设置输出流
 wb.write(out);
} catch (Exception e) {
  e.printStackTrace();
}
}

参考文章:
1. JavaScript获取表格的行数和列数

2. JSON.stringify()将对象转化成JSON

3. 表单转成JSON数据串

你可能感兴趣的:(批量处理3——Excel文件导出)