poi动态创建文档

介绍

这篇文章解释了基于各种标准将样式应用于文档的困难并提供了解决方案。 Java编程中的常见任务之一是根据存储在数据库中的数据创建Excel报告。 在这些情况下,Java程序员使用POI :-)。 这些报告通常对样式和数据格式有严格的规定。 数据通常是SQL查询执行的结果。

通常的目标是将其变为:


到这个:


问题

这里的问题是样式可以基于不同的标准来应用。 例如,数字可以用小数点分隔符后面的不同位数来格式化。 日期可能需要使用特殊格式进行格式化。 最后但并非最不重要的是,可能需要用颜色选择某些列或行。

在代码中“直接”应用这些样式将导致许多难以阅读和维护的代码。 每次报表样式更改时,可能都需要更改许多代码。

如果样式可以像谓词一样具有“样式”,并且可以根据此谓词来应用,那就太好了。 但是如何实施他的?

所提出的解决方案解决了谓词问题。 我将此解决方案与POI结合使用来生成报告,因此大多数情况下,我会假定使用了类似POI的库。

样式图生成

在执行任何文档创建操作之前,必须创建样式图。 此样式图将包含映射到键的样式。 键必须包含所有可能影响样式的值。 例如,值的类型(在Java中),行号,列号和值本身。

该地图将如下所示:


密钥序列生成

这个想法是生成一个键列表(java.util.List),以正确的顺序进行尝试。 该列表用于定义对象的样式。 列表中的每个键都以迭代顺序进行尝试,直到样式图中的一个键值为止。

一般的想法是从更详细的键开始,并填写所有值,最后以可应用于任何单元格的最通用样式结束。

例如(ri是行索引,ci是列索引):

List<CellStyleKey> allKeys = new ArrayList<>();
if (val != null) {if ((ri != null) || (ci != null)) {allKeys.add(new CellStyleKey(val, val.getClass(), ri, ci));allKeys.add(new CellStyleKey(val, val.getClass(), ri, null));allKeys.add(new CellStyleKey(val, val.getClass(), null, ci));allKeys.add(new CellStyleKey(val, val.getClass(), null, null));allKeys.add(new CellStyleKey(null, val.getClass(), ri, ci));allKeys.add(new CellStyleKey(null, val.getClass(), ri, null));allKeys.add(new CellStyleKey(null, val.getClass(), null, ci));allKeys.add(new CellStyleKey(null, val.getClass(), null, null));} else {allKeys.add(new CellStyleKey(val, val.getClass(), null, null));allKeys.add(new CellStyleKey(null, val.getClass(), null, null));}
}
allKeys.add(new CellStyleKey(null, null, ri, ci));
allKeys.add(new CellStyleKey(null, null, ri, null));
allKeys.add(new CellStyleKey(null, null, null, ci));
allKeys.add(new CellStyleKey(null, null, null, null));

在此代码中,最详细的键是包含所有值的键:值,类,行号和列号。 最不详细的键不包含任何值。

样式图生成

对于列表中的每个键(列表应尽可能短),对样式图执行get操作。 如果样式图具有此键的值,则为样式。

结论

此方案允许将样式简单但灵活地分配给Excel文档中的行/列/值/类。

翻译自: https://www.javacodegeeks.com/2019/05/flexible-styling-varying-criteria-poi-created-documents.html

poi动态创建文档

