java word格式 导出图表和表格 浏览器下载 支持生成扇形图,条形图等

1.导入依赖

环境

依赖

Apache的POI、FreeMarker和XDocreport xchart

<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.xdocreport.core</artifactId>
    <version>2.0.2</version>
</dependency>
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.xdocreport.document</artifactId>
    <version>2.0.2</version>
</dependency>
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.xdocreport.template</artifactId>
    <version>2.0.2</version>
</dependency>
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
    <version>2.0.2</version>
</dependency>
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId>
    <version>2.0.2</version>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.23</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.22</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.knowm.xchart</groupId>
    <artifactId>xchart</artifactId>
    <version>3.5.4</version>
</dependency>

2.Word模板

先创建一个模板,模板如下,word模板只能是docx文件,doc文件不支持,会报错。

 

 

3.java代码

模板放到resousces目录下

对应word表格中的字段

package com.example.demo.pojo;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Pojo {


    private int january;

    private int february;

    private int march;

    private int april;

    private int may;

    private int june;

    private int july;

    private int august;

    private int september;

    private int october;

    private int total;


}
@RestController
@RequestMapping(value = "/local-inout", produces = {"application/json;charset=UTF-8"})
public class TestController {


    private static final Logger logger = LoggerFactory.getLogger(TestController.class);

    @RequestMapping
    @ResponseBody
    public void exportWord(HttpServletResponse response) throws IOException, XDocReportException {

        try {
            //获取本地目录的word模板
            InputStream mbwj = this.getClass().getResourceAsStream("/模板.docx");

            //注册xdocreport实例并加载FreeMarker模板引擎
            IXDocReport report = XDocReportRegistry.getRegistry().loadReport(mbwj, TemplateEngineKind.Freemarker);

            //创建xdocreport上下文对象
            IContext context = report.createContext();
            Pojo pojo = Pojo.builder()
                    .january(1)
                    .february(2)
                    .march(3)
                    .april(4)
                    .may(5)
                    .june(6)
                    .july(7)
                    .august(8)
                    .september(9)
                    .october(10)
                    .total(11)
                    .build();

            //将需要替换的数据数据添加到上下文中
            //其中key为word模板中的域名,value是需要替换的值
            context.put("pojo", pojo);
            context.put("auth", "青蛙");
            context.put("date", "2022年11月17日");

            //创建字段元数据,需要表格才加下面这两行,否则不用
            FieldsMetadata fm = report.createFieldsMetadata();
            //Word模板中的表格数据对应的集合类型
            fm.load("pojo", Pojo.class, true);
                    //处理word文档并输出
        String fileName = "统计.docx";
        
        //浏览器下载
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/msword");
        response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名
        report.process(context, response.getOutputStream());

    } catch (IOException e) {
        logger.error("读取Word模板异常", e);
    } catch (XDocReportException e) {
        logger.error("word模板生成失败", e);

    }
    }
}

结果:

4.导出饼状图加上表格

再创建一个模板 随便找一张图片贴到word文档中

Java代码:

@RestController
@RequestMapping(value = "/local-inout", produces = {"application/json;charset=UTF-8"})
public class TestController {


    private static final Logger logger = LoggerFactory.getLogger(TestController.class);

    @RequestMapping
    @ResponseBody
    public void exportWord(HttpServletResponse response) throws IOException, XDocReportException {

        try {
            //获取本地目录的word模板
            InputStream mbwj = this.getClass().getResourceAsStream("/模板.docx");

            //注册xdocreport实例并加载FreeMarker模板引擎
            IXDocReport report = XDocReportRegistry.getRegistry().loadReport(mbwj, TemplateEngineKind.Freemarker);

            //创建xdocreport上下文对象
            IContext context = report.createContext();
            Pojo pojo = Pojo.builder()
                    .january(1)
                    .february(2)
                    .march(3)
                    .april(4)
                    .may(5)
                    .june(6)
                    .july(7)
                    .august(8)
                    .september(9)
                    .october(10)
                    .total(11)
                    .build();

            //将需要替换的数据数据添加到上下文中
            //其中key为word模板中的域名,value是需要替换的值
            context.put("pojo", pojo);
            context.put("auth", "青蛙");
            context.put("date", "2022年11月17日");

            //创建字段元数据,需要表格才加下面这两行,否则不用
            FieldsMetadata fm = report.createFieldsMetadata();
            //Word模板中的表格数据对应的集合类型
            fm.load("pojo", Pojo.class, true);


            //元数据中加入图片
            fm.addFieldAsImage("chart");

            PieChart chart = new PieChartBuilder().width(800).height(620)
                    .title("饼图").build();

            //给饼图设置对应的值
            chart.addSeries("1月", 1);
            chart.addSeries("2月", 2);
            chart.addSeries("3月", 3);
            chart.addSeries("4月", 4);
            chart.addSeries("5月", 5);

            //生成饼图
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            BitmapEncoder.saveBitmap(chart, baos, BitmapEncoder.BitmapFormat.JPG);

            //把饼图添加到上下文对象
            context.put("chart", new ByteArrayImageProvider(baos.toByteArray()));


            //处理word文档并输出
            String fileName = "统计.docx";


            response.setCharacterEncoding("utf-8");
            response.setContentType("application/msword");
            response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名
            report.process(context, response.getOutputStream());

        } catch (IOException e) {
            logger.error("读取Word模板异常", e);
        } catch (XDocReportException e) {
            logger.error("word模板生成失败", e);
}
        }
    }

结果:

5.图片加表格

用上面饼状图加表格的模板就可以

代码

   @RequestMapping("/chart1")
    @ResponseBody
    /**
     * 图片
     */
    public void exportWordPag(@RequestParam("file") MultipartFile file, HttpServletResponse response) throws IOException, XDocReportException {

        //获取Word模板,模板存放路径在项目的resources目录下
        InputStream ins = this.getClass().getResourceAsStream("/模板.docx");
        //注册xdocreport实例并加载FreeMarker模板引擎
        IXDocReport report = XDocReportRegistry.getRegistry().loadReport(ins,
                TemplateEngineKind.Freemarker);
        //创建xdocreport上下文对象
        IContext context = report.createContext();

        FieldsMetadata fm = report.createFieldsMetadata();
        //元数据中加入图片
        fm.addFieldAsImage("chart");

        Pojo pojo = Pojo.builder()
                .january(1)
                .february(2)
                .march(3)
                .april(4)
                .may(5)
                .june(6)
                .july(7)
                .august(8)
                .september(9)
                .october(10)
                .total(11)
                .build();

        //将需要替换的数据数据添加到上下文中
        //其中key为word模板中的域名,value是需要替换的值
        context.put("pojo", pojo);
        context.put("auth", "青蛙");
        context.put("date", "2022年11月17日");

        //Word模板中的表格数据对应的集合类型
        fm.load("pojo", Pojo.class, true);

        //获取图片
        InputStream inputStream = file.getInputStream();
//        InputStream img1 = this.getClass().getResourceAsStream("/11.jpg");

        //把图片添加到上下文对象
        context.put("chart", inputStream);

        String fileName = "统计.docx";

        response.setCharacterEncoding("utf-8");
        response.setContentType("application/msword");
        response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名
        report.process(context, response.getOutputStream());
    }

结果:

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值