これまでもClosedXMLをつかってExcelファイルとしてデータを保存する処理をしてきましたが、これまではこんなやり方をしていました。
まず書き込み用のデータをジャグ配列で用意します。
1 2 3 4 5 6 7 |
int[][] array; Random random = new Random(); List<int[]> list = new List<int[]>(); for (int i=0; i<1000; i++) list.Add(new int[] { random.Next(10000), random.Next(10000), random.Next(10000), random.Next(10000) }); array = list.ToArray(); |
このジャグ配列をこれまでこんな方法で保存していました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// int[][] arrayを保存する void SaveExcelFile1() { using (var book = new XLWorkbook()) { var sheet1 = book.AddWorksheet("sheet1"); int rowNumber = 1; foreach (int[] vs in array) { for(int i=0; i<4; i++) sheet1.Cell(rowNumber, i+1).Value = vs[i]; rowNumber++; } book.SaveAs("保存したいファイルのパスを指定する"); } } |
ジャグ配列をそのまま保存する方法はないのでしょうか? 調べてみるとこんな方法がありました。
1 2 3 4 5 6 7 8 9 10 11 12 |
// int[][] arrayを保存する void SaveExcelFile2() { using (var book = new XLWorkbook()) { var sheet1 = book.AddWorksheet("sheet1"); sheet1.Cell("A1").InsertData(array); book.SaveAs("d:\\test_new.xlsx"); } } |
どちらが速いのでしょうか? 実際に実験してみるとあまりかわりません。arrayの要素数を大きくして実験してみました。
配列の大きさを16万にします。
1 2 3 4 5 6 7 |
int[][] array; Random random = new Random(); List<int[]> list = new List<int[]>(); for (int i=0; i < 16 * 10000; i++) list.Add(new int[] { random.Next(10000), random.Next(10000), random.Next(10000), random.Next(10000) }); array = list.ToArray(); |
SaveExcelFile1()とSaveExcelFile2()の両方で実験してみると両方とも9.2秒です。パソコンの性能にもよりますが、片方が目に見えるほど速いというわけではなさそうです。
それからPythonでも同じように保存にかかる時間を計測してみます。16 * 10000行、まず4列のデータをつくります。
1 2 3 4 5 6 7 8 9 |
import pandas as pd import numpy as np import time rowMax = 16 * 10000 colMax = 4 df = pd.DataFrame(np.arange(rowMax * colMax).reshape(rowMax, colMax)) print ('DataFrame 生成完了') |
ここまで時間はほとんどかかりません。
1 2 3 4 |
start = time.time() # 開始時刻と df.to_excel("out.xlsx", sheet_name="test", index=False, header=False) end = time.time() # 終了時刻から print (end-start) # 処理にかかる時間を計測する |
17.63320779800415と出力されました。pandasではなく別のライブラリを使うと違ってくるかもしれませんが、これならC#とClosedXMLを使ったほうが速そうです。