Je cherche donc une méthode d'insertion plus rapide dans des tableurs sur un serveur. À l'heure actuelle, cela dépend des données utilisées, mais il faut environ 20 secondes pour insérer 100 lignes dans une seule feuille de calcul. Je comprends pourquoi c'est le cas, car l'insertion dans une feuille de calcul entraîne Excel à déplacer les lignes chaque fois qu'une nouvelle ligne est insérée. Ainsi, plus il y a de lignes ajoutées à une feuille de calcul, plus cela prendra de temps. J'ai testé cette théorie et c'était correct, j'ai créé environ 100 feuilles de calcul et inséré aléatoirement 1000 lignes réparties entre eux. Cela a pris environ 60 secondes pour terminer. L'insertion des mêmes 1000 lignes dans une seule feuille de calcul prenait plus de 5 minutes à compléter. Voici mon code ci-dessous:Une méthode plus rapide pour insérer des lignes dans une feuille de calcul Excel en C# en utilisant oleDbCommand?
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();
}
}
}
Copie possible de [Quel est le moyen le plus rapide d'insérer 100 000 enregistrements dans un fichier MDB en C#] (https://stackoverflow.com/questions/21850137/what-is-the-fastest-way-to-insert -100-000-enregistrements-en-un-mdb-fichier-en-c-sharp) –
N'a pas fait cela depuis un certain temps, mais je me souviens que le moyen le plus rapide que j'ai trouvé pour obtenir beaucoup de données dans Excel rapidement, était pour mettre en place une table de données dans une feuille contenant toutes les données, puis utiliser le tableau croisé dynamique dans d'autres feuilles pour extraire les données que je voulais. Cela a pris quelques secondes plutôt que des minutes –
@JonathanWillcock Mon problème n'est pas avec les feuilles. Existe-t-il un moyen de spécifier la «prochaine rangée» dans un sens? Je cherchais à INSERT INTO ["+ combinedList [combinedCount] [0] +" $ a5: g] ou quelque chose comme ça – triswill227