2012-01-18 16 views
6

Potrzebuję mieć listę punktowaną w dokumencie tekstowym z wcięciami i punktorami niestandardowymi, która jest generowana przez Javę z interfejsem Apache POI API. Szukałem i nie mogę znaleźć go dla dokumentu Word. Jest dostępny dla slajdów Powerpoint za pomocą pola tekstowego. Ale nie chcę używać pola tekstowego. Proszę daj mi znać, jak to osiągnąć. Każda pomoc doceniona. Dzięki! Z poważaniem, Arun Ganesh. PTworzenie listy wypunktowania na dokumencie tekstowym przy użyciu języka Java z interfejsem Apache POI API

Odpowiedz

1

POI HWPF jest niedojrzały api - wiodący deweloper otrzymał propozycję pracy Spowodowało podpisania umowy o poufności i został zmuszony do porzucić pracę w nim - i to może nie być możliwe, aby z niego korzystać do wygeneruj pliki, które chcesz.

Zobacz continuation of the post

2

To jest naprawdę możliwe tylko formatu OOXML w 2007 roku i do góry (za pomocą POI XWPF). Ponieważ jest oparty na XML, możesz zawsze wykonywać manipulacje DOM, aby osiągnąć to, co chcesz. Najłatwiejszym sposobem tworzenia punktów jest utworzenie listy punktorów i dodanie zakładki jako tekstu tego punktu. Podczas przetwarzania dokumentu, znaleźć zakładkę, a następnie uzyskać węzeł DOM z

`org.w3c.dom.Node bkmk = bookmark.getctBookmark).getDomNode();` 

Następnie skopiuj rodzica węzła bkmk, którym jest tag pkt. Masz teraz duplikat znacznika akapitu, który ma wszystkie niezbędne znaczniki podrzędne, aby stać się częścią listy punktorów. Zobacz, w OOXML nie ma struktury listy punktorów, jest to po prostu seryjna kontynuacja akapitów, które mają podobne znaczniki sub numeracji.

<w:p> 
    <w:pPr> 
    <w:pStyle w:val="style0" /> 
    <w:numPr> 
     <w:ilvl w:val="1" /> 
     <w:numId w:val="2" /> 
    </w:numPr> 
    <w:tabs> 
     <w:tab w:leader="none" w:pos="1807" w:val="left" /> 
    </w:tabs> 
    <w:spacing w:after="0" w:before="120" /> 
    <w:ind w:end="907" w:hanging="360" w:start="907" /> 
    <w:jc w:val="both" /> 
    </w:pPr> 
    <w:bookmarkStart w:id="1" w:name="GIVES" /> 
    <w:r> 
    <w:t>To be inserted Next Bullet</w:t> 
    </w:r> 
    <w:bookmarkEnd w:id="1" /> 
    <w:r> 
    <w:rPr> 
     <w:rFonts w:eastAsia="Times New Roman" /> 
     <w:color w:val="000000" /> 
     <w:lang w:eastAsia="en-US" /> 
    </w:rPr> 
    </w:r> 
</w:p> 

Kluczowe tagi są i i nie jestem bardzo obeznany ze znaczeń XML znaczników, ale jeśli rozpakować dowolny docx i spojrzeć na document.xml (po sformatowaniu go schludny, oczywiście) widać różnice między akapitami zi bez numeracji.

Po uzyskaniu klonu tagu można przemieścić węzeł za pomocą DOM, aby uzyskać i zamienić wartość węzła według potrzeb, lub można użyć xpath, aby znaleźć węzeł (w: r/w : t). Trzeba Instalatora NamespaceContext i nadać mu odpowiedni kod, aby zrozumieć w: prefiks

 NodeList nl; 
     XPath xp = XPathFactory.newInstance().newXPath(); 
     NamespaceContext nsContext = new NamespaceContext(){ 
      @Override public String getNamespaceURI(String prefix) { 
       if (prefix.equals("w")) { 
        return "http://schemas.openxmlformats.org/wordprocessingml/2006/main"; 
       } 
       return null; 
       } 

       @Override public String getPrefix(String namespaceURI) { 
       return null; 
       } 

       @Override public Iterator<?> getPrefixes(String namespaceURI) { 
       return Collections.emptyList() 
        .iterator(); 
       } 
      }; 
     xp.setNamespaceContext(nsContext); 
     nl = (NodeList) xp.evaluate("w:r/w:t", copy, XPathConstants.NODESET); 

Teraz przemierzać NodeList, setNodeValue ("Hello World"). Możesz to zrobić po sklonowaniu i wykonaniu: paragraph.getParentNode().insertBefore(bkmk, paragraph);

, aby uzyskać jak najwięcej punktów. Jeśli zrobisz

twój nowy punkt zostanie umieszczony na samym końcu dokumentu!

Tak więc, musisz zrobić insertBefore (jest to jedyna manipulacja węzłem domowym dostępna poza dołączaniem). Pozostawia to twój oryginalny pusty punkt na końcu, z zakładką w nim. Musisz usunąć zakładkę z paragraph.getParentNode(). RemoveChild (paragraph);

Następnie zapisz plik z POI.

Zasadniczo POI nie obsługuje list punktowanych, ponieważ OOXML w rzeczywistości nie obsługuje list wypunktowanych. Listy wypunktowania to tylko paragrafy z znacznikami numerowania jako dziećmi.Ale z punktami POI zawsze możesz upaść na podstawowe manipulacje DOM i możesz sprawdzić DOM z rozpakowaniem i uporządkowaniem.

Powiązane problemy