我正在编写一个代码来读取.doc文件作为模板,并在各种迭代后将数据写入新的.doc文件。我的代码似乎有一个简单的问题,我无法弄清楚。Java Apache POI:从.doc文件读取/写入问题
下面是我写的代码,[我某处计算器基本骨架只。]
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();
}
}
}
成功运行后,还会生成output.doc。但问题是它只包含第一个循环的数据。
从理论上讲,它应该包含所有3次迭代的数据,但它只包含第一个数据,然后就没有任何数据。它在执行期间也不显示任何错误/异常。我也确保outputstream将附加选项视为true。
不知道,我在做什么错。
当我运行该程序,我可以在下面的输出看,
LOOOOOOOOOOOOP ----> 0 findText: $count replaceText: 0 findText: $filename replaceText: FileName0 findText: $inputFile replaceText: Input0 findText: $outputFile replaceText: Output0 findText: $message replaceText: Message0 findText: $snap replaceText: Snapshot0 LOOOOOOOOOOOOP ----> 1 findText: $count replaceText: 1 findText: $filename replaceText: FileName1 findText: $inputFile replaceText: Input1 findText: $outputFile replaceText: Output1 findText: $message replaceText: Message1 findText: $snap replaceText: Snapshot1 LOOOOOOOOOOOOP ----> 2 findText: $count replaceText: 2 findText: $filename replaceText: FileName2 findText: $inputFile replaceText: Input2 findText: $outputFile replaceText: Output2 findText: $message replaceText: Message2 findText: $snap replaceText: Snapshot2 DONE...
正如我开始输入文件作为新的每次迭代。所以我会在迭代过程中找到所有$元素。只是它们不会被附加到最终文件中。
有人可以帮忙吗?非常感谢。
我已经添加了上述问题的控制台输出,我在运行该程序时看到。它还表示$元素被发现并被每次迭代所取代。 – WebNoob
是的,我有点不对)您打开您的模板文件,更改内容并保存到“F:\\ docx \\ output.doc”。你每次覆盖输出文件3次。所以,请尝试我提供的答案。 –
其实,我正在展示的内容是虚拟内容,为了简化,每个人都可以阅读。实际内容将是带有路径的文件名,并且还将在文件名或文件路径中包含特殊字符。所以如果我尝试在字符串中添加它,它会因此而中断。 我现在所拥有的完美作品。唯一的问题是我不知道POI中的任何方法会帮助我将所有迭代的内容附加到单个文件中。你是否知道可能有效的其他技术。 – WebNoob