我试图通过自动化模仿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列),它总是耗尽内存。
答案 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应该是一个字符串数组。