3 votes

EPPlus - Erreur lors de la copie de la feuille de calcul avec une mise en forme conditionnelle

Je suis en train d'utiliser EPPlus 4.1, dernière version stable (J'ai également essayé la version 4.5.0.1-beta avec le même résultat).

Je cherche à fusionner plusieurs fichiers Excel (créés à l'aide d'EPPlus) en un seul fichier Excel avec plusieurs feuilles de calcul. Certaines feuilles de calcul peuvent contenir une mise en forme conditionnelle, que j'ai définie comme ci-dessous :

'Utilisation de columnCells en tant qu'ExcelRange = workSheetData.Cells(headerLevels + 2, c + 1, workSheetData.Dimension.End.Row + 1, c + 1) 'headerLevels + 2
'    Dim cond1 = columnCells.ConditionalFormatting.AddGreaterThan()
'    cond1.Formula = "0.0"
'    cond1.Style.Fill.BackgroundColor.Color = ColorTranslator.FromHtml("#CBDEB7") 'vert clair

'    Dim cond2 = columnCells.ConditionalFormatting.AddLessThan()
'    cond2.Formula = "0.0"
'    cond2.Style.Fill.BackgroundColor.Color = ColorTranslator.FromHtml("#F1CDB1") 'rouge clair
'End Using

Dim cfAddress As New ExcelAddress(headerLevels + 2, c + 1, workSheetData.Dimension.End.Row + 1, c + 1)
Dim cfRule1 = workSheetData.ConditionalFormatting.AddGreaterThan(cfAddress)
cfRule1.Formula = "0.0"
cfRule1.Style.Fill.BackgroundColor.Color = ColorTranslator.FromHtml("#CBDEB7") 'vert clair

Dim cfRule2 = workSheetData.ConditionalFormatting.AddLessThan(cfAddress)
cfRule2.Formula = "0.0"
cfRule2.Style.Fill.BackgroundColor.Color = ColorTranslator.FromHtml("#F1CDB1") 'rouge clair

Les deux façons produisent le même résultat et fonctionnent bien pour les fichiers sources.

Ensuite, je fusionne ces fichiers en copiant les feuilles de calcul dans un nouveau fichier comme ci-dessous

Dim fileInfoMaster As New System.IO.FileInfo(filePath)
Using _pckMaster As New ExcelPackage(fileInfoMaster)

    For i As Integer = 0 To masterWorkbookParams.ListOfFileNames.Count() - 1
        filePath = folderPath & masterWorkbookParams.ListOfFileNames(i) & ".xlsx"
        If System.IO.File.Exists(filePath) Then
            Dim fileInfo As New System.IO.FileInfo(filePath)
            Using _pck As New ExcelPackage(fileInfo)

                Dim NewWorksheet As ExcelWorksheet = _pckMaster.Workbook.Worksheets.Add(masterWorkbookParams.ListOfSheetNames(i), _pck.Workbook.Worksheets(1))

            End Using
        End If
    Next i

    _pckMaster.Save()
End Using

La ligne _pckMaster.Save() produit une erreur. Lorsque j'ai inspecté dans le débogueur la feuille de calcul du fichier source et la feuille de calcul du fichier de destination avant que cette ligne ne soit exécutée, j'ai vu l'image suivante :

Fichier source :

capture d'écran

Fichier de destination :

capture d'écran

Le nœud ConditionalFormatting dans la feuille de calcul a une exception après avoir ajouté une copie dans le nouveau fichier. Si le fichier source n'a aucune mise en forme conditionnelle, ajouter une copie d'une feuille de calcul d'un classeur à un nouveau classeur et enregistrer ce fichier fonctionne comme prévu.

Quelqu'un a-t-il rencontré le même problème? S'agit-il d'un bug? ou est-ce que je fais quelque chose de mal ici?

ConditionalFormatting '(New System.Linq.SystemCore_EnumerableDebugView(Of OfficeOpenXml.ExcelWorksheet)(_pckMaster.Workbook.Worksheets).Items(1)).ConditionalFormatting' a lancé une exception de type 'System.ArgumentOutOfRangeException' OfficeOpenXml.ConditionalFormatting.ExcelConditionalFormattingCollection {System.ArgumentOutOfRangeException}

StackTrace

  • System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
  • OfficeOpenXml.ConditionalFormatting.ExcelConditionalFormattingRule..ctor(eExcelConditionalFormattingRuleType type, ExcelAddress address, Int32 priority, ExcelWorksheet worksheet, XmlNode itemElementNode, XmlNamespaceManager namespaceManager)
  • OfficeOpenXml.ConditionalFormatting.ExcelConditionalFormattingGreaterThan..ctor(ExcelAddress address, Int32 priority, ExcelWorksheet worksheet, XmlNode itemElementNode, XmlNamespaceManager namespaceManager)
  • OfficeOpenXml.ConditionalFormatting.ExcelConditionalFormattingRuleFactory.Create(eExcelConditionalFormattingRuleType type, ExcelAddress address, Int32 priority, ExcelWorksheet worksheet, XmlNode itemElementNode)
  • OfficeOpenXml.ConditionalFormatting.ExcelConditionalFormattingCollection..ctor(ExcelWorksheet worksheet)
  • OfficeOpenXml.ExcelWorksheet.get_ConditionalFormatting()

0voto

J. Metcoff Points 11

Pour ceux qui sont intéressés, j'ai créé une correction pour cela dans la dernière version d'EPPlus. Voir le problème n°464 sur Github. Également mentionné comme problème n°266.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X