2014-03-05 124 views
3

我已经编写了以下简单的C#控制台应用程序,以从Excel工作簿中导出所有图表。它工作得很好除非图表自从打开文档以来没有被滚动到,在这种情况下会生成一个空的图像文件。将Excel图表导出为图像

using Excel = Microsoft.Office.Interop.Excel; 
using System; 
using System.Diagnostics; 

namespace ExcelExporter 
{ 
    class ChartExporter 
    { 
     const string EXPORT_TO_DIRECTORY = @"C:\Users\Sandy\Desktop\Excel\Charts"; 

     static void Main(string[] args) 
     { 
      Excel.Application app = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") as Microsoft.Office.Interop.Excel.Application; 

      ConsoleColor c = Console.ForegroundColor; 
      Console.ForegroundColor = ConsoleColor.Green; 
      Console.Write("Export To: "); 
      Console.ForegroundColor = c; 
      string exportPath = Console.ReadLine(); 

      if (exportPath == "") 
       exportPath = EXPORT_TO_DIRECTORY; 

      Excel.Workbook wb = app.ActiveWorkbook; 

      foreach (Excel.Worksheet ws in wb.Worksheets) 
      { 
       Excel.ChartObjects chartObjects = (Excel.ChartObjects)(ws.ChartObjects(Type.Missing)); 

       foreach (Excel.ChartObject co in chartObjects) 
       { 
        Excel.Chart chart = (Excel.Chart)co.Chart; 
//     app.Goto(co, true); 
        chart.Export(exportPath + @"\" + chart.Name + ".png", "PNG", false); 
       } 
      } 

      Process.Start(exportPath); 
     } 
    } 
} 

我做了几次失败的尝试滚动到对象;例如,对程序底部的注释行(app.Goto(co, true);)仅适用于范围。 有什么办法可以滚动到ChartObject,否则确保它们正确导出到图像?

要进行测试,请使用带有1000多行图表的工作簿(远远不能超出文档打开时的视野);在运行程序之前关闭并重新打开文档(一旦滚动到,图表将已经被渲染并存储在内存中)。

+0

你可以尝试在出口前的Excel实例可见性设置为true以下工作。 –

+0

@TimWilliams ['_Application.Visible'](http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel._application.visible.aspx)?我会试试看。 –

+0

@TimWilliams no dice = \同样的问题。 –

回答

5

VBA,但同样的想法可能会为C#工作...

Dim co As ChartObject, sht As Worksheet, x As Long 
x = 1 
Set sht = ThisWorkbook.Sheets("Sheet1") 
For Each co In sht.ChartObjects 
    Application.Goto co.TopLeftCell, True 
    co.Chart.Export "C:\_stuff\test\chart" & x & ".jpg", "JPG", False 
    x = x + 1 
Next co 
+0

工作奇迹(太快了!)。对于任何寻找C#等价物的人(因为它适合上面的代码):'app.Goto(co.TopLeftCell,true);' –

4

我发现我

  foreach (Excel.ChartObject co in chartObjects) 
      { 
       co.Select(); 
       Excel.Chart chart = (Excel.Chart)co.Chart; 
       chart.Export(exportPath + @"\" + chart.Name + ".png", "PNG", false); 
      }