草庐IT

java - Apache POI Word 教程。

coder 2024-03-08 原文

有人知道有关使用 Apache POI 库处理 MS Word 的优秀教程吗? 我想了解如何创建 word 文档 .doc(或者我可能需要创建模板 .dot)来创建变量,例如 ${customer.name } inside docs(templates),然后通过 Range.replaceText("${customer.name}","Microsoft CO"); 或者 ${customer .name} 不是变量,只是纯文本(为了更清楚起见,命名为变量名)?我也没有找到关于在 POI 中使用表格的教程。

事实上,我有 .doc 文档,我需要在其中替换一些变量,例如姓名、姓氏,而且我还需要用一些值填充表格。

最佳答案

您可以使用 Microsoft Word 在 Word 文档中使用书签。 我已经在一周前完成了。我通过选择将被替换的文本然后插入 -> 书签并键入新书签名称来在文档中插入书签。 之后,在你的代码中,你应该在你的 util 类中实现类似这样的东西:

/** 
 * Inserts a value at a location within the Word document specified by a 
 * named bookmark. 
 * 
 * @param bookmarkName An instance of the String class that encapsulates 
 *        the name of the bookmark. Note that case is important and the case 
 *        of the bookmarks name within the document and that of the value 
 *        passed to this parameter must match. 
 * @param bookmarkValue An instance of the String class that encapsulates 
 *        the value that should be inserted into the document at the location 
 *        specified by the bookmark. 
 */ 
public final void insertAtBookmark(String bookmarkName, String bookmarkValue, Style style) { 
    List<XWPFTable> tableList = null; 
    Iterator<XWPFTable> tableIter = null; 
    List<XWPFTableRow> rowList = null; 
    Iterator<XWPFTableRow> rowIter = null; 
    List<XWPFTableCell> cellList = null; 
    Iterator<XWPFTableCell> cellIter = null; 
    XWPFTable table = null; 
    XWPFTableRow row = null; 
    XWPFTableCell cell = null; 

    // Firstly, deal with any paragraphs in the body of the document. 
    this.procParaList(this.document.getParagraphs(), bookmarkName, bookmarkValue, style); 

    // Then check to see if there are any bookmarks in table cells. To do this 
    // it is necessary to get at the list of paragraphs 'stored' within the 
    // individual table cell, hence this code which get the tables from the 
    // document, the rows from each table, the cells from each row and the 
    // paragraphs from each cell. 
    tableList = this.document.getTables(); 
    tableIter = tableList.iterator(); 
    while(tableIter.hasNext()) { 
        table = tableIter.next(); 
        rowList = table.getRows(); 
        rowIter = rowList.iterator(); 
        while(rowIter.hasNext()) { 
            row = rowIter.next(); 
            cellList = row.getTableCells(); 
            cellIter = cellList.iterator(); 
            while(cellIter.hasNext()) { 
                cell = cellIter.next(); 
                this.procParaList(cell.getParagraphs(), 
                        bookmarkName, 
                        bookmarkValue, style); 
            } 
        } 
    } 
}

/** 
 * Inserts text into the document at the position indicated by a specific 
 * bookmark. Note that the current implementation does not take account 
 * of nested bookmarks, that is bookmarks that contain other bookmarks. Note 
 * also that any text contained within the bookmark itself will be removed. 
 * 
 * @param paraList An instance of a class that implements the List interface 
 *        and which encapsulates references to one or more instances of the 
 *        XWPFParagraph class. 
 * @param bookmarkName An instance of the String class that encapsulates the 
 *        name of the bookmark that identifies the position within the 
 *        document some text should be inserted. 
 * @param bookmarkValue An instance of the AString class that encapsulates 
 *        the text that should be inserted at the location specified by the 
 *        bookmark. 
 */ 
