Java根据word模板生成word文档并转成PDF文件

news2024/11/25 4:26:13

1. 处理word模板

1.1 定义word模版

word模版

1.2 定义完我们的模板之后,我们要将文档保存为xml的格式

定义完我们的模板之后,我们要将文档保存为xml的格式

在这里插入图片描述

1.3 xml格式化

生成的xml格式看起来比较乱,没有层次感, 所以需要格式化一下

格式化

格式化xml

1.4 修改xml

基础信息的定义

基础信息的定义只要保证我们转化成的xml文件中的${name}等格式没错误即可

在这里插入图片描述
表格的定义

遍历实现,表格的数据填充
在xml文件中我们的 <w:tbl> 代表是我们的表格 ,<w:tr> 代表的是我们的行 ,<w:tc> 代表我们的列
我们要想使用表格的方式,肯定大部分是要使用我们的list集合进行数据填充的,我们可以通过下面的方式进行遍历填充数据
我们在表格的表头下的<w:tr>上添加

<#list TestList as item>

</#list>

在这里插入图片描述
图片的定义

首先我们要在指定位置添加一个图片,我们保存为xml文件后,我们的图片信心会变为base64转码的字符串,将这部分进行删除,替换为${images},所以我们进行填充时也要是base64转码后的数据

在这里插入图片描述

修改xml文件为ftl文件

最后将我们的文件修改为 .ftl 格式的文件复制到我们 templates文件夹下

在这里插入图片描述

2. 生成word文档

2.1 引入依赖

    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.30</version>
    </dependency>

2.2 代码实现

定义我们要填充的数据

  public Map<String,Object> dataMap() throws IOException {
        //获取基础数据
        Map<String , Object> map = new HashMap<>();
        map.put("name","qtt");
        map.put("age","25");
 
        //获取表格数据
        List<Map<String,Object>> bookList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Map<String, Object> map1 = new HashMap<>();
            map1.put("month",i);
            map1.put("income", i);
            map1.put("expense", i +100);
            bookList.add(map1);
        }
        map.put("bookList",bookList);
 
        //获取图片流且进行base64转码
        File file = new File("C:\\Users\\Administrator\\Desktop\\teacher\\01.jpg");
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] bytes = new byte[fileInputStream.available()];
        fileInputStream.read(bytes);
        BASE64Encoder base64Encoder = new BASE64Encoder();
        String encode = base64Encoder.encode(bytes);
        map.put("images",encode);
        //关闭流
        fileInputStream.close();
        
        return map;
    }

定义我们我们的填充方法

public void insertWord() throws IOException, TemplateException {
      //定义我们的编码方式
      Configuration configuration = new Configuration();
      configuration.setDefaultEncoding("UTF-8");

      //指定我们word的目录
      configuration.setDirectoryForTemplateLoading(new File("src/main/resources/templates"));

      //指定我们要使用的word模板.ftl
      Template template = configuration.getTemplate("testModel.ftl", "UTF-8");

      //指定输出流到的位置
      BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("E:/222/demo.doc"), "UTF-8"));

      //执行填充输出
      template.process(this.dataMap(),bufferedWriter);

      //关闭io流
      bufferedWriter.flush();
      bufferedWriter.close();
  }

我们还可以直接定义为下载,不用使用输出流指定下载地址,直接通过下载的方式指定地址

	@GetMapping("/upload")
   public void upload(HttpServletResponse response){
       try {
           //定义我们的编码方式
           Configuration configuration = new Configuration();
           configuration.setDefaultEncoding("UTF-8");
           //指定我们word的目录
           configuration.setDirectoryForTemplateLoading(new File("src/main/resources/templates"));
           //指定我们要使用的word模板.ftl
           Template template = configuration.getTemplate("testModel.ftl", "UTF-8");

           //返回word文档
           SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
           String format = simpleDateFormat.format(new Date());
           String fileName = URLEncoder.encode("接口文档" + format, "UTF-8");
           response.setCharacterEncoding("UTF-8");
           //请求头定义为下载
           response.setHeader("Content-Disposition","attachment;filename="+fileName+".doc");

           //获取apiDoc所需要的数据
           Map<String, Object> map = dataMap();

           //渲染模板
           template.process(map, response.getWriter());
           //response的Writer不需要我们手动关,tomcat会帮我们关的
       } catch (Exception e) {
           log.error("导出word异常:", e);
       }
   }

注意:
1.优为注意:freemarker是不支持 null 的,所以我们的数据要么全部附上值,要么给为空的值设置为 " " ,否则会报错
2.我们在定义表格l遍历填充的时候,一定要注意传入的表格字段类型是list,不能是map,否则会报错

3. java后台生成柱状图图片并存到本地

3.1 引入依赖

<!-- Hutool工具包 -->        
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.6.2</version>
</dependency>
<!-- JFreeChart图表库 -->
<dependency>
    <groupId>org.jfree</groupId>
    <artifactId>jfreechart</artifactId>
    <version>1.5.3</version>
</dependency>

3.2 系统字体

复制一下, 粘贴到项目中

在这里插入图片描述

3.3 默认字体位置

在这里插入图片描述

3.4 代码

3.4.1 JFreeChart工具类

package com.util;
 
import cn.hutool.core.util.StrUtil;
import org.jfree.chart.*;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.*;
import org.jfree.chart.plot.*;
import org.jfree.chart.renderer.category.*;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.ui.*;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.springframework.core.io.ClassPathResource;
 
import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.text.NumberFormat;
import java.util.List;
 
/**
 * JFreeChart工具类
 */
public class JFreeChartUtil {
    public static String NO_DATA_MSG = "数据加载失败";
 
