2017-08-11 4 views
0

Mon code fonctionne correctement, à l'exception des numéros. Si l'instruction attrape la valeur double lorsque je débogue. Pourtant je ne peux pas écrire dans un type de données excepté la chaîne à Excel. Si je devais être plus précis, les cellules dans Excel sont correctes mais ce ne sont pas des nombres.Conservation du type de données Lors de l'exportation de DataTable vers Excel avec Open Xml SDK en C#

foreach (System.Data.DataRow dsrow in table.Rows) 
{ 
    DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row(); 
    foreach (String col in columns) 
    { 
     DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell(); 

     if (dsrow[col].GetType() == typeof(Double)) 
     { 
      cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.Number; 

     } 
     else 
     { 
      cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; 
     } 

     cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString()); // 

     newRow.AppendChild(cell); 
    } 

    sheetData.AppendChild(newRow); 
} 
+0

double possible de ([format Office Open XML SDK numéros d'écriture à feuille] https://stackoverflow.com/questions/16607063/office-open-xml -sdk-writing-numbers-to-sheet) – Kyra

+0

Comme on peut le voir dans la réponse à la question que je viens de signaler comme doublon dans le cas des nombres, mettez d'abord la valeur dans, puis changez le type de données. Sinon, vous en faites encore une chaîne, par la méthode 'ToString' – Kyra

Répondre

0

J'ai eu des problèmes avec le même problème. Il semble que le problème apparaisse si vous utilisez une locale avec une virgule comme séparateur décimal. Dans le XML, il devrait être au format américain.

Ainsi spécifiant CutureInfo en ToString a fonctionné pour moi:

var dataRow = new Row(); 
var cell = new Cell(); 
cell.CellValue = new CellValue(1.234.ToString(new CultureInfo("en-US"))); 
cell.DataType = CellValues.Number; 
dataRow.AppendChild(cell); 
sheetData.AppendChild(dataRow);