1. 程式人生 > 實用技巧 >java使用POI匯出word文件,包含圖片,表格,文字

java使用POI匯出word文件,包含圖片,表格,文字

以下是匯出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:\\";
 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 }

POI的官網,裡面可以看到官方的API文件:

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