我有一个 Excel 文件,它在工作簿中有 SQL 连接来从 SQL Server 获取数据,我想使用 C# 程序更新连接字符串,但我无法获取连接字符串值,也无法更新它。第一步之后,我想刷新同一连接的数据。 使用下面的代码,我可以获取连接名称,但无法找到修改它的方法,之后我可以使用更新的连接刷新数据。
private static void RefreshTheExcelData()
{
Application application_PMR = new Application();
Workbook workbook_PMR = application_PMR.Workbooks.Open(filePath);
var workBook_Connection = workbook_PMR.Connections;
foreach (WorkbookConnection cn in workbook_PMR.Connections)
Console.WriteLine(cn.Name);
}
在下面的例子中,逻辑:
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
----
Excel.Workbook myBook = null;
Excel.Application myApp = null;
Excel.WorkbookConnection wbConn = null;
string workbook = @"C:\test\Users.xlsm";
myApp = new Excel.Application();
try
{
myBook = myApp.Workbooks.Open(workbook);
object index = 1 as object;
for (int i = 1; i <= myBook.Connections.Count; i++)
{
wbConn = myBook.Connections.Item(i);
dynamic dbConn = wbConn.OLEDBConnection.Connection;
// Show how the change will look like
lblDataSource.Text = dbConn.Replace("oldDBserverName", "newDBserverName");
dbConn = (object)lblDataSource.Text;
// Update db connection string
wbConn.OLEDBConnection.Connection = dbConn;
wbConn.Refresh();
}
myBook.Application.DisplayAlerts = false;
myBook.Save();
}
catch (Exception)
{
throw;
}
finally
{
myBook.Close(1);
myApp.Quit();
if (wbConn != null) Marshal.ReleaseComObject(wbConn); wbConn = null;
if (myBook != null) Marshal.ReleaseComObject(myBook); myBook = null;
if (myApp != null) Marshal.ReleaseComObject(myApp); myApp = null;
}
对于 OLEDB,数据库连接字符串将包含:
Provider = SQLOLEDB.1
电源查询:
Provider = Microsoft.Mashup.OleDb.1
有关连接类型的更多信息:OLEDB 和 Power Query 连接
上面的代码是我编写的完整应用程序的片段,如下所示:
显示 Excel 报表的 OLEDB 连接准备更新之前和之后的“预览”。
支持 OLEDB 和 PowerQuery 数据库连接字符串更新。
如果有兴趣,我可能会将其发布到 CodeProject.com。