Java 在word文档中添加脚注

Java 在word文档中添加脚注,java,apache-poi,openxml,Java,Apache Poi,Openxml,如何使用Apache POI向word文档(.docx)添加脚注,但实际上我无法添加更多内容。我不确定这是否是在word文档中添加脚注的最佳方式,但它确实有效。在审查了一份使用word添加脚注的文件后,我发现不仅需要一个脚注,而且还需要在该段中提供一个参考,并且可以选择但强烈推荐三种样式 向文档添加脚注需要一个CTFtnEdn实例,这可以通过使用CTFtnEdn.Factory.newInstance()实现。现在,为了添加脚注的内容,我引用了使用word制作的脚注中的内容: <xml-f

如何使用Apache POI向word文档(
.docx
)添加脚注,但实际上我无法添加更多内容。

我不确定这是否是在word文档中添加脚注的最佳方式,但它确实有效。在审查了一份使用word添加脚注的文件后,我发现不仅需要一个脚注,而且还需要在该段中提供一个参考,并且可以选择但强烈推荐三种样式

向文档添加脚注需要一个
CTFtnEdn
实例,这可以通过使用
CTFtnEdn.Factory.newInstance()
实现。现在,为了添加脚注的内容,我引用了使用word制作的脚注中的内容:

<xml-fragment w:id="1" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape">
    <w:p w:rsidR="00B87AAC" w:rsidRDefault="00B87AAC">
        <w:pPr>
            <w:pStyle w:val="FootnoteText"/>
        </w:pPr>
        <w:r>
            <w:rPr>
                <w:rStyle w:val="FootnoteReference"/>
            </w:rPr>
            <w:footnoteRef/>
        </w:r>
        <w:r>
            <w:t xml:space="preserve">Here is a Footnote</w:t>
        </w:r>
        <w:bookmarkStart w:id="0" w:name="_GoBack"/>
        <w:bookmarkEnd w:id="0"/>
    </w:p>
</xml-fragment>
将标记添加到
CTFtnEdn
实例后,需要使用
document.addFootnote()
将其添加到
WMPFDocument

现在再加上对文件段落的引用——我不相信在没有引用的情况下,脚注会出现在页面底部。引用的开放XML如下所示:

<w:r w:rsidR="00B87AAC">
    <w:rPr>
        <w:rStyle w:val="FootnoteReference"/>
    </w:rPr>
    <w:footnoteReference w:id="1"/>
</w:r>
为了给脚注加上标,需要添加三种样式。以下是这三个项目的开放式XML:

<w:style w:styleId="FootnoteReference" w:type="character">
    <w:name w:val="footnote reference"/>
    <w:basedOn w:val="DefaultParagraphFont"/>
    <w:uiPriority w:val="99"/>
    <w:semiHidden/>
    <w:unhideWhenUsed/>
    <w:rPr>
      <w:vertAlign w:val="superscript"/>
    </w:rPr>
</w:style>
<w:style w:styleId="FootnoteText" w:type="paragraph">
    <w:name w:val="footnote text"/>
    <w:basedOn w:val="Normal"/>
    <w:link w:val="FootnoteTextChar"/>
    <w:uiPriority w:val="99"/>
    <w:semiHidden/>
    <w:unhideWhenUsed/>
    <w:rPr>
        <w:sz w:val="20"/>
        <w:szCs w:val="20"/>
    </w:rPr>
</w:style>
<w:style w:customStyle="1" w:styleId="FootnoteTextChar" w:type="character">
    <w:name w:val="Footnote Text Char"/>
    <w:basedOn w:val="DefaultParagraphFont"/>
    <w:link w:val="FootnoteText"/>
    <w:uiPriority w:val="99"/>
    <w:semiHidden/>
    <w:rPr>
        <w:sz w:val="20"/>
        <w:szCs w:val="20"/>
    </w:rPr>
</w:style>
请注意,
document.getStyles().addStyle(新的XWPFStyle(样式))
用于向文档添加新样式

