将Excel图表导出为图片

4
我已经编写了以下简单的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,或以其他方式确保它们正确导出为图像? 为了测试,请使用包含1000多行图表的工作簿(当文档打开时,它们显然已超出视野范围);在运行程序之前先关闭并重新打开文档(一旦滚动到,图表就已呈现并存储在内存中)。

在导出之前,您可以尝试将Excel实例的可见性设置为true。 - Tim Williams
@TimWilliams _Application.Visible?我试试看。 - Sandy Gifford
@TimWilliams 没有筛子 =\ 相同的问题。 - Sandy Gifford
3个回答

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

做了奇迹(而且速度也非常快!)。对于任何希望找到与上面代码匹配的C#代码的人: app.Goto(co.TopLeftCell, true); - Sandy Gifford

4
我发现以下方法对我有用:
            foreach (Excel.ChartObject co in chartObjects)
            {
                co.Select();
                Excel.Chart chart = (Excel.Chart)co.Chart;
                chart.Export(exportPath + @"\" + chart.Name + ".png", "PNG", false);
            }

0

使用Interop.Excel和在VS中更改COM引用为Copy Local的.NET Core 3.1

   private static void ExportExcelChart()
    {
        var excelApp = new excel.Application(); 
        var wb = excelApp.Workbooks.Open(@"z:\scratch\acme_inc.xlsx");
        var ws = (excel.Worksheet)wb.Sheets[1];
        var chartObjects= ws.ChartObjects() as IEnumerable;

        foreach (excel.ChartObject co in chartObjects)
        { 
            co.Select();
            excel.Chart chart = (excel.Chart)co.Chart;
            chart.Export($@"z:\{chart.Name}.png", "PNG", false);
        }
        wb.Close();
        excelApp.Quit();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接