2010-03-22 63 views
2

我有一系列Excel電子表格,每個電子表格至少包含一頁數據和一個從數據創建的圖表頁面。我需要捕獲(不從數據重新生成)現有圖表作爲網頁友好圖片。這可能通過Java或.Net嗎?我知道POI的東西(Java)不會這樣做(或者我被告知,並沒有自己嘗試過)。如何從Excel導出圖表作爲圖形

回答

2

您是否嘗試過使用Chart.Export方法?

的例子幫助:

Worksheets("Sheet1").ChartObjects(1).Chart. Export _ 
FileName:="current_sales.gif", FilterName:="GIF" 

從內存中,我覺得你可以導出爲PNG爲好。

1

圖表圖像不存儲在工作簿中,因此您需要一個可以呈現Excel兼容圖表的組件。

將讓你加載Excel工作簿,可選地插入新的值/公式/格式/等...,計算,然後從一系列單元格或圖表中獲取圖像。

如果你想自己試試,你可以看到一些樣品here並下載免費試用here

聲明:我自己的SpreadsheetGear LLC

1

您可以使用J XL或Aspose Cells(Aspose不是免費的)轉換或複製圖表(圖表)。

這是代碼片段來提取Excel圖表對圖像

public class ExportChartToImage 
{ 
    public static void main(String[] args) throws Exception 
    { 
     //Start Excel 
     Application excelApp = new Application(); 
     excelApp.setVisible(true); 

     //Create test workbook 
     Workbook workbook = excelApp.createWorkbook("/home/tejus/Desktop/Chart Test"); 

     //Get the first (and the only) worksheet 
     final Worksheet worksheet1 = workbook.getWorksheet(1); 

     //Fill-in the first worksheet with sample data 
     worksheet1.getCell("A1").setValue("Date"); 
     worksheet1.getCell("A2").setValue("March 1"); 
     worksheet1.getCell("A3").setValue("March 8"); 
     worksheet1.getCell("A4").setValue("March 15"); 

     worksheet1.getCell("B1").setValue("Customer"); 
     worksheet1.getCell("B2").setValue("Smith"); 
     worksheet1.getCell("B3").setValue("Jones"); 
     worksheet1.getCell("B4").setValue("James"); 

     worksheet1.getCell("C1").setValue("Sales"); 
     worksheet1.getCell("C2").setValue("23"); 
     worksheet1.getCell("C3").setValue("17"); 
     worksheet1.getCell("C4").setValue("39"); 

     excelApp.getOleMessageLoop().doInvokeAndWait(new Runnable() 
     { 
      public void run() 
      { 
       final Variant unspecified = Variant.createUnspecifiedParameter(); 
       final Int32 localeID = new Int32(LocaleID.LOCALE_SYSTEM_DEFAULT); 

       Range sourceDataNativePeer = worksheet1.getRange("A1:C4").getPeer(); 
       _Worksheet worksheetNativePeer = worksheet1.getPeer(); 

       IDispatch chartObjectDispatch = worksheetNativePeer.chartObjects(unspecified, localeID); 

       ChartObjectsImpl chartObjects = new ChartObjectsImpl(chartObjectDispatch); 
       ChartObject chartObject = chartObjects.add(new DoubleFloat(100), new DoubleFloat(150), new DoubleFloat(300), new DoubleFloat(225)); 

       _Chart chart = chartObject.getChart(); 
       chart.setSourceData(sourceDataNativePeer, new Variant(XlRowCol.xlRows)); 

       BStr fileName = new BStr("/home/tejus/Desktop/chart.gif"); 
       Variant filterName = new Variant("gif"); 
       Variant interactive = new Variant(false); 

       chart.export(fileName, filterName, interactive); 

       chart.setAutoDelete(false); 
       chart.release(); 

       chartObject.setAutoDelete(false); 
       chartObject.release(); 

       chartObjects.setAutoDelete(false); 
       chartObjects.release(); 

       chartObjectDispatch.setAutoDelete(false); 
       chartObjectDispatch.release(); 
      } 
     }); 

     System.out.println("Press 'Enter' to terminate the application"); 
     System.in.read(); 

     //Close the MS Excel application. 
     boolean saveChanges = false; 
     workbook.close(saveChanges); 
     boolean forceQuit = true; 
     excelApp.close(forceQuit); 
    } 

} 

我用Ĵ的excel

+0

什麼是應用excelApp =新的應用程序(); ?我在JExcel API中看不到這個。 什麼是「excelApp.getOleMessageLoop()。doInvokeAndWait(new Runnable()」 請考慮在代碼中給出適當的註釋以幫助他人理解。 – 2016-04-25 09:48:32