将Excel图表导出为图像

San*_*ord 4 c# excel export excel-interop

我编写了以下简单的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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我做了几次尝试滚动到对象的失败; app.Goto(co, true);例如,程序底部的注释掉的行()仅适用于范围. 有没有办法滚动到ChartObjects,或以其他方式确保它们正确导出到图像?

对于测试,请使用图表超过1000行的工作簿(足够远,以至于文档打开时它们无疑会不在视图范围内); 在运行程序之前关闭并重新打开文档(滚动到之后,图表将已经渲染并存储在内存中).

Tim*_*ams 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
Run Code Online (Sandbox Code Playgroud)