使用Interop在后台更新Excel文件并更新链接的书籍

时间:2018-05-14 00:20:18

标签: c# excel office-interop

我有一个Excel文件(比如Book1.xlsx),后台使用Microsoft.Office.Interop.Excel由C#应用程序打开和更新,还有另一个引用此文件的Excel文件(MainBook.xlsx)通过公式书(Book1) 事实是,当Book1在后台更新时,MainBook不会更新引用,直到我手动打开Book1。

我应该怎么做才能更新Book1时,更改会通过它的公式反映在MainBook中。

使用Workbook.UpdateLinks可以实现这一目标吗?如果是这样,你会怎么做?试试这个Links in excel are not updating automatically C#,它对我不起作用

这是我更新Book1的代码

Excel.Application excapp = new Microsoft.Office.Interop.Excel.Application();         
excapp.Visible = false;

string workbookPath = @"Book1.xlsx";
var workbook = excapp.Workbooks.Open(workbookPath,
    3, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
    true, false, 0, true, false, false);

var sheet = (Excel.Worksheet)workbook.Sheets[1]; 

sheet.Range["A:A"].Clear();
string cellName;
int counter = 1;
foreach (var item in list)
{

    cellName = "A" + counter.ToString();
    var range = sheet.get_Range(cellName, cellName);
    range.Value2 = item.ToString();
    ++counter;
}       

workbook.Save();
workbook.Close();

1 个答案:

答案 0 :(得分:0)

这可能是因为您使用以下行在Excel的新实例中打开:

Excel.Application excapp = new Microsoft.Office.Interop.Excel.Application();

1)如果您希望 立即 公式更新,则可以在同一实例中打开Book 1。您需要使用System.Runtime.InteropServices;为元帅班。

Excel.Application excapp = (Microsoft.Office.Interop.Excel.Application) 
                           Marshal.GetActiveObject("Excel.Application");
string workbookPath = @"C:\MyFolder\Book1.xlsx";
....

这种方式会导致Book1.xlsx可见 - 如果您当前的Excel实例(使用Mainbook)可见。

2)另一种方法是使用现有的代码,然后在你的代码之后调用主书上的updateLink方法。

....
....

workbook.Save();
workbook.Close();

Excel.Application originalXLInstance = (Microsoft.Office.Interop.Excel.Application) 
                           Marshal.GetActiveObject("Excel.Application");

Workbook mainBook = originalXLInstance.Workbooks.Item["MainBook.xlsx"];
mainBook.UpdateLink(workbookPath, XlLinkType.xlLinkTypeExcelLinks);

workbookPath可能需要是Book1.xlsx文件的完整路径