2009-09-24 82 views
2

我一直在努力寻找一种方法来获取和更改和Excel 2007工作簿连接(菜单数据 - >现有连接 - >此工作簿上的连接)。它是一个连接实际上)到SQL Server并用于数据透视表。VSTO 3.0获取/更改excel 2007工作簿连接

我使用Application.ActiveWorkbook.ConnectionsGlobals.ThisWorkbook.Connections尝试,但他们都返回总是Null..I've在表日后事项中的自定义功能区的按键事件试图以及作为好。

走了,我能想到的唯一的办法就是使用编写一个VBA方法做的工作,然后调用它在我的VSTO代码,但它不是很优雅是...

回答

0

我不能请记住在哪里,但是我记得在某处阅读Connections集合对于编写ODBC类型连接的用途有限。它有一些“连接”的枚举值,但我不确定是否有一些从该接口只读。

无论从VSTO实现新连接还是编辑现有连接都应该很容易。最好的选择是来自ODBCCP32.DLL win32库的use COM interop to callSQLConfigDataSource() function。 也检查出the following addin这使得它更容易在Excel中处理查询表。

2

Excel中的现有连接(此工作在2007年)不是活动连接。在能够获取该连接之前,您必须使用现有连接进行连接(在点击执行此代码的按钮之前,我手动完成了此操作)。

var application = Globals.ThisAddIn.Application; 
//This must be an active connection otherwise handle exceptions 
// such as 'Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX))' 
var connection = application.ActiveWorkbook.Connections["EXISTING_CONNECTION_NAME"]; 
var oledb = connection.OLEDBConnection; 
var settings = oledb.Connection; 
1

这里我调整Excel连接的连接字符串。考虑到我在工作簿中只有一个连接。

public class WorkbookConnectionsManager 
{ 
    public static void AdjustConnectionToSqlConnectionString(Excel.WorkbookConnection connection, String connectionString) 
    { 
    char[] propertiesSeparator = new char[] { ';' }; 
    char[] propertyValueSeparator = new char[] { '=' }; 

    Excel.OLEDBConnection oleDbConn = connection.OLEDBConnection; 

    Dictionary<string, string> dictExcelConnStrProperties = GetConnStrDictionary(oleDbConn.Connection, propertiesSeparator, propertyValueSeparator); 
    Dictionary<string, string> dictActualConnStrProperties = GetConnStrDictionary(connectionString, propertiesSeparator, propertyValueSeparator); 

    string[] reggedPropertyies = new string[] { "Integrated Security", "Persist Security Info", "User ID", "Password", "Initial Catalog", "Data Source", "Workstation ID" }; 

    foreach (string property in reggedPropertyies) 
     if (dictExcelConnStrProperties.ContainsKey(property) && dictActualConnStrProperties.ContainsKey(property) 
     && null != dictActualConnStrProperties[property] && !String.IsNullOrEmpty(dictActualConnStrProperties[property].ToString())) 
      dictExcelConnStrProperties[property] = dictActualConnStrProperties[property]; 

    string connStr = GetConnStrFromDict(dictExcelConnStrProperties, propertiesSeparator[0], propertyValueSeparator[0]); 

    oleDbConn.Connection = connStr; 
    } 

    private static string GetConnStrFromDict(Dictionary<string, string> dictConnStrProperties, char propertiesSeparator, char propertyValueSeparator) 
    { 
    StringBuilder connStrBuilder = new StringBuilder(); 
    foreach (KeyValuePair<string, string> keyValuePair in dictConnStrProperties) 
    { 
     connStrBuilder.Append(keyValuePair.Key); 
     if (!String.IsNullOrEmpty(keyValuePair.Value)) 
     { 
     connStrBuilder.Append(propertyValueSeparator); 
     connStrBuilder.Append(keyValuePair.Value); 
     } 
     connStrBuilder.Append(propertiesSeparator); 
    } 

    string connStr = String.Empty; 
    if (connStrBuilder.Length > 1) 
    { 
     connStr = connStrBuilder.ToString(0, connStrBuilder.Length - 1); 
    } 

    return connStr; 
    } 

    private static Dictionary<string, string> GetConnStrDictionary(string connString, char[] propertiesSeparator, char[] propertyValueSeparator) 
    { 
    string[] keyAndValue; 

    string[] arrayConnStrProperties = connString.Split(propertiesSeparator); 
    Dictionary<string, string> dictConnStrProperties = new Dictionary<string, string>(); 
    foreach (string excelConnStrProperty in arrayConnStrProperties) 
    { 
     keyAndValue = excelConnStrProperty.Split(propertyValueSeparator); 
     if (keyAndValue.Length > 1) 
     { 
     dictConnStrProperties.Add(keyAndValue[0], keyAndValue[1]); 
     } 
     else if (keyAndValue.Length > 0) 
     { 
     //standalone attribute 
     dictConnStrProperties.Add(keyAndValue[0], String.Empty); 
     } 
    } 

    return dictConnStrProperties; 
    } 



} 
+0

你可否考虑下次更好的格式化代码?我已经做了一些重新格式化,但如果不需要它会很好。 – 2012-10-07 00:42:50

+0

@KonradViltersten你的编辑对代码格式的改进做得很少。我已经回复到原文。 – 2014-09-12 10:26:17

+0

@TomRedfern我要回滚 - 回来看看它的样子。只是让你知道,所以它似乎并不是一个不成熟的行为,“是 - 不是!”,马蒂。当代码现在看起来(独立于我的重新格式化),它几乎不可读。这种语言甚至不承认......让我看看我们能做些什么。 – 2014-09-12 17:23:57