Java POI Word模板数据填充
标签:表达 arraylist author 有序 mil print set 原来 段落
1 package ***;
2
3 import java.io.FileInputStream;
4 import java.io.FileNotFoundException;
5 import java.io.FileOutputStream;
6 import java.util.ArrayList;
7 import java.util.HashMap;
8 import java.util.List;
9 import java.util.Map;
10 import java.util.Set;
11
12 import org.apache.poi.util.Units;
13 import org.apache.poi.xwpf.usermodel.XWPFDocument;
14 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
15 import org.apache.poi.xwpf.usermodel.XWPFRun;
16 import org.apache.poi.xwpf.usermodel.XWPFTable;
17 import org.apache.poi.xwpf.usermodel.XWPFTableCell;
18 import org.apache.poi.xwpf.usermodel.XWPFTableRow;
19
20 /**
21 * 文件数据替换
22 * @author 23 *
24 */
25
26 public class ReplaceWord {
27
28 public static String path = "模板文件的路径/test.docx";
29
30 public static void main(String[] args) throws Exception {
31 Map data = new HashMap();
32 Map pic = new HashMap();
33
34 pic.put("${carpicture}", "Files/sign.png");
35 pic.put("${licensecopy}", "Files/sign.png");
36 data.put("${seal}", "1");
37 pic.put("${sing01}", "Files/sign.png");
38 pic.put("${sing02}", "Files/sign.png");
39 System.out.println(pic.containsKey("${carpicture}"));
40
41 // 列表(List)是对象的有序集合
42 List> tabledataList = new ArrayList();
43 getWord(data, tabledataList, pic);
44 }
45
46 public static void getWord(Map data, List> tabledataList, Map picmap)
47 throws Exception {
48 try (FileInputStream is = new FileInputStream(path); XWPFDocument document = new XWPFDocument(is)) {
49 // 替换掉表格之外的文本(仅限文本)
50 changeText(document, data);
51
52 // 替换表格内的文本对象
53 changeTableText(document, data);
54
55 // 替换图片
56 changePic(document, picmap);
57
58 // 替换表格内的图片对象
59 changeTablePic(document, picmap);
60
61 long time = System.currentTimeMillis();// 获取系统时间
62 System.out.println(time); // 打印时间
63 // 使用try和catch关键字捕获异常
64 try (FileOutputStream out = new FileOutputStream("生成的文件路径/文件名" + ".docx")) {
65 document.write(out);
66 }
67 } catch (FileNotFoundException e) {
68 e.printStackTrace();
69 }
70 }
71
72 /**
73 * 替换段落文本
74 * @param document docx解析对象
75 * @param textMap 需要替换的信息集合
76 *
77 */
78 public static void changeText(XWPFDocument document, Map textMap) {
79 // 获取段落集合
80 // 返回包含页眉或页脚文本的段落
81 List paragraphs = document.getParagraphs();
82 // 增强型for循环语句,前面一个为声明语句,后一个为表达式
83 for (XWPFParagraph paragraph : paragraphs) {
84 // 判断此段落是否需要替换
85 String text = paragraph.getText();// 检索文档中的所有文本
86 if (checkText(text)) {
87 List runs = paragraph.getRuns();
88 for (XWPFRun run : runs) {
89 // 替换模板原来位置
90 Object ob = changeValue(run.toString(), textMap);
91 if (ob instanceof String) {
92 if (textMap.containsKey(run.toString())) {
93 run.setText((String) ob, 0);
94 }
95 }
96 }
97 }
98 }
99 }
100
101 /* 检查文本中是否包含指定的字符(此处为“$”),并返回值 */
102 public static boolean checkText(String text) {
103 boolean check = false;
104 if (text.contains("$")) {
105 check = true;
106 }
107 return check;
108 }
109
110 /**
111 * 替换图片
112 * @param document
113 * @param textMap
114 * @throws Exception
115 */
116
117 public static void changePic(XWPFDocument document, Map textMap) throws Exception {
118 // 获取段落集合
119 List paragraphs = document.getParagraphs();
120
121 for (XWPFParagraph paragraph : paragraphs) {
122 // 判断此段落是否需要替换
123 String text = paragraph.getText();
124 if (checkText(text)) {
125 List runs = paragraph.getRuns();
126 for (XWPFRun run : runs) {
127 // 替换模板原来位置
128 Object ob = changeValue(run.toString(), textMap);
129 if (ob instanceof String) {
130 if (textMap.containsKey(run.toString())) {
131 run.setText("", 0);
132 try (FileInputStream is = new FileInputStream((String) ob)) {
133 run.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, (String) ob, Units.toEMU(100),
134 Units.toEMU(100));
135 }
136 }
137 }
138 }
139 }
140 }
141 }
142
143 public static void changeTableText(XWPFDocument document, Map data) {
144 // 获取文件的表格
145 List tableList = document.getTables();
146
147 // 循环所有需要进行替换的文本,进行替换
148 for (int i = 0; i ) {
149 XWPFTable table = tableList.get(i);
150 if (checkText(table.getText())) {
151 List rows = table.getRows();
152 // 遍历表格,并替换模板
153 eachTable(document, rows, data);
154 }
155 }
156 }
157
158 public static void changeTablePic(XWPFDocument document, Map pic) throws Exception {
159 List tableList = document.getTables();
160
161 // 循环所有需要替换的文本,进行替换
162 for (int i = 0; i ) {
163 XWPFTable table = tableList.get(i);
164 if (checkText(table.getText())) {
165 List rows = table.getRows();
166 System.out.println("简单表格替换:" + rows);
167 // 遍历表格,并替换模板
168 eachTablePic(document, rows, pic);
169 }
170 }
171 }
172
173 public static void eachTablePic(XWPFDocument document, List rows, Map pic)
174 throws Exception {
175 for (XWPFTableRow row : rows) {
176 List cells = row.getTableCells();
177 for (XWPFTableCell cell : cells) {
178 // 判断单元格是否需要替换
179 if (checkText(cell.getText())) {
180 List paragraphs = cell.getParagraphs();
181 for (XWPFParagraph paragraph : paragraphs) {
182 List runs = paragraph.getRuns();
183 for (XWPFRun run : runs) {
184 Object ob = changeValue(run.toString(), pic);
185 if (ob instanceof String) {
186 System.out.println("run" + "‘" + run.toString() + "‘");
187 if (pic.containsKey(run.toString())) {
188 System.out.println("run" + run.toString() + "替换为" + ob);
189 run.setText("", 0);
190 try (FileInputStream is = new FileInputStream((String) ob)) {
191 run.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, (String) ob, Units.toEMU(100),
192 Units.toEMU(100));
193 }
194 } else {
195 System.out.println("‘" + run.toString() + "‘ 不匹配");
196 }
197 }
198 }
199 }
200 }
201 }
202 }
203 }
204
205 public static Object changeValue(String value, Map textMap) {
206 Set> textSets = textMap.entrySet();
207 Object valu = "";
208 for (Map.Entry textSet : textSets) {
209 // 匹配模板与替换值 格式${key}
210 String key = textSet.getKey();
211 if (value.contains(key)) {
212 valu = textSet.getValue();
213 }
214 }
215 return valu;
216 }
217
218 public static void eachTable(XWPFDocument document, List rows, Map textMap) {
219 for (XWPFTableRow row : rows) {
220 List cells = row.getTableCells();
221 for (XWPFTableCell cell : cells) {
222 // 判断单元格是否需要替换
223 if (checkText(cell.getText())) {
224 // System.out.println("cell:" + cell.getText());
225 List paragraphs = cell.getParagraphs();
226 for (XWPFParagraph paragraph : paragraphs) {
227 List runs = paragraph.getRuns();
228 for (XWPFRun run : runs) {
229
230 Object ob = changeValue(run.toString(), textMap);
231 if (ob instanceof String) {
232
233 System.out.println("run:" + "‘" + run.toString() + "‘");
234 if (textMap.containsKey(run.toString())) {
235 System.out.println("run:" + run.toString() + "替换为" + ob);
236 run.setText((String) ob, 0);
237 } else {
238 System.out.println("‘" + run.toString() + "‘不匹配");
239 }
240 }
241 }
242 }
243 }
244 }
245 }
246 }
247 }
Java POI Word模板数据填充
标签:表达 arraylist author 有序 mil print set 原来 段落
原文地址:https://www.cnblogs.com/gslgb/p/12896587.html
评论