/ / Szybszy sposób wstawiania wierszy do arkusza kalkulacyjnego Excel w języku C # przy użyciu polecenia oleDbCommand? - c #, excel, aspose

Szybszy sposób wstawiania wierszy do arkusza kalkulacyjnego Excel w języku C # przy użyciu polecenia oleDbCommand? - c #, excel, aspose

Tak więc szukam szybszej metody wstawiania doarkusze kalkulacyjne na serwerze. Obecnie zależy to od używanych danych, ale zajmuje około 20 sekund, aby wstawić 100 wierszy do jednego arkusza kalkulacyjnego. Rozumiem, dlaczego to robi, ponieważ wstawienie do arkusza kalkulacyjnego powoduje, że Excela przesuwa wiersze za każdym razem, gdy wstawiany jest nowy wiersz, więc im więcej wierszy zostanie dodanych do pojedynczego arkusza kalkulacyjnego, tym dłużej to zajmie. było poprawne, stworzyłem około 100 arkuszy kalkulacyjnych i losowo wstawiłem 1000 wierszy rozmieszczonych na nich wszystkich.To zajęło około 60 sekund.Korzystanie z tych samych 1000 wierszy do jednego arkusza kalkulacyjnego zajęło ponad 5 minut. Oto mój kod poniżej:

 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();
}
}
}

Odpowiedzi:

0 dla odpowiedzi № 1

Cóż, jeśli chcesz zaimportować dane z niektórych danychźródło danych (np. DataTable, Array, List, itd.) w arkuszu MS Excel lub wyeksportuj dane z arkusza roboczego, aby wypełnić tabelę danych lub tablicę itp. za jednym razem, możesz wypróbować odpowiednie interfejsy API Aspose.Cells (które są wydajne) dla zadanie. Powinieneś sprawdzić konkretne metody klasy Komórki (np. Cells.ImportDataTable, Cells.ExportDataTable itd. - są też inne przydatne metody) dla twoich wymagań. Co więcej, twój datatable zostałby wstawiony w taki sposób, że inne treści byłyby odpowiednio przesunięte pod tabelą.

1) Zobacz wiersz kodu do importowania tabeli danych do arkusza roboczego:

//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) Podobnie patrz przykładowy segment kodu przy eksportowaniu danych z arkusza roboczego w celu wypełnienia 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);

Pracuję jako programista / ewangelista w Aspose.


0 dla odpowiedzi nr 2

Zorientowałem się, jak bardzo go zmniejszyć. Jak już wcześniej wspomniałem, wstawienie do funkcji powoduje przeciążenie w przypadku dużych zbiorów danych. Więc celuj w każdą komórkę i użyj funkcji putvalue. Na przykład:

                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]);

}

Jest trochę niechlujny, ale masz rację: 60+ sekund spadło do solidnych 40 sekund, 25 sekund spadło do 15. Choć wciąż nie błyskawica, wkładanie do arkusza kalkulacyjnego nigdy nie będzie super szybkie.

Kolejną kwestią, którą znalazłem, która trwała do pojedynczych cyfr, jest funkcja zapisu. Usunąłem zapis z pętli foreach i odłożyłem go na zewnątrz, nadal zachowuje się poprawnie.