实现文件导出功能(Excel文件形式):全部导出

发布于:2023-02-06 ⋅ 阅读:(562) ⋅ 点赞:(0)

1,封装参数:

  • 如果做查询条件,或者参数之间不是属于一个实体类对象,封装成map
  • 如果做写数据,并且参数本来就是属于一个实体类对象,封装成实体类对象.

2,使用jquery获取或者设置指定元素的value属性值:

获取:选择器.val();
设置:选择器.val(属性值);

3,导出市场活动:

  • 给"批量导出"按钮添加单击事件,发送导出请求
  • 查询所有的市场活动
  • 创建一个excel文件,并且把市场活动写到excel文件中
  • 把生成的excel文件输出到浏览器(文件下载)

技术准备:

  • 使用java生成excel文件:iText,apache-poi

  • 关于办公文档插件使用的基本思想:把办公文档的所有元素封装成普通的Java类,

  • 程序员通过操作这些类达到操作办公文档目的。

名称 属性
文件 HSSFWorkbook
HSSFSheet
HSSFRow
HSSFCell
样式 HSSFCellStyle
使用apache-poi生成excel:
  • a)添加依赖:
 <dependency>
    <groupId>org.apache.poi</groupId>
     <artifactId>poi</artifactId>
     <version>3.15</version>
   </dependency>
  • b)使用封装类生成excel文件:

public class CreateExcelTestPoi {

    @Test
    public void testExcel() throws IOException {
        //创建HSSFWorkbook对象,对应一个Exceld文件
        HSSFWorkbook workbook = new HSSFWorkbook();
        //使用workbook创建SSFSheet对象,对应workBook文件中的一页
        HSSFSheet sheet = workbook.createSheet("学生列表");
        //使用sheet创建HSSFRow对象,对应sheet中的一行
        HSSFRow row = sheet.createRow(0);//行号:从0开始,依次增加
        //使用row创建HSSFCell对象,对应row中的一列
        HSSFCell cell = row.createCell(0);//列的编号:从0开始,依次增加
        cell.setCellValue("学号");
        cell = row.createCell(1);//第二列
        cell.setCellValue("姓名");
        cell = row.createCell(2);//第三列
        cell.setCellValue("年龄");


        //生成样式对象HSSFCellStyle
        HSSFCellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        cellStyle.setBorderBottom(BorderStyle.MEDIUM);
        //使用sheet创建10个HSSFRown对象。对应sheet的10行
        for(int i=1;i<=10;i++){
            row = sheet.createRow(i);

            cell = row.createCell(0);//列的编号:从0开始,依次增加
            cell.setCellValue("100"+i);
            cell = row.createCell(1);//第二列
            cell.setCellValue("NAME"+i);
            cell.setCellStyle(cellStyle);
            cell = row.createCell(2);//第三列
            cell.setCellValue(20+i);
        }
//        E:\开发工具\动力节点\CRM项目( SSM框架版)\课堂笔记
        //创建输出流((目录必须创建好)
        FileOutputStream fos = new FileOutputStream("F:\\2017\\student.xls");

        //调用工具函数,生成Excel文件
        workbook.write(fos);

        //释放资源
        fos.close();
        workbook.close();
        System.out.println("ok~~~~~~~~~~~~~~~~~~~~~~~~~");
    }
}

2)文件下载:

filedownloadtest.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";
%>
<html>
<head>
    <title>演示文件下载</title>
    <!-- 官网bootstrap压缩版引用地址: -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
    <!-- 官网jquery压缩版引用地址: -->
    <script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#fileDownloadBtn").click(function () {
                //发送文件下载请求
                window.location.href='workbench/activity/fileDownload.do';//同步请求
            });
        })
    </script>
</head>
<body>
        <br><br>
        <input class="btn btn-primary" type="button" value="下载" id="fileDownloadBtn">
</body>
</html>
ActivityController

    @RequestMapping("/workbench/activity/fileDownload.do")
    public void fileDownload(HttpServletResponse response) throws IOException {
        System.out.println("文件下载开始时间:"+DateUtils.formateDateTime(new Date()));
        //1.设置响应类型
        response.setContentType("appplication/octet-stream;charset=UTF-8");
        //2.获取输出流
        OutputStream out = null;
        InputStream is = null;
        try {
            out = response.getOutputStream();
            //浏览器接收到响应请求信息后,默认情况下,直接在显示窗口打开响应信息,即使打不开,也会调用应用程序打开;
//            只有实在打不开,才会激活文件下载窗口
            //可以设置响应头信息,使浏览器接收到响应信息后,直接激活文件下载窗口,即使能打开也不打开
            response.addHeader("Content-Disposition","attachment;filename=xoxo.jpg");
            //读取Excel文件(InputStream),把输出到到浏览器(OutPutStream)
            is = new FileInputStream("F:\\360downloads\\backgrouds\\c2a6aecfa838b1a652fa03fb622cb4cb.jpg");
            byte[] buff = new byte[256];
            int len = 0;
            while ((len = is.read(buff))!=-1){
                out.write(buff,0,len);
            }
           
        }catch (Exception e){
            e.printStackTrace();
        }
        /**
         * 关闭资源
         * out = response.getOutputStream();out是服务器创建的,不需要手动关闭资源
         */
        is.close();
        out.flush();
        System.out.println("文件下载结束时间:"+DateUtils.formateDateTime(new Date()));
    }
     |->fileDownload()

