java操作word,包括文本操作、表格操作、图片操作

1、引入jar

<dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-ooxml</artifactId>
     <version>4.1.2</version>
 </dependency>

 <dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi</artifactId>
     <version>4.1.2</version>
 </dependency>

 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->
 <dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-scratchpad</artifactId>
     <version>4.1.2</version>
 </dependency>

 <dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-examples</artifactId>
     <version>4.1.2</version>
 </dependency>

2、操作表格,将表格里面的$进行替换

// 获取word的所有表格
// in就是输入的word的流
XWPFDocument document = new XWPFDocument(in);;
List<XWPFTable> xwpfTables = document.getTables();
for (XWPFTable table : xwpfTables) {
    // 获取表格行
    List<XWPFTableRow> rows = table.getRows();
    for (XWPFTableRow row : rows) {
        // 表格列
        List<XWPFTableCell> tableCells = row.getTableCells();
        for (XWPFTableCell cell : tableCells) {
            // 列里面的内容
            for (XWPFParagraph paragraph : cell.getParagraphs()) {
                List<XWPFRun> runs = paragraph.getRuns();
                for (XWPFRun xwpfRun : runs) {
                    // 将列里面的$换成
                    if (xwpfRun.toString().equals("$")) {
                        xwpfRun.setSubscript(VerticalAlign.BASELINE);
                        xwpfRun.setText(ratio.remove(0), 0);
                    }
                }
            }
        }
    }
}

3、操作段落,将段落里面的$换成需要的

//获取段落集合
List<XWPFParagraph> paragraphs = document.getParagraphs();
int z = 0;
int h = 0;
for (XWPFParagraph paragraph : paragraphs) {
    //获取到段落中的所有文本内容
    String text = paragraph.getText();
    // 记录图片需要放在哪个段落的下面
    if (text.equals("周期图形")) {
        h = z;
    }
    System.out.println(text);
    //判断此段落中是否有需要进行替换的文本
    if (checkText(text)) {
        List<XWPFRun> runs = paragraph.getRuns();
        for (XWPFRun run : runs) {
            if (run.toString().equals("$")) {
                //替换模板原来位置
                run.setText(run.toString().replaceAll("\\$", ratio.remove(0)), 0);
            }
        }
    }
    z++;
}

4、插入图片

// 设置图片
XWPFRun run = paragraphs.get(h).createRun();
try {
    for (InputStream inputStream : streamList) {
        if (iii == 1) {
            run.addPicture(inputStream,
                    XWPFDocument.PICTURE_TYPE_PNG,
                    "1.png",
                    Units.toEMU(560),
                    Units.toEMU(120));
        } else {
            run.addPicture(inputStream,
                    XWPFDocument.PICTURE_TYPE_PNG,
                    "1.png",
                    Units.toEMU(540),
                    Units.toEMU(90));
        }

        run.addTab();
    }
} catch (InvalidFormatException | IOException e) {
    e.printStackTrace();
}

5、整合

package com.aeonmed.neoread.util;

import lombok.SneakyThrows;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.*;

import java.io.*;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.UUID;

/**
 * @author:qinjinjin
 **/
public class WordUtil {
    XWPFDocument document = null;

    List<String> ratio;

    List<InputStream> streamList;

    public WordUtil(List<InputStream> streamLis, List<String> ratio) {
        this.streamList = streamLis;
        this.ratio = ratio;
    }

