2

全部,

我正在开发一个允许授权用户将 Excel 电子表格上传到我们的服务器的应用程序。

上传后,会有一个经典的 ASP 脚本读取 Excel 电子表格中的数据,进行一系列验证、解析和操作,然后将修改后的数据写入制表符分隔的文本文件。

然后,它启动 SQL Server 中的存储过程,该过程使用“批量插入”将数据加载到数据库中。

当文件很小时,整个过程运行得相当好。但是随着它们变大(15,000+ 行,5+ mb),脚本开始需要很长时间才能运行(60+ 秒)。

因此,我正在寻找使其更高效/更快/更强大的方法。

粗略地说,这是代码现在的样子:

'' # read the uploaded Excel file

set objConnection = Server.CreateObject("ADODB.Connection") 
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & xlsfile & ";Extended Properties=""Excel 8.0;"""
set objRS = objConnection.execute("Select * from [Sheet1$]")
rows = ""
while (not objRS.EOF and Err.Number = 0)
    row = objRS("col1") & vbTab & objRS("col2") & vbTab ... objRS("coln") & vbCrLF
    rows = rows & row
    objRS.MoveNext
wend
objRS.close

'' # Write the file
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(txtFile, 2, true)
objFile.WriteLine rows
objFile.Close
set objFSO = nothing
set objFile = nothing

如您所见,整个文件被读入名为“rows”的变量中,然后被转储到文本文件中。

有更好的选择吗?例如,当我从 Excel 中读取文本文件时,我应该逐行编写它吗?

我考虑过的另一种可能性 - 将 Excel 文件读入 SQL Server 中的临时表,并在那里进行所有验证/操作。唯一的问题是我找不到“批量插入”的等效项 - 我想我可能必须在 Excel 中逐行读取数据,然后将其逐行写入 SQL Server 的临时表中。

非常感谢您的任何建议和见解!

4

2 回答 2

4

杀死你的是所有的字符串连接。一个简单的步骤是在文本文件上交错行读取和对 WriteLine 的调用。您每次只能将一行大小的字符串保存为字符串。

像这样的东西: -

set objConnection = Server.CreateObject("ADODB.Connection") 
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & xlsfile & ";Extended Properties=""Excel 8.0;"""
set objRS = objConnection.execute("Select * from [Sheet1$]")
set objFSO = CreateObject("Scripting.FileSystemObject")
set objFile = objFSO.OpenTextFile(txtFile, 2, true)

do until objRS.EOF
    tab = ""
    for each fld in objRS.Fields
        objFile.Write tab
        objFile.Write fld.value
        tab = vbTab
    next
    objFile.Write vbCrLf
    objRS.MoveNext
loop
objRS.close
objConnection.Close
objFile.Close
于 2009-11-04T17:41:51.333 回答
3

同意 Anthony,努力整理 String Concat。每次添加到字符串 (rows = rows & row) 时,它的成本都很高,因为它必须创建一个全新的字符串并一遍又一遍地尝试清理旧字符串。空间越来越需要它。所以它很难找到它,因此一直如此。

您可能想研究在您的记录集上使用 GetRows,它可以在一次调用中为您完成所有选项卡内容并返回一个大的旧字符串。

http://www.aspdev.org/articles/asp-getrows/

它旨在轻松(快速)呈现 HTML 表格等数据。没有什么说你也不能用它来渲染一个 TAB'ed 列表。尽管我从未将它与电子表格一起使用,但应该可以享受一下。

该文档似乎说它是可能的:

http://www.fontstuff.com/ebooks/free/fsADOConnectExcel.pdf

于 2009-11-04T18:17:31.793 回答