MultipleRowTableRenderPolicy.java
7.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package com.lhcredit.common.utils.poi;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.exception.RenderException;
import com.deepoove.poi.policy.RenderPolicy;
import com.deepoove.poi.render.compute.EnvModel;
import com.deepoove.poi.render.compute.RenderDataCompute;
import com.deepoove.poi.render.processor.DocumentProcessor;
import com.deepoove.poi.render.processor.EnvIterator;
import com.deepoove.poi.resolver.TemplateResolver;
import com.deepoove.poi.template.ElementTemplate;
import com.deepoove.poi.template.MetaTemplate;
import com.deepoove.poi.template.run.RunTemplate;
import com.deepoove.poi.util.ReflectionUtils;
import com.deepoove.poi.util.TableTools;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlObject;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow;
public class MultipleRowTableRenderPolicy implements RenderPolicy {
private static final String DEFAULT_MULTIPLE_PREFIX = "$(";
private static final String DEFAULT_MULTIPLE_SUFFIX = ")";
private static final String DEFAULT_PREFIX = "[";
private static final String DEFAULT_SUFFIX = "]";
private static final int DEFAULT_MULTIPLE_ROW_NUM = 1;
private final String regex;
private final String multiplePrefix;
private final String multipleSuffix;
private final String prefix;
private final String suffix;
public MultipleRowTableRenderPolicy() {
this("$(", ")", "[", "]");
}
public MultipleRowTableRenderPolicy(String prefix, String suffix) {
this("$(", ")", prefix, suffix);
}
private MultipleRowTableRenderPolicy(String multiplePrefix, String multipleSuffix, String prefix, String suffix) {
this.regex = "\\$\\([0-9]+\\)";
this.multiplePrefix = multiplePrefix;
this.multipleSuffix = multipleSuffix;
this.prefix = prefix;
this.suffix = suffix;
}
public void render(ElementTemplate eleTemplate, Object data, XWPFTemplate template) {
try {
RunTemplate runTemplate = this.cast2runTemplate(eleTemplate);
XWPFRun run = runTemplate.getRun();
this.checkTargetIsTable(run, "Processing [" + runTemplate.getTagName() + "] failed, the target content is not a table");
XWPFTableCell tagCell = (XWPFTableCell)((XWPFParagraph)run.getParent()).getBody();
XWPFTable table = tagCell.getTableRow().getTable();
run.setText("", 0);
TemplateResolver resolver = new TemplateResolver(template.getConfig().copy(this.prefix, this.suffix));
int position = this.getRowIndex(tagCell.getTableRow());
List<XWPFTableRow> tempRows = this.getAllTemplateRow(table, position);
if (null != data && data instanceof Iterable) {
XWPFTableRow firstTempRow = (XWPFTableRow)tempRows.get(0);
Iterator<?> dataIt = ((Iterable)data).iterator();
boolean hasNextData = dataIt.hasNext();
for(int index = 0; hasNextData; ++index) {
Object dt = dataIt.next();
hasNextData = dataIt.hasNext();
Iterator<XWPFTableRow> rowTempIt = tempRows.iterator();
for(boolean hasNextTempRow = rowTempIt.hasNext(); hasNextTempRow; ++position) {
XWPFTableRow tempRow = (XWPFTableRow)rowTempIt.next();
hasNextTempRow = rowTempIt.hasNext();
if (!table.addRow(tempRow, position)) {
throw new RenderException("创建新的表格行失败");
}
XmlCursor newCursor = firstTempRow.getCtRow().newCursor();
newCursor.toPrevSibling();
XmlObject object = newCursor.getObject();
XWPFTableRow newRow = new XWPFTableRow((CTRow)object, table);
newRow.getCtRow().set(object);
this.setTableRow(table, newRow, position);
List<XWPFTableCell> cells = newRow.getTableCells();
RenderDataCompute dataCompute = template.getConfig().getRenderDataComputeFactory().newCompute(EnvModel.of(dt, EnvIterator.makeEnv(index, hasNextData || hasNextTempRow)));
cells.forEach((tableCell) -> {
List<MetaTemplate> metaTemplates = resolver.resolveBodyElements(tableCell.getBodyElements());
(new DocumentProcessor(template, resolver, dataCompute)).process(metaTemplates);
});
}
}
}
this.removeTableRow(table, position, tempRows.size());
} catch (Exception var24) {
throw new RenderException("failed to render table multi-row template", var24);
}
}
protected List<XWPFTableRow> getAllTemplateRow(XWPFTable table, int startIndex) {
List<XWPFTableRow> rows = table.getRows();
int tempRowNum = 1;
String text = ((XWPFTableRow)rows.get(startIndex)).getCell(0).getText();
Matcher matcher = Pattern.compile("\\$\\([0-9]+\\)").matcher(text);
if (matcher.find()) {
String rowNumText = matcher.group(0);
tempRowNum = Integer.parseInt(rowNumText.replace(this.multiplePrefix, "").replace(this.multipleSuffix, ""));
List<XWPFParagraph> paragraphs = ((XWPFTableRow)rows.get(startIndex)).getCell(0).getParagraphs();
((XWPFRun)((XWPFParagraph)paragraphs.get(0)).getRuns().get(0)).setText(text.replace(rowNumText, ""), 0);
for(int i = 1; i < ((XWPFParagraph)paragraphs.get(0)).getRuns().size(); ++i) {
((XWPFRun)((XWPFParagraph)paragraphs.get(0)).getRuns().get(i)).setText("", 0);
}
}
return new Vector(rows.subList(startIndex, startIndex + tempRowNum));
}
protected void removeTableRow(XWPFTable table, int startIndex, int size) {
for(int i = 0; i < size; ++i) {
table.removeRow(startIndex);
}
}
protected RunTemplate cast2runTemplate(MetaTemplate template) {
if (!(template instanceof RunTemplate)) {
throw new ClassCastException("type conversion failed, template is not of type RunTemplate");
} else {
return (RunTemplate)template;
}
}
protected void checkTargetIsTable(XWPFRun run, String message) {
if (Objects.isNull(run) || !TableTools.isInsideTable(run)) {
throw new IllegalStateException(message);
}
}
protected void setTableRow(XWPFTable table, XWPFTableRow row, int pos) {
List<XWPFTableRow> rows = (List)ReflectionUtils.getValue("tableRows", table);
rows.set(pos, row);
table.getCTTbl().setTrArray(pos, row.getCtRow());
}
protected int getRowIndex(XWPFTableRow row) {
List<XWPFTableRow> rows = row.getTable().getRows();
return rows.indexOf(row);
}
}