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