    /**
     * 替换段落文本
     *
     * @param document docx解析对象
     */
    public void changeText(XWPFDocument document, int iii) {
        //获取段落集合
        List<XWPFParagraph> paragraphs = document.getParagraphs();
        int z = 0;
        int h = 0;
        // 获取word的所有表格
        List<XWPFTable> xwpfTables = document.getTables();
        for (XWPFTable table : xwpfTables) {
            // 获取表格行
            List<XWPFTableRow> rows = table.getRows();
            for (XWPFTableRow row : rows) {
                // 表格列
                List<XWPFTableCell> tableCells = row.getTableCells();
                for (XWPFTableCell cell : tableCells) {
                    // 列里面的内容
                    for (XWPFParagraph paragraph : cell.getParagraphs()) {
                        List<XWPFRun> runs = paragraph.getRuns();
                        for (XWPFRun xwpfRun : runs) {
                            // 将列里面的$换成
                            if (xwpfRun.toString().equals("$")) {
                                xwpfRun.setSubscript(VerticalAlign.BASELINE);
                                xwpfRun.setText(ratio.remove(0), 0);
                            }
                        }
                    }
                }
            }
        }
        for (XWPFParagraph paragraph : paragraphs) {
            //获取到段落中的所有文本内容
            String text = paragraph.getText();
            // 记录图片需要放在哪个段落的下面
            if (text.equals("周期图形")) {
                h = z;
            }
            System.out.println(text);
            //判断此段落中是否有需要进行替换的文本
            if (checkText(text)) {
                List<XWPFRun> runs = paragraph.getRuns();
                for (XWPFRun run : runs) {
                    if (run.toString().equals("$")) {
                        //替换模板原来位置
                        run.setText(run.toString().replaceAll("\\$", ratio.remove(0)), 0);
                    }
                }
            }
            z++;
        }
        // 设置图片
        XWPFRun run = paragraphs.get(h).createRun();
        try {
            for (InputStream inputStream : streamList) {
                if (iii == 1) {
                    run.addPicture(inputStream,
                            XWPFDocument.PICTURE_TYPE_PNG,
                            "1.png",
                            Units.toEMU(560),
                            Units.toEMU(120));
                } else {
                    run.addPicture(inputStream,
                            XWPFDocument.PICTURE_TYPE_PNG,
                            "1.png",
                            Units.toEMU(540),
                            Units.toEMU(90));
                }

                run.addTab();
            }
        } catch (InvalidFormatException | IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 判断文本中是否包含$
     *
     * @param text 文本
     * @return 包含返回true, 不包含返回false
     */
    public static boolean checkText(String text) {
        boolean check = false;
        if (text.contains("$")) {
            check = true;
        }
        return check;
    }

    /**
     * 生成文件的入口
     *
     * @param templatePath 模板的路径
     * @param outPath      输出路径
     * @param name         名字
     * @param i            作为输出图片宽高的标志
     */
    public void saveReportFile(String templatePath, String outPath, String name, int i) {
        InputStream in;
        try {
            in = new FileInputStream(templatePath);
            //获取docx解析对象
            document = new XWPFDocument(in);
            changeText(document, i);
            File file1 = new File("outPath");
            if (!file1.exists()) {
                file1.mkdirs();
            }
            BufferedOutputStream bufferedOutPut = new BufferedOutputStream(new FileOutputStream(outPath + name + ".docx"));
            document.write(bufferedOutPut);
            bufferedOutPut.flush();
            bufferedOutPut.close();
            WordToPdfAsposeUtil.docToPdf(outPath + name + ".docx", outPath + name + ".pdf");
            File file = new File(outPath + name + ".docx");
            file.delete();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * base64转为文件流
     */
    @SneakyThrows
    public static InputStream base64ToFile(String base64FileStr) {
        if (base64FileStr.contains("data:image")) {
            base64FileStr = base64FileStr.substring(base64FileStr.indexOf(",") + 1);
        }
        base64FileStr = base64FileStr.replace("\r\n", "");
        // 在用户temp目录下创建临时文件
        File file = File.createTempFile(UUID.randomUUID().toString(), "png");
        BufferedOutputStream bos = null;
        FileOutputStream fos = null;
        try {
            // 用Base64进行解码后获取的字节数组可以直接转换为文件
            byte[] bytes = Base64.getDecoder().decode(base64FileStr);
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            bos.write(bytes);
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return new FileInputStream(file);
    }

    public static void main(String[] args) {
        List<InputStream> streamList = new ArrayList<>();
        List<String> ratio = new ArrayList<>();
        ratio.add("1");
        ratio.add("1");
        ratio.add("1");
        WordUtil wordUtil = new WordUtil(streamList, ratio);
        wordUtil.saveReportFile("C:\\Users\\qinjinjin\\Desktop\\duoshanghu\\统计报告.docx", "C:\\Users\\qinjinjin\\Desktop\\duoshanghu\\", "统计", 1);
    }

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值