excel中的链接不会自动更新C#

时间:2013-11-20 15:34:00

标签: c# .net excel

到目前为止我尝试了什么

我正在开发基于.NET Framework 4.0的基于Window的应用程序。该应用程序执行两项任务 -

  1. 打开Excel文件,以便可以使用 Microsoft.Office.Interop.Excel ;从DDE服务器(MCX)获取更新。
  2. 使用 RSS Bus Ado.Net Provider 将excel文件中的数据读入DataGridView。
  3. 正常情景

    我已经共享了Excel文件,因此可以同时编辑和阅读。

    现在,当我运行DDE Server时,它会向Excel发送一些数据。 Excel文件显示更新的数据,中断时间为2秒(默认值)。没关系。

    编程方案

    当从程序打开相同的excel文件时,它不会显示更新的数据。以下是使用的代码段 -

    xlApp = new Application { AutomationSecurity =    MsoAutomationSecurity.msoAutomationSecurityLow };
            _xlApp.CalculateFull();
    
            _xlBook = _xlApp.Workbooks.Open(ExcelFilePath, 0, false, 5, "", "", false, XlPlatform.xlWindows, "", true, false, 0, true, false, false);
            //Add an event handler for the WorkbookBeforeClose Event of the Application object.
            _eventBeforeBookClose = BeforeBookClose;
            _xlApp.WorkbookBeforeClose += _eventBeforeBookClose;
    
            //Add an event handler for the Change event of both worksheet objects.
            _eventCellsChange = CellsChange;
    
            //Add an event handler for the Calculate event of both worksheet objects.
            _eventCellsCalculate = CellsCalculated;
    
            _xlSheet1 = (Worksheet)_xlBook.Worksheets.Item[1];_xlSheet1.Change += _eventCellsChange;
            ((DocEvents_Event)_xlSheet1).Calculate += _eventCellsCalculate;
    
            //Make Excel visible and give the user control.
            _xlApp.Visible = true;
            _xlApp.UserControl = true;       
    

    问题

    C#中是否有任何设置允许自动更新excel文件中的链接(从程序打开)?

2 个答案:

答案 0 :(得分:1)

有一个更简单的解决方案,Workbooks Open方法提供了一个参数,正是出于这个原因:

_xlBook = _xlApp.Workbooks.Open(ExcelFilePath, UpdateLinks: 3);

有关UpdateLinks参数的确切规范,请参阅WorkBooks.Open documentation。值“3”将始终更新所有链接。

答案 1 :(得分:0)

为了自动更新excel中的链接,我添加了以下需要由timer tick事件调用的函数。

代码段 -

public static void UpdateLinkValues()
    {
        var oleLinks = (object)_xlBook.LinkSources(XlLink.xlOLELinks);
        var oleLinkArray = (Array)oleLinks;

        for (var i = 1; i <= oleLinkArray.Length; i++)
        {
            _xlBook.UpdateLink(oleLinkArray.GetValue(i),XlLinkType.xlLinkTypeOLELinks);
        }
    }

此函数检索嵌入的OLE链接。然后调用 UpdateLink()来更新值。