ssm框架使用poi进行文件的下载功能

使用poi从后端查询数据并封装成文件格式返回前端进行下载,这里只是将后端查询的数据封装到HSSF中直接以流返回给前端,浏览器会自动识别文件格式。

poi简介:Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
有几个基本功能:
HSSF - 提供读写Microsoft Excel格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
HWPF - 提供读写Microsoft Word格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读写Microsoft Visio格式档案的功能。
这些功能能满足大部分需求,使用对应的类返回对应的文件格式!

这篇是对excel格式的下载

  1. 导入poi依赖
<!--poi依赖-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.15</version>
</dependency>
  1. 查询客户需要的数据,封装成集合
<select id="selectAllActivities" resultMap="BaseResultMap">
    select
    ta.id,tu1.name as owner, ta.name, ta.start_date, ta.end_date, ta.cost, ta.description, ta.create_time,tu2.name as create_by,
    ta.edit_time,tu3.name as edit_by
    from tbl_activity ta
    join tbl_user tu1 on ta.owner = tu1.id
    join tbl_user tu2 on ta.create_by = tu2.id
    left join tbl_user tu3 on ta.edit_by = tu3.id
    order by ta.create_time desc
</select>
  1. service层调用mapper层
@Autowired
ActivityMapper activityMapper;

public List<Activity> findAllActivities() {
    return activityMapper.selectAllActivities();
}
  1. 控制层查询数据,封装到HSSF中
/**
 1. 导出所有的市场活动
 2. @param request  请求
 3. @param response 响应
 */
@RequestMapping("/workbench/activity/exportAllActivity.do")
public void exportAllActivity(HttpServletRequest request, HttpServletResponse response) throws Exception {
    //查询所有市场活动
    List<Activity> activityList = marketingActivityService.findAllActivities();
    //创建一个excel文件对象
    HSSFWorkbook wb = new HSSFWorkbook();
    //使用文件对象创建一页对象,并为此页取名,不取名则采用默认名称
    HSSFSheet sheet = wb.createSheet("市场活动列表");
    //使用页对象创建行对象,0表示第一行,1位第二行,依次类推...
    HSSFRow row = sheet.createRow(0);//设置第一行
    //使用行对象创建列对象,0表示第一列,1位第二列,依次类推...
    HSSFCell cell = row.createCell(0);//设置第一行的第一列信息
    //第一列名称
    cell.setCellValue("所有者");
    //设置第二列及名称
    cell = row.createCell(1);
    cell.setCellValue("名称");
    //设置第三列及名称
    cell = row.createCell(2);
    cell.setCellValue("开始日期");
    //...
    cell = row.createCell(3);
    cell.setCellValue("结束日期");
    cell = row.createCell(4);
    cell.setCellValue("成本");
    cell = row.createCell(5);
    cell.setCellValue("描述");
    cell = row.createCell(6);
    cell.setCellValue("创建日期");
    cell = row.createCell(7);
    cell.setCellValue("创建者");
    cell = row.createCell(8);
    cell.setCellValue("修改日期");
    cell = row.createCell(9);
    cell.setCellValue("修改者");

    //设置列的样式
    HSSFCellStyle style = wb.createCellStyle();
    //设置为左对齐,HorizontalAlignment这是一个枚举类,可以设置多种样式
    style.setAlignment(HorizontalAlignment.LEFT);

    if (activityList != null) {
        Activity activity = null;
        //遍历集合
        for (int i = 0; i < activityList.size(); i++) {
            activity = activityList.get(i);//获取集合中的每个对象

            //设置第二行,因为上面设置了0,这里需要加1,如果将i设置为1,那第一条对象将无法取到
            row = sheet.createRow(i + 1);

            cell = row.createCell(0);//设置第i+1行的第一列信息
            cell.setCellValue(activity.getOwner());
            cell = row.createCell(1);
            cell.setCellValue(activity.getName());
            cell = row.createCell(2);
            cell.setCellValue(activity.getStartDate());
            cell = row.createCell(3);
            cell.setCellValue(activity.getEndDate());
            cell = row.createCell(4);
            cell.setCellValue(activity.getCost());
            cell = row.createCell(5);
            cell.setCellValue(activity.getDescription());
            cell = row.createCell(6);
            cell.setCellValue(activity.getCreateTime());
            cell = row.createCell(7);
            cell.setCellValue(activity.getCreateBy());
            cell = row.createCell(8);
            cell.setCellValue(activity.getEditTime());
            cell = row.createCell(9);
            cell.setCellValue(activity.getEditBy());
        }
    } 
    
    //设置响应信息类型及编码,避免乱码
    //响应类型为二进制流响应,直接以流的方式响应,任何文件都能响应到前台,也能指定类型响应
    response.setContentType("application/octet-stream;charset=UTF-8");

    //根据HTTP协议的规定,浏览器每次向服务器发送请求,都会把浏览器信息以请求头的形式发送到服务器
    String browser = request.getHeader("User-Agent");

    //不同的浏览器接收响应头采用的编码格式不一样:IE采用 urlencoded、火狐采用 ISO8859-1
    //使用URLEncoder.encode,将文字的编码设置为urlencoded
    String fileName = URLEncoder.encode("市场活动列表", "UTF-8");
    if (browser.contains("firefox")) {
        //火狐采用 ISO8859-1,将"市场活动列表"字符串以utf-8的编码方式打散
        // 再以"ISO8859-1"编码格式组合起来,字符串编码格式变为"ISO8859-1"
        fileName = new String("市场活动列表".getBytes(StandardCharsets.UTF_8), "ISO8859-1");
    }
    //可以设置响应头信息,使浏览器接收到响应信息之后,在下载窗口打开
    response.addHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls");

    //获取响应输出流对象
    ServletOutputStream os = response.getOutputStream();

    //将文件输出到浏览器
    wb.write(os);
    //刷新并关闭资源
    os.flush();
    wb.close();
}

响应文件类型常用对照表: https://tool.oschina.net/commons/

  1. 前台直接发送请求就行,浏览器会识别响应的文件,生成对应的文件下载
$("#exportActivityBtn").click(function () {
    //点击全部导出按钮,跳转到后台控制器,同步请求
    window.location.href = "<%=basePath%>workbench/activity/exportAllActivity.do";
});

到这,就完成了下载excel文件功能!想要下载不同格式的文件,使用poi对应的类进行封装,就能完成你想要的下载格式的下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值