/ oleDbCommandを使用してC#のExcelスプレッドシートに行を挿入するより速い方法は? - c#、excel、aspose

oleDbCommandを使用して、C#でExcelスプレッドシートに行を挿入する高速化方法? - c#、excel、aspose

だから私はより速いinsertメソッドを探していますサーバー上のスプレッドシート。今それは使用されているデータによりますが、単一のスプレッドシートに100行を挿入するのに約20秒かかります。なぜなら、スプレッドシートに挿入すると、新しい行が挿入されるたびにExcelが行を移動させるからです。したがって、1つのスプレッドシートに追加する行数が多いほど、時間がかかります。 100枚のスプレッドシートを作成し、それらの上にランダムに1000行のスプレッドシートを挿入したところ、1つのスプレッドシートに同じ1000行を挿入するのに5分以上かかりました。

 string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source={0};Extended Properties="Excel 12.0;HDR=YES"", file);
Aspose.Cells.Workbook wb = new Aspose.Cells.Workbook(fileTemplate);
Aspose.Cells.WorksheetCollection sheets = wb.Worksheets;
Aspose.Cells.Worksheet sheet = wb.Worksheets[0];

wb.Save(file);

combinedCount = 0;
counter = 0;
foreach (DataRowView drv in view)//check each row in our simplified view for ebid
{
if (combinedList[combinedCount][1] == "") //if its empty it goes into brandies sheet
{

sheet.Cells.InsertRow(2);
using (OleDbConnection cn = new OleDbConnection(connectionString))
{
cn.Open();
OleDbCommand cmd1 = new OleDbCommand("INSERT INTO [" + combinedList[combinedCount][0] + "$] " + //"+sheetCnt+"
"([Reporting Retailer EBID],[Outlet BASF ID],[Retailer OT],[Mapped Grower ID],[Mapped Grower],[Ship To Grower],[Bill To Grower],[Transaction ID],[Product ID],[Product Description],[Quantity],[Invoice No],[Previously Sent],[Comments])" +
"VALUES(@value1,@value2,@value3,@value4,@value5,@value6,@value7,@value8,@value9,@value10,@value11,@value12,@value13,@value14)", cn);
cmd1.Parameters.AddWithValue("@value1", drv[0]);//retailer ebid
cmd1.Parameters.AddWithValue("@value2", drv[1]);//outlet basf
cmd1.Parameters.AddWithValue("@value3", drv[13]);//retailer ot
cmd1.Parameters.AddWithValue("@value4", drv[2]);//mapped g id
cmd1.Parameters.AddWithValue("@value5", drv[10]);//mapped g
cmd1.Parameters.AddWithValue("@value6", drv[11]);//ship to g
cmd1.Parameters.AddWithValue("@value7", drv[12]);//bill to g
cmd1.Parameters.AddWithValue("@value8", drv[3]);//trans id
cmd1.Parameters.AddWithValue("@value9", drv[4]);//prod id
cmd1.Parameters.AddWithValue("@value10", drv[5]);//prod desc
cmd1.Parameters.AddWithValue("@value11", drv[6]);//quantity
cmd1.Parameters.AddWithValue("@value12", drv[7]);//invoice no
cmd1.Parameters.AddWithValue("@value13", drv[8]);//prev sent
cmd1.Parameters.AddWithValue("@value14", drv[9]);//comments
cmd1.ExecuteNonQuery();
cn.Close();
}
}
}

回答:

回答№1は0

もしあなたがあるデータからデータをインポートする必要があるならMS Excelワークシートにデータソース(例:DataTable、Arrays、Listなど)を入力するか、ワークシートからデータをエクスポートしてDataTableや配列などを一杯にしてから、関連Aspose.Cells API(効率的)を試して仕事。必要に応じて、Cellsクラスの特定のメソッド(Cells.ImportDataTable、Cells.ExportDataTableなど - 他にも便利なメソッドがあります)を確認してください。さらに、あなたのデータテーブルは他の内容がそれに従ってテーブルの下に移動されるような方法で挿入されるでしょう。

1)データテーブルをワークシートにインポートするためのコード行を参照してください。

//Importing the contents of DataTable to the worksheet starting from "A1" cell,
//where true specifies that the column names of the DataTable would be added to
//the worksheet as a header row
worksheet.Cells.ImportDataTable(dataTable, true, "A1");

2)同様に、DataTableを埋めるためにワークシートからデータをエクスポートする際のサンプルコードセグメントを参照してください。

//Exporting the contents of first 7 rows and 2 columns (A1:B7) starting from 1st cell to DataTable
DataTable dataTable = worksheet.Cells.ExportDataTable(0, 0, 7, 2, true);

私はAsposeで開発者/エバンジェリストとして働いています。


回答№2の場合は0

私はそれをものすごく減らす方法を考え出しました。 前に述べたように、関数への挿入は大きなデータセットを扱うときに混雑を引き起こします。各セルをターゲットにしてputvalue関数を使用してください。例えば:

                combinedCount = 0;
counter = 0;
int testCount = 2;
foreach (DataRowView drv in view)
{
if (combinedCount != 0)//if its the first one, there is nothing to compare it to
{
if (combinedList[combinedCount - 1][0] == combinedList[combinedCount][0])//look at the previous one to check if its the same as the one before it, because we dont want to increment it everytime else it will increment on a different and empty page
{
testCount++;
}
else
{
testCount = 2; //2 is where our first row starts on each page
}
}
else { }
Aspose.Cells.Worksheet sheet = wb.Worksheets[combinedList[combinedCount][0]];
Aspose.Cells.Cell cell1 = sheet.Cells["A" + testCount];
Aspose.Cells.Cell cell2 = sheet.Cells["B" + testCount];
Aspose.Cells.Cell cell3 = sheet.Cells["C" + testCount];
Aspose.Cells.Cell cell4 = sheet.Cells["D" + testCount];
Aspose.Cells.Cell cell5 = sheet.Cells["E" + testCount];
Aspose.Cells.Cell cell6 = sheet.Cells["F" + testCount];
Aspose.Cells.Cell cell7 = sheet.Cells["G" + testCount];
Aspose.Cells.Cell cell14 = sheet.Cells["N" + testCount];
Aspose.Cells.Cell cell15 = sheet.Cells["O" + testCount];
Aspose.Cells.Cell cell16= sheet.Cells["P" + testCount];
Aspose.Cells.Cell cell17 = sheet.Cells["Q" + testCount];
Aspose.Cells.Cell cell18 = sheet.Cells["R" + testCount];
Aspose.Cells.Cell cell19 = sheet.Cells["S" + testCount];
Aspose.Cells.Cell cell20 = sheet.Cells["T" + testCount];

cell1.PutValue(drv[0]);
cell2.PutValue(drv[1]);
cell3.PutValue(drv[13]);
cell4.PutValue(drv[2]);
cell5.PutValue(drv[10]);
cell6.PutValue(drv[11]);
cell7.PutValue(drv[12]);
cell14.PutValue(drv[3]);
cell15.PutValue(drv[4]);
cell16.PutValue(drv[5]);
cell17.PutValue(drv[6]);
cell18.PutValue(drv[7]);
cell19.PutValue(drv[8]);
cell20.PutValue(drv[9]);

}

それは少しずさんなことですが、ポイントを得ることができます。60秒以上は40秒まで安定し、25秒は15まで下がりました。

実行時間が1桁に短縮されたことを私が見つけたもう1つの問題は、保存機能です。 foreachループから保存を削除して外部に保存しましたが、それでも正常に保存されます。