刷新使用Oracle数据库中的外部数据的Excel工作簿,无需用户干预

时间:2015-10-08 14:14:00

标签: excel oracle

我创建了一个excel文件,它与Oracle数据库有外部连接。这个excel工作簿有一个带有数据透视表的工作表,允许其他人从数据中提取大量信息/含义。

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

我们需要excel工作簿中的数据,并且数据会定期刷新,而无需每次需要刷新时手动打开带有数据的excel工作簿。有关最佳方法的任何建议吗?

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

感谢。

1 个答案:

答案 0 :(得分:0)

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

我设法在网上找到了一些帖子,其中有一些代码可以让我找到解决方案。 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()的调用可确保在保存和关闭工作簿之前刷新数据。如果在刷新完成之前调用Workbook.Save(),则数据不会更新。必须有更好的方法来做到这一点,但我不知道它到底是什么。

我只是使用Windows任务调度程序来调用此脚本以在特定时间运行。它不是最优雅的解决方案,但它有效。