【问题标题】:How to edit docx using Java如何使用 Java 编辑 docx
【发布时间】:2014-10-19 10:41:35
【问题描述】:

我需要替换 docx 文件中的某些单词或短语并用另一个名称保存。我知道我的问题不是 unik,我尝试在网上找到解决方案。但我仍然无法得到我需要的结果。

我找到了两种方法来解决我的任务,但在每种情况下都陷入了僵局。 1. 像zip文件一样展开docx,用主要内容更改xml并再次打包到存档中。但在操作之后,我无法在 MS Word 中打开新更改的 docx。这很奇怪,因为我可以手动执行类似的步骤(不使用 Java,使用 WinRar)并获得正确的结果文件。 那么你能解释一下如何使用 Java 归档 docx 内容以获取正确的文件吗?

  1. 使用外部 API。我得到了使用 docx4j Java 库的建议。但我所能做的只是用任何单词替换模板中的标签(如 ${label})(我使用了VariableReplace 示例)。但我想在不使用带有标签的模板的情况下更改我想要的单词。

希望能帮到你。

【问题讨论】:

  • 你试过 apache-poi 了吗?

标签: java docx docx4j


【解决方案1】:

我有这个代码。我希望它可以帮助您解决您的问题。有了它,您可以从 .docx 中读取要更改的单词。更改此单词并将新段落保存在新文档中。

 //WriteDocx.java
   import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
   import org.apache.poi.xwpf.usermodel.*;
   import java.io.*;
   import java.util.ArrayList;
   import java.util.List;
   import java.util.StringTokenizer;

   public class WriteDocx
   {
    public static void main(String[] args) throws Exception {
        int count = 0;
        XWPFDocument document = new XWPFDocument();
        XWPFDocument docx = new XWPFDocument(new FileInputStream("Bonjour1.docx"));
        XWPFWordExtractor we = new XWPFWordExtractor(docx);
        String text = we.getText() ;
        if(text.contains("SMS")){
            text = text.replace("SMS", "sms");
            System.out.println(text);
        }
        char[] c = text.toCharArray();
        for(int i= 0; i < c.length;i++){

            if(c[i] == '\n'){
                count ++;
            }
        }
        System.out.println(c[0]);
        StringTokenizer st = new StringTokenizer(text,"\n");

        XWPFParagraph para = document.createParagraph();
        para.setAlignment(ParagraphAlignment.CENTER);
        XWPFRun run = para.createRun();
        run.setBold(true);
        run.setFontSize(36);
        run.setText("Apache POI works well!");

        List<XWPFParagraph>paragraphs = new ArrayList<XWPFParagraph>();
        List<XWPFRun>runs = new ArrayList<XWPFRun>();
        int k = 0;
        for(k=0;k<count+1;k++){
            paragraphs.add(document.createParagraph());
        }
        k=0;
        while(st.hasMoreElements()){
            paragraphs.get(k).setAlignment(ParagraphAlignment.LEFT);
            paragraphs.get(k).setSpacingAfter(0);
            paragraphs.get(k).setSpacingBefore(0);
            run = paragraphs.get(k).createRun();
            run.setText(st.nextElement().toString());
            k++;
        }

        document.write(new FileOutputStream("test2.docx"));
    }          
   }

PS:XWPFDocument docx = new XWPFDocument(new FileInputStream("Bonjour1.docx"))

您必须将“Bonjour1.docx”更改为要替换某些单词或短语的文件名。 我用APACHE POI library 我从这个站点获取了一些代码HANDLING MS WORD DOCUMENTS USING APACHE POI

更新

【讨论】:

  • 你用的是哪个 jar 文件?
  • 我使用了这个 JAR:poi-3.11-20141221.jar、poi-excelant-3.11-20141221.jar、poi-ooxml-3.11-20141221.jar、poi-ooxml-3.11-schemas-20141221 .jar、poi-scartchpad-3.11-20141221.jar、xmlbeans-2.6.0.jar、
  • Hii .. 我们如何进行这些更改但同时保留文档的样式??
【解决方案2】:

如果您想更改任意单词,您可以使用 docx4j 轻松完成。

但首先你需要找到它们。

您可以使用XPath query 或在Java 中通过traversing the document tree 查找您的话。

【讨论】:

  • 链接无效。答案现在没有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多