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

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

时间:2023-06-12 12:22:21浏览次数:54  
标签: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://www.cnblogs.com/nhdlb/p/17474703.html

相关文章

  • 学好Java爬虫需要什么技巧
    Java爬虫是一种利用Java编程语言编写的网络爬虫程序,它可以自动化地浏览和抓取互联网上的数据,并将数据进行处理和保存。Java爬虫通常使用HTTP协议模拟浏览器请求来获取网页内容,并通过解析HTML网页标签和属性等信息来提取有用的数据。Java爬虫也需要应对反爬虫机制,如IP封禁、验证码......
  • java8 日期 API
    获取时间LocalDatelocalDate=LocalDate.now();LocalDateTimelocalDateTime=LocalDateTime.now();LocalDatetoday=LocalDate.of(2023,6,12);方法名描述dayofWeekInMonth创建一个新的日期,值为同一个月中每一周的第几天firstDayOfMonth创建一个新的日期......
  • V8是如何执行JavaScript代码的?
    前言一般来讲,电脑是不能直接运行我们的javascript代码的,它需要一个翻译程序将人类能够理解的编程语言JavaScript,翻译成机器能够理解的机器语言。目前市面上有很多种JavaScript引擎,诸如SpiderMonkey、V8、JavaScriptCore等。而由谷歌开发的开源项目V8是当下使用最广泛的Ja......
  • idea java项目中,中文显示成Unicode(UTF-16编码)的字符,修改为中文显示
    idea选择File选择Setings搜索框搜索fileencodings勾选Transparentnative-to-asciiconversion      ......
  • Javascript考试复习
    登录页面<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>登录页面</title><style>html{background:#bde0ff;}form{text-align......
  • Luogu P3435 [POI2006] OKR-Periods of Words
    [POI2006]OKR-PeriodsofWords题面翻译对于一个仅含小写字母的字符串\(a\),\(p\)为\(a\)的前缀且\(p\nea\),那么我们称\(p\)为\(a\)的proper前缀。规定字符串\(Q\)(可以是空串)表示\(a\)的周期,当且仅当\(Q\)是\(a\)的proper前缀且\(a\)是\(Q+Q\)的前缀......
  • java串口通信
    实体packagecom.hwd.campus.common.common.utils.http;importgnu.io.SerialPort;/***串口参数封装类*@authorAdministrator**/publicclassSerialPortParameter{/***串口名称(COM1、COM2、COM3等等)*/privateStringserialPortName;......
  • Java开发常出错5颗星——空指针和异常
    常犯指数5颗星空指针空指针概念及样例什么是空指针(java.lang.NullPointExcetion)?空:内存地址指针:引用异常:运行时privatestaticclassUser{privateStringname;privateString[]address;publicvoidprint(){System.out.pr......
  • 银河麒麟安装JAVA JDK1.8
    卸载open-jdk1.首先查看系统是否自带Javarpm-qa|grepjavarpm-qa|grepjdkrpm-qa|grepgcj[root@localhost~]#rpm-qa|grepjavajava-1.8.0-openjdk-1.8.0.312.b07-10.ky10.x86_64javapackages-filesystem-5.3.0-3.ky10.noarchjava-11-openjdk-headless-11.0.13.9-6.k......
  • JavaWeb开发与代码的编写(十八)
    JavaWeb开发与代码的编写(十八)Filter(过滤器)Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet,静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控......