2017-01-08 14 views
0

私は非常に大きなエクセルファイルを開くのに時間がかかります。Do While Loopコードfor Excel宣言

ファイルの準備ができたらすぐにエラーなしでxlAppを宣言したいと思います。

以下のコードを修復する必要があります。

Process.Start("C:\Book1.xlsx") 
Do While SOMETHING 
    Application.DoEvents() 
Loop 
Dim xlApp As Excel.Application = Nothing 
xlApp = CType(GetObject(Nothing, "Excel.Application"), Excel.Application) 

Book1を開かずに次の行を実行すると、次の行にエラーが発生します。

xlApp = CType(GetObject(Nothing, "Excel.Application"), Excel.Application) 

Book1.xlsxの開封時間が常に異なるため、次のコードを使用することはお勧めできません。

Threading.Thread.Sleep(10000) 
+0

あなたが使用している場合は、 'とにかくオブジェクトExcel.Application':あなたはより多くの行を読んで、それがメモリにそれらを読み続けるだろう(ファイルがロードされた直後に戻ります)。また、現在のところ、GetObjectがBook1を開いたのと同じインスタンスを返すことは保証されていないと思います。 – dlatikay

+0

私はあなたが待っているものに混乱しています。 Excelが現在ファイルを開いていても、複数のインスタンスを作成できます。また、私はあなたが待っているものを確信していません。 – JohnG

+0

@dlatikay私の質問は、関連するインスタンスではありません。だから私の質問をもう一度考えるだけで1つのExcelインスタンスが実行されています。 –

答えて

3

ファイルを開くには時間がかかる場合は、待つだけです。しかし、それがオプションであれば、あなたができることは他にもあります。

まず、ファイルを開くこの使用する:あなただけ待たなければならないが、それはすぐにファイルの準備ができているとして準備ができているように、アプリケーションが作成されることについては

Microsoft.Office.Interop.Excel.Application excel = new Application(); 
Microsoft.Office.Interop.Excel.Workbook workBook = 
    excel.Workbooks.Open(fileLocation); 

を。

ファイルを開くには時間がかかりすぎる場合は、ファイルをCSV形式に変換して保存してください。その後、いつでもそのファイルを読むことができ、かなり素早く読むことができます。ここでも、これはオプションではないかもしれないが、それはある場合には、ここにどのようにある:

workBook.SaveAs(
    fileLocation + ".csv", 
    Microsoft.Office.Interop.Excel.XlFileFormat.xlCSVWindows 
); 
workBook.Close(true); 
excel.Quit(); 

次にあなたがFile.ReadLines()メソッドを使用して、本当に速いそれを読むことができます。この方法では、一度に1行ずつ読み込むので、ファイル全体をロードせずに1行だけ読み込み、すぐに読み始めることができます。ちょうどその `オープン()`関数、同期的に開きます使用するように書き換えて、

foreach (var thisLine in File.ReadLines(fileLocation)) 
{ 
    // do something 
} 
+0

ありがとうございます。しかし、あなたの答えは私の質問とは関係ありません。あなたの答えを削除してください。 –

+1

なぜそれはあなたの質問に関連していないと思いますか?私はあなたが達成しようとしていることを知っていますか? – CodingYoshi

+0

@SamSamuel 'Process.Start'でExcelを起動し、 'Excel.Application'を宣言し、あなたがしているように接続しようとするのは意味がありません。この回答は正しいです。 – GSerg