    /**
     * 生成主题
     *
     * @param fontName 字体名称(默认为宋体)
     * @return
     */
    public static StandardChartTheme createChartTheme(String fontName) throws Exception {
        StandardChartTheme theme = new StandardChartTheme("unicode") {
            public void apply(JFreeChart chart) {
                chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,
                        RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
                super.apply(chart);
            }
        };
        theme.setExtraLargeFont(getDefaultFont(Font.PLAIN, 20f));
        theme.setLargeFont(getDefaultFont(Font.PLAIN, 14f));
        theme.setRegularFont(getDefaultFont(Font.PLAIN, 12f));
        theme.setSmallFont(getDefaultFont(Font.PLAIN, 10f));
        return theme;
    }
 
    /**
     * 获取默认字体
     *
     * @param style
     * @param size  字体大小
     * @return
     * @throws Exception
     */
    public static Font getDefaultFont(int style, Float size) throws Exception {
        //获取宋体文件
        File defaultFontFile = new ClassPathResource("/font/simsun.ttc").getFile();
        Font defaultFont = Font.createFont(Font.TRUETYPE_FONT, defaultFontFile);
        defaultFont = defaultFont.deriveFont(style, size);
        return defaultFont;
    }
 
    /**
     * 创建饼图数据集合
     *
     * @param legendNameList 图例名称列表
     * @param dataList       数据列表
     * @return
     */
    public static DefaultPieDataset createDefaultPieDataset(List<String> legendNameList, List<Object> dataList) {
        DefaultPieDataset dataset = new DefaultPieDataset();
        //图例名称列表或数据列表为空
        if (legendNameList == null || legendNameList.size() <= 0 || dataList == null || dataList.size() <= 0) {
            return dataset;
        }
        for (int i = 0; i < legendNameList.size() && legendNameList.size() == dataList.size(); i++) {
            String value = dataList.get(i).toString();
            dataset.setValue(legendNameList.get(i), Double.valueOf(value));
        }
        return dataset;
    }
 
