【问题标题】:Exporting Excel Charts as Images将 Excel 图表导出为图像
【发布时间】:2020-08-18 05:41:43
【问题描述】:

我编写了以下简单的 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);) 仅适用于范围。 有没有办法滚动到ChartObjects,或者确保它们正确导出到图像?

为了进行测试,请使用包含 1000 多行图表的工作簿(足够远,以至于当文档打开时它们毫无疑问是看不见的);在运行程序之前关闭并重新打开文档(一旦滚动到,图表将已经呈现并存储在内存中)。

【问题讨论】:

  • 您可以尝试在导出前将 Excel 实例可见性设置为 true。
  • @TimWilliams _Application.Visible?我试试看。
  • @TimWilliams no dice =\ 同样的问题。

标签: c# excel export excel-interop


【解决方案1】:

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);
【解决方案2】:

我发现以下内容对我有用

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

【讨论】:

    【解决方案3】:

    .NET Core 3.1 使用 Interop.Excel 并将 VS 中的 COM ref 更改为 Copy Local

       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();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 2016-07-03
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多