easypoi 导出word并插入echart图片和文件

这篇具有很好参考价值的文章主要介绍了easypoi 导出word并插入echart图片和文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 pom 文件引入:

<!-- 目前的版本对应  poi 4.1.2   和 xmlbeans 3.1.0   , poi 3.17   和 xmlbeans 2.6.0 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- easypoi导出word -->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-spring-boot-starter</artifactId>
            <version>4.4.0</version>
        </dependency>

二  DownloadReportController 层

/**
     *下载word
     * @param response
     * @throws Exception
     */
    @ApiOperation("下载word")
    @PostMapping("/exportToWord")
    public void exportToWord(HttpServletResponse response, @RequestBody DownloadReportSearchVo downloadReportSearchVo) {
        String secCode = SecurityContextHolder.getUserStockCode();
        HengShenCompanyInfoDto companyInfoDto = remoteBasicService.getCompanyInfoByCode(secCode).getData();
        String companyReferred = companyInfoDto.getCompanyReferred();
        String day = DateUtil.format(new Date(),"yyyyMMdd");
        String wordFileName = companyReferred+"("+secCode+")"+"市值诊断报告_"+day+".docx";
        try {
            downloadReportSearchVo.setSecCode(secCode);
            Map<String, Object> wordInitDataMaps = downloadReportService.exportToWord(downloadReportSearchVo);
            // 前端调用下面初始化word数据方法,下载时候从缓存取word map类型替换数据;
            // Map<String, Object> wordInitDataMaps = redisService.getCacheMap(DOWNLOADREPORT_WORDDATA+secCode);
            //读取模板 并 一次性提交maps里要替换的文字和图片内容,然后导出word;
            XWPFDocument  word = null;
            try {
                word = WordExportUtil.exportWord07(phantomjsRoot+"/市值诊断报告_YYYYMMDD.docx", wordInitDataMaps);
            } catch (Exception e) {
                e.printStackTrace();
            }
            response.setHeader("content-disposition", "attachment;filename="+ URLEncoder.encode(wordFileName,"UTF-8"));
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            ServletOutputStream outputStream = response.getOutputStream();
            word.write(outputStream);
            outputStream.close();
            word.close();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

三 service 层



    @Override
    public Map<String, Object> exportToWord(DownloadReportSearchVo downloadReportSearchVo) {
        String secCode = downloadReportSearchVo.getSecCode();
        Map<String, Object> maps=new HashMap<>();
        // 1-1 诊断结果>市值表现


        // 1-2 诊断结果>流动性情况
        //获取本模块4个echart图形数据和文字描述
        LiquidityAnalysisVO liquidityAnalysisVO = liquiditySituationService.analysisResult(secCode);
        //生成echart图片,并替换图片和文字
        maps = liquiditySituationService.analysisResultToEchartImg(liquidityAnalysisVO,maps);


        // 1-3 诊断结果>股东结构分析


        //2-1 A股市值表现>市值对比

        //2-2 A股市值表现>估值对比

        //2-3 A股市值表现>股价对比


        return maps;
    }



/**
     * 根据原图表数据,封装echart json option 格式,并生成echart图片
     *
     * @param liquidityAnalysisVO
     */
    @Override
    public Map<String, Object> analysisResultToEchartImg(LiquidityAnalysisVO liquidityAnalysisVO, Map<String, Object> maps) {
        List<String> colorList = Arrays.asList("rgb(52,113,219)", "rgb(46,167,224)", "rgb(16,197,121)", "rgb(248,180,0)");

        String suggest = liquidityAnalysisVO.getSuggest();
        String yearAvgSuggest = liquidityAnalysisVO.getYearAvgSuggest();

        // 1 第一张echart图 生成echart option
        //换手率 替换第一张图片和文字
        List<OverviewVO> listYearAvgAnalysis = liquidityAnalysisVO.getYearAvgAnalysis();
        List<String> indexkeyYearAvgAnalysis = listYearAvgAnalysis.stream().map(overviewVO -> overviewVO.getIndexKey()).collect(Collectors.toList());
        List<BigDecimal> indexValueYearAvgAnalysis = listYearAvgAnalysis.stream().map(overviewVO -> overviewVO.getIndexValue()).collect(Collectors.toList());
        maps.put(DownloadReportEnum.DIAGNOSTIC_RESULT_FLOW_SUGGEST.getName(), suggest);
        maps.put(DownloadReportEnum.DIAGNOSTIC_RESULT_FLOW_1_YEARAVGSUGGEST.getName(), yearAvgSuggest.replaceAll("<span>", "").replaceAll("</span>", ""));
        String option = "{\n" +
                "  title: {\n" +
                "    text: '换手率'\n" +
                "  },\n" +
                "  tooltip: {\n" +
                "    trigger: 'axis',\n" +
                "    axisPointer: {\n" +
                "      type: 'shadow'\n" +
                "    }\n" +
                "  },\n" +
                "  legend: {},\n" +
                "  grid: {\n" +
                "    left: '3%',\n" +
                "    right: '4%',\n" +
                "    bottom: '3%',\n" +
                "    containLabel: true\n" +
                "  },\n" +
                "  xAxis: {\n" +
                "    type: 'value',\n" +
                "    boundaryGap: [0, 0.01]\n" +
                "  },\n" +
                "  yAxis: {\n" +
                "    type: 'category',\n" +
                "    data: ['" + StringUtils.join(indexkeyYearAvgAnalysis, "','") + "'] \n" +
                "  },\n" +
                "  series: [\n" +
                "    {\n" +
                "      barWidth:30, " +
                "      name: '当年度年平均换手率(%)',\n" +
                "      type: 'bar',\n" +
                "      data: [ \n ";
        for (int i = 0; i < indexValueYearAvgAnalysis.size(); i++) {
            BigDecimal value = indexValueYearAvgAnalysis.get(i);
            String color = colorList.get(i);
            option += " { " +
                    "value: " + numberUtils.formatToBigDecimal(value) + ", " +
                    "itemStyle: { " +
                    "color: '" + color + "' " +
                    "} " +
                    "}, ";
        }
        option += " ]} \n" +
                "  ]\n" +
                "};\n";
        String echartImgPath1 = eChartImgService.generateEChartImg(option);
        // 2 生成要代替word里图像英文单词字符串
        ImageEntity imageEntity = new ImageEntity();
        imageEntity.setUrl(echartImgPath1);
        imageEntity.setWidth(500);
        imageEntity.setHeight(300);   // 这里的宽高一定要设置,不然图片出不来
        maps.put(DownloadReportEnum.DIAGNOSTIC_RESULT_FLOW_1_IMG1.getName(), imageEntity);//替换图片
}


四: phantomjs 插件生成echart 图片

package com.realize.market.value.service.impl;

import com.realize.market.value.service.IEChartImgService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.*;
import java.util.UUID;

@Service
@Slf4j
public class EChartImgServiceImpl  implements IEChartImgService {

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

    private static  String  phantomjsRoot;
    private static  String  phantomjsWindowPath;
    private static  String  phantomjsLinuxPath;
    private static  String  JSpath;

    @Value("${phantomjs.root}")
    public void setSender(String phantomjs) {
        phantomjsRoot = phantomjs;
        phantomjsWindowPath=phantomjsRoot+"/phantomjs-2.1.1-windows/bin/phantomjs.exe";
        phantomjsLinuxPath=phantomjsRoot+"/phantomjs-2.1.1-linux-x86_64/bin/phantomjs";
        JSpath=phantomjsRoot+"/echarts-convert/echarts-convert1.js";
    }


    @Override
    public  String generateEChartImg(String options) {
        // 1此处可根据操作系统获取对应phantomjs文件路径(phantomjs.exe对应Windows,phantomjs对应Linux)
        String phantomjsPath = "";
        String os = System.getProperty("os.name").toLowerCase();
        if (os.contains("windows")) {
            phantomjsPath = phantomjsWindowPath;
        }else{
            phantomjsPath = phantomjsLinuxPath;
        }
        // 2根据各模块传递过来的 echart  json, 生成服务器本地 echart json文件
        //String inputDataPath = writeLocalJsonFile(options);
        String filename = UUID.randomUUID().toString().replaceAll("-","");
        String inputDataPath=phantomjsRoot+"/data/"+filename+".json";
        try {
            /* 写入json文件 */
            File writename = new File(inputDataPath); // 相对路径,如果没有则要建立一个新的output.json文件
            if (!writename.exists()) {   //文件不存在则创建文件,先创建目录
                File dir = new File(writename.getParent());
                dir.mkdirs();
                writename.createNewFile(); // 创建新文件
            }
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(writename),"utf-8"));
            out.write(options); // \r\n即为换行
            out.flush(); // 把缓存区内容压入文件
            out.close(); // 最后记得关闭文件
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 3读取本地echart json 格式文件生成 echart 图片
        String outfilePath = phantomjsRoot+"/Echart/" +filename+ ".png";
        try {
            File file = new File(outfilePath);     //文件路径(路径+文件名)
            if (!file.exists()) {   //文件不存在则创建文件,先创建目录
                File dir = new File(file.getParent());
                dir.mkdirs();
                file.createNewFile();
            }
            // 执行 phantomjs 插件命令,输入json ,输出echart图片生成;
            String cmd = phantomjsPath+" " + JSpath + " -infile " + inputDataPath + " -outfile " + outfilePath;
            excuteCMDBatFile(cmd,filename);
            //Process process = Runtime.getRuntime().exec(cmd);
            //BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
            //input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            return outfilePath;
        }
    }


    /**
     * 1.将执行的命名写入到sh/cmd文件中,没有用 Runtime 直接执行命令,避免系统阻塞卡顿
     * @param exportFile
     * @param content
     * @return
     */
    public  boolean writeFile(File exportFile,  String content) {
        if (exportFile == null || StringUtils.isEmpty(content)) {
            return false;
        }
        if (!exportFile.exists()) {
            try {
                exportFile.getParentFile().mkdirs();
                exportFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
                logger.error("create local json file exception: " + e.getMessage());
                return false;
            }
        }
        BufferedWriter bufferedWriter = null;
        try {
            FileOutputStream os = new FileOutputStream(exportFile);
            FileDescriptor fd = os.getFD();
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
            bufferedWriter.write(content);
            //Flush the data from the streams and writes into system buffers
            //The data may or may not be written to disk.
            bufferedWriter.flush();
            //block until the system buffers have been written to disk.
            //After this method returns, the data is guaranteed to have
            //been written to disk.
            fd.sync();
            //设置文件权限
            exportFile.setExecutable(true);
            exportFile.setReadable(true);
            exportFile.setWritable(true);
        } catch (UnsupportedEncodingException e) {
            logger.error("saveDBData#catch an UnsupportedEncodingException (" + e.getMessage() + ")");
            return false;
        } catch (FileNotFoundException e) {
            logger.error("saveDBData#catch an FileNotFoundException (" + e.getMessage() + ")");
            return false;
        } catch (IOException e) {
            logger.error("saveDBData#catch an IOException (" + e.getMessage() + ")");
            return false;
        } catch (Exception e) {
            logger.error("saveDBData#catch an exception (" + e.getMessage() + ")");
            return false;
        } finally {
            try {
                if (bufferedWriter != null) {
                    bufferedWriter.close();
                    bufferedWriter = null;
                }
            } catch (IOException e) {
                logger.error("writeJsonToFile#catch an exception (" + e.getMessage() + ")");
            }
        }
        return true;
    }


    //2.执行命令 phantomjs 插件生成echart 图片
    public  boolean excuteCMDBatFile(String cmd,String filename) {
        String os = System.getProperty("os.name").toLowerCase();
        String batFilePath="";
        if (os.contains("windows")) {
             batFilePath = phantomjsRoot+"/data/"+filename+".bat";
        }else{
             batFilePath = phantomjsRoot+"/data/"+filename+".sh";
        }

        final String METHOD_NAME = "excuteCMDBatFile#";
        boolean result = true;
        Process p;
        File batFile = new File(batFilePath);
        //System.out.println(batFile.getAbsolutePath());
        //命令写入bat文件
        boolean isSuccess = writeFile(batFile, cmd);
        if(!isSuccess) {
            logger.error(METHOD_NAME + "write cmd to File failed.");
            return false;
        }

        logger.info("cmd path:" + batFilePath);
        try {
            //执行命令 bat文件
            p = Runtime.getRuntime().exec(batFilePath);
            InputStream fis = p.getErrorStream();//p.getInputStream();
            InputStreamReader isr = new InputStreamReader(fis, System.getProperty("file.encoding"));
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            StringBuilder builder = new StringBuilder();
            while ((line = br.readLine()) != null) {
                builder.append(line);
            }

            p.waitFor();
            int i = p.exitValue();
            logger.info(METHOD_NAME + "exitValue = " + i);
            if (i != 0) {
                result = false;
                logger.error(METHOD_NAME + "excute cmd failed, [result = " + result + ", error message = " + builder.toString() + "]");
                //System.out.println(METHOD_NAME + "excute cmd failed, [result = " + result + ", error message = " + builder.toString() + "]");
            }else {
                // logger.debug(METHOD_NAME + "excute cmd result = " + result);
                System.out.println(METHOD_NAME + "result = " + result);
            }
        } catch (Exception e) {
            result = false;
            e.printStackTrace();
            logger.error(METHOD_NAME + "fail to excute bat File [ErrMsg=" + e.getMessage() + "]");
        }
        return result;
    }

    /*public static void main(String[] args) {
        //String cmd="F:/usr/local/plugin/phantomjs-2.1.1-windows/bin/phantomjs.exe F:/usr/local/plugin/echarts-convert/echarts-convert1.js -infile F:/usr/local/plugin/data/37da9189.json -outfile F:/usr/local/plugin/Echart/37da9189-1.png";
        String cmd="/usr/local/plugin/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/plugin/echarts-convert/echarts-convert1.js -infile /usr/local/plugin/data/37da9189.json -outfile /usr/local/plugin/Echart/37da9189-1.png";

        excuteCMDBatFile(cmd);
    }*/
}

插件包含内容:

1 phantomjs-2.1.1-windows 执行转化图片命令

2 echarts-convert js生成ecahrt 图片

easypoi 导出word并插入echart图片和文件,word

 文章来源地址https://www.toymoban.com/news/detail-517298.html

到了这里,关于easypoi 导出word并插入echart图片和文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用原生POI和EasyPoi根据word模板导出word工具类

    前两天接了个需求,要求将数据导出成word,里边有边个,有其他的东西,怎么说这,这个需求最开始就是上传word,下载附件就行了,非得改成上传数据然后支持下载word。有股脱裤子放屁的感觉 而且呢,当时做的时候前任开发在数据库存了一个巨大的Json文件,解析也挺费劲的

    2024年01月25日
    浏览(58)
  • 【Java Easypoi & Apache poi】 Word导入与导出

            如果这里造成了读取resources下的文件返回前端乱码问题:除了HttpServletResponse响应中设置字体问题,还有可能是因为在编译期文件就已经乱码了,所以需要在pom.xml中增加以下配置。

    2024年02月10日
    浏览(56)
  • 【Easypoi & Apache poi】 Java后端 Word导入与导出

            如果这里造成了读取resources下的文件返回前端乱码问题:除了HttpServletResponse响应中设置字体问题,还有可能是因为在编译期文件就已经乱码了,所以需要在pom.xml中增加以下配置。

    2024年02月11日
    浏览(55)
  • 使用若依框架和 EasyPoi 导出 Word 文档的方法详解

    若依框架是一个基于 Spring Boot 和 Vue 的快速开发平台,而 EasyPoi 是一个方便的 Java 导入导出工具库。本文将介绍如何在若依框架中使用 EasyPoi 导出 Word 文档,帮助你实现简单且高效的导出功能。 首先,我们需要在若依框架中添加 EasyPoi 的依赖。可以通过 Maven 或 Gradle 来管理依

    2024年02月13日
    浏览(129)
  • 用python批量实现文件夹中所有pdf转成图片并插入到一个word文件中

    要实现这个任务,你需要使用Python的几个库: PyPDF2  用于处理PDF文件, python-docx  用于操作Word文件, PIL (或 Pillow )用于处理图片。 首先,确保你已经安装了这些库。如果没有,你可以使用pip来安装: bash复制代码 pip install PyPDF2 python-docx Pillow 接下来是Python脚本的示例代码

    2024年01月16日
    浏览(64)
  • 【业务功能篇47】Springboot+EasyPoi 实现Excel 带图片列的导入导出

    SpringBoot整合EasyPoi实现Excel的导入和导出(带图片)_51CTO博客_springboot easypoi导出excel

    2024年02月16日
    浏览(48)
  • 模板文件导出Excel【EasyPoi实战系列】- 第478篇

    ​历史文章( 文章 累计470+) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 【EasyPoi实战系列】Spring Boot使用Ea

    2024年02月11日
    浏览(60)
  • word插入图片为何无法显示?

    word是我们常用的软件,在使用过程中,我们难免会遇到这样或那样的问题,解决问题的思路我认为首先要找出原因,然后再想办法解决才是最好的方案。 如果在 Word 文档中插入的图片无法显示,可能是以下原因之一: 1. 图片文件已被删除或移动到其他位置。 2. 图片文件格式

    2024年02月08日
    浏览(53)
  • 微信小程序echart导出图片

    echarts版本5.1.0 用到的echarts组件是uni插件市场的echart组件 关键代码是  

    2024年02月10日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包