前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >#Java 导出 excel 数据

#Java 导出 excel 数据

原创
作者头像
ruochen
发布2021-12-15 14:35:37
3.3K0
发布2021-12-15 14:35:37
举报
文章被收录于专栏:若尘的技术专栏

实现根据excel模板导出数据(适合导出结构复杂的excel)根据模板导出excel适用于表格结构复杂的数据导出,需要提前定义好excel模板,设置好变量,然后导出数据到excel模板中。

打开创建好的文件province.xls,开始定义模板,设置变量用${}形式,此处的变量要和后边java代码中的model类的字段要一致,这样才能把具体数据输出到excel模板对应的位置

1.依赖

代码语言:txt
复制
<!-- jxls poi -->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.apache.poi</groupId>
代码语言:txt
复制
            <artifactId>poi</artifactId>
代码语言:txt
复制
            <version>3.15</version>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.apache.poi</groupId>
代码语言:txt
复制
            <artifactId>poi-ooxml</artifactId>
代码语言:txt
复制
            <version>3.15</version>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.apache.poi</groupId>
代码语言:txt
复制
            <artifactId>poi-scratchpad</artifactId>
代码语言:txt
复制
            <version>3.15</version>
代码语言:txt
复制
        </dependency>

2.model类

代码语言:txt
复制
import lombok.Data;
代码语言:txt
复制
@Data
代码语言:txt
复制
public class AreaModel {
代码语言:txt
复制
    private Integer no;
代码语言:txt
复制
    private Integer areaCode;
代码语言:txt
复制
    private String areaName;
代码语言:txt
复制
    private Integer level;
代码语言:txt
复制
}

3.util类

代码语言:txt
复制
import net.sf.jxls.transformer.XLSTransformer;
代码语言:txt
复制
import org.apache.poi.ss.usermodel.Workbook;
代码语言:txt
复制
import javax.servlet.http.HttpServletResponse;
代码语言:txt
复制
import java.io.*;
代码语言:txt
复制
import java.net.URLEncoder;
代码语言:txt
复制
import java.util.Map;
代码语言:txt
复制
public class TemplateExcelUtils {
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 根据模板导出数据
     * @param fileName
     * @param sourcePath resource/template文件夹下路径
     * @param beanParams
     * @param response
     * @throws Exception
     */
    public static void downLoadExcel(String fileName,String sourcePath, Map<String, Object> beanParams, HttpServletResponse response)
            throws Exception {
        try{
            OutputStream os = getOutputStream(fileName,response);
            //读取模板
            InputStream is = TemplateExcelUtils.class.getClassLoader().getResourceAsStream("template/"+sourcePath);
            XLSTransformer transformer = new XLSTransformer();
            //向模板中写入内容
            Workbook workbook = transformer.transformXLS(is, beanParams);
            //写入成功后转化为输出流
            workbook.write(os);
        }catch (Exception e){
            e.printStackTrace();
            throw e;
        }
    }
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 导出文件时为Writer生成OutputStream.
     * @param fileName 文件名
     * @param response response
     * @return ""
     */
    private static OutputStream getOutputStream(String fileName,
                                                HttpServletResponse response) throws Exception {
        try {
            fileName = URLEncoder.encode(fileName, "UTF-8");
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf8");
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xls");
            response.setHeader("Pragma", "public");
            response.setHeader("Cache-Control", "no-store");
            response.addHeader("Cache-Control", "max-age=0");
            return response.getOutputStream();
        } catch (IOException e) {
            throw new Exception("导出excel表格失败!", e);
        }
    }
}

4.业务类

