在没有用户干预的情况下刷新使用来自Oracle数据库的外部数据的Excel工作簿

我创build了一个与Oracle数据库有外部连接的excel文件。 这个Excel工作簿有一张带有数据透视表的表格,可以让其他人从数据中提取大量的信息/含义。

我们不希望在每个想要使用这个Excel工作簿的用户计算机上安装Oracle客户端,所以我们将Excel工作簿分成两个文件。 一个与外部数据和另一个只是数据透视表,其中引用另一个Excel工作簿的数据。

我们需要在Excel工作簿中的数据与数据定期刷新,而不需要有人每次需要刷新的时候用数据手动打开Excel工作簿。 任何build议最好的方式去做这个?

例如,可能运行Windows任务调度程序调用的脚本,该脚本将具有数据源更新?

谢谢。

在评论中,build议使用SQL Server Reporting Services作为选项。 我开始做一些研究作为一个选项,但我需要一个非常快速的解决scheme,所以我最终做了以下几点:

我设法find一些网上的post,一些代码,导致我的解决scheme。 http://www.mattmasson.com/2013/03/refresh-an-excel-workbook-with-a-script-task/

https://social.msdn.microsoft.com/Forums/vstudio/en-US/8bce17fb-eacd-4df3-8c10-bf8ae8a93c55/c-code-to-refresh-excel-data?forum=csharpgeneral

两者的代码非常相似。 它用c#编写,看起来像这样:

var filename = "SomePath\\Book2.xlsx"; object missingValue = System.Reflection.Missing.Value; var excelApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); excelApp.DisplayAlerts = false; var Workbook = excelApp.Workbooks.Open(filename, missingValue, missingValue, missingValue, missingValue, missingValue, missingValue, missingValue, missingValue, missingValue, missingValue, missingValue, missingValue, missingValue, missingValue); Workbook.RefreshAll(); System.Threading.Thread.Sleep(30000); Workbook.Save(); Workbook.Close(false, filename, null); excelApp.Quit(); Workbook = null; System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp); 

调用Thread.Sleep()可确保在保存并closures工作簿之前刷新数据。 如果在刷新完成之前调用Workbook.Save(),则数据不会更新。 有一个更好的方法来做到这一点,但我不知道它是什么。

我只是使用Windows任务计划程序来调用此脚本在特定的时间运行。 这不是最优雅的解决scheme,但它的工作原理。