2016-08-18 10 views
0

ExcelにCSVまたはTSVを読み込もうとしていますが、小さなファイルの場合はうまく動作します。小さなファイルは< 5kbです。問題は、大きなファイルをExcelに読み込もうとすると処理に時間がかかることです。アプリケーションをロードするために必要なファイルには、5〜100行のどこからでも5〜20,000行までの任意の場所を含めることができます。すぐにテキストをExcelに読み込みます

私は、BackgroundWorker、Threadpools、Parallel.For、Parallel.ForEachを使用しようとしましたが、すべてこのタスクで同じパフォーマンスを持つようです。

アプリケーション自体は、別のテキストファイルからヘッダーのリストを取得し、Excelに読み込んでフォーマットを適用し、実際のCSV/TSVファイルをExcelに読み込むように設計されています。

ここで私はこれまでのところ、このサブバックグラウンドワーカーで開幕しますしているものです。ここで

Private Sub LoadTextFile(ByVal xlApp As Excel.Application, ByVal xlWb As Excel.Workbook, ByVal xlWs As Excel.Worksheet, ByVal xlRange As Excel.Range) 
    Dim SheetName As String = "Sheet1" 
    If xlWs Is Nothing Then 
     xlWs = DirectCast(xlWb.Sheets.Add(After:=xlWb.Sheets(xlWb.Sheets.Count), Count:=1, Type:=Excel.XlSheetType.xlWorksheet), Excel.Worksheet) 
    End If 

    'Read lines and store in a string array 
    Dim lines() As String = File.ReadAllLines(FileToLoad) 

    'Parse and write lines to Excel 
    For i As Integer = 0 To lines.Length - 1 
     'Set new row range 
     xlRange = xlWs.Range(startCol + (i + 2).ToString + ":" + endCol + (i + 2).ToString) 

     'Parse the line to load 
     Dim lineDetail() As String = lines(i).Split(fileDelimiter) 

     'Load into Excel 
     xlRange.Value = lineDetail 
    Next 
End Sub 

は、いくつかのパフォーマンス時間は以下のとおりです。

89列 - 2000行:平均ロード時間= 7秒。

89列数:4,000行平均負荷時間= 12秒

91カラム - 10,000行:平均ロード時間= 28秒。

91列 - 24,000行:平均読み込み時間= 70秒

107列 - 8,732行:平均負荷時間= 17秒。

「Excelはこれらのファイルをどのように即座に読み込むのですか?とにかく、私はこれを最適化するのを助けることができる誰にも感謝していますので、Excelにデータを取得するのにはあまり時間がかかりません。前もって感謝します。

+1

「Excelはこれらのファイルをどのように即座に読み込みますか? ' - Excelのマクロレコーダーを使ってファイルを読み込むコマンドを取得することを考えましたか? – TnTinMn

+0

@TnTinMn私は持っているが、私はそれが十分柔軟であるとは思わない。私は必要なさまざまなフォーマットごとに48種類のマクロを作成する必要があります。また、ユーザーが使いやすいようにする必要があります。私が持っているユーザベースには、Excelマクロの使い方が分かりません。最後に、毎年2倍のカラムを更新する方法が必要で、毎年48マクロを2回再作成したくありません。現在の動作は、テキストファイルからヘッダーを取得し、簡単に更新できることです。 –

+0

私はVB.NetアプリケーションをExcelマクロのセットに変換することを提案していません。私はあなたが知らないかもしれないExcel Object Modelコマンドを発見するためにマクロレコーダーを使用するように教えようとしています。 VBA Interopステートメントを.Net Interopステートメントに変換するのは、少しの労力を要します。 – TnTinMn

答えて

0

これは私が思いついたもので、とてもうまくいくと思います。

Dim xlApp As New Excel.Application 
    Dim xlWb As Excel.Workbook 
    Dim xlWs As Excel.Worksheet 
    Dim xlRange As Excel.Range 

    'Start Excel and Create Application Object 
    xlApp = CreateObject("Excel.Application") 

    'Set invisible until all loading is completed 
    xlApp.Visible = False 

    'Get/Set references of active workbook/sheet 
    xlWb = xlApp.Workbooks.Add 
    xlWb = xlApp.ActiveWorkbook 
    xlWs = xlWb.ActiveSheet 
    xlRange = xlWs.Range("$A$1") 

    'Used to specify the data type for each column. 2 = Text 
    Dim array = New Object() {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _ 
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 _ 
     , 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _ 
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2} 

    'TextFilePlatform ANSI: 1252 
    With xlWs.QueryTables.Add(Connection:="TEXT;" + cfg.filePath, Destination:=xlRange) 
     .Name = "sec" 
     .FieldNames = True 
     .RowNumbers = False 
     .FillAdjacentFormulas = False 
     .PreserveFormatting = True 
     .RefreshOnFileOpen = False 
     .RefreshStyle = Excel.XlCellInsertionMode.xlInsertDeleteCells 
     .SavePassword = False 
     .SaveData = True 
     .AdjustColumnWidth = True 
     .RefreshPeriod = 0 
     .TextFilePromptOnRefresh = False 
     .TextFilePlatform = 1252 
     .TextFileStartRow = 1 
     .TextFileParseType = Excel.XlTextParsingType.xlDelimited 
     .TextFileTextQualifier = Excel.XlTextQualifier.xlTextQualifierDoubleQuote 
     .TextFileConsecutiveDelimiter = False 
     .TextFileTabDelimiter = cfg.fileTSV 
     .TextFileSemicolonDelimiter = False 
     .TextFileCommaDelimiter = cfg.fileCSV 
     .TextFileSpaceDelimiter = False 
     .TextFileColumnDataTypes = array 
     .TextFileTrailingMinusNumbers = True 
     .Refresh(BackgroundQuery:=False) 
    End With 

    'Add headers do formatting here 
    '<Additional Worksheet formats here> 

    xlApp.Visible = True 
関連する問題