poi3.17 生成word - 简书 - 有点用

需要的包

org.apache.poi:poi-ooxml:3.17
org.apache.poi:ooxml-schemas:1.4

跨列合并单元格

public void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {
      for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
            XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
            if (cellIndex == fromCell) {
                // 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);
            }
        }
    }

跨行并单元格

public void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
        for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
            XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
            if (rowIndex == fromRow) {
                // 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);
            }
        }
    }

表格内单元格内容水平居中

public void horizontally(XWPFTableCell cell) {
        CTTc cttc = cell.getCTTc();
        CTP ctp = cttc.getPList().get(0);
        CTPPr ctppr = ctp.getPPr();
        if (ctppr == null) {
            ctppr = ctp.addNewPPr();
        }
        CTJc ctjc = ctppr.getJc();
        if (ctjc == null) {
            ctjc = ctppr.addNewJc();
        }
        ctjc.setVal(STJc.CENTER); //水平居中
    }
注意:如果单元格内容是paragraph(段落),则无效,请使用段落paragraph自带的 paragraph.setAlignment(ParagraphAlignment.CENTER)方法设置水平居中

创建超链接

public void createHyperlinks(XWPFParagraph paragraph, String target, String stringValue){
        String paraId = paragraph.getDocument().getPackagePart().addExternalRelationship(target, XWPFRelation.HYPERLINK.getRelation()).getId();
        CTHyperlink cLink = paragraph.getCTP().addNewHyperlink();
        cLink.setId(paraId);

        CTText ctText = CTText.Factory.newInstance();
        ctText.setStringValue(stringValue);
        CTR ctr = CTR.Factory.newInstance();

        //设置超链接样式
        CTRPr rpr = ctr.addNewRPr();
        CTColor color = CTColor.Factory.newInstance();
        color.setVal("0000FF");
        rpr.setColor(color);
        rpr.addNewU().setVal(STUnderline.SINGLE);

        ctr.setTArray(new CTText[]{ctText});
        cLink.setRArray(new CTR[]{ctr});
    }
创建超链接参考地址

设置单元格宽度

public void setCellWith(XWPFTableCell cell, int witch) {
        CTTblWidth cellw = cell.getCTTc().addNewTcPr().addNewTcW();
        cellw.setType(STTblWidth.DXA);
        cellw.setW(BigInteger.valueOf(witch));
    }

创建document

  XWPFDocument document = new XWPFDocument();

创建table

  XWPFTable table = document.createTable();
注意:创建table可以指定行数、列数,如: document.createTable(5,2),第一个参数是行数,第二个参数为列数

表格内创建一行

//获取第一行
XWPFTableRow row = table.getRow(0);
//创建行
row = table.createRow();
注意:使用document.createTable()创建表格后,会自动创建第一行、第一行中的第一个单元格,所以第一行不需要再创建

行内创建一列

//获取某一行的第一个单元格
XWPFTableCell cell = row.getCell(0);
//在某一行的末尾创建单元格
cell = row.createCell();
注意:使用 table.createRow()创建行后,会自动创建第一个单元格,所以第一个单元格不需要再创建

设置行高

CTTrPr trPr = row.getCtRow().addNewTrPr();
CTHeight ht = trPr.addNewTrHeight();
ht.setVal(BigInteger.valueOf(900));

单元格设置垂直居中

cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER); //垂直居中

单元格内插入段落

XWPFParagraph paragraph = cell.addParagraph();
XWPFRun run = paragraph.createRun();
paragraph.setAlignment(ParagraphAlignment.CENTER);//对齐方式
run.setText("实验报告书");
run.setBold(true);
run.setFontSize(16);
//清除第一个单元格内的段落,不然会出现一个空行或重复的XWPFRun中text的内容
cell.removeParagraph(0);

单元格内插入图片(其实就是单元格内插入段落,段落内插入图片)

XWPFParagraph paragraph = cell.addParagraph();
XWPFRun run = paragraph.createRun();
byte[] download = GoFastDfsUtils.download(path);
//第一个参数为图片的流,第二个参数为图片的类型,第三个参数为图片名称,第四、第五的参数不太懂,好像是宽高,但是要转换
run.addPicture(new ByteArrayInputStream(download), XWPFDocument.PICTURE_TYPE_PNG, oeAnnex.getName(), Units.toEMU(100), Units.toEMU(80));
单元格内插入段落、图片参考地址

段落距离上面100、首行缩进200、每一行都缩进200(别问我100、200这个的单位是什么,问就是不懂)

//距离上面100
paragraph.setSpacingBefore(100);
//首行缩进200
paragraph.setIndentationFirstLine(200);
//每一行都缩进200
paragraph.setIndentationLeft(200);

设置单元格边框

CTTcBorders tblBorders = cell.getCTTc().getTcPr().addNewTcBorders();
tblBorders.addNewTop().setVal(STBorder.NIL);
tblBorders.addNewRight().setVal(STBorder.NIL);
tblBorders.addNewBottom().setVal(STBorder.NIL);
tblBorders.addNewLeft().setVal(STBorder.NIL);

创建段落

XWPFParagraph paragraph = document.createParagraph();
//段落内换行
run.addBreak();

结束

document.write(outputStream);
document.close();

原网址: 访问
创建于: 2023-03-22 14:42:35
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论