目录
1 Maven依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.17</version>
</dependency>
2 copy()(第一种方法)
2.1 调试代码
/**
* 复制行
*/
@GetMapping("/copyRow1")
public void copyRow1(HttpServletResponse response) {
String templateFileName = "D:/test/模板.docx";
try {
InputStream inputStream = new FileInputStream(templateFileName);
XWPFDocument document = new XWPFDocument(inputStream);
XWPFTable table = document.getTableArray(0);
XWPFTableRow twoRow = table.getRow(1);
//将第二行复制到第三行
XmlObject copy = twoRow.getCtRow().copy();
table.addRow(new XWPFTableRow((CTRow) copy, table));
twoRow.getCell(0).setText("第二行");
//获取复制的第三行
XWPFTableRow threeRow = table.getRow(2);
threeRow.getCell(0).setText("第三行");
//保存文件
String fileName="模板.docx";
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("utf-8"),"ISO-8859-1"));
OutputStream outputStream=response.getOutputStream();
document.write(outputStream);
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
2.2 调试结果
3 手动复制行(第二种方法推荐)
3.1 调试代码
/**
* 复制行
*/
@GetMapping("/copyRow2")
public void copyRow2(HttpServletResponse response) {
String templateFileName = "D:/test/模板.docx";
try {
InputStream inputStream = new FileInputStream(templateFileName);
XWPFDocument document = new XWPFDocument(inputStream);
XWPFTable table = document.getTableArray(0);
XWPFTableRow twoRow = table.getRow(1);
twoRow.getCell(0).setText("第二行");
//创建第三行
XWPFTableRow threeRow = table.insertNewTableRow(2);
//将第二行复制到第三行
createCellsAndCopyStyles(threeRow, twoRow);
threeRow.getCell(0).setText("第三行");
//保存文件
String fileName = "模板.docx";
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("utf-8"), "ISO-8859-1"));
OutputStream outputStream = response.getOutputStream();
document.write(outputStream);
outputStream.flush();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 复制单元格和样式
*
* @param targetRow 要复制的行
* @param sourceRow 被复制的行
*/
public static void createCellsAndCopyStyles(XWPFTableRow targetRow, XWPFTableRow sourceRow) {
targetRow.getCtRow().setTrPr(sourceRow.getCtRow().getTrPr());
List<XWPFTableCell> tableCells = sourceRow.getTableCells();
if (CollectionUtils.isEmpty(tableCells)) {
return;
}
for (XWPFTableCell sourceCell : tableCells) {
XWPFTableCell newCell = targetRow.addNewTableCell();
newCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr());
List sourceParagraphs = sourceCell.getParagraphs();
if (CollUtil.isEmpty(sourceParagraphs)) {
continue;
}
XWPFParagraph sourceParagraph = (XWPFParagraph) sourceParagraphs.get(0);
List targetParagraphs = newCell.getParagraphs();
XWPFParagraph targetParagraph = CollUtil.isEmpty(targetParagraphs) ? newCell.addParagraph() : (XWPFParagraph) targetParagraphs.get(0);
targetParagraph.getCTP().setPPr(sourceParagraph.getCTP().getPPr());
XWPFRun targetRun = targetParagraph.getRuns().isEmpty()
? targetParagraph.createRun() : targetParagraph.getRuns().get(0);
List<XWPFRun> sourceRunList=sourceParagraph.getRuns();
if (CollUtil.isNotEmpty(sourceRunList)) {
XWPFRun sourceRun=sourceRunList.get(0);
//字体名称
targetRun.setFontFamily(sourceRun.getFontFamily());
//字体大小
targetRun.setFontSize(sourceRun.getFontSize());
//字体颜色
targetRun.setColor(sourceRun.getColor());
//字体加粗
targetRun.setBold(sourceRun.isBold());
//字体倾斜
targetRun.setItalic(sourceRun.isItalic());
}
}
}
3.2 调试结果
注:
(1)第一种方法使用copy()复制的单元格无法写入内容,推荐使用第二种方法手动复制行。
(2)源码请查看Gitee。
xudongbase: 主要是项目中可以用到的共通方法https://gitee.com/xudong_master/xudongbase