尝试通过互操作将外部数据添加到Excel文件的异常

时间:2014-01-14 15:23:17

标签: vb.net excel exception interop

我试图通过自动化模仿Excel的“数据/来自其他来源/来自SQL Server”功能。即:生成空白电子表格,触发SQL Server导入向导,保存生成的电子表格,退出。

我录制了一个导入数据的宏。由此产生的宏似乎相当简单[释义]:

With ActiveSheet.ListObjects.Add(SourceType  := blah, 
                                 Source      := Array(blah), 
                                 Destination := blah         ).QueryTable
    [set a bunch of properties]
End With

我写了一个骨架程序,能够成功启动Excel,向A1写“test”,保存文件,退出Excel,所以我知道我很高兴去那里。

当我将ActiveSheet.ListObjects.Add()调用添加到我的程序时,它会一直弹出ArgumentException。为了便于比较,我添加了一个ListObjects.Add调用,该调用生成一个本地而非外部的表,并且可以正常工作。

Dim lo                      As Microsoft.Office.Interop.Excel.ListObject
'this works
lo = ws.ListObjects.Add(SourceType:=Microsoft.Office.Interop.Excel.XlListObjectSourceType.xlSrcRange,    Source:=ws.Range("$A$1"),     Destination:=ws.Range("$D$1"))
'this nearly identical code does not
lo = ws.ListObjects.Add(SourceType:=Microsoft.Office.Interop.Excel.XlListObjectSourceType.xlSrcExternal, Source:=arrConnectionString,  Destination:=ws.Range("$D$1"))

arrConnectionString是从宏中逐字复制的三元素字符串数组。它只是一个看起来很普通的连接字符串,被切成三块:

{"OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Data Source=BLAHBLAH\SQLEXPRESS;Use Procedure for Prepa" , _
 "re=1;Auto Translate=True;Packet Size=4096;Workstation ID=BLAHBLAH;Use Encryption for Data=False;Tag with column collation when ", _
 "possible=False;Initial Catalog=dummy"}

确切的错误是:参数不正确。 (来自HRESULT的异常:0x80070057(E_INVALIDARG))。有什么想法吗?

最初我考虑使用EPPlus,但它在内存中构建整个电子表格。由于我需要导出的数据大小(120K行×300列),它总是耗尽内存。

1 个答案:

答案 0 :(得分:1)

Per Ben Black的建议:将Source参数从字符串数组更改为字符串使其正常工作。

似乎是http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.listobjects.add%28v=office.14%29.aspx文档中的一个缺陷,声称当SourceType为xlSrcExternal时,Source应该是一个字符串数组。