C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: CSVをExcel出力。処理時間を短くする方法


(過去ログ 150 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■87438 / inTopicNo.1)  CSVをExcel出力。処理時間を短くする方法
  
□投稿者/ K (1回)-(2018/05/22(Tue) 11:17:10)

分類:[C#] 

2018/05/22(Tue) 11:23:47 編集(投稿者)
2018/05/22(Tue) 11:20:17 編集(投稿者)

<pre><pre>VS 2017 excel2013
はじめまして、こんにちは。
csvよりエクセルへ出力するプログラムを組んだのですが、
oSheet.Cells[i + 6, j + 2] = strSplit[j];
ここで読み込んだ値をいちいちExcelにアクセスするので遅くなります。適当な配列やらListにデータを貯めて最後に(又は一定量貯まるたびに)
一括で出力するようにすれば良いことは分かります。その処理を自分なりに調べたのですが、今の私の力では実行することが出来ませんでした。わかる方がいれば是非ご教示願いたいです。


string excelName = @"C:\場所指定\テスト.xls";
Excel.Application oXls;
Excel.Workbook oWBook;

oXls = new Excel.Application();

oWBook = (Excel.Workbook)(oXls.Workbooks.Open(excelName)); //Excelファイルをオープンする

Excel.Worksheet oSheet;
oSheet = (Excel.Worksheet)oWBook.Sheets[1];

oXls.Visible = false; //Excel を非表示にする

var strRec = new StreamReader("C:\\場所指定\\テスト.txt", Encoding.GetEncoding(932));

var i = 0;
while (!strRec.EndOfStream)
{
i = i + 1;
var readLine = strRec.ReadLine();
if (readLine == null) continue;
var strSplit = readLine.Split(','); // 読み込んだ一行をカンマ毎に分けて配列に格納する
for (var j = 0; j < 28; j++)
{
oSheet.Cells[i + 6, j + 2] = strSplit[j];
          }
}

oWBook.Save();
oXls.Workbooks.Close();</pre></pre>
引用返信 編集キー/
■87439 / inTopicNo.2)  Re[1]: CSVをExcel出力。処理時間を短くする方法
□投稿者/ WebSurfer (1500回)-(2018/05/22(Tue) 12:44:24)
No87438 (K さん) に返信

まず CSV ファイルの読み込みですが、改行コードやデリミタ(コンマのような区切り文字)がフ
ィールド値の中にあると String.Split メソッドを使ってカンマ ',' で区切るといった単純な方
法は使えません。

なので、TextFieldParser などの CSV パーサーを使うことをお勧めします。

CSV パーサーを使って一旦 CSV ファイルのデータを DataTable に取り込んで、ADO.NET + ACE
プロバイダで DataTable をベースに Excel のブック作成し、それに Insert するという方法は
いかがですか?

それで良ければ以下の記事の応用でできると思いますので一読してみてください。

CSV パーサー
http://surferonwww.info/BlogEngine/post/2010/10/28/CSV-parser.aspx

ACE OleDb で Excel のブック作成
http://surferonwww.info/BlogEngine/post/2012/01/26/Creating-Excel-workbook-by-using-ACE-OleDb-provider.aspx
引用返信 編集キー/
■87441 / inTopicNo.3)  Re[1]: CSVをExcel出力。処理時間を短くする方法
□投稿者/ furu (169回)-(2018/05/22(Tue) 15:15:35)
No87438 (K さん) に返信
> for (var j = 0; j < 28; j++)
> {
> oSheet.Cells[i + 6, j + 2] = strSplit[j];
>           }
> }

oSheet.Range[oSheet.Cells[i + 6, 2], oSheet.Cells[i + 6, 2 + 28 - 1]].Value = strSplit;

とりあえず、28倍
引用返信 編集キー/
■87442 / inTopicNo.4)  Re[2]: CSVをExcel出力。処理時間を短くする方法
□投稿者/ K (2回)-(2018/05/22(Tue) 15:47:54)
No87439 (WebSurfer さん) に返信

>
URLまで貼っていただきありがとうございます。
一度目を通して試してみます。
ご丁寧にありがとうございました。
引用返信 編集キー/
■87443 / inTopicNo.5)  Re[2]: CSVをExcel出力。処理時間を短くする方法
□投稿者/ K (3回)-(2018/05/22(Tue) 15:56:53)
No87441 (furu さん) に返信
> ■No87438 (K さん) に返信
>
> oSheet.Range[oSheet.Cells[i + 6, 2], oSheet.Cells[i + 6, 2 + 28 - 1]].Value = strSplit;

シンプルかつ明確なプログラムありがとうございます。
確かに行ごとに出力ができました。

たとえばこの処理、1行ごとではなく、5行ごとにまとめて出力をしたい場合どのように工夫すればよいのでしょうか。

お忙しい所恐れ入りますが、お手すきの時に返信いただけたら幸いです。宜しくお願い致します。
引用返信 編集キー/
■87445 / inTopicNo.6)  Re[3]: CSVをExcel出力。処理時間を短くする方法
□投稿者/ furu (170回)-(2018/05/22(Tue) 16:29:37)
No87443 (K さん) に返信
> たとえばこの処理、1行ごとではなく、5行ごとにまとめて出力をしたい場合どのように工夫すればよいのでしょうか。

5行分のstrSplitを2次元配列aaaにして

oSheet.Range[oSheet.Cells[i + 6, 2], oSheet.Cells[i + 6 + 5 - 1, 2 + 28 - 1]].Value = aaa;

引用返信 編集キー/
■87446 / inTopicNo.7)  Re[4]: CSVをExcel出力。処理時間を短くする方法
□投稿者/ K (4回)-(2018/05/22(Tue) 16:33:25)
No87445 (furu さん) に返信
> ■No87443 (K さん) に返信

> 5行分のstrSplitを2次元配列aaaにして
>
> oSheet.Range[oSheet.Cells[i + 6, 2], oSheet.Cells[i + 6 + 5 - 1, 2 + 28 - 1]].Value = aaa;
>

迅速な回答ありがとうございます。
簡潔かつ丁寧な回答でとても良く理解することができました。
本当にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -