java导出word文件,包括导出图片和表格
如下图:
导出word所需maven依赖
<!-- 导出word所需maven依赖 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.14</version>
</dependency>
直接上代码,里面都添加注释了,可读性还可以
package com.example.demo;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
import java.io.*;
import java.math.BigInteger;
import java.util.List;
/**
* 导出word带图片
*
* @program: demo
* @author: xlk
* @create: 2020-12-09 17:15
*/
public class OutWordAndImg {
public static void main(String[] args) throws IOException, InvalidFormatException {
XWPFDocument doc = new XWPFDocument();
XWPFParagraph para;
XWPFRun run;
//创建表格
// 行标签
int rows = 4;
//列标签
int cols = 2;
XWPFTable table = doc.createTable(rows, cols);
table.setCellMargins(3, 5, 3, 5);
// table.addNewCol();//添加新列
// table.createRow();//添加新行
String[] title1 = new String[]{"标题", "详情",}; // 数组长度要和 cols 长度一致
// String[] title2 = new String[]{"调查目的"," ", };
XWPFTableRow row;
XWPFTableCell cell;
CTTcPr cellPr;
//遍历行 j 是行 y 是每一行的列
for (int j = 0; j < rows; j++) {
row = table.getRow(j);
row.setHeight(1000);
//第一行 标题栏
for (int y = 0; y < title1.length; y++) {
//创建单元格
cell = row.getCell(y);
//单元格属性
cellPr = cell.getCTTc().addNewTcPr();
//设置宽度
cellPr.addNewTcW().setW(BigInteger.valueOf(4000));
//垂直居中
cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
//第一个段落
para = cell.getParagraphs().get(0);
//设置对齐方式
para.setAlignment(ParagraphAlignment.CENTER);
//段落的对齐方式 1左 2中 3右 4往上 左 不可写0和负数
para.setFontAlignment(2);
//一个XWPFRun代表具有相同属性的一个区域:一段文本
run = para.createRun();
//设置字体
run.setFontFamily("仿宋");
//设置字体大小
run.setFontSize(11);
if (j == 0) {
//字体宽
// run.setBold(true);
run.setText(title1[y]);
}
}
//第二行
if (j == 1) {
String imgPath = "C:\\Users\\admin-xu\\Desktop\\图片\\1.jpg";
for (int y = 0; y < cols; y++) {
// 第一列添加图片
if (y == 0) {
cell = row.getCell(y);
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
//通过文件流写入图片
List<XWPFParagraph> paragraphs = cell.getParagraphs();
XWPFParagraph newPara = paragraphs.get(0);
XWPFRun imageCellRunn = newPara.createRun();
File image = new File(imgPath);
if (!image.exists()) {
continue;
}
try (FileInputStream is = new FileInputStream(imgPath)) {
imageCellRunn.addPicture(is, XWPFDocument.PICTURE_TYPE_JPEG, image.getName(), Units.toEMU(180), Units.toEMU(180)); // 180*180 pixels
} catch (Exception e) {
e.printStackTrace();
}
}
//第二列添加文字
if (y == 1) {
cell = row.getCell(y);
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
cell.setText(" 左边填充图片 ");
}
if (y == 2) {
cell = row.getCell(y);
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
}
}
}
//第 3 行
if (j == 2) {
String imgPath = "C:\\Users\\admin-xu\\Desktop\\图片\\2.jpg";
for (int y = 0; y < cols; y++) {
// 第一列添加文字说明
if (y == 0) {
cell = row.getCell(0);
cellPr = cell.getCTTc().addNewTcPr();
cellPr.addNewTcW().setW(BigInteger.valueOf(4000));
para = cell.getParagraphs().get(0);
para.setAlignment(ParagraphAlignment.CENTER);
para.setFontAlignment(2);
run = para.createRun();
run.setFontFamily("仿宋");
run.setFontSize(13);
run.setText("左边填充图片");
}
//第二列添加图片
if (y == 1) {
cell = row.getCell(y);
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
List<XWPFParagraph> paragraphs = cell.getParagraphs();
XWPFParagraph newPara = paragraphs.get(0);
XWPFRun imageCellRunn = newPara.createRun();
File image = new File(imgPath);
if (!image.exists()) {
continue;
}
try (FileInputStream is = new FileInputStream(imgPath)) {
imageCellRunn.addPicture(is, XWPFDocument.PICTURE_TYPE_JPEG, image.getName(), Units.toEMU(90), Units.toEMU(90)); // 90*90 pixels
} catch (Exception e) {
e.printStackTrace();
}
} else {
cell = row.getCell(y);
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
}
}
}
//第 4 行
if (j == 3) {
for (int y = 0; y < cols; y++) {
// 第一列添加文字说明
if (y == 0) {
cell = row.getCell(0);
cellPr = cell.getCTTc().addNewTcPr();
cellPr.addNewTcW().setW(BigInteger.valueOf(4000));
para = cell.getParagraphs().get(0);
para.setAlignment(ParagraphAlignment.CENTER);
para.setFontAlignment(2);
run = para.createRun();
run.setFontFamily("仿宋");
run.setFontSize(13);
run.setText("我是标题");
}
//第二列 添加文字内容
if (y == 1) {
cell = row.getCell(y);
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
cell.setText("我是文字内容");
/*cell.setText("(1)照片拍摄位置经纬度:");
cellPr = cell.getCTTc().addNewTcPr();
//设置宽度
cellPr.addNewTcW().setW(BigInteger.valueOf(2000));
//第一个段落
para = cell.getParagraphs().get(0);
//设置对齐方式
para.setAlignment(ParagraphAlignment.LEFT);
//居左
para.setFontAlignment(1);
run = para.createRun();
run.addBreak();
run.addBreak();
cell.setText(" 经度:");
run = para.createRun();
run.addBreak();
run.addBreak();
cell.setText(" 经度:");
run = para.createRun();
run.addBreak();
run.addBreak();
cell.setText("(2)照片拍摄时间:");*/
} else {
cell = row.getCell(y);
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
}
}
}
}
// 写出文件
OutputStream os = new FileOutputStream("E:\\outWord.doc");
doc.write(os);
if (os != null) {
try {
os.close();
System.out.println("文件输出成功....");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}