2017-06-26 1 views
0

J'utilise EPPlus et itérer dans toutes les colonnes de chaque feuille de calcul dans un classeur. J'essaye de formater chaque colonne avec un en-tête qui contient le mot "NUMBER" comme format numérique. Il s'exécute et il atteint le point d'arrêt où je définis le format numérique mais, lorsque j'ouvre la feuille de calcul, les colonnes sont toujours formatées en tant que texte. Toute aide serait grandement appréciée.Formulation de colonnes spécifiques à l'aide d'Epplus ne pas enregistrer

private void cleanSpreadSheet(string fileName) 
    { 
     // set all columns with a header of number to numeric type 
     FileInfo existingFile = new FileInfo(fileName); 
     var package = new ExcelPackage(existingFile); 

     ExcelWorkbook wb = package.Workbook; 

     foreach (ExcelWorksheet workSheet in wb.Worksheets) 
     { 
      var start = workSheet.Dimension.Start; 
      var end = workSheet.Dimension.End; 
      for (int col = start.Column; col <= end.Column; col++) 
      { // col by col 
       if (workSheet.Cells[1, col].Text.ToUpper().Contains("NUMBER")) 
       { 
        workSheet.Column(col).Style.Numberformat.Format = "0";       
       } 

      } 
     } 
     package.Save(); 
     package.Dispose(); 
     wb.Dispose(); 
    } 
+0

Si vous devez appeler Dispose sur un objet, qui est une odeur de code. Plus probablement, vous devriez utiliser un [using statement] (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement). – mason

+1

Je crois que ce que vous voulez faire est de définir le type de données de la colonne, pas définir le format. Je crois que EPPlus détermine cela en fonction du type de l'objet que vous définissez la valeur de la ligne égale à. Voir [cette question j'ai demandé] (https://stackoverflow.com/questions/23816043/epplus-date-cell-datatype-not-working) pour un exemple. – mason

+1

Pour développer ce que @mason a dit, si le contenu de la cellule de classeur existant est "Texte", vous devrez probablement faire un int.Parse/double.Parse et remplacer le contenu de la cellule par "Numbers" – sfm

Répondre

1

Le problème peut être que votre classeur Excel existant a des données au format Excel «Texte». Si tel est le cas, vous ne pourrez probablement pas simplement convertir le format de chaque cellule en nombre car Excel ne sait pas comment convertir "Texte" en "Chiffres". Au lieu de cela, vous devrez peut-être parcourir chaque colonne et chaque ligne dans EPPlus et remplacer chaque valeur après les avoir lancées. Le code ci-dessous pourrait utiliser une vérification d'erreur sur les moulages, mais vous donne une idée du concept.

//foreach row ... foreach column... ExcelRange cell = worksheet.Cells[row, col]; cell.Value = double.Parse((string)cell.Value);