zoukankan      html  css  js  c++  java
  • springboot导出Excel报表

    一.实现流程

    1.添加POI 的相关jar包

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.1</version>
    </dependency>

    2.编写服务接口

    比如说你要通过Excel表导出用户信息,你在用户管理接口中添加一个导出用户信息Excel报表的方法,采用分页查询的方式,可以传入要导出数据的范围,如需要导出全部,将页数据调制很大即可,同时因为调用的是分页查询方法查询数据,所以同样支持传入过滤字段进行数据过滤。SysUserService接口代码:

    /**
         * 生成用户信息Excel文件
         * @param pageRequest 要导出的分页查询参数
         * @return
         */
        File createUserExcelFile(PageRequest pageRequest);

    3.编写服务实现

    在用户管理服务实现类中编写实现代码,生成Excel。SysUserServiceImpl实现类代码:

    @Override
        public File createUserExcelFile(PageRequest pageRequest) {
            PageResult pageResult = findPage(pageRequest);
            return createUserExcelFile(pageResult.getContent());
        }
        
        public static File createUserExcelFile(List<?> records) {
            if (records == null) {
                records = new ArrayList<>();
            }
            Workbook workbook = new XSSFWorkbook();
            //创建一个sheet,括号里可以输入sheet名称,默认为sheet0
            Sheet sheet = workbook.createSheet();
            Row row0 = sheet.createRow(0);
            int columnIndex = 0;
            row0.createCell(columnIndex).setCellValue("No");
            row0.createCell(++columnIndex).setCellValue("ID");
            row0.createCell(++columnIndex).setCellValue("用户名");
            row0.createCell(++columnIndex).setCellValue("昵称");
            row0.createCell(++columnIndex).setCellValue("机构");
            row0.createCell(++columnIndex).setCellValue("角色");
            row0.createCell(++columnIndex).setCellValue("邮箱");
            row0.createCell(++columnIndex).setCellValue("手机号");
            row0.createCell(++columnIndex).setCellValue("状态");
            row0.createCell(++columnIndex).setCellValue("头像");
            row0.createCell(++columnIndex).setCellValue("创建人");
            row0.createCell(++columnIndex).setCellValue("创建时间");
            row0.createCell(++columnIndex).setCellValue("最后更新人");
            row0.createCell(++columnIndex).setCellValue("最后更新时间");
            for (int i = 0; i < records.size(); i++) {
                SysUser user = (SysUser) records.get(i);
                Row row = sheet.createRow(i + 1);
                for (int j = 0; j < columnIndex + 1; j++) {
                    row.createCell(j);
                }
                columnIndex = 0;
                row.getCell(columnIndex).setCellValue(i + 1);
                row.getCell(++columnIndex).setCellValue(user.getId());
                row.getCell(++columnIndex).setCellValue(user.getName());
                row.getCell(++columnIndex).setCellValue(user.getNickName());
                row.getCell(++columnIndex).setCellValue(user.getDeptName());
                row.getCell(++columnIndex).setCellValue(user.getRoleNames());
                row.getCell(++columnIndex).setCellValue(user.getEmail());
                row.getCell(++columnIndex).setCellValue(user.getStatus());
                row.getCell(++columnIndex).setCellValue(user.getAvatar());
                row.getCell(++columnIndex).setCellValue(user.getCreateBy());
                row.getCell(++columnIndex).setCellValue(DateTimeUtils.getDateTime(user.getCreateTime()));
                row.getCell(++columnIndex).setCellValue(user.getLastUpdateBy());
                row.getCell(++columnIndex).setCellValue(DateTimeUtils.getDateTime(user.getLastUpdateTime()));
            }
      //调用PoiUtils工具包
            return PoiUtils.createExcelFile(workbook, "download_user");
        }

    4.编写控制器

    在用户管理控制器类添加一个接口,并调用service获取File,最终通过文件操作工具类将File下载到本地。SYSUserController类代码:

    @PostMapping(value="/exportExcelUser")
        public void exportExcelUser(@RequestBody PageRequest pageRequest, HttpServletResponse res) {
            File file = sysUserService.createUserExcelFile(pageRequest);
            FileUtils.downloadFile(res, file, file.getName());
        }

    二.工具类文件

    为了简化代码,前面代码的实现封装了一些工具类。

    2.1 PoiUtils

    在编写服务的时候我们通过PoiUtils中的createExcelFile方法生成Excel文件。代码:

    /**
     * POI相关操作
     * @author Louis
     * @date Jan 14, 2019
     */
    public class PoiUtils {
    
        /**
         * 生成Excel文件
         * @param workbook
         * @param fileName
         * @return
         */
        public static File createExcelFile(Workbook workbook, String fileName) {
            OutputStream stream = null;
            File file = null;
            try {
                //用了createTempFile,这是创建临时文件,系统会自动给你的临时文件编号,所以后面有号码,你用createNewFile的话就完全按照你指定的名称来了
                file = File.createTempFile(fileName, ".xlsx");
                stream = new FileOutputStream(file.getAbsoluteFile());
                workbook.write(stream);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //这里调用了IO工具包控制开关
                IOUtils.closeQuietly(workbook);
                IOUtils.closeQuietly(stream);
            }
            return file;
        }
    }

    IOUtils

    /**
     * IO相关工具类
     * @author Louis
     * @date Oct 29, 2018
     */
    public class IOUtils {
    
        /**
         * 关闭对象,连接
         * @param closeable
         */
        public static void closeQuietly(final Closeable closeable) {
            try {
                if (closeable != null) {
                    closeable.close();
                }
            } catch (final IOException ioe) {
                // ignore
            }
        }
    }

    2.2 FileUtils

    在编写导出接口的时候我们通过FileUtils中的downloadFile将Excel文件下载到本地。代码:

    /**
     * 文件相关操作
     * @author Louis
     * @date Jan 14, 2019
     */
    public class FileUtils {
    
        /**
         * 下载文件
         * @param response
         * @param file
         * @param newFileName
         */
        public static void downloadFile(HttpServletResponse response, File file, String newFileName) {
            try {
                response.setHeader("Content-Disposition", "attachment; filename=" + new String(newFileName.getBytes("ISO-8859-1"), "UTF-8"));
                BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
                InputStream is = new FileInputStream(file.getAbsolutePath());
                BufferedInputStream bis = new BufferedInputStream(is);
                int length = 0;
                byte[] temp = new byte[1 * 1024 * 10];
                while ((length = bis.read(temp)) != -1) {
                    bos.write(temp, 0, length);
                }
                bos.flush();
                bis.close();
                bos.close();
                is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }










    1

  • 相关阅读:
    php文件
    简易版ajax
    localstory的储存与取出
    想了想,还是把之前的补齐,先放个封装的运动吧
    struts-032利用工具 PythonGUI
    Python GUI tkinter 学习笔记(三)
    Python GUI tkinter 学习笔记(二)
    Python GUI tkinter 学习笔记(一)
    先知xss挑战赛学习笔记
    Baiduyun
  • 原文地址:https://www.cnblogs.com/xc-xinxue/p/12494112.html
Copyright © 2011-2022 走看看