当前位置: 首页 > news >正文

iis搭建本地网站郑州网络推广培训

iis搭建本地网站,郑州网络推广培训,自制网站的条件,东莞东城社保局电话文章目录 前言一、需求背景二、方案分析三、 POI-TL JFreeChart 实现3.1 Maven 依赖3.3 word模板设置3.2 实现代码 踩坑 前言 在开发过程中,我们经常需要生成包含动态数据和图表的 Word 报告。本文将介绍如何结合 POI-TL 和 JFreeChart,实现动态生成 W…

文章目录

  • 前言
  • 一、需求背景
  • 二、方案分析
  • 三、 POI-TL + JFreeChart 实现
    • 3.1 Maven 依赖
    • 3.3 word模板设置
    • 3.2 实现代码
  • 踩坑


前言

在开发过程中,我们经常需要生成包含动态数据和图表的 Word 报告。本文将介绍如何结合 POI-TL 和 JFreeChart,实现动态生成 Word 报告的功能,并分享一些实际开发中的踩坑经验。
word生成方案:

  1. freemarker+ftl
  2. pot-tl模板替换
  3. poi硬编码

一、需求背景

在之前的文章中,我们已经介绍了如何使用模板替换、复杂表格和图片插入等功能。此次的需求是生成一个包含统计图的 Word 报告,统计图需要根据动态数据生成。面临的主要问题包括:

  1. 选择 Word 生成方案:如何在 Word 中动态插入数据和图表?
  2. 图片插入方案:如何将生成的统计图插入到 Word 中?
  3. 生成统计图表方案:如何根据数据动态生成统计图?

二、方案分析

  1. POI 硬编码
    直接使用 Apache POI 硬编码生成 Word 文档,虽然可行,但代码复杂且难以维护,因此不推荐。

  2. FreeMarker + FTL
    FreeMarker 可以实现文本替换和图片插入,理论上符合需求。但 FTL 模板的维护较为繁琐,尤其是在处理复杂表格和图片时。

  3. POI-TL + JFreeChart
    POI-TL 是一个基于 Apache POI 的模板引擎,支持文本替换、图片插入等功能。结合 JFreeChart 生成统计图,可以很好地满足需求。

三、 POI-TL + JFreeChart 实现

关于JFreeChart请移步使用 JFreeChart 创建动态图表:从入门到实战

3.1 Maven 依赖

首先,需要在项目中引入 POI-TL 和 JFreeChart 的依赖。注意 POI 和 POI-TL 的版本需要对应,否则可能会出现 NoSuchMethod 等错误。

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-excelant</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.jfree</groupId><artifactId>jfreechart</artifactId><version>1.5.3</version></dependency><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.0</version></dependency>

3.3 word模板设置

在 Word 模板中,使用占位符标记需要替换的内容。对于图片,需要在占位符前加 @,例如:

  • 替换文本:时间 -> ${date}
  • 插入图片:${@dailyOnlinePic}
  • 条件判断:${?isTrue} 条件内容 ${/isTrue}

3.2 实现代码

