2

全て、

許可されたユーザーが Excel スプレッドシートをサーバーにアップロードできるようにするアプリケーションに取り組んでいます。

それらがアップロードされると、Excel スプレッドシートのデータを読み取り、一連の検証、解析、および操作を行い、変更されたデータをタブ区切りのテキスト ファイルに書き込む従来の ASP スクリプトがあります。

次に、「一括挿入」を使用してデータをデータベースにロードする 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 でデータを 1 行ずつ読み取ってから、SQL Server の一時テーブルに 1 行ずつ書き込む必要があると思います。

アドバイスや洞察力を事前に感謝します!

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 の整理に取り組みます。文字列 (行 = 行 & 行) に追加するたびに、まったく新しい文字列を作成し、古い文字列を何度も何度もクリーンアップしようとする必要があるため、コストがかかります。そして、スペースはますますそれを必要としていました。そのため、それを見つけるのに苦労しています。

レコードセットで GetRows を使用することを検討することをお勧めします。これにより、1 回の呼び出しですべてのタブ操作が実行され、大きな古い文字列が返されます。

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

HTML テーブルなどのデータを簡単に (そして迅速に) レンダリングできるように設計されています。それを使用してタブ付きリストをレンダリングすることもできないと言っているわけではありません。スプレッドシートで使用したことはありませんが、うまくいくはずです。

このドキュメントは可能だと言っているようですが:

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

于 2009-11-04T18:17:31.793 に答える