Обновите файл Excel в фоновом режиме с помощью Interop и обновите связанные книги - PullRequest
0 голосов
/ 14 мая 2018

У меня есть файл Excel (скажем, Book1.xlsx), который открывается и обновляется приложением C # в фоновом режиме с помощью Microsoft.Office.Interop.Excel, и есть другой файл Excel (MainBook.xlsx), который ссылается на это book (Book1) через формулы.
Дело в том, что когда Book1 обновляется в фоновом режиме, MainBook не обновляет ссылки, пока я не открою Book1 вручную.

Что мне делать, чтобы при обновлении Book1 изменения отражались в MainBook с помощью формул, которые она имеет.

Можно ли использовать Workbook.UpdateLinks для достижения этой цели? Если так, как бы вы это сделали? Попробуйте это Ссылки в Excel не обновляются автоматически 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 голосов
/ 17 мая 2018

Это, вероятно, потому что вы открываете новый экземпляр Excel с этой строкой:

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

1) Если вы хотите, чтобы немедленно обновления формулы, то вы можете открыть книгу 1 в том же экземпляре.Вам необходимо использовать System.Runtime.InteropServices;для класса Marshal.

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

...