*所有文件下载的请求只能发送同步请求。

具体业务演示(批量导出市场活动信息## 标题Excel文件)

ActivityMapper.java:

/**
     * 查询所有的市场活动
     * @return
     */
    List<Activity> selectAllActivitys();

ActivityMapper.xml:

<!--
      /**
      * 查询所有的市场活动
      * @return
      */
      List<Activity> selectAllActivitys();-->
  <select id="selectAllActivitys" resultMap="BaseResultMap">
    select a.id,u1.name as owner,a.name,a.start_date,a.end_date,a.cost,a.description,
        a.create_time,u2.name as create_by,a.edit_time
        from tbl_activity a
        join tbl_user u1 on a.owner = u1.id
        join tbl_user u2 on a.create_by = u2.id
        left join tbl_user u3 on a.edit_by = u3.id
        order by a.create_time desc
  </select>

ActivityController.java

/**
     * 批量导出市场活动信息
     * (改造后:市场活动信息从数据库查询出来在内存上,再从内存放到磁盘上,再从磁盘上放到内存上)
     * 修改后:不用再内存-》磁盘-》内存来回跑
     * 全部在内存中操作,最后导出保存在本地磁盘上
     *
     */
    @RequestMapping("/workbench/activity/exportAllActivitys.do")
    public void exportAllActivitys(HttpServletResponse response) throws IOException {
        /**
         * 把查询到的市场活动信息写到Excel文件中并保存到服务器端
         */
        //调用service层方法,查询所有市场活动信息
        List<Activity> activityList = activityService.queryAllActivitys();
        //创建Excel文件,并且把activityList写入到Excel文件中
        //创建HSSFWorkbook对象,对应一个Exceld文件
        HSSFWorkbook workbook = new HSSFWorkbook();
        //使用workbook创建SSFSheet对象,对应workBook文件中的一页
        HSSFSheet sheet = workbook.createSheet("市场活动列表");
        //使用sheet创建HSSFRow对象,对应sheet中的一行
        HSSFRow row = sheet.createRow(0);
        //使用row创建HSSFCell对象,对应row中的一列
        HSSFCell cell = row.createCell(0);//第1列
        cell.setCellValue("ID");
        cell = row.createCell(1);//第2列
        cell.setCellValue("所有者");
        cell = row.createCell(2);//第3列
        cell.setCellValue("名称");
        cell = row.createCell(3);//第4列
        cell.setCellValue("开始日期");
        cell = row.createCell(4);//第5列
        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("修改时间");
        cell = row.createCell(10);
        cell.setCellValue("修改者");
		//如果activity市场活动表有数据不为空则进行导出Excel文件
        if(activityList!=null && activityList.size()>0){
            Activity activity = null;
            //遍历activityList,创建HSSFRown对象,生成所有数据行
            for(int i=0;i<activityList.size();i++){
                activity = activityList.get(i);

                //每次遍历出一个activity对象,创建数据行(生成一行)
                //i+1是因为第一行已经创建好了,是表头行
                row = sheet.createRow(i + 1);//第二行、第三行、第四行....第activityList.size()行
                //每一行创建11列,每一列的数据从activity对象中获取
                cell = row.createCell(0);
                cell.setCellValue(activity.getId());
                cell = row.createCell(1);
                cell.setCellValue(activity.getOwner());
                cell = row.createCell(2);
                cell.setCellValue(activity.getName());
                cell = row.createCell(3);
                cell.setCellValue(activity.getStartDate());
                cell = row.createCell(4);
                cell.setCellValue(activity.getEndDate());
                cell = row.createCell(5);
                cell.setCellValue(activity.getCost());
                cell = row.createCell(6);
                cell.setCellValue(activity.getDescription());
                cell = row.createCell(7);
                cell.setCellValue(activity.getCreateTime());
                cell = row.createCell(8);
                cell.setCellValue(activity.getCreateBy());
                cell = row.createCell(9);
                cell.setCellValue(activity.getEditTime());
                cell = row.createCell(10);
                cell.setCellValue(activity.getEditBy());
            }
        } 
        //释放资源
        workbook.close();
        /**
         * 把生成的Excel文件从服务器端下载到客户端
         */
        //1.设置响应类型
        System.out.println("文件下载开始时间:"+DateUtils.formateDateTime(new Date()));
        //1.设置响应类型
        response.setContentType("appplication/octet-stream;charset=UTF-8");
        //2.获取输出流
        OutputStream out = response.getOutputStream();
        response.addHeader("Content-Disposition","attachment;filename=activityList.xls");
//        释放资源
        /*is.close();*/
        workbook.write(out);
        out.flush();
        System.out.println("文件下载完成~~~~~~~");
        System.out.println("文件下载结束时间:"+DateUtils.formateDateTime(new Date()));

    }

在这里插入图片描述
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看