以下是導出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