Java Apache POI : Read/Write from . 文档文件问题

标签 java file-io apache-poi fileoutputstream doc

我正在编写代码来读取 .doc 文件作为模板,并在各种迭代后将数据写入新的 .doc 文件中。我的代码似乎有一些我无法弄清楚的简单问题。

下面是我编写的代码,[我仅在 stackoverflow 上的某个地方获得了基本框架。]

public class HWPFTest {

  public static void main(String[] args) {
        String inputFile = "F:\\docx\\input.doc";
        String outputFile = "F:\\docx\\output.doc";
        POIFSFileSystem fs = null;

        try {
              for (int i = 0; i < 3; i++) {
                    fs = new POIFSFileSystem(new FileInputStream(inputFile));
                    HWPFDocument doc = new HWPFDocument(fs);
                    System.out.println("LOOOOOOOOOOOOP ----> " + i);
                    doc = replaceText(doc, "$count", String.valueOf(i));
                    doc = replaceText(doc, "$filename", "FileName" + i);
                    doc = replaceText(doc, "$inputFile", "Input" + i);
                    doc = replaceText(doc, "$outputFile", "Output" + i);
                    doc = replaceText(doc, "$message", "Message" + i);
                    doc = replaceText(doc, "$snap", "Snapshot" + i);
                    saveWord(outputFile, doc);
              }
              System.out.println("DONE...");
        }
        catch (FileNotFoundException e) {
              e.printStackTrace();
        } catch (IOException e) {
              e.printStackTrace();
        }
  }

  private static HWPFDocument replaceText(HWPFDocument doc, String findText, String replaceText) {
        Range r1 = doc.getRange();
        for (int i = 0; i < r1.numSections(); ++i) {
              Section s = r1.getSection(i);
              for (int x = 0; x < s.numParagraphs(); x++) {
                    Paragraph p = s.getParagraph(x);
                    for (int z = 0; z < p.numCharacterRuns(); z++) {
                          CharacterRun run = p.getCharacterRun(z);
                          String text = run.text();
                          if (text.contains(findText)) {
                               run.replaceText(findText, replaceText);
                               System.out.println("findText: " + findText + " replaceText: " + replaceText);
                          }
                    }
              }
        }
        return doc;
  }


  private static void saveWord(String filePath, HWPFDocument doc) throws FileNotFoundException, IOException {
        FileOutputStream out = null;
        try {
              // Add true to make the data append possible in output stream.
              out = new FileOutputStream(filePath, true);
              doc.write(out);
              out.flush();
        } catch (Exception ex) {
              ex.printStackTrace();
        } finally {
              out.close();
        }
  }

}

代码运行没有任何问题。这是 input.doc 的外观, input.doc

运行成功后,也会生成output.doc。但问题是它仅包含第一个循环的数据。

理想情况下,它应该包含所有 3 次迭代的数据,但它只包含第一次的数据,然后就什么都没有了。它在执行过程中也不会显示任何错误/异常。我还确保输出流的附加选项为 true。

这就是output.doc的样子, output.doc

不确定,我做错了什么。

当我运行程序时,我可以在下面的输出中看到,

噢噢噢噢噢----> 0 查找文本:$count 替换文本:0 查找文本:$文件名 替换文本:文件名0 查找文本:$inputFile 替换文本:Input0 查找文本:$outputFile 替换文本:Output0 findText: $message 替换Text: Message0 查找文本:$snap 替换文本:Snapshot0 噢噢噢噢噢----> 1 查找文本:$count 替换文本:1 查找文本:$文件名 替换文本:文件名1 查找文本:$inputFile 替换文本:Input1 查找文本:$outputFile 替换文本:Output1 findText: $message 替换Text: Message1 查找文本:$snap 替换文本:快照1 呜呜呜呜呜呜----> 2 查找文本:$count 替换文本:2 查找文本:$文件名 替换文本:文件名2 查找文本:$inputFile 替换文本:Input2 查找文本:$outputFile 替换文本:Output2 findText: $message 替换Text: Message2 查找文本:$snap 替换文本:快照2 完毕...

当我在每次迭代中将输入文件初始化为新文件时。所以我确实在迭代过程中找到了所有 $ 元素。只是它们没有被附加到最终文件中。

有人可以帮忙吗?非常感谢。

最佳答案

您正在打开模板文件,更改内容并保存到“F:\docx\output.doc”。您执行此操作 3 次,每次都会覆盖输出文件。

在循环中准备字符串然后仅在文档中替换一次会更好。您的 main 方法将如下所示:

public static void main(String[] args) {
        String inputFile = "F:\\docx\\input.doc";
        String outputFile = "F:\\docx\\output.doc";
        POIFSFileSystem fs = null;

        String counts = "";

        try {
            for (int i = 0; i < 3; i++) {
                counts += String.valueOf(i) + "; ";
            }
            fs = new POIFSFileSystem(new FileInputStream(inputFile));
            HWPFDocument doc = new HWPFDocument(fs);
            doc = replaceText(doc, "$count", counts);
            saveWord(outputFile, doc);
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

关于Java Apache POI : Read/Write from . 文档文件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40547493/

相关文章:

使用File IO和2Darray比较C语言中的字符串错误

java - 如何将输出写入文本文件,与 show() 函数显示的输出相同

java - 如何使用 Apache POI 移动特定单元格?

java - 来自 maven swing 项目的可执行 jar

java - Docker 缓存 gradle 依赖项

java - 使用 Java.io.File 列出目录内容时的奇怪行为

java - 无法在 Windows 命令提示符下使用 javac 编译 .java 文件

java - Apache POI 3.9 无法获取 HSSFPalette

java - 我需要编写一个java程序,不断提示用户输入句子。然后反转字符串仅在输入停止时退出

Java - new 运算符的方法