2017-01-17 4 views
0

Я прочитал документ Word в Java, используя Apache POI, но я не могу найти ссылки на создание раздела, подраздел ect. в файле Word. Кроме того, я пытаюсь создать оглавление с количеством добавленных разделов. Я скопировал часть моего кода, чтобы показать вам, что я сделал:Как создать раздел, подраздел и подзапрос в файле Word с помощью Apache POI?

public static void main(String[] args) throws FileNotFoundException, IOException { 

     File out = new File("POIExamlpe.docx"); 

     XWPFDocument document = new XWPFDocument(); 
     XWPFStyles styles = document.createStyles(); 

     XWPFWordExtractor we = new XWPFWordExtractor(document); 
     System.out.println(we.getText()); 

     //Create multilevel list in word with different styles, form the next level 
     CreateParagraph(document, styles, "First [email protected]@Second [email protected]@First [email protected]@Second [email protected]@Three [email protected]@Second [email protected]@Three [email protected]@Second [email protected]@First Level"); 

     document.createTOC(); 
} 
public static void CreateParagraph(XWPFDocument doc, XWPFStyles style,String content){ 
    for (String value : content.split("@@")) { 
     XWPFParagraph para = doc.createParagraph(); 
     para.setVerticalAlignment(TextAlignment.CENTER); 
     para.setNumID(BigInteger.valueOf(1)); 
     para.setStyle(heading1); 
     if (value.contains("Second")) { para.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1)); 
      para.setStyle(heading2); 
     } 
     if(value.contains("Three")){  para.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(2)); 
      para.setStyle(heading4); 
     } 
     XWPFRun run = para.createRun(); 

}

Я сгенерирована document

Но я хочу, чтобы создать что-то вроде this.

ответ

1

Независимо от того, работает это или нет, зависит от вашего POIExamlpe.docx. Это должно содержать определения нумерации в пределах \word\numberings.xml. Например:

<w:abstractNum w:abstractNumId="0"> 
<w:multiLevelType w:val="multilevel"/> 
<w:lvl w:ilvl="0"> 
    <w:start w:val="1"/> 
    <w:numFmt w:val="decimal"/> 
    <w:pStyle w:val="Heading1"/> 
    <w:lvlText w:val="%1"/> 
    <w:lvlJc w:val="left"/> 
    <w:pPr> 
    <w:ind w:hanging="432" w:left="432"/> 
    </w:pPr> 
</w:lvl> 

<w:lvl w:ilvl="1"> 
    <w:start w:val="1"/> 
    <w:numFmt w:val="decimal"/> 
    <w:pStyle w:val="Heading2"/> 
    <w:lvlText w:val="%1.%2"/> 
    <w:lvlJc w:val="left"/> 
    <w:pPr> 
    <w:ind w:hanging="576" w:left="576"/> 
    </w:pPr> 
</w:lvl> 

<w:lvl w:ilvl="2"> 
    <w:start w:val="1"/> 
    <w:numFmt w:val="decimal"/> 
    <w:pStyle w:val="Heading3"/> 
    <w:lvlText w:val="%1.%2.%3"/> 
    <w:lvlJc w:val="left"/> 
    <w:pPr> 
    <w:ind w:hanging="720" w:left="720"/> 
    </w:pPr> 
</w:lvl> 

</w:abstractNum> 

<w:num w:numId="1"> 
<w:abstractNumId w:val="0"/> 
</w:num> 

Код линии

para.setNumID(BigInteger.valueOf(1)); 

относится к numID 1, который относится к abstractNumId 0, который определяет нумерацию.

Код строки

para.getCTP().getPPr().getNumPr().addNewIlvl().setVal(BigInteger.valueOf(1)); 

относится к ilvl 1, который определяет стиль уровня нумерации. Например, на этом уровне <w:lvlText w:val="%1.%2"/>.

Как вы можете это проверить? Файл *.docx - это просто архив ZIP, содержащий файлы XML и другие файлы в специальной структуре каталогов. Поэтому вы можете распаковать этот файл *.docx и посмотреть его.

Чтобы создать соответствующий шаблон, создайте новый документ Word, используйте в нем все необходимые заголовки и укажите их. Сохраните файл как POIExamlpe.docx. Теперь вы можете удалить содержимое и снова сохранить. Теперь распакуйте этот файл *.docx и посмотрите на \word\numberings.xml.

+0

Спасибо Axel за ваше время. Ваш ответ решил мою проблему. Это сработало отлично! – Sofi