下面是一个示例(确保在末尾更改输出路径):


我不确定这是否是在word文档中添加脚注的最佳方式,但它确实有效。在审查了一份使用word添加脚注的文件后,我发现不仅需要一个脚注,而且还需要在该段中提供一个参考,并且可以选择但强烈推荐三种样式

向文档添加脚注需要一个
CTFtnEdn
实例,这可以通过使用
CTFtnEdn.Factory.newInstance()
实现。现在,为了添加脚注的内容,我引用了使用word制作的脚注中的内容:

<xml-fragment w:id="1" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape">
    <w:p w:rsidR="00B87AAC" w:rsidRDefault="00B87AAC">
        <w:pPr>
            <w:pStyle w:val="FootnoteText"/>
        </w:pPr>
        <w:r>
            <w:rPr>
                <w:rStyle w:val="FootnoteReference"/>
            </w:rPr>
            <w:footnoteRef/>
        </w:r>
        <w:r>
            <w:t xml:space="preserve">Here is a Footnote</w:t>
        </w:r>
        <w:bookmarkStart w:id="0" w:name="_GoBack"/>
        <w:bookmarkEnd w:id="0"/>
    </w:p>
</xml-fragment>
将标记添加到
CTFtnEdn
实例后,需要使用
document.addFootnote()
将其添加到
WMPFDocument

现在再加上对文件段落的引用——我不相信在没有引用的情况下,脚注会出现在页面底部。引用的开放XML如下所示:

<w:r w:rsidR="00B87AAC">
    <w:rPr>
        <w:rStyle w:val="FootnoteReference"/>
    </w:rPr>
    <w:footnoteReference w:id="1"/>
</w:r>
为了给脚注加上标,需要添加三种样式。以下是这三个项目的开放式XML:

<w:style w:styleId="FootnoteReference" w:type="character">
    <w:name w:val="footnote reference"/>
    <w:basedOn w:val="DefaultParagraphFont"/>
    <w:uiPriority w:val="99"/>
    <w:semiHidden/>
    <w:unhideWhenUsed/>
    <w:rPr>
      <w:vertAlign w:val="superscript"/>
    </w:rPr>
</w:style>
<w:style w:styleId="FootnoteText" w:type="paragraph">
    <w:name w:val="footnote text"/>
    <w:basedOn w:val="Normal"/>
    <w:link w:val="FootnoteTextChar"/>
    <w:uiPriority w:val="99"/>
    <w:semiHidden/>
    <w:unhideWhenUsed/>
    <w:rPr>
        <w:sz w:val="20"/>
        <w:szCs w:val="20"/>
    </w:rPr>
</w:style>
<w:style w:customStyle="1" w:styleId="FootnoteTextChar" w:type="character">
    <w:name w:val="Footnote Text Char"/>
    <w:basedOn w:val="DefaultParagraphFont"/>
    <w:link w:val="FootnoteText"/>
    <w:uiPriority w:val="99"/>
    <w:semiHidden/>
    <w:rPr>
        <w:sz w:val="20"/>
        <w:szCs w:val="20"/>
    </w:rPr>
</w:style>
请注意,
document.getStyles().addStyle(新的XWPFStyle(样式))
用于向文档添加新样式

下面是一个示例(确保在末尾更改输出路径):


这样其他人就不必像我一样做同样的研究:)!下面是POI 4.1.0代码的更新版本,使用类XWPFFootnote(不幸的是,它还没有完成所有工作)

首先,初始化文档以接收脚注
doc
是您的XWPF文档(我总是从模板文档开始,带有预制样式,包括所需的脚注样式:脚注文本,脚注引用)。这基本上创建了两个“假的”脚注,我认为这些脚注只用于显示目的,但是Word会认为文档在不存在的情况下是腐败的。
doc.createFootnotes();

// Create the first two "dummy" footnotes.

