java使用POI导出word文档,包含图片,表格,文本

时间:2024-02-21 19:19:21

 以下是导出word文档包含文本、图片、表格

首先声明一些基本概念:

XWPFDocument代表一个docx文档,其可以用来读docx文档,也可以用来写docx文档
XWPFParagraph代表文档、表格、标题等种的段落,由多个XWPFRun组成
XWPFRun代表具有同样风格的一段文本
XWPFTable代表一个表格
XWPFTableRow代表表格的一行
XWPFTableCell代表表格的一个单元格
XWPFPicture 代表图片

下面是导出的word文档

 

 对象的部分说明:

XWPFDocument对象可以包含多个段落,表格,图片
XWPFParagraph对象代表文档、表格、标题等种的段落,由多个XWPFRun组成

1.createRun(),在段落里创建一个XWPFRun文本

2..setAlignment(ParagraphAlignment.CENTER)设置段落内容水平居中

XWPFRun代表具有同样风格的一段文本。注意:直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun。

以上代码使用到的XWPFRun方法是:

1.setText(String 内容),设置文本的内容

2.addBreak(),换行

3.setFontFamily(string 字体类型),设置字体类型,如宋体、微软雅黑、黑体等

4.addPicture(is, XWPFDocument.PICTURE_TYPE_JPEG, filePath+"1.jpg", Units.toEMU(120), Units.toEMU(20))。

第1个参数为文件输入流,第二个参数为图片类型如jpg类型,第三个参数为图片路径,第四个参数为图片宽度,第五个参数为图片高度。

5..setBold(true)设置字体是否加粗,false表示不加粗

6..setFontSize(12)//设置字体大小

XWPFTable代表一个表格
XWPFTableRow代表表格的一行
XWPFTableCell代表表格的一个单元格,每一个单元格都包含一个段落

1.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER)设置单元格内容垂直居中
XWPFPicture 代表图片

 

 以下是导出文档的代码:(注意:运行以下代码时,要在D盘放一张.jpg图片,图片名为1.jpg)

  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:\\";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 }

 以上代码是写在maven项目里的,需要导入jar包,pom.xml里的代码要加上以下内容:

 1  <dependencies>    
 2     <dependency>
 3        <groupId>org.apache.poi</groupId>
 4        <artifactId>poi-scratchpad</artifactId>
 5        <version>3.17</version>
 6     </dependency>
 7     
 8     <dependency>
 9         <groupId>org.apache.poi</groupId>
10         <artifactId>poi-ooxml</artifactId>
11         <version>3.17</version>
12     </dependency>
13     
14     <dependency>
15         <groupId>org.apache.poi</groupId>
16         <artifactId>poi</artifactId>
17         <version>3.17</version>
18     </dependency>
19 </dependencies>

 

 POI的官网,里面可以看到官方的API文档:

http://poi.apache.org/apidocs/index.html