poi XWPF 双 space
poi XWPF double space
我正在使用 apache POI.XWPF 库创建 word 文档。在过去的几天里,我一直在寻找如何为整个文档做双 spaces。我已经检查了 Apache javadocs 并且只是通过搜索互联网但似乎无法找到任何答案。
我找到了 addBreak()
方法,但它不起作用,因为用户将输入多个段落并将这些段落分成一行似乎不合理。如果每个段落都使用此方法,则它不会在每行之间而是在每个段落之间创建双 space。
这是我目前拥有的一小部分代码。
public class Paper {
public static void main(String[] args) throws IOException, XmlException {
ArrayList<String> para = new ArrayList<String>();
para.add("The first paragraph of a typical business letter is used to state the main point of the letter. Begin with a friendly opening; then quickly transition into the purpose of your letter. Use a couple of sentences to explain the purpose, but do not go in to detail until the next paragraph.");
para.add("Beginning with the second paragraph, state the supporting details to justify your purpose. These may take the form of background information, statistics or first-hand accounts. A few short paragraphs within the body of the letter should be enough to support your reasoning.");
XWPFDocument document = new XWPFDocument();
//Calls on createParagraph() method which creates a single paragraph
for(int i=0; i< para.size(); i++){
createParagraph(document, para.get(i));
}
FileOutputStream outStream = null;
try {
outStream = new FileOutputStream("ResearchPaper.docx");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
document.write(outStream);
outStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//Creates a single paragraph with a one tab indentation
private static void createParagraph(XWPFDocument document, String para) {
XWPFParagraph paraOne = document.createParagraph();
paraOne.setFirstLineIndent(700); // Indents first line of paragraph to the equivalence of one tab
XWPFRun one = paraOne.createRun();
one.setFontSize(12);
one.setFontFamily("Times New Roman");
one.setText(para);
}
}
为了确保我的问题很清楚,我正在尝试了解如何加倍 space word 文档 (.docx)。所以每一行之间应该有一行space。这和编辑word文档时按ctrl+2是一样的。
感谢您的帮助。
似乎没有可用于您要实现的目标的高级方法。在这种情况下,您需要深入研究 Apache POI 的低级 API。下面是一种方法。我并不是说这是最好的方法,我只是发现当我想重新创建 MS Word 的一些奇怪功能时它对我有用。
1。找出信息在文档中的存储位置
如果您需要手动调整某些内容,请创建 2 个内容尽可能少的文档:一个包含您想要执行的操作,一个不包含。将两者都保存为 Office XML 文档,因为这样便于阅读。比较这些文件 - 应该只有少数更改,并且您应该在文档结构中找到您的位置。
对于您的情况,这就是您要找的东西。
未修改的文档:
<w:body><w:p> <!-- only included here so you know where to look -->
<w:pPr>
<w:jc w:val="both" />
<w:rPr>
<w:lang w:val="nl-BE" />
</w:rPr>
</w:pPr>
修改文档:
<w:body><w:p>
<w:pPr>
<w:spacing w:line="480" w:lineRule="auto" /> <!-- BINGO -->
<w:jc w:val="both" />
<w:rPr>
<w:lang w:val="nl-BE" />
</w:rPr>
</w:pPr>
所以现在您知道您需要一个名为 spacing 的对象,它具有一些属性,并且它存储在 Paragraph 对象中的某个位置。
2。如果可能的话,通过低层 API 到达该位置
这部分比较棘手,因为 XML 节点名称有些晦涩难懂,您可能不太了解这些术语。此外,API 并不总是节点名称的 1:1 映射,因此您必须进行一些猜测并尝试逐步完成方法调用。专业提示:下载 Apache POI 的源代码!!你会走进一些死胡同,你可能无法通过最短的路径到达你想去的地方,但当你这样做时,你会觉得自己像一个神秘的 POI 大师。然后你在问答网站上写关于它的幸灾乐祸的帖子。
对于您在 MS Word 中的情况,这是您可能采用的路径(不一定是最好的,我不是高级专家API):
// you probably don't need this first line
// but you'd need it if you were manipulating an existing document
IBody body = doc.getBodyElements().get(0).getBody();
for (XWPFParagraph par : body.getParagraphs()) {
// work the crazy abbreviated API magic
CTSpacing spacing = par.getCTP().getPPr().getSpacing();
if (spacing == null) {
// it looks hellish to create a CTSpacing object yourself
// so let POI do it by setting any Spacing parameter
par.setSpacingLineRule(LineSpacingRule.AUTO);
// now the Paragraph's spacing shouldn't be null anymore
spacing = par.getCTP().getPPr().getSpacing();
}
// you can set your value, as demonstrated by the XML
spacing.setAfter(BigInteger.valueOf(480));
// not sure if this one is necessary
spacing.setLineRule(STLineSpacingRule.Enum.forString("auto"));
}
3。沐浴在你的荣耀中!
我正在使用 apache POI.XWPF 库创建 word 文档。在过去的几天里,我一直在寻找如何为整个文档做双 spaces。我已经检查了 Apache javadocs 并且只是通过搜索互联网但似乎无法找到任何答案。
我找到了 addBreak()
方法,但它不起作用,因为用户将输入多个段落并将这些段落分成一行似乎不合理。如果每个段落都使用此方法,则它不会在每行之间而是在每个段落之间创建双 space。
这是我目前拥有的一小部分代码。
public class Paper {
public static void main(String[] args) throws IOException, XmlException {
ArrayList<String> para = new ArrayList<String>();
para.add("The first paragraph of a typical business letter is used to state the main point of the letter. Begin with a friendly opening; then quickly transition into the purpose of your letter. Use a couple of sentences to explain the purpose, but do not go in to detail until the next paragraph.");
para.add("Beginning with the second paragraph, state the supporting details to justify your purpose. These may take the form of background information, statistics or first-hand accounts. A few short paragraphs within the body of the letter should be enough to support your reasoning.");
XWPFDocument document = new XWPFDocument();
//Calls on createParagraph() method which creates a single paragraph
for(int i=0; i< para.size(); i++){
createParagraph(document, para.get(i));
}
FileOutputStream outStream = null;
try {
outStream = new FileOutputStream("ResearchPaper.docx");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
document.write(outStream);
outStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//Creates a single paragraph with a one tab indentation
private static void createParagraph(XWPFDocument document, String para) {
XWPFParagraph paraOne = document.createParagraph();
paraOne.setFirstLineIndent(700); // Indents first line of paragraph to the equivalence of one tab
XWPFRun one = paraOne.createRun();
one.setFontSize(12);
one.setFontFamily("Times New Roman");
one.setText(para);
}
}
为了确保我的问题很清楚,我正在尝试了解如何加倍 space word 文档 (.docx)。所以每一行之间应该有一行space。这和编辑word文档时按ctrl+2是一样的。
感谢您的帮助。
似乎没有可用于您要实现的目标的高级方法。在这种情况下,您需要深入研究 Apache POI 的低级 API。下面是一种方法。我并不是说这是最好的方法,我只是发现当我想重新创建 MS Word 的一些奇怪功能时它对我有用。
1。找出信息在文档中的存储位置
如果您需要手动调整某些内容,请创建 2 个内容尽可能少的文档:一个包含您想要执行的操作,一个不包含。将两者都保存为 Office XML 文档,因为这样便于阅读。比较这些文件 - 应该只有少数更改,并且您应该在文档结构中找到您的位置。
对于您的情况,这就是您要找的东西。
未修改的文档:
<w:body><w:p> <!-- only included here so you know where to look -->
<w:pPr>
<w:jc w:val="both" />
<w:rPr>
<w:lang w:val="nl-BE" />
</w:rPr>
</w:pPr>
修改文档:
<w:body><w:p>
<w:pPr>
<w:spacing w:line="480" w:lineRule="auto" /> <!-- BINGO -->
<w:jc w:val="both" />
<w:rPr>
<w:lang w:val="nl-BE" />
</w:rPr>
</w:pPr>
所以现在您知道您需要一个名为 spacing 的对象,它具有一些属性,并且它存储在 Paragraph 对象中的某个位置。
2。如果可能的话,通过低层 API 到达该位置
这部分比较棘手,因为 XML 节点名称有些晦涩难懂,您可能不太了解这些术语。此外,API 并不总是节点名称的 1:1 映射,因此您必须进行一些猜测并尝试逐步完成方法调用。专业提示:下载 Apache POI 的源代码!!你会走进一些死胡同,你可能无法通过最短的路径到达你想去的地方,但当你这样做时,你会觉得自己像一个神秘的 POI 大师。然后你在问答网站上写关于它的幸灾乐祸的帖子。
对于您在 MS Word 中的情况,这是您可能采用的路径(不一定是最好的,我不是高级专家API):
// you probably don't need this first line
// but you'd need it if you were manipulating an existing document
IBody body = doc.getBodyElements().get(0).getBody();
for (XWPFParagraph par : body.getParagraphs()) {
// work the crazy abbreviated API magic
CTSpacing spacing = par.getCTP().getPPr().getSpacing();
if (spacing == null) {
// it looks hellish to create a CTSpacing object yourself
// so let POI do it by setting any Spacing parameter
par.setSpacingLineRule(LineSpacingRule.AUTO);
// now the Paragraph's spacing shouldn't be null anymore
spacing = par.getCTP().getPPr().getSpacing();
}
// you can set your value, as demonstrated by the XML
spacing.setAfter(BigInteger.valueOf(480));
// not sure if this one is necessary
spacing.setLineRule(STLineSpacingRule.Enum.forString("auto"));
}