用Java的POI库创建带图片、表格和文本的Word文档
最编程
2024-02-03 18:54:19
...
1 2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.FileNotFoundException;
6 import java.io.FileOutputStream;
7 import java.io.IOException;
8 import java.io.OutputStream;
9 import java.io.UnsupportedEncodingException;
10 import java.math.BigInteger;
11 import java.util.ArrayList;
12 import java.util.List;
13
14 import org.apache.poi.util.Units;
15 import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
16 import org.apache.poi.xwpf.usermodel.XWPFDocument;
17 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
18 import org.apache.poi.xwpf.usermodel.XWPFRun;
19 import org.apache.poi.xwpf.usermodel.XWPFTable;
20 import org.apache.poi.xwpf.usermodel.XWPFTableCell;
21 import org.apache.poi.xwpf.usermodel.XWPFTableRow;
22 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;
23 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
24 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing;
25 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
26 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr;
27 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
28 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
29 import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc;
30 import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
31 import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
32
33 public class DownloadWordDemo {
34 /**
35 * 跨列合并
36 * @param table
37 * @param row 所合并的行
38 * @param fromCell 起始列
39 * @param toCell 终止列
40 * @Description
41 */
42 public void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {
43 for(int cellIndex = fromCell; cellIndex <= toCell; cellIndex++ ) {
44 XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
45 if(cellIndex == fromCell) {
46 cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
47 } else {
48 cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
49 }
50 }
51 }
52 /**
53 * 跨行合并
54 * @param table
55 * @param col 合并的列
56 * @param fromRow 起始行
57 * @param toRow 终止行
58 * @Description
59 */
60 public void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
61 for(int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
62 XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
63 //第一个合并单元格用重启合并值设置
64 if(rowIndex == fromRow) {
65 cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
66 } else {
67 //合并第一个单元格的单元被设置为“继续”
68 cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
69 }
70 }
71 }
72 /**
73 * @Description: 设置表格总宽度与水平对齐方式
74 */
75 public void setTableWidthAndHAlign(XWPFTable table, String width,
76 STJc.Enum enumValue) {
77 CTTblPr tblPr = getTableCTTblPr(table);
78 // 表格宽度
79 CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();
80 if (enumValue != null) {
81 CTJc cTJc = tblPr.addNewJc();
82 cTJc.setVal(enumValue);
83 }
84 // 设置宽度
85 tblWidth.setW(new BigInteger(width));
86 tblWidth.setType(STTblWidth.DXA);
87 }
88 /**
89 * @Description: 得到Table的CTTblPr,不存在则新建
90 */
91 public CTTblPr getTableCTTblPr(XWPFTable table) {
92 CTTbl ttbl = table.getCTTbl();
93 // 表格属性
94 CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();
95 return tblPr;
96 }
97 public void downloadWord() throws IOException {
98 String filePath = "D:\\";
99 CreatTableStructureTest ct = new CreatTableStructureTest();
100 //生成一个文档
101 XWPFDocument document = new XWPFDocument();
102
103
104 XWPFParagraph para; //代表文档、表格、标题等种的段落,由多个XWPFRun组成
105 XWPFRun run; //代表具有同样风格的一段文本
106 XWPFTableRow row;//代表表格的一行
107 XWPFTableCell cell;//代表表格的一个单元格
108 CTTcPr cellPr; //单元格属性
109
110 //设置提案封面内容
111 XWPFParagraph proCoverParagraph = document.createParagraph(); //新建一个标题段落对象(就是一段文字)
112 proCoverParagraph.setAlignment(ParagraphAlignment.LEFT);//样式居中
113 XWPFRun coverRun0 = proCoverParagraph.createRun(); //创建文本对象
114 coverRun0.setBold(true); //加粗
115 coverRun0.setFontSize(12); //字体大小
116 coverRun0.setText(String.valueOf("附件:\r"));
117
118
119 XWPFParagraph proCoverParagraph1 = document.createParagraph(); //新建一个标题段落对象(就是一段文字)
120 proCoverParagraph1.setAlignment(ParagraphAlignment.CENTER);//样式左对齐
121 XWPFRun coverRun1 = proCoverParagraph1.createRun(); //创建文本对象
122 coverRun1.setBold(true); //加粗
123 coverRun1.setFontSize(41); //字体大小
124 coverRun1.setText(String.valueOf("不如意事常八九\r可与人言无二三\r\r提\r\r案\r\r表\r\r"));
125
126 XWPFParagraph proCoverParagraph2 = document.createParagraph(); //新建一个标题段落对象(就是一段文字)
127 proCoverParagraph2.setAlignment(ParagraphAlignment.LEFT);//样式居中
128 XWPFRun coverRun2 = proCoverParagraph2.createRun(); //创建文本对象
129 coverRun2.setBold(true); //加粗
130 coverRun2.setFontSize(16); //字体大小
131 coverRun2.setText(String.valueOf("\r编号:"+"2020001"+"\r填表时间:"+"2020"+"年"+"10"+"月"+"20"+"日"));//给文本赋值
132
133
134 //创建表格
135 XWPFTable table = document.createTable(10,9); //10行9格
136 table.setCellMargins(3, 5, 3, 5);//在表级别设置单元格边距
137
138 //设置表格总宽度,字体居中
139 ct.setTableWidthAndHAlign(table, "10000", STJc.CENTER);
140
141 //固定表格宽度,关闭自动伸缩
142 CTTblPr tblPr = table.getCTTbl().getTblPr();
143 tblPr.getTblW().setType(STTblWidth.DXA);
144
145
146 //设置表格样式
147 List<XWPFTableRow> rowList = table.getRows();
148 //扫描行
149 for(int i = 0; i < rowList.size(); i++) {
150 XWPFTableRow infoTableRow = rowList.get(i);
151 List<XWPFTableCell> cellList = infoTableRow.getTableCells();
152 //扫描列
153 for(int j = 0; j < cellList.size(); j++) {
154 XWPFParagraph cellParagraph = cellList.get(j).getParagraphArray(0);
155 cellParagraph.setAlignment(ParagraphAlignment.CENTER);//设置表格内容水平居中
156 XWPFRun cellParagraphRun = cellParagraph.createRun();//在段落创建一个文本
157 cellParagraphRun.setFontSize(12);//设置字体大小
158 cellParagraphRun.setBold(true);//加粗
159 }
160 }
161
162 XWPFTableCell cell1 = null;
163 cell1 = table.getRow(2).getCell(0);
164 cell1.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); //设置第3~7行第1列单元格的内容垂直居中
165
166
167 //设置表格每列宽度
168 for(int i=0;i<10;i++) {
169 row = table.getRow(i);
170 //设置每行的格式(多少格)
171 for(int j=0;j<9;j++) {
172 cell = row.getCell(j);//获取行中第j块单元格
173
174 //设置单元格列宽
175 CTTcPr tcpr = cell.getCTTc().addNewTcPr();
176 CTTblWidth cellw = tcpr.addNewTcW();
177 if(j==0) {
178 cellw.setW(BigInteger.valueOf(1900));
179 }
180 if(j==1||j==5) {
181 cellw.setW(BigInteger.valueOf(550));
182 }
183 if(j==2||j==4||j==6||j==8) {
184 cellw.setW(BigInteger.valueOf(1280));
185 }
186 if(j==3||j==7) {
187 cellw.setW(BigInteger.valueOf(940));
188 }
189 }
190 }
191
192 //合并表格
193 mergeCellsHorizontal(table,0,1,8);//合并第一行,第2~9列
194 mergeCellsHorizontal(table,2,1,8);
195 mergeCellsHorizontal(table,3,1,8);
196 mergeCellsHorizontal(table,4,1,8);
197 mergeCellsHorizontal(table,5,1,8);
198 mergeCellsHorizontal(table,6,1,8);
199 mergeCellsVertically(table,0,2,6);//合并第1列,第3~7行
200 mergeCellsVertically(table,1,2,6);//合并第2列,3~7行
201
202 //对赋值表格
203 List<XWPFTableRow> rowList1 = table.getRows();
204 List<XWPFTableCell> cellList = new ArrayList<XWPFTableCell>();
205 XWPFParagraph cellParagraph = null;//存一行的列
206 XWPFRun cellParagraphRun = null;//单元格
207 //第1行第1列
208 cellList = rowList1.get(0).getTableCells();
209 cellParagraph = cellList.get(0).getParagraphArray(0);
210 cellParagraphRun = cellParagraph.getRuns().get(0);
211 cellParagraphRun.setText(String.valueOf("案名"));
212 cellParagraph = cellList.get(1).getParagraphArray(0);//第2格的段落
213 //第一行第2列
214 cellParagraphRun = cellParagraph.getRuns().get(0);
215 cellParagraphRun.setText(String.valueOf("案名是习惯过了头地方案名是习惯过了头"));
216
217 //第3行第1列
218 cellList = rowList1.get(2).getTableCells();
219 cellParagraph = cellList.get(0).getParagraphArray(0);//第2格的段落
220 cellParagraphRun = cellParagraph.getRuns().get(0);
221 cellParagraphRun.setText(String.valueOf("习惯过了头"));
222
223 //第3行第2列
224 cellParagraph = cellList.get(1).getParagraphArray(0);//第2格的段落
225 cellParagraph.setAlignment(ParagraphAlignment.LEFT);//设置左对齐
226 cellParagraphRun = cellParagraph.getRuns().get(0);
227 cellParagraphRun.setText(String.valueOf("习惯过了头:"));
228
229 //添加图片
230 try (FileInputStream is = new FileInputStream
231 (filePath+"1.jpg")) {
232 cellParagraphRun.addPicture(is, XWPFDocument.PICTURE_TYPE_JPEG,
233 filePath+"1.jpg",
234 Units.toEMU(120), Units.toEMU(20)); // 200x200 pixels
235 }catch (Exception e){
236 e.printStackTrace();
237 }
238 cellParagraphRun.addBreak();//换行
239 cellParagraphRun.addBreak();
240 XWPFRun cellParagraphRun1 = cellParagraph.createRun();
241 cellParagraphRun1.setFontFamily("微软雅黑");//设置字体
242 cellParagraphRun1.setText("c15宿舍要消毒");
243
244
245 //导出word文档
246 String fileName = "D:/poi导出word文档.docx";
247 File outputFolder = new File("D:/");
248 if (!outputFolder.exists()) {
249 outputFolder.mkdir();
250 }
251 String encode = System.getProperty("file.encoding");
252 try {
253 fileName = new String(fileName.getBytes("UTF-8"),encode);
254 } catch (UnsupportedEncodingException e1) {
255 e1.printStackTrace();
256 }
257 try {
258 FileOutputStream fout = new FileOutputStream(fileName);
259 document.write(fout);
260 fout.close();
261 } catch (FileNotFoundException e) {
262 e.printStackTrace();
263 } catch (IOException e) {
264 e.printStackTrace();
265 }
266
267 }
268 public static void main(String[] args) throws IOException {
269 DownloadWordDemo dw = new DownloadWordDemo();
270 dw.downloadWord();
271
272 }
273
274 }
上一篇: 初探C++程序的基本构成