2011-06-09 2 views
1

J'ai un code existant qui génère une feuille de calcul à partir d'Excel en utilisant OpenXML. Cela fonctionne bien, mais je dois toujours aller dans la feuille de calcul et ajouter le formatage.le support openXML (C#) génère-t-il des champs numériques formatés (comme 1 000 000)

Y at-il de toute façon dans mon code C# je peux spécifier que je veux une colonne formatée avec un certain nombre de mise en forme), virgules, décimales, etc?

tout lien vers des exemples serait génial.

voici comment je sauve les données maintenant:

public void SetCell<T>(string column, uint rowIndex, T value) 
    { 
     SheetData sheetData = _positionSheet; 
     Cell cell = GetCell(sheetData, column, rowIndex); 
     string stringValue = value == null ? "" : value.ToString(); 
     cell.CellValue = new CellValue(stringValue); 
     switch (typeof(T).Name) 
     { 
      case "Date": 
      case "DateTime": 
       cell.DataType = CellValues.Date; 
       break; 
      case "Int32": 
       cell.DataType = CellValues.Number; 
       break; 
      default: 
       cell.DataType = CellValues.String; 
       break; 
     } 
    } 

ci-dessous est la méthode GetCell() (même si je suppose que c'est pas vraiment pertinent pour la question:

static private Cell GetCell(SheetData sheet, string column, uint rowIndex) 
    { 
     Cell cell; 
     Row row = GetRow(sheet, rowIndex); 
     if (row.Elements<Cell>().Where(c => c.CellReference.Value == column + rowIndex).Any()) 
     { 
      cell = row.Elements<Cell>().Where(c => c.CellReference.Value == column + rowIndex).First(); 
     } 
     else 
     { 
      Cell refCell = null; 
      var comparer = new CellComparer(); 
      foreach (Cell existingCell in row.Elements<Cell>()) 
      { 
       if (comparer.Compare(existingCell.CellReference.Value, column + rowIndex) > 0) 
       { 
        refCell = existingCell; 
        break; 
       } 
      } 

      cell = new Cell { CellReference = column + rowIndex }; 
      row.InsertBefore(cell, refCell); 
     } 
     return cell; 
    } 

Répondre

1

Oui, c'est possible, mais tout est enterré profondément dans les styles. Envisager d'utiliser ClosedXML il a un modèle d'objet similaire à l'ancien bon modèle d'objet Excel et utilise OpenXML sous le capot. Tout est beaucoup plus simple avec ça.

1

Vous pouvez utiliser ExtremeML, il est basé sur OpenXML Si vous l'utilisez, vous pouvez définir un modèle et générer un fichier Excel par le modèle

book1.xlsx est template, book2.x lsx est enfin le fichier. tabb1 est une table dans excel 2007.

  FileStream fs = new FileStream (@"d:\book1.xlsx" , FileMode.Open); 
     FileStream msm = new FileStream (@"d:\book2.xlsx" , FileMode.CreateNew); 

     using (var package = SpreadsheetDocumentWrapper.Open (fs , msm)) { 
      var table = package.WorkbookPart.GetTablePart ("tabb1").Table; 
      var data = new List<object[]> (); 

      for (var i = 0 ; i < 10 ; i++) { 
       data.Add (new object[] { "1" , "2" , "3" , "4" }); 
      } 

      table.Fill (data.ToArray ()); 
     } 

     fs.Close (); 
     msm.Close (); 
Questions connexes