private final void procParaList(List<XWPFParagraph> paraList, 
        String bookmarkName, String bookmarkValue,Style style) { 
    Iterator<XWPFParagraph> paraIter = null; 
    XWPFParagraph para = null; 
    List<CTBookmark> bookmarkList = null; 
    Iterator<CTBookmark> bookmarkIter = null; 
    CTBookmark bookmark = null; 
    XWPFRun run = null; 
    Node nextNode = null; 

    // Get an Iterator to step through the contents of the paragraph list. 
    paraIter = paraList.iterator(); 
    while(paraIter.hasNext()) { 
        // Get the paragraph, a llist of CTBookmark objects and an Iterator 
        // to step through the list of CTBookmarks. 
        para = paraIter.next(); 
        bookmarkList = para.getCTP().getBookmarkStartList(); 
        bookmarkIter = bookmarkList.iterator(); 

        while(bookmarkIter.hasNext()) { 
            // Get a Bookmark and check it's name. If the name of the 
            // bookmark matches the name the user has specified... 
            bookmark = bookmarkIter.next(); 
            if(bookmark.getName().equals(bookmarkName)) { 
                // ...create the text run to insert and set it's text 
                // content and then insert that text into the document. 
                run = para.createRun(); 
                run.setText(bookmarkValue); 
                //run.set
                /*CTR ctr = run.getCTR(); 
                CTRPr ctrPr = ctr.getRPr(); 

                if(ctrPr == null) { 
                    ctrPr = ctr.addNewRPr(); 
                } */
                if(defaultStyle != null || style != null){
                //ctrPr.addNewRFonts().setAscii("Calibri");
                    if(style != null){
                        applyStyleToRun(style, run);
                        if(style.isCenter()) para.setAlignment(ParagraphAlignment.CENTER);
                    }else{
                        if(defaultStyle.isCenter()) para.setAlignment(ParagraphAlignment.CENTER);
                        applyStyleToRun(defaultStyle, run);
                    }

                }

                // The new Run should be inserted between the bookmarkStart 
                // and bookmarkEnd nodes, so find the bookmarkEnd node. 
                // Note that we are looking for the next sibling of the 
                // bookmarkStart node as it does not contain any child nodes 
                // as far as I am aware. 
                nextNode = bookmark.getDomNode().getNextSibling(); 
                // If the next node is not the bookmarkEnd node, then step 
                // along the sibling nodes, until the bookmarkEnd node 
                // is found. As the code is here, it will remove anything 
                // it finds between the start and end nodes. This, of course 
                // comepltely sidesteps the issues surrounding boorkamrks 
                // that contain other bookmarks which I understand can happen. 
                while(nextNode != null &&  nextNode.getNodeName() != null &&  !(nextNode.getNodeName().contains("bookmarkEnd"))) { 
                    para.getCTP().getDomNode().removeChild(nextNode); 
                    nextNode = bookmark.getDomNode().getNextSibling(); 
                } 

                // Finally, insert the new Run node into the document 
                // between the bookmarkStrat and the bookmarkEnd nodes. 
                para.getCTP().getDomNode().insertBefore( 
                        run.getCTR().getDomNode(), 
                        nextNode); 
            } 
        } 
    } 
}

/**
 * Applique un style sur un XWPFRun 
 * @param style
 * @param run
 */
private void applyStyleToRun(Style style, XWPFRun run) {
    run.setFontSize(style.getFontSize());
    if(style.getFontFamily() != null){
        run.setFontFamily(style.getFontFamily());
    }
    run.setBold(style.isBold());
    run.setItalic(style.isItalic());
    if(style.getColorCode() != null){
        run.getCTR().addNewRPr().addNewColor().setVal(style.getColorCode());
    }

} 

原始代码在这里找到:http://apache-poi.1045710.n5.nabble.com/Replacing-the-value-of-the-bookmarks-td5710052.html

关于java - Apache POI Word 教程。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10266844/

有关java - Apache POI Word 教程。的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  3. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  6. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  7. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  8. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  9. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  10. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

随机推荐