介绍
这篇文章解释了基于各种标准将样式应用于文档的困难并提供了解决方案。 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