{ // <w:footnote w:type="separator" w:id="-1"><w:p><w:r><w:separator/></w:r></w:p></w:footnote>
    XWPFFootnote footnote = doc.createFootnote();
    footnote.getCTFtnEdn().setId(BigInteger.ZERO.subtract(BigInteger.ONE)); // -1
    footnote.getCTFtnEdn().setType(STFtnEdn.SEPARATOR);
    footnote.getCTFtnEdn().addNewP();
    footnote.getCTFtnEdn().getPArray(0).addNewR();
    footnote.getCTFtnEdn().getPArray(0).getRArray(0).addNewSeparator();
}

{ // <w:footnote w:type="continuationSeparator" w:id="0"><w:p><w:r><w:continuationSeparator/></w:r></w:p></w:footnote>
    XWPFFootnote footnote = doc.createFootnote();
    footnote.getCTFtnEdn().setId(BigInteger.ZERO);
    footnote.getCTFtnEdn().setType(STFtnEdn.CONTINUATION_SEPARATOR);
    footnote.getCTFtnEdn().addNewP();
    footnote.getCTFtnEdn().getPArray(0).addNewR();
    footnote.getCTFtnEdn().getPArray(0).getRArray(0).addNewContinuationSeparator();
}

这样其他人就不必像我一样做同样的研究:)!下面是POI 4.1.0代码的更新版本,使用类XWPFFootnote(不幸的是,它还没有完成所有工作)

首先,初始化文档以接收脚注
doc
是您的XWPF文档(我总是从模板文档开始,带有预制样式,包括所需的脚注样式:脚注文本,脚注引用)。这基本上创建了两个“假的”脚注,我认为这些脚注只用于显示目的,但是Word会认为文档在不存在的情况下是腐败的。
doc.createFootnotes();

// Create the first two "dummy" footnotes.

{ // <w:footnote w:type="separator" w:id="-1"><w:p><w:r><w:separator/></w:r></w:p></w:footnote>
    XWPFFootnote footnote = doc.createFootnote();
    footnote.getCTFtnEdn().setId(BigInteger.ZERO.subtract(BigInteger.ONE)); // -1
    footnote.getCTFtnEdn().setType(STFtnEdn.SEPARATOR);
    footnote.getCTFtnEdn().addNewP();
    footnote.getCTFtnEdn().getPArray(0).addNewR();
    footnote.getCTFtnEdn().getPArray(0).getRArray(0).addNewSeparator();
}

{ // <w:footnote w:type="continuationSeparator" w:id="0"><w:p><w:r><w:continuationSeparator/></w:r></w:p></w:footnote>
    XWPFFootnote footnote = doc.createFootnote();
    footnote.getCTFtnEdn().setId(BigInteger.ZERO);
    footnote.getCTFtnEdn().setType(STFtnEdn.CONTINUATION_SEPARATOR);
    footnote.getCTFtnEdn().addNewP();
    footnote.getCTFtnEdn().getPArray(0).addNewR();
    footnote.getCTFtnEdn().getPArray(0).getRArray(0).addNewContinuationSeparator();
}
footnote = doc.createFootnote();
paragraph.addFootnoteReference(footnote); // Creates a new run in the current paragraph to hold the reference.

XWPFParagraph footnoteParagraph;
{ // Create a low-level paragraph and add it to the footnote with the right style. 
    CTP ctp = footnote.getCTFtnEdn().addNewP();
    footnoteParagraph = new XWPFParagraph(ctp, footnote);
    footnoteParagraph.setStyle("FootnoteText");
}

{ // Create a run within this paragraph 
    XWPFRun run = paragraph.getLast().createRun();
    run.setStyle("FootnoteReference");
    run.getCTR().addNewFootnoteRef(); // Not addNewFootnoteReference, this is not recognised by Word!
}

{ // Add a space after the footnote number (like Word). 
    XWPFRun run = footnoteParagraph.createRun();
    run.setText(" ");
}

{ // Add your own text in the footnote, as in any paragraph. 
    XWPFRun run = footnoteParagraph.createRun();
}