Ale*_*nov 4 java ms-word apache-poi
我正在使用apache-poi在 MS Word 文档中写入一些数据。我已经花了几个小时试图弄清楚如何创建一个编号列表,但我还没有取得任何结果。
我已经经历过这个,那个和其他多个问题。考虑到它apache-poi拥有我见过的最糟糕的文档(基本上根本没有文档),并且它们的类和方法的名称绝对是疯狂的,我很难理解如此复杂的示例。
问: 谁能提供一个简洁的代码片段来在 MS Word 文档中创建这样的列表:
提前致谢。
首先,我认为您的问题中链接的我的代码存在问题,因为apache poi它处于高度开发阶段,有时在早期版本中有效的代码在当前版本中不再有效。但是即使在当前版本 3.16 中,简单的复制和粘贴代码也会导致工作代码。
所以我删除了所有表格内容,因为链接的问题是关于表格单元格中的列表,我得到了:
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTLvl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STNumberFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.math.BigInteger;
public class CreateWordSimplestNumberingList {
public static void main(String[] args) throws Exception {
XWPFDocument document = new XWPFDocument();
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run=paragraph.createRun();
run.setText("The list:");
ArrayList<String> documentList = new ArrayList<String>(
Arrays.asList(
new String[] {
"One",
"Two",
"Three"
}));
CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance();
//Next we set the AbstractNumId. This requires care.
//Since we are in a new document we can start numbering from 0.
//But if we have an existing document, we must determine the next free number first.
cTAbstractNum.setAbstractNumId(BigInteger.valueOf(0));
/* Bullet list
CTLvl cTLvl = cTAbstractNum.addNewLvl();
cTLvl.setIlvl(BigInteger.valueOf(0)); // set indent level 0
cTLvl.addNewNumFmt().setVal(STNumberFormat.BULLET);
cTLvl.addNewLvlText().setVal("•");
*/
///* Decimal list
CTLvl cTLvl = cTAbstractNum.addNewLvl();
cTLvl.setIlvl(BigInteger.valueOf(0)); // set indent level 0
cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);
cTLvl.addNewLvlText().setVal("%1.");
cTLvl.addNewStart().setVal(BigInteger.valueOf(1));
//*/
XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
XWPFNumbering numbering = document.createNumbering();
BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
BigInteger numID = numbering.addNum(abstractNumID);
for (String string : documentList) {
paragraph = document.createParagraph();
paragraph.setNumID(numID);
run=paragraph.createRun();
run.setText(string);
}
paragraph = document.createParagraph();
FileOutputStream out = new FileOutputStream("CreateWordSimplestNumberingList.docx");
document.write(out);
out.close();
document.close();
}
}
Run Code Online (Sandbox Code Playgroud)
这导致:
您需要知道的是,*.docx文件只是一个ZIP包含目录结构的文件,其中包含XML文件。因此,如果我需要创建一个特殊Word文档,我所做的就是使用Word自身创建该文档的最简单形式。然后我解压缩*.docx文件并在/word/document.xml. 我在那里找到编号(列表):
<w:numId w:val="1"/>
Run Code Online (Sandbox Code Playgroud)
段落内。这是对mumIds in 的引用/word/numbering.xml。好吧,看看这个,我发现类似:
<w:numbering>
<w:abstractNum w:abstractNumId="0">
<w:lvl>
<w:start w:val="1"/>
<w:numFmt w:val="decimal"/>
<w:lvlText w:val="%1."/>
</w:lvl>
</w:abstractNum>
<w:num w:numId="1">
<w:abstractNumId w:val="0"/>
</w:num>
</w:numbering>
Run Code Online (Sandbox Code Playgroud)
AabstractNum具有lvl编号级别 ( )的定义,并且num具有numId和 对 的引用abstractNum。
然后你需要知道apache poi XWPF基于org.openxmlformats.schemas.wordprocessingml.x2006.main.*. 所以我们有XWPFNumbering和XWPFAbstractNum但XWPFAbstractNum只能使用org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNumSo how to find documentation about CTAbstractNum. 谷歌一下,找到http://grepcode.com/file/repo1.maven.org/maven2/org.apache.poi/ooxml-schemas/1.1/org/openxmlformats/schemas/wordprocessingml/x2006/main/CTAbstractNum.java