2012-01-18 27 views
6

Tôi cần có danh sách dấu đầu dòng trong tài liệu từ với dấu đầu dòng và tùy chỉnh, được tạo thông qua Java với API Apache POI. Tôi đã tìm kiếm và tôi không thể tìm thấy nó cho tài liệu Word. Nó có sẵn cho slide Powerpoint bằng cách sử dụng hộp văn bản. Nhưng tôi không muốn sử dụng hộp văn bản. Xin vui lòng cho tôi biết khả năng để đạt được nó. Bất kỳ giúp đỡ nhiều đánh giá cao. Cảm ơn! Kính trọng, Arun Ganesh. PTạo danh sách Bullet trên tài liệu từ bằng Java với Apache POI API

Trả lời

1

HWPF POI là một api chưa trưởng thành - phát triển dẫn đã được cung cấp một công việc đó kéo theo việc ký kết một thỏa thuận không tiết lộ và ông đã buộc phải bỏ làm việc trong nó - và nó có thể không thể sử dụng nó để tạo các tệp bạn muốn.

Xem continuation of the post

2

Điều này thực sự chỉ có thể với các định dạng OOXML 2007 và lên (sử dụng XWPF POI). Vì nó dựa trên XML, bạn luôn có thể thực hiện thao tác DOM để đạt được những gì bạn muốn. Cách dễ nhất để tạo điểm bullet là tạo danh sách dấu đầu dòng và thêm dấu trang làm văn bản của viên đạn đó. Khi xử lý tài liệu, tìm dấu trang của bạn, sau đó nhận nút DOM với

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

Sau đó, sao chép nút gốc của nút bkmk, là thẻ đoạn. Bây giờ bạn có một thẻ đoạn trùng lặp có tất cả các thẻ con cần thiết để trở thành một phần của danh sách dấu đầu dòng. Hãy xem, trong OOXML không có cấu trúc của một danh sách dấu đầu dòng, nó chỉ đơn giản là tiếp tục nối tiếp các đoạn có các thẻ con số tương tự.

<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> 

Các thẻ chìa khóa đang có và và tôi không siêu quen thuộc với những ý nghĩa XML của thẻ, nhưng nếu bạn giải nén bất kỳ docx và nhìn vào document.xml (sau khi định dạng nó với gọn gàng, tất nhiên) bạn có thể thấy sự khác biệt giữa các đoạn có và không có đánh số. Vì vậy, một khi bạn có một bản sao của thẻ của bạn, bạn có thể đi qua nút với DOM để có được và thay thế giá trị nút với những gì bạn muốn, hoặc bạn có thể sử dụng xpath để tìm nút (w: r/w. : t). Bạn cần phải thiết lập một NamespaceContext và cung cấp cho nó mã thích hợp để hiểu được w: prefix

 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); 

Bây giờ, đi qua NodeList, setNodeValue ("Hello World"). Bạn có thể thực hiện việc này sau khi nhân bản và thực hiện: paragraph.getParentNode().insertBefore(bkmk, paragraph);

để nhận được nhiều dấu đầu dòng tùy thích. Nếu bạn làm

`paragraph.getParentNode().append(bkmk)` 

điểm bullet mới của bạn sẽ nằm ở cuối tài liệu!

Vì vậy, bạn phải thực hiện insertBefore (đây là thao tác nút dom duy nhất có sẵn ngoài nối thêm). Điều này khiến bạn với điểm đạn trống ban đầu của bạn ở cuối cùng, với dấu trang trong đó. Bạn cần xóa dấu trang bằng paragraph.getParentNode(). RemoveChild (đoạn);

Sau đó lưu tệp của bạn bằng POI.

Về cơ bản, POI không hỗ trợ danh sách dấu đầu dòng vì OOXML không thực sự hỗ trợ danh sách dấu đầu dòng. Danh sách dấu đầu dòng chỉ là một đoạn văn với các thẻ đánh số là trẻ em.Tuy nhiên, với POI bạn luôn có thể rơi xuống thao tác DOM cơ bản và bạn có thể kiểm tra DOM bằng cách giải nén và gọn gàng.

Các vấn đề liên quan