docx文档操作
public void docxText() throws IOException {
InputStream is = this.getClass().getResourceAsStream("/wordTemplate/bb11.docx");
XWPFDocument doc = new XWPFDocument(is);
List<XWPFTable> tables = doc.getTables();
for (int i = 0; i < tables.size();i++){
for (int k = 0; k < tables.get(i).getNumberOfRows();k++){
for (int j = 0; j < tables.get(i).getRow(k).getTableCells().size();j++){
System.out.println("第"+i+"个表格"+"____第"+k+"行 = "+ "__第"+j+"列 ="+tables.get(i).getRow(k).getCell(j).getText());
}
}
}
}
复制和粘贴table表格:
InputStream is = this.getClass().getResourceAsStream("/wordTemplate/文档模板.docx");
XWPFDocument doc = new XWPFDocument(is);
OutputStream ot = new FileOutputStream(new ClassPathResource("/static/空文档.docx").getFile());
doc.createTable();
CTTbl ab = CTTbl.Factory.newInstance(); ab.set(doc.getTables().get(0).getCTTbl()); IBody iBody = doc.getTables().get(0).getBody(); XWPFTable newTable = new XWPFTable(ab, iBody); doc.setTable(1,newTable); doc.write(ot); doc.close(); is.close();
复制一行且写入:
方法一(不建议,插入数据有问题)
tables.get(0).addRow(tables.get(0).getRow(2),x+2);//参数一为复制哪一行,参数二为写入那一行
方法二
table.insertNewTableRow(指定添加的行数); createCellsAndCopyStyles(指定添加的行数, 复制的行模板);
private 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.setText(sourceCell.getText());//是否需要复制行的内容
newCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr());
List<XWPFParagraph> sourceParagraphs = sourceCell.getParagraphs();
if (CollectionUtils.isEmpty(sourceParagraphs)) {
continue;
}
XWPFParagraph sourceParagraph = sourceParagraphs.get(0);
List<XWPFParagraph> targetParagraphs = newCell.getParagraphs();
if (CollectionUtils.isEmpty(targetParagraphs)) {
XWPFParagraph p = newCell.addParagraph();
p.getCTP().setPPr(sourceParagraph.getCTP().getPPr());
XWPFRun run = p.getRuns().isEmpty() ? p.createRun() : p.getRuns().get(0);
run.setFontFamily(sourceParagraph.getRuns().get(0).getFontFamily());
} else {
XWPFParagraph p = targetParagraphs.get(0);
p.getCTP().setPPr(sourceParagraph.getCTP().getPPr());
XWPFRun run = p.getRuns().isEmpty() ? p.createRun() : p.getRuns().get(0);
XWPFParagraph x = sourceParagraph;
if(sourceParagraph.getRuns().size() > 0){
run.setFontFamily(sourceParagraph.getRuns().get(0).getFontFamily());
}
}
}
}
设置内容换行:
tables2.get(0).getRow(i+2).getCell(3).setText(String.valueOf(i+1)+"\r");
设置列内容背景颜色:
getCell(index).setColor("FFFF00");
合并单元格:
package com.sxygsj.risk.util.file.poi; import com.fasterxml.jackson.databind.exc.InvalidFormatException; import org.apache.poi.xwpf.usermodel.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; /** * @Author LLF * @Date Created in 2021/9/24 17:27 * @Description * @Version 2.0 **/ public class WordUtil { /** * word单元格列合并 * @param table 表格 * @param row 合并列所在行 * @param startCell 开始列 * @param endCell 结束列 */ public static void mergeCellsHorizontal(XWPFTable table, int row, int startCell, int endCell) { for (int i = startCell; i <= endCell; i++) { XWPFTableCell cell = table.getRow(row).getCell(i); if (i == startCell) { // The first merged cell is set with RESTART merge value cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART); } else { // Cells which join (merge) the first one, are set with CONTINUE cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE); } } } /** * word单元格行合并 * @param table 表格 * @param col 合并行所在列 * @param startRow 开始行 * @param endRow 结束行 */ public static void mergeCellsVertically(XWPFTable table, int col, int startRow, int endRow) { for (int i = startRow; i <= endRow; i++) { XWPFTableCell cell = table.getRow(i).getCell(col); if (i == startRow) { // The first merged cell is set with RESTART merge value cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART); } else { // Cells which join (merge) the first one, are set with CONTINUE cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE); } } } }
实际导出复杂格式文档:
表格头为页眉,因为每页都要求有表头,设置所有列宽为固定。
生产文档结果为:
@GetMapping(value = "bb12")
public void bb12(HttpServletResponse response,String stime,String etime,String rname) throws IOException, XmlException {
InputStream is = this.getClass().getResourceAsStream("/wordTemplate/bb12.docx");
XWPFDocument doc = new XWPFDocument(is);
List<XWPFTable> tables = doc.getTables();
OutputStream os = response.getOutputStream();
response.setContentType("application/octet-stream; charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + new String("文件名称".getBytes("gb2312"), "ISO8859-1")+".docx");
XWPFTable table = tables.get(0);
List<Map<String,Object>> list = riskService.findWord12(Utils.setFind(stime,etime,rname));
XWPFTableRow rowt = table.getRow(0);
if(list.size() > 1){
int countRows = 0;
for (int i = 0;i < list.size();i++){
if(i == 0){
table.getRows().get(countRows).getCell(0).setText(String.valueOf(i + 1));
table.getRow(countRows).getCell(1).setText(list.get(i).get("rtype").toString());
table.getRow(countRows).getCell(2).setText(list.get(i).get("rname").toString());
if (list.get(i).get("econtrolgrade").toString().equals("重大风险")) {
table.getRow(countRows).getCell(9).setColor("FF0000");
} else {
table.getRow(countRows).getCell(9).setColor("FFFF00");
}
table.getRow(countRows).getCell(9).setText(list.get(i).get("econtrolgrade").toString());
table.getRow(countRows).getCell(11).setText(list.get(i).get("eproject").toString());
table.getRow(countRows).getCell(12).setText(list.get(i).get("econtrolstep").toString());
table.getRow(countRows).getCell(13).setText(list.get(i).get("eprotect").toString());
table.getRow(countRows).getCell(14).setText(list.get(i).get("eyjcz").toString());
table.getRow(countRows).getCell(15).setText(list.get(i).get("econtrol").toString());
table.getRow(countRows ).getCell(16).setText(list.get(i).get("ename").toString());
}else {
table.insertNewTableRow(countRows + 1);
// table.insertNewTableRow(countRows + 2);
// table.insertNewTableRow(countRows + 3);
// createCellsAndCopyStyles(table.getRow(countRows + 1), table.getRow(0));
// createCellsAndCopyStyles(table.getRow(countRows + 2), table.getRow(1));
createCellsAndCopyStyles(table.getRow(countRows + 1), rowt);
table.getRows().get(countRows + 1).getCell(0).setText(String.valueOf(i + 1));
table.getRow(countRows + 1).getCell(1).setText(list.get(i).get("rtype").toString());
table.getRow(countRows + 1).getCell(2).setText(list.get(i).get("rname").toString());
if (list.get(i).get("econtrolgrade").toString().equals("重大风险")) {
table.getRow(countRows + 1).getCell(9).setColor("FF0000");
} else {
table.getRow(countRows + 1).getCell(9).setColor("FFFF00");
}
table.getRow(countRows + 1).getCell(9).setText(list.get(i).get("econtrolgrade").toString());
table.getRow(countRows + 1).getCell(11).setText(list.get(i).get("eproject").toString());
table.getRow(countRows + 1).getCell(12).setText(list.get(i).get("econtrolstep").toString());
table.getRow(countRows + 1).getCell(13).setText(list.get(i).get("eprotect").toString());
table.getRow(countRows + 1).getCell(14).setText(list.get(i).get("eyjcz").toString());
table.getRow(countRows + 1).getCell(15).setText(list.get(i).get("econtrol").toString());
table.getRow(countRows + 1).getCell(16).setText(list.get(i).get("ename").toString());
countRows++;
}
Map<String,Object> map = new HashMap<>();
map.put("rname",list.get(i).get("rname").toString());
List<Map<String,Object>> list2 = riskService.findWordList1(map);
int scount = countRows;
if(list2.size() > 1) {
for (int j = 0; j < list2.size(); j++) {
if(j == 0){
table.getRow(countRows).getCell(3).setText(String.valueOf(1+j));
table.getRow(countRows).getCell(4).setText(list2.get(j).get("emayrisk").toString());
table.getRow(countRows).getCell(5).setText(list2.get(j).get("egrade").toString());
table.getRow(countRows).getCell(6).setText(list2.get(j).get("sbjz").toString());
table.getRow(countRows).getCell(7).setText(list2.get(j).get("sbwendu").toString());
table.getRow(countRows).getCell(8).setText(list2.get(j).get("sbyali").toString());
table.getRow(countRows).getCell(10).setText(list2.get(j).get("eresult").toString());
}else{
table.insertNewTableRow(countRows + 1);
createCellsAndCopyStyles(table.getRow(countRows + 1), rowt);
table.getRow(countRows+1).getCell(3).setText(String.valueOf(1+j));
table.getRow(countRows+1).getCell(4).setText(list2.get(j).get("emayrisk").toString());
table.getRow(countRows+1).getCell(5).setText(list2.get(j).get("egrade").toString());
table.getRow(countRows+1).getCell(6).setText(list2.get(j).get("sbjz").toString());
table.getRow(countRows+1).getCell(7).setText(list2.get(j).get("sbwendu").toString());
table.getRow(countRows+1).getCell(8).setText(list2.get(j).get("sbyali").toString());
table.getRow(countRows+1).getCell(10).setText(list2.get(j).get("eresult").toString());
countRows++;
}
}
WordUtil.mergeCellsVertically(table,0,scount,countRows);
WordUtil.mergeCellsVertically(table,1,scount,countRows);
WordUtil.mergeCellsVertically(table,2,scount,countRows);
WordUtil.mergeCellsVertically(table,9,scount,countRows);
WordUtil.mergeCellsVertically(table,11,scount,countRows);
WordUtil.mergeCellsVertically(table,12,scount,countRows);
WordUtil.mergeCellsVertically(table,13,scount,countRows);
WordUtil.mergeCellsVertically(table,14,scount,countRows);
WordUtil.mergeCellsVertically(table,15,scount,countRows);
WordUtil.mergeCellsVertically(table,16,scount,countRows);
}else{
table.getRow(countRows).getCell(3).setText(String.valueOf(1));
table.getRow(countRows).getCell(4).setText(list2.get(0).get("emayrisk").toString());
table.getRow(countRows).getCell(5).setText(list2.get(0).get("egrade").toString());
table.getRow(countRows).getCell(6).setText(list2.get(0).get("sbjz").toString());
table.getRow(countRows).getCell(7).setText(list2.get(0).get("sbwendu").toString());
table.getRow(countRows).getCell(8).setText(list2.get(0).get("sbyali").toString());
table.getRow(countRows).getCell(10).setText(list2.get(0).get("eresult").toString());
}
}
}else{
table.getRow(0).getCell(0).setText(String.valueOf(1));
table.getRow(0).getCell(1).setText(list.get(0).get("rtype").toString());
table.getRow(0).getCell(2).setText(list.get(0).get("rname").toString());
if(list.get(0).get("econtrolgrade").toString().equals("重大风险")){
table.getRow(0).getCell(9).setColor("FF0000");
}else{
table.getRow(0).getCell(9).setColor("FFFF00");
}
table.getRow(0).getCell(9).setText(list.get(0).get("econtrolgrade").toString());
table.getRow(0).getCell(11).setText(list.get(0).get("eproject").toString());
table.getRow(0).getCell(12).setText(list.get(0).get("econtrolstep").toString());
table.getRow(0).getCell(13).setText(list.get(0).get("eprotect").toString());
table.getRow(0).getCell(14).setText(list.get(0).get("eyjcz").toString());
table.getRow(0).getCell(15).setText(list.get(0).get("econtrol").toString());
table.getRow(0).getCell(16).setText(list.get(0).get("ename").toString());
Map<String,Object> map = new HashMap<>();
map.put("rname",list.get(0).get("rname").toString());
List<Map<String,Object>> list2 = riskService.findWordList1(map);
if(list2.size() > 1) {
for (int j = 0; j < list2.size(); j++) {
table.insertNewTableRow(j + 1);
createCellsAndCopyStyles(table.getRow(j + 1), rowt);
table.getRow(j+1).getCell(3).setText(String.valueOf(1+j));
table.getRow(j+1).getCell(4).setText(list2.get(j).get("emayrisk").toString());
table.getRow(j+1).getCell(5).setText(list2.get(j).get("egrade").toString());
table.getRow(j+1).getCell(6).setText(list2.get(j).get("sbjz").toString());
table.getRow(j+1).getCell(7).setText(list2.get(j).get("sbwendu").toString());
table.getRow(j+1).getCell(8).setText(list2.get(j).get("sbyali").toString());
table.getRow(j+1).getCell(10).setText(list2.get(j).get("eresult").toString());
}
int ecount = list2.size();
WordUtil.mergeCellsVertically(table,0,0,ecount);
WordUtil.mergeCellsVertically(table,1,0,ecount);
WordUtil.mergeCellsVertically(table,2,0,ecount);
WordUtil.mergeCellsVertically(table,9,0,ecount);
WordUtil.mergeCellsVertically(table,11,0,ecount);
WordUtil.mergeCellsVertically(table,12,0,ecount);
WordUtil.mergeCellsVertically(table,13,0,ecount);
WordUtil.mergeCellsVertically(table,14,0,ecount);
WordUtil.mergeCellsVertically(table,15,0,ecount);
WordUtil.mergeCellsVertically(table,16,0,ecount);
WordUtil.mergeCellsVertically(table,3,0,1);
WordUtil.mergeCellsVertically(table,4,0,1);
WordUtil.mergeCellsVertically(table,5,0,1);
WordUtil.mergeCellsVertically(table,6,0,1);
WordUtil.mergeCellsVertically(table,7,0,1);
WordUtil.mergeCellsVertically(table,8,0,1);
WordUtil.mergeCellsVertically(table,10,0,1);
table.getRow(0).getCell(3).setText("1");
table.getRow(0).getCell(4).setText(list.get(0).get("emayrisk").toString());
table.getRow(0).getCell(5).setText(list.get(0).get("egrade").toString());
table.getRow(0).getCell(6).setText(list.get(0).get("sbjz").toString());
table.getRow(0).getCell(7).setText(list.get(0).get("sbwendu").toString());
table.getRow(0).getCell(8).setText(list.get(0).get("sbyali").toString());
table.getRow(0).getCell(10).setText(list.get(0).get("eresult").toString());
}else {
table.getRow(0).getCell(3).setText(String.valueOf(1));
table.getRow(0).getCell(4).setText(list2.get(0).get("emayrisk").toString());
table.getRow(0).getCell(5).setText(list2.get(0).get("egrade").toString());
table.getRow(0).getCell(6).setText(list2.get(0).get("sbjz").toString());
table.getRow(0).getCell(7).setText(list2.get(0).get("sbwendu").toString());
table.getRow(0).getCell(8)
.setText(list2.get(0).get("sbyali").toString());
table.getRow(0).getCell(10).setText(list2.get(0).get("eresult").toString());
}
}
doc.write(os);
is.close();
os.close();
}
doc文档操作
public static void main(String[] args) throws IOException {
HWPFDocument hwpfDocument = new HWPFDocument(new FileInputStream(new File("文件地址.doc")));
Range range = hwpfDocument.getRange();
TableIterator it = new TableIterator(range);
while (it.hasNext()) {
Table tables = it.next();
for (int i = 0; i < tables.numRows();i++){
TableRow row = tables.getRow(i);
for (int j = 0; j < row.numCells();j++){
System.out.println(i+"行"+j+"列:"+row.getCell(j).text());
}
}
}
}