不知大家在对Word操作时,有没有遇到需要对指定内容进行替换这种需求。前几天公司有个需求,就是对PDF邀请函的姓名那部分内容进行替换,因为本人以前对Word的书签有过操作,所以思路就是通过将这部分内容设定为书签,对书签的进行替换保存为新的邀请函。

用到的lib包括,特别强调下,jacob使用时需要给C:/WINDOWS/System32目录下添加jacob对应位数的dll文件:

具体的步骤如下:

1、首先将PDF转化为WORD文档,替换书签个人感觉WORD操作起来比较方便点,替换后的格式或许有稍许错位,重新编译保存下,将该WORD文档作为邀请函模板;

2、对需要替换的部分添加书签,对邀请人的xx添加书签,暂且命名为xm;

3、替换的内容是以EXCEL存储的单列数据,又引入POI操作EXCEL部分的内容,该类就是POI读取EXCEL内容的公共类,包括XLS以及XLSX;

public class parseExcelFile {public static final String OFFICE_EXCEL_2003_POSTFIX = "xls";public static final String OFFICE_EXCEL_2010_POSTFIX = "xlsx";public static final String EMPTY = "";public static final String POINT = ".";public static final String NOT_EXCEL_FILE = " : Not the Excel file!";public static final String PROCESSING = "Processing...";/*** 读Excel文件* * @param file*            Ecxel文件* @param sheetNum*            第几个sheet 必须大于0或为null(默认1) 否则会报错* @param startLine*            开始行(包含本行) 必须大于0或为null(默认1) 否则会报错* @param endLine*            结束行(包含本行) 必须大于等于开始行或为null(默认最大行) 否则会报错* @param startColumn*            开始列(包含本列) 必须大于0或为null(默认1) 否则会报错* @param endColumn*            结束列(包含本列) 必须大于等于开始列或为null(默认第一行列数) 否则会报错* @return* @throws IOException*/public Map<String, String> readExcel(File file, Integer sheetNum, Integer startLine, Integer endLine,Integer startColumn, Integer endColumn) throws IOException {if (file == null || EMPTY.equals(file)) {return null;} else {String postfix = this.getPostfix(file.getName());if (!EMPTY.equals(postfix)) {if (OFFICE_EXCEL_2003_POSTFIX.equals(postfix)) {return readXls(file, sheetNum, startLine, endLine, startColumn, endColumn);} else if (OFFICE_EXCEL_2010_POSTFIX.equals(postfix)) {return readXlsx(file, sheetNum, startLine, endLine, startColumn, endColumn);}} else {System.out.println(file + NOT_EXCEL_FILE);}}return null;}/*** 读2010 xlsx Excel文件* * @param 文件路径* @param sheetNum*            第几个sheet* @param startLine*            开始行* @param endLine*            结束行* @param startColumn*            开始列* @param endColumn*            结束列* @return* @throws IOException*/public Map<String, String> readXlsx(File file, Integer sheetNum, Integer startLine, Integer endLine,Integer startColumn, Integer endColumn) throws IOException {System.out.println(PROCESSING + file.getName());InputStream is = new FileInputStream(file);XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);Map<String, String> map = new HashMap<String, String>();// Read the Sheet// for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets();// numSheet++) {if (sheetNum == null || sheetNum.equals("")) {sheetNum = 1;map.put("sheetNum", sheetNum.toString());}XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(sheetNum - 1);if (xssfSheet != null) {if (startLine == null || EMPTY.equals(startLine)) {startLine = 1;map.put("startLine", startLine.toString());}if (endLine == null || EMPTY.equals(endLine)) {endLine = xssfSheet.getLastRowNum() + 1;map.put("endLine", endLine.toString());}if (startColumn == null || EMPTY.equals(startColumn)) {startColumn = 1;map.put("startColumn", startColumn.toString());}if (endColumn == null || EMPTY.equals(endColumn)) {// 默认获得第一行的列数endColumn = xssfSheet.getRow(0).getPhysicalNumberOfCells();map.put("endColumn", endColumn.toString());}// Read the Rowfor (int rowNum = startLine - 1; rowNum < endLine; rowNum++) {XSSFRow xssfRow = xssfSheet.getRow(rowNum);if (xssfRow != null) {for (int i = startColumn - 1; i < endColumn; i++) {XSSFCell xc = xssfRow.getCell(i);map.put(sheetNum + "-" + rowNum + "-" + i, getValue(xc));}}}}// }return map;}/*** 读2003 xls Excel文件* * @param 文件路径* @param startLine*            开始行* @param endLine*            结束行* @param startColumn*            开始列* @param endColumn*            结束列* @return* @throws IOException*/public Map<String, String> readXls(File file, Integer sheetNum, Integer startLine, Integer endLine,Integer startColumn, Integer endColumn) throws IOException {System.out.println(PROCESSING + file.getName());InputStream is = new FileInputStream(file);POIFSFileSystem fs = new POIFSFileSystem(is);HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fs);Map<String, String> map = new HashMap<String, String>();// Read the Sheet// for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets();// numSheet++) {if (sheetNum == null || sheetNum.equals("")) {sheetNum = 1;map.put("sheetNum", sheetNum.toString());}HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(sheetNum - 1);if (hssfSheet != null) {if (startLine == null || EMPTY.equals(startLine)) {startLine = 1;map.put("startLine", startLine.toString());}if (endLine == null || EMPTY.equals(endLine)) {endLine = hssfSheet.getLastRowNum() + 1;map.put("endLine", endLine.toString());}if (startColumn == null || EMPTY.equals(startColumn)) {startColumn = 1;map.put("startColumn", startColumn.toString());}if (endColumn == null || EMPTY.equals(endColumn)) {// 默认获得第一行的列数endColumn = hssfSheet.getRow(0).getPhysicalNumberOfCells();map.put("endColumn", endColumn.toString());}// Read the Rowfor (int rowNum = startLine - 1; rowNum < endLine; rowNum++) {HSSFRow hssfRow = hssfSheet.getRow(rowNum);if (hssfRow != null) {for (int i = startColumn - 1; i < endColumn; i++) {
//                      HSSFCell xc = hssfRow.getCell(i);
//                      System.out.println("xc=" + xc);map.put(sheetNum + "-" + rowNum + "-" + i, getValue(hssfRow.getCell(i)));}}}}// }return map;}/*** 获得后缀名* * @param path* @return*/public String getPostfix(String path) {if (path == null || EMPTY.equals(path.trim())) {return EMPTY;}if (path.contains(POINT)) {return path.substring(path.lastIndexOf(POINT) + 1, path.length());}return EMPTY;}@SuppressWarnings("static-access")private String getValue(XSSFCell xssfRow) {if (xssfRow.getCellType() == xssfRow.CELL_TYPE_BOOLEAN) {return String.valueOf(xssfRow.getBooleanCellValue());} else if (xssfRow.getCellType() == xssfRow.CELL_TYPE_NUMERIC) {if (XSSFDateUtil.isCellDateFormatted(xssfRow)) {return XSSFDateUtil.getJavaDate(xssfRow.getNumericCellValue()).toString();} else {HSSFDataFormatter dateFormatter=new HSSFDataFormatter();String xcssfFormatted=dateFormatter.formatCellValue(xssfRow);return xcssfFormatted;}} else {return String.valueOf(xssfRow.getStringCellValue());}}@SuppressWarnings("static-access")private String getValue(HSSFCell hssfCell) {if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN) {return String.valueOf(hssfCell.getBooleanCellValue());} else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC) {if (HSSFDateUtil.isCellDateFormatted(hssfCell)) {return HSSFDateUtil.getJavaDate(hssfCell.getNumericCellValue()).toString();} else {HSSFDataFormatter dateFormatter=new HSSFDataFormatter();String ceccFormatted=dateFormatter.formatCellValue(hssfCell);return ceccFormatted;}} else {return String.valueOf(hssfCell.getStringCellValue());}}/*** 删除文件* * @param path*            文件路径* @return*/public String deleteTemporaryFile(String path) {if (path != null && !path.equals("")) {File file = new File(path);if (file.exists()) {file.delete();}}return "success";}
public class XSSFDateUtil extends DateUtil{protected static int absoluteDay(Calendar cal,boolean use1904windowing){return DateUtil.absoluteDay(cal, use1904windowing);}
}

数据源内容

4、通过jacob操作WORD,读取该书签的内容并进行替换,重新保存为PDF文档,核心代码如下:

package com.ecservice;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;public class PDFRead {private static final int wdFormatPDF = 17;// word转PDF 格式//Excel数据导入private List<String> readNameExcel(String path){List<String> NameLists=new ArrayList<String>();// 解析存储数据parseExcelFile pef = new parseExcelFile();try {// 获得表数据中数据,Integer sheetNum = 1;Integer startLine = 0;Integer endLine = null;Integer startColumn = 1;Integer endColumn = 1;Map<String, String> map = pef.readExcel(new File(path.trim()),sheetNum, startLine, endLine, startColumn, endColumn);   if (map != null) {sheetNum = (sheetNum == null ? Integer.parseInt((String) map.get("sheetNum")) : sheetNum);startLine = (startLine == null ? Integer.parseInt((String) map.get("startLine")) : startLine);endLine = (endLine == null ? Integer.parseInt((String) map.get("endLine")) : endLine);startColumn = (startColumn == null ? Integer.parseInt((String) map.get("startColumn")) : startColumn);endColumn = (endColumn == null ? Integer.parseInt((String) map.get("endColumn")) : endColumn);// 存储数据for (int i = startLine; i < endLine; i++) {for(int j = startColumn-1; j < endColumn; j++){String columdata = "";if("*".equals(map.get(sheetNum + "-" + i + "-" + j))){columdata = "0";}else{columdata = map.get(sheetNum + "-" + i + "-" + j).trim();}NameLists.add(columdata);}}}} catch (IOException e) {e.printStackTrace();return null;}return NameLists;}public static void main(String[] args) {ComThread.InitSTA();List<String> nameList=new PDFRead().readNameExcel("c://1.xlsx");if(nameList!=null){for (int k = 0; k < nameList.size(); k++) {// 要保存的目标文件String tpFile = "";// 启动word,生成一个ActivexComponent对象ActiveXComponent app = new ActiveXComponent("Word.Application");// 要转换的word文件String inFile = "C://1.doc";// 要保存的目标文件tpFile = "C://1/" + nameList.get(k) + ".pdf";File fileDir=new File("C://1");if(!fileDir.exists()){fileDir.mkdirs();fileDir.setWritable(true);}app.setProperty("Visible", false);Dispatch docs = app.getProperty("Documents").toDispatch();Dispatch doc = Dispatch.call(docs, //"Open", //inFile, // FileNamefalse, // ConfirmConversionstrue // ReadOnly).toDispatch();// Dispatch activeDocument=app.getProperty("ActiveDocument").toDispatch();Dispatch bookMarks = app.call(doc, "Bookmarks").toDispatch();int bCount = Dispatch.get(bookMarks, "Count").getInt(); // 获取书签数// 将书签列表存放到list + map 结构中for (int i = 1; i <= bCount; i++) {// Map bookMark = new HashMap(); //创建Map()Dispatch items = Dispatch.call(bookMarks, "Item", i).toDispatch();String bookMarkKey = String.valueOf(Dispatch.get(items, "Name").getString()).replaceAll("null", ""); // 读取书签命名Dispatch range = Dispatch.get(items, "Range").toDispatch();String bookMarkValue = String.valueOf(Dispatch.get(range, "Text").getString()).replaceAll("null", ""); // 读取书签文本String MarkKey = bookMarkKey;String MarkValue = bookMarkValue;// 书签名并替换的内容if (MarkKey.equals("xm"))// 书签名为xm{MarkValue = nameList.get(k); // 该xm书签处插入张三;}Dispatch.put(range, "Text", new Variant(MarkValue));// 通过打印查看便于debugSystem.out.println(bookMarkValue);System.out.println(MarkValue);// 保存文件Dispatch.call(doc, //"SaveAs", //tpFile, // FileNamewdFormatPDF);}try {Variant f = new Variant(false);Dispatch.call(doc, "Close", f);} catch (Exception e) {e.printStackTrace();} finally {app.invoke("Quit", new Variant[] {});ComThread.Release();}}System.out.println("转化完成......");}else{System.out.println("读取excel失败!");}}
}

5、测试结果:

邀请函内容就这么愉快的替换掉啦

Ending!

PS:写的第一篇博文,有什么不足之处欢迎指正!

 

对Word文档中的指定内容进行替换相关推荐