poi动态创建文档_POI创建的文档具有不同条件的灵活样式相关推荐

  1. POI创建的文档具有不同条件的灵活样式

    介绍 这篇文章解释了基于各种标准将样式应用于文档的困难并提供了解决方案. Java编程中的常见任务之一是根据存储在数据库中的数据创建Excel报告. 在这些情况下,Java程序员使用POI :-). ...

  2. java自动生成项目编号_java - Apache POI,在同一文档中创建项目符号点和编号列表 - 堆栈内存溢出...

    我试图用apache poi创建一个既包含圆点又包含编号列表的文档. 我想得到这样的结果. 名单: 清单1项目0 清单1项目1 清单1项目2 列表后的段落. 清单2: 清单2项目0 清单2项目1 清单 ...

  3. DOM(三)——创建删除元素及优化(文档片段)

    文章目录 一.添加一个新元素 (1)创建一个新的空元素对象 (2)为新元素添加必要属性 (3)将新元素添加到DOM树上指定父元素下,浏览器才能显示出新元素 a.在父元素下末尾追加新元素 b. 在父元素 ...

  4. [翻译] DTCoreText 从HTML文档中创建富文本

    DTCoreText 从HTML文档中创建富文本 https://github.com/Cocoanetics/DTCoreText 注意哦亲,DTRichTextEditor 这个组件是收费的,不贵 ...

  5. VC++ MSXML创建XML文件以及对XML文档解析

    VC++ MSXML创建XML文件以及对XML文档解析 转自http://www.newxing.com/Tech/Program/Cpp/703.html // XmlCreationDemo.cp ...

  6. [Swift通天遁地]七、数据与安全-(1)XML文档的创建和解析

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  7. CCommandLineInfo详解-启动不创建新文档【对单文档有问题?】

    问:其实这里面还有问题,如果是单文档应用程序,这样做会出错.虽然编译连接都能通过,但是调试运行是到这里提示出错而中断了. 错误:在winocc.cpp文件的这句话:ASSERT(::IsWindow( ...

  8. iText创建一个含有中文的pdf文档

    有朋友问我pdfbox支不支持向pdf文档中写入中文.然后试了好多遍都是有乱码,也找了好多资料没有找到解决办法. 但是在查找资料的过程中发现了另一个处理pdf的开源库iText.官方介绍 http:/ ...

  9. java使用org.w3c.dom解析XML文档,创建、增删查改,保存,读取,遍历元素等操作

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用org.w3c.dom(java dom)解析XML文档,创建.增删查改,保存,读取,遍历元素等操作 在保存文件时需要载入crimso ...

最新文章

  1. Processing入门教程-Processing的“前世今生”
  2. Linux Kernel Development——列出系统中所有的进程
  3. centos php 开启socket,CentOS 配置PHP支持socket扩展
  4. inner join on 加条件和where加条件_SQL学习笔记 - GROUP BY / JOIN / UNION
  5. 程序员职场:3 大原则让你的编程之路越走越顺,新手来了解一下
  6. 利用Hook技术实现键盘监控
  7. EIGRP and the OSPF redistribute
  8. python015 Python3 函数
  9. 使用result配置结果视图
  10. java发牌_Java实现洗牌发牌的方法
  11. Eureka 控制台参数说明
  12. linux映射80端口,Linux下访问默认80端口 映射到8080端口
  13. pl sql面试题_PL SQL面试问答
  14. 计算机系统概述-为什么要学习计算机系统基础
  15. 125KHz 100cm ID 读卡电路_NX系列PLC-NX-ID数字输入单元_欧姆龙继电器_欧姆龙PLC_欧姆龙接近开关...
  16. 参考文献标引方式_论文参考文献标注格式
  17. 苹果动图分享给android,苹果实况图片怎么发给别人
  18. ps文字工具学习笔记
  19. VC++6.0常见问题之fatal error C1083解决方案
  20. java 庖丁解牛api_Java 微信支付 APIv3 平台证书的命令行下载工具

热门文章

  1. [CQOI2018] 解锁屏幕(状压dp)
  2. YBTOJ:数列方案(组合数学)
  3. 洛谷P2480:古代猪文(中国剩余定理)(欧拉定理)
  4. YbtOJ-选点构形【欧拉函数】
  5. CF1603C-Extreme Extension【整除分块,dp】
  6. P4655-[CEOI2017]Building Bridges【斜率优化dp,CDQ分治】
  7. ssl提高组周六模拟赛【2018.9.23】
  8. ssl1562-局域网
  9. OJ4008-糖果【各种dp之3】
  10. 2020 ICPC亚洲区域赛(沈阳)H-The Boomsday Project(双指针+dp)