【发布时间】:2014-04-20 00:25:57
【问题描述】:
设置环境:
我正在使用带有 .NET 框架 4 的 vb.net 开发 Excel 2010 应用程序级插件。
我的目标:
- 让用户输入多个名称进行搜索
- 使用名称列表在 LARGE 电子表格(超过 30,000 行)上执行 SQL 查询
- 返回记录集并粘贴到新工作表中
性能是我的首要任务。我想知道利用 .NET 框架最快的方法。
在我的代码中使用 ADO 连接对象是可行的,但该过程需要的时间太长(5 - 8 秒)。
这是我在名为 wells 的表上使用的 SQL 查询:
SELECT *
FROM wells
WHERE padgroup in
(SELECT padgroup
FROM wells
WHERE name LIKE 'TOMCHUCK 21-30'
OR name LIKE 'FEDERAL 41-25PH')
这是表格的一部分:
我现在正在使用此代码创建一个 ADO 连接对象来检索我的结果:
'Create Recordset Object
rsCon = CreateObject("ADODB.Connection")
rsData = CreateObject("ADODB.Recordset")
rsCon.Open(szConnect)
rsData.Open(mySQLQueryToExecute, rsCon, 0, 1, 1)
'Check to make sure data is received, then copy the data
If Not rsData.EOF Then
TargetRange.Cells(1, 1).CopyFromRecordset(rsData)
Else
MsgBox("No records returned from : " & SourceFile, vbCritical)
End If
'Clean up the Recordset object
rsData.Close()
rsData = Nothing
rsCon.Close()
rsCon = Nothing
据我所知,Excel 电子表格以 Open XML 格式存储,.NET 框架包含对解析 XML 的本机支持。
在研究之后,我发现了几个不同的选择:
有人可以提供一个关于什么是最好的使用方法的指针吗?我真的很感激。
附加说明:
- 所有查询都需要能够在不连接到 在线数据库
- 我只需访问电子表格一次即可从行中提取原始数据
现在我只是将电子表格嵌入为项目资源。
然后,在运行时创建文件,运行查询,将结果存储在内存中,然后删除文件。
'Create temp file path in the commonapplicationdata folder
Dim excelsheetpath As StringBuilder
excelsheetpath = New StringBuilder(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData))
excelsheetpath.Append("\MasterList.xlsm")
'Save resources into temp location in HD
System.IO.File.WriteAllBytes(excelsheetpath.ToString, My.Resources.MasterList)
'Now call the function to use ADO to get records from the MasterList.xlsm file just created
GetData(excelsheetpath.ToString, "Sheet1", "A1:S40000", True, False)
'Store the results in-memory and display by adding to a datagridview control (in a custom task pane)
'Delete the spreadsheet
System.IO.File.Delete(excelsheetpath.ToString())
【问题讨论】:
-
这是更大应用程序的一部分吗?它是一个开放类型名称和关闭类型的东西吗?他们加载数据的方式以及加载数据的时间取决于应用程序的类型,虽然它很乱我喜欢使用 Excel 互操作,但它似乎是功能最丰富的选项,尽管如果你只需要数据而不需要有关单元格的信息,您可能最好使用 Linq,您可以 Get Some More Information on Linq and Excel Here
-
@user2140261 该链接看起来很有希望,我会试一试并报告。现在,为了加载数据,我只是将 excel 工作表嵌入为项目资源。然后,在代码中,我临时创建文件、运行查询、删除文件。我更新了我的问题以包含此代码。
-
这可能会评估每一行的子查询。我会独立运行查询并使用它来手动构建第一个。使用不同的。
-
运行子查询。使用子查询的结果在 ('3492','3494') 中建立一个硬编码的 WHERE padgroup。您可能会遇到对每一行都运行子查询的情况。非常简单 - 在 ('3492','3494') 中测试 WHERE padgroup
-
@Blam 我把
SELECT * FROM wells WHERE padgroup in (3492, 3494)测试过了,差别很小。仍然平均大约 5-8 秒。另外,我只是使用 VBA 运行了这个查询(没有任何额外的代码),它仍然需要 5-8 秒。我认为这与设置 ADO 连接的时间有关,而不是查询本身
标签: .net vb.net excel vsto openxml