2017-07-20 1 views
0

La société pour laquelle je travaille exige que son inventaire soit régulièrement exporté vers une feuille Excel. Heureusement, il y a moins de 50 000 articles au total, mais compte tenu de la façon dont j'exporte actuellement, cela prend une quantité absurde de temps. Les éléments sont divisés en trois tables différentes, mais je pense que mon problème vient d'avoir à ouvrir plusieurs connexions par élément pour obtenir des informations telles que la conversion de brandID à brandName, ou de locationID à locationName.Données d'exportation en bloc de trois tableaux dans une feuille Excel

Notez que tout le code est écrit en C#. Voici la méthode actuelle que j'utilise pour lancer l'exportation:

public void exportAllItems() 
    { 
     exportTable = new System.Data.DataTable(); 

     exportTable.Columns.Add("Vendor", typeof(string)); 
     exportTable.Columns.Add("Store_ID", typeof(string)); 
     exportTable.Columns.Add("ItemNumber", typeof(string)); 
     exportTable.Columns.Add("Shipment_Date", typeof(string)); 
     exportTable.Columns.Add("Brand", typeof(string)); 
     exportTable.Columns.Add("Model", typeof(string)); 
     exportTable.Columns.Add("Club_Type", typeof(string)); 
     exportTable.Columns.Add("Shaft", typeof(string)); 
     exportTable.Columns.Add("Number_of_Clubs", typeof(string)); 
     exportTable.Columns.Add("Tradein_Price", typeof(double)); 
     exportTable.Columns.Add("Premium", typeof(double)); 
     exportTable.Columns.Add("WE PAY", typeof(double)); 
     exportTable.Columns.Add("QUANTITY", typeof(int)); 
     exportTable.Columns.Add("Ext'd Price", typeof(double)); 
     exportTable.Columns.Add("RetailPrice", typeof(double)); 
     exportTable.Columns.Add("Comments", typeof(string)); 
     exportTable.Columns.Add("Image", typeof(string)); 
     exportTable.Columns.Add("Club_Spec", typeof(string)); 
     exportTable.Columns.Add("Shaft_Spec", typeof(string)); 
     exportTable.Columns.Add("Shaft_Flex", typeof(string)); 
     exportTable.Columns.Add("Dexterity", typeof(string)); 
     exportTable.Columns.Add("Destination", typeof(string)); 
     exportTable.Columns.Add("Received", typeof(string)); 
     exportTable.Columns.Add("Paid", typeof(string)); 

     exportAllAdd_Clubs(); 
     exportAllAdd_Accessories(); 
     exportAllAdd_Clothing(); 

     DataColumnCollection dcCollection = exportTable.Columns; 

     // Export Data into EXCEL Sheet 
     Application ExcelApp = new Application(); 
     ExcelApp.Application.Workbooks.Add(Type.Missing);   

     for (int i = 1; i < exportTable.Rows.Count + 2; i++) 
     { 
      for (int j = 1; j < exportTable.Columns.Count + 1; j++) 
      { 
       if (i == 1) 
       { 
        ExcelApp.Cells[i, j] = dcCollection[j - 1].ToString(); 
       } 
       else 
        ExcelApp.Cells[i, j] = exportTable.Rows[i - 2][j - 
1].ToString(); 
      } 
     } 
     //Get users profile, downloads folder path, and save to workstation 
     string pathUser = 
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); 
     string pathDownload = Path.Combine(pathUser, "Downloads"); 
     ExcelApp.ActiveWorkbook.SaveCopyAs(pathDownload + "\\TotalInventory- 
" + DateTime.Now.ToString("d MMM yyyy") + ".xlsx"); 
     ExcelApp.ActiveWorkbook.Saved = true; 
     ExcelApp.Quit(); 
    } 

En raison des exigences de l'entreprise, la feuille Excel doit avoir des en-têtes et les mêmes informations que le datatable créé ci-dessus. Après la création du exportTable, j'appelle trois autres méthodes qui traversent chaque table d'éléments. Je vais montrer que l'un d'eux parce qu'ils sont essentiellement les mêmes:

//Puts the clubs in the export table 
    public void exportAllAdd_Clubs() 
    { 
     SqlConnection conn = new SqlConnection(connectionString); 
     SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = conn; 
     cmd.CommandText = "Select * from tbl_clubs"; 
     conn.Open(); 
     SqlDataReader reader = cmd.ExecuteReader(); 
     while (reader.Read()) 
     {    
      exportTable.Rows.Add("", 
(lm.locationName(Convert.ToInt32(reader["locationID"]))).ToString(), 
(Convert.ToInt32(reader["sku"])).ToString(), 
       "", idu.brandType(Convert.ToInt32(reader["brandID"])), 
idu.modelType(Convert.ToInt32(reader["brandID"])), 
reader["clubType"].ToString(), 
       reader["shaft"].ToString(), 
reader["numberOfClubs"].ToString(), 0, Convert.ToDouble(reader["premium"]), 
Convert.ToDouble(reader["cost"]), 
       Convert.ToInt32(reader["quantity"]), 0, 
Convert.ToDouble(reader["price"]), reader["comments"].ToString(), "", 
reader["clubSpec"].ToString(), 
       reader["shaftSpec"].ToString(), 
reader["shaftFlex"].ToString(), reader["dexterity"].ToString(), "", "", ""); 
     } 
     conn.Close(); 
    } 

A l'intérieur de la méthode ci-dessus, je dois faire trois appels à différentes méthodes pour convertir les données en une chaîne significative. Un pour la marque, le modèle et l'emplacement.

Je suis ouvert à toutes sortes d'idées sur la façon d'accélérer ou d'effectuer correctement l'exportation en vrac.

Nous vous remercions de votre temps!

Mise à jour

Après déconner avec EPPlus, mes temps d'exportation prenaient encore beaucoup trop longtemps. Je pense que cela a à voir avec la façon dont je passe chaque rangée dans la base de données et je les exporte un à la fois. Toujours essayer de trouver un moyen de le faire différemment.

+0

puisque vous êtes ouvert aux idées je recommanderais 'EPPlus'. C'est la bibliothèque de .NET pour créer des dossiers d'Excel. N'exige pas l'exécution d'Excel. Peut créer le fichier excel de datatable très facilement. – ClearLogic

+0

EPPLus est disponible sur nuget.voir ma réponse dans ce fil. Contient l'exemple de code pour créer un fichier excel à partir datatable. https://stackoverflow.com/questions/38272314/pasting-html-table-from-clipboard-to-excel-worksheet-with-vb-net-application/38272572#38272572 – ClearLogic

+0

@ClearLogic Merci, je vais certainement regarde dedans – TGills

Répondre

0

je compris quel était le problème:

Au lieu d'avoir une requête géante avec des requêtes de sous, je faisais plusieurs requêtes par élément qui prenait trop de temps. Après m'être souvenu que je pouvais faire des sous-requêtes et mettre en œuvre les changements, le temps d'exportation est passé de plus de 30 minutes à un peu moins de 5 secondes.