代码语言:txt
复制
@Override
代码语言:txt
复制
    public void exportTemplateProvinceAreaData(HttpServletResponse response){
代码语言:txt
复制
        List<Area> areas = areaMapper.queryProvinceArea();  // 此处是我本地项目的mapper,是为了获取省份数据
代码语言:txt
复制
        List<AreaModel> result = new ArrayList<>();
代码语言:txt
复制
        areas.stream().forEach(area -> {
代码语言:txt
复制
            AreaModel areaModel = new AreaModel();
代码语言:txt
复制
            BeanUtils.copyProperties(area,areaModel);
代码语言:txt
复制
            result.add(areaModel);
代码语言:txt
复制
        });
代码语言:txt
复制
        IntStream.range(0, result.size()).forEach(i -> {
代码语言:txt
复制
            result.get(i).setNo(i+1);
代码语言:txt
复制
        });
代码语言:txt
复制
        try {
代码语言:txt
复制
            Map<String,Object> param = new HashMap<>();
代码语言:txt
复制
            param.put("title","省份数据");
代码语言:txt
复制
            param.put("list",result);
代码语言:txt
复制
            TemplateExcelUtils.downLoadExcel("省份数据","province.xls",param,response);
代码语言:txt
复制
        } catch (Exception e) {
代码语言:txt
复制
            throw new ServiceException(ResultCode.EXPORT_ERROR);
代码语言:txt
复制
        }
代码语言:txt
复制
    }

这是我业务层areaMapper.queryProvinceArea();所返回的省份数据

2021042018212275.png

5.controller层

代码语言:txt
复制
@GetMapping("/exportTemplateData")
代码语言:txt
复制
    public void exportTemplateData(HttpServletResponse response){
代码语言:txt
复制
        areaService.exportTemplateProvinceAreaData(response);
代码语言:txt
复制
    }

返回的excel

20210420182436178.png

7.到这里根据模板导出就做好了。上面是一个比较简单的模板,也可以定义复杂结构的模板。

20210421112759665.png

导出的数据。

20210421112950969.png

8.如果用easypoi导出的话

8.1依赖

代码语言:txt
复制
<!--easy poi excel文件导出-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>cn.afterturn</groupId>
代码语言:txt
复制
            <artifactId>easypoi-spring-boot-starter</artifactId>
代码语言:txt
复制
            <version>4.0.0</version>
代码语言:txt
复制
        </dependency>

8.2修改实现

代码语言:txt
复制
private void excelExport(List<TencentMeetingParticipantResultVO> list, MeetingLive meetingLive,
代码语言:txt
复制
                             HttpServletResponse response) {
代码语言:txt
复制
        String fileName = "参会成员信息表";
代码语言:txt
复制
        TemplateExportParams param = new TemplateExportParams("templates/canhuixinxi.xlsx", true);
代码语言:txt
复制
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
代码语言:txt
复制
        Map<String, Object> data = new HashMap<>();
代码语言:txt
复制
        data.put("title", meetingLive.getName());
代码语言:txt
复制
        data.put("id", meetingLive.getLiveId());
代码语言:txt
复制
        String userName = "";
代码语言:txt
复制
        if(!StringUtils.isEmpty(meetingLive.getCreateUser())){
代码语言:txt
复制
            User user = userMapper.selectById(meetingLive.getCreateUser());
代码语言:txt
复制
            if(user!=null){
代码语言:txt
复制
                userName = user.getFirstName() + user.getLastName();
代码语言:txt
复制
            }
代码语言:txt
复制
        }
代码语言:txt
复制
        data.put("user", userName);
代码语言:txt
复制
        data.put("beginTime", format.format(meetingLive.getBeginTime()));
代码语言:txt
复制
        data.put("endTime", format.format(meetingLive.getEndTime()));
代码语言:txt
复制
        data.put("list", list);//导出list集合
代码语言:txt
复制
        try {
代码语言:txt
复制
            Workbook book = ExcelExportUtil.exportExcel(param, data);
代码语言:txt
复制
            //下载方法
代码语言:txt
复制
            export(response, book, fileName);
代码语言:txt
复制
        } catch (Exception e) {
代码语言:txt
复制
            System.out.println("导出模板Excel,失败:" + e);
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
    /**
代码语言:txt
复制
     * export导出请求头设置
     *
     * @param response
     * @param workbook
     * @param fileName
     * @throws Exception
     */
    private static void export(HttpServletResponse response, Workbook workbook, String fileName) throws Exception {
        response.reset();
        response.setContentType("application/x-msdownload");
        response.setHeader("Content-disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName+".xlsx", "UTF-8"));
        ServletOutputStream outStream = null;
        try {
            outStream = response.getOutputStream();
            workbook.write(outStream);
        } finally {
            outStream.close();
        }
代码语言:txt
复制
    }

8.3修改模版

A548844C-6D61-4760-8A35-F3263588047D.png

9.easypoi和poi依赖会有冲突,请根据需求合理选择适用的方法

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档