将Excel图表导出为图像

我已经编写了以下简单的C#控制台应用程序,从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的,否则确保他们正确地出口到图像?

为了进行testing,请使用一个工作簿,并在图表中打开1000行以上(当文档打开时,这些工作簿无疑是无法查看的)。 在运行程序之前closures并重新打开文档(一旦滚动到,图表将已经被渲染并存储在内存中)。

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 

我发现以下为我工作

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