2017-05-08 520 views
0

我已經使用XWPF文檔數週,現在我一直無法添加圖表。餅圖,條形圖。我打算用XML手動將圖表注入到文件中,但我認爲它過多。我只想將圖表添加到Docx模板。 Aspose和javadocx不是選項。Apache POI Java - Docx圖表和圖形

XWPFDocument document = new XWPFDocument(getClass().getResourceAsStream("/templates/standard.docx")); 
//INSERT PIE CHART 
FileOutputStream out = new FileOutputStream(new File("output/output.docx"); 
document.write(out); 

[UPDATE - 簡單的路線]

由於時間則需成功寫入注射法,IV發現一個方便的(快速Ñ髒)將圖表的方式。這不是普通的單詞圖表,而是從庫中生成的圖表,存儲爲圖片並插入。

首先,我從http://knowm.org/open-source/xchart/xchart-example-code下載了庫。

其次,您已經實現了您的XWPF文檔,您可以創建一個圖表並將其附加爲圖像。

private XWPFDocument add_chart(XWPFDocument document) 
{ 
    // New Chart Element 
    CategoryChart chart = new CategoryChartBuilder().width(500).height(400).theme(Styler.ChartTheme.GGPlot2).title(getClass().getSimpleName()).build(); 
    chart.setTitle("Issue Count"); 
    // Customize Chart 
    Color[] sliceColors = new Color[]{new Color(27, 50, 119), new Color(58, 146, 56), new Color(0, 161, 222), new Color(154, 205, 102), new Color(246, 199, 182)}; 
    chart.getStyler().setSeriesColors(sliceColors); 

    // Series 
    chart.addSeries("Critical", new ArrayList<>(Arrays.asList(new String[]{"Count"})), new ArrayList<>(Arrays.asList(new Number[]{10}))); 
    chart.addSeries("High", new ArrayList<>(Arrays.asList(new String[]{"High"})), new ArrayList<>(Arrays.asList(new Number[]{5}))); 
    chart.addSeries("Medium", new ArrayList<>(Arrays.asList(new String[]{"Medium"})), new ArrayList<>(Arrays.asList(new Number[]{2}))); 
    chart.addSeries("Low", new ArrayList<>(Arrays.asList(new String[]{"Low"})), new ArrayList<>(Arrays.asList(new Number[]{1}))); 

    // Create and store a jpg image of the chart, then append it to the document 
    BitmapEncoder.saveBitmapWithDPI(chart, "tmp.jpg", BitmapFormat.JPG, 300); 
    document.createParagraph().createRun().addPicture(new FileInputStream("tmp.jpg"), XWPFDocument.PICTURE_TYPE_JPEG, "tmp.jpg", Units.toEMU(500), Units.toEMU(400)); 
    return document; 
} 

一個圖表我使用該庫做的一個例子: POI-chart-example

+0

插入代碼在這裏^ –

+2

是啊,你幾乎將不得不寫自己。圖表只在XSSF中得到最低限度的支持,並且根本不受XWPF支持。你將不得不使用CT類來自己構建它。如果你制定了一個或兩個圖表,回饋社區可能會受到歡迎。 – jmarkmurphy

回答

0

您可以使用以下位置的自定義POI罐子來讀取和修改文檔文件圖表,然後寫入到實際的文檔文件。 使用XWPFChart類,您可以使用所有方法,因爲我們可用於POI EXCEL/PPT。下面

https://github.com/sandeeptiwari32/POI_ENHN/POI3.14.jar

是簡單的例子來讀取MS-Word文件,圖表

public class PoiDocTest { 
    public static void main(String arg[]) throws FileNotFoundException, IOException 
    { 
     @SuppressWarnings("resource") 
     XWPFDocument document = new XWPFDocument(new FileInputStream("chart.docx")); 
     @SuppressWarnings("unused") 
     XWPFChart chart; 
     for (POIXMLDocumentPart part : document.getRelations()) { 
      if (part instanceof XWPFChart) { 
       chart = (XWPFChart) part; 
       break; 
      } 
     } 
    } 
}