2015-02-25 1 views
4

J'utilise actuellement le projet EPPlus afin de manipuler certains fichiers .xlsx. L'idée de base est que je dois créer un nouveau fichier à partir d'un modèle donné. Mais lorsque je crée le nouveau fichier à partir d'un modèle, toutes les colonnes calculées dans les tableaux sont foirées.EPPlus avec un modèle ne fonctionne pas comme prévu

Le code J'utilise est le suivant:

static void Main(string[] args) 
{ 
    const string templatePath = "template_worksheet.xlsx"; // the path of the template 
    const string resultPath = "result.xlsx"; // the path of our result 

    using (var pck = new ExcelPackage(new FileInfo(resultPath), new FileInfo(templatePath))) // creating a package with the given template, and our result as the new stream 
    { 
    // note that I am not doing any work ... 
    pck.Save(); // savin our work 
    } 
} 

Par exemple, pour un fichier .xlsx (qui ont une table avec 3 colonnes, la dernière est juste la somme des autres), le programme crée un fichier .xlsx où la dernière colonne a la même valeur (qui n'est correcte que pour la première ligne) dans toutes les lignes.

Les images ci-dessous montre le résultat:

Table in the template Table in the result

Maintenant, les questions sont: Qu'est-ce qui se passe ici? Mon code est-il faux? Comment puis-je accomplir cette tâche sans ce comportement inattendu?

+0

Quelle version de EpPlus utilisez-vous?Cela ressemble à un numéro d'EpPlus et peut-être à être publié dans [la section correspondante du projet] (http://epplus.codeplex.com/workitem/list/basic). – Deilan

+0

J'utilise la version 4.0.3 –

+0

Ouvrez le fichier modèle avec Excel 2007+ et enregistrez-le sous un autre nom de fichier. Ensuite, utilisez le nouveau fichier en utilisant le même flux de travail, que vous avez décrit dans la publication. Est-ce qu'il se reproduit? – Deilan

Répondre

0

Essayez d'utiliser le code suivant. Ce code prend la mise en forme et d'autres règles et les ajoute en tant que nœud XML à un autre fichier. Ernie l'a très bien décrit ici Importing excel file with all the conditional formatting rules to epplus La meilleure partie de la solution est que vous pouvez également importer le formatage avec vos autres règles. Cela devrait vous rapprocher de ce dont vous avez besoin.

//File with your rules, can be your template 
var existingFile = new FileInfo(@"c:\temp\temp.xlsx"); 

//Other file where you want the rules 
var existingFile2 = new FileInfo(@"c:\temp\temp2.xlsx"); 

using (var package = new ExcelPackage(existingFile)) 
using (var package2 = new ExcelPackage(existingFile2)) 
{ 
    //Make sure there are document element for the source 
    var worksheet = package.Workbook.Worksheets.First(); 
    var xdoc = worksheet.WorksheetXml; 

    if (xdoc.DocumentElement == null) 
     return; 

    //Make sure there are document element for the destination 
    var worksheet2 = package2.Workbook.Worksheets.First(); 
    var xdoc2 = worksheet2.WorksheetXml; 

    if (xdoc2.DocumentElement == null) 
     return; 

    //get the extension list node 'extLst' from the ws with the formatting 
    var extensionlistnode = xdoc 
     .DocumentElement 
     .GetElementsByTagName("extLst")[0]; 

    //Create the import node and append it to the end of the xml document 
    var newnode = xdoc2.ImportNode(extensionlistnode, true); 
    xdoc2.LastChild.AppendChild(newnode); 

    package2.Save(); 

} 
} 
1

Surement quelque chose là-bas. J'ai été capable de le reproduire moi-même. Cela a à voir avec la table que vous avez créée. Si vous ouvrez votre fichier et le supprimez à l'aide de l'option «Convertir en plage» dans l'onglet Outils de table, le problème disparaît.

J'ai regardé le code source et il extrait les fichiers xml au niveau du zip et n'a vu aucune indication qu'il était en train de jouer avec eux - semblait être une copie droite.

Très étrange car si nous créons et sauvegardons le fichier xlsx incluant une table de EPPlus le problème n'est pas là. Cela fonctionne très bien:

[TestMethod] 
public void Template_Copy_Test() 
{ 
    //http://stackoverflow.com/questions/28722945/epplus-with-a-template-is-not-working-as-expected 
    const string templatePath = "c:\\temp\\testtemplate.xlsx"; // the path of the template 
    const string resultPath = "c:\\temp\\result.xlsx"; // the path of our result 

    //Throw in some data 
    var dtdata = new DataTable("tblData"); 
    dtdata.Columns.Add(new DataColumn("Col1", typeof(string))); 
    dtdata.Columns.Add(new DataColumn("Col2", typeof(int))); 
    dtdata.Columns.Add(new DataColumn("Col3", typeof(int))); 

    for (var i = 0; i < 20; i++) 
    { 
     var row = dtdata.NewRow(); 
     row["Col1"] = "String Data " + i; 
     row["Col2"] = i * 10; 
     row["Col3"] = i * 100; 
     dtdata.Rows.Add(row); 
    } 

    var templateFile = new FileInfo(templatePath); 
    if (templateFile.Exists) 
     templateFile.Delete(); 

    using (var pck = new ExcelPackage(templateFile)) 
    { 
     var ws = pck.Workbook.Worksheets.Add("Data"); 
     ws.Cells["A1"].LoadFromDataTable(dtdata, true); 

     for (var i = 2; i <= dtdata.Rows.Count + 1; i++) 
      ws.Cells[i, 4].Formula = String.Format("{0}*{1}", ExcelCellBase.GetAddress(i, 2), ExcelCellBase.GetAddress(i, 3)); 

     ws.Tables.Add(ws.Cells[1, 1, dtdata.Rows.Count + 1, 4], "TestTable"); 

     pck.Save(); 
    } 

    using (var pck = new ExcelPackage(new FileInfo(resultPath), templateFile)) // creating a package with the given template, and our result as the new stream 
    { 
     // note that I am not doing any work ... 
     pck.Save(); // savin our work 
    } 
} 

MAIS .....

Si nous ouvrons testtemplate.xlsx, supprimer la table, sauvegarder/fermer le fichier, ouvrez à nouveau, et réintroduisez la même table exacte montre les problèmes lorsque vous exécutez ceci:

[TestMethod] 
public void Template_Copy_Test2() 
{ 
    //http://stackoverflow.com/questions/28722945/epplus-with-a-template-is-not-working-as-expected 
    const string templatePath = "c:\\temp\\testtemplate.xlsx"; // the path of the template 
    const string resultPath = "c:\\temp\\result.xlsx"; // the path of our result 

    var templateFile = new FileInfo(templatePath); 

    using (var pck = new ExcelPackage(new FileInfo(resultPath), templateFile)) // creating a package with the given template, and our result as the new stream 
    { 
     // note that I am not doing any work ... 
     pck.Save(); // savin our work 
    } 
} 

Il doit être quelque chose dans leurs méthodes burried de copie zip mais je ne m'a sauté aux yeux.

Mais au moins, vous pouvez voir à travailler autour de lui.

Ernie

0

Essayez cette

var package = new ExcelPackage(excelFile) 
var excelSheet = package.Workbook.Worksheets[1]; 
for (var i = 1; i < 5; i++){ 
    excelWorkSheet.InsertRow(i, 1, 1); // Use value of i or whatever is suitable for you 
} 
package.Workbook.Calculate(); 

Insertion de nouvelles copies de ligne précédente format de ligne et sa formule si la dernière PRM est réglé sur 1