  1. POI对word文档中的指定内容添加批注

    public static void main(String[] args) throws Exception {InputStream is = new FileInputStream(new Fi ...

  2. C# 读取Word文档中的文本内容

    C# 读取Word文档中的文本内容 这篇文章将介绍如何使用C#和Free Spire.Doc组件读取Word文档中的文本内容.Free Spire.Doc提供了两种方法来读取Word文档中的内容,一种 ...

  3. Free Spire.Doc组件C# 读取Word文档中的文本内容

    C# 读取Word文档中的文本内容 这篇文章将介绍如何使用C#和Free Spire.Doc组件读取Word文档中的文本内容.Free Spire.Doc提供了两种方法来读取Word文档中的内容,一种 ...

  4. php 提取文字,如何使用PHP从word文档中提取文本内容?

    我想用PHP从word文档中提取文本内容. 我在Microsoft Word for Mac 2011中创建了一个新的单词文档. 编辑:也通过在Windows 7中的Microsoft Word中创建 ...

  5. Java 读取Word文档中的文本内容

    这篇文章将介绍如何使用Free Spire.Doc for Java组件在Java应用程序中读取Word文档的文本内容.Free Spire.Doc for Java提供了两种方法来读取Word文档中 ...

  6. python替换word内容,文档翻译-使用python替换word文档中的段落内容

    前段时间遇到一个需求,需要将word文档中的内容进行替换,并且需要保证格式不变.在找了一圈资料后,发现没有现成的api供使用:由于本人做过一段时间文档解析,因此打算从word文档的xml入手,通过py ...

  7. python读取word文档中的表格内容

    1. 使用到的库 :docx(python_docx‑0.8.10‑py2.py3‑none‑any.whl) 下载地址:https://download.lfd.uci.edu/pythonlibs ...

  8. java 替换 word_Java 在 Word 文档中使用新文本替换指定文本的方法

    创作一份文案,经常会高频率地使用某些词汇,如地名.人名.人物职位等,若表述有误,就需要整体撤换.文本将介绍如何使用Spire.Doc for Java,在Java程序中对Word文档中的指定文本进行替 ...

  9. 怎么样批量修改html里的内容,批量修改替换多个Word文档中同一内容的方法

    批量修改替换多个Word文档中同一内容的方法群里一位朋友问到,如何一次性批量替换多个word文档中的同一内容.其实,实现多个Word文档的字符进行批量替换的方法有多种. 第一种方法,可以利用第三方软件 ...

最新文章

  1. jsoho.com介绍
  2. C++知识点56——类模板(1、模板类的介绍)
  3. 【Machine Learning】机器学习の特征
  4. 面试:说说啥是一致性哈希算法?
  5. SAP企业解决方案SAP Business One敏捷系列—敏捷制造
  6. PHP自动判断用户会员过期,php,_定时扣除用户过期积分,但平台用户量比较大,有没有好的解决方法?,php - phpStudy...
  7. css3 transition的应用
  8. 计算机网络—数据链路层的流量控制与可靠传输机制(思维导图)
  9. project 2013使用记录
  10. c 连接mysql自动断开_ESQL/C连接和断开数据库(INFORMIX) | 学步园
  11. zend studio 免注册无限试用
  12. MySQL社区版下载地址
  13. Springboot毕设项目会议预约系统设计与实现3if68(java+VUE+Mybatis+Maven+Mysql)
  14. 在html中怎样加表格斜线表头,如何在Word表格中插入斜线
  15. Linux系列 使用vi文本编辑器
  16. 【Scratch3.0案例教学】手把手教小朋友Scratch3.0制作消灭新冠病毒游戏 scratch案例教学
  17. 一般网站有哪些常见漏洞?
  18. 土木工程C语言题目,土木工程级C语言课程设计任务书.doc
  19. openLayers3(四)电子围栏—使用画图工具绘图
  20. 西门子828D 840Dsl数控程序PLC西门子数控程序中文注释

热门文章

  1. WPS--world使用格式刷
  2. 设计之路 -- 如何进行软件需求分析?
  3. Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传
  4. 【论文笔记——DIM】Learning Deep Representations By Mutual Information Estimation and Maximization
  5. Ceph 命令 pool image 纠删
  6. C#开发的OpenRA游戏高性能内存访问的方法
  7. mysql生成类似qq号_【mysql】类似QQ的好友关系表是怎么设计的?
  8. 2021SC@SDUSC山东大学软件学院软件工程应用与实践--Ebiten代码分析 源码分析(三)
  9. 【榜单公布】新星计划第二季落幕,快看你有没有上榜?
  10. vite使用vite-aliases插件配置路径别名