首页 > 编程语言 >Java:使用poi操作docx的word文档

Java:使用poi操作docx的word文档

时间:2023-06-18 16:39:26浏览次数:51  
标签:docx word void param paragraph table Java public

package com.aomen.java;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.xmlbeans.XmlCursor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.util.Iterator;
import java.util.List;

public class FileTools {

    public static void main(String[] args) {
        FileInputStream in = null;//载入文档
        try {
            // 处理docx格式 即office2007以后版本
            //word 2007 图片不会被读取, 表格中的数据会被放在字符串的最后
            in = new FileInputStream("C:\\work\\test.docx");
            //得到word文档的信息
            XWPFDocument docx = new XWPFDocument(in);
            // 循环所有段落(循环[除表格和图片外的]每一行数据)
            List<XWPFParagraph> paragraphs = docx.getParagraphs();
            for (int i = 0; i < paragraphs.size(); i++) {
                // 插入段落
                insertParagraphs(docx, paragraphs.get(i), "插入的字符串信息");
                // 插入表格
                insertTables(docx, paragraphs.get(i));
                // 插入图片
                insertImages(docx, paragraphs.get(i));
            }
            // 将修改后的文件保存到新的文件内
            FileOutputStream fos = new FileOutputStream("C:\\tes.docx");
            docx.write(fos);
            fos.flush();
            fos.close();
            docx.close();
            in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 插入图片
     *
     * @param docx
     * @param paragraph
     */
    public static void insertImages(XWPFDocument docx, XWPFParagraph paragraph) {
        String text = paragraph.getText();
        //插入图片
//        判断文档中新增图片的占位符,在此占位符下插入新的图片
        if (text.equals("${mark_newPicture}")) {
            try {
                XmlCursor cursor = paragraph.getCTP().newCursor();
                XWPFParagraph newPara = docx.insertNewParagraph(cursor);
                newPara.setAlignment(ParagraphAlignment.CENTER);//居中
                XWPFRun newParaRun = newPara.createRun();
                newParaRun.addPicture(new FileInputStream("./doc/bus.png"),
                        XWPFDocument.PICTURE_TYPE_PNG, "bus.png,",
                        Units.toEMU(200), Units.toEMU(200));
                docx.removeBodyElement(docx.getPosOfParagraph(paragraph));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (InvalidFormatException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 插入表格
     *
     * @param docx
     * @param paragraph
     */
    public static void insertTables(XWPFDocument docx, XWPFParagraph paragraph) {
        String text = paragraph.getText();
        //插入表格
//        判断文档中新增表格的占位符,在此占位符下插入新的表格
        if (text.equals("${mark_newTable}")) {
            XmlCursor cursor = paragraph.getCTP().newCursor();

            XWPFTable table = docx.insertNewTbl(cursor);
            XWPFTableRow row_0 = table.getRow(0);
            row_0.getCell(0).setText("姓名");
            row_0.addNewTableCell().setText("年龄");

            XWPFTableRow row_1 = table.createRow();
            row_1.getCell(0).setText("隔壁老王");
            row_1.getCell(1).setText("48");

            setTableLocation(table, "center");
            setCellLocation(table, "CENTER", "center");
            docx.removeBodyElement(docx.getPosOfParagraph(paragraph));
        }
    }

    /**
     * 插入段落
     *
     * @param docx
     * @param paragraph
     * @param message   需要插入的内容
     */
    public static void insertParagraphs(XWPFDocument docx, XWPFParagraph paragraph, String message) {
        String text = paragraph.getText();
        //插入段落
//        判断文档中新增段落的占位符,在此占位符下插入新的段落
        if (text.equals("${mark_newParagraph}")) {
            XmlCursor cursor = paragraph.getCTP().newCursor();
            XWPFParagraph newPara = docx.insertNewParagraph(cursor);
            newPara.setAlignment(ParagraphAlignment.BOTH);//两端对齐
            newPara.setIndentationFirstLine(480);//首行缩进24磅
            XWPFRun newParaRun = newPara.createRun();
            newParaRun.setText(message);
            newParaRun.setFontFamily("宋体");
            newParaRun.setFontSize(12);
            newParaRun.setBold(false);
            docx.removeBodyElement(docx.getPosOfParagraph(paragraph));
        }
    }

    /**
     * 指定位置插入(段落/表格/图片)
     * @param docx
     */
    public void insertIndex(XWPFDocument docx){
        XmlCursor cursor = docx.getDocument().getBody().getPArray(0).newCursor();
        // 段落
        XWPFParagraph cP = docx.insertNewParagraph(cursor);
        // 表格
//        XWPFTable table = docx.insertNewTbl(cursor);
        // 图片
//        XWPFParagraph newPara = docx.insertNewParagraph(cursor);
    }

    /**
     * 删除某个表格
     *
     * @param table
     */
    public void deleteTable(XWPFTable table) {
        List<XWPFTableRow> rows = table.getRows();
        // 删除所有行 倒叙删除
        for (int i = rows.size(); i >= 0; i--) {
            System.out.println("table.getRows() " + table.getRows().size());
            table.removeRow(i);
        }
    }

    /**
     * 设置表格的风格样式
     * @param table
     */
    public void editTableStyle(XWPFTable table){
        CTTblPr tblPr1 = table.getCTTbl().getTblPr();
        CTString styleStr = tblPr1.addNewTblStyle();
        // 表格默认为Normal风格
        styleStr.setVal("StyledTable");
    }

    /**
     * 设置表格的宽度
     * @param table
     */
    public void editTableWidth(XWPFTable table){
        CTTblPr tblPr = table.getCTTbl().getTblPr();
//        默认TblW的type属性为STTblWidth.AUTO,即自动伸缩。所以要调整为指定类型:STTblWidth.DXA
        tblPr.getTblW().setType(STTblWidth.DXA);
        // 设置表格的宽度
        tblPr.getTblW().setW(new BigInteger("7000"));
    }

    /**
     * 设置表格行高
     * @param row
     */
    public void editRowHeight(XWPFTableRow row){
        CTTrPr trPr = row.getCtRow().addNewTrPr();
        CTHeight ht = trPr.addNewTrHeight();
//        设置行高
        ht.setVal(BigInteger.valueOf(360));
    }

    /**
     * 设置单元格颜色
     * @param cell
     */
    public void editCellColor(XWPFTableCell cell){
        CTTcPr tcpr = cell.getCTTc().addNewTcPr();
        CTShd ctshd = tcpr.addNewShd();
        ctshd.setColor("auto");
        ctshd.setVal(STShd.CLEAR);
//        设置颜色
        ctshd.setFill("A7BFDE");
    }

    /**
     * 设置单元格内容垂直居中
     * @param cell
     */
    public void editCellCenter(XWPFTableCell cell){
        CTTcPr tcpr = cell.getCTTc().addNewTcPr();
        CTVerticalJc va = tcpr.addNewVAlign();
//        设置垂直居中
        va.setVal(STVerticalJc.CENTER);
    }

    /**
     * 设置单元格的宽度
     * @param cell
     */
    public void editCellWidth(XWPFTableCell cell){
        CTTcPr tcpr = cell.getCTTc().addNewTcPr();
        CTTblWidth cellw = tcpr.addNewTcW();
//        默认type属性为STTblWidth.AUTO,即自动伸缩。所以要调整为指定类型:STTblWidth.DXA
        cellw.setType(STTblWidth.DXA);
        // 设置单元格宽度
        cellw.setW(BigInteger.valueOf(360*5));
    }

    /**
     * 获取所有表格
     * @param docx
     */
    public void getTables(XWPFDocument docx) {
        Iterator<XWPFTable> tables = docx.getTablesIterator();
        while (tables.hasNext()) {
            XWPFTable table = tables.next();
//            获取当前表格所有行
            List<XWPFTableRow> rows = table.getRows();
//            获取当前行的所有列
            List<XWPFTableCell> tableCells = rows.get(0).getTableCells();
        }
    }

    /**
     * 获取所有段落
     * @param docx
     */
    public void getParagraphs(XWPFDocument docx) {
        List<XWPFParagraph> paragraphs = docx.getParagraphs();
//        使用增强for循环会获取不到段落对象
        for (int i = 0; i < paragraphs.size(); i++) {
//            打印当前段落的字符串
            System.out.println(paragraphs.get(i).getText());
        }
    }

    /**
     * 设置单元格水平位置和垂直位置
     *
     * @param xwpfTable
     * @param verticalLoction    单元格中内容垂直上TOP,下BOTTOM,居中CENTER,BOTH两端对齐
     * @param horizontalLocation 单元格中内容水平居中center,left居左,right居右,both两端对齐
     */
    public static void setCellLocation(XWPFTable xwpfTable, String verticalLoction, String horizontalLocation) {
        List<XWPFTableRow> rows = xwpfTable.getRows();
        for (XWPFTableRow row : rows) {
            List<XWPFTableCell> cells = row.getTableCells();
            for (XWPFTableCell cell : cells) {
                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.Enum.forString(horizontalLocation)); //水平居中
                cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.valueOf(verticalLoction));//垂直居中
            }
        }
    }

    /**
     * 设置表格位置
     *
     * @param xwpfTable
     * @param location  整个表格居中center,left居左,right居右,both两端对齐
     */
    public static void setTableLocation(XWPFTable xwpfTable, String location) {
        CTTbl cttbl = xwpfTable.getCTTbl();
        CTTblPr tblpr = cttbl.getTblPr() == null ? cttbl.addNewTblPr() : cttbl.getTblPr();
        CTJc cTJc = tblpr.addNewJc();
        cTJc.setVal(STJc.Enum.forString(location));
    }

}

作者:怒吼的萝卜



标签:docx,word,void,param,paragraph,table,Java,public
From: https://blog.51cto.com/u_12835254/6508729

相关文章

  • Java网络编程
    一、Java网络编程网络编程是指编写运行在多个设备(计算机)的程序,设备通过网络连接起来。java.net包中J2SE的API包含有类和接口,提供了低层次的通信细节。可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。协议:计算机网络中,连接和通信的规则被称为网络通信协议1.UDP......
  • Java 注解
    一、Java注解(Annotation)简介从Java5版本之后可以在源代码中嵌入一些补充信息,这种补充信息称为注解(Annotation),是Java平台中非常重要的一部分。注解都是@符号开头的,例如:在学习方法重写时使用过的@Override注解。同Class和Interface一样,注解也属于一种类型。Annotation......
  • Java反射机制
    一、Java反射机制是什么?Java 反射机制是Java语言的一个重要特性。在学习Java反射机制前,大家应该先了解编译期和运行期两个概念:编译期是指把源码交给编译器编译成计算机可以执行的文件的过程。在Java中也就是把Java代码编成class文件的过程。编译期只是做了一些翻译功能,......
  • java操作redis之jedis
    我们之前对Redis的学习都是在命令行窗口,那么如何使用Java来对Redis进行操作呢?对于Java连接Redis的开发工具有很多,这里先介绍通过Jedis实现对Redis的各种操作。(前提是你的redis已经配置了远程访问)1.创建一个maven工程,并且添加以下依赖<dependencies><!--jedis--><......
  • java web模板学习+1
    今天找到一个模板很厉害,代码开源的,拔下来就能跑。下面是他的博客地址和他的源代码地址。博客地址:开源一套简单通用的后台管理系统-huanzi-qch-博客园(cnblogs.com)开源地址:https://gitee.com/huanzi-qch/base-admin......
  • /usr/bin/java -> /etc/alternatives/java
    [root@localhosteclipse]#whichjava/usr/bin/java[root@localhosteclipse]#ls-l/usr/bin/javalrwxrwxrwx1rootroot22Aug12012/usr/bin/java->/etc/alternatives/java[root@localhosteclipse]#ls/etc/alternatives/antlr......
  • 【Java学习】 Spring的基础理解 IOC、AOP以及事务
    一、简介  官网: https://spring.io/projects/spring-framework#overview   官方下载工具: https://repo.spring.io/release/org/springframework/spring/  github下载: https://github.com/spring-projects/spring-framework   maven依赖:<dependency>......
  • java 聚合项目--pom.xml配置文件
    java聚合项目创建聚合项目的2种方式:分层项目开发:1.DAO:java工程项目;(mavenquickstart)2.Service:java工程项目;(mavenquickstart)3.模型:java工程项目;(mavenquickstart)4.共工模块:java工程项目;(mavenquickstart)5.controller+view:webapp:web工程项目(mavenwebapp)工程类型:packing......
  • java 创建聚合项目的2种方式及 部署Nacos
    创建聚合项目的2种方式byIDEA20231.创建module,erp-parent2.创建子module,设置每个module的pom.xml属性pom及父模块;3.配置erp-parent模块里的pom.xml1.创建module,erp-parent2.创建子module--mavenarchet部署nacosype(archetype:quickstart(java工程),webapp(web工程),设置每......
  • lilo java 快速 graphql stitching 包
    lilo是一个快速的graphqlstitching包,可以实现合并多个graphql服务的合并(schema,以及调用)比较适合的业务场景是gateway说明同时在springone官方中也有介绍到,内部使用到了graphql-java进行处理参考资料https://github.com/friatech/lilohttps://bitbucket.org/atlassian/graphql......