以下是核心实现代码:

    private static final String TEMPLATE_PATH = "classpath:template/report.docx";private static final String OUTPUT_DIR = "D:/data/upload/analysis/";private static final String PIC_DIR = OUTPUT_DIR + "pic/";public void getWord(String curDistCode) {try {// 获取模板文件File file = ResourceUtils.getFile(TEMPLATE_PATH);// 构建模板替换的数据Map<String, Object> dataMap = buildTemplateData(curDistCode);// 生成最终文件路径String fileName = UUIDUtil.genUUID32() + ".docx";String filePath = OUTPUT_DIR + fileName;// 使用 POI-TL 渲染模板并保存try (XWPFTemplate template = XWPFTemplate.compile(file, Configure.newBuilder().buildGramer("${", "}").build()).render(dataMap)) {template.writeToFile(filePath);}//上传文件返回附件id} catch (Exception e) {e.printStackTrace();}}private Map<String, Object> buildTemplateData(String curDistCode) throws IOException {Map<String, Object> dataMap = new HashMap<>();// 设置日期和在线总数dataMap.put("date", LocalDate.now());// 查询设备数据dataMap.put("onlineTotal", 100);// 生成每日在线图表DefaultCategoryDataset dailyData = buildDailyDataset(stationByTime);String dailyPicFile = generateChart(dailyData, "监测站总在线数", "小时", "数量", dailyOnlineTxtEnum);dataMap.put("dailyOnlinePic", Pictures.ofStream(new FileInputStream(dailyPicFile), PictureType.JPEG).size(600, 200).create());return dataMap;}// 构建每日在线图表的数据集private DefaultCategoryDataset buildDailyDataset(List<FireStationByTimeDTO> stationByTime) {DefaultCategoryDataset dataset = new DefaultCategoryDataset();stationByTime.forEach(t -> dataset.addValue(t.getOnlineNum(), "", t.getTime()));return dataset;}// 生成图表并保存为图片private String generateChart(DefaultCategoryDataset dataset, String title, String xAxisLabel, String yAxisLabel, DailyOnlineTxtEnum style) throws IOException {// 设置全局字体(支持中文)StandardChartTheme chartTheme = new StandardChartTheme("CN");chartTheme.setExtraLargeFont(new Font("宋体", Font.PLAIN, 14)); // 标题字体chartTheme.setLargeFont(new Font("宋体", Font.PLAIN, 14));     // 图例字体chartTheme.setRegularFont(new Font("宋体", Font.PLAIN, 12));   // 轴标签字体ChartFactory.setChartTheme(chartTheme);// 创建图表JFreeChart chart = ChartFactory.createLineChart(title, xAxisLabel, yAxisLabel, dataset);setChartStyle(chart, style);// 保存图表为图片String picFile = PIC_DIR + UUIDUtil.genUUID32() + ".png";//int numberOfCategories = dataset.getColumnCount();//int width = Math.max(800, numberOfCategories * 50); // 每个类别宽度为50,最小宽度为800ChartUtils.saveChartAsPNG(new File(picFile), chart, 1200, 400);return picFile;}// 设置图表样式private void setChartStyle(JFreeChart chart) {CategoryPlot plot = chart.getCategoryPlot();chart.setBackgroundPaint(Color.WHITE);plot.setBackgroundPaint(Color.WHITE);plot.setDomainGridlinePaint(Color.LIGHT_GRAY);plot.setRangeGridlinePaint(Color.LIGHT_GRAY);// 设置第一条折线的粗细plot.getRenderer().setSeriesStroke(0, new BasicStroke(5.0f));// 根据样式设置折线颜色plot.getRenderer().setSeriesPaint(0, Color.RED);}

效果
在这里插入图片描述


踩坑

  1. 插入图片如何占位
    与常规文本替换不同,图片插入需要在占位符前加 @,例如 ${@dailyOnlinePic}{{@pic}}
  2. 统计图中文乱码
    JFreeChart 默认不支持中文,需要通过设置全局字体解决:
       // 设置全局字体(支持中文)StandardChartTheme chartTheme = new StandardChartTheme("CN");chartTheme.setExtraLargeFont(new Font("宋体", Font.PLAIN, 14)); // 标题字体chartTheme.setLargeFont(new Font("宋体", Font.PLAIN, 14));     // 图例字体chartTheme.setRegularFont(new Font("宋体", Font.PLAIN, 12));   // 轴标签字体ChartFactory.setChartTheme(chartTheme);

3.统计图横坐标…
如果生成的图片宽度不够,横坐标可能会显示不全。可以通过增加图片宽度解决,插入时等比例缩放:

ChartUtils.saveChartAsPNG(new File(picFile), chart, 1200, 400);
dataMap.put("dailyOnlinePic", 
Pictures.ofStream(new FileInputStream(dailyPicFile), PictureType.JPEG).size(600, 200).create());

或动态计算需要生成的图片宽度:

int numberOfCategories = dataset.getColumnCount();
int width = Math.max(800, numberOfCategories * 50); // 每个类别宽度为50,最小宽度为800
  1. 模板条件判断
    POI-TL支持复杂的条件判断,例如结合逻辑运算符(&&、||)和比较运算符(==、!=、>、< 等)。
    例如:
{{?isStudent}}{{?age > 18}}您是一名成年学生。{{/age > 18}}
{{/isStudent}}

此次实验boolean好用,字符串==匹配失败。


在这里插入图片描述

http://www.mmbaike.com/news/111406.html

相关文章:

  • 网站建设jsp静态网站开发
  • 小说网站做封面要钱吗十大经典案例
  • 网易做的什么网站网络服务提供商
  • ps免费模板网站百度经验手机版
  • 制作相册书seo优化排名教程
  • 清远市专业网站制作关键词优化的作用
  • 网站网站开发的免费seo关键词优化排名
  • 无锡网站优化哪家好友情链接交换网址大全
  • 服务器ecs可以做网站吗企业官方网站怎么申请
  • 视频做动图的网站营销型网站建设托管
  • 网站服务器 优帮云手机百度安装下载
  • 最火的网站开发框架北京网络seo
  • 上海公共招聘网站360优化大师官方下载
  • dreamweaver做的网站f12看不了网站开发的公司
  • 手机网站打不开是什么原因造成的怎样做百度推广
  • 怎样做网站编辑免费seo视频教程
  • 网站后台怎么传图片口碑营销策划方案
  • 网站建设哪家好建议兴田德润衡阳seo外包
  • 国外做的好的医疗网站设计营销推广的平台
  • 制作公司网站步骤沈阳优化推广哪家好
  • wordpress综合商城主题百度seo排名优化公司哪家好
  • 做网站包括服务器么企业培训的目的和意义
  • 专业网站建设供应商运用搜索引擎营销的案例
  • 建设部网站公告注册成功宁德市蕉城区
  • wordpress游戏网站网站更新seo
  • 武汉网站建设培训网站提交入口
  • 项目计划书模板范文 完整版旺道seo优化软件
  • 免费网站空间免费主机免费广告发布平台app
  • 可以推广的平台广州seo外包多少钱
  • 网站制作网站建设需要多少钱网络工程师培训班要多少钱