java导出word(含图片、表格)

1.pom 引入

bash 复制代码
 <!--word报告生成依赖-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>

2.java代码示例

java 复制代码
public class test {
    public static void main(String[] args) throws IOException, InvalidFormatException {

        log.info("Word文档开始生成!");
        XWPFDocument document = new XWPFDocument();
        WriteHomePage(document,1,"SSS"); //写首页
        WriteText(document); //写表格前正文与题注
        WriteFirstTable(document); //写第一个表格

        FileOutputStream out = new FileOutputStream("Report.docx");
        document.write(out);
        out.close();
        document.close();
        log.info("Word文档已成功生成!");
    }
    public static XWPFDocument WriteHomePage(XWPFDocument document, int orb, String salliteName) throws IOException, InvalidFormatException {

        //插入图片
        String imgFile = "E:\\test.png";
        byte[] imageBytes = Files.readAllBytes(new File(imgFile).toPath());
        XWPFParagraph paragraph = document.createParagraph();
        XWPFRun run00 = paragraph.createRun();
        run00.setText(" ");
        int width = 200; // 图片宽度
        int height = 140; // 图片高度
        int pictureType = XWPFDocument.PICTURE_TYPE_PNG;
        run00.addPicture(new ByteArrayInputStream(imageBytes), pictureType, imgFile, Units.toEMU(width), Units.toEMU(height));
        //输入标题
        XWPFParagraph title1 = document.createParagraph();
        XWPFRun run = title1.createRun();
        run.setText("O00");
        run.setUnderline(UnderlinePatterns.SINGLE);
        run.setFontFamily("Times New Roman");
        run.setFontSize(28);
        run.setBold(true);
        run.setItalic(true);
        //不同字体设置的参数大小不同,需要尝试
        title1.setIndentationFirstLine(1130);// <!-- 设置首行缩进2字符 单位是 1/20 磅 -->
        run.addBreak();
        XWPFParagraph title2 = document.createParagraph();
        XWPFRun run1 = title2.createRun();
        run1.setText(salliteName+" Continuity of Data");
        run1.setFontFamily("Times New Roman");
        run1.setFontSize(28);
        run1.setBold(true);
        title2.setIndentationFirstLine(1130); // <!-- 设置首行缩进2字符 -->
        //设置空白行
        for (int i = 0; i < 16; i++) {
            XWPFParagraph blank = document.createParagraph();
            blank.createRun().setText("");
        }
        // 创建段落并设置右对齐样式
        XWPFParagraph footer = document.createParagraph();
        footer.setAlignment(ParagraphAlignment.RIGHT);
        // 创建页脚并添加到段落中
        XWPFRun run2 = footer.createRun();
        run2.setText("Data Center");
        run2.setFontSize(18);
        run2.setFontFamily("Times New Roman");
        run2.addBreak();
        XWPFRun run3 = footer.createRun();
        run3.setText("www.xxx.com");
        run3.setFontSize(18);
        run3.setFontFamily("Times New Roman");
        run3.setUnderline(UnderlinePatterns.SINGLE);
        run3.addBreak();
        return document;
    }

    public static XWPFDocument WriteText(XWPFDocument document){
        //新建一页,创建表格
        XWPFParagraph newPage = document.createParagraph();
        newPage.setPageBreak(true);
        XWPFParagraph para = document.createParagraph();
        XWPFRun run = para.createRun();
        run.setText("该报告数据内容正文如下。");
        run.setFontFamily("宋体");
        run.setFontSize(12);//小四
//        XWPFFont font =  ;
        para.setIndentationFirstLine(500); // <!-- 设置首行缩进2字符 -->
        para.setSpacingBetween(1.5f);
        //表题注
        XWPFParagraph para2 = document.createParagraph();
        XWPFRun runPara2 = para2.createRun();
        runPara2.setText("表1  数据概况");
        runPara2.setFontFamily("宋体");
        runPara2.setFontSize(12);
        para2.setAlignment(ParagraphAlignment.CENTER);
        para2.setVerticalAlignment(TextAlignment.CENTER);
        para2.setSpacingBetween(1.5f);
        return document;
    }

    //输入表格
    public static XWPFDocument WriteFirstTable(XWPFDocument document){
        int row = 2;
        int col = 2;
        XWPFTable table = document.createTable(row, col);
        // 设置表格行高
        for (XWPFTableRow tableRow : table.getRows()) {
            tableRow.setHeight(500);
        }
        table.setStyleID("Table Grid");
        table.setWidth("100%");
        //设置表格标题
        String[] titleArr = {"数据类型","数据连续性"};
        XWPFTableRow titleRow = table.getRow(0);
        //设置表头内容和样式,
        for (int i = 0; i < col; i++) {
            XWPFTableCell cell = titleRow.getCell(i);
            cell.getCTTc().addNewTcPr().addNewVAlign().setVal(STVerticalJc.CENTER);
            XWPFParagraph p = cell.getParagraphs().get(0);
            p.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun run3 = p.createRun();
            run3.setBold(true); // 设置字体加粗
            run3.setText(titleArr[i]);
        }
        //CTHMerge 横向合并,CTVMerge纵向合并, STMerge.RESTART 表示开始合并,为 STMerge.CONTINUE 表示继续合并
//        titleRow.getCell(4).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
//        titleRow.getCell(5).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
//        XWPFParagraph p = titleRow.getCell(4).getParagraphs().get(0);
//        p.setAlignment(ParagraphAlignment.CENTER);

        XWPFTableRow row1 = table.getRow(1);
        row1.getCell(0).setText("11");
        row1.getCell(1).setText("12");
        XWPFTableRow row2 = table.getRow(1);
        row2.getCell(0).setText("21");
        row2.getCell(1).setText("22");

        return document;
    }
}

3.效果展示

相关推荐
拾光Ծ6 小时前
【MySQL】复合查询、表的连接
java·数据库·sql·mysql
MetaLite6 小时前
Java通用枚举驱动下拉框-元数据接口与前端契约
java·前端·状态模式
文子越来越强6 小时前
线程池使用总结
java
SimonKing6 小时前
Java 图片处理还在用 ImageIO?这个库让你代码从 30 行变 3 行
java·后端·程序员
数据狐(Datafox)6 小时前
mercadolibre.item_get 工程实战:美客多商品详情API技术解析与落地应用
java·人工智能·mysql·json
~木雨6 小时前
Java 内部类系列④(收官):内部类底层与版本演进全梳理 —— 合成字段、nestmates 与 JDK18 优化,附全套面试背诵表
java·字节码·内部类·java 面试·nestmates·jdk18
吴声子夜歌7 小时前
Guava——反射
java·开发语言·guava
X1A0RAN7 小时前
Jenkins 流水线跨阶段的数据共享:让变量“动态更新“成为可能
java·servlet·jenkins
Rain的Java大神之路7 小时前
高并发下的热点账户余额扣减:Redis+Lua脚本实现无锁记账
java·spring boot·redis·后端·spring cloud·缓存·lua
随遇而安zx7 小时前
【地基篇】---JVM 类加载 源码解析(基于 Java 8)
java·jvm·python