Java .doc文件中的Apache POI格式文本问题

Java .doc文件中的Apache POI格式文本问题,java,apache-poi,Java,Apache Poi,我正在我的项目中使用这个例子。一切都很好,替换文本也很好,但在我的输出文本文件中,应该是“居中”的,已经变成左对齐。输入文件-.doc,我觉得这破坏了文档的格式,但我不确定问题出在哪里。如何解决这个问题 public class HWPFTest { public static void main(String[] args){ String filePath = "F:\\Sample.doc"; POIFSFileSystem fs = null;

我正在我的项目中使用这个例子。一切都很好,替换文本也很好,但在我的输出文本文件中,应该是“居中”的,已经变成左对齐。输入文件-.doc,我觉得这破坏了文档的格式,但我不确定问题出在哪里。如何解决这个问题

public class HWPFTest {
    public static void main(String[] args){
        String filePath = "F:\\Sample.doc";
        POIFSFileSystem fs = null;        
        try {            
            fs = new POIFSFileSystem(new FileInputStream(filePath));            
            HWPFDocument doc = new HWPFDocument(fs);
            doc = replaceText(doc, "$VAR", "MyValue1");
            saveWord(filePath, doc);
        }
        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);
                    } 
                }
            }
        } 
        return doc;
    }

    private static void saveWord(String filePath, HWPFDocument doc) throws FileNotFoundException, IOException{
        FileOutputStream out = null;
        try{
            out = new FileOutputStream(filePath);
            doc.write(out);
        }
        finally{
            out.close();
        }
    }
}
公共类HWPFTest{
公共静态void main(字符串[]args){
String filePath=“F:\\Sample.doc”;
POIFSFS=null;
试试{
fs=新的POIFSF文件系统(新的FileInputStream(filePath));
HWPF文件文件=新的HWPF文件(fs);
doc=replaceText(doc,“$VAR”,“MyValue1”);
保存字(文件路径,文档);
}
catch(filenotfounde异常){
e、 printStackTrace();
}
捕获(IOE异常){
e、 printStackTrace();
}
}
专用静态HWPFDocument replaceText(HWPFDocument文档,字符串findText,字符串replaceText){
范围r1=doc.getRange();
对于(int i=0;i
HWPF不能用于写入.doc文件。它可能适用于非常简单的文件内容,但很少有额外的东西会破坏它。我担心你在这里运气不好——如果这是你的一个选择,你可能想使用RTF文件并处理这些文件。如果将rtf扩展名重命名为.doc(如果需要.doc扩展名),Word应该可以正常工作


(我为一个客户开发了一个自定义和工作的HWPF变体,并且知道实现这一点有多困难。当8位编码之外的字符存在时,当使用表格时,当使用文本框时,当嵌入图形时,….doc文件中的某些内容也与descr不同,标准HWPF库将遇到麻烦。)ibed是微软的官方规范。制作一个工作的HWPF库是“非常重要的”,需要大量的规范阅读和调查。如果你想修复这些缺陷,你需要至少半年的开发工作。)

我认为您可以使用docx文件-解压、替换内容并压缩回来。我个人对ods/odt文件这么做。@user1516873在POI项目在docx上得到发展之前,我使用POI项目开发了一个自定义的与docx相关的部分。docx格式有一些微妙之处,简单的内容替换会破坏一切。当然,在许多情况下,它是可以使用的工作正常,但如果你需要确保它工作正常,你将面临严重的额外努力。@RainerSchwarze我会记下这一点,谢谢你。对于OpenOffice格式,我没有这样的问题。谢谢你对这个问题的详细描述。是的,我使用了很多表和徽标,问题解决了,我将文件保存为.odt格式,并使用JODReports。全部为f格式化输出文件中的文本-良好。