我想用Java在docx word文档中创建项目符号/编号列表。我正在使用Apache POI 3.10库。如果我理解正确,步骤将是这样的:
numbering = doc.createNumbering
numId = numbering.addNum(abstractNumId)
para.setNumID(numId)
; 但是我陷入了第二步。如何创建可以添加到编号中的AbstractNum对象?
答案 0 :(得分:3)
我正在尝试做类似的事情,并且直到它开始工作才击中它。
这是我将AbstractNum添加到文档编号对象的方法。致电' addAbstractNum()'事实证明在我使用的版本(3.10-FINAL)中有一个空错误。因此,为了解决这个问题,您需要在XML中生成AbstractNum,解析它,手动为其分配id,并将其添加到文档的编号对象中。
我就这样做了:
protected XWPFDocument doc;
private BigInteger addListStyle(String style)
{
try
{
XWPFNumbering numbering = doc.getNumbering();
// generate numbering style from XML
CTAbstractNum abstractNum = CTAbstractNum.Factory.parse(style);
XWPFAbstractNum abs = new XWPFAbstractNum(abstractNum, numbering);
// find available id in document
BigInteger id = BigInteger.valueOf(0);
boolean found = false;
while (!found)
{
Object o = numbering.getAbstractNum(id);
found = (o == null);
if (!found) id = id.add(BigInteger.ONE);
}
// assign id
abs.getAbstractNum().setAbstractNumId(id);
// add to numbering, should get back same id
id = numbering.addAbstractNum(abs);
// add to num list, result is numid
return doc.getNumbering().addNum(id);
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
'风格的格式'传递给方法的字符串,需要知道XWPF文档 - 其中,我没有。所以我创建了一个带有我想要的编号样式的word文档。将其保存到' .docx'文件。解压缩' .docx'文件,并从' numbering.xml'复制XML片段。它看起来像这样:
<xml-fragment xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" 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:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 wp14"><w:nsid w:val="1656060D" /><w:multiLevelType w:val="hybridMultilevel" /><w:tmpl w:val="99FCFC1A" /><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1" /><w:numFmt w:val="decimal" /><w:lvlText w:val="%1." /><w:lvlJc w:val="left" /><w:pPr><w:ind w:left="720" w:hanging="360" /></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="1"><w:start w:val="1" /><w:numFmt w:val="lowerLetter" /><w:lvlText w:val="%2." /><w:lvlJc w:val="left" /><w:pPr><w:ind w:left="1440" w:hanging="360" /></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="1"><w:start w:val="1" /><w:numFmt w:val="lowerRoman" /><w:lvlText w:val="%3." /><w:lvlJc w:val="right" /><w:pPr><w:ind w:left="2160" w:hanging="180" /></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="1"><w:start w:val="1" /><w:numFmt w:val="decimal" /><w:lvlText w:val="%4." /><w:lvlJc w:val="left" /><w:pPr><w:ind w:left="2880" w:hanging="360" /></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="1"><w:start w:val="1" /><w:numFmt w:val="lowerLetter" /><w:lvlText w:val="%5." /><w:lvlJc w:val="left" /><w:pPr><w:ind w:left="3600" w:hanging="360" /></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="1"><w:start w:val="1" /><w:numFmt w:val="lowerRoman" /><w:lvlText w:val="%6." /><w:lvlJc w:val="right" /><w:pPr><w:ind w:left="4320" w:hanging="180" /></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="1"><w:start w:val="1" /><w:numFmt w:val="decimal" /><w:lvlText w:val="%7." /><w:lvlJc w:val="left" /><w:pPr><w:ind w:left="5040" w:hanging="360" /></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="1"><w:start w:val="1" /><w:numFmt w:val="lowerLetter" /><w:lvlText w:val="%8." /><w:lvlJc w:val="left" /><w:pPr><w:ind w:left="5760" w:hanging="360" /></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="1"><w:start w:val="1" /><w:numFmt w:val="lowerRoman" /><w:lvlText w:val="%9." /><w:lvlJc w:val="right" /><w:pPr><w:ind w:left="6480" w:hanging="180" /></w:pPr></w:lvl></xml-fragment>
取该字符串,将其传递给上面的方法。现在你有了一个可以列出的数字。
XWPFParagraph para = doc.createParagraph();
para.setStyle("ListParagraph");
para.setNumID(listType);
para.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(level));
祝你好运。
答案 1 :(得分:0)
打开文档 从文档中获取XWPFNumbering对象。 从文档中获取XWPFParagraph列表。 通过段落列表,当你得到每个段落尝试从中获取数字ID。如果返回null,则段落不在列表中。如果它不返回null,则可以使用BigInteger从XWPFNumbering对象中检索应用于段落的编号/项目符号方案的详细信息。
我引用了this website
答案 2 :(得分:0)
我也使用了你提到的相同步骤,对于第二步,我使用了以下语句。
BigInteger abstractNumId = BigInteger.valueOf(0);
通过这个我能够创建项目符号列表。但是,我还没有找到创建编号列表的方法。
答案 3 :(得分:0)
我发现最简单的方法是从具有所需样式的Word文档中提取numbering.xml,然后使用Java从XML树中手动重新创建重要标记。这听起来有点痛苦,但它比试图解析MS Word创建的东西要精确得多。并且CT函数以它们影响的XML节点命名,因此一旦你理解了它,它就相当直观。
例如在我的情况下(对于项目符号或编号的单级列表,这将返回正确的CTAbstractNum
):
private static CTAbstractNum getAbstractNumber(STNumberFormat.Enum numFmt) {
CTAbstractNum ctAbsNum = CTAbstractNum.Factory.newInstance();
CTLvl lvl = ctAbsNum.addNewLvl(); //Add a level
CTDecimalNumber start = lvl.addNewStart(); //Set the starting number
start.setVal(BigInteger.ONE);
CTNumFmt fmt = lvl.addNewNumFmt(); //Set the number format
fmt.setVal(numFmt);
//Add the text that's used for the bullet point
CTLevelText lt = lvl.addNewLvlText();
if (numFmt == STNumberFormat.BULLET) {
lt.setVal("");
lvl.addNewRPr(); //Set the Symbol font
CTFonts f = lvl.getRPr().addNewRFonts();
f.setAscii("Symbol");
f.setHAnsi("Symbol");
}
else { //Decimal
lt.setVal("%1.");
}
lvl.addNewPPr();
CTInd ind = lvl.getPPr().addNewInd(); //Set the indent
ind.setHanging(BigInteger.valueOf(360));
ind.setLeft(BigInteger.valueOf(720));
System.out.println(ctAbsNum);
return ctAbsNum;
}
答案 4 :(得分:0)
static void addCustomHeadingStyle(XWPFDocument docxDocument, XWPFStyles styles, String strStyleId, int headingLevel, int pointSize, String hexColor) {
CTStyle ctStyle = CTStyle.Factory.newInstance();
ctStyle.setStyleId(strStyleId);
CTString styleName = CTString.Factory.newInstance();
styleName.setVal(strStyleId);
ctStyle.setName(styleName);
CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance();
indentNumber.setVal(BigInteger.valueOf(headingLevel));
// lower number > style is more prominent in the formats bar
ctStyle.setUiPriority(indentNumber);
CTOnOff onoffnull = CTOnOff.Factory.newInstance();
ctStyle.setUnhideWhenUsed(onoffnull);
// style shows up in the formats bar
ctStyle.setQFormat(onoffnull);
// style defines a heading of the given level
CTPPr ppr = CTPPr.Factory.newInstance();
ppr.setOutlineLvl(indentNumber);
ppr.addNewNumPr().addNewNumId().setVal(BigInteger.ONE);
ctStyle.setPPr(ppr);
XWPFStyle style = new XWPFStyle(ctStyle);
CTHpsMeasure size = CTHpsMeasure.Factory.newInstance();
size.setVal(new BigInteger(String.valueOf(pointSize)));
CTHpsMeasure size2 = CTHpsMeasure.Factory.newInstance();
size2.setVal(new BigInteger("24"));
CTFonts fonts = CTFonts.Factory.newInstance();
fonts.setAscii("Calibri Light");
CTRPr rpr = CTRPr.Factory.newInstance();
rpr.setRFonts(fonts);
rpr.setSz(size);
rpr.setSzCs(size2);
style.setType(STStyleType.PARAGRAPH);
styles.addStyle(style);
}
}
可以添加自定义样式,以创建标题和索引,这个答案不只是为了添加数字而进行的一些更改