    /**
     * 设置饼状图渲染
     */
    public static void setPieRender(Plot plot) {
        plot.setNoDataMessage(NO_DATA_MSG);
        plot.setInsets(new RectangleInsets(10, 10, 5, 10));
        PiePlot piePlot = (PiePlot) plot;
        piePlot.setInsets(new RectangleInsets(0, 0, 0, 0));
        piePlot.setCircular(true);// 圆形
 
        // 简单标签
        piePlot.setLabelGap(0.01);
        piePlot.setInteriorGap(0.05D);
        // 图例形状
        piePlot.setLegendItemShape(new Rectangle(10, 10));
        piePlot.setIgnoreNullValues(true);
        // 去掉标签背景色
        piePlot.setLabelBackgroundPaint(null);
        //去掉图表背景颜色
        piePlot.setBackgroundPaint(null);
        // 去掉阴影
        piePlot.setLabelShadowPaint(null);
        // 去掉边框
        piePlot.setLabelOutlinePaint(null);
        piePlot.setShadowPaint(null);
        // 显示标签数据
        piePlot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}:{2}"));
    }
 
    /**
     * 创建类别数据集合(柱形图、折线图)
     *
     * @param legendNameList 图例名称列表
     * @param xAxisNameList  x轴名称列表
     * @param dataList       数据列表
     * @return
     */
    public static DefaultCategoryDataset createDefaultCategoryDataset(List<String> legendNameList, List<String> xAxisNameList
            , List<List<Object>> dataList) {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        //图例名称列表、x轴名称列表或数据列表为空
        if (xAxisNameList == null || xAxisNameList.size() <= 0 || legendNameList == null || legendNameList.size() <= 0
                || dataList == null || dataList.size() <= 0) {
            return dataset;
        }
        for (int yAxisIndex = 0; yAxisIndex < legendNameList.size() && legendNameList.size() == dataList.size(); yAxisIndex++) {
            String legendName = legendNameList.get(yAxisIndex);
            List<Object> rowList = dataList.get(yAxisIndex);
            //该组数据不存在或该组数据总数不等于x轴数据数量
            if (rowList == null || rowList.size() != xAxisNameList.size()) {
                continue;
            }
            for (int xAxisIndex = 0; xAxisIndex < rowList.size(); xAxisIndex++) {
                String value = rowList.get(xAxisIndex).toString();
                dataset.setValue(Double.parseDouble(value), legendName, xAxisNameList.get(xAxisIndex));
            }
        }
        return dataset;
    }
 
    /**
     * 设置柱状图渲染
     *
     * @param plot
     * @param isShowDataLabels 显示数据值标记
     */
    public static void setBarRenderer(CategoryPlot plot, boolean isShowDataLabels) {
        plot.setNoDataMessage(NO_DATA_MSG);
        plot.setInsets(new RectangleInsets(10, 10, 5, 10));
        BarRenderer renderer = (BarRenderer) plot.getRenderer();
        // 设置柱子最大宽度
        renderer.setMaximumBarWidth(0.175);
        //设置图表背景颜色(透明)
        plot.setBackgroundPaint(null);
        //显示数据值标记
        if (isShowDataLabels) {
            renderer.setDefaultItemLabelsVisible(true);
        }
        renderer.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        //注意:此句很关键,若无此句,那数字的显示会被覆盖,给人数字没有显示出来的问题
        renderer.setDefaultPositiveItemLabelPosition(new ItemLabelPosition(
                ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_CENTER));
 
        setXAixs(plot);
        setYAixs(plot);
    }
 
    /**
     * 设置折线图样式
     *
     * @param plot
     * @param isShowDataLabels 是否显示数据标签
     * @param isShapesVisible  是否显示数据点
     */
    public static void setLineRender(CategoryPlot plot, boolean isShowDataLabels, boolean isShapesVisible) {
        plot.setNoDataMessage(NO_DATA_MSG);
        plot.setInsets(new RectangleInsets(10, 10, 0, 10), false);
        LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
        //设置图表背景颜色(透明)
        plot.setBackgroundPaint(null);
        renderer.setDefaultStroke(new BasicStroke(1.5F));
        //显示数据标签
        if (isShowDataLabels) {
            renderer.setDefaultItemLabelsVisible(true);
            renderer.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator(StandardCategoryItemLabelGenerator.DEFAULT_LABEL_FORMAT_STRING,
                    NumberFormat.getInstance()));
            // 位置
            renderer.setDefaultPositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE1, TextAnchor.BOTTOM_CENTER));
        }
        // 数据点绘制形状
        renderer.setDefaultShapesVisible(isShapesVisible);
        setXAixs(plot);
        setYAixs(plot);
 
    }
 
    /**
     * 设置散点图样式
     *
     * @param plot
     */
    public static void setScatterRender(XYPlot plot) {
        plot.setNoDataMessage(NO_DATA_MSG);
        plot.setInsets(new RectangleInsets(10, 10, 0, 10), false);
        //设置图表背景颜色(透明)
        plot.setBackgroundPaint(null);
        setXAixs(plot);
        setYAixs(plot);
    }
 
    /**
     * 设置类别图表(CategoryPlot) X坐标轴线条颜色和样式
     *
     * @param plot
     */
    public static void setXAixs(CategoryPlot plot) {
        Color lineColor = new Color(31, 121, 170);
        // X坐标轴颜色
        plot.getDomainAxis().setAxisLinePaint(lineColor);
        // X坐标轴标记|竖线颜色
        plot.getDomainAxis().setTickMarkPaint(lineColor);
 
    }
 
    /**
     * 设置图表(XYPlot) X坐标轴线条颜色和样式
     *
     * @param plot
     */
    public static void setXAixs(XYPlot plot) {
        Color lineColor = new Color(31, 121, 170);
        // X坐标轴颜色
        plot.getDomainAxis().setAxisLinePaint(lineColor);
        // X坐标轴标记|竖线颜色
        plot.getDomainAxis().setTickMarkPaint(lineColor);
        // x轴网格线条
        plot.setDomainGridlinePaint(new Color(192, 192, 192));
    }
 
    /**
     * 设置类别图表(CategoryPlot) Y坐标轴线条颜色和样式 同时防止数据无法显示
     *
     * @param plot
     */
    public static void setYAixs(CategoryPlot plot) {
        Color lineColor = new Color(192, 208, 224);
        ValueAxis axis = plot.getRangeAxis();
        // Y坐标轴颜色
        axis.setAxisLinePaint(lineColor);
        // Y坐标轴标记|竖线颜色
        axis.setTickMarkPaint(lineColor);
        // 隐藏Y刻度
        axis.setAxisLineVisible(false);
        axis.setTickMarksVisible(false);
        // Y轴网格线条
        plot.setRangeGridlinePaint(new Color(192, 192, 192));
        plot.setRangeGridlineStroke(new BasicStroke(1));
        // 设置顶部Y坐标轴间距,防止数据无法显示
        plot.getRangeAxis().setUpperMargin(0.1);
        // 设置底部Y坐标轴间距
        plot.getRangeAxis().setLowerMargin(0.1);
 
    }
 
    /**
     * 设置图表(XYPlot) Y坐标轴线条颜色和样式 同时防止数据无法显示
     *
     * @param plot
     */
    public static void setYAixs(XYPlot plot) {
        Color lineColor = new Color(192, 208, 224);
        ValueAxis axis = plot.getRangeAxis();
        // Y坐标轴颜色
        axis.setAxisLinePaint(lineColor);
        // Y坐标轴标记|竖线颜色
        axis.setTickMarkPaint(lineColor);
        // 隐藏Y刻度
        axis.setAxisLineVisible(false);
        axis.setTickMarksVisible(false);
        // Y轴网格线条
        plot.setRangeGridlinePaint(new Color(192, 192, 192));
        // 设置顶部Y坐标轴间距,防止数据无法显示
        plot.getRangeAxis().setUpperMargin(0.1);
        // 设置底部Y坐标轴间距
        plot.getRangeAxis().setLowerMargin(0.1);
    }
 
}

3.4.2 GenerateChartUtil图表生成工具类

package com.jfreechart;
 
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtils;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.ui.RectangleEdge;
import org.jfree.chart.ui.TextAnchor;
import org.jfree.chart.util.Rotation;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.xy.XYDataset;
 
import java.awt.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.List;
 
/**
 * 图表生成工具类
 */
public class GenerateChartUtil {
 
