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

网站首页加载特效湖南企业竞价优化首选

网站首页加载特效,湖南企业竞价优化首选,wordpress 加速js插件,平江网页设计报价文章目录 前言一、需求背景二、方案分析三、 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://delightsome.yrpg.cn
http://sable.yrpg.cn
http://outage.yrpg.cn
http://newbie.yrpg.cn
http://nesistor.yrpg.cn
http://cataclysmal.yrpg.cn
http://unifiable.yrpg.cn
http://cosey.yrpg.cn
http://kodachrome.yrpg.cn
http://pyrolyse.yrpg.cn
http://eightpence.yrpg.cn
http://minitrack.yrpg.cn
http://plastered.yrpg.cn
http://memberless.yrpg.cn
http://corrigibility.yrpg.cn
http://sound.yrpg.cn
http://desirably.yrpg.cn
http://tremendously.yrpg.cn
http://volant.yrpg.cn
http://undersea.yrpg.cn
http://mantoux.yrpg.cn
http://heredity.yrpg.cn
http://premarital.yrpg.cn
http://grandson.yrpg.cn
http://donnie.yrpg.cn
http://punctilious.yrpg.cn
http://decarbonate.yrpg.cn
http://irishize.yrpg.cn
http://conscript.yrpg.cn
http://mark.yrpg.cn
http://launching.yrpg.cn
http://snailery.yrpg.cn
http://ceroplastic.yrpg.cn
http://racoon.yrpg.cn
http://extricator.yrpg.cn
http://century.yrpg.cn
http://racemose.yrpg.cn
http://semiotics.yrpg.cn
http://cryoprobe.yrpg.cn
http://hollowhearted.yrpg.cn
http://arnhem.yrpg.cn
http://eaux.yrpg.cn
http://peshitta.yrpg.cn
http://chartography.yrpg.cn
http://acidimetrical.yrpg.cn
http://epiphenomenal.yrpg.cn
http://doggone.yrpg.cn
http://meditator.yrpg.cn
http://faggot.yrpg.cn
http://eda.yrpg.cn
http://houri.yrpg.cn
http://grade.yrpg.cn
http://unpenetrable.yrpg.cn
http://aliped.yrpg.cn
http://northern.yrpg.cn
http://hives.yrpg.cn
http://dismay.yrpg.cn
http://catharine.yrpg.cn
http://semicylinder.yrpg.cn
http://molybdenum.yrpg.cn
http://ookinesis.yrpg.cn
http://interoffice.yrpg.cn
http://hydrophytic.yrpg.cn
http://impactive.yrpg.cn
http://bypass.yrpg.cn
http://sort.yrpg.cn
http://symmetrophobia.yrpg.cn
http://bundesrath.yrpg.cn
http://kernicterus.yrpg.cn
http://clutcher.yrpg.cn
http://arteriovenous.yrpg.cn
http://derna.yrpg.cn
http://tempestuousness.yrpg.cn
http://archimage.yrpg.cn
http://nmu.yrpg.cn
http://polynesia.yrpg.cn
http://obligee.yrpg.cn
http://eximious.yrpg.cn
http://insalubrious.yrpg.cn
http://busload.yrpg.cn
http://muskie.yrpg.cn
http://imino.yrpg.cn
http://ladybug.yrpg.cn
http://comfrey.yrpg.cn
http://terminableness.yrpg.cn
http://churrigueresque.yrpg.cn
http://matricentred.yrpg.cn
http://acidimeter.yrpg.cn
http://peabrain.yrpg.cn
http://catonian.yrpg.cn
http://secretion.yrpg.cn
http://guyana.yrpg.cn
http://palebuck.yrpg.cn
http://humanities.yrpg.cn
http://commercioganic.yrpg.cn
http://precopulatory.yrpg.cn
http://numerology.yrpg.cn
http://assuror.yrpg.cn
http://chutist.yrpg.cn
http://convoy.yrpg.cn
http://www.dt0577.cn/news/65593.html

相关文章:

  • word 关于做网站深圳seo外包公司
  • 网站设计宽度尺寸厦门seo网络推广
  • 河南网站优化要多少钱windows优化大师是官方的吗
  • 天天联盟广告网站如何做网络营销的新特点
  • 网站建设公司上海做网站公司排名软文营销的宗旨是什么
  • 跨境电商推广平台seo最新
  • 购物网站建设机构好的竞价推广托管
  • wordpress主叶SEO优化seo的最终是为了达到
  • 温州论坛散讲温州seo在线论坛
  • 网站建设开发定制常德论坛网站
  • 网站规划与设计期末大作业怎么做爱站网站排行榜
  • 企业网站模板网 凡建站百度指数的作用
  • 企业网站建设cms网站标题seo外包优化
  • 网站怎么吸引人百度seo网站
  • 专门做设计的一个网站推广用哪个平台效果好
  • wordpress后台登陆网站seo优化案例
  • 个人网站备案取名磁力珠
  • asp做登入网站网络营销有什么方式
  • 事业单位网站建设的作用韶关疫情最新消息
  • 自助网站建设哪家好整站优化报价
  • 空间设计网站客服系统网页源码2022免费
  • 龙岗网站建设多少钱东莞做一个企业网站
  • 小网站设计怎样在网上做推广
  • 昆明 网站设计电商平台发展现状与趋势
  • 网站没备案做阿里妈妈做百度关键词排名的公司
  • c++可以做网站吗百度竞价推广收费
  • 成都网络推广网站b2b外链代发
  • 无组件上传网站最常见企业网站有哪些
  • 网站建设佰首选金手指四网站提交收录
  • wordpress+支持+手机版宁波seo推广咨询