推广

Java实现根据excel模板导出数据(适合导出结构复杂的excel)

iseeyu2年前 (2024-02-22)推广116

20210420180130385.png

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

20210420180241900.png

1.依赖

<!-- jxls poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.15</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.15</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.15</version>
        </dependency>

2.model类

import lombok.Data;

@Data
public class AreaModel {

    private Integer no;

    private Integer areaCode;

    private String areaName;

    private Integer level;
}

3.util类

import net.sf.jxls.transformer.XLSTransformer;
import org.apache.poi.ss.usermodel.Workbook;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Map;

public class TemplateExcelUtils {

    /**
     * 根据模板导出数据
     * @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;
        }
    }

    /**
     * 导出文件时为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.业务类

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

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

2021042018212275.png

5.controller层

@GetMapping("/exportTemplateData")
    public void exportTemplateData(HttpServletResponse response){
        areaService.exportTemplateProvinceAreaData(response);
    }

返回的excel

20210420182436178.png

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

20210421112759665.png

导出的数据。

20210421112950969.png

8.如果用easypoi导出的话
8.1依赖

<!--easy poi excel文件导出-->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-spring-boot-starter</artifactId>
            <version>4.0.0</version>
        </dependency>

8.2修改实现

private void excelExport(List<TencentMeetingParticipantResultVO> list, MeetingLive meetingLive,
                             HttpServletResponse response) {
        String fileName = "参会成员信息表";
        TemplateExportParams param = new TemplateExportParams("templates/canhuixinxi.xlsx", true);
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Map<String, Object> data = new HashMap<>();
        data.put("title", meetingLive.getName());
        data.put("id", meetingLive.getLiveId());
        String userName = "";
        if(!StringUtils.isEmpty(meetingLive.getCreateUser())){
            User user = userMapper.selectById(meetingLive.getCreateUser());
            if(user!=null){
                userName = user.getFirstName() + user.getLastName();
            }
        }
        data.put("user", userName);
        data.put("beginTime", format.format(meetingLive.getBeginTime()));
        data.put("endTime", format.format(meetingLive.getEndTime()));
        data.put("list", list);//导出list集合
        try {
            Workbook book = ExcelExportUtil.exportExcel(param, data);
            //下载方法
            export(response, book, fileName);
        } catch (Exception e) {
            System.out.println("导出模板Excel,失败:" + e);
        }
    }

    /**
     * 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();
        }

    }

8.3修改模版

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

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

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/55871.html

相关文章

哪些因素影响关键词排名。

哪些因素影响关键词排名。

很多做的朋友,一直在做关键词排名,但是很多新手朋友并不了解哪些因素影响关键词排名 那么哪些因素影响关键词排名呢?下面影响SEO排名的点有如下:一、关键词密度 这也很重要,企业站的关键词密度最好在3%左右。虽然很多人说关键词密度最好在2%-8%左右,但这还不能确定,但最好是自然,不要刻意堆积...

现在国内满大街都是药店,还能赚钱吗?

往前十几年,我们在路上逛街看到最多的店铺主要是餐饮、衣服、理发店等等,但是如今我们在街道上逛街,会发现有一类的门店正在迅速崛起——药店!在任何一座城市里面,你在1公里内基本找不到公共厕所,但是你在1公里内基本不会看不到药店,药店的数量虽然目前还无法与餐饮店的数量相比,但早已...

巨变丨新疆旅游强势崛起 吸引八方客来

  天山网记者 任江  浩瀚沙漠、苍茫戈壁、葱郁绿洲、广袤草原、逶迤雪山、湛蓝湖泊、丝路古道、民族风情……充满魅力的新疆,资源极为丰富独特。党的十八大以来,在国家大力支持下,新疆大力推进旅游兴疆战略,旅游精品不断涌现,旅游新业态层出不穷,游客接待量、旅游收入持续增长,“新疆...

淘宝怎么运营?

淘宝怎么运营?

淘宝运营的核心其实是整个项目的运营,需要直接对整个网店或者公司的业绩负责。细分任务主要包括以下六点:1。销售任务完成进度。2.店铺分析。3.竞争对手。4.付费推广数据。5.活动推广。6.流量的扩大。这六点归根结底是要解决的三个关键问题:流量、转化率、用户粘性。 流量:就是把人带到店里。...

inspirr creation – 录像拍摄及後期制作

inspirr creation – 录像拍摄及後期制作

录像拍摄及後期制作 /design-products-service/video-editing-after-effect/ 後期制作於电影制作而言,虽简言之是为画面的影像及声音的结合进行最後的工序,然而,要令画、声出色,其中的工夫可谓非常复杂及专业,涉及的人手, 可数以 百计,不可小觑。当...

熊掌号原创保护关闭。

熊掌号原创保护关闭。

众所周知的原因,很长一段时间没有写熊掌号的文章,但今天对于熊掌号亦或是熊掌ID都是一个“特殊”的日子,如果你长时间跟踪与运营熊掌号,你会有一个深切的感受,那就是熊掌号可能彻底要和我们说再见。 维度是熊掌号的上线,为草根SEOer带来更多不确定性,你说它是“昙花一现”也好,毕竟对于每一个热衷搜索...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片