    /**
     * 生成柱状图(返回JFreeChart)
     *
     * @param chartTitle     图表标题
     * @param legendNameList 图例名称列表
     * @param xAxisNameList  x轴名称列表
     * @param dataList       数据列表
     * @param theme          主题(null代表默认主题)
     * @param yAxisTitle     y轴标题
     * @param xAxisTitle     x轴标题
     * @param yAxisMinValue   y轴最小值(可以为空)
     * @param yAxisMaxValue   y轴最大值(可以为空)
     * @param legendColorList 图例背景颜色(可以为空)
     * @param barLabelVisible 是否显示柱体标签(可以为空)
     * @param barLabelFormat  柱体标签格式(可以为空)
     * @return
     */
    public static JFreeChart createBarChart(String chartTitle, List<String> legendNameList, List<String> xAxisNameList
            , List<List<Object>> dataList, StandardChartTheme theme, String yAxisTitle, String xAxisTitle, Double yAxisMinValue
            , Double yAxisMaxValue, List<Color> legendColorList, Boolean barLabelVisible, String barLabelFormat) {
        //设置主题,防止中文乱码
        theme = theme == null ? JFreeChartUtil.createChartTheme("") : theme;
        ChartFactory.setChartTheme(theme);
        //创建柱状图
        JFreeChart chart = ChartFactory.createBarChart(chartTitle, xAxisTitle, yAxisTitle
                , JFreeChartUtil.createDefaultCategoryDataset(legendNameList, xAxisNameList, dataList));
        // 设置抗锯齿,防止字体显示不清楚
        chart.setTextAntiAlias(false);
        // 对柱子进行渲染
        JFreeChartUtil.setBarRenderer(chart.getCategoryPlot(), true);CategoryPlot plot = (CategoryPlot) chart.getPlot();
        CategoryAxis categoryAxis = plot.getDomainAxis();
        // 最大换行数
        categoryAxis.setMaximumCategoryLabelLines(10);
        //y轴
        ValueAxis valueAxis = chart.getCategoryPlot().getRangeAxis();
        if (yAxisMinValue != null) {
            valueAxis.setLowerBound(yAxisMinValue);
        }
        if (yAxisMaxValue != null) {
            valueAxis.setUpperBound(yAxisMaxValue);
        }
        CategoryItemRenderer customBarRenderer = plot.getRenderer();
        //显示每个柱的数值
        if (barLabelVisible != null) {
            customBarRenderer.setDefaultItemLabelsVisible(barLabelVisible);
            //柱体数值格式
            if (StrUtil.isNotEmpty(barLabelFormat)) {
                customBarRenderer.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator(barLabelFormat, NumberFormat.getInstance()));
            }
        }
        //设置系列柱体背景颜色
        if (CollectionUtil.isNotEmpty(legendColorList)) {
            for (int i = 0; i < legendNameList.size() && i < legendColorList.size(); i++) {
                Color color = legendColorList.get(i);
                if (color == null) {
                    continue;
                }
                customBarRenderer.setSeriesPaint(i, color);
            }
        }
        // 设置标注无边框
        chart.getLegend().setFrame(new BlockBorder(Color.WHITE));
        // 标注位于上侧
        chart.getLegend().setPosition(RectangleEdge.TOP);
        return chart;
    }
 
    /**
     * 生成柱状图(返回outputStream)
     *
     * @param chartTitle     图表标题
     * @param legendNameList 图例名称列表
     * @param xAxisNameList  x轴名称列表
     * @param dataList       数据列表
     * @param theme          主题(null代表默认主题)
     * @param yAxisTitle     y轴标题
     * @param xAxisTitle     x轴标题
     * @param outputStream   输出流
     * @param width          宽度
     * @param height         高度
     * @param yAxisMinValue   y轴最小值(可以为空)
     * @param yAxisMaxValue   y轴最大值(可以为空)
     * @param legendColorList 图例背景颜色(可以为空)
     * @param barLabelVisible 是否显示柱体标签(可以为空)
     * @param barLabelFormat  柱体标签格式(可以为空)
     * @return
     */
    public static void createBarChart(OutputStream outputStream, String chartTitle, List<String> legendNameList, List<String> xAxisNameList
            , List<List<Object>> dataList, StandardChartTheme theme, String yAxisTitle, String xAxisTitle, int width, int height
            , Double yAxisMinValue, Double yAxisMaxValue, List<Color> legendColorList, Boolean barLabelVisible, String barLabelFormat) {
        JFreeChart chart = createBarChart(chartTitle, legendNameList, xAxisNameList, dataList, theme, yAxisTitle, xAxisTitle
                , yAxisMinValue, yAxisMaxValue, legendColorList, barLabelVisible, barLabelFormat);
        try {
            ChartUtils.writeChartAsJPEG(outputStream, 1.0f, chart, width, height, null);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 生成柱状图(返回byte[])
     *
     * @param chartTitle     图表标题
     * @param legendNameList 图例名称列表
     * @param xAxisNameList  x轴名称列表
     * @param dataList       数据列表
     * @param theme          主题(null代表默认主题)
     * @param yAxisTitle     y轴标题
     * @param xAxisTitle     x轴标题
     * @param width          宽度
     * @param height         高度
     * @param yAxisMinValue   y轴最小值(可以为空)
     * @param yAxisMaxValue   y轴最大值(可以为空)
     * @param legendColorList 图例背景颜色(可以为空)
     * @param barLabelVisible 是否显示柱体标签(可以为空)
     * @param barLabelFormat  柱体标签格式(可以为空)
     * @return
     */
    public static byte[] createBarChart(String chartTitle, List<String> legendNameList, List<String> xAxisNameList
            , List<List<Object>> dataList, StandardChartTheme theme, String yAxisTitle, String xAxisTitle, int width, int height
            , Double yAxisMinValue , Double yAxisMaxValue, List<Color> legendColorList, Boolean barLabelVisible, String barLabelFormat) {
        ByteArrayOutputStream bas = new ByteArrayOutputStream();
        createBarChart(bas, chartTitle, legendNameList, xAxisNameList, dataList, theme, yAxisTitle, xAxisTitle, width, height
                , yAxisMinValue, yAxisMaxValue, legendColorList, barLabelVisible, barLabelFormat);
        byte[] byteArray = bas.toByteArray();
        return byteArray;
    }
 
    /**
     * 生成柱堆叠状图(返回JFreeChart)
     *
     * @param chartTitle     图表标题
     * @param legendNameList 图例名称列表
     * @param xAxisNameList  x轴名称列表
     * @param dataList       数据列表
     * @param theme          主题(null代表默认主题)
     * @param yAxisTitle     y轴标题
     * @param xAxisTitle     x轴标题
     * @return
     */
    public static JFreeChart createStackedBarChart(String chartTitle, List<String> legendNameList, List<String> xAxisNameList
            , List<List<Object>> dataList, StandardChartTheme theme, String yAxisTitle, String xAxisTitle) {
        //设置主题,防止中文乱码
        theme = theme == null ? JFreeChartUtil.createChartTheme("") : theme;
        ChartFactory.setChartTheme(theme);
        //创建堆叠柱状图
        JFreeChart chart = ChartFactory.createStackedBarChart(chartTitle, xAxisTitle, yAxisTitle
                , JFreeChartUtil.createDefaultCategoryDataset(legendNameList, xAxisNameList, dataList));
        // 设置抗锯齿,防止字体显示不清楚
        chart.setTextAntiAlias(false);
        // 对柱子进行渲染
        JFreeChartUtil.setBarRenderer(chart.getCategoryPlot(), true);
        // 设置标注无边框
        chart.getLegend().setFrame(new BlockBorder(Color.WHITE));
        // 标注位于上侧
        chart.getLegend().setPosition(RectangleEdge.TOP);
        return chart;
    }
 
    /**
     * 生成堆叠柱状图(返回outputStream)
     *
     * @param chartTitle     图表标题
     * @param legendNameList 图例名称列表
     * @param xAxisNameList  x轴名称列表
     * @param dataList       数据列表
     * @param theme          主题(null代表默认主题)
     * @param yAxisTitle     y轴标题
     * @param xAxisTitle     x轴标题
     * @param outputStream   输出流
     * @param width          宽度
     * @param height         高度
     * @return
     */
    public static void createStackedBarChart(OutputStream outputStream, String chartTitle, List<String> legendNameList, List<String> xAxisNameList
            , List<List<Object>> dataList, StandardChartTheme theme, String yAxisTitle, String xAxisTitle, int width, int height
    ) {
        JFreeChart chart = createStackedBarChart(chartTitle, legendNameList, xAxisNameList, dataList, theme, yAxisTitle, xAxisTitle);
        try {
            ChartUtils.writeChartAsJPEG(outputStream, 1.0f, chart, width, height, null);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 生成堆叠柱状图(返回byte[])
     *
     * @param chartTitle     图表标题
     * @param legendNameList 图例名称列表
     * @param xAxisNameList  x轴名称列表
     * @param dataList       数据列表
     * @param theme          主题(null代表默认主题)
     * @param yAxisTitle     y轴标题
     * @param xAxisTitle     x轴标题
     * @param width          宽度
     * @param height         高度
     * @return
     */
    public static byte[] createStackedBarChart(String chartTitle, List<String> legendNameList, List<String> xAxisNameList
            , List<List<Object>> dataList, StandardChartTheme theme, String yAxisTitle, String xAxisTitle, int width, int height) {
        ByteArrayOutputStream bas = new ByteArrayOutputStream();
        createStackedBarChart(bas, chartTitle, legendNameList, xAxisNameList, dataList, theme, yAxisTitle, xAxisTitle, width, height);
        byte[] byteArray = bas.toByteArray();
        return byteArray;
    }
 
    /**
     * 生成折线图(返回JFreeChart)
     *
     * @param chartTitle     图表标题
     * @param legendNameList 图例名称列表
     * @param xAxisNameList  x轴名称列表
     * @param dataList       数据列表
     * @param theme          主题(null代表默认主题)
     * @param yAxisTitle     y轴标题
     * @param xAxisTitle     x轴标题
     * @return
     */
    public static JFreeChart createLineChart(String chartTitle, List<String> legendNameList, List<String> xAxisNameList
            , List<List<Object>> dataList, StandardChartTheme theme, String yAxisTitle, String xAxisTitle) {
        //设置主题,防止中文乱码
        theme = theme == null ? JFreeChartUtil.createChartTheme("") : theme;
        ChartFactory.setChartTheme(theme);
        //创建折线图
        JFreeChart chart = ChartFactory.createLineChart(chartTitle, xAxisTitle, yAxisTitle
                , JFreeChartUtil.createDefaultCategoryDataset(legendNameList, xAxisNameList, dataList));
        // 设置抗锯齿,防止字体显示不清楚
        chart.setTextAntiAlias(false);
        // 对折现进行渲染
        JFreeChartUtil.setLineRender(chart.getCategoryPlot(), true, true);
        // 设置标注无边框
        chart.getLegend().setFrame(new BlockBorder(Color.WHITE));
        // 标注位于上侧
        chart.getLegend().setPosition(RectangleEdge.TOP);
        return chart;
    }
 
    /**
     * 生成折线图(返回outputStream)
     *
     * @param chartTitle     图表标题
     * @param legendNameList 图例名称列表
     * @param xAxisNameList  x轴名称列表
     * @param dataList       数据列表
     * @param theme          主题(null代表默认主题)
     * @param yAxisTitle     y轴标题
     * @param xAxisTitle     x轴标题
     * @param outputStream   输出流
     * @param width          宽度
     * @param height         高度
     * @return
     */
    public static void createLineChart(OutputStream outputStream, String chartTitle, List<String> legendNameList, List<String> xAxisNameList
            , List<List<Object>> dataList, StandardChartTheme theme, String yAxisTitle, String xAxisTitle, int width, int height
    ) {
        JFreeChart chart = createLineChart(chartTitle, legendNameList, xAxisNameList, dataList, theme, yAxisTitle, xAxisTitle);
        try {
            ChartUtils.writeChartAsJPEG(outputStream, 1.0f, chart, width, height, null);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 生成折线图(返回byte[])
     *
     * @param chartTitle     图表标题
     * @param legendNameList 图例名称列表
     * @param xAxisNameList  x轴名称列表
     * @param dataList       数据列表
     * @param theme          主题(null代表默认主题)
     * @param yAxisTitle     y轴标题
     * @param xAxisTitle     x轴标题
     * @param width          宽度
     * @param height         高度
     * @return
     */
    public static byte[] createLineChart(String chartTitle, List<String> legendNameList, List<String> xAxisNameList
            , List<List<Object>> dataList, StandardChartTheme theme, String yAxisTitle, String xAxisTitle, int width, int height) {
        ByteArrayOutputStream bas = new ByteArrayOutputStream();
        createLineChart(bas, chartTitle, legendNameList, xAxisNameList, dataList, theme, yAxisTitle, xAxisTitle, width, height);
        byte[] byteArray = bas.toByteArray();
        return byteArray;
    }
 
    /**
     * 生成散点图(返回JFreeChart)
     *
     * @param chartTitle 图表标题
     * @param dataset    数据集
     * @param theme      主题(null代表默认主题)
     * @param yAxisTitle y轴标题
     * @param xAxisTitle x轴标题
     * @return
     */
    public static JFreeChart createScatterPlot(String chartTitle
            , XYDataset dataset, StandardChartTheme theme, String yAxisTitle, String xAxisTitle) {
        //设置主题,防止中文乱码
        theme = theme == null ? JFreeChartUtil.createChartTheme("") : theme;
        ChartFactory.setChartTheme(theme);
        //创建散点图
        JFreeChart chart = ChartFactory.createScatterPlot(chartTitle, xAxisTitle, yAxisTitle
                , dataset);
        // 设置抗锯齿,防止字体显示不清楚
        chart.setTextAntiAlias(false);
        //散点图渲染
        JFreeChartUtil.setScatterRender(chart.getXYPlot());
        // 设置标注无边框
        chart.getLegend().setFrame(new BlockBorder(Color.WHITE));
        // 标注位于上侧
        chart.getLegend().setPosition(RectangleEdge.TOP);
        return chart;
    }
 
    /**
     * 生成散点图(返回outputStream)
     *
     * @param chartTitle   图表标题
     * @param dataset      数据集
     * @param theme        主题(null代表默认主题)
     * @param yAxisTitle   y轴标题
     * @param xAxisTitle   x轴标题
     * @param outputStream 输出流
     * @param width        宽度
     * @param height       高度
     * @return
     */
    public static void createScatterPlot(OutputStream outputStream, String chartTitle, XYDataset dataset, StandardChartTheme theme
            , String yAxisTitle, String xAxisTitle, int width, int height
    ) {
        JFreeChart chart = createScatterPlot(chartTitle, dataset, theme, yAxisTitle, xAxisTitle);
        try {
            ChartUtils.writeChartAsJPEG(outputStream, 1.0f, chart, width, height, null);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 生成散点图(返回byte[])
     *
     * @param chartTitle 图表标题
     * @param dataset    数据集
     * @param theme      主题(null代表默认主题)
     * @param yAxisTitle y轴标题
     * @param xAxisTitle x轴标题
     * @param width      宽度
     * @param height     高度
     * @return
     */
    public static byte[] createScatterPlot(String chartTitle, XYDataset dataset, StandardChartTheme theme, String yAxisTitle
            , String xAxisTitle, int width, int height) {
        ByteArrayOutputStream bas = new ByteArrayOutputStream();
        createScatterPlot(bas, chartTitle, dataset, theme, yAxisTitle, xAxisTitle, width, height);
        byte[] byteArray = bas.toByteArray();
        return byteArray;
    }
}

3.4.3 chart图示列

3.4.3.1 饼图

在这里插入图片描述

3.4.3.2 3D饼图

在这里插入图片描述

3.4.3.3 柱状图调试代码一

/**
    * 柱状图
    *
    * @param response
    */
   @GetMapping("/barChart")
   public void barChart(HttpServletResponse response) throws IOException {
       //x轴名称列表
       List<String> xAxisNameList = new ArrayList<>(Arrays.asList("一级", "二级", "三级", "四级", "五级"));
       //图例名称列表
       List<String> legendNameList = new ArrayList<>(Arrays.asList("李四", "张三"));
       //数据列表
       List<List<Object>> dataList = new ArrayList<>();
       dataList.add(new ArrayList<>(Arrays.asList(100, 90, 5, 6, 2)));
       dataList.add(new ArrayList<>(Arrays.asList(2, 0, 3, 4, 5)));
       //图例背景颜色
       List<Color> legendColorList = new ArrayList<>(Arrays.asList(new Color(65, 105, 225)));
       GenerateChartUtil.createBarChart(response.getOutputStream(), "各级变化图", legendNameList, xAxisNameList
               , dataList, JFreeChartUtil.createChartTheme("宋体"), "y轴", "x轴"
               , 600, 400, 0d, 100d, legendColorList, true, "{2}%");
   }

在这里插入图片描述

3.4.3.4 柱状图调试代码二

public static void main(String[] args) throws Exception {
        //x轴名称列表
        List<String> xAxisNameList = new ArrayList<>(Arrays.asList("一级", "二级", "三级", "四级", "五级"));
        //图例名称列表
        List<String> legendNameList = new ArrayList<>(Arrays.asList("电压"));
        //数据列表
        List<List<Object>> dataList = new ArrayList<>();
        dataList.add(new ArrayList<>(Arrays.asList(100, 90, 5, 6, 2)));
        //图例背景颜色
        //指定输出流到的位置
        OutputStream os = new FileOutputStream("1.png");
        List<Color> legendColorList = new ArrayList<>(Arrays.asList(new Color(81, 86, 225)));
        GenerateChartUtil.createBarChart(os, "", legendNameList, xAxisNameList
                , dataList, JFreeChartUtil.createChartTheme("宋体"), "电压(mV)", "质量数"
                , 600, 400, 0d, 100d, legendColorList, true, "");
    }

在这里插入图片描述

3.4.3.5 堆叠柱状图调试代码

/**
    * 堆叠柱状图
    *
    * @param response
    */
   @GetMapping("/stackedBarChart")
   public void stackedBarChart(HttpServletResponse response) throws IOException {
       //x轴名称列表
       List<String> xAxisNameList = new ArrayList<>(Arrays.asList("一级", "二级", "三级", "四级", "五级"));
       //图例名称列表
       List<String> legendNameList = new ArrayList<>(Arrays.asList("李四", "张三"));
       //数据列表
       List<List<Object>> dataList = new ArrayList<>();
       dataList.add(new ArrayList<>(Arrays.asList(1, 3, 5, 6, 2)));
       dataList.add(new ArrayList<>(Arrays.asList(2, 1, 3, 4, 5)));
       GenerateChartUtil.createStackedBarChart(response.getOutputStream(), "各级变化图", legendNameList, xAxisNameList
               , dataList, JFreeChartUtil.createChartTheme("宋体"), "y轴", "x轴", 600, 400);
   }

在这里插入图片描述

3.4.3.6 折线图调试代码

/**
    * 折线图
    *
    * @param response
    */
   @GetMapping("/lineChart")
   public void lineChart(HttpServletResponse response) throws IOException {
       //x轴名称列表
       List<String> xAxisNameList = new ArrayList<>(Arrays.asList("一级", "二级", "三级", "四级", "五级"));
       //图例名称列表
       List<String> legendNameList = new ArrayList<>(Arrays.asList("李四", "张三"));
       //数据列表
       List<List<Object>> dataList = new ArrayList<>();
       dataList.add(new ArrayList<>(Arrays.asList(1, 3, 5, 6, 2)));
       dataList.add(new ArrayList<>(Arrays.asList(2, 1, 3, 4, 5)));
       GenerateChartUtil.createLineChart(response.getOutputStream(), "各级变化图", legendNameList, xAxisNameList
               , dataList, JFreeChartUtil.createChartTheme("宋体"), "y轴", "x轴", 600, 400);
   } 

在这里插入图片描述

3.4.3.7 散点图调试代码

   /**
    * 散点图
    *
    * @param response
    */
   @GetMapping("/scatterPlot")
   public void scatterPlot(HttpServletResponse response) throws IOException {
       //设置散点图数据集
       //设置第一个
       XYSeries firefox = new XYSeries("Firefox");
       firefox.add(1.0, 1.0);
       firefox.add(2.0, 4.0);
       firefox.add(3.0, 3.0);
       //设置第二个
       XYSeries chrome = new XYSeries("Chrome");
       chrome.add(1.0, 4.0);
       chrome.add(2.0, 5.0);
       chrome.add(3.0, 6.0);
       //设置第三个
       XYSeries ie = new XYSeries("IE");
       ie.add(3.0, 4.0);
       ie.add(4.0, 5.0);
       ie.add(5.0, 4.0);
       //添加到数据集
       XYSeriesCollection dataset = new XYSeriesCollection();
       dataset.addSeries(firefox);
       dataset.addSeries(chrome);
       dataset.addSeries(ie);
       GenerateChartUtil.createScatterPlot(response.getOutputStream(), "各级变化图", dataset
               , JFreeChartUtil.createChartTheme("宋体"), "y轴", "x轴", 600, 400);
   }

在这里插入图片描述

4. word文档转PDF

4.1 引入依赖

<!--word 转 pdf-->
      <dependency>
          <groupId>com.documents4j</groupId>
          <artifactId>documents4j-local</artifactId>
          <version>1.0.3</version>
      </dependency>
      <dependency>
          <groupId>com.documents4j</groupId>
          <artifactId>documents4j-transformer-msoffice-word</artifactId>
          <version>1.0.3</version>
      </dependency>

4.2 代码

public class WordToPdf {
    public static void word2pdf(String wordPath, String pdfPath) throws IOException {
        InputStream docxInputStream = null;
        OutputStream outputStream = null;
        try {
            // 原word地址
            docxInputStream = new FileInputStream(wordPath);
            // 转换后pdf生成地址
            outputStream = new FileOutputStream(pdfPath);
            IConverter converter = LocalConverter.builder().build();
            converter.convert(docxInputStream)
                    .as(DocumentType.DOCX)
                    .to(outputStream)
                    .as(DocumentType.PDF).execute();
            // 关闭
            converter.shutDown();
            // 关闭
            outputStream.close();
            // 关闭
            docxInputStream.close();
        } catch (Exception e) {
            System.out.println("[documents4J] word转pdf失败:" + e.toString());
        } finally {
            if (outputStream != null) {
                outputStream.close();
            }
            if (docxInputStream != null) {
                docxInputStream.close();
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/667067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TestNG官方文档中文版

TestNG官方文档中文版(1) -介绍 T e s t NG 的 官 方 文 档 请 见 :http://testng.org/doc/documentation-main.html 1 介绍 T e s t N G 是 一 个 设 计 用 来 简 化 广 泛 的 测 试 需 求 的 测 试 框 架 &#xff0c; 从 单 元 测 试 (隔 离测试- 个类)到集成测试(测试由有…

Visio2013绘制任意曲线

曲线上蓝色的‘弯曲点‘&#xff0c;随着拉伸曲线&#xff0c;它自己会增减&#xff0c;这里要和’连接点‘区分开&#xff0c;连接点是用来连接别的图形的。

git通过ssh代理连接github(gitee不支持),并更改端口

文章目录 需求github使用ssh代理的方案gitee无法实现ssh代理gitee的暂时解决方案 参考 需求 git clone github/gitee远程仓库&#xff0c;使用ssh协议&#xff0c;并且走本地的http代理(端口3128)。 运行环境是Ubuntu 20.04。 github使用ssh代理的方案 修改~/.ssh/config文…

解决containerd+k8s集群搭建镜像拉取不到的问题

解决containerdk8s集群搭建镜像拉取不到的问题 下载离线镜像导入镜像初始化集群安装calico插件安装MetalLB部署一个nginx应用并暴露端口 之前我写了一篇containerdk8s搭建集群的文章&#xff0c;文章地址&#xff1a; https://blog.csdn.net/m0_51510236/article/details/1308…

系统架构设计师-系统工程与信息系统基础(3)

一、企业信息化与电子商务 1、企业资源计划&#xff08;ERP&#xff09; ERP是由MRP&#xff08;物料需求计划&#xff09;、MRPll&#xff08;制造资源计划&#xff09;一步步演化而来。 MARPll&#xff1a;核心是物流&#xff0c;主线是计划。 ERP&#xff1a;打通了供应链&a…

小白也能玩转Docker:应用部署、迁移与备份

目录 1、应用部署 1.1、Mysql 1.2、Ngixn 1.3、Redis 1.4、RabbitMQ 1.5、Elasticsearch 1.6、Zookeeper 2、迁移与备份 2.1容器保存为镜像 2.2镜像备份 2.3镜像恢复与迁移 1、应用部署 1.1、Mysql 拉取mysql的镜像&#xff1a; docker pull mysql:5.7 为mysql镜…

C语言深度刨析(二)——符号

文章目录 前言注释符号几个似非而是的注释问题y x/*p如何编写出出色的注释 接续符和转义符单引号、双引号逻辑运算符位运算符左移和右移0x01<<23的值为多少&#xff1f; 花括号、--操作符2/(-2)的值是多少&#xff1f;运算符的优先级运算符的优先级表一些容易出错的优先…

JavaEE课程设计(项目详细设计)

目录 项目文件组织结构 springbootschemaApplication dao controller application.yml entity annotation interceptor config 项目文件组织结构 这是后端部分的源码结构图 springbootschemaApplication springbootschemaApplication是整个项目的入口 package …

AI热门垂直领域大模型盘点(附论文)

上回分享了一些通用大模型的使用感受&#xff0c;今天咱们就来聊聊垂直领域大模型&#xff0c;照旧附上论文资料&#xff0c;同学们自取哈&#xff01; 其实照目前的趋势来看&#xff0c;垂直领域大模型的未来发展是要比通用大模型好的&#xff0c;一是通用大模型有GPT4这座难…

Java手动编码实现与k8s交互式shell

前言 要手动编码&#xff0c;和k8s做shell交互&#xff0c;我们需要弄清以下两个问题&#xff1a; 1、Java如何与k8s做shell交互 2、前端界面如何与Java后台交互 3、多个用户并发访问如何实现 问题1&#xff1a; k8s官方提供了各种语言的KubernetesAPI&#xff0c;对于Ja…

用AI修复郭德纲远古相声;小红书爆款文案Prompt模板;用AI经营一家三明治店;AI将实现80%编程 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; B站UP主使用AI修复郭德纲远古相声&#xff0c;10天播放近70万 B站UP主 野老相声-风景-4K修复 使用了AI换脸技术&#xff0c;对郭德纲、…

【ArcGIS Pro二次开发】(41):勘测定界txt文件转数据库(批量)

在规划工作中有时候会收到一种带坐标点的txt文件&#xff1a; 上网查了一下资料&#xff0c;这是根据《勘测定界界址点坐标交换格式》制作的固定格式文件。 其中包含了坐标系、精度、地块编号、地块名称、坐标点等信息。 这个工具的目的就是将TXT格式坐标批量转换为数据库文件…

生物群落(生态)数据统计分析与绘图

R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线&#xff0c;通过多个来自经典…

一些WEB测试方法

ladys and 乡亲们&#xff0c;long time no see&#xff0c;发个笔记&#xff1a;&#xff09; 首先&#xff0c;WEB是咋组成的 Web应用程序一般是B/S模式&#xff0c;一个Web应用程序是由完成特定任务的各种Web组件(web components)构成的并通过Web将服务展示给外界&#xff…

最喜爱的编程语言——Python

一、编程语言发展 编程语言&#xff08;programming language&#xff09;可以简单的理解为一种计算机和人都能识别的语言。一种能够让程序员准确地定义计算机所需数据的计算机语言&#xff0c;并精确地定义在不同情况下所应当采取的行动。 编程语言处在不断的发展和变化中&…

上海亚商投顾:沪指延续调整 机器人概念股掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 大小指数今日略显分化&#xff0c;沪指全天震荡调整&#xff0c;深成指、创业板指则拉升翻红。机器人概念股掀涨停…

手把手教你使用抖音DOU+创作个性化视频!

抖音DOU是抖音推出的一项全新功能&#xff0c;旨在为用户提供更加个性化、丰富多彩的内容创作和交流体验。DOU提供了一系列强大的创作工具&#xff0c;包括音频剪辑、特效滤镜、场景转换、字幕编辑等&#xff0c;让用户可以轻松地将自己的创意通过视频分享到抖音平台上来。下面…

数值分析第四章节 用Python实现数值积分与数值微分

参考书籍&#xff1a;数值分析 第五版 李庆杨 王能超 易大义编 第4章 数值积分与数值微分 文章声明&#xff1a;如有发现错误&#xff0c;欢迎批评指正 文章目录 梯形公式矩形公式辛普森公式柯特斯公式复合梯形公式复合辛普森公式 4.1数值积分概论 4.1.1数值积分基本思想 使用某…

【Vue全家桶高仿小米商城】——(四)项目基础架构

第四章&#xff1a;项目基础架构 此章节全力讲解前端基本项目架构&#xff0c;通过此章节可搭建一个通用性的前端架构&#xff0c;内容涵盖跨域方案、路由封装、错误拦截等。 文章目录 第四章&#xff1a;项目基础架构一、前端跨域解决什么是前端跨域&#xff1f;怎么解决前端…

将h5项目转成uniapp小程序

打开微信开发者工具&#xff0c;新建项目&#xff1b;pages下index文件中index.wxml文件打开内容全删除&#xff1b;写入<web-view srchttp://域名.com/></web-view>&#xff1b;编译&#xff0c;成功在小程序中展示&#xff1b;其后&#xff0c;正常按照小程序流程…