2010-01-06 4 views
2

J'utilise la bibliothèque OpenXML pour prendre une date et la coller dans un fichier Excel préformaté. Cela fonctionne bien. Le problème que j'ai est qu'il y a une ligne de sous-total en haut du fichier Excel pré-formaté, qui est définie pour sous-totaliser chaque colonne de ces données (il y a donc un sous-total en haut de chaque colonne). Lorsque j'ouvre le fichier Excel après sa création, ces valeurs sont toutes mises à 0, elles n'ont pas été mises à jour lors de l'insertion du datatable. Si vous mettez en surbrillance l'une de ces cellules de sous-total, puis appuyez sur Entrée, elle se met à jour et affiche la bonne valeur.Mise à jour des sous-totaux dans les fichiers Excel

Quel est le moyen le plus simple de mettre à jour ces valeurs et d'afficher la valeur correcte dès que l'utilisateur ouvre la feuille de calcul téléchargée?

code pour créer la feuille de calcul:

MemoryStream memoryStream = SpreadsheetReader.StreamFromFile(TemplateDirectory + @"\" + "exceltTemplate.xlsx"); 
doc = SpreadsheetDocument.Open(memoryStream, true); 
worksheetPart = SpreadsheetReader.GetWorksheetPartByName(doc, currentSheetName); 
writer = new WorksheetWriter(doc, worksheetPart); 
cellName = "A8"; 
writer.PasteDataTable(reports.Tables[0], cellName); 
SpreadsheetWriter.Save(doc); 

Répondre

5

La bibliothèque OpenXML ne recalcule pas les résultats des formules. Une façon de résoudre ce problème consiste à supprimer les valeurs (et non les formules) de vos cellules de sous-total. Cela oblige Excel à effectuer un recalcul automatique.

This link l'explique plus en détail. Vers le milieu de la page, vous verrez le code suivant, qui est le bit qui est important pour vos besoins:

// remove all values of cells with formulas on a sheet 
// so that Excel refreshes them upon Open 
public static void ClearAllValuesInSheet 
     (SpreadsheetDocument spreadSheet, string sheetName) 
{ 
    WorksheetPart worksheetPart = 
     GetWorksheetPartByName(spreadSheet, sheetName); 

    foreach (Row row in 
     worksheetPart.Worksheet. 
      GetFirstChild().Elements()) 
    { 
    foreach (Cell cell in row.Elements()) 
    { 
     if (cell.CellFormula != null && 
       cell.CellValue != null) 
     { 
     cell.CellValue.Remove(); 
     } 
    } 

    } 

    worksheetPart.Worksheet.Save(); 
} 

Ce code supprime les valeurs de toutes les cellules qui contiennent des formules et des valeurs. Pour l'accélérer, vous pouvez le personnaliser assez facilement pour faire face à vos cellules de sous-total.

+0

Merci, ça y est. –

Questions connexes