我正在尝试在java中打开MS Word 2003文档,搜索指定的String并将其替换为新的String。我使用APACHE POI来做到这一点。我的代码如下:
public void searchAndReplace(String inputFilename, String outputFilename,
HashMap<String, String> replacements) {
File outputFile = null;
File inputFile = null;
FileInputStream fileIStream = null;
FileOutputStream fileOStream = null;
BufferedInputStream bufIStream = null;
BufferedOutputStream bufOStream = null;
POIFSFileSystem fileSystem = null;
HWPFDocument document = null;
Range docRange = null;
Paragraph paragraph = null;
CharacterRun charRun = null;
Set<String> keySet = null;
Iterator<String> keySetIterator = null;
int numParagraphs = 0;
int numCharRuns = 0;
String text = null;
String key = null;
String value = null;
try {
// Create an instance of the POIFSFileSystem class and
// attach it to the Word document using an InputStream.
inputFile = new File(inputFilename);
fileIStream = new FileInputStream(inputFile);
bufIStream = new BufferedInputStream(fileIStream);
fileSystem = new POIFSFileSystem(bufIStream);
document = new HWPFDocument(fileSystem);
docRange = document.getRange();
numParagraphs = docRange.numParagraphs();
keySet = replacements.keySet();
for (int i = 0; i < numParagraphs; i++) {
paragraph = docRange.getParagraph(i);
text = paragraph.text();
numCharRuns = paragraph.numCharacterRuns();
for (int j = 0; j < numCharRuns; j++) {
charRun = paragraph.getCharacterRun(j);
text = charRun.text();
System.out.println("Character Run text: " + text);
keySetIterator = keySet.iterator();
while (keySetIterator.hasNext()) {
key = keySetIterator.next();
if (text.contains(key)) {
value = replacements.get(key);
charRun.replaceText(key, value);
docRange = document.getRange();
paragraph = docRange.getParagraph(i);
charRun = paragraph.getCharacterRun(j);
text = charRun.text();
}
}
}
}
bufIStream.close();
bufIStream = null;
outputFile = new File(outputFilename);
fileOStream = new FileOutputStream(outputFile);
bufOStream = new BufferedOutputStream(fileOStream);
document.write(bufOStream);
} catch (Exception ex) {
System.out.println("Caught an: " + ex.getClass().getName());
System.out.println("Message: " + ex.getMessage());
System.out.println("Stacktrace follows.............");
ex.printStackTrace(System.out);
}
}
我用以下参数调用此函数:
HashMap<String, String> replacements = new HashMap<String, String>();
replacements.put("AAA", "BBB");
searchAndReplace("C:/Test.doc", "C:/Test1.doc", replacements);
当Test.doc文件包含这样的简单行:“ AAA EEE ”时,它可以成功运行,但是当我使用复杂文件时,它将成功读取内容并生成Test1。 doc文件,但是当我尝试打开它时,它会给我以下错误:
Word无法阅读此文档。它可能是腐败的。 请尝试下列办法中的一个或多个: *打开并修复文件。 *使用Text Recovery转换器打开文件。 (C:\ Test1.doc)
请告诉我该怎么做,因为我是POI的初学者,我还没有找到一个好的教程。
答案 0 :(得分:3)
首先,你应该关闭你的文件。
除此之外,我建议做的是将原始Word文档重新保存为Word XML文档,然后将扩展名从.XML手动更改为.doc。然后查看您正在使用的实际文档的XML并跟踪内容以确保您不会意外编辑十六进制值(AAA和EEE可能是其他字段中的十六进制值)。
如果没有看到实际的Word文档,很难说出发生了什么。
根本没有太多关于POI的文档,特别是对于Word文档,不幸的是。
答案 1 :(得分:2)
我不知道:回答自己是否可以,但只是为了分享知识,我会自己回答。
浏览网页后,我找到的最终解决方案是: 名为 docx4j 的库非常适合处理MS docx文件,虽然它的文档到目前为止还不够,它的论坛仍处于开始阶段,但总的来说它有助于我做我需要什么..
感谢所有帮助我的人......
答案 2 :(得分:1)
您可以尝试OpenOffice API,但没有太多资源可以告诉您如何使用它。
答案 3 :(得分:0)
看起来this可能是个问题。
答案 4 :(得分:0)
你也可以尝试这个:http://www.dancrintea.ro/doc-to-pdf/