From 2cd6df6481837fbe35552811cc512be0be683bb9 Mon Sep 17 00:00:00 2001 From: Thom Lamb Date: Tue, 23 Jun 2026 11:02:53 -0500 Subject: [PATCH] Initial commit of the ClosedXML library Establishes the foundational structure, core Excel functionality, and tooling. - Implements base components for cells, ranges, columns, and rows. - Integrates a custom calculation engine with a wide range of Excel functions. - Adds comprehensive support for styling, conditional formatting, data validation, comments, pictures, and charts. - Configures build setup, project metadata (NuGet), and developer guidelines. - Includes editor and Git attributes for consistent code style and line endings. --- .editorconfig | 14 + .gitattributes | 21 + .gitignore | 418 +- CONTRIBUTING.md | 47 + .../Examples/Created/AddingComments.xlsx | Bin 0 -> 30847 bytes .../Examples/Created/AddingDataSet.xlsx | Bin 0 -> 10679 bytes .../Created/AddingDataTableAsWorksheet.xlsx | Bin 0 -> 7372 bytes .../Examples/Created/AddingRowToTables.xlsx | Bin 0 -> 7785 bytes .../Examples/Created/AdjustToContents.xlsx | Bin 0 -> 12823 bytes .../AdjustToContentsWithAutoFilter.xlsx | Bin 0 -> 6415 bytes .../Examples/Created/AutoFilter.xlsx | Bin 0 -> 6357 bytes .../Examples/Created/BasicTable.xlsx | Bin 0 -> 6985 bytes .../Examples/Created/BasicTable_Modified.xlsx | Bin 0 -> 7103 bytes .../Examples/Created/BlankCells.xlsx | Bin 0 -> 6170 bytes .../Examples/Created/CellMoves.xlsx | Bin 0 -> 8010 bytes .../Examples/Created/CellValues.xlsx | Bin 0 -> 7569 bytes .../Examples/Created/ClearingRanges.xlsx | Bin 0 -> 6879 bytes .../Examples/Created/Collections.xlsx | Bin 0 -> 7012 bytes .../Examples/Created/ColumnCells.xlsx | Bin 0 -> 6398 bytes .../Examples/Created/ColumnCollection.xlsx | Bin 0 -> 7376 bytes .../Examples/Created/ColumnSettings.xlsx | Bin 0 -> 6334 bytes .../Examples/Created/CopyingRanges.xlsx | Bin 0 -> 7850 bytes .../Created/CopyingRowsAndColumns.xlsx | Bin 0 -> 9631 bytes .../Examples/Created/CopyingWorksheets.xlsx | Bin 0 -> 13351 bytes .../Examples/Created/DataTypes.xlsx | Bin 0 -> 7431 bytes .../DataTypesUnderDifferentCulture.xlsx | Bin 0 -> 7425 bytes .../Examples/Created/DataValidation.xlsx | Bin 0 -> 12809 bytes .../Examples/Created/DefaultStyles.xlsx | Bin 0 -> 7411 bytes .../Examples/Created/DefiningRanges.xlsx | Bin 0 -> 6431 bytes .../Examples/Created/DeletingColumns.xlsx | Bin 0 -> 6298 bytes .../Examples/Created/DeletingRanges.xlsx | Bin 0 -> 6374 bytes .../Examples/Created/Formulas.xlsx | Bin 0 -> 7304 bytes .../Examples/Created/FreezePanes.xlsx | Bin 0 -> 8334 bytes .../Examples/Created/HeaderFooters.xlsx | Bin 0 -> 6383 bytes .../Examples/Created/HelloWorld.xlsx | Bin 0 -> 6241 bytes .../Examples/Created/HideSheets.xlsx | Bin 0 -> 8602 bytes .../Examples/Created/HideUnhide.xlsx | Bin 0 -> 6287 bytes .../Examples/Created/Hyperlinks.xlsx | Bin 0 -> 8190 bytes .../Examples/Created/InsertColumns.xlsx | Bin 0 -> 6647 bytes .../Examples/Created/InsertRows.xlsx | Bin 0 -> 6666 bytes .../Examples/Created/InsertingData.xlsx | Bin 0 -> 7267 bytes .../Created/InsertingDeletingColumns.xlsx | Bin 0 -> 6347 bytes .../Created/InsertingDeletingRows.xlsx | Bin 0 -> 6295 bytes .../Examples/Created/InsertingTables.xlsx | Bin 0 -> 9727 bytes .../Examples/Created/LambdaExpressions.xlsx | Bin 0 -> 6928 bytes .../Examples/Created/Margins.xlsx | Bin 0 -> 6179 bytes .../Examples/Created/MergedCells.xlsx | Bin 0 -> 6477 bytes .../Examples/Created/MergedMoves.xlsx | Bin 0 -> 6457 bytes .../Examples/Created/MultipleRanges.xlsx | Bin 0 -> 6370 bytes .../Examples/Created/MultipleSheets.xlsx | Bin 0 -> 7974 bytes .../Examples/Created/NamedRanges.xlsx | Bin 0 -> 7667 bytes .../Examples/Created/Outline.xlsx | Bin 0 -> 6310 bytes ClosedXML.Examples/Examples/Created/Page.xlsx | Bin 0 -> 6857 bytes .../Examples/Created/PivotTables.xlsx | Bin 0 -> 43688 bytes .../Examples/Created/ResizingTables.xlsx | Bin 0 -> 13641 bytes .../Examples/Created/RightToLeft.xlsx | Bin 0 -> 6276 bytes .../Examples/Created/RowCells.xlsx | Bin 0 -> 6383 bytes .../Examples/Created/RowCollection.xlsx | Bin 0 -> 7178 bytes .../Examples/Created/RowSettings.xlsx | Bin 0 -> 6284 bytes .../Examples/Created/SheetProtection.xlsx | Bin 0 -> 7267 bytes .../Examples/Created/SheetTab.xlsx | Bin 0 -> 6245 bytes .../Examples/Created/SheetViews.xlsx | Bin 0 -> 10269 bytes .../Examples/Created/Sheets.xlsx | Bin 0 -> 6918 bytes .../Examples/Created/ShiftingFormulas.xlsx | Bin 0 -> 7636 bytes .../Examples/Created/ShiftingRanges.xlsx | Bin 0 -> 7049 bytes .../Examples/Created/ShowCase.xlsx | Bin 0 -> 8171 bytes .../Examples/Created/SortExample.xlsx | Bin 0 -> 12583 bytes .../Examples/Created/Sorting.xlsx | Bin 0 -> 20566 bytes .../Examples/Created/StyleRowsColumns.xlsx | Bin 0 -> 6557 bytes .../Examples/Created/StyleWorksheet.xlsx | Bin 0 -> 6475 bytes .../Examples/Created/TabColors.xlsx | Bin 0 -> 8042 bytes .../Examples/Created/TransposeRanges.xlsx | Bin 0 -> 7199 bytes .../Examples/Created/TransposeRangesPlus.xlsx | Bin 0 -> 6943 bytes .../Examples/Created/TwoPages.xlsx | Bin 0 -> 11635 bytes .../Examples/Created/UsingColors.xlsx | Bin 0 -> 6837 bytes .../Examples/Created/UsingPhonetics.xlsx | Bin 0 -> 6414 bytes .../Examples/Created/UsingRichText.xlsx | Bin 0 -> 6651 bytes .../Examples/Created/UsingTables.xlsx | Bin 0 -> 9299 bytes .../Examples/Created/WorkbookProperties.xlsx | Bin 0 -> 7082 bytes .../Examples/Created/styleAlignment.xlsx | Bin 0 -> 6578 bytes .../Examples/Created/styleBorder.xlsx | Bin 0 -> 6614 bytes .../Examples/Created/styleFill.xlsx | Bin 0 -> 6414 bytes .../Examples/Created/styleFont.xlsx | Bin 0 -> 6806 bytes .../Created/styleIncludeQuotePrefix.xlsx | Bin 0 -> 7063 bytes .../Examples/Created/styleNumberFormat.xlsx | Bin 0 -> 6407 bytes .../Examples/Modified/AddingComments.xlsx | Bin 0 -> 30856 bytes .../Examples/Modified/AddingDataSet.xlsx | Bin 0 -> 10679 bytes .../Modified/AddingDataTableAsWorksheet.xlsx | Bin 0 -> 7372 bytes .../Examples/Modified/AddingRowToTables.xlsx | Bin 0 -> 7785 bytes .../Examples/Modified/AdjustToContents.xlsx | Bin 0 -> 12823 bytes .../AdjustToContentsWithAutoFilter.xlsx | Bin 0 -> 6425 bytes .../Examples/Modified/AutoFilter.xlsx | Bin 0 -> 6367 bytes .../Examples/Modified/BasicTable.xlsx | Bin 0 -> 6985 bytes .../Modified/BasicTable_Modified.xlsx | Bin 0 -> 7103 bytes .../Examples/Modified/BlankCells.xlsx | Bin 0 -> 6170 bytes .../Examples/Modified/CellMoves.xlsx | Bin 0 -> 8010 bytes .../Examples/Modified/CellValues.xlsx | Bin 0 -> 7569 bytes .../Examples/Modified/ClearingRanges.xlsx | Bin 0 -> 6879 bytes .../Examples/Modified/Collections.xlsx | Bin 0 -> 7012 bytes .../Examples/Modified/ColumnCells.xlsx | Bin 0 -> 6398 bytes .../Examples/Modified/ColumnCollection.xlsx | Bin 0 -> 7376 bytes .../Examples/Modified/ColumnSettings.xlsx | Bin 0 -> 6334 bytes .../Examples/Modified/CopyingRanges.xlsx | Bin 0 -> 7850 bytes .../Modified/CopyingRowsAndColumns.xlsx | Bin 0 -> 9631 bytes .../Examples/Modified/CopyingWorksheets.xlsx | Bin 0 -> 13351 bytes .../Examples/Modified/DataTypes.xlsx | Bin 0 -> 7431 bytes .../DataTypesUnderDifferentCulture.xlsx | Bin 0 -> 7425 bytes .../Examples/Modified/DataValidation.xlsx | Bin 0 -> 12809 bytes .../Examples/Modified/DefaultStyles.xlsx | Bin 0 -> 7411 bytes .../Examples/Modified/DefiningRanges.xlsx | Bin 0 -> 6431 bytes .../Examples/Modified/DeletingColumns.xlsx | Bin 0 -> 6298 bytes .../Examples/Modified/DeletingRanges.xlsx | Bin 0 -> 6374 bytes .../Examples/Modified/Formulas.xlsx | Bin 0 -> 7304 bytes .../Examples/Modified/FreezePanes.xlsx | Bin 0 -> 8334 bytes .../Examples/Modified/HeaderFooters.xlsx | Bin 0 -> 6383 bytes .../Examples/Modified/HelloWorld.xlsx | Bin 0 -> 6241 bytes .../Examples/Modified/HideSheets.xlsx | Bin 0 -> 8602 bytes .../Examples/Modified/HideUnhide.xlsx | Bin 0 -> 6287 bytes .../Examples/Modified/Hyperlinks.xlsx | Bin 0 -> 8188 bytes .../Examples/Modified/InsertColumns.xlsx | Bin 0 -> 6652 bytes .../Examples/Modified/InsertRows.xlsx | Bin 0 -> 6672 bytes .../Examples/Modified/InsertingData.xlsx | Bin 0 -> 7267 bytes .../Modified/InsertingDeletingColumns.xlsx | Bin 0 -> 6347 bytes .../Modified/InsertingDeletingRows.xlsx | Bin 0 -> 6295 bytes .../Examples/Modified/InsertingTables.xlsx | Bin 0 -> 9727 bytes .../Examples/Modified/LambdaExpressions.xlsx | Bin 0 -> 6928 bytes .../Examples/Modified/Margins.xlsx | Bin 0 -> 6179 bytes .../Examples/Modified/MergedCells.xlsx | Bin 0 -> 6477 bytes .../Examples/Modified/MergedMoves.xlsx | Bin 0 -> 6457 bytes .../Examples/Modified/MultipleRanges.xlsx | Bin 0 -> 6370 bytes .../Examples/Modified/MultipleSheets.xlsx | Bin 0 -> 7975 bytes .../Examples/Modified/NamedRanges.xlsx | Bin 0 -> 7667 bytes .../Examples/Modified/Outline.xlsx | Bin 0 -> 6310 bytes .../Examples/Modified/Page.xlsx | Bin 0 -> 6857 bytes .../Examples/Modified/PivotTables.xlsx | Bin 0 -> 43713 bytes .../Examples/Modified/ResizingTables.xlsx | Bin 0 -> 13641 bytes .../Examples/Modified/RightToLeft.xlsx | Bin 0 -> 6276 bytes .../Examples/Modified/RowCells.xlsx | Bin 0 -> 6391 bytes .../Examples/Modified/RowCollection.xlsx | Bin 0 -> 7178 bytes .../Examples/Modified/RowSettings.xlsx | Bin 0 -> 6284 bytes .../Examples/Modified/SheetProtection.xlsx | Bin 0 -> 7267 bytes .../Examples/Modified/SheetTab.xlsx | Bin 0 -> 6245 bytes .../Examples/Modified/SheetViews.xlsx | Bin 0 -> 10269 bytes .../Examples/Modified/Sheets.xlsx | Bin 0 -> 6918 bytes .../Examples/Modified/ShiftingFormulas.xlsx | Bin 0 -> 7636 bytes .../Examples/Modified/ShiftingRanges.xlsx | Bin 0 -> 7049 bytes .../Examples/Modified/ShowCase.xlsx | Bin 0 -> 8171 bytes .../Examples/Modified/SortExample.xlsx | Bin 0 -> 12583 bytes .../Examples/Modified/Sorting.xlsx | Bin 0 -> 20566 bytes .../Examples/Modified/StyleRowsColumns.xlsx | Bin 0 -> 6556 bytes .../Examples/Modified/StyleWorksheet.xlsx | Bin 0 -> 6482 bytes .../Examples/Modified/TabColors.xlsx | Bin 0 -> 8042 bytes .../Examples/Modified/TransposeRanges.xlsx | Bin 0 -> 7199 bytes .../Modified/TransposeRangesPlus.xlsx | Bin 0 -> 6943 bytes .../Examples/Modified/TwoPages.xlsx | Bin 0 -> 11635 bytes .../Examples/Modified/UsingColors.xlsx | Bin 0 -> 6837 bytes .../Examples/Modified/UsingPhonetics.xlsx | Bin 0 -> 6414 bytes .../Examples/Modified/UsingRichText.xlsx | Bin 0 -> 6660 bytes .../Examples/Modified/UsingTables.xlsx | Bin 0 -> 9299 bytes .../Examples/Modified/WorkbookProperties.xlsx | Bin 0 -> 7082 bytes .../Examples/Modified/styleAlignment.xlsx | Bin 0 -> 6578 bytes .../Examples/Modified/styleBorder.xlsx | Bin 0 -> 6614 bytes .../Examples/Modified/styleFill.xlsx | Bin 0 -> 6414 bytes .../Examples/Modified/styleFont.xlsx | Bin 0 -> 6806 bytes .../Modified/styleIncludeQuotePrefix.xlsx | Bin 0 -> 7063 bytes .../Examples/Modified/styleNumberFormat.xlsx | Bin 0 -> 6407 bytes ClosedXML.sln | 67 + ClosedXML/Attributes/XLColumnAttribute.cs | 42 + ClosedXML/ClosedXML.csproj | 91 + ClosedXML/ClosedXML.nuspec | 27 + ClosedXML/ClosedXML.snk | Bin 0 -> 596 bytes ClosedXML/Excel/AutoFilters/IXLAutoFilter.cs | 35 + .../AutoFilters/IXLCustomFilteredColumn.cs | 19 + .../Excel/AutoFilters/IXLFilterColumn.cs | 72 + .../Excel/AutoFilters/IXLFilterConnector.cs | 10 + .../Excel/AutoFilters/IXLFilteredColumn.cs | 8 + ClosedXML/Excel/AutoFilters/XLAutoFilter.cs | 179 + .../AutoFilters/XLCustomFilteredColumn.cs | 141 + .../XLDateTimeGroupFilteredColumn.cs | 57 + ClosedXML/Excel/AutoFilters/XLFilter.cs | 23 + ClosedXML/Excel/AutoFilters/XLFilterColumn.cs | 432 ++ .../Excel/AutoFilters/XLFilterConnector.cs | 33 + .../Excel/AutoFilters/XLFilteredColumn.cs | 57 + ClosedXML/Excel/Caching/IXLRepository.cs | 31 + .../Excel/Caching/XLAlignmentRepository.cs | 22 + ClosedXML/Excel/Caching/XLBorderRepository.cs | 22 + ClosedXML/Excel/Caching/XLColorRepository.cs | 22 + ClosedXML/Excel/Caching/XLFillRepository.cs | 22 + ClosedXML/Excel/Caching/XLFontRepository.cs | 22 + .../Excel/Caching/XLNumberFormatRepository.cs | 22 + .../Excel/Caching/XLProtectionRepository.cs | 22 + ClosedXML/Excel/Caching/XLRangeRepository.cs | 16 + ClosedXML/Excel/Caching/XLRepositoryBase.cs | 137 + ClosedXML/Excel/Caching/XLStyleRepository.cs | 22 + .../XLWorkbookElementRepositoryBase.cs | 26 + ClosedXML/Excel/CalcEngine/CalcEngine.cs | 844 +++ .../Excel/CalcEngine/CalcEngineHelpers.cs | 145 + .../Excel/CalcEngine/CellRangeReference.cs | 69 + .../Exceptions/CalcEngineException.cs | 18 + .../Exceptions/CellReferenceException.cs | 27 + .../Exceptions/CellValueException.cs | 26 + .../Exceptions/DivisionByZeroException.cs | 26 + .../Exceptions/NameNotRecognizedException.cs | 27 + .../Exceptions/NoValueAvailableException.cs | 27 + .../Exceptions/NullValueException.cs | 27 + .../CalcEngine/Exceptions/NumberException.cs | 27 + ClosedXML/Excel/CalcEngine/Expression.cs | 603 ++ ClosedXML/Excel/CalcEngine/ExpressionCache.cs | 71 + .../CalcEngine/ExpressionParseException.cs | 21 + .../Excel/CalcEngine/FunctionDefinition.cs | 24 + .../Excel/CalcEngine/Functions/Database.cs | 36 + .../Excel/CalcEngine/Functions/DateAndTime.cs | 408 ++ .../Excel/CalcEngine/Functions/Engineering.cs | 63 + .../Excel/CalcEngine/Functions/Financial.cs | 64 + .../Excel/CalcEngine/Functions/Information.cs | 216 + .../Excel/CalcEngine/Functions/Logical.cs | 82 + .../Excel/CalcEngine/Functions/Lookup.cs | 266 + .../Excel/CalcEngine/Functions/MathTrig.cs | 1095 +++ .../Excel/CalcEngine/Functions/Statistical.cs | 276 + ClosedXML/Excel/CalcEngine/Functions/Tally.cs | 239 + ClosedXML/Excel/CalcEngine/Functions/Text.cs | 479 ++ .../Excel/CalcEngine/Functions/XLMath.cs | 186 + .../Excel/CalcEngine/Functions/XLMatrix.cs | 594 ++ ClosedXML/Excel/CalcEngine/Token.cs | 53 + .../Excel/CalcEngine/XLAddressComparer.cs | 38 + ClosedXML/Excel/CalcEngine/XLCalcEngine.cs | 137 + .../CalcEngine/XLRangeAddressComparer.cs | 31 + ClosedXML/Excel/Cells/IXLCell.cs | 400 ++ ClosedXML/Excel/Cells/IXLCells.cs | 65 + ClosedXML/Excel/Cells/XLCell.cs | 3152 ++++++++ ClosedXML/Excel/Cells/XLCellCopyOptions.cs | 16 + ClosedXML/Excel/Cells/XLCells.cs | 276 + ClosedXML/Excel/Cells/XLCellsCollection.cs | 421 ++ ClosedXML/Excel/Charts/IXLChart.cs | 90 + ClosedXML/Excel/Charts/IXLCharts.cs | 9 + ClosedXML/Excel/Charts/XLChart.cs | 161 + ClosedXML/Excel/Charts/XLCharts.cs | 23 + ClosedXML/Excel/Columns/IXLColumn.cs | 197 + ClosedXML/Excel/Columns/IXLColumns.cs | 129 + ClosedXML/Excel/Columns/XLColumn.cs | 666 ++ ClosedXML/Excel/Columns/XLColumnCollection.cs | 118 + ClosedXML/Excel/Columns/XLColumns.cs | 282 + ClosedXML/Excel/Comments/IXLComment.cs | 26 + ClosedXML/Excel/Comments/XLComment.cs | 202 + .../ConditionalFormats/IXLCFColorScaleMax.cs | 14 + .../ConditionalFormats/IXLCFColorScaleMid.cs | 16 + .../ConditionalFormats/IXLCFColorScaleMin.cs | 15 + .../ConditionalFormats/IXLCFDataBarMax.cs | 14 + .../ConditionalFormats/IXLCFDataBarMin.cs | 14 + .../Excel/ConditionalFormats/IXLCFIconSet.cs | 14 + .../IXLConditionalFormat.cs | 177 + .../IXLConditionalFormats.cs | 14 + .../ConditionalFormats/Save/IXLCFConverter.cs | 13 + .../Save/IXLCFConverterExtension.cs | 13 + .../Save/XLCFBaseConverter.cs | 18 + .../Save/XLCFCellIsConverter.cs | 46 + .../Save/XLCFColorScaleConverter.cs | 51 + .../Save/XLCFContainsConverter.cs | 26 + .../ConditionalFormats/Save/XLCFConverters.cs | 42 + .../Save/XLCFConvertersExtension.cs | 28 + .../Save/XLCFDataBarConverter.cs | 82 + .../Save/XLCFDataBarConverterExtension.cs | 91 + .../Save/XLCFDatesOccuringConverter.cs | 40 + .../Save/XLCFEndsWithConverter.cs | 28 + .../Save/XLCFIconSetConverter.cs | 24 + .../Save/XLCFIsBlankConverter.cs | 22 + .../Save/XLCFIsErrorConverter.cs | 22 + .../Save/XLCFNotBlankConverter.cs | 22 + .../Save/XLCFNotContainsConverter.cs | 26 + .../Save/XLCFNotErrorConverter.cs | 22 + .../Save/XLCFStartsWithConverter.cs | 26 + .../Save/XLCFTopConverter.cs | 22 + .../Save/XLCFUniqueConverter.cs | 18 + .../ConditionalFormats/XLCFColorScaleMax.cs | 30 + .../ConditionalFormats/XLCFColorScaleMid.cs | 38 + .../ConditionalFormats/XLCFColorScaleMin.cs | 36 + .../ConditionalFormats/XLCFDataBarMax.cs | 31 + .../ConditionalFormats/XLCFDataBarMin.cs | 32 + .../Excel/ConditionalFormats/XLCFIconSet.cs | 24 + .../ConditionalFormats/XLConditionalFormat.cs | 600 ++ .../XLConditionalFormats.cs | 138 + .../ContentManagers/XLBaseContentManager.cs | 38 + .../XLSheetViewContentManager.cs | 24 + .../XLWorksheetContentManager.cs | 97 + ClosedXML/Excel/Coordinates/IXLAddress.cs | 31 + ClosedXML/Excel/Coordinates/XLAddress.cs | 465 ++ ClosedXML/Excel/Coordinates/XLSheetPoint.cs | 41 + ClosedXML/Excel/Coordinates/XLSheetRange.cs | 26 + .../CustomProperties/IXLCustomProperties.cs | 14 + .../CustomProperties/IXLCustomProperty.cs | 13 + .../CustomProperties/XLCustomProperties.cs | 46 + .../CustomProperties/XLCustomProperty.cs | 60 + .../Excel/DataValidation/IXLDataValidation.cs | 76 + .../DataValidation/IXLDataValidations.cs | 41 + .../DataValidation/IXLValidationCriteria.cs | 34 + .../Excel/DataValidation/XLDataValidation.cs | 294 + .../Excel/DataValidation/XLDataValidations.cs | 282 + .../Excel/DataValidation/XLDateCriteria.cs | 63 + .../Excel/DataValidation/XLDecimalCriteria.cs | 62 + .../DataValidation/XLTextLengthCriteria.cs | 62 + .../Excel/DataValidation/XLTimeCriteria.cs | 67 + .../DataValidation/XLValidationCriteria.cs | 169 + .../DataValidation/XLWholeNumberCriteria.cs | 57 + ClosedXML/Excel/Drawings/IXLDrawing.cs | 45 + .../Excel/Drawings/IXLDrawingPosition.cs | 20 + ClosedXML/Excel/Drawings/IXLPicture.cs | 86 + ClosedXML/Excel/Drawings/IXLPictures.cs | 38 + ClosedXML/Excel/Drawings/PictureEnums.cs | 28 + .../Drawings/Style/IXLDrawingAlignment.cs | 38 + .../Style/IXLDrawingColorsAndLines.cs | 42 + .../Excel/Drawings/Style/IXLDrawingFont.cs | 22 + .../Excel/Drawings/Style/IXLDrawingMargins.cs | 25 + .../Drawings/Style/IXLDrawingProperties.cs | 14 + .../Drawings/Style/IXLDrawingProtection.cs | 17 + .../Excel/Drawings/Style/IXLDrawingSize.cs | 19 + .../Excel/Drawings/Style/IXLDrawingStyle.cs | 19 + .../Excel/Drawings/Style/IXLDrawingWeb.cs | 14 + .../Drawings/Style/XLDrawingAlignment.cs | 23 + .../Drawings/Style/XLDrawingColorsAndLines.cs | 25 + .../Excel/Drawings/Style/XLDrawingFont.cs | 127 + .../Excel/Drawings/Style/XLDrawingMargins.cs | 38 + .../Drawings/Style/XLDrawingProperties.cs | 19 + .../Drawings/Style/XLDrawingProtection.cs | 20 + .../Excel/Drawings/Style/XLDrawingSize.cs | 22 + .../Excel/Drawings/Style/XLDrawingStyle.cs | 60 + .../Excel/Drawings/Style/XLDrawingWeb.cs | 19 + ClosedXML/Excel/Drawings/XLDrawing.cs | 114 + ClosedXML/Excel/Drawings/XLDrawingPosition.cs | 20 + ClosedXML/Excel/Drawings/XLMarker.cs | 37 + ClosedXML/Excel/Drawings/XLPicture.cs | 448 ++ ClosedXML/Excel/Drawings/XLPictures.cs | 174 + ClosedXML/Excel/EnumConverter.cs | 1703 +++++ .../Excel/Exceptions/ClosedXMLException.cs | 19 + .../Excel/Exceptions/EmptyTableException.cs | 19 + ClosedXML/Excel/Hyperlinks/IXLHyperlinks.cs | 12 + .../Excel/Hyperlinks/XLHyperlink_Internal.cs | 66 + .../Excel/Hyperlinks/XLHyperlink_public.cs | 110 + ClosedXML/Excel/Hyperlinks/XLHyperlinks.cs | 34 + ClosedXML/Excel/IXLFileSharing.cs | 17 + ClosedXML/Excel/IXLOutline.cs | 11 + ClosedXML/Excel/IXLSheetView.cs | 78 + ClosedXML/Excel/IXLTheme.cs | 20 + ClosedXML/Excel/IXLWorkbook.cs | 248 + ClosedXML/Excel/IXLWorksheet.cs | 483 ++ ClosedXML/Excel/IXLWorksheets.cs | 37 + ClosedXML/Excel/LoadOptions.cs | 11 + ClosedXML/Excel/Misc/XLDictionary.cs | 32 + ClosedXML/Excel/Misc/XLFormula.cs | 58 + ClosedXML/Excel/Misc/XLIdManager.cs | 41 + ClosedXML/Excel/NamedRanges/IXLNamedRange.cs | 123 + ClosedXML/Excel/NamedRanges/IXLNamedRanges.cs | 94 + ClosedXML/Excel/NamedRanges/XLNamedRange.cs | 241 + ClosedXML/Excel/NamedRanges/XLNamedRanges.cs | 208 + ClosedXML/Excel/PageSetup/IXLHFItem.cs | 48 + ClosedXML/Excel/PageSetup/IXLHeaderFooter.cs | 31 + ClosedXML/Excel/PageSetup/IXLMargins.cs | 39 + ClosedXML/Excel/PageSetup/IXLPageSetup.cs | 311 + ClosedXML/Excel/PageSetup/IXLPrintAreas.cs | 32 + ClosedXML/Excel/PageSetup/XLHFItem.cs | 118 + ClosedXML/Excel/PageSetup/XLHFText.cs | 104 + ClosedXML/Excel/PageSetup/XLHeaderFooter.cs | 146 + ClosedXML/Excel/PageSetup/XLMargins.cs | 22 + ClosedXML/Excel/PageSetup/XLPageSetup.cs | 262 + ClosedXML/Excel/PageSetup/XLPrintAreas.cs | 56 + ClosedXML/Excel/Patterns/Quadrant.cs | 391 + ClosedXML/Excel/PivotTables/IXLPivotField.cs | 80 + ClosedXML/Excel/PivotTables/IXLPivotFields.cs | 28 + ClosedXML/Excel/PivotTables/IXLPivotTable.cs | 274 + ClosedXML/Excel/PivotTables/IXLPivotTables.cs | 26 + .../AbstractPivotFieldReference.cs | 19 + .../IXLPivotFieldStyleFormats.cs | 11 + .../PivotStyleFormats/IXLPivotStyleFormat.cs | 10 + .../PivotStyleFormats/IXLPivotStyleFormats.cs | 10 + .../IXLPivotTableStyleFormats.cs | 9 + .../IXLPivotValueStyleFormat.cs | 14 + .../PivotLabelFieldReference.cs | 42 + .../PivotValueFieldReference.cs | 29 + .../XLPivotFieldStyleFormats.cs | 82 + .../PivotStyleFormats/XLPivotStyleFormat.cs | 27 + .../XLPivotStyleFormatEnums.cs | 24 + .../PivotStyleFormats/XLPivotStyleFormats.cs | 61 + .../XLPivotTableStyleFormats.cs | 25 + .../XLPivotValueStyleFormat.cs | 33 + .../PivotTables/PivotValues/IXLPivotValue.cs | 71 + .../PivotValues/IXLPivotValueCombination.cs | 14 + .../PivotValues/IXLPivotValueFormat.cs | 11 + .../PivotTables/PivotValues/IXLPivotValues.cs | 29 + .../PivotTables/PivotValues/XLPivotValue.cs | 74 + .../PivotValues/XLPivotValueCombination.cs | 32 + .../PivotValues/XLPivotValueFormat.cs | 104 + .../PivotTables/PivotValues/XLPivotValues.cs | 92 + .../Excel/PivotTables/XLPivotAreaValues.cs | 14 + ClosedXML/Excel/PivotTables/XLPivotField.cs | 129 + ClosedXML/Excel/PivotTables/XLPivotFields.cs | 91 + ClosedXML/Excel/PivotTables/XLPivotTable.cs | 412 ++ ClosedXML/Excel/PivotTables/XLPivotTables.cs | 92 + .../Excel/Protection/IXLElementProtection.cs | 82 + ClosedXML/Excel/Protection/IXLProtectable.cs | 73 + .../Excel/Protection/IXLSheetProtection.cs | 6 + .../Excel/Protection/IXLWorkbookProtection.cs | 6 + .../Excel/Protection/XLProtectionAlgorithm.cs | 47 + .../Excel/Protection/XLSheetProtection.cs | 154 + .../Protection/XLSheetProtectionElements.cs | 39 + .../Excel/Protection/XLWorkbookProtection.cs | 158 + .../XLWorkbookProtectionElements.cs | 18 + ClosedXML/Excel/Ranges/IXLAddressable.cs | 15 + ClosedXML/Excel/Ranges/IXLBaseCollection.cs | 77 + ClosedXML/Excel/Ranges/IXLRange.cs | 313 + ClosedXML/Excel/Ranges/IXLRangeAddress.cs | 110 + ClosedXML/Excel/Ranges/IXLRangeBase.cs | 379 + ClosedXML/Excel/Ranges/IXLRangeColumn.cs | 129 + ClosedXML/Excel/Ranges/IXLRangeColumns.cs | 50 + ClosedXML/Excel/Ranges/IXLRangeRow.cs | 131 + ClosedXML/Excel/Ranges/IXLRangeRows.cs | 50 + ClosedXML/Excel/Ranges/IXLRanges.cs | 131 + ClosedXML/Excel/Ranges/Index/IXLRangeIndex.cs | 43 + ClosedXML/Excel/Ranges/Index/XLRangeIndex.cs | 271 + ClosedXML/Excel/Ranges/Sort/IXLSortElement.cs | 14 + .../Excel/Ranges/Sort/IXLSortElements.cs | 22 + ClosedXML/Excel/Ranges/Sort/XLSortElement.cs | 12 + ClosedXML/Excel/Ranges/Sort/XLSortElements.cs | 75 + ClosedXML/Excel/Ranges/XLRange.cs | 958 +++ ClosedXML/Excel/Ranges/XLRangeAddress.cs | 491 ++ ClosedXML/Excel/Ranges/XLRangeBase.cs | 2300 ++++++ ClosedXML/Excel/Ranges/XLRangeColumn.cs | 392 + ClosedXML/Excel/Ranges/XLRangeColumns.cs | 137 + .../Ranges/XLRangeConsolidationEngine.cs | 217 + ClosedXML/Excel/Ranges/XLRangeFactory.cs | 89 + ClosedXML/Excel/Ranges/XLRangeKey.cs | 60 + ClosedXML/Excel/Ranges/XLRangeParameters.cs | 22 + ClosedXML/Excel/Ranges/XLRangeRow.cs | 372 + ClosedXML/Excel/Ranges/XLRangeRows.cs | 137 + ClosedXML/Excel/Ranges/XLRangeType.cs | 13 + ClosedXML/Excel/Ranges/XLRanges.cs | 319 + ClosedXML/Excel/RichText/IXLFormattedText.cs | 42 + ClosedXML/Excel/RichText/IXLPhonetic.cs | 11 + ClosedXML/Excel/RichText/IXLPhonetics.cs | 33 + ClosedXML/Excel/RichText/IXLRichString.cs | 27 + ClosedXML/Excel/RichText/IXLRichText.cs | 9 + ClosedXML/Excel/RichText/XLFormattedText.cs | 189 + ClosedXML/Excel/RichText/XLPhonetic.cs | 25 + ClosedXML/Excel/RichText/XLPhonetics.cs | 136 + ClosedXML/Excel/RichText/XLRichString.cs | 159 + ClosedXML/Excel/RichText/XLRichText.cs | 30 + ClosedXML/Excel/Rows/IXLRow.cs | 207 + ClosedXML/Excel/Rows/IXLRows.cs | 132 + ClosedXML/Excel/Rows/XLRow.cs | 609 ++ ClosedXML/Excel/Rows/XLRowCollection.cs | 143 + ClosedXML/Excel/Rows/XLRows.cs | 273 + ClosedXML/Excel/SaveOptions.cs | 29 + .../Excel/Sparkline/IXLSparkLineGroup.cs | 105 + .../Excel/Sparkline/IXLSparkLineGroups.cs | 33 + ClosedXML/Excel/Sparkline/IXLSparkline.cs | 26 + .../Sparkline/IXLSparklineHorizontalAxis.cs | 30 + .../Excel/Sparkline/IXLSparklineStyle.cs | 43 + .../Sparkline/IXLSparklineVerticalAxis.cs | 32 + ClosedXML/Excel/Sparkline/XLSparkLine.cs | 91 + ClosedXML/Excel/Sparkline/XLSparkLineGroup.cs | 338 + .../Excel/Sparkline/XLSparkLineGroups.cs | 177 + .../Sparkline/XLSparklineHorizontalAxis.cs | 60 + ClosedXML/Excel/Sparkline/XLSparklineStyle.cs | 149 + ClosedXML/Excel/Sparkline/XLSparklineTheme.cs | 432 ++ .../Sparkline/XLSparklineVerticalAxis.cs | 100 + .../Excel/Style/Colors/XLColor_Internal.cs | 58 + .../Excel/Style/Colors/XLColor_Public.cs | 154 + .../Excel/Style/Colors/XLColor_Static.cs | 1659 +++++ ClosedXML/Excel/Style/IXLAlignment.cs | 106 + ClosedXML/Excel/Style/IXLBorder.cs | 89 + ClosedXML/Excel/Style/IXLFill.cs | 42 + ClosedXML/Excel/Style/IXLFont.cs | 158 + ClosedXML/Excel/Style/IXLFontBase.cs | 29 + ClosedXML/Excel/Style/IXLNumberFormat.cs | 11 + ClosedXML/Excel/Style/IXLNumberFormatBase.cs | 11 + ClosedXML/Excel/Style/IXLProtection.cs | 15 + ClosedXML/Excel/Style/IXLStyle.cs | 26 + ClosedXML/Excel/Style/IXLStylized.cs | 23 + ClosedXML/Excel/Style/XLAlignment.cs | 327 + ClosedXML/Excel/Style/XLAlignmentKey.cs | 78 + ClosedXML/Excel/Style/XLAlignmentValue.cs | 68 + ClosedXML/Excel/Style/XLBorder.cs | 611 ++ ClosedXML/Excel/Style/XLBorderKey.cs | 97 + ClosedXML/Excel/Style/XLBorderValue.cs | 85 + ClosedXML/Excel/Style/XLColorKey.cs | 76 + ClosedXML/Excel/Style/XLFill.cs | 213 + ClosedXML/Excel/Style/XLFillKey.cs | 68 + ClosedXML/Excel/Style/XLFillValue.cs | 52 + ClosedXML/Excel/Style/XLFont.cs | 357 + ClosedXML/Excel/Style/XLFontKey.cs | 81 + ClosedXML/Excel/Style/XLFontValue.cs | 73 + ClosedXML/Excel/Style/XLNumberFormat.cs | 152 + ClosedXML/Excel/Style/XLNumberFormatKey.cs | 42 + ClosedXML/Excel/Style/XLNumberFormatValue.cs | 45 + ClosedXML/Excel/Style/XLPredefinedFormat.cs | 219 + ClosedXML/Excel/Style/XLProtection.cs | 153 + ClosedXML/Excel/Style/XLProtectionKey.cs | 42 + ClosedXML/Excel/Style/XLProtectionValue.cs | 45 + ClosedXML/Excel/Style/XLStyle.cs | 214 + ClosedXML/Excel/Style/XLStyleKey.cs | 88 + ClosedXML/Excel/Style/XLStyleValue.cs | 97 + ClosedXML/Excel/Style/XLStylizedBase.cs | 126 + ClosedXML/Excel/Style/XLStylizedEmpty.cs | 30 + ClosedXML/Excel/Tables/IXLTable.cs | 220 + ClosedXML/Excel/Tables/IXLTableField.cs | 129 + ClosedXML/Excel/Tables/IXLTableRange.cs | 58 + ClosedXML/Excel/Tables/IXLTableRow.cs | 33 + ClosedXML/Excel/Tables/IXLTableRows.cs | 46 + ClosedXML/Excel/Tables/IXLTables.cs | 29 + ClosedXML/Excel/Tables/XLTable.cs | 1039 +++ ClosedXML/Excel/Tables/XLTableField.cs | 259 + ClosedXML/Excel/Tables/XLTableRange.cs | 270 + ClosedXML/Excel/Tables/XLTableRow.cs | 115 + ClosedXML/Excel/Tables/XLTableRows.cs | 129 + ClosedXML/Excel/Tables/XLTableTheme.cs | 121 + ClosedXML/Excel/Tables/XLTables.cs | 88 + ClosedXML/Excel/XLCellsUsedOptions.cs | 29 + ClosedXML/Excel/XLClearOptions.cs | 29 + ClosedXML/Excel/XLConstants.cs | 28 + ClosedXML/Excel/XLFileSharing.cs | 10 + ClosedXML/Excel/XLOutline.cs | 17 + ClosedXML/Excel/XLSheetView.cs | 108 + ClosedXML/Excel/XLTheme.cs | 66 + ClosedXML/Excel/XLWorkbook.cs | 1072 +++ ClosedXML/Excel/XLWorkbookProperties.cs | 25 + ClosedXML/Excel/XLWorkbook_ImageHandling.cs | 72 + ClosedXML/Excel/XLWorkbook_Load.cs | 3269 +++++++++ .../Excel/XLWorkbook_Save.NestedTypes.cs | 170 + ClosedXML/Excel/XLWorkbook_Save.cs | 6395 +++++++++++++++++ ClosedXML/Excel/XLWorksheet.cs | 1986 +++++ ClosedXML/Excel/XLWorksheetInternals.cs | 51 + ClosedXML/Excel/XLWorksheets.cs | 205 + ClosedXML/Extensions/AttributeExtensions.cs | 37 + ClosedXML/Extensions/ColorExtensions.cs | 37 + ClosedXML/Extensions/DateTimeExtensions.cs | 43 + ClosedXML/Extensions/DecimalExtensions.cs | 13 + ClosedXML/Extensions/DictionaryExtensions.cs | 20 + ClosedXML/Extensions/DoubleExtensions.cs | 13 + ClosedXML/Extensions/DoubleValueExtensions.cs | 14 + ClosedXML/Extensions/EnumerableExtensions.cs | 33 + ClosedXML/Extensions/FontBaseExtensions.cs | 67 + ClosedXML/Extensions/FormatExtensions.cs | 18 + ClosedXML/Extensions/GuidExtensions.cs | 13 + ClosedXML/Extensions/IntegerExtensions.cs | 11 + ClosedXML/Extensions/ListExtensions.cs | 19 + ClosedXML/Extensions/ObjectExtensions.cs | 134 + .../OpenXmlPartContainerExtensions.cs | 15 + ClosedXML/Extensions/StringExtensions.cs | 87 + ClosedXML/Extensions/TypeExtensions.cs | 42 + ClosedXML/Extensions/XDocumentExtensions.cs | 25 + ClosedXML/FodyWeavers.xml | 3 + ClosedXML/FodyWeavers.xsd | 26 + ClosedXML/PathHelper.cs | 243 + ClosedXML/Properties/AssemblyInfo.cs | 5 + ClosedXML/Utils/ColorStringParser.cs | 22 + ClosedXML/Utils/CryptographicAlgorithms.cs | 138 + ClosedXML/Utils/DescribedEnumParser.cs | 53 + ClosedXML/Utils/GraphicsUtils.cs | 31 + ClosedXML/Utils/OpenXmlColorTypeAdapters.cs | 56 + ClosedXML/Utils/OpenXmlHelper.cs | 161 + ClosedXML/Utils/XmlEncoder.cs | 47 + ClosedXML/XLHelper.cs | 384 + .../AutoFilters/CustomAutoFilter.cs | 139 + .../AutoFilters/DateTimeGroupAutoFilter.cs | 43 + .../AutoFilters/DynamicAutoFilter.cs | 88 + .../AutoFilters/RegularAutoFilter.cs | 205 + .../AutoFilters/TopBottomAutoFilter.cs | 88 + ClosedXML_Examples/BasicTable.cs | 93 + ClosedXML_Examples/ClosedXML.snk | Bin 0 -> 596 bytes ClosedXML_Examples/ClosedXML_Examples.csproj | 46 + ClosedXML_Examples/Columns/ColumnCells.cs | 32 + .../Columns/ColumnCollections.cs | 108 + ClosedXML_Examples/Columns/ColumnSettings.cs | 80 + ClosedXML_Examples/Columns/DeletingColumns.cs | 75 + ClosedXML_Examples/Columns/InsertColumns.cs | 40 + ClosedXML_Examples/Comments/AddingComments.cs | 285 + .../Comments/EditingComments.cs | 55 + .../ConditionalFormatting.cs | 761 ++ ClosedXML_Examples/Creating/CreateFiles.cs | 98 + .../Delete/DeleteFewWorksheets.cs | 41 + ClosedXML_Examples/Delete/DeleteRows.cs | 86 + ClosedXML_Examples/ExampleHelper.cs | 19 + ClosedXML_Examples/HelloWorld.cs | 16 + ClosedXML_Examples/IXLExample.cs | 7 + .../ImageHandling/ImageAnchors.cs | 84 + .../ImageHandling/ImageFormats.cs | 40 + .../Loading/ChangingBasicTable.cs | 48 + ClosedXML_Examples/Loading/LoadFiles.cs | 26 + ClosedXML_Examples/Misc/AddingDataSet.cs | 51 + .../Misc/AddingDataTableAsWorksheet.cs | 79 + ClosedXML_Examples/Misc/AdjustToContents.cs | 113 + .../Misc/AdjustToContentsWithAutoFilter.cs | 25 + ClosedXML_Examples/Misc/AutoFilter.cs | 69 + ClosedXML_Examples/Misc/BlankCells.cs | 59 + ClosedXML_Examples/Misc/CellValues.cs | 148 + ClosedXML_Examples/Misc/Collections.cs | 132 + .../Misc/CopyingRowsAndColumns.cs | 114 + ClosedXML_Examples/Misc/CopyingWorksheets.cs | 44 + ClosedXML_Examples/Misc/DataTypes.cs | 227 + .../Misc/DataTypesUnderDifferentCulture.cs | 35 + ClosedXML_Examples/Misc/DataValidation.cs | 139 + ClosedXML_Examples/Misc/Formulas.cs | 79 + .../Misc/FormulasWithEvaluation.cs | 16 + ClosedXML_Examples/Misc/FreezePanes.cs | 36 + ClosedXML_Examples/Misc/HideSheets.cs | 63 + ClosedXML_Examples/Misc/HideUnhide.cs | 64 + ClosedXML_Examples/Misc/Hyperlinks.cs | 128 + ClosedXML_Examples/Misc/InsertingData.cs | 110 + ClosedXML_Examples/Misc/LambdaExpressions.cs | 57 + ClosedXML_Examples/Misc/MergeCells.cs | 88 + ClosedXML_Examples/Misc/MergeMoves.cs | 53 + ClosedXML_Examples/Misc/MultipleSheets.cs | 30 + ClosedXML_Examples/Misc/Outline.cs | 86 + ClosedXML_Examples/Misc/RightToLeft.cs | 21 + ClosedXML_Examples/Misc/SheetProtection.cs | 58 + ClosedXML_Examples/Misc/SheetViews.cs | 44 + ClosedXML_Examples/Misc/ShiftingFormulas.cs | 93 + ClosedXML_Examples/Misc/ShowCase.cs | 104 + ClosedXML_Examples/Misc/TabColors.cs | 67 + ClosedXML_Examples/Misc/WorkbookProperties.cs | 75 + ClosedXML_Examples/Misc/WorkbookProtection.cs | 23 + ClosedXML_Examples/ModifyFiles.cs | 14 + ClosedXML_Examples/PageSetup/HeaderFooters.cs | 65 + ClosedXML_Examples/PageSetup/Margins.cs | 36 + ClosedXML_Examples/PageSetup/Page.cs | 43 + ClosedXML_Examples/PageSetup/SheetTab.cs | 58 + ClosedXML_Examples/PageSetup/Sheets.cs | 34 + ClosedXML_Examples/PageSetup/TwoPages.cs | 36 + ClosedXML_Examples/PivotTables/PivotTables.cs | 234 + ClosedXML_Examples/Program.cs | 34 + .../Ranges/AddingRowToTables.cs | 56 + ClosedXML_Examples/Ranges/ClearingRanges.cs | 54 + ClosedXML_Examples/Ranges/CopyingRanges.cs | 37 + ClosedXML_Examples/Ranges/CurrentRowColumn.cs | 51 + ClosedXML_Examples/Ranges/DefiningRanges.cs | 49 + ClosedXML_Examples/Ranges/DeletingRanges.cs | 69 + .../Ranges/InsertingDeletingColumns.cs | 55 + .../Ranges/InsertingDeletingRows.cs | 55 + ClosedXML_Examples/Ranges/MultipleRanges.cs | 22 + ClosedXML_Examples/Ranges/NamedRanges.cs | 85 + ClosedXML_Examples/Ranges/SelectingRanges.cs | 29 + ClosedXML_Examples/Ranges/ShiftingRanges.cs | 40 + ClosedXML_Examples/Ranges/SortExample.cs | 233 + ClosedXML_Examples/Ranges/Sorting.cs | 257 + ClosedXML_Examples/Ranges/TransposeRanges.cs | 37 + .../Ranges/TransposeRangesPlus.cs | 46 + ClosedXML_Examples/Ranges/WalkingRanges.cs | 68 + .../Resources/ImageHandling.jpg | Bin 0 -> 7590 bytes .../Resources/ImageHandling.png | Bin 0 -> 1770 bytes ClosedXML_Examples/Resources/SampleImage.jpg | Bin 0 -> 35251 bytes ClosedXML_Examples/Rows/InsertRows.cs | 83 + ClosedXML_Examples/Rows/RowCells.cs | 73 + ClosedXML_Examples/Rows/RowCollection.cs | 96 + ClosedXML_Examples/Rows/RowSettings.cs | 80 + .../Sparklines/SampleSparklines.cs | 98 + ClosedXML_Examples/StyleExamples.cs | 74 + ClosedXML_Examples/Styles/DefaultStyles.cs | 29 + ClosedXML_Examples/Styles/PurpleWorksheet.cs | 19 + ClosedXML_Examples/Styles/StyleAlignment.cs | 105 + ClosedXML_Examples/Styles/StyleBorder.cs | 52 + ClosedXML_Examples/Styles/StyleFill.cs | 27 + ClosedXML_Examples/Styles/StyleFont.cs | 53 + .../Styles/StyleIncludeQuotePrefix.cs | 39 + .../Styles/StyleNumberFormat.cs | 85 + ClosedXML_Examples/Styles/StyleRowsColumns.cs | 34 + ClosedXML_Examples/Styles/StyleWorksheet.cs | 42 + ClosedXML_Examples/Styles/UsingColors.cs | 84 + ClosedXML_Examples/Styles/UsingPhonetics.cs | 41 + ClosedXML_Examples/Styles/UsingRichText.cs | 121 + ClosedXML_Examples/Tables/InsertingTables.cs | 111 + ClosedXML_Examples/Tables/ResizingTables.cs | 48 + ClosedXML_Examples/Tables/UsingTables.cs | 116 + ClosedXML_Examples/app.config | 6 + ClosedXML_Sandbox/ClosedXML_Sandbox.csproj | 46 + ClosedXML_Sandbox/OneRow.cs | 89 + ClosedXML_Sandbox/PerformanceRunner.cs | 170 + ClosedXML_Sandbox/Program.cs | 29 + ClosedXML_Sandbox/ReflectionExtensions.cs | 17 + ClosedXML_Sandbox/app.config | 6 + ClosedXML_Sandbox/test.xlsx | Bin 0 -> 8725 bytes ClosedXML_Tests/ClosedXML.snk | Bin 0 -> 596 bytes ClosedXML_Tests/ClosedXML_Tests.csproj | 67 + ClosedXML_Tests/Examples/AutoFilterTests.cs | 39 + ClosedXML_Tests/Examples/ColumnsTests.cs | 40 + ClosedXML_Tests/Examples/CommentsTests.cs | 15 + .../Examples/ConditionalFormattingTests.cs | 141 + ClosedXML_Tests/Examples/DeleteTests.cs | 21 + .../Examples/ImageHandlingTests.cs | 21 + ClosedXML_Tests/Examples/LoadingTests.cs | 15 + ClosedXML_Tests/Examples/MiscTests.cs | 209 + ClosedXML_Tests/Examples/PageSetupTests.cs | 45 + ClosedXML_Tests/Examples/PivotTableTests.cs | 15 + ClosedXML_Tests/Examples/RangesTests.cs | 113 + ClosedXML_Tests/Examples/RowsTests.cs | 34 + ClosedXML_Tests/Examples/StylesTests.cs | 87 + ClosedXML_Tests/Examples/TablesTests.cs | 27 + .../Excel/AutoFilters/AutoFilterTests.cs | 277 + .../Excel/Caching/SampleRepositoryTests.cs | 237 + .../CalcEngineCellEnumerationTests.cs | 23 + .../CalcEngine/CalcEngineExceptionTests.cs | 56 + .../Excel/CalcEngine/DateAndTimeTests.cs | 564 ++ .../Excel/CalcEngine/FormulaCachingTests.cs | 391 + .../Excel/CalcEngine/FunctionsTests.cs | 754 ++ .../Excel/CalcEngine/InformationTests.cs | 436 ++ .../Excel/CalcEngine/LogicalTests.cs | 63 + .../Excel/CalcEngine/LookupTests.cs | 250 + .../Excel/CalcEngine/MathTrigTests.cs | 1471 ++++ .../Excel/CalcEngine/PrecedentCellsTests.cs | 86 + .../Excel/CalcEngine/StatisticalTests.cs | 457 ++ ClosedXML_Tests/Excel/CalcEngine/TextTests.cs | 696 ++ .../Excel/CalcEngine/XLMathTests.cs | 26 + ClosedXML_Tests/Excel/Cells/DataTypeTests.cs | 22 + ClosedXML_Tests/Excel/Cells/XLCellTests.cs | 1180 +++ .../Excel/Clearing/ClearingTests.cs | 309 + ClosedXML_Tests/Excel/Columns/ColumnTests.cs | 249 + .../Excel/Comments/CommentsTests.cs | 194 + .../ConditionalFormatCopyTests.cs | 116 + .../ConditionalFormatShiftTests.cs | 127 + .../ConditionalFormatTests.cs | 118 + .../ConditionalFormatsConsolidateTests.cs | 206 + .../Excel/Coordinates/XLAddressTests.cs | 191 + .../DataValidationShiftTests.cs | 127 + .../DataValidations/DataValidationTests.cs | 483 ++ .../DataValidations/XLDataValidationsTests.cs | 154 + .../Excel/Globalization/GlobalizationTests.cs | 46 + .../Excel/ImageHandling/PictureTests.cs | 471 ++ ClosedXML_Tests/Excel/Loading/LoadingTests.cs | 546 ++ .../Excel/Misc/CopyContentsTests.cs | 134 + ClosedXML_Tests/Excel/Misc/ExtensionsTests.cs | 87 + ClosedXML_Tests/Excel/Misc/FormulaTests.cs | 228 + ClosedXML_Tests/Excel/Misc/HyperlinkTests.cs | 32 + ClosedXML_Tests/Excel/Misc/SearchTests.cs | 78 + ClosedXML_Tests/Excel/Misc/StylesTests.cs | 114 + ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs | 463 ++ ClosedXML_Tests/Excel/Misc/XlHelperTests.cs | 200 + ClosedXML_Tests/Excel/Misc/XmlEncoderTests.cs | 23 + .../Excel/NamedRanges/NamedRangesTests.cs | 626 ++ .../Excel/PageSetup/HeaderFooterTests.cs | 51 + .../Excel/PageSetup/PageBreaksTests.cs | 78 + .../Excel/PivotTables/XLPivotTableTests.cs | 765 ++ .../Excel/Protection/HashAlgorithmTests.cs | 30 + .../Protection/XLSheetProtectionTests.cs | 193 + .../Protection/XLWorkbookProtectionTests.cs | 329 + .../Excel/Ranges/CopyingRangesTests.cs | 152 + .../Excel/Ranges/InsertingRangesTests.cs | 298 + .../Excel/Ranges/MergedRangesTests.cs | 443 ++ .../Excel/Ranges/RangeIndexTest.cs | 285 + .../Excel/Ranges/RangeShiftingTests.cs | 82 + .../Excel/Ranges/RangesConsolidationTests.cs | 126 + .../Excel/Ranges/UsedAndUnusedCellsTests.cs | 401 ++ .../Excel/Ranges/XLRangeAddressTests.cs | 349 + .../Excel/Ranges/XLRangeBaseTests.cs | 520 ++ .../Excel/RichText/XLRichStringTests.cs | 762 ++ ClosedXML_Tests/Excel/Rows/RowTests.cs | 272 + ClosedXML_Tests/Excel/Saving/SavingTests.cs | 733 ++ .../Excel/Sparklines/SparklinesTests.cs | 1075 +++ ClosedXML_Tests/Excel/Styles/BorderTests.cs | 36 + ClosedXML_Tests/Excel/Styles/ColorTests.cs | 177 + ClosedXML_Tests/Excel/Styles/FontTests.cs | 30 + .../Excel/Styles/NumberFormatTests.cs | 94 + .../Excel/Styles/StyleChangeTests.cs | 136 + ClosedXML_Tests/Excel/Styles/StyleTests.cs | 115 + ClosedXML_Tests/Excel/Styles/XLFillTests.cs | 119 + .../AddingAndReplacingTableDataTests.cs | 675 ++ ClosedXML_Tests/Excel/Tables/TablesTests.cs | 1178 +++ .../Excel/Worksheets/XLSheetViewTests.cs | 73 + .../Excel/Worksheets/XLWorksheetTests.cs | 1184 +++ ClosedXML_Tests/ExcelDocsComparerTests.cs | 59 + ClosedXML_Tests/OleDb/OleDbTests.cs | 120 + ClosedXML_Tests/OpenXMLTests.cs | 30 + .../Examples/AutoFilter/CustomAutoFilter.xlsx | Bin 0 -> 10674 bytes .../AutoFilter/DateTimeGroupAutoFilter.xlsx | Bin 0 -> 5989 bytes .../AutoFilter/DynamicAutoFilter.xlsx | Bin 0 -> 8551 bytes .../AutoFilter/RegularAutoFilter.xlsx | Bin 0 -> 10432 bytes .../AutoFilter/TopBottomAutoFilter.xlsx | Bin 0 -> 8535 bytes .../Examples/Columns/ColumnCells.xlsx | Bin 0 -> 7426 bytes .../Examples/Columns/ColumnCollection.xlsx | Bin 0 -> 8566 bytes .../Examples/Columns/ColumnSettings.xlsx | Bin 0 -> 7363 bytes .../Examples/Columns/DeletingColumns.xlsx | Bin 0 -> 5708 bytes .../Examples/Columns/InsertColumns.xlsx | Bin 0 -> 8523 bytes .../Examples/Comments/AddingComments.xlsx | Bin 0 -> 30272 bytes .../Examples/Comments/EditingComments.xlsx | Bin 0 -> 11953 bytes .../CFColorScaleLowHigh.xlsx | Bin 0 -> 7371 bytes .../CFColorScaleLowMidHigh.xlsx | Bin 0 -> 7377 bytes .../CFColorScaleMinimumMaximum.xlsx | Bin 0 -> 7363 bytes .../ConditionalFormatting/CFContains.xlsx | Bin 0 -> 7461 bytes .../ConditionalFormatting/CFDataBar.xlsx | Bin 0 -> 6646 bytes .../CFDataBarNegative.xlsx | Bin 0 -> 6762 bytes .../ConditionalFormatting/CFDataBars.xlsx | Bin 0 -> 7293 bytes .../CFDatesOccurring.xlsx | Bin 0 -> 7469 bytes .../ConditionalFormatting/CFEndsWith.xlsx | Bin 0 -> 7443 bytes .../ConditionalFormatting/CFEqualsNumber.xlsx | Bin 0 -> 7386 bytes .../ConditionalFormatting/CFEqualsString.xlsx | Bin 0 -> 7427 bytes .../ConditionalFormatting/CFIconSet.xlsx | Bin 0 -> 7377 bytes .../ConditionalFormatting/CFIsBlank.xlsx | Bin 0 -> 7408 bytes .../ConditionalFormatting/CFIsError.xlsx | Bin 0 -> 7845 bytes .../CFMultipleConditions.xlsx | Bin 0 -> 7357 bytes .../ConditionalFormatting/CFNotBlank.xlsx | Bin 0 -> 7414 bytes .../ConditionalFormatting/CFNotContains.xlsx | Bin 0 -> 7459 bytes .../CFNotEqualsNumber.xlsx | Bin 0 -> 7388 bytes .../CFNotEqualsString.xlsx | Bin 0 -> 7430 bytes .../ConditionalFormatting/CFNotError.xlsx | Bin 0 -> 7853 bytes .../ConditionalFormatting/CFStartsWith.xlsx | Bin 0 -> 7484 bytes .../ConditionalFormatting/CFStopIfTrue.xlsx | Bin 0 -> 7422 bytes .../Examples/Delete/DeleteFewWorksheets.xlsx | Bin 0 -> 7944 bytes .../Resource/Examples/Delete/RemoveRows.xlsx | Bin 0 -> 7484 bytes .../Examples/ImageHandling/ImageAnchors.xlsx | Bin 0 -> 159154 bytes .../Examples/ImageHandling/ImageFormats.xlsx | Bin 0 -> 19429 bytes .../Examples/Loading/ChangingBasicTable.xlsx | Bin 0 -> 6519 bytes .../Resource/Examples/Misc/AddingDataSet.xlsx | Bin 0 -> 10679 bytes .../Misc/AddingDataTableAsWorksheet.xlsx | Bin 0 -> 7372 bytes .../Examples/Misc/AdjustToContents.xlsx | Bin 0 -> 14589 bytes .../Misc/AdjustToContentsWithAutoFilter.xlsx | Bin 0 -> 7422 bytes .../Resource/Examples/Misc/AutoFilter.xlsx | Bin 0 -> 7367 bytes .../Resource/Examples/Misc/BasicTable.xlsx | Bin 0 -> 6398 bytes .../Resource/Examples/Misc/BlankCells.xlsx | Bin 0 -> 7196 bytes .../Resource/Examples/Misc/CellValues.xlsx | Bin 0 -> 6980 bytes .../Resource/Examples/Misc/Collections.xlsx | Bin 0 -> 8036 bytes .../Examples/Misc/CopyingRowsAndColumns.xlsx | Bin 0 -> 9047 bytes .../Examples/Misc/CopyingWorksheets.xlsx | Bin 0 -> 13351 bytes .../Resource/Examples/Misc/DataTypes.xlsx | Bin 0 -> 6845 bytes .../Misc/DataTypesUnderDifferentCulture.xlsx | Bin 0 -> 6838 bytes .../Examples/Misc/DataValidation.xlsx | Bin 0 -> 11531 bytes .../Resource/Examples/Misc/Formulas.xlsx | Bin 0 -> 8474 bytes .../Examples/Misc/FormulasWithEvaluation.xlsx | Bin 0 -> 6741 bytes .../Resource/Examples/Misc/FreezePanes.xlsx | Bin 0 -> 9831 bytes .../Resource/Examples/Misc/HideSheets.xlsx | Bin 0 -> 10264 bytes .../Resource/Examples/Misc/HideUnhide.xlsx | Bin 0 -> 5701 bytes .../Resource/Examples/Misc/Hyperlinks.xlsx | Bin 0 -> 9535 bytes .../Resource/Examples/Misc/InsertingData.xlsx | Bin 0 -> 8288 bytes .../Examples/Misc/LambdaExpressions.xlsx | Bin 0 -> 6342 bytes .../Resource/Examples/Misc/MergeCells.xlsx | Bin 0 -> 5889 bytes .../Resource/Examples/Misc/MergeMoves.xlsx | Bin 0 -> 5870 bytes .../Resource/Examples/Misc/Outline.xlsx | Bin 0 -> 5724 bytes .../Resource/Examples/Misc/RightToLeft.xlsx | Bin 0 -> 7305 bytes .../Examples/Misc/SheetProtection.xlsx | Bin 0 -> 6682 bytes .../Resource/Examples/Misc/SheetViews.xlsx | Bin 0 -> 10269 bytes .../Examples/Misc/ShiftingFormulas.xlsx | Bin 0 -> 7048 bytes .../Resource/Examples/Misc/ShowCase.xlsx | Bin 0 -> 7586 bytes .../Resource/Examples/Misc/TabColors.xlsx | Bin 0 -> 9551 bytes .../Examples/Misc/WorkbookProperties.xlsx | Bin 0 -> 6180 bytes .../Examples/Misc/WorkbookProtection.xlsx | Bin 0 -> 5619 bytes .../Examples/PageSetup/HeaderFooters.xlsx | Bin 0 -> 7412 bytes .../Resource/Examples/PageSetup/Margins.xlsx | Bin 0 -> 7205 bytes .../Resource/Examples/PageSetup/Page.xlsx | Bin 0 -> 8041 bytes .../Resource/Examples/PageSetup/SheetTab.xlsx | Bin 0 -> 7269 bytes .../Resource/Examples/PageSetup/Sheets.xlsx | Bin 0 -> 8105 bytes .../Resource/Examples/PageSetup/TwoPages.xlsx | Bin 0 -> 12645 bytes .../Examples/PivotTables/PivotTables.xlsx | Bin 0 -> 43128 bytes .../Examples/Ranges/AddingRowToTables.xlsx | Bin 0 -> 7199 bytes .../Examples/Ranges/ClearingRanges.xlsx | Bin 0 -> 7905 bytes .../Examples/Ranges/CopyingRanges.xlsx | Bin 0 -> 7265 bytes .../Examples/Ranges/CurrentRowColumn.xlsx | Bin 0 -> 7633 bytes .../Examples/Ranges/DefiningRanges.xlsx | Bin 0 -> 5844 bytes .../Examples/Ranges/DeletingRanges.xlsx | Bin 0 -> 5787 bytes .../Ranges/InsertingDeletingColumns.xlsx | Bin 0 -> 7376 bytes .../Ranges/InsertingDeletingRows.xlsx | Bin 0 -> 7327 bytes .../Examples/Ranges/MultipleRanges.xlsx | Bin 0 -> 7397 bytes .../Resource/Examples/Ranges/NamedRanges.xlsx | Bin 0 -> 8992 bytes .../Examples/Ranges/SelectingRanges.xlsx | Bin 0 -> 7001 bytes .../Examples/Ranges/ShiftingRanges.xlsx | Bin 0 -> 6463 bytes .../Resource/Examples/Ranges/SortExample.xlsx | Bin 0 -> 11994 bytes .../Resource/Examples/Ranges/Sorting.xlsx | Bin 0 -> 19982 bytes .../Examples/Ranges/TransposeRanges.xlsx | Bin 0 -> 6609 bytes .../Examples/Ranges/TransposeRangesPlus.xlsx | Bin 0 -> 6355 bytes .../Examples/Ranges/WalkingRanges.xlsx | Bin 0 -> 9353 bytes .../Resource/Examples/Rows/InsertRows.xlsx | Bin 0 -> 8568 bytes .../Resource/Examples/Rows/RowCells.xlsx | Bin 0 -> 7416 bytes .../Resource/Examples/Rows/RowCollection.xlsx | Bin 0 -> 8363 bytes .../Resource/Examples/Rows/RowSettings.xlsx | Bin 0 -> 7312 bytes .../Examples/Sparklines/SampleSparklines.xlsx | Bin 0 -> 14882 bytes .../Examples/Styles/DefaultStyles.xlsx | Bin 0 -> 8757 bytes .../Examples/Styles/PurpleWorksheet.xlsx | Bin 0 -> 7306 bytes .../Examples/Styles/StyleAlignment.xlsx | Bin 0 -> 7591 bytes .../Resource/Examples/Styles/StyleBorder.xlsx | Bin 0 -> 7625 bytes .../Resource/Examples/Styles/StyleFill.xlsx | Bin 0 -> 7440 bytes .../Resource/Examples/Styles/StyleFont.xlsx | Bin 0 -> 7821 bytes .../Styles/StyleIncludeQuotePrefix.xlsx | Bin 0 -> 6475 bytes .../Examples/Styles/StyleNumberFormat.xlsx | Bin 0 -> 7432 bytes .../Examples/Styles/StyleRowsColumns.xlsx | Bin 0 -> 7585 bytes .../Examples/Styles/StyleWorksheet.xlsx | Bin 0 -> 7511 bytes .../Resource/Examples/Styles/UsingColors.xlsx | Bin 0 -> 7855 bytes .../Examples/Styles/UsingPhonetics.xlsx | Bin 0 -> 7443 bytes .../Examples/Styles/UsingRichText.xlsx | Bin 0 -> 7686 bytes .../Examples/Tables/InsertingTables.xlsx | Bin 0 -> 9141 bytes .../Examples/Tables/ResizingTables.xlsx | Bin 0 -> 11096 bytes .../Resource/Examples/Tables/UsingTables.xlsx | Bin 0 -> 9299 bytes .../Resource/Images/ImageHandling.png | Bin 0 -> 1770 bytes .../AutoFilterWithThousandsSeparator.xlsx | Bin 0 -> 8969 bytes .../Charts/PreserveCharts/inputfile.xlsx | Bin 0 -> 14252 bytes .../Charts/PreserveCharts/outputfile.xlsx | Bin 0 -> 14236 bytes .../Other/Drawings/Comments/inputfile.xlsx | Bin 0 -> 11822 bytes .../Other/Drawings/NoDrawings/outputfile.xlsx | Bin 0 -> 7756 bytes .../WorkbookWithExternalLink.xlsx | Bin 0 -> 9618 bytes .../Other/InlineStrings/inputfile.xlsx | Bin 0 -> 8671 bytes .../Other/InlineStrings/outputfile.xlsx | Bin 0 -> 8679 bytes .../ChangeRichText/inputfile.xlsx | Bin 0 -> 5629 bytes .../ChangeRichTextToFormula/output.xlsx | Bin 0 -> 6481 bytes .../NoActiveSheet/noactive_noselected.xlsx | Bin 0 -> 10077 bytes .../NoActiveSheet/noactive_twoselected.xlsx | Bin 0 -> 10061 bytes .../BlankPivotTableField.xlsx | Bin 0 -> 25542 bytes .../inputfile.xlsx | Bin 0 -> 15129 bytes .../LongText/outputfile.xlsx | Bin 0 -> 12135 bytes .../PivotSubtotalsSource/input.xlsx | Bin 0 -> 14273 bytes .../PivotTableWithNoneTheme/inputfile.xlsx | Bin 0 -> 14952 bytes .../PivotTableWithNoneTheme/outputfile.xlsx | Bin 0 -> 13880 bytes .../SourceSheetWithWhitespace/outputfile.xlsx | Bin 0 -> 11404 bytes .../TwoPivotTablesWithSingleSource/input.xlsx | Bin 0 -> 25295 bytes .../output.xlsx | Bin 0 -> 30015 bytes .../VersioningAttributes/inputfile.xlsx | Bin 0 -> 20968 bytes .../VersioningAttributes/outputfile.xlsx | Bin 0 -> 25179 bytes .../protectstructurewithoutpassword.xlsx | Bin 0 -> 9451 bytes .../protectstructurewithpassword.xlsx | Bin 0 -> 9603 bytes .../SelectedRanges/InvalidSelectedRange.xlsx | Bin 0 -> 6218 bytes .../Sparklines/SparklineThemes/inputfile.xlsx | Bin 0 -> 15597 bytes .../ConditionalFormattingOrder.xlsx | Bin 0 -> 8915 bytes .../ConditionalFormattingOrder/inputfile.xlsx | Bin 0 -> 8448 bytes .../MergedCellsBorder/inputfile.xlsx | Bin 0 -> 10095 bytes .../RowAndColumnStyles/inputfile.xlsx | Bin 0 -> 21635 bytes .../TransparentBackgroundFill.xlsx | Bin 0 -> 9138 bytes .../TransparentBackgroundFill/inputfile.xlsx | Bin 0 -> 9334 bytes .../Resource/TryToLoad/AllShapes.xlsx | Bin 0 -> 18773 bytes .../Resource/TryToLoad/BaseColumnWidth.xlsx | Bin 0 -> 8248 bytes .../TryToLoad/CellWithStringDataType.xlsx | Bin 0 -> 11437 bytes .../Resource/TryToLoad/CommentAndButton.xlsx | Bin 0 -> 11802 bytes .../TryToLoad/CommentsWithIndexedColor81.xlsx | Bin 0 -> 10362 bytes .../Resource/TryToLoad/CopyRowContents.xlsx | Bin 0 -> 11582 bytes .../Resource/TryToLoad/Date1904System.xlsx | Bin 0 -> 9731 bytes .../Resource/TryToLoad/DrawingSizeInPx.xlsx | Bin 0 -> 981840 bytes .../TryToLoad/DuplicateImageNames.xlsx | Bin 0 -> 63764 bytes .../Resource/TryToLoad/EmptyCellValue.xlsx | Bin 0 -> 8999 bytes .../Resource/TryToLoad/EmptyFill.xlsx | Bin 0 -> 5288 bytes .../TryToLoad/EmptyNumberFormatId.xlsx | Bin 0 -> 8000 bytes .../Resource/TryToLoad/EmptyTable.xlsx | Bin 0 -> 12774 bytes .../Resource/TryToLoad/EscapedApostrophe.xlsx | Bin 0 -> 17852 bytes .../ExcelProducedWorkbookWithImages.xlsx | Bin 0 -> 153686 bytes .../Resource/TryToLoad/FileWithButton.xlsm | Bin 0 -> 11795 bytes .../FileWithDefaultStyleNameNotInEnglish.xlsx | Bin 0 -> 9698 bytes .../FileWithMismatchSheetIdAndRelId.xlsx | Bin 0 -> 9045 bytes .../FilterPrivacyEnabledWorkbook.xlsx | Bin 0 -> 6180 bytes .../TryToLoad/HorizontalAlignment.xlsx | Bin 0 -> 12100 bytes .../TryToLoad/InvalidFirstPageNumber.xlsx | Bin 0 -> 8916 bytes .../Resource/TryToLoad/InvalidPrintArea.xlsx | Bin 0 -> 13778 bytes .../TryToLoad/InvalidPrintTitles.xlsx | Bin 0 -> 426597 bytes .../TryToLoad/InvalidPrintTitles2.xlsx | Bin 0 -> 25314 bytes .../LO/xlsm/pass/CVE-2016-0122-1.xlsm | Bin 0 -> 1837365 bytes .../Resource/TryToLoad/LO/xlsm/tdf111974.xlsm | Bin 0 -> 338812 bytes .../TryToLoad/LO/xlsm/vba-user-function.xlsm | Bin 0 -> 13111 bytes .../LO/xlsx/ProtecteSheet1234Pass.xlsx | Bin 0 -> 7768 bytes .../Resource/TryToLoad/LO/xlsx/TextColor.xlsx | Bin 0 -> 9531 bytes .../TryToLoad/LO/xlsx/activex_checkbox.xlsx | Bin 0 -> 12433 bytes .../TryToLoad/LO/xlsx/autofilter.xlsx | Bin 0 -> 6299 bytes .../Resource/TryToLoad/LO/xlsx/bnc762542.xlsx | Bin 0 -> 12106 bytes .../Resource/TryToLoad/LO/xlsx/bug-fixes.xlsx | Bin 0 -> 5795 bytes .../TryToLoad/LO/xlsx/built-in_ranges.xlsx | Bin 0 -> 10164 bytes .../TryToLoad/LO/xlsx/ceiling-floor.xlsx | Bin 0 -> 14300 bytes .../LO/xlsx/cell-anchored-hidden-shapes.xlsx | Bin 0 -> 121247 bytes .../TryToLoad/LO/xlsx/cell-borders.xlsx | Bin 0 -> 20972 bytes .../TryToLoad/LO/xlsx/cell-value.xlsx | Bin 0 -> 7697 bytes .../TryToLoad/LO/xlsx/check-boolean.xlsx | Bin 0 -> 4659 bytes .../TryToLoad/LO/xlsx/colorscale.xlsx | Bin 0 -> 5888 bytes .../LO/xlsx/colorscale_num_with_ref.xlsx | Bin 0 -> 7939 bytes .../LO/xlsx/column-style-autofilter.xlsx | Bin 0 -> 396312 bytes .../TryToLoad/LO/xlsx/column-style.xlsx | Bin 0 -> 8621 bytes .../TryToLoad/LO/xlsx/column_style.xlsx | Bin 0 -> 4646 bytes .../TryToLoad/LO/xlsx/complex_icon_set.xlsx | Bin 0 -> 9189 bytes .../LO/xlsx/cond_format_formula_listener.xlsx | Bin 0 -> 8545 bytes .../LO/xlsx/cond_format_theme_color2.xlsx | Bin 0 -> 8470 bytes .../LO/xlsx/cond_format_theme_color3.xlsx | Bin 0 -> 8530 bytes .../TryToLoad/LO/xlsx/cond_parent.xlsx | Bin 0 -> 8207 bytes .../LO/xlsx/condformat_theme_color.xlsx | Bin 0 -> 8937 bytes .../Resource/TryToLoad/LO/xlsx/customxml.xlsx | Bin 0 -> 13282 bytes .../LO/xlsx/data-table/multi-table.xlsx | Bin 0 -> 9578 bytes .../LO/xlsx/data-table/one-variable.xlsx | Bin 0 -> 9018 bytes .../Resource/TryToLoad/LO/xlsx/databar.xlsx | Bin 0 -> 5075 bytes .../Resource/TryToLoad/LO/xlsx/database.xlsx | Bin 0 -> 7823 bytes .../different-column-width-excel2010.xlsx | Bin 0 -> 5818 bytes .../TryToLoad/LO/xlsx/empty-noconf.xlsx | Bin 0 -> 4152 bytes .../Resource/TryToLoad/LO/xlsx/empty.xlsx | Bin 0 -> 5221 bytes .../LO/xlsx/enhanced-protection.xlsx | Bin 0 -> 8483 bytes .../TryToLoad/LO/xlsx/external-refs.xlsx | Bin 0 -> 9172 bytes .../Resource/TryToLoad/LO/xlsx/fontSize.xlsx | Bin 0 -> 9883 bytes .../Resource/TryToLoad/LO/xlsx/formats.xlsx | Bin 0 -> 9295 bytes .../LO/xlsx/functions-excel-2010.xlsx | Bin 0 -> 21127 bytes .../TryToLoad/LO/xlsx/hiddenShape.xlsx | Bin 0 -> 8445 bytes .../TryToLoad/LO/xlsx/hidden_sheets.xlsx | Bin 0 -> 6124 bytes .../Resource/TryToLoad/LO/xlsx/hyperlink.xlsx | Bin 0 -> 9833 bytes .../TryToLoad/LO/xlsx/hyperlinks.xlsx | Bin 0 -> 9068 bytes .../LO/xlsx/matrix-multiplication.xlsx | Bin 0 -> 8849 bytes .../TryToLoad/LO/xlsx/miscrowheights.xlsx | Bin 0 -> 8522 bytes .../LO/xlsx/named-ranges-global.xlsx | Bin 0 -> 5664 bytes .../LO/xlsx/new_cond_format_test.xlsx | Bin 0 -> 11254 bytes .../LO/xlsx/new_cond_format_test_export.xlsx | Bin 0 -> 11254 bytes .../TryToLoad/LO/xlsx/page_scale.xlsx | Bin 0 -> 4243 bytes .../pivot-table/many-fields-in-cache.xlsx | Bin 0 -> 12622 bytes .../LO/xlsx/pivot-table/shared-dategroup.xlsx | Bin 0 -> 17540 bytes .../xlsx/pivot-table/shared-group-field.xlsx | Bin 0 -> 20180 bytes .../pivot-table/shared-nested-dategroup.xlsx | Bin 0 -> 19160 bytes .../LO/xlsx/pivot-table/shared-numgroup.xlsx | Bin 0 -> 17830 bytes .../LO/xlsx/pivot-table/two-data-fields.xlsx | Bin 0 -> 12287 bytes .../with-strings-integers-and-dates.xlsx | Bin 0 -> 13139 bytes .../LO/xlsx/pivot_table_first_header_row.xlsx | Bin 0 -> 15705 bytes .../LO/xlsx/pivottable_bool_field_filter.xlsx | Bin 0 -> 16583 bytes .../LO/xlsx/pivottable_date_field_filter.xlsx | Bin 0 -> 16402 bytes .../xlsx/pivottable_double_field_filter.xlsx | Bin 0 -> 18252 bytes .../pivottable_duplicated_member_filter.xlsx | Bin 0 -> 16912 bytes .../LO/xlsx/pivottable_error_item_filter.xlsx | Bin 0 -> 12459 bytes .../LO/xlsx/pivottable_outline_mode.xlsx | Bin 0 -> 12178 bytes .../pivottable_rowcolpage_field_filter.xlsx | Bin 0 -> 15511 bytes .../xlsx/pivottable_string_field_filter.xlsx | Bin 0 -> 15330 bytes .../LO/xlsx/pivottable_tabular_mode.xlsx | Bin 0 -> 17373 bytes .../LO/xlsx/preserve-whitespace.xlsx | Bin 0 -> 10859 bytes .../TryToLoad/LO/xlsx/preserve_space.xlsx | Bin 0 -> 7175 bytes .../TryToLoad/LO/xlsx/ref_string.xlsx | Bin 0 -> 8026 bytes .../TryToLoad/LO/xlsx/row-index-1-based.xlsx | Bin 0 -> 6237 bytes .../LO/xlsx/shared-formula/3d-reference.xlsx | Bin 0 -> 9455 bytes .../LO/xlsx/shared-formula/basic.xlsx | Bin 0 -> 8984 bytes .../LO/xlsx/shared-formula/text-results.xlsx | Bin 0 -> 8576 bytes .../TryToLoad/LO/xlsx/sheet-names.xlsx | Bin 0 -> 9425 bytes .../TryToLoad/LO/xlsx/sheet-tab-color.xlsx | Bin 0 -> 8408 bytes .../TryToLoad/LO/xlsx/singlecontrol.xlsx | Bin 0 -> 17915 bytes .../TryToLoad/LO/xlsx/strike-through.xlsx | Bin 0 -> 8914 bytes .../Resource/TryToLoad/LO/xlsx/tdf100709.xlsx | Bin 0 -> 4583 bytes .../TryToLoad/LO/xlsx/tdf104310-2.xlsx | Bin 0 -> 8103 bytes .../Resource/TryToLoad/LO/xlsx/tdf104310.xlsx | Bin 0 -> 4668 bytes .../LO/xlsx/tdf105840_allRowsHidden.xlsx | Bin 0 -> 7015 bytes .../Resource/TryToLoad/LO/xlsx/tdf110440.xlsx | Bin 0 -> 11318 bytes .../Resource/TryToLoad/LO/xlsx/tdf111876.xlsx | Bin 0 -> 9019 bytes .../Resource/TryToLoad/LO/xlsx/tdf112106.xlsx | Bin 0 -> 13492 bytes .../Resource/TryToLoad/LO/xlsx/tdf81939.xlsx | Bin 0 -> 9120 bytes .../Resource/TryToLoad/LO/xlsx/tdf83672.xlsx | Bin 0 -> 40167 bytes .../LO/xlsx/tdf89139_pivot_table.xlsx | Bin 0 -> 15483 bytes .../TryToLoad/LO/xlsx/tdf97598_scenarios.xlsx | Bin 0 -> 8400 bytes .../LO/xlsx/textbox-CharKerningSpace.xlsx | Bin 0 -> 9603 bytes .../xlsx/textbox-CondensedCharacterSpace.xlsx | Bin 0 -> 9577 bytes .../TryToLoad/LO/xlsx/textbox-hyperlink.xlsx | Bin 0 -> 9943 bytes .../track-changes/simple-cell-changes.xlsx | Bin 0 -> 15414 bytes .../TryToLoad/LO/xlsx/underlineColor.xlsx | Bin 0 -> 9915 bytes .../LO/xlsx/universal-content-strict.xlsx | Bin 0 -> 14290 bytes .../TryToLoad/LO/xlsx/universal-content.xlsx | Bin 0 -> 7296 bytes .../TryToLoad/LO/xlsx/writingMode.xlsx | Bin 0 -> 9485 bytes .../TryToLoad/LO/xlsx/xf_default_values.xlsx | Bin 0 -> 11280 bytes .../TryToLoad/LibreOfficeFileWithDates.xlsx | Bin 0 -> 4761 bytes .../LoadFileWithCustomSheetViews.xlsx | Bin 0 -> 83878 bytes .../LoadImageWithoutTransform2D.xlsx | Bin 0 -> 26453 bytes .../Resource/TryToLoad/LoadPivotTables.xlsx | Bin 0 -> 19191 bytes .../TryToLoad/LoadSheetsWithCommas.xlsx | Bin 0 -> 9483 bytes .../NamedRangeWithInvalidCharacter.xlsx | Bin 0 -> 8309 bytes .../TryToLoad/NoReferencesOnRowsOrCells.xlsx | Bin 0 -> 4395 bytes .../PivotTableWithMissingReference.xlsx | Bin 0 -> 46771 bytes .../TryToLoad/PivotTableWithTableSource.xlsx | Bin 0 -> 15592 bytes .../PrintAreaRefersToExternalWorksheet.xlsx | Bin 0 -> 10102 bytes .../TryToLoad/SHA512PasswordProtection.xlsx | Bin 0 -> 9431 bytes .../TryToLoad/SingleRowAutoFilter.xlsx | Bin 0 -> 8693 bytes .../TryToLoad/TableHeadersWithLineBreaks.xlsx | Bin 0 -> 11143 bytes .../TryToLoad/TableWithCustomTheme.xlsx | Bin 0 -> 11373 bytes .../Resource/TryToLoad/TableWithNameNull.xlsx | Bin 0 -> 9223 bytes .../TemplateWithTableSourcePivotTables.xlsx | Bin 0 -> 235954 bytes ClosedXML_Tests/TestHelper.cs | 164 + ClosedXML_Tests/Utils/ExcelDocsComparer.cs | 38 + ClosedXML_Tests/Utils/PackageHelper.cs | 534 ++ .../Utils/ResourceFileExtractor.cs | 252 + ClosedXML_Tests/Utils/StreamHelper.cs | 200 + ClosedXML_Tests/Utils/TemporaryFile.cs | 37 + ClosedXML_Tests/XLHelperTests.cs | 152 + LICENSE | 29 +- README.md | 53 +- appveyor.yml | 61 + resources/logo/favicon-01.png | Bin 0 -> 26393 bytes resources/logo/favicon-01.svg | 17 + resources/logo/favicon-02.png | Bin 0 -> 26343 bytes resources/logo/favicon-02.svg | 17 + resources/logo/favicon-03.png | Bin 0 -> 29596 bytes resources/logo/favicon-03.svg | 18 + resources/logo/favicon-04.png | Bin 0 -> 28570 bytes resources/logo/favicon-04.svg | 18 + resources/logo/logotype-a-05.png | Bin 0 -> 41115 bytes resources/logo/logotype-a-05.svg | 61 + resources/logo/logotype-a-06.png | Bin 0 -> 41164 bytes resources/logo/logotype-a-06.svg | 59 + resources/logo/logotype-a-07.png | Bin 0 -> 41726 bytes resources/logo/logotype-a-07.svg | 58 + resources/logo/logotype-a-08.png | Bin 0 -> 39423 bytes resources/logo/logotype-a-08.svg | 60 + resources/logo/logotype-b-09.png | Bin 0 -> 32231 bytes resources/logo/logotype-b-09.svg | 55 + resources/logo/logotype-b-10.png | Bin 0 -> 32429 bytes resources/logo/logotype-b-10.svg | 54 + resources/logo/logotype-b-11.png | Bin 0 -> 32825 bytes resources/logo/logotype-b-11.svg | 56 + resources/logo/logotype-b-12.png | Bin 0 -> 31305 bytes resources/logo/logotype-b-12.svg | 57 + resources/logo/nuget-logo.png | Bin 0 -> 30836 bytes resources/logo/readme.png | Bin 0 -> 7660 bytes 1092 files changed, 97270 insertions(+), 408 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 CONTRIBUTING.md create mode 100644 ClosedXML.Examples/Examples/Created/AddingComments.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/AddingDataSet.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/AddingDataTableAsWorksheet.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/AddingRowToTables.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/AdjustToContents.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/AdjustToContentsWithAutoFilter.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/AutoFilter.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/BasicTable.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/BasicTable_Modified.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/BlankCells.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/CellMoves.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/CellValues.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/ClearingRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/Collections.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/ColumnCells.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/ColumnCollection.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/ColumnSettings.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/CopyingRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/CopyingRowsAndColumns.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/CopyingWorksheets.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/DataTypes.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/DataTypesUnderDifferentCulture.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/DataValidation.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/DefaultStyles.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/DefiningRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/DeletingColumns.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/DeletingRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/Formulas.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/FreezePanes.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/HeaderFooters.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/HelloWorld.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/HideSheets.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/HideUnhide.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/Hyperlinks.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/InsertColumns.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/InsertRows.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/InsertingData.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/InsertingDeletingColumns.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/InsertingDeletingRows.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/InsertingTables.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/LambdaExpressions.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/Margins.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/MergedCells.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/MergedMoves.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/MultipleRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/MultipleSheets.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/NamedRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/Outline.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/Page.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/PivotTables.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/ResizingTables.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/RightToLeft.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/RowCells.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/RowCollection.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/RowSettings.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/SheetProtection.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/SheetTab.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/SheetViews.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/Sheets.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/ShiftingFormulas.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/ShiftingRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/ShowCase.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/SortExample.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/Sorting.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/StyleRowsColumns.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/StyleWorksheet.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/TabColors.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/TransposeRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/TransposeRangesPlus.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/TwoPages.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/UsingColors.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/UsingPhonetics.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/UsingRichText.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/UsingTables.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/WorkbookProperties.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/styleAlignment.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/styleBorder.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/styleFill.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/styleFont.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/styleIncludeQuotePrefix.xlsx create mode 100644 ClosedXML.Examples/Examples/Created/styleNumberFormat.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/AddingComments.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/AddingDataSet.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/AddingDataTableAsWorksheet.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/AddingRowToTables.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/AdjustToContents.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/AdjustToContentsWithAutoFilter.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/AutoFilter.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/BasicTable.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/BasicTable_Modified.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/BlankCells.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/CellMoves.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/CellValues.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/ClearingRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/Collections.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/ColumnCells.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/ColumnCollection.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/ColumnSettings.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/CopyingRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/CopyingRowsAndColumns.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/CopyingWorksheets.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/DataTypes.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/DataTypesUnderDifferentCulture.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/DataValidation.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/DefaultStyles.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/DefiningRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/DeletingColumns.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/DeletingRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/Formulas.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/FreezePanes.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/HeaderFooters.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/HelloWorld.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/HideSheets.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/HideUnhide.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/Hyperlinks.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/InsertColumns.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/InsertRows.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/InsertingData.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/InsertingDeletingColumns.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/InsertingDeletingRows.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/InsertingTables.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/LambdaExpressions.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/Margins.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/MergedCells.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/MergedMoves.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/MultipleRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/MultipleSheets.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/NamedRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/Outline.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/Page.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/PivotTables.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/ResizingTables.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/RightToLeft.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/RowCells.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/RowCollection.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/RowSettings.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/SheetProtection.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/SheetTab.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/SheetViews.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/Sheets.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/ShiftingFormulas.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/ShiftingRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/ShowCase.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/SortExample.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/Sorting.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/StyleRowsColumns.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/StyleWorksheet.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/TabColors.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/TransposeRanges.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/TransposeRangesPlus.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/TwoPages.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/UsingColors.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/UsingPhonetics.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/UsingRichText.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/UsingTables.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/WorkbookProperties.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/styleAlignment.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/styleBorder.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/styleFill.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/styleFont.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/styleIncludeQuotePrefix.xlsx create mode 100644 ClosedXML.Examples/Examples/Modified/styleNumberFormat.xlsx create mode 100644 ClosedXML.sln create mode 100644 ClosedXML/Attributes/XLColumnAttribute.cs create mode 100644 ClosedXML/ClosedXML.csproj create mode 100644 ClosedXML/ClosedXML.nuspec create mode 100644 ClosedXML/ClosedXML.snk create mode 100644 ClosedXML/Excel/AutoFilters/IXLAutoFilter.cs create mode 100644 ClosedXML/Excel/AutoFilters/IXLCustomFilteredColumn.cs create mode 100644 ClosedXML/Excel/AutoFilters/IXLFilterColumn.cs create mode 100644 ClosedXML/Excel/AutoFilters/IXLFilterConnector.cs create mode 100644 ClosedXML/Excel/AutoFilters/IXLFilteredColumn.cs create mode 100644 ClosedXML/Excel/AutoFilters/XLAutoFilter.cs create mode 100644 ClosedXML/Excel/AutoFilters/XLCustomFilteredColumn.cs create mode 100644 ClosedXML/Excel/AutoFilters/XLDateTimeGroupFilteredColumn.cs create mode 100644 ClosedXML/Excel/AutoFilters/XLFilter.cs create mode 100644 ClosedXML/Excel/AutoFilters/XLFilterColumn.cs create mode 100644 ClosedXML/Excel/AutoFilters/XLFilterConnector.cs create mode 100644 ClosedXML/Excel/AutoFilters/XLFilteredColumn.cs create mode 100644 ClosedXML/Excel/Caching/IXLRepository.cs create mode 100644 ClosedXML/Excel/Caching/XLAlignmentRepository.cs create mode 100644 ClosedXML/Excel/Caching/XLBorderRepository.cs create mode 100644 ClosedXML/Excel/Caching/XLColorRepository.cs create mode 100644 ClosedXML/Excel/Caching/XLFillRepository.cs create mode 100644 ClosedXML/Excel/Caching/XLFontRepository.cs create mode 100644 ClosedXML/Excel/Caching/XLNumberFormatRepository.cs create mode 100644 ClosedXML/Excel/Caching/XLProtectionRepository.cs create mode 100644 ClosedXML/Excel/Caching/XLRangeRepository.cs create mode 100644 ClosedXML/Excel/Caching/XLRepositoryBase.cs create mode 100644 ClosedXML/Excel/Caching/XLStyleRepository.cs create mode 100644 ClosedXML/Excel/Caching/XLWorkbookElementRepositoryBase.cs create mode 100644 ClosedXML/Excel/CalcEngine/CalcEngine.cs create mode 100644 ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs create mode 100644 ClosedXML/Excel/CalcEngine/CellRangeReference.cs create mode 100644 ClosedXML/Excel/CalcEngine/Exceptions/CalcEngineException.cs create mode 100644 ClosedXML/Excel/CalcEngine/Exceptions/CellReferenceException.cs create mode 100644 ClosedXML/Excel/CalcEngine/Exceptions/CellValueException.cs create mode 100644 ClosedXML/Excel/CalcEngine/Exceptions/DivisionByZeroException.cs create mode 100644 ClosedXML/Excel/CalcEngine/Exceptions/NameNotRecognizedException.cs create mode 100644 ClosedXML/Excel/CalcEngine/Exceptions/NoValueAvailableException.cs create mode 100644 ClosedXML/Excel/CalcEngine/Exceptions/NullValueException.cs create mode 100644 ClosedXML/Excel/CalcEngine/Exceptions/NumberException.cs create mode 100644 ClosedXML/Excel/CalcEngine/Expression.cs create mode 100644 ClosedXML/Excel/CalcEngine/ExpressionCache.cs create mode 100644 ClosedXML/Excel/CalcEngine/ExpressionParseException.cs create mode 100644 ClosedXML/Excel/CalcEngine/FunctionDefinition.cs create mode 100644 ClosedXML/Excel/CalcEngine/Functions/Database.cs create mode 100644 ClosedXML/Excel/CalcEngine/Functions/DateAndTime.cs create mode 100644 ClosedXML/Excel/CalcEngine/Functions/Engineering.cs create mode 100644 ClosedXML/Excel/CalcEngine/Functions/Financial.cs create mode 100644 ClosedXML/Excel/CalcEngine/Functions/Information.cs create mode 100644 ClosedXML/Excel/CalcEngine/Functions/Logical.cs create mode 100644 ClosedXML/Excel/CalcEngine/Functions/Lookup.cs create mode 100644 ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs create mode 100644 ClosedXML/Excel/CalcEngine/Functions/Statistical.cs create mode 100644 ClosedXML/Excel/CalcEngine/Functions/Tally.cs create mode 100644 ClosedXML/Excel/CalcEngine/Functions/Text.cs create mode 100644 ClosedXML/Excel/CalcEngine/Functions/XLMath.cs create mode 100644 ClosedXML/Excel/CalcEngine/Functions/XLMatrix.cs create mode 100644 ClosedXML/Excel/CalcEngine/Token.cs create mode 100644 ClosedXML/Excel/CalcEngine/XLAddressComparer.cs create mode 100644 ClosedXML/Excel/CalcEngine/XLCalcEngine.cs create mode 100644 ClosedXML/Excel/CalcEngine/XLRangeAddressComparer.cs create mode 100644 ClosedXML/Excel/Cells/IXLCell.cs create mode 100644 ClosedXML/Excel/Cells/IXLCells.cs create mode 100644 ClosedXML/Excel/Cells/XLCell.cs create mode 100644 ClosedXML/Excel/Cells/XLCellCopyOptions.cs create mode 100644 ClosedXML/Excel/Cells/XLCells.cs create mode 100644 ClosedXML/Excel/Cells/XLCellsCollection.cs create mode 100644 ClosedXML/Excel/Charts/IXLChart.cs create mode 100644 ClosedXML/Excel/Charts/IXLCharts.cs create mode 100644 ClosedXML/Excel/Charts/XLChart.cs create mode 100644 ClosedXML/Excel/Charts/XLCharts.cs create mode 100644 ClosedXML/Excel/Columns/IXLColumn.cs create mode 100644 ClosedXML/Excel/Columns/IXLColumns.cs create mode 100644 ClosedXML/Excel/Columns/XLColumn.cs create mode 100644 ClosedXML/Excel/Columns/XLColumnCollection.cs create mode 100644 ClosedXML/Excel/Columns/XLColumns.cs create mode 100644 ClosedXML/Excel/Comments/IXLComment.cs create mode 100644 ClosedXML/Excel/Comments/XLComment.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMax.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMid.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMin.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMax.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMin.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/IXLCFIconSet.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/IXLConditionalFormats.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/IXLCFConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/IXLCFConverterExtension.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFBaseConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFCellIsConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFContainsConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFConvertersExtension.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverterExtension.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFDatesOccuringConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFEndsWithConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFIconSetConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFIsBlankConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFIsErrorConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFNotBlankConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFNotContainsConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFNotErrorConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFStartsWithConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFTopConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/Save/XLCFUniqueConverter.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMax.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMid.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMin.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/XLCFDataBarMax.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/XLCFDataBarMin.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/XLCFIconSet.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs create mode 100644 ClosedXML/Excel/ConditionalFormats/XLConditionalFormats.cs create mode 100644 ClosedXML/Excel/ContentManagers/XLBaseContentManager.cs create mode 100644 ClosedXML/Excel/ContentManagers/XLSheetViewContentManager.cs create mode 100644 ClosedXML/Excel/ContentManagers/XLWorksheetContentManager.cs create mode 100644 ClosedXML/Excel/Coordinates/IXLAddress.cs create mode 100644 ClosedXML/Excel/Coordinates/XLAddress.cs create mode 100644 ClosedXML/Excel/Coordinates/XLSheetPoint.cs create mode 100644 ClosedXML/Excel/Coordinates/XLSheetRange.cs create mode 100644 ClosedXML/Excel/CustomProperties/IXLCustomProperties.cs create mode 100644 ClosedXML/Excel/CustomProperties/IXLCustomProperty.cs create mode 100644 ClosedXML/Excel/CustomProperties/XLCustomProperties.cs create mode 100644 ClosedXML/Excel/CustomProperties/XLCustomProperty.cs create mode 100644 ClosedXML/Excel/DataValidation/IXLDataValidation.cs create mode 100644 ClosedXML/Excel/DataValidation/IXLDataValidations.cs create mode 100644 ClosedXML/Excel/DataValidation/IXLValidationCriteria.cs create mode 100644 ClosedXML/Excel/DataValidation/XLDataValidation.cs create mode 100644 ClosedXML/Excel/DataValidation/XLDataValidations.cs create mode 100644 ClosedXML/Excel/DataValidation/XLDateCriteria.cs create mode 100644 ClosedXML/Excel/DataValidation/XLDecimalCriteria.cs create mode 100644 ClosedXML/Excel/DataValidation/XLTextLengthCriteria.cs create mode 100644 ClosedXML/Excel/DataValidation/XLTimeCriteria.cs create mode 100644 ClosedXML/Excel/DataValidation/XLValidationCriteria.cs create mode 100644 ClosedXML/Excel/DataValidation/XLWholeNumberCriteria.cs create mode 100644 ClosedXML/Excel/Drawings/IXLDrawing.cs create mode 100644 ClosedXML/Excel/Drawings/IXLDrawingPosition.cs create mode 100644 ClosedXML/Excel/Drawings/IXLPicture.cs create mode 100644 ClosedXML/Excel/Drawings/IXLPictures.cs create mode 100644 ClosedXML/Excel/Drawings/PictureEnums.cs create mode 100644 ClosedXML/Excel/Drawings/Style/IXLDrawingAlignment.cs create mode 100644 ClosedXML/Excel/Drawings/Style/IXLDrawingColorsAndLines.cs create mode 100644 ClosedXML/Excel/Drawings/Style/IXLDrawingFont.cs create mode 100644 ClosedXML/Excel/Drawings/Style/IXLDrawingMargins.cs create mode 100644 ClosedXML/Excel/Drawings/Style/IXLDrawingProperties.cs create mode 100644 ClosedXML/Excel/Drawings/Style/IXLDrawingProtection.cs create mode 100644 ClosedXML/Excel/Drawings/Style/IXLDrawingSize.cs create mode 100644 ClosedXML/Excel/Drawings/Style/IXLDrawingStyle.cs create mode 100644 ClosedXML/Excel/Drawings/Style/IXLDrawingWeb.cs create mode 100644 ClosedXML/Excel/Drawings/Style/XLDrawingAlignment.cs create mode 100644 ClosedXML/Excel/Drawings/Style/XLDrawingColorsAndLines.cs create mode 100644 ClosedXML/Excel/Drawings/Style/XLDrawingFont.cs create mode 100644 ClosedXML/Excel/Drawings/Style/XLDrawingMargins.cs create mode 100644 ClosedXML/Excel/Drawings/Style/XLDrawingProperties.cs create mode 100644 ClosedXML/Excel/Drawings/Style/XLDrawingProtection.cs create mode 100644 ClosedXML/Excel/Drawings/Style/XLDrawingSize.cs create mode 100644 ClosedXML/Excel/Drawings/Style/XLDrawingStyle.cs create mode 100644 ClosedXML/Excel/Drawings/Style/XLDrawingWeb.cs create mode 100644 ClosedXML/Excel/Drawings/XLDrawing.cs create mode 100644 ClosedXML/Excel/Drawings/XLDrawingPosition.cs create mode 100644 ClosedXML/Excel/Drawings/XLMarker.cs create mode 100644 ClosedXML/Excel/Drawings/XLPicture.cs create mode 100644 ClosedXML/Excel/Drawings/XLPictures.cs create mode 100644 ClosedXML/Excel/EnumConverter.cs create mode 100644 ClosedXML/Excel/Exceptions/ClosedXMLException.cs create mode 100644 ClosedXML/Excel/Exceptions/EmptyTableException.cs create mode 100644 ClosedXML/Excel/Hyperlinks/IXLHyperlinks.cs create mode 100644 ClosedXML/Excel/Hyperlinks/XLHyperlink_Internal.cs create mode 100644 ClosedXML/Excel/Hyperlinks/XLHyperlink_public.cs create mode 100644 ClosedXML/Excel/Hyperlinks/XLHyperlinks.cs create mode 100644 ClosedXML/Excel/IXLFileSharing.cs create mode 100644 ClosedXML/Excel/IXLOutline.cs create mode 100644 ClosedXML/Excel/IXLSheetView.cs create mode 100644 ClosedXML/Excel/IXLTheme.cs create mode 100644 ClosedXML/Excel/IXLWorkbook.cs create mode 100644 ClosedXML/Excel/IXLWorksheet.cs create mode 100644 ClosedXML/Excel/IXLWorksheets.cs create mode 100644 ClosedXML/Excel/LoadOptions.cs create mode 100644 ClosedXML/Excel/Misc/XLDictionary.cs create mode 100644 ClosedXML/Excel/Misc/XLFormula.cs create mode 100644 ClosedXML/Excel/Misc/XLIdManager.cs create mode 100644 ClosedXML/Excel/NamedRanges/IXLNamedRange.cs create mode 100644 ClosedXML/Excel/NamedRanges/IXLNamedRanges.cs create mode 100644 ClosedXML/Excel/NamedRanges/XLNamedRange.cs create mode 100644 ClosedXML/Excel/NamedRanges/XLNamedRanges.cs create mode 100644 ClosedXML/Excel/PageSetup/IXLHFItem.cs create mode 100644 ClosedXML/Excel/PageSetup/IXLHeaderFooter.cs create mode 100644 ClosedXML/Excel/PageSetup/IXLMargins.cs create mode 100644 ClosedXML/Excel/PageSetup/IXLPageSetup.cs create mode 100644 ClosedXML/Excel/PageSetup/IXLPrintAreas.cs create mode 100644 ClosedXML/Excel/PageSetup/XLHFItem.cs create mode 100644 ClosedXML/Excel/PageSetup/XLHFText.cs create mode 100644 ClosedXML/Excel/PageSetup/XLHeaderFooter.cs create mode 100644 ClosedXML/Excel/PageSetup/XLMargins.cs create mode 100644 ClosedXML/Excel/PageSetup/XLPageSetup.cs create mode 100644 ClosedXML/Excel/PageSetup/XLPrintAreas.cs create mode 100644 ClosedXML/Excel/Patterns/Quadrant.cs create mode 100644 ClosedXML/Excel/PivotTables/IXLPivotField.cs create mode 100644 ClosedXML/Excel/PivotTables/IXLPivotFields.cs create mode 100644 ClosedXML/Excel/PivotTables/IXLPivotTable.cs create mode 100644 ClosedXML/Excel/PivotTables/IXLPivotTables.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotStyleFormats/AbstractPivotFieldReference.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotFieldStyleFormats.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotStyleFormat.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotStyleFormats.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotTableStyleFormats.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotValueStyleFormat.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotStyleFormats/PivotLabelFieldReference.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotStyleFormats/PivotValueFieldReference.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotFieldStyleFormats.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotStyleFormat.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotStyleFormatEnums.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotStyleFormats.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotTableStyleFormats.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotValueStyleFormat.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValue.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueCombination.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueFormat.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValues.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotValues/XLPivotValue.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueCombination.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueFormat.cs create mode 100644 ClosedXML/Excel/PivotTables/PivotValues/XLPivotValues.cs create mode 100644 ClosedXML/Excel/PivotTables/XLPivotAreaValues.cs create mode 100644 ClosedXML/Excel/PivotTables/XLPivotField.cs create mode 100644 ClosedXML/Excel/PivotTables/XLPivotFields.cs create mode 100644 ClosedXML/Excel/PivotTables/XLPivotTable.cs create mode 100644 ClosedXML/Excel/PivotTables/XLPivotTables.cs create mode 100644 ClosedXML/Excel/Protection/IXLElementProtection.cs create mode 100644 ClosedXML/Excel/Protection/IXLProtectable.cs create mode 100644 ClosedXML/Excel/Protection/IXLSheetProtection.cs create mode 100644 ClosedXML/Excel/Protection/IXLWorkbookProtection.cs create mode 100644 ClosedXML/Excel/Protection/XLProtectionAlgorithm.cs create mode 100644 ClosedXML/Excel/Protection/XLSheetProtection.cs create mode 100644 ClosedXML/Excel/Protection/XLSheetProtectionElements.cs create mode 100644 ClosedXML/Excel/Protection/XLWorkbookProtection.cs create mode 100644 ClosedXML/Excel/Protection/XLWorkbookProtectionElements.cs create mode 100644 ClosedXML/Excel/Ranges/IXLAddressable.cs create mode 100644 ClosedXML/Excel/Ranges/IXLBaseCollection.cs create mode 100644 ClosedXML/Excel/Ranges/IXLRange.cs create mode 100644 ClosedXML/Excel/Ranges/IXLRangeAddress.cs create mode 100644 ClosedXML/Excel/Ranges/IXLRangeBase.cs create mode 100644 ClosedXML/Excel/Ranges/IXLRangeColumn.cs create mode 100644 ClosedXML/Excel/Ranges/IXLRangeColumns.cs create mode 100644 ClosedXML/Excel/Ranges/IXLRangeRow.cs create mode 100644 ClosedXML/Excel/Ranges/IXLRangeRows.cs create mode 100644 ClosedXML/Excel/Ranges/IXLRanges.cs create mode 100644 ClosedXML/Excel/Ranges/Index/IXLRangeIndex.cs create mode 100644 ClosedXML/Excel/Ranges/Index/XLRangeIndex.cs create mode 100644 ClosedXML/Excel/Ranges/Sort/IXLSortElement.cs create mode 100644 ClosedXML/Excel/Ranges/Sort/IXLSortElements.cs create mode 100644 ClosedXML/Excel/Ranges/Sort/XLSortElement.cs create mode 100644 ClosedXML/Excel/Ranges/Sort/XLSortElements.cs create mode 100644 ClosedXML/Excel/Ranges/XLRange.cs create mode 100644 ClosedXML/Excel/Ranges/XLRangeAddress.cs create mode 100644 ClosedXML/Excel/Ranges/XLRangeBase.cs create mode 100644 ClosedXML/Excel/Ranges/XLRangeColumn.cs create mode 100644 ClosedXML/Excel/Ranges/XLRangeColumns.cs create mode 100644 ClosedXML/Excel/Ranges/XLRangeConsolidationEngine.cs create mode 100644 ClosedXML/Excel/Ranges/XLRangeFactory.cs create mode 100644 ClosedXML/Excel/Ranges/XLRangeKey.cs create mode 100644 ClosedXML/Excel/Ranges/XLRangeParameters.cs create mode 100644 ClosedXML/Excel/Ranges/XLRangeRow.cs create mode 100644 ClosedXML/Excel/Ranges/XLRangeRows.cs create mode 100644 ClosedXML/Excel/Ranges/XLRangeType.cs create mode 100644 ClosedXML/Excel/Ranges/XLRanges.cs create mode 100644 ClosedXML/Excel/RichText/IXLFormattedText.cs create mode 100644 ClosedXML/Excel/RichText/IXLPhonetic.cs create mode 100644 ClosedXML/Excel/RichText/IXLPhonetics.cs create mode 100644 ClosedXML/Excel/RichText/IXLRichString.cs create mode 100644 ClosedXML/Excel/RichText/IXLRichText.cs create mode 100644 ClosedXML/Excel/RichText/XLFormattedText.cs create mode 100644 ClosedXML/Excel/RichText/XLPhonetic.cs create mode 100644 ClosedXML/Excel/RichText/XLPhonetics.cs create mode 100644 ClosedXML/Excel/RichText/XLRichString.cs create mode 100644 ClosedXML/Excel/RichText/XLRichText.cs create mode 100644 ClosedXML/Excel/Rows/IXLRow.cs create mode 100644 ClosedXML/Excel/Rows/IXLRows.cs create mode 100644 ClosedXML/Excel/Rows/XLRow.cs create mode 100644 ClosedXML/Excel/Rows/XLRowCollection.cs create mode 100644 ClosedXML/Excel/Rows/XLRows.cs create mode 100644 ClosedXML/Excel/SaveOptions.cs create mode 100644 ClosedXML/Excel/Sparkline/IXLSparkLineGroup.cs create mode 100644 ClosedXML/Excel/Sparkline/IXLSparkLineGroups.cs create mode 100644 ClosedXML/Excel/Sparkline/IXLSparkline.cs create mode 100644 ClosedXML/Excel/Sparkline/IXLSparklineHorizontalAxis.cs create mode 100644 ClosedXML/Excel/Sparkline/IXLSparklineStyle.cs create mode 100644 ClosedXML/Excel/Sparkline/IXLSparklineVerticalAxis.cs create mode 100644 ClosedXML/Excel/Sparkline/XLSparkLine.cs create mode 100644 ClosedXML/Excel/Sparkline/XLSparkLineGroup.cs create mode 100644 ClosedXML/Excel/Sparkline/XLSparkLineGroups.cs create mode 100644 ClosedXML/Excel/Sparkline/XLSparklineHorizontalAxis.cs create mode 100644 ClosedXML/Excel/Sparkline/XLSparklineStyle.cs create mode 100644 ClosedXML/Excel/Sparkline/XLSparklineTheme.cs create mode 100644 ClosedXML/Excel/Sparkline/XLSparklineVerticalAxis.cs create mode 100644 ClosedXML/Excel/Style/Colors/XLColor_Internal.cs create mode 100644 ClosedXML/Excel/Style/Colors/XLColor_Public.cs create mode 100644 ClosedXML/Excel/Style/Colors/XLColor_Static.cs create mode 100644 ClosedXML/Excel/Style/IXLAlignment.cs create mode 100644 ClosedXML/Excel/Style/IXLBorder.cs create mode 100644 ClosedXML/Excel/Style/IXLFill.cs create mode 100644 ClosedXML/Excel/Style/IXLFont.cs create mode 100644 ClosedXML/Excel/Style/IXLFontBase.cs create mode 100644 ClosedXML/Excel/Style/IXLNumberFormat.cs create mode 100644 ClosedXML/Excel/Style/IXLNumberFormatBase.cs create mode 100644 ClosedXML/Excel/Style/IXLProtection.cs create mode 100644 ClosedXML/Excel/Style/IXLStyle.cs create mode 100644 ClosedXML/Excel/Style/IXLStylized.cs create mode 100644 ClosedXML/Excel/Style/XLAlignment.cs create mode 100644 ClosedXML/Excel/Style/XLAlignmentKey.cs create mode 100644 ClosedXML/Excel/Style/XLAlignmentValue.cs create mode 100644 ClosedXML/Excel/Style/XLBorder.cs create mode 100644 ClosedXML/Excel/Style/XLBorderKey.cs create mode 100644 ClosedXML/Excel/Style/XLBorderValue.cs create mode 100644 ClosedXML/Excel/Style/XLColorKey.cs create mode 100644 ClosedXML/Excel/Style/XLFill.cs create mode 100644 ClosedXML/Excel/Style/XLFillKey.cs create mode 100644 ClosedXML/Excel/Style/XLFillValue.cs create mode 100644 ClosedXML/Excel/Style/XLFont.cs create mode 100644 ClosedXML/Excel/Style/XLFontKey.cs create mode 100644 ClosedXML/Excel/Style/XLFontValue.cs create mode 100644 ClosedXML/Excel/Style/XLNumberFormat.cs create mode 100644 ClosedXML/Excel/Style/XLNumberFormatKey.cs create mode 100644 ClosedXML/Excel/Style/XLNumberFormatValue.cs create mode 100644 ClosedXML/Excel/Style/XLPredefinedFormat.cs create mode 100644 ClosedXML/Excel/Style/XLProtection.cs create mode 100644 ClosedXML/Excel/Style/XLProtectionKey.cs create mode 100644 ClosedXML/Excel/Style/XLProtectionValue.cs create mode 100644 ClosedXML/Excel/Style/XLStyle.cs create mode 100644 ClosedXML/Excel/Style/XLStyleKey.cs create mode 100644 ClosedXML/Excel/Style/XLStyleValue.cs create mode 100644 ClosedXML/Excel/Style/XLStylizedBase.cs create mode 100644 ClosedXML/Excel/Style/XLStylizedEmpty.cs create mode 100644 ClosedXML/Excel/Tables/IXLTable.cs create mode 100644 ClosedXML/Excel/Tables/IXLTableField.cs create mode 100644 ClosedXML/Excel/Tables/IXLTableRange.cs create mode 100644 ClosedXML/Excel/Tables/IXLTableRow.cs create mode 100644 ClosedXML/Excel/Tables/IXLTableRows.cs create mode 100644 ClosedXML/Excel/Tables/IXLTables.cs create mode 100644 ClosedXML/Excel/Tables/XLTable.cs create mode 100644 ClosedXML/Excel/Tables/XLTableField.cs create mode 100644 ClosedXML/Excel/Tables/XLTableRange.cs create mode 100644 ClosedXML/Excel/Tables/XLTableRow.cs create mode 100644 ClosedXML/Excel/Tables/XLTableRows.cs create mode 100644 ClosedXML/Excel/Tables/XLTableTheme.cs create mode 100644 ClosedXML/Excel/Tables/XLTables.cs create mode 100644 ClosedXML/Excel/XLCellsUsedOptions.cs create mode 100644 ClosedXML/Excel/XLClearOptions.cs create mode 100644 ClosedXML/Excel/XLConstants.cs create mode 100644 ClosedXML/Excel/XLFileSharing.cs create mode 100644 ClosedXML/Excel/XLOutline.cs create mode 100644 ClosedXML/Excel/XLSheetView.cs create mode 100644 ClosedXML/Excel/XLTheme.cs create mode 100644 ClosedXML/Excel/XLWorkbook.cs create mode 100644 ClosedXML/Excel/XLWorkbookProperties.cs create mode 100644 ClosedXML/Excel/XLWorkbook_ImageHandling.cs create mode 100644 ClosedXML/Excel/XLWorkbook_Load.cs create mode 100644 ClosedXML/Excel/XLWorkbook_Save.NestedTypes.cs create mode 100644 ClosedXML/Excel/XLWorkbook_Save.cs create mode 100644 ClosedXML/Excel/XLWorksheet.cs create mode 100644 ClosedXML/Excel/XLWorksheetInternals.cs create mode 100644 ClosedXML/Excel/XLWorksheets.cs create mode 100644 ClosedXML/Extensions/AttributeExtensions.cs create mode 100644 ClosedXML/Extensions/ColorExtensions.cs create mode 100644 ClosedXML/Extensions/DateTimeExtensions.cs create mode 100644 ClosedXML/Extensions/DecimalExtensions.cs create mode 100644 ClosedXML/Extensions/DictionaryExtensions.cs create mode 100644 ClosedXML/Extensions/DoubleExtensions.cs create mode 100644 ClosedXML/Extensions/DoubleValueExtensions.cs create mode 100644 ClosedXML/Extensions/EnumerableExtensions.cs create mode 100644 ClosedXML/Extensions/FontBaseExtensions.cs create mode 100644 ClosedXML/Extensions/FormatExtensions.cs create mode 100644 ClosedXML/Extensions/GuidExtensions.cs create mode 100644 ClosedXML/Extensions/IntegerExtensions.cs create mode 100644 ClosedXML/Extensions/ListExtensions.cs create mode 100644 ClosedXML/Extensions/ObjectExtensions.cs create mode 100644 ClosedXML/Extensions/OpenXmlPartContainerExtensions.cs create mode 100644 ClosedXML/Extensions/StringExtensions.cs create mode 100644 ClosedXML/Extensions/TypeExtensions.cs create mode 100644 ClosedXML/Extensions/XDocumentExtensions.cs create mode 100644 ClosedXML/FodyWeavers.xml create mode 100644 ClosedXML/FodyWeavers.xsd create mode 100644 ClosedXML/PathHelper.cs create mode 100644 ClosedXML/Properties/AssemblyInfo.cs create mode 100644 ClosedXML/Utils/ColorStringParser.cs create mode 100644 ClosedXML/Utils/CryptographicAlgorithms.cs create mode 100644 ClosedXML/Utils/DescribedEnumParser.cs create mode 100644 ClosedXML/Utils/GraphicsUtils.cs create mode 100644 ClosedXML/Utils/OpenXmlColorTypeAdapters.cs create mode 100644 ClosedXML/Utils/OpenXmlHelper.cs create mode 100644 ClosedXML/Utils/XmlEncoder.cs create mode 100644 ClosedXML/XLHelper.cs create mode 100644 ClosedXML_Examples/AutoFilters/CustomAutoFilter.cs create mode 100644 ClosedXML_Examples/AutoFilters/DateTimeGroupAutoFilter.cs create mode 100644 ClosedXML_Examples/AutoFilters/DynamicAutoFilter.cs create mode 100644 ClosedXML_Examples/AutoFilters/RegularAutoFilter.cs create mode 100644 ClosedXML_Examples/AutoFilters/TopBottomAutoFilter.cs create mode 100644 ClosedXML_Examples/BasicTable.cs create mode 100644 ClosedXML_Examples/ClosedXML.snk create mode 100644 ClosedXML_Examples/ClosedXML_Examples.csproj create mode 100644 ClosedXML_Examples/Columns/ColumnCells.cs create mode 100644 ClosedXML_Examples/Columns/ColumnCollections.cs create mode 100644 ClosedXML_Examples/Columns/ColumnSettings.cs create mode 100644 ClosedXML_Examples/Columns/DeletingColumns.cs create mode 100644 ClosedXML_Examples/Columns/InsertColumns.cs create mode 100644 ClosedXML_Examples/Comments/AddingComments.cs create mode 100644 ClosedXML_Examples/Comments/EditingComments.cs create mode 100644 ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs create mode 100644 ClosedXML_Examples/Creating/CreateFiles.cs create mode 100644 ClosedXML_Examples/Delete/DeleteFewWorksheets.cs create mode 100644 ClosedXML_Examples/Delete/DeleteRows.cs create mode 100644 ClosedXML_Examples/ExampleHelper.cs create mode 100644 ClosedXML_Examples/HelloWorld.cs create mode 100644 ClosedXML_Examples/IXLExample.cs create mode 100644 ClosedXML_Examples/ImageHandling/ImageAnchors.cs create mode 100644 ClosedXML_Examples/ImageHandling/ImageFormats.cs create mode 100644 ClosedXML_Examples/Loading/ChangingBasicTable.cs create mode 100644 ClosedXML_Examples/Loading/LoadFiles.cs create mode 100644 ClosedXML_Examples/Misc/AddingDataSet.cs create mode 100644 ClosedXML_Examples/Misc/AddingDataTableAsWorksheet.cs create mode 100644 ClosedXML_Examples/Misc/AdjustToContents.cs create mode 100644 ClosedXML_Examples/Misc/AdjustToContentsWithAutoFilter.cs create mode 100644 ClosedXML_Examples/Misc/AutoFilter.cs create mode 100644 ClosedXML_Examples/Misc/BlankCells.cs create mode 100644 ClosedXML_Examples/Misc/CellValues.cs create mode 100644 ClosedXML_Examples/Misc/Collections.cs create mode 100644 ClosedXML_Examples/Misc/CopyingRowsAndColumns.cs create mode 100644 ClosedXML_Examples/Misc/CopyingWorksheets.cs create mode 100644 ClosedXML_Examples/Misc/DataTypes.cs create mode 100644 ClosedXML_Examples/Misc/DataTypesUnderDifferentCulture.cs create mode 100644 ClosedXML_Examples/Misc/DataValidation.cs create mode 100644 ClosedXML_Examples/Misc/Formulas.cs create mode 100644 ClosedXML_Examples/Misc/FormulasWithEvaluation.cs create mode 100644 ClosedXML_Examples/Misc/FreezePanes.cs create mode 100644 ClosedXML_Examples/Misc/HideSheets.cs create mode 100644 ClosedXML_Examples/Misc/HideUnhide.cs create mode 100644 ClosedXML_Examples/Misc/Hyperlinks.cs create mode 100644 ClosedXML_Examples/Misc/InsertingData.cs create mode 100644 ClosedXML_Examples/Misc/LambdaExpressions.cs create mode 100644 ClosedXML_Examples/Misc/MergeCells.cs create mode 100644 ClosedXML_Examples/Misc/MergeMoves.cs create mode 100644 ClosedXML_Examples/Misc/MultipleSheets.cs create mode 100644 ClosedXML_Examples/Misc/Outline.cs create mode 100644 ClosedXML_Examples/Misc/RightToLeft.cs create mode 100644 ClosedXML_Examples/Misc/SheetProtection.cs create mode 100644 ClosedXML_Examples/Misc/SheetViews.cs create mode 100644 ClosedXML_Examples/Misc/ShiftingFormulas.cs create mode 100644 ClosedXML_Examples/Misc/ShowCase.cs create mode 100644 ClosedXML_Examples/Misc/TabColors.cs create mode 100644 ClosedXML_Examples/Misc/WorkbookProperties.cs create mode 100644 ClosedXML_Examples/Misc/WorkbookProtection.cs create mode 100644 ClosedXML_Examples/ModifyFiles.cs create mode 100644 ClosedXML_Examples/PageSetup/HeaderFooters.cs create mode 100644 ClosedXML_Examples/PageSetup/Margins.cs create mode 100644 ClosedXML_Examples/PageSetup/Page.cs create mode 100644 ClosedXML_Examples/PageSetup/SheetTab.cs create mode 100644 ClosedXML_Examples/PageSetup/Sheets.cs create mode 100644 ClosedXML_Examples/PageSetup/TwoPages.cs create mode 100644 ClosedXML_Examples/PivotTables/PivotTables.cs create mode 100644 ClosedXML_Examples/Program.cs create mode 100644 ClosedXML_Examples/Ranges/AddingRowToTables.cs create mode 100644 ClosedXML_Examples/Ranges/ClearingRanges.cs create mode 100644 ClosedXML_Examples/Ranges/CopyingRanges.cs create mode 100644 ClosedXML_Examples/Ranges/CurrentRowColumn.cs create mode 100644 ClosedXML_Examples/Ranges/DefiningRanges.cs create mode 100644 ClosedXML_Examples/Ranges/DeletingRanges.cs create mode 100644 ClosedXML_Examples/Ranges/InsertingDeletingColumns.cs create mode 100644 ClosedXML_Examples/Ranges/InsertingDeletingRows.cs create mode 100644 ClosedXML_Examples/Ranges/MultipleRanges.cs create mode 100644 ClosedXML_Examples/Ranges/NamedRanges.cs create mode 100644 ClosedXML_Examples/Ranges/SelectingRanges.cs create mode 100644 ClosedXML_Examples/Ranges/ShiftingRanges.cs create mode 100644 ClosedXML_Examples/Ranges/SortExample.cs create mode 100644 ClosedXML_Examples/Ranges/Sorting.cs create mode 100644 ClosedXML_Examples/Ranges/TransposeRanges.cs create mode 100644 ClosedXML_Examples/Ranges/TransposeRangesPlus.cs create mode 100644 ClosedXML_Examples/Ranges/WalkingRanges.cs create mode 100644 ClosedXML_Examples/Resources/ImageHandling.jpg create mode 100644 ClosedXML_Examples/Resources/ImageHandling.png create mode 100644 ClosedXML_Examples/Resources/SampleImage.jpg create mode 100644 ClosedXML_Examples/Rows/InsertRows.cs create mode 100644 ClosedXML_Examples/Rows/RowCells.cs create mode 100644 ClosedXML_Examples/Rows/RowCollection.cs create mode 100644 ClosedXML_Examples/Rows/RowSettings.cs create mode 100644 ClosedXML_Examples/Sparklines/SampleSparklines.cs create mode 100644 ClosedXML_Examples/StyleExamples.cs create mode 100644 ClosedXML_Examples/Styles/DefaultStyles.cs create mode 100644 ClosedXML_Examples/Styles/PurpleWorksheet.cs create mode 100644 ClosedXML_Examples/Styles/StyleAlignment.cs create mode 100644 ClosedXML_Examples/Styles/StyleBorder.cs create mode 100644 ClosedXML_Examples/Styles/StyleFill.cs create mode 100644 ClosedXML_Examples/Styles/StyleFont.cs create mode 100644 ClosedXML_Examples/Styles/StyleIncludeQuotePrefix.cs create mode 100644 ClosedXML_Examples/Styles/StyleNumberFormat.cs create mode 100644 ClosedXML_Examples/Styles/StyleRowsColumns.cs create mode 100644 ClosedXML_Examples/Styles/StyleWorksheet.cs create mode 100644 ClosedXML_Examples/Styles/UsingColors.cs create mode 100644 ClosedXML_Examples/Styles/UsingPhonetics.cs create mode 100644 ClosedXML_Examples/Styles/UsingRichText.cs create mode 100644 ClosedXML_Examples/Tables/InsertingTables.cs create mode 100644 ClosedXML_Examples/Tables/ResizingTables.cs create mode 100644 ClosedXML_Examples/Tables/UsingTables.cs create mode 100644 ClosedXML_Examples/app.config create mode 100644 ClosedXML_Sandbox/ClosedXML_Sandbox.csproj create mode 100644 ClosedXML_Sandbox/OneRow.cs create mode 100644 ClosedXML_Sandbox/PerformanceRunner.cs create mode 100644 ClosedXML_Sandbox/Program.cs create mode 100644 ClosedXML_Sandbox/ReflectionExtensions.cs create mode 100644 ClosedXML_Sandbox/app.config create mode 100644 ClosedXML_Sandbox/test.xlsx create mode 100644 ClosedXML_Tests/ClosedXML.snk create mode 100644 ClosedXML_Tests/ClosedXML_Tests.csproj create mode 100644 ClosedXML_Tests/Examples/AutoFilterTests.cs create mode 100644 ClosedXML_Tests/Examples/ColumnsTests.cs create mode 100644 ClosedXML_Tests/Examples/CommentsTests.cs create mode 100644 ClosedXML_Tests/Examples/ConditionalFormattingTests.cs create mode 100644 ClosedXML_Tests/Examples/DeleteTests.cs create mode 100644 ClosedXML_Tests/Examples/ImageHandlingTests.cs create mode 100644 ClosedXML_Tests/Examples/LoadingTests.cs create mode 100644 ClosedXML_Tests/Examples/MiscTests.cs create mode 100644 ClosedXML_Tests/Examples/PageSetupTests.cs create mode 100644 ClosedXML_Tests/Examples/PivotTableTests.cs create mode 100644 ClosedXML_Tests/Examples/RangesTests.cs create mode 100644 ClosedXML_Tests/Examples/RowsTests.cs create mode 100644 ClosedXML_Tests/Examples/StylesTests.cs create mode 100644 ClosedXML_Tests/Examples/TablesTests.cs create mode 100644 ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs create mode 100644 ClosedXML_Tests/Excel/Caching/SampleRepositoryTests.cs create mode 100644 ClosedXML_Tests/Excel/CalcEngine/CalcEngineCellEnumerationTests.cs create mode 100644 ClosedXML_Tests/Excel/CalcEngine/CalcEngineExceptionTests.cs create mode 100644 ClosedXML_Tests/Excel/CalcEngine/DateAndTimeTests.cs create mode 100644 ClosedXML_Tests/Excel/CalcEngine/FormulaCachingTests.cs create mode 100644 ClosedXML_Tests/Excel/CalcEngine/FunctionsTests.cs create mode 100644 ClosedXML_Tests/Excel/CalcEngine/InformationTests.cs create mode 100644 ClosedXML_Tests/Excel/CalcEngine/LogicalTests.cs create mode 100644 ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs create mode 100644 ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs create mode 100644 ClosedXML_Tests/Excel/CalcEngine/PrecedentCellsTests.cs create mode 100644 ClosedXML_Tests/Excel/CalcEngine/StatisticalTests.cs create mode 100644 ClosedXML_Tests/Excel/CalcEngine/TextTests.cs create mode 100644 ClosedXML_Tests/Excel/CalcEngine/XLMathTests.cs create mode 100644 ClosedXML_Tests/Excel/Cells/DataTypeTests.cs create mode 100644 ClosedXML_Tests/Excel/Cells/XLCellTests.cs create mode 100644 ClosedXML_Tests/Excel/Clearing/ClearingTests.cs create mode 100644 ClosedXML_Tests/Excel/Columns/ColumnTests.cs create mode 100644 ClosedXML_Tests/Excel/Comments/CommentsTests.cs create mode 100644 ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatCopyTests.cs create mode 100644 ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatShiftTests.cs create mode 100644 ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatTests.cs create mode 100644 ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatsConsolidateTests.cs create mode 100644 ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs create mode 100644 ClosedXML_Tests/Excel/DataValidations/DataValidationShiftTests.cs create mode 100644 ClosedXML_Tests/Excel/DataValidations/DataValidationTests.cs create mode 100644 ClosedXML_Tests/Excel/DataValidations/XLDataValidationsTests.cs create mode 100644 ClosedXML_Tests/Excel/Globalization/GlobalizationTests.cs create mode 100644 ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs create mode 100644 ClosedXML_Tests/Excel/Loading/LoadingTests.cs create mode 100644 ClosedXML_Tests/Excel/Misc/CopyContentsTests.cs create mode 100644 ClosedXML_Tests/Excel/Misc/ExtensionsTests.cs create mode 100644 ClosedXML_Tests/Excel/Misc/FormulaTests.cs create mode 100644 ClosedXML_Tests/Excel/Misc/HyperlinkTests.cs create mode 100644 ClosedXML_Tests/Excel/Misc/SearchTests.cs create mode 100644 ClosedXML_Tests/Excel/Misc/StylesTests.cs create mode 100644 ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs create mode 100644 ClosedXML_Tests/Excel/Misc/XlHelperTests.cs create mode 100644 ClosedXML_Tests/Excel/Misc/XmlEncoderTests.cs create mode 100644 ClosedXML_Tests/Excel/NamedRanges/NamedRangesTests.cs create mode 100644 ClosedXML_Tests/Excel/PageSetup/HeaderFooterTests.cs create mode 100644 ClosedXML_Tests/Excel/PageSetup/PageBreaksTests.cs create mode 100644 ClosedXML_Tests/Excel/PivotTables/XLPivotTableTests.cs create mode 100644 ClosedXML_Tests/Excel/Protection/HashAlgorithmTests.cs create mode 100644 ClosedXML_Tests/Excel/Protection/XLSheetProtectionTests.cs create mode 100644 ClosedXML_Tests/Excel/Protection/XLWorkbookProtectionTests.cs create mode 100644 ClosedXML_Tests/Excel/Ranges/CopyingRangesTests.cs create mode 100644 ClosedXML_Tests/Excel/Ranges/InsertingRangesTests.cs create mode 100644 ClosedXML_Tests/Excel/Ranges/MergedRangesTests.cs create mode 100644 ClosedXML_Tests/Excel/Ranges/RangeIndexTest.cs create mode 100644 ClosedXML_Tests/Excel/Ranges/RangeShiftingTests.cs create mode 100644 ClosedXML_Tests/Excel/Ranges/RangesConsolidationTests.cs create mode 100644 ClosedXML_Tests/Excel/Ranges/UsedAndUnusedCellsTests.cs create mode 100644 ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs create mode 100644 ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs create mode 100644 ClosedXML_Tests/Excel/RichText/XLRichStringTests.cs create mode 100644 ClosedXML_Tests/Excel/Rows/RowTests.cs create mode 100644 ClosedXML_Tests/Excel/Saving/SavingTests.cs create mode 100644 ClosedXML_Tests/Excel/Sparklines/SparklinesTests.cs create mode 100644 ClosedXML_Tests/Excel/Styles/BorderTests.cs create mode 100644 ClosedXML_Tests/Excel/Styles/ColorTests.cs create mode 100644 ClosedXML_Tests/Excel/Styles/FontTests.cs create mode 100644 ClosedXML_Tests/Excel/Styles/NumberFormatTests.cs create mode 100644 ClosedXML_Tests/Excel/Styles/StyleChangeTests.cs create mode 100644 ClosedXML_Tests/Excel/Styles/StyleTests.cs create mode 100644 ClosedXML_Tests/Excel/Styles/XLFillTests.cs create mode 100644 ClosedXML_Tests/Excel/Tables/AddingAndReplacingTableDataTests.cs create mode 100644 ClosedXML_Tests/Excel/Tables/TablesTests.cs create mode 100644 ClosedXML_Tests/Excel/Worksheets/XLSheetViewTests.cs create mode 100644 ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs create mode 100644 ClosedXML_Tests/ExcelDocsComparerTests.cs create mode 100644 ClosedXML_Tests/OleDb/OleDbTests.cs create mode 100644 ClosedXML_Tests/OpenXMLTests.cs create mode 100644 ClosedXML_Tests/Resource/Examples/AutoFilter/CustomAutoFilter.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/AutoFilter/DateTimeGroupAutoFilter.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/AutoFilter/DynamicAutoFilter.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/AutoFilter/RegularAutoFilter.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/AutoFilter/TopBottomAutoFilter.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Columns/ColumnCells.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Columns/ColumnCollection.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Columns/ColumnSettings.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Columns/DeletingColumns.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Columns/InsertColumns.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Comments/AddingComments.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Comments/EditingComments.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleLowHigh.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleLowMidHigh.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleMinimumMaximum.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFContains.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDataBar.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDataBarNegative.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDataBars.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDatesOccurring.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEndsWith.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEqualsNumber.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEqualsString.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIconSet.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsBlank.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsError.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFMultipleConditions.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotBlank.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotContains.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotEqualsNumber.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotEqualsString.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotError.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStartsWith.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStopIfTrue.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Delete/DeleteFewWorksheets.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Delete/RemoveRows.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ImageHandling/ImageAnchors.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/ImageHandling/ImageFormats.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Loading/ChangingBasicTable.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/AddingDataSet.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/AddingDataTableAsWorksheet.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/AdjustToContents.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/AdjustToContentsWithAutoFilter.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/AutoFilter.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/BasicTable.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/BlankCells.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/CellValues.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/Collections.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/CopyingRowsAndColumns.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/CopyingWorksheets.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/DataTypes.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/DataTypesUnderDifferentCulture.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/DataValidation.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/Formulas.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/FormulasWithEvaluation.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/FreezePanes.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/HideSheets.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/HideUnhide.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/Hyperlinks.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/InsertingData.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/LambdaExpressions.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/MergeCells.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/MergeMoves.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/Outline.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/RightToLeft.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/SheetProtection.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/SheetViews.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/ShiftingFormulas.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/ShowCase.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/TabColors.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/WorkbookProperties.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Misc/WorkbookProtection.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/PageSetup/HeaderFooters.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/PageSetup/Margins.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/PageSetup/Page.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/PageSetup/SheetTab.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/PageSetup/Sheets.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/PageSetup/TwoPages.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/PivotTables/PivotTables.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/AddingRowToTables.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/ClearingRanges.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/CopyingRanges.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/CurrentRowColumn.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/DefiningRanges.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/DeletingRanges.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/InsertingDeletingColumns.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/InsertingDeletingRows.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/MultipleRanges.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/NamedRanges.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/SelectingRanges.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/ShiftingRanges.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/SortExample.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/Sorting.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/TransposeRanges.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/TransposeRangesPlus.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Ranges/WalkingRanges.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Rows/InsertRows.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Rows/RowCells.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Rows/RowCollection.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Rows/RowSettings.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Sparklines/SampleSparklines.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Styles/DefaultStyles.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Styles/PurpleWorksheet.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Styles/StyleAlignment.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Styles/StyleBorder.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Styles/StyleFill.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Styles/StyleFont.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Styles/StyleIncludeQuotePrefix.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Styles/StyleNumberFormat.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Styles/StyleRowsColumns.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Styles/StyleWorksheet.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Styles/UsingColors.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Styles/UsingPhonetics.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Styles/UsingRichText.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Tables/InsertingTables.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Tables/ResizingTables.xlsx create mode 100644 ClosedXML_Tests/Resource/Examples/Tables/UsingTables.xlsx create mode 100644 ClosedXML_Tests/Resource/Images/ImageHandling.png create mode 100644 ClosedXML_Tests/Resource/Other/AutoFilter/AutoFilterWithThousandsSeparator.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/Charts/PreserveCharts/inputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/Charts/PreserveCharts/outputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/Drawings/Comments/inputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/Drawings/NoDrawings/outputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/ExternalLinks/WorkbookWithExternalLink.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/InlineStrings/inputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/InlineStrings/outputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/InlinedRichText/ChangeRichText/inputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/InlinedRichText/ChangeRichTextToFormula/output.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/NoActiveSheet/noactive_noselected.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/NoActiveSheet/noactive_twoselected.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/BlankPivotTableField/BlankPivotTableField.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/ClearPivotTableRenderedRangeWhenLoading/inputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/LongText/outputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/PivotSubtotalsSource/input.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/PivotTableWithNoneTheme/inputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/PivotTableWithNoneTheme/outputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/SourceSheetWithWhitespace/outputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/TwoPivotTablesWithSingleSource/input.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/TwoPivotTablesWithSingleSource/output.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/VersioningAttributes/inputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/VersioningAttributes/outputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/Protection/protectstructurewithoutpassword.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/Protection/protectstructurewithpassword.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/SelectedRanges/InvalidSelectedRange.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/Sparklines/SparklineThemes/inputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/StyleReferenceFiles/ConditionalFormattingOrder/ConditionalFormattingOrder.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/StyleReferenceFiles/ConditionalFormattingOrder/inputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/StyleReferenceFiles/MergedCellsBorder/inputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/StyleReferenceFiles/RowAndColumnStyles/inputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/StyleReferenceFiles/TransparentBackgroundFill/TransparentBackgroundFill.xlsx create mode 100644 ClosedXML_Tests/Resource/Other/StyleReferenceFiles/TransparentBackgroundFill/inputfile.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/AllShapes.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/BaseColumnWidth.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/CellWithStringDataType.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/CommentAndButton.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/CommentsWithIndexedColor81.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/CopyRowContents.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/Date1904System.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/DrawingSizeInPx.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/DuplicateImageNames.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/EmptyCellValue.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/EmptyFill.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/EmptyNumberFormatId.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/EmptyTable.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/EscapedApostrophe.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/ExcelProducedWorkbookWithImages.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/FileWithButton.xlsm create mode 100644 ClosedXML_Tests/Resource/TryToLoad/FileWithDefaultStyleNameNotInEnglish.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/FileWithMismatchSheetIdAndRelId.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/FilterPrivacyEnabledWorkbook.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/HorizontalAlignment.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/InvalidFirstPageNumber.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/InvalidPrintArea.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/InvalidPrintTitles.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/InvalidPrintTitles2.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsm/pass/CVE-2016-0122-1.xlsm create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsm/tdf111974.xlsm create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsm/vba-user-function.xlsm create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/ProtecteSheet1234Pass.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/TextColor.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/activex_checkbox.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/autofilter.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/bnc762542.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/bug-fixes.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/built-in_ranges.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/ceiling-floor.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/cell-anchored-hidden-shapes.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/cell-borders.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/cell-value.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/check-boolean.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/colorscale.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/colorscale_num_with_ref.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/column-style-autofilter.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/column-style.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/column_style.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/complex_icon_set.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/cond_format_formula_listener.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/cond_format_theme_color2.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/cond_format_theme_color3.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/cond_parent.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/condformat_theme_color.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/customxml.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/data-table/multi-table.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/data-table/one-variable.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/databar.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/database.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/different-column-width-excel2010.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/empty-noconf.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/empty.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/enhanced-protection.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/external-refs.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/fontSize.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/formats.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/functions-excel-2010.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/hiddenShape.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/hidden_sheets.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/hyperlink.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/hyperlinks.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/matrix-multiplication.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/miscrowheights.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/named-ranges-global.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/new_cond_format_test.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/new_cond_format_test_export.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/page_scale.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivot-table/many-fields-in-cache.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivot-table/shared-dategroup.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivot-table/shared-group-field.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivot-table/shared-nested-dategroup.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivot-table/shared-numgroup.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivot-table/two-data-fields.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivot-table/with-strings-integers-and-dates.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivot_table_first_header_row.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivottable_bool_field_filter.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivottable_date_field_filter.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivottable_double_field_filter.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivottable_duplicated_member_filter.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivottable_error_item_filter.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivottable_outline_mode.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivottable_rowcolpage_field_filter.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivottable_string_field_filter.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/pivottable_tabular_mode.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/preserve-whitespace.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/preserve_space.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/ref_string.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/row-index-1-based.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/shared-formula/3d-reference.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/shared-formula/basic.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/shared-formula/text-results.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/sheet-names.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/sheet-tab-color.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/singlecontrol.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/strike-through.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/tdf100709.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/tdf104310-2.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/tdf104310.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/tdf105840_allRowsHidden.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/tdf110440.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/tdf111876.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/tdf112106.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/tdf81939.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/tdf83672.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/tdf89139_pivot_table.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/tdf97598_scenarios.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/textbox-CharKerningSpace.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/textbox-CondensedCharacterSpace.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/textbox-hyperlink.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/track-changes/simple-cell-changes.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/underlineColor.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/universal-content-strict.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/universal-content.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/writingMode.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LO/xlsx/xf_default_values.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LibreOfficeFileWithDates.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LoadFileWithCustomSheetViews.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LoadImageWithoutTransform2D.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LoadPivotTables.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/LoadSheetsWithCommas.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/NamedRangeWithInvalidCharacter.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/NoReferencesOnRowsOrCells.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/PivotTableWithMissingReference.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/PivotTableWithTableSource.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/PrintAreaRefersToExternalWorksheet.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/SHA512PasswordProtection.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/SingleRowAutoFilter.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/TableHeadersWithLineBreaks.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/TableWithCustomTheme.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/TableWithNameNull.xlsx create mode 100644 ClosedXML_Tests/Resource/TryToLoad/TemplateWithTableSourcePivotTables.xlsx create mode 100644 ClosedXML_Tests/TestHelper.cs create mode 100644 ClosedXML_Tests/Utils/ExcelDocsComparer.cs create mode 100644 ClosedXML_Tests/Utils/PackageHelper.cs create mode 100644 ClosedXML_Tests/Utils/ResourceFileExtractor.cs create mode 100644 ClosedXML_Tests/Utils/StreamHelper.cs create mode 100644 ClosedXML_Tests/Utils/TemporaryFile.cs create mode 100644 ClosedXML_Tests/XLHelperTests.cs create mode 100644 appveyor.yml create mode 100644 resources/logo/favicon-01.png create mode 100644 resources/logo/favicon-01.svg create mode 100644 resources/logo/favicon-02.png create mode 100644 resources/logo/favicon-02.svg create mode 100644 resources/logo/favicon-03.png create mode 100644 resources/logo/favicon-03.svg create mode 100644 resources/logo/favicon-04.png create mode 100644 resources/logo/favicon-04.svg create mode 100644 resources/logo/logotype-a-05.png create mode 100644 resources/logo/logotype-a-05.svg create mode 100644 resources/logo/logotype-a-06.png create mode 100644 resources/logo/logotype-a-06.svg create mode 100644 resources/logo/logotype-a-07.png create mode 100644 resources/logo/logotype-a-07.svg create mode 100644 resources/logo/logotype-a-08.png create mode 100644 resources/logo/logotype-a-08.svg create mode 100644 resources/logo/logotype-b-09.png create mode 100644 resources/logo/logotype-b-09.svg create mode 100644 resources/logo/logotype-b-10.png create mode 100644 resources/logo/logotype-b-10.svg create mode 100644 resources/logo/logotype-b-11.png create mode 100644 resources/logo/logotype-b-11.svg create mode 100644 resources/logo/logotype-b-12.png create mode 100644 resources/logo/logotype-b-12.svg create mode 100644 resources/logo/nuget-logo.png create mode 100644 resources/logo/readme.png diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..9416600 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +root = true + +[*] +end_of_line = crlf +insert_final_newline = true +trim_trailing_whitespace = true + +# 4 space indentation +[*.cs] +indent_style = space +indent_size = 4 + +# CA1820: Test for empty strings using string length +dotnet_diagnostic.CA1820.severity = error diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..307f7d6 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,21 @@ +# Source https://help.github.com/articles/dealing-with-line-endings +# Set default behaviour, in case users don't have core.autocrlf set. +* text=auto + +# Explicitly declare text files we want to always be normalized and converted +# to native line endings on checkout. +*.cs text diff=csharp eol=crlf + +# Declare files that will always have CRLF line endings on checkout. +*.sln text eol=crlf +*.csproj text eol=crlf + +# Denote all files that are truly binary and should not be modified. +*.png binary +*.jpg binary +*.dll binary +*.gif binary +*.ico binary +*.xlsx binary + +core.autocrlf=true diff --git a/.gitignore b/.gitignore index ed6d1d2..14bd0ae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,402 +1,32 @@ -# ---> VisualStudio -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore -# User-specific files -*.rsuser -*.suo +#ignore thumbnails created by windows +Thumbs.db +#Ignore files build by Visual Studio +*.obj +*.exe +*.pdb *.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Ww][Ii][Nn]32/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ -[Ll]ogs/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# ASP.NET Scaffolding -ScaffoldingReadMe.txt - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio +*.aps +*.pch +*.vspscc *_i.c *_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -# but not Directory.Build.rsp, as it configures directory-level build defaults -!Directory.Build.rsp -*.sbr +*.ncb +*.suo *.tlb -*.tli *.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj +*.bak +*.cache +*.ilk *.log -*.tlog -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in +.vs/ +[Bb]in +[Dd]ebug*/ +*.lib +*.sbr +obj/ +[Rr]elease*/ _ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio 6 auto-generated project file (contains which files were open etc.) -*.vbp - -# Visual Studio 6 workspace and project file (working project files containing files to include in project) -*.dsw -*.dsp - -# Visual Studio 6 technical files -*.ncb -*.aps - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# Visual Studio History (VSHistory) files -.vshistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd - -# VS Code files for those working on multiple tools -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# Local History for Visual Studio Code -.history/ - -# Windows Installer files from build outputs -*.cab -*.msi -*.msix -*.msm -*.msp - -# JetBrains Rider -*.sln.iml - +[Tt]est[Rr]esult* +/packages +.idea/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..477b942 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,47 @@ +# Developer guidelines +The [OpenXML specification](https://www.ecma-international.org/publications/standards/Ecma-376.htm) is a large and complicated beast. In order for ClosedXML, the wrapper around OpenXML, to support all the features, we rely on community contributions. Before opening an issue to request a new feature, we'd like to urge you to try to implement it yourself and log a pull request. + +Here are some tips. + +* Before starting a large pull request, log an issue and outline the problem and a broad outline of your solution. The maintainers will discuss the issue with you and possibly propose some alternative approaches to align with the ClosedXML development conventions. +* Please submit pull requests that are based on the `develop` branch. +* Where possible, pull requests should include unit tests that cover as many uses cases as possible. +* We recommend Visual Studio 2019 or higher as the development environment. If you do use Visual Studio, please install these extensions: + * [CodeMaid](https://marketplace.visualstudio.com/items?itemName=SteveCadwallader.CodeMaid), for ensuring consistent code syntax, whitespace convention, etc. + * If you use a version of Visual Studio lower than 2017, you should install [editorconfig]() support. Read more about [EditorConfig](http://www.editorconfig.org). +* We use 4 spaces for code indentation. This is the default in Visual Studio. Don't leave any trailing white space at the end of lines or files. + + + +## Working with Excel file internals +Excel files (`.xlsx` and `.xlsm`) are zip packages. You can easily verify this by renaming the extension any Excel file to `.zip` and opening the file in your favourite `.zip` file editor. + +Internally, the file contains files (also known as parts) that represent different entities in the Excel framework, for example `workbook.xml` and `table1.xml`. The [OpenXML specification](https://www.ecma-international.org/publications/standards/Ecma-376.htm) documents all these parts and their contents. + +Making changes to the ClosedXML code may change the input or output of the package parts. For example if you add support for a currently unsupported element, you will have to ensure that you read the appropriate package part into the ClosedXML model and also support writing of the package parts to the file. + +### Comparing the internals of Excel files + +A ClosedXML developer will often want to compare the internals of 2 similar Excel files. For example if you want to compare the output of a specific package part before and after your code changes. The long, difficult way would be to extract the package parts of the 2 files and manually compare the relevant parts. To ease this, we recommend this tooling stack: + +- [Total Commander](https://www.ghisler.com/download.htm) +- [WinMerge](http://winmerge.org/downloads) version `2.14.0`, because subsequent versions for [some reason](https://bitbucket.org/winmerge/winmerge/issues/152/displayxmlfiles-plugin-not-included-with) excludes the required `DisplayXMLFiles.dll` plugin. +- Set Total Commander [to use WinMerge](https://superuser.com/questions/238039/can-i-replace-internal-diff-in-total-commander-with-a-custom-tool) as its compare tool. +- In WinMerge, enable `Plugins > Automatic Prediffer` + +Now, to compare 2 similar, but not exact Excel files: + +- In Total Commander, navigate to the 1st file in the left-hand pane and the 2nd file in the right-hand pane. +- Press `Ctrl+PageDown` to "enter" the package. You should see, among others, a `[Content_Types].xml` file in both panes. +- You can now compare all package parts by selecting `Commands > Synchronise Dirs...`. Press `Compare`. This will do a full, recursive comparison. You can filter out parts that are identical. +- You can select an item that differs and press `Ctrl+F3` to open the two parts in WinMerge and see the exact comparison of the part's contents. The XML files should automatically reformat/reindent to ease the comparison instead of showing the entire XML contents on a single line. This is the reason for requiring the `DisplayXMLFiles.dll` plugin. +- In Total Commander, you can also navigate to specific files in the left-hand and right-hand panes and select `File > Compare by Content...`. This will open WinMerge directly. +- Note that since WinMerge reformats the XML, it does so in a temporary file. If you make changes to the contents of any of the 2 panes in WinMerge and save the file, it will not be saved back into the Excel file. + +## Code conventions +ClosedXML has a fairly large codebase and we therefore want to keep code revisions as clean and tidy as possible. It is therefore important not to introduce unnecessary whitespace changes in your commits. + +To ensure you follow the coding conventions, please do the following steps before you commit your code: + +- In Visual Studio, run `CodeMaid > Cleanup Active Document` or `Ctrl+M, Space` on each file that you have altered. This will ensure the correct whitespace consistency. +- Some files, not all, have a header in the first line: `// Keep this file CodeMaid organised and cleaned`. For these files, also run `CodeMaid > Reorganize Active Document` or `Ctrl+M, Z`. This will reorder properties and methods alphabetically into a predetermined order. For example, public properties and methods will be organized before private properties and methods. Not all files require this yet. Please take note of the headers. diff --git a/ClosedXML.Examples/Examples/Created/AddingComments.xlsx b/ClosedXML.Examples/Examples/Created/AddingComments.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..41b438b603babfd561f0b97770e52829d7022d09 GIT binary patch literal 30847 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/AddingDataSet.xlsx b/ClosedXML.Examples/Examples/Created/AddingDataSet.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a7c8dcf2feaaeb00692b0d8b66c9249b446a9e60 GIT binary patch literal 10679 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 BxcvYC literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/AddingDataTableAsWorksheet.xlsx b/ClosedXML.Examples/Examples/Created/AddingDataTableAsWorksheet.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b2a30e2fa710d2caa12f6968df940257fcfaf6fc GIT binary patch literal 7372 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 VU<>;7?;hw7q+m;2Xa4o={{WSNc_IJ+ literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/AdjustToContentsWithAutoFilter.xlsx b/ClosedXML.Examples/Examples/Created/AdjustToContentsWithAutoFilter.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a0b6444baf5595b945aca58184a4d9ad31bc9911 GIT binary patch literal 6415 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 ZKWuyh9SUNE003Izw~5%u%CYWU{T~qBbshi! literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/AutoFilter.xlsx b/ClosedXML.Examples/Examples/Created/AutoFilter.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..748fdcedf96be1531a5744814d568520d77a976a GIT binary patch literal 6357 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\`mpM8VBJJ4 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 A8UO$Q literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/BlankCells.xlsx b/ClosedXML.Examples/Examples/Created/BlankCells.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bf4348a6a611d8d5eb3ce9e1a9ed1788b06a2daa GIT binary patch literal 6170 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 R8j<3@iE!Ii-yfVA@IT*Bl2QNw literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/ClearingRanges.xlsx b/ClosedXML.Examples/Examples/Created/ClearingRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..76a0346a7068ce150701244358afa5b7aa0053fe GIT binary patch literal 6879 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/ColumnCollection.xlsx b/ClosedXML.Examples/Examples/Created/ColumnCollection.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..daecff88ab664c835d5055fd47159f0e8b040455 GIT binary patch literal 7376 zcmcJU2T)U6x5p!0dhaL%P>K*j4M;#~QWTIPO-e{Y5eOj(RY8eVr3r`>=|zh4CIZrt zjshZ8R6wLFA{~7J@4Z}^duP6R?|sailR2Ed{%6fv>#V)^@966glQ07S6chkwn=b~c zdi#{zCjbC)A^?C6004M7gFIa^PPVSDPU2oJ&f)qOQOy$cd-p0gZ8g;`)JbTU19glm zLsG)ab;Dl*z+oUK(~MFd6M}efP!R%YjX^qNLE;DJ)!GI{WkN7{J&+izqbmvu1dB@m zd66i%E5Z?F4+Xm8?8G2IWhF%eq%#ah7=d+gL}PggCMYZv=zzna6+j>?+yUtV!-~72 zkto6)J6DVg3`e-c*n`k8xD(7C36hkMkOdK*c%%XRU6a?y8;$%=6kYA?9N|bcSGc?QCUaE9CoazWx?2pA3qg1cgn z|LoD9)>tIQgAjG>zuJK8W+|EOQuh&~G)S^k)(O>ISDmPS<%5y1^zf06@Y&O_Z7>$i&#?3jUPHd6qYt4GkWrKxF)YF%L{D3rkl9E`yu)@BL4ft zSf(>H6=LE*%I%>eUa=PE-1pHruOuY1a5sp~#XeW0cw2bBx;1BjUW$}dw>e%Q7+-=^ zstkf$a%k4McvJghVz7)zmDL0>tbA2-_`M8!9DW@Op+y9{->_hd7&%)#to(}TfpEmI ztp%zqsq&OSuo(S4>!zZ&g0b{1yGVPNmmbidvSF1D zl@4csZZYBuqB~SZv%k7R*R}Rl{txO>TW$0yUA%WDm3rT?@i?b&N zA&;TuLa8F5fpJEZ{rA45jt4wb7Fz<=yiMGXc;8<%(0JjviW>QtLju( z&EjVw|AA?`-`!0NbVe-_+|(zO6z4B@f3?QHPcw&YvNz@ms)d(cqZn^zJq?+U%#U(@ z-YMHlN`Hz=RF>CnK)}8mc&Up;+cHnYm~GN@fvi=oXAmxcdbEh~<@EU)^gv;ix#u1u ziNf?^UnM2�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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/CopyingRanges.xlsx b/ClosedXML.Examples/Examples/Created/CopyingRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b4e932f3310a9e7e285ca4bfba1b3c92152500fb GIT binary patch literal 7850 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/CopyingRowsAndColumns.xlsx b/ClosedXML.Examples/Examples/Created/CopyingRowsAndColumns.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..51824a51e9287b88c7a206808f502a8ec62aa68c GIT binary patch literal 9631 zcmcIq1yod9+onspLzHfq8ETM_Mw+1;1ZL=FC{d&YMY@!dPU%KkMY=&+S~>(IMgI}+ zy}|ta5K3&d#-xm?H;e$XhAns8V88!C)yr z(qX-0;$FTD&(2 zEuA4nbcsFSGZB9al8doaknz2jg~sEwnQ7=t_9l3R#D{H~}5%-#%+DB)&p z9o9^VgC)HlclAN1x&`t!rcMp2>%CQ!0#m(=(NmStzd952Ea9jG0-VM z#TYbTAgBPJARq9KfQ1D=3@XS#2l#)h8q5n0bA-a6+|I5DXSu>{U~Ye_AJoYLf;jI6 zFmrbP*#&-8&{Y8n`rp^--x~nn0E3%B&ERGL3ny3DKiB9_Yd4sy2g2)a|7ruc0}`+R z0r@P<1fYEUKtUlPb91n{AQX0o7YY`H0?m1x-5j76&VTsaT+jk60JRVRLV02QK%m9t z^8tS2*xf%#{3}{4_ee@*Bcg>BIua5gg2dN-l^WNkx&$N)Hf=w_SJ3r?#A9UaFz}R- z(H+$#xw8~kM>tH5*e{G7l_4U=ebyWqZhkYTmX5R^iKk>Mr@Jj%54G8KvJQsVuy51m zq-2oiMm@N@pu|BiaN_;SpLQUnd`&*nYT?<@QWDEUNoa?{Vmk`w-aY@pg$n)>6r6it zHD!H8f75V1oqYDwnA|)CGa2{+!Eq$HnCZFyg{im^(FV$M>4wB;FrTU3>ue;PhLv#* zp(PcCt!c&d?wI29PRwZ$QYF@PkQz;<;j{OtNKZxvSpbsW_AhGc7w*}nXDIkd-9w`KXZT7p(!q6eenahQ)@~WGZ3Rv9&KFndd0WmkQ7Q3e^=rI_df)>X^afq2muD!1#ak94Y-BeoTt{M z-k3H!Pt7xI!?)jWtMpHP_-6LJ)T6=S@w(w{53Z&Qo`b)_(ytbUek;!JL$st2A}k?B zg`e@?&DzWr2GxYSB4Ur*g!Vz7SeO?bpYN9Yk@;st~A-^b`1f`FJ*D6R|nLPAxa6yMa8R@7`IF($A?fnEEWgX8msdMF9*wlIg`pvy(b)iAf=3_TWv_qom+Ye&hHwNxdvc!%s! zGO0-VSm~1ZhRjhi(Mh;FNY$sF8@T} z)zMK?lFi5JDFBd7N*N)FEMyug(F>xcr>xCHLDE>w%wgoAa*Zr06`)3iys5W4Ls-lj zA3hUnib^_eKLw@BI2w~~UrgxdNPUosWj?9RmWy^tbyW2p+KVUE&_1$AtKsy^&&-Yv zC>uz1I$v&nG2p?gb2moPA?o%Mz4_9qgdi`9OzRO7nL{)R3#cddKrp842YFv?5YT8a z`<(db{j&likx1paQ({UVI91E2)%NX;18<5-n-)WU>B6gRb{A8l{&{MQ{0!JHd|Fj^s2l*GST=v8dvOyP`;nEkn z?_=1psx^iv3}1-!;$cC8%sd6C4bGqn=6UR(6y&_vbB0t0@t5ImvYPBCk z-XUMJE5$4B@X73JYI-V~Ybe`3V)7ZDN#uF%`?8ve!Z-Fu-SoQU!R}X)M62)1DQT(u zRQGnQViqvRjX1p>9}a0+=07!&Z(%yv*(YiKj{Q6D!t1*sFa+;H5Z#sX7w>*{R5xoF z4DN;qT!=r=WyI3zbDRd^`jSZ>x0fVC4F|J3r_gE2GGs-Htj2O3GR{z$#~n-^Lc}yo z&En#q?&awX6AZGx-{hkoe*b#Dd??wqb!!ki>&2F}Mj0*~W}7k1y!q&02UWy4Rg?=O z(6a<}kLr$fZ7cI;W9@TMPi@T5hG*sJ>m{K4I##0T8UFD6`5CPyl#-@t7KNAdP~4es3|zQ}VeIt4!IYkdTNq?C#~Yi|Ul)Y^V%&7@DtSe)rWzD?3M{Y6<#+Quqx#D!j(n5C~~V zUtwEIxDe|6g52EU)SyaGr#k16O6#23v@I+?FD$;6)bfBGec~;Z{CY+AVbYe8;BcPc zY@_vvuI{Gmm-?CZlN%IV+&J3+`XqCp%hSP6{99D3L zp3(Ff#xS7w7@qW(lLc{R(0^=S78|>vnaA2j(;)JRTCJFdi5Nu)5}!FpDQ)KI;j?GA z*VM;V>o>mm>`c6hs~k5kKo2eXMi{V~>M#=j5FPfGS22e8*?CCGFs{bKuGbCKB~HQ% zBfzmvMh9xn!jFmSW{=f_r>xV_pIJv`8whcpGL9PBK09M^Riz$qVm5L;JU^ax3b~Ln zzCiw+n$;Uk)~X0cQg&~&^N=6$NjfjdiHpLch~J6H))m3NSf2W|U4SB5dCD;i^u73uG8 z5Ts3XeLl&UuxYI1_ETE(t3WT&-%Md29!=ne&-7Oz%lcG*h!6>w$bM5Ii@o}0O9aAW z4Ap=uuQBmq>mcS1f3)`3`$E8>g_}S;E8X659^ZvPG$Q!_nWuH14l&) z!^JR5WJlf*%7Z)B*PNL<3tFC|Wtdcsc$fD{PepyzZ0(PLEINJG*%TpY*0DhnPf@67T`oNZ)|Wo2~9}LGw02sLXxoZ@zrTQ^#$R zRL$?d1lWQktA!-u!}EiC9ePs;5~a&6qE~`C_x(B-9a>&v7mhVtlziVkww796^XuGq zXgNjG{_favnmuz_ohztv%;fdy_7x1_NvO&=#_dbs?-*861!?#X#lqXP$j{O2rqPl#@$w?Enorf;pzm| zVmw4sa&n9D0xe98*ni}+xA*JRk<@!=qIU+-F(7s-6$9Qr`!vo?3b#1i$0dKMu^`vAq=*?V*bhb=}UoWY#*%#IIV;-GfsR7F1{U-9S`|pGG*6v zjuV)4s`ToHWBm=tE(7kANC|H7elLMh-C<&nj~oi{?&B6!+T$i&$cgD&FJysazoaJQ z_^|Zgeup*DTf!k`9ZakwOsq~(y>sKqsuDSvn=0ZTMbhXJTO?zeO2Nr~-S{7q9~F6m zBrAkoLO}||EpGz2@8hk~-x#?*p&Pu=ju`Wo)9I-cCO^ z4RubX#eo4toEX)!)J1Jz^`fk?$U%D;T_Z(oCd@RvgswHtasr|IB6nn;HU>qE?*&?L zW9drCReE7t)2TO1I|sM!O64q;Uw#{^P_q2{d1lTFHA4SS9Fc` z8tXdP1n1~*uJ z6dA0x7~rcp4Y3Pm}=?#vE~XNvYw*RX(WQwxfCq+0jtZl?x#0v zHN-ZEThY8E*7Ud)Y?Nt3GE|lF^KW%gqkVKO;IIX1$+8`!z!wi?79=O&ks4fa0E_ZlzCR3_vcfO&Q|cYknZxu1tJt3{>_u$!-FpX{V}=?NXK zlc{@y8;Ng)8$V@?hO^IHf2*VGZQD`)9InA5QgjbK0*$*<^FB39L+aB@sLyCHb6`;; z!O4b`zJX0ir>|J!XJ}ikAfR(~d5HQ9A&!l{WjAv@Ww_Olc>rsb_rko;h#Zantf!xE zl{8;Rb58J-M3*3BR?3!xzq$QJZTo0$slz92^>~ldys<=wqtWWE=uLVkf6xpr{Xj_6 zwA%4E;h;uJDV98+U`I};1U@R0{s*q3wm;faoSm3Y^-d+gUk6p1;GYzE#Z ziu2+Qw_uuC+3p`Ree0J z#I^>lYK1t#kM1lBLHLE=eSO_u_NKM-Z10Q?PdF+ZSk{M3u@+#Ym@PJc_Sy4(l5oBa z-bO@IX87a}Qthc)EN#8sa90Q3$xu_~r!*-+XhKZ*izP%{?mD60QgS2585#hI>!Kjd z(Jnd9_YMwFSSfu9L>}2|fSs94j%q|84-mDT<33E1SKmW<)@pVyeqG$bY5$_B?u_7f zN_WLA3;xXFsr@^p1^$E5;Wcax>K?WE@dnI_g`X$=k&7s4CRvzHtM4Ah?%$wIHjYy% z6I288b-4B8E}pFHwp1Q;Bw-T#q_k{qEP~R!iG1oM@^+zWrk$r}TcGvqH{)b}*n571 z&kUlwU$S6Jr)onq#iH@BipVs^M(^i$L&(v4?z2|bV3@ttCvE>l=}>{6l=jU|b|f8~ zd6w@zSCo56>C(7I@x=?ut?@W;!*MM!2frSCE5?xb0-T&n#0zI!qQWVBTDG11vvuZjpHNg0aJsIiT;PHxcd>?@xF*TNY5x;?S z%cHEQ^xQgn(&6$MEzW&+USpXrxN6o1@7r7~iv=s1w~^mjhge2Dx`$WoA7h+;_Jm){ z`k|6}ZF_Gn!2TDdL%#A?%-%YCg$n1xpp|v(i0T0?@4ORh38!BIK_9%aTKl+fD^mGo z+urhC@ljeY_OZ_Jal9wojbL_0X|*`}U<7`HVD|0L-RC24C4$-EpSwLH@bVCzqhW8( zqvPYjCr-YvskN{T=Z!EE?a>!km)Yigx-FCR=ojQ|z$zZEG=zoJPm;PAXxfA7?NbUc z;?qxrWxf*A zuMuOIa)Ke_A~u5o_Cfv*_;nH#q#6v{$YA~!)@P~;PBA*#aoYJ1ECfm6v_4m5 zF93EYIto1scnBzd@k+Sw(T711d|j=?g%Nxnaig%!AHOr&y*%2a7V+NNK!b!t@@rZJ zMAofLu~eEa*1yBs6Xm^%ei7q?rHebeMPT@g5fr)WwiYi0PxsW3LloTNeOf-1 z)Fxoz5GQe>B{!LrHrbF+Y7N^L6WWi86mJKs+=nPsHrYx$HO%c!pkc)Gi*Ta7>q$=i zNbE0(9wt{wRu^G^D-)M*WlN6T7j=(DpJ%zufPRD+Bf7A=fpBis91DpAR%9JC%D|$z zgJBAQyws40~}qk7I46NaM9O?(rn3il4g|4Cz0YZ2)L zV-3MB4%>~K&dr1Kgl0_tmz)N{jZ{J8t}om^E@jT-Cd(PM<$5pcc2XQLINx4+r}5)8KHTRcho0>3?dBSj7ohF<6Qs%cw2GQ6v-7!y0gH z)FOnZ0V6O-7+~x}v>CRrl5Xah zH{pp;8s^F9qWs8u;*B|wC6*ccBa_E;bmjS*Z=qz(9s>P0oQu6m1aaSWOCQDYdZd$w z&BWxwl_u0!q$&AnrQ>KfmXMP2_PNplWj2g$W0+d#n8*>55q2^syer#Eq;A+Ru=8T- z>ytHrb79q$H<(+?r&eO2jW)CVd~&&~J(>BrmgOaNpI5+St1O)YEA`tr-rKr8ugM`)~_Le0yvnkD0D7?S^o+5^q)G(xerKYaW{ZU?N*k;ePeRDyhySX;$ zL?Q9S-N^f6x`En;#;IHtK5JN{cHk-eedihXT<5(2OG;Gf0#BFThh7%@TDE<5<3|;J zWY`-YUpv$Uy_YJak{G8t^GN<{^=beh;LP zS#cO~Ndxl?Ut)li#m($sU1k|U%*rtVtC+TFXY!Ez2ONY!TLq)T8!2ZDh%i_P4RsU7TyDJK{ zxU7({g)7Vq4ujGmDkKcQ6k7khqRS^Oqb0|1mlwzj;s%1bL4sN!urQEMm>0|g5)$A8 zfdvdi0e_bM1Lq3Z0ihFH+Wha3g}{G9{uAh~=%pNa)j-#DK&%+E2}J~n3=xTjpDzrC z(oT*DO%-nXQ$Kby{`vOX7eB3v0zycEuo1&b?s@tTWzHF&IG#02jPzIFO-oN9FHAP> zML$FjF(0I4WJvB*N%pY(zPn4my?M~%+*svM?)NgxlWg1442JZ0 zKX2cT$p!0iShas;aSAVdiJKvy$nd27?K&W8c)VIYy(!6%V}V^JN>~8N+VGW+V~z`} zzTU&0u)*Am^xfBsT8VBN7E))}L@{F=-|#XY2Jy;-%JJ{{*XLD+%1MKwiFUJ@WhKvn z8NE#M$+zFUC_5^Z{6XGqFKY`$yYP$VQCT#;{h4(;RnB=#Y8Ag?jpr~nveGD8X6KBy zVPa#~4(iM$ryAMbIayA5=LdjM9sstVdbewnFi9-?okPwEqJ)e>`cs_ymn9nr|NrfC zOk-2)=H8U1q$pMnX{NpG3#&2-lUmD}*1v z5dKBCyN+{Ry1K#<#QIf}zl5yorq|VnE7KC3zgEuthZb=i<$9v{3Pk}SrTx)-e@D4Y z8(&Acp6a_o=|e2z`3IEC#NTz4>)Dwrl>5a0h;o^$xsGyuLVSh7NA`~>m(%0xDAy+; zS19O+#1Z0&u1`s>0RDM&y8_sz{eKwiu5SOUgIte^SGO0W`^N|gQ9?&B7YPX;@tr_L KLMo^KdGtTYBTz5^ literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/CopyingWorksheets.xlsx b/ClosedXML.Examples/Examples/Created/CopyingWorksheets.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d4ed3d5108fff4446431fdc9447c014e2b385e39 GIT binary patch literal 13351 zcmcI~1yozx)-F)o9g2IQxVt;FxI2WPL4y_w#Y%C9V#VF1cyKLJ3KT8Smg25O+n3UF zFXwQ3$NR@W-b+T3k?cLcJu}zbbA9VuQ%(5+JU$EzGBS*V*@4E7o9S>ySQr>~I2af# z7#J8Y5WA<7tG$JjlRcZ411Ku?sY(wAc1V?lx9XzYOR&=;&rAR=?{o`Oo~}WAeBeE zpF7_`7vp&Kvq?Q7Te%cA*B;YK#gP4K^NqT*hu0J)YI89wgq&2Pm?!01SqS-Q&I$G7 z2z=9cZ|V!gd70Lb5EBoAx-Ftls{+hlT9Z7xg$=?}twG$W%M%;!qrMSzMoBtVE2RC zK@c7W1{<2h_hXfr*rl={f&J1HI43N?iu^VX5X`8}E&-22R%R}$qVv{Mmm80Hv+T5! z_7Jt)frF4*qIvYk)kT)S75(zhR^=ES?Gih>hNY(`DUdjwjmY;E>8d9h;fqd}jLOuJ zMc*F8>sbU)QgydfN5<_PUkj0Ay$ey z({si2FO{T?9x@)%H4LFLJ~Uj@w|`}dJbF}U7FJiE>=Gp>QetQZTFcxZ84Sd$nEeqo z@LGjAg_#?WbGFc%xl{w^8>W0p=1WljH!TjY9 zVa-|9T4BJy@;oF?9a`4WUsmC+W)>X0$hH&iVjxCVM`?Ot zyI7yAsPr}4m5)LISCP%1Bz-R|;{s*=!H&tSDDGyNHK>dt75I*| z$Q9c-icw$bhE+lWC6BYXr0cbe7lXQ`dhP2w_Qbs!;q6s11eCrwJWrM4&)IidLQ9oV zJrJQ;2r29))66|zr)%SdsMOdK+cHJ7qIhJRYV5#vHM}k-m7aqgCCv9zjgeKV-hA4t z=OJ;jK~N^#(3TeU0Ul%bDL+MYsnb6bJ=k+j7!I1~j?hFW`5my|1^e$4;cf9Aosv}T zp~6QxsFGS*oba$xuX7Cbp40x0fc%`*k`>!)a<|U=fcAo*H;qMXrAs-F2pQ{q9qFmJ zkGHXd$_mvR4u);x2iod^5=GDLjh8#)TFOXg%XP5?7~e6+*HDMG^%WqZt2ZTZ*#_k) zg#o&%lg>8x`u)E+Yjabd5hh(|&xSwJLu0UJ*^Dlp)@-s{fMwpOGu9 z@63XOM(w*G3=GC!spjSl0^a7>Zu+8Yx&Z!wschbfD_&>V9FOL_?c}pU?xzd3lc|s- zNi$w4i{Om;=Wiji^7FdIVx0m@yqI#U^3%)yKTf}XWGVVg7!mJG z*!8(L6sGR=qhKIT#=Dbqvi4^e79Q&F1p7=M5i4iY=y`KSe3p6lwfp#;S0GsH%>f+u zsqs76=={>~5oWXib&aj+jAsv)u^?nPi0%=fv=~?Yz}Kp&k)Jo?ab}0F=mM2u91h|i z2?Sz$eQ!bda!|R#?R>KEA?|0jzt_yN_+dp|qgvqu%`uX&2YTrz+L8%XOhd#?vOIwR zEej>$%00aw^=nkc=$u7HFmX||0wfn}ni0~14Pz;<;%lgqL}dkYz*nQ$(>lwL_UMXz z&F~V`WTG6mu5I*bhUcuYiF(y>rGcfsqU`w3`k8Y~R<3Q-7{*12(fOm91?j^+CK4yq)4&I!DB^;I zq)(^n+%hk-)y4I6DC^bstBSGC4kxvF87VP&fQ9Dn8A(D$lY zd@J;-OpIgG&2u%B^(0iq^UZRmj{ly=jJRjpw)isOM!M+HyNZMTw?D>NZ&xwLDd4~{aUNn<^haTt;g}bR)#YyR@AXx3?0s4AlfYxarnoTNguS3 zH4{PVW~CX9hgbb4&kdB~$HcQW{M3Yd`*l>{&G~11Wwto-{b3Gl4_Qoz$_CEre|`); z@td#VGIOD-)-DKLBmlkrv}OJ?v|3jaMRcdqtSnUptCe}y&S1J{iFb$ByI^2-767gLlLXtqPf)o&m9R$%ZShN5Q`$^*#S){dUNej zzGWUOzefW04beL}GQbZh{uDGug5cL=rpCtP@7E(tvF4kQdZd%Ayf#KG(hrgr*eT6< zB+p7IlnBy})7kxD|5+@=+q@k}pv7Vu69$I(cd__YV8J#(pc@!EML|C}f6Yw=x(lxJ z3fMPEOrmqzGDL0<-osX7F-70}0-X^V@Tyys*_kTbqWaUz_8 zz|Mg3jl*_Al(_Hcd3rKD7^s=6JV6lp6#YiS?X`w+68uUBN-xm;=6%@>>AV0=ze zMMF&#*_EU&OxBNWtB=;bSzCosvDBNu5ppS9n4W7DSIeauDVoyHvtw@+)!=7FGZ`>0 z)q*}9cK(hpt2n%0+mDbX4(W4xz6(>h+{9;XKc}y1GS5e+pAVnRJLh6Mp(KeBZA(?3 z_#hN(2!FO=jy{X-aXnG_E`nG^aETD`K$;c7-4%2NHY!{6G^J|8e>SgKLY z<~+M$H+}6w6*%!3B;5pBropO(`z&gf;y8S|?JDisovt-_ni8O23(?9D{)Q}VKS;tRIH$patdBC&$v}C};QaG{7L6 z!LjtWNltgi9fwiv7Gtcwr#n4?)`kzC;_XHohMdtm3N{gAt@9H(Odc8bavAov(@_p$ z_>%OVD{n3Z zhv#ETZB0Fnp>?i&Jz<<`PlPH5Y-jb60M;8^rNq;fT9dX4`;|p{nspZjtL6+bg zUhZ$J(7TRySMczh51CjSX^M;0FdUUnd@JKF< ztt$)nK>{Qpd@689hB#wfyrHQA)fvzf2wWj@oI;no`D zne0zVJ)uRC6`(U-A9GU@4U|hONZ_R8I1f*pdO(4Pl*U`bi0;7!K8-ON6vNxVuB&|D z%5ZHXL&1o|$wKhNEwkl9pxEP7i8arnG_XlRfG10{JJEv6o>=Nj47ZZ!?0j2Wf-(nk zp-wQiL%5mcIOg^OntAf_+y3-7T{tc&T%lpWEzKX z=GSu?s$}3FMsUYR!aZTdC4;F)7gP%fX@hi@Hh9_g zFqqIa1w6fy`>8Np&Zw)<`t@ znc?d+3WN2R+M?G{Lstz}VhM5@t5KB*MD>v0yS8azyJc}iBjV8jnLd!`RE&i=S}>}w zKCB)l%)uZCA5+R{G4d^g1y{#YAS)!=xbx8 zsfR>YS5sK;5@g?x^x0}RZh;l@bP4R`atuuIw+k#F7{bJcMKZc@Kl4Jok>2Nt<|h2i zWiy>xjcBaH?A7$pUzD89KlU4vse@@*X&eP_-5YJz2(?II7i zT;cj~ZgHViO=Z*CDnG$G!yxZ!^De6QuI_LdfiJ2xA-p`f*>r$m2Xz94m1Qm@%T*w1 ztXWB^A7C(!a(foozU!I|}DAA*%; zl}L)ny}*+c{GzRx`P=3fn~#hiz3zimu}?IqOpQWWs^_MEQk895A$8GVt9(r6P*Z#H z(<(y6)XT$0WhC!m1{S=WkZLO?(c{l*F<)OilZJhSN{fykRAl%Xk@JbTxjk^mJSUj` zNqpcsl3muNf?Dyj$JoI;B~ueK&R|t$%N7w072Ccc{A8CSVTRD)s1uq!8zKS5!FNhq zXb+4qGZs~EIL|_Vu4$^L30sTteapqg+zw}UgbRU~A3uF7u!0Ds(F6feXP2bT=s65OT+(J1L;%-n8;?qQm&f%@sxQB}JzM33Bz3f&pNk9~J4xIOakGrhpJ|AzJS^knnoz6FM=x}5BK zPoHSs3c#$kj$k))M*vjKgA(Weg+BaW1xYaxOTeu|LI78wxf{@u3hI!M+pS{!uOqtL z(lT0dG-6yFT%4>N{H&aOTAchs9Na=&d~E#u0s?{pd3>~{Uu-n2{ zt8{YRk?AY2VGkJza9K6Jz$t%yK`)-`wK!3CnkTOy0VjJCZJ%MRY|&6jclY;m;uec9fHXYnGO zbeZ)DW0VY{+HJkaATFxWI52*@y9;QM9`T8svm79p^+^Elf>W9Bv#}yr>%6S6)n~*c3jzzPEbp4^K^NgWmnjP*s!mKUR;w^}4$?$&q} z`mKSBLM|~eQ^~N-M>0gy(dp_1E2OPpER31@{u<|8ve15?I!U+M9FrymQVr^o`rQz$ zyowLV-nhKxBm>IzS?I61^j$bl(A0IcnQg09#}kfBJ2(1jXw5>ZdA%_OJgPnlE9OeT zC#R5sOxRw0>3A{`HnbJPa2z&tX&ac3;zapRs*C9twa5w0T*f;|_wSj@^=sMe5cggM zjuX4zv>+9a?j0Ob9w{m{X%rni-WNHMsYSMhe1E=7{SfQp&$Jh)({K^lp$wT$R_zy0 zuTBpI(?C&HP7`^q$vxRKNDK~ps6c))lE+m}=3EpGnz&U4T-wgWaCO}Zm@yjoIXHSb z)zcP@0=f_u!I77nJD9|RxFlJNK5Hb(=9twSGZrnYYB(QlG z0DLgK29b3|vV6vi?A@CZMvs8beP12s1)D10TeZ2h=6$0qV|>HN4gfXkO{ff~vM%mp zV6YNS-^QyL8b)Rt}iYBn*^BHhgO)yu3aXUf#P6 z{kH8;tDs@>gNEtXrVw;<0bmXSNZXj(I^JestR!Y22exe0#E1!Mu?$K`NLW9Br$7yN zKE8ouZ>^iw8-bKsJ!jba*xJO(B*t1js#f095mZDFKo<_{(&x5VlH57UoBlux$hj7I zwnJxA6icbbM~Q;G{*nwZ44*P3_w4h#?<5X%?(ICR4MAV(8v?G1o70Q0*Y4FhJIw~>BRFJ?rLd$1%wxj=4!RKpV=JZ7%0`_gO8OLFj=70K zTO~p-DWYvMqECB5DmL61ePkKh%o;k$Rz5e#hT2?YkGNimXj*zdK~)ZZr0bOGm2dwh z4sMxCtKwM1$|*%4k92T!p3V2sFhL61Szq&_KnC_JttmLp49to+;if(1*K#+q2ZeTe z3R-Jn6V~P<2|24gHt9%KT;#~CUAApw=bkMWf$ls3XLZ@BA}}3{kEHO?Ru9Xr7h{8~ zUMA0k89mzR4h!!9>RlR@GpigUA*hvn6lh7yYh7`^QK|AL3oBA=6Ahb0$>-Opab@!#rK@4zKV8-sJy>|iGu9=UvxjQpg;@yfMHSlyo`(O@e8aM#w`TfDHgW^ z)zE1QntU~cag5v*B-O(3tv7flEmkuG-^m$cD>a)N1A|m;86LuQf%Rmt8RcPG>+&`!Vbl-^4_ztwe~S zh?UEaPvx!GZ{WN>aW*_f7R!})R>0D1=wEB)o2C~jm!B<^x1ouMEI>>DIeI$tR7cq< zMChhfoPFPEPu^73sL20JAk+sO?Vpi0(T&835Lt?XVdtE`UEC>|CW> z+j{GA>UZIANvYcrRaVuk1?=Zv?jP4$mI3GkTG-BE^sN=dqEy;D;bD5-tvtU@G|#V~ zEE@glV7#!;hC@$_(808N5}=b9msS7Sh41AYJa>8J9tWyRtyg0coHz$|Nn}bSovC@J zS~4h_%jB!LMFU-D`WJk=uWmFOl!cXN?>^Um5))I$B%(A&2q)uq$WIJhV0D!D3%zKO z0UB9&$opCFjz}ba9SUHCUwf&T7VH>)MZo4rg@+~?ANz`|$xQi|NEJc!K99y*52v!y z0wn@C>&(=n&sW$?JWJIRNJz{e)zA2VnOZxw&q?4zPRY16msMgcPe{0ANP^{MAX;Cm zaR!bK6B5@RQnxM#(L0&1kt}F6*~*NBt5hj;N@gXNqwz0~S{COGsve+M+7CF7YU%8n zEe8LlQc?^tH#tm(!~Xzr?T@yl^4E!*F6Uik#(xV+(IL(pKM;Zv z*(pmYC)_QLj+VUdD<2$R9k2=F=u0^16JRZe;v z?EL4vS(+<6mtu+M?emzPD2p_N(*2;8Rn(ogOigD-j!Fm{J+3_tvyID zvGGu%wc|~W>L1GYORsl*9oWZhyBKX<7PibzHR5s6jn|bLC}}tzJuCQHIMd>}(e{*h z#X+RbCp%G)3R=KVb~P6y3w6j0zU3Aj)q4_1b4PB>0A#Lb0l<#hy`YSXn3C@=Svi>J z|8R342uIjd-v#Lb#XtjhbwA`AT4s9BvVPEe5j>TPu4){0+!6L**fyvT7|Ht^o7JgaaKxNKp(LrajRJg;5yXu8 zZWXm*DGhOs;p4mBj(yA8lP(BG%8ZV~p zd~~{duS22F! zNr_`#ZYTDZB|k}eXarl=J%~<`&nOLmE7zK}sY%TmGSPYX1Znex@RrYh^4T*`Hpi{z zn6qdZ%Vx0C7^^8Rz?lU{)l=&VI>CpGR|)WmHCeFIKO9B6`N7LCr7sY>s?yj`!+f@9 zovQF=XDG!bm3#wb;ki9pIF@?7!WhW-lNjj>16H|<6_G5K{k1P{RFw%_O=gFDn>$8X z{-a)-9--GzK1;#$9v}j$$&O0aG;E%P@>$KYwDo%+;Yd=|m`qrxvf z>%fd@$M{V??ZZ7j8@K?IaR$w>*MH`-e1Gv-yWf1)W;qgI!`SaZ7$Bv%k-Ldd*Z{&B ziFr5_1#Vz_mT!^+Abm2ycAAd`*>TaE+Zpy9 z(R)se-@;~w)Xfxu(5A|`7+B1EDraoEZ`)b;0+2>dDfx@gj+%~TcJzuLDqn9ilA>+A zzIvimDg-68?eavPQMZJaxdf}&ZVMYqXc>l73<}80O^}=rw-vPfoXHHY7e|)VZ4cjw zpaipky|YX;t=ma_U7|W1gnAMjg_jDc7zw?n1H6XDk{CQRevWIU2kpgKg`uz#F-L{+ z^R2S~^G;-kob5e_)=>!Rf8~6)+&@WY!Er$V`-VVr|1DdC*1{`Ip7w0C9U95jSrP7u zK^mGkIK=@Ke+SA-#hVaJcGrSLmGnopFGEAu(djWee*WCu>M3yue1skE+JKs%NQT&n zYNF9#8iJ$^Ne`v0tWp`KC5ovZg;8EToB6o& zA`kP&V_kERTyoXfhr)~%!Qo^ir>T_U0h$TT?x;(zQO?l~O8M#04P3e2)3RzqP>B*O z3D=p%Vz-)M>#SU2!yCU7npI#3Xbi-?5nNIwJZ^M(LO$S@O&h)3&j}{0;~wyhhp5Z1 z3Dk1S<90MtHPa3uNll33;NEh zvap0<&~8V(>iD|-rVi~5cg%Wk>ygm$Yn8Tz#vzeP2<3Y|(q@(8DYONk*i7AdW5Y38 zgF6M7-ESy$rm?3G09xY}>u%rsBw2J5N@!ZW=Uf+e`Yrc#qwm91;A{^`nj9j6ILG9r zocF?x<3xcN>ki5xI9kplkjs4`wViy*XuK+eX`;NQEC^=dRu}l0Q4Z!tn`j!_Z=6ebY9ON!Y+NFL7Au|NJv5mL)kbnJgIX@tDgTg(t&L zxUF#n@=Xcf9Mdk72Wka=5$YlRpHQVWk7%zN5j`SQx?!H?;()cgs23_-ZeHTYQ0jY| zY61;qm|n$2jlz|^U8`u{%9ieb_}N$qnT_Ld$qva8dO?C!!G7dgcD{B9K@V!m>KV%G z)!hW)$N9#c8|_7<{iI2pQY0RTjaDqZD&Z{shPRl&*~TGqyqe{cL5 zN;^41n>^i2e>Jp%jek|PJ{{#>ZOag)Z>&n62#c}p=4H*%l0L)rzv0ojN!U$31F=B6 z+sw9dHDGBH<=!#mSz0amP>35sJGIE4P8$H34_H0VJ8m4SAh3 zxnOg#@aE9DNA9IfblQ)z;7y+rY!bdtVNv6$L{m;#SGWr|^Qb!5XstR^z( z%`Rz+kO-n_Z}hYSGD{eyCPJ1Ojm868f5tg)Q+ra>i7B1uHxEFLG$i-{VoRJ+ukhD7 zdfrLkvZ)DW59QCT7&h-i)~ULZwZ8-m$?Dm(73~=Np%1T ze6AU&aa8Gd-W1s@a70D!pdi(wIj{={P|%u_PpxjA&jAXBi?f`E%$T+8YK7hyP1F`7f>I(Ans3k9)1bcgBBip}w=! zh7SGT8mjLM|J=5EXZWl6b_wNlt?w IwqM`=50%)9ZU6uP literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/DataTypes.xlsx b/ClosedXML.Examples/Examples/Created/DataTypes.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e651ac7a2c41151f0602f83153f835bfa2eed963 GIT binary patch literal 7431 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 J;B&AF_#c10X*B=< literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/DataTypesUnderDifferentCulture.xlsx b/ClosedXML.Examples/Examples/Created/DataTypesUnderDifferentCulture.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9496b85d7f2ccf8a7be1fc407fc651329c4f49db GIT binary patch literal 7425 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 E0I|1XBme*a literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/DataValidation.xlsx b/ClosedXML.Examples/Examples/Created/DataValidation.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6d18dce269ce99b7712ae2216630e1bc93dfe10a GIT binary patch literal 12809 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 MkKf!Tvh82}4_!AQ0ssI2 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/DefiningRanges.xlsx b/ClosedXML.Examples/Examples/Created/DefiningRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4b479007a6174dff9a75892c16ff031848e4b705 GIT binary patch literal 6431 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 q{|71j;PyX=aCoU7+HFW9Sfb;M1_4Zz2F$!z8c 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 GXa5IEaV3BN literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/DeletingRanges.xlsx b/ClosedXML.Examples/Examples/Created/DeletingRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d4eabf8891013b8e274a1e3ea62250e218d6d7f0 GIT binary patch literal 6374 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/Formulas.xlsx b/ClosedXML.Examples/Examples/Created/Formulas.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..18435e41d61e7137255751792cc8a0a60c3247ed GIT binary patch literal 7304 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 YH7zv)EOYxk3UWXM*0}j}YX9B;0m`M-ApigX literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/HeaderFooters.xlsx b/ClosedXML.Examples/Examples/Created/HeaderFooters.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c2e7a1176806db20797bc875d5c979a36d1f9773 GIT binary patch literal 6383 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 OiQgt7uMq{@zxzLrU=42o literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/HideSheets.xlsx b/ClosedXML.Examples/Examples/Created/HideSheets.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9f987ccb7ec308ae83e23d7cfc13c7404930ce56 GIT binary patch literal 8602 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/HideUnhide.xlsx b/ClosedXML.Examples/Examples/Created/HideUnhide.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..85e4e5ff087807203bf5832af54f7ec544fdf58e GIT binary patch literal 6287 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/Hyperlinks.xlsx b/ClosedXML.Examples/Examples/Created/Hyperlinks.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e0e170a0c15d9dfd03905241bd6e8445ad57eea6 GIT binary patch literal 8190 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 F{{zqzh8q9? literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/InsertColumns.xlsx b/ClosedXML.Examples/Examples/Created/InsertColumns.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..163ffc0c50a756a1509cfc5e00df6e70435541ba GIT binary patch literal 6647 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 F{s$<;HHQ}o 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 y_^34Hp;9$#P4#$9wIA0y-L6 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 OpqZeyaWvD}r~d(E{xJjq literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/LambdaExpressions.xlsx b/ClosedXML.Examples/Examples/Created/LambdaExpressions.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..202beaf52b832d3c632d4086ae5b161932a47c68 GIT binary patch literal 6928 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 I&#`y)e{(*ZLI3~& literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/MultipleRanges.xlsx b/ClosedXML.Examples/Examples/Created/MultipleRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7e48c53748dc814079eed29e4e7bf52678406c76 GIT binary patch literal 6370 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/Outline.xlsx b/ClosedXML.Examples/Examples/Created/Outline.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..196a6e0978409942f16ff33a50fcc860566faeaa GIT binary patch literal 6310 zcmcIo2{@E%`yczh8*2(>$u?$&u?|^736qlDm<3s8ni*S4XGCR*B083`g%GlneW{4Z z7Rj2#v6PUk`47%HPOi>%eb;yWznSZK-|L&X4h)Oshu0qkrutA*f9s8L@pZwvY%P7OvEwMiNU@@;bCFuIzoo`F2>L!w zjanZUe49II{@|+W=Nj#zW?#z?p#*`dFk&>DjSh4)^%QjeIuIN?USIRp@WYF?k+kq? zxv-Omp8~=2X)j2${N>}?UcGd@VM5KW?_1lMC&sjfZJmy5)G~%E&k5-z-=|W1=r0&3 zpxIL+t@1mJ{2>5VAht!m)0KpmT0zB@Y)1LDU(##8E$g^3Aat|-#i#Rq=F}{)#-bkQ z8e@7)pO{P4z9PGYNgK#63I5T#?qBIA!*4aNyg0*e{%61dy8#nw{1KW&4FK#67D~Vz z2^bF|NMYyrrK(O-n-Vlp9}I!$hVz1pgB29TMKN9|9NNvx1upJQ!pf_PYinsDFdj$} zWd_mJ4NnxMn0OK4;;tkTUL6D?qFgbaNTLD`kMW}1!Qu#>ND}3e-~z%UQSL|=3<#pA z2m?``xQ`+JGp4AeKOXa+AmXrCHxx!6hw}Esc#(bq4ElM7xTqzP;DRB+#X$#{A}(r- zhKnOGXc!6uR#Zfzm61v+C^d0W(ErRej2{W(g~p)e@dQe+2qZTQ@gM%7aVT@j??ez1 zkKdv4o`VEqH2A;w>E9Co^2CskXe0>doCW~kq>%VvtRBSZoM}?zG$`P%#>K=jr%D^2qv95J)#sACdr2}c z1ZBH&>|&)5OJp+;f5IIG0Bg0-w7Z$-$Gus{4m4oC`1g7&&et>tD@FiK0$}v_+f|zrm4bKzEMvXOr zZB>OVPNm}&t>R|Ov2hm^Wyad`T1{l+{IFT2%@S{5)ky?Y@uP+csvECpqk44%a3(?* zRb!2)+meTgy6R8PUX?E~h#8h$LR$e`WAL);MV%||TCIkM@z0~2RAv*-o71XTDvX0< zUpN*la9qpH(VVZScQ z38>RuaY%(L-R6R?atGx`x9Gmh_=?Bo>Y7)FyI$0((B+in#Gi)jOeQ<@g{G51Yf5KK|*QNUq1kqil%ebk?t%Gj3 zQ6sHcZ#1HEcAA>pJ;Cv_yR1V-#S;`aYbixgXwTifI{43b$8Jq5jsBBK&aWSywlNPe zANG3oN7*uU95ggtvTQQGd&NUemD{SGmI>J$WC|B@J63vtv61`MxFXkp09jfOfSWq%=u1Th|NkYx-%B`sLMzzlRdpq zs)tKq_HxJ{QZy!+>LcP?Hw6aE%1c;QG^6ip*SB;WyZBIIl1ZSq>rtdWjl<0%OAO@k z)pW7>!~k>Ev<4NNK;c1`~5p-=59UeU5(TpmB)oQx~gT}{pcX$nK|t)Z*V?_ zk*^NFMD=rM8oRY4v?*aZO%DLD{h3LUzXxVFg*E41hrL(i3sf z;=Gt^UabtAw~C8U>KNR(2w%Rt&fJ$g@4+rl?zU4}@~`dMbX%N#**W~}4Ksn(vm*Mq zy=ca7{EwQFJb;pH+|uI$r3pHeU&Bi6BF5XWVe&(VLpa6xo!KwxNwqu>(W8}z=0-~&dC`HDImfDG9kFeaqb%H? zSYF_7v2gdJ$^Ei-1#Q3+2*P>U*5>|>`&SX#IW8K4vbf_Zx*tx8(XVC|Ni>YayE>@w zbHN+lrOYUdTQA+=O1lUWqrU-7SgZ|(UrLj;>fq_Jss)H0e()04XT5fF=E}&V++eK% zxFU>sRvoOh?8&aaRM51>{8%{5U}Mahi-fv?iXl|KP7pTeS>LVdh4)Qnj1r7Affg-6 zJOTa1*x`mChw*N{(zDBEs)S>QoQ=tT;e?E9P< z=M#NDOfNXq9J>4Y3IiuI`_n+<(rI0MThX#9L(MV^$!X0oytl3X&UuNlJg+g{#8d|1 zSMxc8Af^b`q;}sye{f-*W8)_gvZb*;4q^=|1zI>1IUqDYa7L8jjYE#CJ9IZOD5?@X zolzCtxeCYh{Qb;3f?}~5h5U3nw&4?blkXe|iPg0i1-4j$h0yX_zFb!jrH`>COTQIc zvY$Hp=2b(m>>=&OM>m#EcXy5-Zf8oc@i40tRtgQSGbory(eG;WCJ2-=+sluD%6xLS zJh5NL8%}h0v1&P8ixDAIcB=YFMh;*5;Fo_%QZeSU>7$JT(W^r3nRC5WX9dx;!6+U7 zq%$_1SrSsSB?zbOG(0nERU4@R;y`s7s&mX(wMlV%EzcUSd^&b*dguu%vV@Iaq2^hd zUU!u1btS1yNwPEZL&k#NQW8faMCw!=Xtl^dH}8&Yh)HykU4x6U?CWZJo7(4nALLmc zUCDqlPQzZ>vTCl}63{1%1#!D_sm;Im61pkWIL0g`@}@NKV--(Uhs;E_Gq7tai2HV9 zSKuG@4tR+nzHU1s8>LNIZCD2mP4xBXGtJVgy%mOzel5b#gv*Z#50fo%C98;WaUad7 zfi6<@9+N+%eJY_?qQ#cxess`O7aQ#CCksu_j;7?Fnde=2*P)!kx+-A+fM<_+B+8~0 z1KK_Al5XDG6enyT@IyAe=4`-L-?1Fq=aIv@i7=DX7Eu%5{CsELJ?Lv!&Bi^3i;Iad ze+X*6O+zhH%FPhA3MPw7BYseSY4`H+og03enhoGOGPmY8^2K*#ZJ{+v+p%&*6g_>1 z(b&J&d+3xm!`+q%9-%dRm;B5x9;*HM4h^<4qGCFL$d7!V)yasj=kp}t0xuT1ql{^Z zXBBjxq{wa#>W>|D;x4jDclgq)d-^DYf$A~)sSc6}JjgI1BL;j#aW(8-FU?^dh6Lq8 zX;vQy@mrK#ix$r`XK_9aL2}bo|FARzSPpoa^x)Z=>SLd8Ci3adIYAXCRF#s?Hr{iF zxC`ixM?p<|2L`LFV@@eDW}YWsZ%EO`6C>%#aE>S5R`q$~H{Q2Z@R=JEV*~0&^2_5G znYj~WX%lN43ToVV1T4Ef@;E(uHS*?fm^zso7uQ_W!&Qxb8K9+)Rnm~9ZE8z=@Rpmb zLlwEUUfV6*&4w@XHsgI?s!R`a7Sh^l@1xK=LJnVc3gWfplvOCxZ#>1+DQ zmmGDV^lI|aI-|A4S+gITi+am1dkP%1emn^}!N(N1^*P-!aJ_^&JFJC2S$l2%T@1hD zmCX&6sJ4ao)KTH9Tx_BG<*i(UQ>kSI`m}=K(C7&2)AHPh041zy=H!s-n))Za14qj^ zzA#I(WVFmKZN$|wkbjr8xlt_`%tyFSd^?dgl$mH~*O2M|(W-@iNgRJQp**m45rzWztJ3eF?qR1S~_Sn7TR(l zVx>Z+|N47(!|!6EsyUIH_9nf8{2Lp+9Is*wI@_PSohzRq8l_tS-3?Q19C>FmoNL%L z1Z=bPt*E!tL;M*!)8T0`+i41py_4b3Hp76mKFS>|_&mRS7;Dojy_I_qpA^1`q3BG~ zsR1)dJpm;Vy?Y`v6M%%QMY$BvQ@5iHeGHa#3{;Uik?#7dkjeQ|yhNt^Oj*&Dm5B(& z(TLJw7K!@8!O0kOwcD@~)G%|ZE$wk8wlKfq)1(S;O0q?HvT~l;f8MGs7kGu)g^%{6 zh|^oLZJk)mVJteWCYhjmyQA`?3B8|gw|V7cS;cGbt62pRvu*D^YO|}oozL+O@Zb65pl#r|j(x%P*Yz0~i|sm{3HbI6as%`{R1 zl{j6H;+UtqR_AtV>5yk((b_gP{EVZYkL#KCbipJJT0?cSDt3OEG4rSozg^a&l43r} z%6mP__IG;lX>FuCrWKhQEODArA{j0wuN#>^zAVETJeS?u-H#`l$)cZWBF?xyZ{>}< zw5TC@Gx+wh_-9vsRq2*jCNnHFcI-*RW?SHuo7mNy%C&4wbbycgYT8yJ) zjlQJg@jpTr01j*ok-_W&84$LweRY7p>inM8u?ktN9;CF1JHvuf=l|au*#BHH+3Bix z+WEaUe@`+|N2C7MIPl&Ck6n!fjRIjjDDNUK${q-;00xQwJ(q+bc<#$A|1{XW^Y=_Y zqTAoFzP`Q+zR+D@is%9cT`)a;c2}Q~ck?2WkX|UvpZI@U{HOBGzv=~AnrPInL+U63 z21&x8MJW!clXeB2zwTH;_4F+b#kC-c5U{+WiaZ!*306^8gsMYe3J^u8Dg+F((FFZ9 z`%j#GU{8u3g?0PykRfXSK>iCzOLJHD*iX;_y@BgqJ);_hL@Km<8wOiFoEJsAAvx~o zR7CroU25Jv(;dknq=4H$+__wiQ`fW#P-f1g;Pfu$Mb7re__gyfmeMQlaF0R6XrV25$m; zkYPMTzoR6Z*0frlCAQRhhVJoF*R*atFOzs*NgroVD_hC4@0P>)YhT&h=F^^y^m$s` zexnxPqIAh7FKvrD`|Nvl8d$s*KD^oPgzX$a+D}biuq52&`qT9|>-ve&lrK1mO5)>& z4$LOgUGRmNZ3b}mi3cn$ENZLuLrc~`m(+w=U0?O5X&=gK*Bn3BGKXr23pzgCp?4Ob`{(?Nad zp!GrdW8eBFWt;gcG2|e^K}BL80Y+)WDG2|fPaMQK*uL-MSTO8)@^>?T(DYzGwr^U+ zv}^jy?(87S!M*i9iZbgi%E6uXKESVw_CA0J_y3@T?>~Nz2nUz?{^PL}j{aido1dbi TWC#FYrhMxu?d%)i&ei_`3c)nA literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/Page.xlsx b/ClosedXML.Examples/Examples/Created/Page.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..628781f44763c45f5a91d0cef88ff09002b501c8 GIT binary patch literal 6857 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 VL&@`xUsf0aw3Pj8DbJ5j{|Ae4EldCa literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/PivotTables.xlsx b/ClosedXML.Examples/Examples/Created/PivotTables.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7bf64cd942e2f1d521a18f827e08e61b43abc607 GIT binary patch literal 43688 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 Z4>YW*01c{sU|=|)Zz9lNxGZ{U20^IDDO!*34 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/RowCollection.xlsx b/ClosedXML.Examples/Examples/Created/RowCollection.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9b067ac670b7d0c503e51020f0a65f61f5e673ce GIT binary patch literal 7178 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/SheetProtection.xlsx b/ClosedXML.Examples/Examples/Created/SheetProtection.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..71b2c3a46c5295d1c8830154f1b3aa564f9f5c1a GIT binary patch literal 7267 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 Ui1Wd57d3#Kuxr&hdGPE10Q&t20RR91 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/SheetTab.xlsx b/ClosedXML.Examples/Examples/Created/SheetTab.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..198a335c8d50debe68ba1377409196e111edfe30 GIT binary patch literal 6245 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 Hx3B&WK}ZzN literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/SheetViews.xlsx b/ClosedXML.Examples/Examples/Created/SheetViews.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e63b8db8467f1674f5a70019b8f2c13908deecec GIT binary patch literal 10269 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/Sheets.xlsx b/ClosedXML.Examples/Examples/Created/Sheets.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..49fa6ff3b321eef40ec5924c35b0c94a7be886f1 GIT binary patch literal 6918 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 Z4-#UaON8V3@b46I05NV4JI{Q0_kTO-NFo3L literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/ShiftingFormulas.xlsx b/ClosedXML.Examples/Examples/Created/ShiftingFormulas.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..22f52422488b62941804610d01202be4d7b1c16e GIT binary patch literal 7636 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/ShowCase.xlsx b/ClosedXML.Examples/Examples/Created/ShowCase.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bf4035b9cec68e3cbfa7c396aba5e1798de5b0f0 GIT binary patch literal 8171 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 Ca)A8+ literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/SortExample.xlsx b/ClosedXML.Examples/Examples/Created/SortExample.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8628ce6895ff277a34f33710680261989c196825 GIT binary patch literal 12583 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/Sorting.xlsx b/ClosedXML.Examples/Examples/Created/Sorting.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c5d60ffb973ab67f87dc162559a39d92d3f77694 GIT binary patch literal 20566 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

_nN;oTp8%+nRJh=XG76fIwklowPWpG=NHD7MbY{ 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/StyleRowsColumns.xlsx b/ClosedXML.Examples/Examples/Created/StyleRowsColumns.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f6e76081a53b41660c50872f57f178bdc08425dd GIT binary patch literal 6557 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/TabColors.xlsx b/ClosedXML.Examples/Examples/Created/TabColors.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cc12352573278e9c2f0fdd9269d3c415c7a62e27 GIT binary patch literal 8042 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 H69Di(q>~OM literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/TransposeRanges.xlsx b/ClosedXML.Examples/Examples/Created/TransposeRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0d533bf4291eb002d754d45bf1912b4275cfcf5b GIT binary patch literal 7199 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/TransposeRangesPlus.xlsx b/ClosedXML.Examples/Examples/Created/TransposeRangesPlus.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..877799939d6cfa720ae68252f6a2ea20714d1cf2 GIT binary patch literal 6943 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/TwoPages.xlsx b/ClosedXML.Examples/Examples/Created/TwoPages.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7d4f1c665c3fe44aa520c638ee4e5f94a43e1f80 GIT binary patch literal 11635 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 A(*OVf literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/UsingColors.xlsx b/ClosedXML.Examples/Examples/Created/UsingColors.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..812c129cc6a3a9258faaba29824857cf6a766665 GIT binary patch literal 6837 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/UsingPhonetics.xlsx b/ClosedXML.Examples/Examples/Created/UsingPhonetics.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cbd24ee523751ed13bf184f8babdaae318f30af8 GIT binary patch literal 6414 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 W#)y%&LLd+u?OjE~8)$)zZ~q6#o^T=n literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/UsingRichText.xlsx b/ClosedXML.Examples/Examples/Created/UsingRichText.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..77cf712fb3400dcda274ea8a288c495d2309cde4 GIT binary patch literal 6651 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 AQ~&?~ literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/UsingTables.xlsx b/ClosedXML.Examples/Examples/Created/UsingTables.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a6ca79c2450327a16a54cb12b409d5e978193304 GIT binary patch literal 9299 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/styleAlignment.xlsx b/ClosedXML.Examples/Examples/Created/styleAlignment.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8fdcc9881d94be64e1485b34f014cc22cc4b6724 GIT binary patch literal 6578 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/styleBorder.xlsx b/ClosedXML.Examples/Examples/Created/styleBorder.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..aed649cc7615364de11ddc06dc79b2853c6ba4c9 GIT binary patch literal 6614 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 Q01ffmK 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Created/styleNumberFormat.xlsx b/ClosedXML.Examples/Examples/Created/styleNumberFormat.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1a9ab0c78e4493584868f2e4ff181f4f712030ca GIT binary patch literal 6407 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 z z5vypYqZN*hv`>M}AkmNZ*S9VfaidTE$FfN3YY8{|Xv3%Aoi9`z`DC+5t%ht}ux75>MlvbxhqC@3c8KR6bic}I~DfrjpQ5j{1 z_Tuat3p+R$v7FA4$z|ZsDu!7WNz#F+Eht)~LNFcB&he&sa?8Ypym#V-335(Iw^;+% zXF&!w`1TJW<9P_anXy#BWqp&AxD3!-nb1_qNgAR)mjmzYqpRrJ8rOqugtg8((s_5c z`|H!Q8e1B=z3E;{x9Xr9$y@VMZ|YVksnFWG7lfvY)89wBZl^0mRKbq!!L7idX4BJ* zcC@sQqhgmv`lS*yDd&S6k(W{Ruk$aG&t2)Pw|YIsG0v{g#uEnrEoN{c$C6Cs1x|DMj`49icJ>c7n+u5vpV;d68 zQxn_CMYPwiG7;?=5^3>?cUA5U6Uzb`_bSuJD2(=dA(j{W#3>yUF2*)&xsH6-Srai^ zdbpG@&5ms&%MbVq;3luT*$30MES{7WHr4y{1>|4!w6d$U9T(1d8a@bq^N_B{%n!D$ zWAD1C+cxYbTdrl-h=n-+zNT>TMp5A%@jmqF_#~fw2bHJHUBMo-c_-BCB`Xg>k9l!K z9 z_X8?ZaIffs55sbGF50t2$Mfhkb@`$^Rpv_twnPmU3OAc~D{iY47nov_ZlUK*i6RkR zK9`D5ueU3Y!_MZzh=lgDwg*m%QouDrwmOZ;!eu*MshFL&M^j-gS9AhMKK+mIwx+m3 zy;Lyz&9hX!efaNkmn5=b-YF>?=w`yy)ZuVDrO>ozkSPl%n>*d zDQLv5QvNh1!C-nxY3B&F%-KfrCA3D_>{U%1B%t#GW^R_nx{EnF!zwIqBh`XSE`6ki| z1c&_{(2}N3lW)5=suBlPW%NJ!1e$31LG1E;0G|=y!^X6GX0@6lPRDc+T;qEWMmWlU z-3eRrM6q@g_xSCA9Ul8Nq%^(IM5q?$dqo*jly$xtF>U&R5<3kf@U!Q0aKP}0MRtEc zNuJn#i}M!EchKN`%HDrM6tq&Qca$W1{e69-+46hg&|*F!{RvSKRu}73Cb@re>)rEGN)y&;MR-B zSz{2y9fX*V)|-+8|7P+p#LDn)1-FC^8xZtZFLKp6k-6Nu>$z`8)MI z3NTa9J)Y-FM-e&yag+#GI4^|WDIlDs1^fvs`rW2pbtHbddKqmdxsb%=RM+DVzqfP5 zL^g-QzI7flc2O#SoxR$1SE;CaUoYfPtM?Z;_H^x|ad$E9i738NgK|=KUJaum1fyj7 zXF(KFhmS_VG+|zk2jcR6v}Wq9>AL;|3AH5}-a&t> z$(Mg$?t+n9|A3+H9jTT%Gh9E_!aAtMqjsdnQWS|G#&Ht{0TBc*sD(pVg^Di9BwoCI zwE99{NLnX_f87wvb99RM=Ni`9^-_-gH}L(nqQBuA&xHWO1SeXH(r(V{9}I+S@e{sb z%sHYm7-WV#xZvWuFlnM;@st+FJ-rvD49{LYlNjO)5qu%5oHY5l2ZWZ~mZb<(Ex zaFLHTvei<&$Y-C#`)Syv%9L-Ehsvy(sm-Pn59Ce)6~iYK^3}a6sRsmeVi|py^Cr+T z6HE2OYG`p~rAysE+B|`XT}*bP3)-lZQA+k1Kf8rug9=u`KpU#wQ4j)ZBljhMDT>e1 zZjEU2w@g>_gHhjjmi=@4>g$}pJ^rnR4h)7b!U~8~AmINKep!Cvw^?Q4XBqtkJ+OVf zzM4~(S{nqeRSeM=s5%}WG+awNimHaN#+Iu$MfiPruYyw2J2I#Uy^0`_=}CI?_9DOc zuNf;L5l5l3`;yQu)B$6(yAR)1`5(}tK&QcslCdA5kP*o*KkW(L9>NJLCk$tm$WX?5 zFe&6zbtyc`!)L9THbFD(K1+p)?JJO)X-FvM_rt@3V-VS~D+xTG5F>nudBeeiZ;FycnJS}AV6jhhs2W*{{xn^Z&)|qx%1S+8 z#WGzjW=Dk_Pz*l|8J044Q-d)Xnnvp*f`B_a@aj(dA0Jd_qwLm4)eeN0TMp%6$y&M9 z>hjg*g^$cXPlE=V$}a`#HP?kYn)2WRn!VhG=Cjs4drbJPNx0rFmJFi#Ga@|SHqFs^ zMxUBnM_Deix-eMNQa2x;m(*PpT0gfh&0uag-p~9!bV(iixZ?xFb^@4&`VXd-_3v1; zn|0HkZ5qWv`)4dt{xcRGe_~NI!pA38{s#by!%Gte!-#nXv(*P<1t}mpLF;XHbR(-h z&xEz~40>v)^YnK>iVi`rG+GnOA0M3a6_dow;Xpo+4sgOn+~@Y~4z2HJ zc`)h{I2UwumBnN<8&s3`w=wLQ!a>|<4PTlJe_zr&qKIWNk(kMkM2FaoZQ(hnR{?sYn(Z|aTq6W zav+B#i$+e5s$#Lf1IqbM!bZ1Kz=V3KXQZr@y%N7Lb0s6FjMxnHmU_X=xNqJ1-8?}b3?BDq{V1q#65GI5E5s*(YK7jh zEa^`|r5Ud&i$l*SP0U>a9ZS;eR6F9|Y`*9z!WHz-CC3jpwCdmA{4JDoE%4?s08oeu z(A3{>_)AMuO42_^?6yc8Az8dnXTbx@ga7 zG3bHxR_(WOqjxM0Z(oh;&!f$}?~1a}9oQ!P^XYVpZAc6-PbY9SFe3RGvY9ME>(lJ1 zF2S3KT)2)@S}aJXbVAv!ns3EEVm*CSK2lU$B!(z_78A`%@?d`#Uu)wv>xvjJo7t zEzMxX;@0?{?A>|GqjdWgkmWPlY{_eDOuV9f^EGY~ik=j)lNH4@iWmag;7hsN0Jy@t zjiX!~6UP`X*9H+_$KYVUScR$lH#N?}ko&maxQW_XlXPl`c``-$DN5 zi=aAVUHACOe>>c4n34UsStaAV)&yLa>3wA^f%fbine*vGHa*4!JGD7Q%~357UF^p_>t>>#U$(BFgaeoPcB=i0Rqx0_!lPA|A9%e z-sRtzEc%5>Y6%Q37U}7)5kDhXSEVZdPH71>PF^TP8ZC?8%J6+hp(gL13}H)gd~Dpc z<_&vH;g3`n8ChWr=Zum(>OI#Y-ZiiMn_2|U#tn-^qfhSDa?xdZ^piy?1)@RL8BkTq zI<>|AS2)D?A0k&*A|4LQhw19P0hkPG5VMw?bz*m|y8Xm%t0*c<6$lCyXc}4Z|wQ0m}!j6+^`WMnlzl7P7Puy=5xeFaXd{qDPPg6LjRIric0a= znx?Qi`lzhv$>YJv`KBBJg;MHlaX5>KGf+i+6D%f=(DbqrRRGLJRPN^LSy1w06yze8 z6W;Z4zCQ2X^+||s7EA8>SYytQ6*tbost0yl&72tS;-ZfVyd>Ym*1k;)sDK7br3eeC zCV3dNF&nK2aoy3G^eBa_#%#P41h%S@pIjw z?bQu_bL38_c)8gT1SqA1B=eN3O4!gj_~6s*10^Xj+q$Rza3duVdWVP8dv5bwCtU~ z-y!(((bEuR)#m{yuI4{mNVeYv;0?J=Mxcsd3VMLyBj4SJA(E`Q4w_wGQI^>wF^|%PBP%Yosn*DuQ%stkZ!F7RgO+XBbz<|2peGCB8?S*#hihhxC%1CK? znzT;sRtZX^^NC-yI%J!zi?h1V5f}5^UV}bnKO}*`H@HJ!;hNoN4a;(Kz66wd2R;WU zA{^`WUSSON*N^dn&|Q59gbL>??q+di9-n=h`k%Me$J~a=>v~w-j`kkbdzy$-g}&<+n-PF&rF=1 zd)cy9%|aej8625ogEkdwQ)|O6E4q3O*F>&y|Kur^z+x+rKI}45GuKhR&FrYdp;nV) zjnlS7gs}eYtXI;+EMdaj3-JWMGfA@Pt6xLmr^mW8jQ7PC3Nzo;>drp$A%0cK>n8H3 z0_)^5XDs`n0h2-o8+=xT#St-8dl!-CQmATcNY-o+%bcf%fqmu2&WpIqkm-2Rbo=>C zy#Mf)mM;_gz5AStlHTYi?Dlx|dCFH-868sWo%IrQi%4#odp~p z=7panbbuRw6`na*-ewk7db6f)4+NL0$c|_Vx$Y9tuq-Vbq%hxQ#66VM=}dB{L?Yq! zR8^T@i+UrNLb-iBHkFk6KBO_PI2Nr;JhX&v5waN`=nz+e>XHk0%)EAQae`Seb}KbM zJ}MTEpx;Ls-64s;s@4_=0?E5rd&c>*@*EYUZ5~AQv+}IA^sDl0mva8I@_fq~e#^6b zj1S9G%~12_Iy8b}eTN2Qjhxv3ll5i$Re9FjvRh|F^GhD>CL=2n=$s`~-Kx+%7hkXV z+TesDtn)6Hl3(Ds@|#g?lX@B+1#5Lj_586K5|o6~wE5A?{xiyCZ0BXEDfy?;NP%Kj z^S1Hy!NfS7)EqzE!pp~@aNr1$Yi$gaUXHsixo@)Xpj2Yk%^10cSxGg;HOvhI2JEE7 z-udE`gFuaS#RWttrzjqn@zM+QgZ-QcAVPYVHyZ0CmtW0Dv%Vl59Xn)O~Pv#TUNyJ?ax^wAA?GU1|( zd1oR(0&WyzvrpT$i;VeBU9g#E)nW`)CP=S0caPH4C&P%*!}%ET?o0KA>A-lNImkR0 z<0Ro6>H-&tBe_l(78n{4SKDl@JB}HPT@^X;0PU&(RbDB>Is$5) z^6+7+(AO4jvNjXfYqV75{3H1?DO^;j99B@JjK28*iQ(HoGTEKeNfN<5&CaRVCn~{) z_2{Z0sPPi>bP)G}xoVs<;INnJ2|1 zGqEI>m%Kv3-bWjIO$RINNoP-4K0t?pe^{#WMtPYv>^EnY%g1`)mb0IA>^k)=+Bqz= zef6?{Z#1TNUA~+F%N?&bK&>L8JL5Ya$3eQms9;|PKA!j{^x)?s7-B`Ni%WM1OFN=> z!Tju6&1TEo?zR}Z`~bX*ExkUrlH%POzR#4`pgEdsYJfYJmVsL1?JNJPKikvlxo*w> z)$(niX$M*DY-%iH>FN9TrMUGSGbIAsoW)nZ^0%dKomuqBxojv62v{}3*mA6NT%UnhR{# zKVO-+bWfX#SJ8u;HlRp4Z{`*@L)Erqtx3?2&#`I31xU;*#c&B6p5P$aZ?hn5?LOCH z$uNsX2ws1bD^81wdDZgM$;w(jlKu+iXiqd_^9jk(gBsj^-mH$-x3WMA_zUT3FIlVi z0Z3}C+$~0CQjgRl+*s8B+z{Uf(J6tPs7QDI4Jt3v+X#AU?P zsc}AA#B9qBQPus4s2fP_coz6Q6ESH_6ZCck-!W*j&?~t!JvMB%)xEY7>ZSDT_!Y>B z8p8}Cp5g`VCQXDOD`y9DgU0>63C9PZKQ$G!S~blINJGf~)zAOZ(qDeQJ0hLW^%z7@ zrS!C<0ELj$3z#GOmzkG?)`|XEi{+FPfrVw?`W*6Vw!JWUYr((s9%EwL!c9PaToYKm z5e{p8{vx>=+$F!GE5Nk=_;wyUh#e`?OWKnm4?2H}tF%Fo#1fEw#8+lFiiEV}S%m$O%_+p~=uk_U6+CH7X21r?F2&&uta*x5 zCqJM;sV9FDP5@6+Z8d?Q1iLCJR80%A2P$oE{NxrPU7Bs)vkk3L+vr06saDq}dq{hY zlcdy#EPB3{gh`(3#}*G<;Y4{d8BACr(H&&)?p$}BAiCIv{YYp174|3bvm-2q7Wd4f z_q;y_%b7)K*($hwuLqy}7tBN$FJ`ImSI)4Mum3g>M}UiH^=n{d5O3EkAs1DfWg3J3xwaMzF~3&e_2=Aid)LX6oH1%K46P{l0thd#uGcQq<0k%LGUIv4z z*V_2Gy-Wn7(Y4fy`lwC4klF>#H}DpGj^ z)s=Lr_5TkUU#!}IX7$Rx|uAO=li14Z`K?-J#c3_8V^*l)uMn#MoD5o zz+9d^=*6T}@*)zobTQgStN9YXS-f`VS6N)&Qqd?enuMJ{R^wg$1G2Yy?>$HKDy;}aGNPu|Om0om z=CMqFMxcrRbZlQWB-B{|wZERLY3#)SexOY}%>soNSoa|heuHD)=4#=}{gVoJBq(x8 z&U2Iz?C`9&K#pbVn6+T2=U8=bxUeYVH(Y$}*B2OvEMM^-e-k6?<;Vlx|6CjA_=}~# z{r<#*-2e=w?nNLajY^Rkp}>L7uB6cykE;5Gx)&|P*P6;N>SHU5K4W)^x(H?QbnNldm6c$~hYSnE)zO#}yJvb*RShW# z6$}CQa(Jl~#ZlRh>wwuHt&N5>;dkFC(qMuZ`2n)^r zSR-QWc-4Ntba>9uw_`sB$sOZn(hLqcv{dPe-WFnFp_RG<4M{HWRokgko!;T`l+(Um z@?;`uCT@~?Qeg8|eGzVdtj*)BF}pyV+5WhoLEVNODM|NgE289)Vy!XWXK*|%ChEs{ zOfuzVUnN2h)hXPbmPNWm_xDk!^79HXZI_NY!x6#r2hr+GIIYY>8f zcZEtKv@4PMxq3ZdTbX9DmgOj+ezx4Km5lAW2do;7A4P4`RURa6^OnrPI`H~PBLRPqt-3)y z|71&Te?Q)Mgof^Q1n;8m0Sg|Bd2a@AKts=uRN|DR_``=EU+v}l2jiJL(X5@7RUjzW z7duv0%o4s1QaEp%%kyLkmNC)j?T-OLW9oi+T6Z@qoI4bv92Nwk-xB8 z7U1&S^Uh1L{kA67K}0`O+~kHnA;78S<`Vsf&$8_emGD;rYiCZC32yBhBFod^M@R&! z&)AoYoNv}_HkegD<8&;pJos};wn^9}KBNo0MKZvfqssnnlB04!pkokqu7$>x-9XjK zFlmEhICtne7q6Wws+X-)T4WiA?HL0QSmNTyNaPG_n!E6m%BkyMbM+sr#ovT3EP9GY z@0^8z$2&Y5nCnq$Svx^oWEL^^Xz9I=ikzPM@F$HjMYQ_= zD_j0+@BS6b3P`^O!W8KZxH4nI-Z#kp$AK_oz(5$zKL)~DIu7e#mnYPOwaFqrqJ|)CRnP#C7)zpa5?5iyXC$eT2Je%~zjYSj|>xThmCnae} z+#_7RgNRu!%HH(Be6fOgcQxBxqlpsGw@e1vN>73PYaq<^uYs_e|79SIC}RxqCzU1t zM=Eptrt*eeCL@*~`b2lg$2zmEEPpi9O1Ju;CeEmbssIvz=L=!el9^0m_o?$GI76$`LQ}Kwzg(r8m2_iq_ zpcxnP0PSe1x^WADzW(}AJpeLAdFgUNiex-|*Y1Xsn-BTX!6GrPulU?ULR-@b&($*U-L`Fg!CC6>R ztewAlayP~z)-M(xuP&0ASR-i&TjJez3zku>NfdKZTCjMznbyXtVOilTq$Xxc3dC;v ziY4AkpXDSdY_2ty|5yoV3l5*5!z<>+o|2NJd%DLiZykSPfK`S^qSQoyP*og=?_0m} zr5QJL@;$Itz1s4aWgxE*jLZ?6`-0P9Xw@9xLBe!j7>#T+!jh%DOYylQb-E}#l)LLdyj{0)2J10B`x{AlE+}?tPv7Izv=Kf)SO1jXbht_TZo}^-nJ6@WKD)vK0R0 zUtCrLaJdul=G^76DJ>3P7!e5^R7Yc03czL2-(1E9aJl-QxcuoCm-SXCesVeTCzo4o z`Mk_|0YEUtGS0rj^^w+$6J;T^Y$LlS^H~*T7ZF=mKzADu;k} znc{K%e%T#Vc{NhR=@9su30&Qa?2K>Sx6jlrwAj*O$zqRAF4wT~&_laaFcbKN1|snz zplQ9DPeMgrXxy7XU=At%Z7d6!$c}bDV+xBH;o)FF+M1_9$G7^I$t}a$O@{T+dS{B6 znZz&uC^J?u5EI7qLGZ|4;OOlmeh)C852{vo!X*IG7q=+k_+z|CLe3jwH^|btB+@n0}N}WtM!R(iq`#l))VRY0USmU)PyJ$suu5!jI#n{2XDWwZfCv z{i%neo;H9y+4Pp%zZsLW$bAHl+ocaN^RE^*s25GOMDJwAuNL-H#^Mm5@{YwGS9AAe zy1WdZc9Zg#<5g;iIzNcrz581SJ2s1pu?^5<^#P#zZf3nXs|@=puwhyPw*;YhU%A@mswU;7ice?-n^L4RC`AXAf&E zY>M-aoSgk>Wj}Jdf66mOA+e{zM_ZiKr6oIH!;uX*n~mw5_bl{m>PcAiTm)YVv(ds1 z`J#ujrQxx)z_&8JK)n#z!q*b+gQ&)3C>`W1{9+g~qSWsQYa}Kg66o;M$5|J*kR0+F zBl^e?j*WF4v9pH=sOG_o?Bl}QeVA)tl7w$A(4cv^3WLO{2IG@Xi0XE znX2-)ZGS8hB+CiYy)68Uj!Wi3^~h$lh=+~Nax~^t>eyd4WNI--u*?cNzXFp6>3a)lA-0>K z?=@Me=4q!VuE#O4@oUt#e)-QDob6tof6Mmk5|UZG0db`c?tiL1bN;G5tLp-$p3z=u zQatHcp)dS@4LyhYO5hsBQZ{dWTD*?l-C)03xv$G@>Sg3{lM=8oMoBavk;?qO>3rer z>#OqZdBt8_wwzqNauLmw?5YAqd_O{D) ztt6QjC-%{j_f*i4ss^M|vzGj9c`1|#V^TO=$x^$jS`yPC{5sMxqByZ)==c~y)37ol zkUV3n2(_)nhXsjo%lSN8!Xp7ie+|4Vv(zoF5WvKf&yK}BQo??aB zd^}uaJq^{`bgz|L4uO)DbSIMd_c+Bx7>1Woi_WG;N9|PHP)Yl`Lh;TTsA)JYRp6KF z7}U8HS#(djJqvR1TEUDF5T&zig2o{w6yw<+SGW%M_wMG+vYN38fH;P^w?W+`SY_G< zHY|4rrF`NwvY?75_a`IxaJEse_Ggxr9}?^#c^@?zK~5!k39mf_3huX?Tc0&-(3C)@ zjt;$)`r?<;3woTEZwKiALc#S)RYa^Zs4x^Iq-~Y{x-A(8T-}Bx)oFXO}geQ zLDSAg$BbWG?E^;-KK$r*V!i82mTfmKUq`jOzRm0Vji*?@>b;)I5&5yDF=xkbv#;`x zf75JgJm3FQ-Bm|L)qZPwknZl59;Bs9K%^UK5RmRhNu{L)q>&Pk5=2TuNs$Io5k&;0 z1QY~O?wLUyI3IrZx9+<4k2@?_Yu3zuX3yrG*=N_YvuXZ4LKOo?s3@lPEmpE7`en*h zGMZ`i(d^NY3$;(xySE%AzohJA$E|Ts?o8-Nq-2V0wACIS><9a7N*Hbub5M9W`Ztu_ zMVihRt~MEjHf~4_#BSFwO-6hn3AoPjurrdh%9g&!Tu;wFfI`w;HNm^LeDXSB-CI)bcCc)(cZfc%pkudM%2D^$=+%}XThB>+R2|Wq zfF~r}Jc~XZz_Wrn(;an>`$jq36Vj@iTU_xJ_#L7a-&KZk_}q*>>fYi>NdNi~3UqJP z|LWdK1-iEa|73fAIYOTLKfPNukaxKqg*&iZuZYxroiEBC&`ouBk~478o?y3|j0zsI z1e&qDsSzk)F6!8Ns+ubKxgy*(M!fqWnK7F-pH$6dPBWP6qo;?~eIv;samyF8C-h%! zU&lS5d$$~EK({>CS`)4!Sg%%^WmKF+J-|=JzS{=z?N%+eNaALBWARh3v2VNTYOb)l z^cS{tZ+q=bVLl+&+XK$^(k^Ej7lfpVWyD3Q3$^f+NB;nNx11PES9W_nFX$$cxsX0# zprSFQG|~rhz0b`-CrZ^UldBT&33&hXeDITW3Fi6u36$=S4Vf96Qpj`k+>NFy41LR9 z!1EEO#Mkp}QfnBd!c3d%hsEr@);S|WXTDsDvTgNls20OWTKlKVMV9aP-9nk3TNwv9 zjzXjReN&ZidA4t(Z4$X&Xfe%5qFyTred2O)kIJzwCi56kPm{%B(V-03|NyGC)PSEy+vN2_|PH{ImziN?7 zGNh5Py6`bF{@RN8MJ576GdDMXC>=_72kS@O77r`>>{Yw7biFNa#hxdNc38)+*Var2 z_<)klL*`xDBEXjh`oBhVV!xxgqhW~POH}O6!fMf|B(Gy6S5cf~cMU~}i0>sSc3TmZ zb~N4y9t*Kdwk;jj#|g}Qn~jIxFF&^Rd_($!wIa)LDK=f1 z3YDqj8n6_rUNTPBc{`5FDsF0Lx6bC&q2dsN=2vMUuzRf3T|9GWpZ-!`T+uJzvd zY)yT*eroLIS8tVinlEhZ&|puo%>Bi2O%wD7p9!_T5nad9m2zohe(zKjpJZR7y7weU zdQK=>zLS;;EizQ$%Ltl=zsKGzWQkkf$6a{rP&}UDw$Ln_WPj0Ieq7_o&aguZRH}X8 z@|>)F!zY?8wYNYbwcixIg4)DnZ@|XmW!{$SLW6yQ5b;DqmpJ!TKHXPYpM_eVaaiXW zB+gmC@C%X?C#Ci~9APYDjp)j*p?AlBBe>XP5of~PHnX>kF3)o9Yv3ovt!Bn#*UF(< z<2ZR*!=@a-bB-;Y95|_?%>f4*SNWv$WWmNsdVDf$h(9L+<}#3ah24ELUVhg zyz2rB;&<8kJ=*6jlNw4s(~X({!zzIS4TJXIuX|vB;=Y0{`7%6JngW+XY}c}$Qnbj+ zFk@SAeW{Js>F3feXsoWbwOo%KIBzUKzy{Rye-kdA;Dq7-?WJg-I6u-jcGq!C^4DTa z6$$_^WhkpRZ22xTy00fG0n{dk15wZvmCOe1vkZoFeXnQKrvkM}SBX_C+dZH*+48$KS&v^yLYf&% zIJ!~2OJUSxLrdzGUp30)@xt^K_BWoMQSAE?BUS!Zo8wl{L9ct6iZRV4I7RLr(gAMM zucAp_v4|vR_BY=32MW|dY+YW0gcj1;4zAsRmJXB|5X@nIgahG|3 z;-r8lFC9>v6ecfbo4PpCRde0z?wjpfTYH{6_yT!o| zXm^wYBgNDmu+Fba(Axx$vG?a4{MdV7j6Yn*tRUEVF{Fb-6xIC3({Jiqxw9?o?bZ6- zb$G*}>^9LG?qbT-(RddbYo_K&c)O5;1|BeqE1r3(KF=6-RTK4AeIa+ug}14jL93+! zV~p=s^*07~EezgK-8OCY@648c6v{2fwO8`qsjyu*ncN?x^Hy}ZmH_>ps+@!MrKJ~I zM*X{3omBXDqM@-%XAgopy=xfjX4Y8WxWoqWWH+8L8_VT2DM}+hNt-~@Wxq)LKo2? z8RQF4{)6lRb=WxUW?FFOJ7_DP#L6;hcGL9x^~kmkJJ2{RTW1$7jMM5XCK3|OktI$U zhXoEBjITr=NPo%@{79SpKx!4Y#`Xl`tSa@_0`l_sv0lvXS*O-j1|O%C17rGql^>Do zxHl9W^z>pT^cCk#hwo(OU|-m3;xi{V<*9qZtED%`-|9^9)>id?i?aDN#RVuUx{L{D zNUt_kqPc>W#kI4c3PNSjZU>J_ZDU9mrO5>nmyZ;z`xNCw${!okqB%MBmpCi^N5jHM zqtGYLRO+`{gnX3rk=~w}44Zvl8;Q#-^7w9-Nda+{SY3K@Qf=0&zDLh44ztXPTc&6` zHSH59W8F$7wO7?}xaT|ND7f5LAlW@t7F|6{KXv_GpDf#+cIXUKb_%UQP(RSv(&K`j zz2P6N2h=60?-<10=Tf`Em$;A_(uUp4ZIlsrN$wFwlu)X;Tf1Vu&67wD8JX;{BJAL{ zDM17G#H_d>1)4`qojO#sdCT*u562SdhQ1i}S`x7dH~HP#vgbeB$-4ba=W=yqg87Gv zPmBbutF#rZ5t5;IIU9MnzBlg;WH9jwcSEJKO40gTDUEJiT;9)|#OfmL9l;Y;z>Jsd zY_|1%l>Gkk?Ttmf1hKuE)=@@2=f2(RH(V&@_!@3`qo2#EwS3c=5d6U~=NzN1Px(Eg zxLkhGE%vHM?EUz-2|;YJShG$vw>G&Mv}Dv#1xA}fN|41ib8{Cj^LmfE4x^b5s@0GN z3?Q|Ynu;M6P}WE+Kc6;ViKGkmNy46F4?v<_VqUGU70GOKeV~7dr@oK+;9h-Oq*eET zv5(4Z8OI*79u6fRULc`0 zQFJ`}oT=r`PiRc;0c#9hru6wYplf&=@g2Y4QQ_Yl?hy-{PUoM(B?|g%wc$uQDW^6U zfiApoS@rK>VaVREu#gK87WTu#!ok?>rNxK_TuB*{SMy!T`gMt;eD^p7C2=^pN5U7b z@r>m&-I&muX)FoF6<$E%)$jEV*8e@!XDlb_qT+k*#8>oX@ZaR1mdr! zAC2_1cOKkxg0%oSO{+`q919D(P7e!neuag&@UT$OiQ)C~t{o5-YLKmy919Eiz6cA~3nRO@YZ%?On#K8_AmUPB=8t zTm*C|oY0z@7eCiD@`8ZlHW+@@=)$mwl4l=4JL=#NqhvtiQ$V9;*?jwcIVqzHoc4hj zPWwRloA#l%7)JYG0;7H4;_R}_QXdHx$bW8=4X^TXQy;7H@oYU7?$RR>oi7N!RL>o) zVBz1{x%k8$2j{S4tlVd@N2s4FL?(P%Plb2E|O&yA`G9MHO z4FAQ^L60IsQ&*t<7D$19SG}0;HI5=H=QK&T!{}TVSQ!`0$eZ9wV$Sg8{+gwU=RTIqOI{T8ZA%jg=nrT|xDycT{>*#eQH? z(kITb^ylv_;piA7_lA{_q}sJo+*a1tvVT{EF?=8}b@%pWu&oZeCr3mJcSGgK+bCXE zva>G2#&X}6k0wu}eodZEOpW&Y6-BZElcyNMe%3ElIdIdnB-}IHD|SK%)mV+OljS~9 z-ajadrrP23;MM35To33nYB7vfPf^N_c_3fUe!DK*C!i|6L?_Gf?ql^tW3Ai-wv^-& zv1MoVkI!1}ZN^^eQs;-+fgQknx6$ZN4)yF+Y|f2q+w*N;Dcjj z_rS5ccz;Ezd`3X>-ZujR6ZRn@c-7ry%WetMBJIV4){S|-WF$cXhWtS257 zh4TRsB<345l!-(8C(6c>#2frBtrVtJ-@jP-?_cd{fW}%%{vS>%eOF9{3pC$ zUG#<|^(_!n?U~wDmuxtRPFI_Cns72O$|5DaCtDW})!x*vVw0qJxXKSG|pTIrxxFQ^hkauw$;eDIF7wD2od% zyUpx=n*%Y0?wC^*fz!nKsr{1l3N=x0Ezm&Cidrfg(*uK3G`CuL%wxy7G3DY@8BzH z4Q1|7-rHKy_<67;|D|{QzM0g|$}kzSGa*0Li_Amz8&Jw)`pEO7_tsvdkede`d>2U^ z{QMFnG4>lFZnQ#EKjG|BLF0V|G|Jd>$#E!ZJVZ1|4LD+&p^>d^k1I)Lm>cmousE>q z_N{DxPj82W-sUonYNd=I^T_a=S}1%~lC5;Pv&8?sK_B@xlNF~z3U;kDp7rIMw=!m^Spwbc(lEQ*jWvGoZpHm_m%uNe&9BMri`BSX7D zYcUmS(!rQQcg3c#Ezd(Vez^I9Du$ojm}c{0wU@VgTj`O^R1nQb zC0a}xgzK4@=5W^qE@P57ip=6|xxMl(ar+#0g#uN++}C|5$j^F9_v$mp>7BY~q-Q=& z-E(e?=#i_S{tk=e1B zaY({TO>SdA)ub&QZTl??B3RXu!M#-`moHMndZNocD(Jn1J% zci%eCb|WJG3)8wixhO~9fa)h~)XR8xUTge-?%X*1prZw(SET^PL?XPE7%mr-$TrLE zOAkaBFz)EzCk>6?*{62H;Zs(=Cd*jbWxYq~*R#urtr@Z$ks8DMF3MUACwo$$Mom9UbY_2 zh^->W1>leTd8VJI!yi~*UteC|b8ui_#|V_q@RFJid>sjogNvt^rHi%gFZ@3e|LL}p zzplrSlCZIcD~^^f%pf3)@v}SKM=?P z4v{ag)dzOLU?T780<0?WGKZ~Y@ic{Hn4e|9mfv!j|l_p=BFJqRYAs)qMus!__)wr8P_rt*A5QEr+1L|jsg z`jM$=8k2p2(#A{g(Y#M=9)6=C9frsa@4$P4#l{)vMR=wC##^pzNdt9Z$OcZVH7t#@ zNQ=S{x5Bu4P_l+w25J0zqvJ9T8s~ynIG+w&jemyid{}2_K0`M39Ow1C{=tX*s(H1% zX$&06DU&{50QoR&i3t{S2|Y z6&b%G#cSS>h~eHsbX7w$ny!A1qrQ@pyF9A+0}1_pZx}!8&SK*_(#E6GF#GQqqb`^? z6I=;$qOLFRV~jdu-pq9+Xanv5kGNvq40R<4kGf8=j{$YUyqV-mP!x4t*|=S0B6r@2 zgphmy z9Fb$|gAjtJFKIyt1_1R7@X8jjGDQ~l?Z7nU~S4@jf0@A1gisPd_({;0nyj##)0!cf`Py+dkCOiTCiqt z>%iH(z$jooH3W(d!wKu0Dh*~5Lr7;Zf^|4{bP&8^V0FNRTnNAdroUMSPR|7f0+THv zfbdwsn!&9D=Wqd|fa!G*C|2wztaGX~m_G&~-N6CY;h1$0Y%*YVz&tDnz`nD8vksh< z1q=kH*FXS?bAvU5TL(T24@LoVCLmDm@t&~GsnXyubP_^iO`~;nsnV3W8Cu}6Eh}jXaI^eMj1mHQ@zgY)9gaHNux6C7e9?OF@gIfpQ@C!x(H$@{*Sd>m!=TvEM zvoS&%>jGGZW7a{m9)r~Z_v<16DU|1#1Sk4!l7OjB>m}0&5vZ z+~_Wyu+FK{;N~=h^tU7FV_TGtSqIUo237~$~YR)=&A~ zIqJFq!+_f~5HQbmPMGI(ad0;RLY!R>ti>_=9D$vBJqWJqBM_nbe>2cgjUW8hz~xp1 z(mO-2Zt(L1g(t7UFvkxNa7B9TCS-EbLZ^y@%UB3`g3Dknj#~&0cB+NI7Gz7jto*#{d8T literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/AddingDataSet.xlsx b/ClosedXML.Examples/Examples/Modified/AddingDataSet.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a7c8dcf2feaaeb00692b0d8b66c9249b446a9e60 GIT binary patch literal 10679 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 BxcvYC literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/AddingDataTableAsWorksheet.xlsx b/ClosedXML.Examples/Examples/Modified/AddingDataTableAsWorksheet.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b2a30e2fa710d2caa12f6968df940257fcfaf6fc GIT binary patch literal 7372 zcmcJU2T)U6x5qG#8CjyIYoezWYyD=XOXLH)*nhT!Ip>b`^3c-l6GJ_zz4c4&toJ|j-z(J2 z4VKAO-ME%x7{XjrD_DQ$^M5fAYX;sO7^xrPeHq0mSaQrr(i2o?tCfx`a7KcugV3E_7v z7~$u4kjp0I#{8^|tULk%MIdFN2x%k)dHDap zzvP(8UrGFP*e`x|vO*Guygms4Ku<{GOD?Dp= z9d&~0J%q;Cy;ysye`@eGIVXPgS^pnD+Nso0H@^0D@p&j2#|ht=T@G>?glg*=bL5NZeZ zAcHU7u!nW3(S%pP7pHO>ujzR-(cRCB9D^XyNU6kfS}{*R(k`ayvx+JFWoVg1)pF({)($av=$rMK&Hm9=lp z#M0Qbx;iFCXqI``I<7T8l+dDk*jQEP5l896PXAP~X>ikEC1NZrKHms-k&EGr)kOdF ze9+F-u9DF)K1$x}HdF<*EpxKcofqC4mXZ6i8lTF!lH2CByj2uGJDX-@zbdZXEQn<&6X)EB~3m3hsI_V>#zkA}>xFkC!i_H<@@t6=7_MdV2S#ke4O&wO> zn&dxo*17+-yf`I&>7M4LpdMJbFBX86saSXoz;Gs@_JP%A^rYM z$UKb0qdGZp>Od*6=UAf@@> zRH6yZ18Z8BO0tcVL)DrVnNx2M>Xno1S!6!!c#A%F6?=y-R7+Uq@!Vig?_>eQX29c2 z1B<~e;qNvENmuo?SX%vdiGB?YchAN)nh=%|N&w*GpDBY2@kSly%9_O_dIUnh3+(+g z(j=F{99A=do$QVWkPx5Jv=kCw5?zZn6LTVL@Wy%_1`k|o3I z<8V1|Ez?tNBBVjjvDNY9Hq{9N^48+a;Fvr^=OxoX5U^Og;lrJ(+-VY1D~ao* zlfjWssLjgbw~%+YLfhBYB$KONgy!^j}#^A~77W7s0>{EL#x zAClgE-=Vr5e}_17ooqpDSnM4?FplnRzh|6ym@*ZwRu`V>9aZ8DTMkbe_e>k0Ha^hZ zyBPjdt;c)E7GCte(ym2*Ub|g4S=fHel{;ND{GL-aJb9z3E90WsOeuvT8?|pwzI1n@ z2F+(n6kq#vrn|)}!BfiZ$ey%Ms5h-|Bx_ zHBGnhMaHvD3BjQ)@z{2AGxy=oZyOoemPbC(jy?}>%)eP9cUuO#gQlmyz@0~D!`5vy zwy%=sszGmwS7w^7chx4k#Nhn$B3|=L@6x`-_IxGSC3jEf`u7d}6Q+95Rv+n9RcBe*miu*4?tad#U-LY$Ug{MPkLyfYC*QEI&0?;o1eGBc{IqSc zs6o@jni|)QJ&PjmJElP)&AAv}V@dda@9x!w1Y0NH@4IOEMvwq!!+l8mC^~s9%m_88 z&~-A!l=`Ea+n(Lpl07inX8vx_C3k$-`&K?OwpFQ|S}1yHh~8te-|H$Y4iyBte55r@9S6>q9qZ5 zSwpL`qFYK@jXH+$J+6)EAJpYivjF6j%I1$Mp~bg!k|a1L7?hK_fS=3LOZmw)YGRT0 zkCG)&<8@{?g<|GF@Ki>Ul=oKx6gWp@b4`bH3hrP8Y(74<>CkdtYnb*z-FhgOed0nH z@l>6-sqs>3uS{k1WCBO6XWYuQMZuwg+1QBlP0SGmU&WL-j5DGQI38Y-YJ9C|>SVd- z@SK9f&f*bdI%$f_@2y{(jkecIES7I{=KZVy_o6U=5XmfCbsrkWT8*5$?PZZkZnN&r zuw+fFSsn6j#K>lAqI(P79SqzA_3$J&$HwWVfFvG+l4(KjZ3VU0Wdz50l3T8ECJMY4 zjMJ*{nq$W5(^N$yuc+a7*RH*Ik>&caP{`+7=2}p4W%tBa)d3gLtz~{k$-$~VXnI4N zB%>HM234$>nZy@NlDtZ!Kdl$DcIPZCndgzK(24XIPl=0*!M!H)`u;chrk*5$IL|)j z6Mk2&cDAyQFO_e%%^!D@Z}LeJFQ-d3pXM7Q6I!uN)`e~rKSNsVe5gETwMnD($0p|w zO_O=Dtk_bCO}aDBuIk4spCN1H+fHY?srrT6A+JO@7T&C@@501?A?Qj#>b z%f}zK+q%({%^Bna_8bci*`>VqilRK~LWV4M(z6~@E4(xf=)L{+bFJX%`sy-PyRmH1 z1*Av=b1S<@dH5L`0E5~adw>J}0_7$au96+|p&Zd=83{Y(#^Fi45XNg8ngP(@C5!Hj zg~Qd&pi}-ETKC(t>Mp%i`f*zG<3QR#6}fs(?mzcTFLnt zp_3y*qB1#dmG{$S%riH8$j}?8Vn2rT_k3F#^&Gb5Q-Nr$*^9WPlrSx09NjI89u{pZ zoZNCaX?_ z=kngHk(WJFgD+PRhIik-%eOZyiVFNy@O79|bZuit!|q)3XPV_@Dj%p7k-r@gskPLpRkyvg)|0c0%#Ag6(2Y)8E>KR5;Iq@AQPlVLd6{sR*QM3za@a@| z(2w?xg%pnyXD=gE92P=Y`TnEw{9HI3)t|#cxRBK~@3)H5Sr~C9u(ArI()S`|vYziHLu%3O_vO)H1oeii; za;PH%0Gc=e0LGvH7Dw1SqQHme!~9vZHuB}rX5AAlY&jpg`|3=o?bC!Qja#xXL({~$ zufahd#&cfv$(Q)vQwH(!QoW1pj3*%$sbQdq-G)Yhgy4I`pZd^&L90`*^Gg7yxL5JP z)1QK-@t=DVRUI3)c#z9CDD^`|0^S$|P$YHFF|yboex)VaP|JEq}&-X#fXPj?~F2 zN`Z1iwqsLANKP|SWXV(s(F96jzb4vst1vFpKPo4|2<*6Pofe{iiUAFAIgNPvdx2kJ z;)Twok@afw(z)k5Qk^BeST)`zO2LB0CYqa53?P)n77>@*^Hlw?3FHyVbPob7+sfWv zne44+HqpnXg|<$Y*QHZZF=UC7-fD5EXz^fVHGAn@M(;hMShjY>$jLwZ(`&OOWhs6MH7-x^@YlN#*;TsI%;I9jb9QkaUne-2 zTadD3oWQN3cxn5|dZF$!x>j&ua|BGtf!k3mZ+{S*v#Dk z=GRqH!GOwEl!KUNGkRPuB!Qd}gc2U&$}by;K|2eXF0fVhGUuNJ#ty*p>mW*pLny_OJ8)0Ml@neMUd5ZR6-%}6sx(`^r zLQ9~RPQHyJ(@K$Z%SlC6+q+tp#QTNOArym!$^|L=1rm-U3)dTWVu6nXWd^AI%7V*f zX`VdS+)9-U%wvvwlU$557&8{oWR>R9Oy&A82gtg+A(jWO^x$iMMPWupL6o4L;H9-K zxv*xyggudQ;%;(7!!0;uCa&fYHGf;x#6k+P*<(stN~d_Kx8Po}YgKvu;({D-NuXP1 zp<#_GWX-boJ}`{RjhR%J%jtE5Z7XleX;)-HOD;w}exN}YMjov3(xhRbw!S~$;@yh4 zmEKA3$0f}H&gM*Gr3_;#iB7L9FPq!i=ZHNFU8ZF6lAEC2@Ou+b?Dsj+m6b%ZB*?!n zEZAkk%(LHXbn9V1@WhAL_kC)kIyFkU#4bnm8KM#;P0<>KCkK?l9M3-tXI+q%d-I1` z;shqD2M1F!hb9LNpH;Ec;v`MslXk^cC8}d{s-1?SU}G@$yIjH8;nQ-;O|*Ab5cv0k z_JTK`5}or(btun_KQUb`#cx=V=UAqJZ}l+PeAoOqcK4-Xw<_sv^8lJ&61$e#7L*B?`~n?|LTpE{M=at(J_u z9QDH*iy|A9;O9J^_AsUUZzu{}jf(#Q`smIgFVy`U_JNwjjy8MBco({Lb${`^X_lg! zitKy=1MNzzD4ICB1+i&VBR@x;ZBYS?h~N6o;YS13)B8i6_il#^o-MfZ8!xrVrRAv9 zFu}9QJS}1=uUV_lQ84;vjZP}NEJSpZwf4_>w9oa6B#wSv@(EV*v8JutDCwMeVeL@) zeI9pV0osz*+O)l`LOBzm_$pgCb1&vIz~N+jLKH1)k>ttsSFM1*>ikdSc*8NnZh|nQ z9UP{FI{$ypk^cAK@&IlfP_>`5?I*cZK)U>m8vOz=-iN3X=>kT16Xqf`VZ{%XfPz7P zx5c3_K1a0kp9Y6l{%#qJ_4r#hC@4rGNa|3Sz&@d1DPdet7;H6t(FBBwb3DMsSo?!LSy`&V0r|U9!4P8m6m88Dl@&Okz=>h27Tx3bUt3${bTkQycG`J!0XD_8epr_v4G06L=#>#)!{Mu5&h| zbs0UZ+)ii9f6}Tx6ZEu1YShV#crS|5y@qQ4vJiJZP0~Xs+jiTVA$#q@e5;9yOQf>RWoJ6TpX4y4+H5;^Go#&e(AXfLv8Fzulu{OisjpsmXkU;6sXuUELRtsFAH znYCcgNk?&gq;Q&dYKL~6HU^+fT8@id8GSl!q#Sac${!LKzIG)3a%0ge?(G0w#BOdl zoKBMKW4`N6KLY7j3mPAe3CtwH4=!o`;W5CO#{lD3Xp%4hfS(s3+GFOf2nQsX_viaY zO@o9q+G|W62v?-7vy&tU!pjF@LO8*lEp45wB|+|PRy-mgX(w;uL zn>ZmQK{jq~E@EIX5^jTVgdusIT@X&_J66uFjxaa$zpmC`7Z}_gW{m(t`S^su=qH|Q zfPU9x(!J+`_)ip_t*mU}2nA=jyCcHM?H`1}zqbG}>B3yC5pI$o@P$wTG2OD11Zl(h zE%~5U0#FfQgs6ZpKLo@C{(tKl!pjZeWQnlkadAaE%hk;mf&5$lES=$+=wQ5P*nUp7|X7TZ~El z8N|P)Jwd8mHw-=HWiSB%Qgjes^i^_fllnUu(qQwfbw=YT;7~ammRfCY1gT`gUGboZ zwRI~`n?{43Pb`N7P9{MFcEb~^(&pAb4rA-38Wd*Tjl8JnxZ|FDOufoS!e;OyDm=b` zb0fL*F1bIkPKE#-xsBw0XgN#~VnY74f1k(P0>5$t?`uLelr8FhLQv7Rsf&b;k6t?K z10WWMU$&QI&vdUa9nbv~+@ppa7d1})Zg20EXu+2p#x##Gt0!Vqnj%WMI5vEGN^(koZ+`X>h!DDmNi{;ciy-4nq)C*ft z0WZbGTersEk2DOgu+yO#kGZuTcduMUp)|UIDzUW7!yclHL-Z-^YLmwZRb2c%VJ4b` z=Tyx_1_u)+w|z+iDHa|Pl#kvc2(Ay!hHR2`-=$Zzx65a}bjr{wyTd6cH+a&*bR29? z#ArHQ4eN8|S^E(%NA&w}K`u?e}=CwYD&3< zk2J_UYi?R?iZFW619tmZ-jvk*j*a!u9sax*9fQ6?U>{cVCS5Yw5aAtU{bz=S*|oaq zZl~*!z%g&T;lq4gZ0*JSD%o0E#MaO4hDMOB*A*98ZiyMc0>$`7c%&ZcqgB+kEhk=_S#PnbomJUEz7S72=J(35K^S4;FnlPGm$qFyTU*)JtsdUy{n9j3yX?V)LK)ftbwn6E_#tTgloE z7BjL+%2R&##pOw*vRSkb>e2a??w2oqrP#l(OK0h}B1TrdnU7Sl$fD<^scl?m_rjJUgUq2E6VUeBka zyhoof?Mc@=I4$|kqfDy*4(rUF(VP0!tz|eId#ps9(m}B~$3S|x`No5mflyD4@ z@ve9WedWMZ&K8>nojeAPS5}o1?n%Tvmu_tDWwm?BHjfV+9>|PTz%+YYs*8Z;`erb% zCEnK*Nr|4sIVyl6f|{F?h@VHPuZCm}A4E#e@HmIRvk}dSo-^Ze%wDqRQPhvcqi%57 z`D^L3^x?BTr(^n2HFCWnN@9jl+Bc22Hsf%2=Q&N$ z0_{ytT`JWuQd|w6C%GY(-3oMHUZ|`0ZM}L9UZ4pwbMcnU(q$Uz);5s~6N5 zEE;DS%sS(Pfh-$l6?X)V^|xr;wpThropg+hw_aRMj zjPGe?eL6;I3l*|^LPvB%A(yp2HW~v7U}!-bLv@=T@E&xpo%FQ`>YH$Fajn^ zUj4E4cDu@=f#bAZI=Ij36!9J^8qF0fT<`_Dd6!2K!jeZBc=~ig(VWP<3$*(9F*DclJz!DspFuph2)Eiw1@Ag#ZuuqB&69``yH&x@_F9@&yGDpCtU&HHEu-l{3J zEAcT2DJOmh!_f7% zqA2IofN;f9icy+Tsh0}D3AMUm!RvS~b|>e#cs;9@q|no9AL^or)mNeu(&cG2DQkFG zx{UZA`Ib7I!X1X?U1eHmj#`)bNxtPpouI3xA|vhSqGH>=n}=K3G2y zqO|a?+;8@1eruqy|8mL6FlXh^i6>s>c8PV3U}aj=SlN`>()!owiTX_2LzUWBo@pVVa8rJ*$fWP%FHWXL zYo$6}gx|+JWo$78)PB_LBr z+zXG?{%fOQJn!ioI#{l;ZrauT+|9ogV{OsB$ zr-&tmmkBS};3%#)yzG8sC2JmrHVjGyjcmrF+mVj-7Kv(h?>meN#2bg~LyReB?ECel zg)^f*v|QayXYICFVxB`r?8YA&D~(71{bj{BLke!z?gPKwXdaR{8p(JNbrbkhElJx~x80fb#I*B;3T;gsGDG+Ns?50OEgJm<_sm;2>1-x3mw!N( z>sgwIZ>?!tsV~dVZ`U2Z*!LVBaf%al5C6dool;|6UE9x#g%5`YAUA1&eCvSO!~3$hd*hR&F$6Yp7mcpG`(=E~wgxrfp|`m>+os zD&|4nPvWq_`Bv3wR=YP!OsmYojk`BG2pQV)z2%=RtM!BoPP#bi6ce2o!Mrh9>v5w1 z>CV8-4qYQ)!;QmPY@RDzpq>shm&~DH{wt%qRQAI}*m&16fQ2$i{KQ(a3MLuWrenjZ z%Y?~gw$V05vnDNBo354FN5%uT`v>ujncFMxHk;_`_69!xuoFDN{e2#}mqeRYVFLg) z^Z)?GuX*H#uEP-Ev-h(pv}UB{Os@$1!JSd3bN}Q6YraWq4YIfJlbNOTP zhi;KP=Uhn;Gc&=LM=cSU7+e+PxM2qne-Nkk4~&g&ClAlnsgbli0NK^mL$B!#&*{U> z4wSTc^&XSuQWV~;d&BOND(<+^?XwhghqtW@vo{<>MhnfFOt_esWdV_M)azpY+FSYs z?2^E?ZF1BtETj&v-0M{C<8g&gEO*FDjWf(PhUHXQa1}*ZZ!h+`DN8=Ok&qP&xypAC z7B`G}g#tH0u!Qrn2Nb!BGHsWlSRySe#B^mpwo$mki3_<-rRtXa_E03(V^^6c!y^CD z8yOLS6rFc*7EpVj+-DTOvgg=%ZEdUyA6~Y;e?U{JvE}J80g@xcQ!>0i03m&(ffDxV@tB<9J*C+xwv+GpQf1AIVVT`<<+3nEM@-W8{Uk z)1*iru6>N9G50zCE{y8hoWMYZACM7+DpYlljW4EE7AauShV#cf!BFKPX8@F67S;3* zs;z5$O*zI=NwPt}Nto5Xvh)2}J+6N|w{dVSZ6LMlbL7Zu`eb(E4b!IVdvgZuG&>-d ztFz78TPInZBnuErk7t=eLQK!{?_b71`I3_bePc)=)4t(}((Y=g8KyAZ&Xe2cT!tC1 z$CEL>a?Pg~2n6uBC=TaVS8DYXgjF1-+q87Mxo1w8dT2X+%_Ey~=4-e2a=p#3{R&3~lq? zL!6wCW}fo58$Q{4!!;T(VSi(vnMou+^7yv$FfGmZ@53aWv5I}&t+skq%SfdR11kF) zX~yQ1D_ItGMB+e`90dc6(~O{dxP2Lt>9MEjyynC6;ct(_sOmigdkI|%yb6UbH+RbK z#X&t%sh>>7WV@-1X|T%!1sLVy7?)=O2|3%>Q^CcyEKMJ9b+K_TMao9nD;z-Q*HkEx z_|NfkVydeXwfSbARFo02HI|Ie$6D6fP6_be$X@J9&&{?fDSWdqFHE(_-Yz&_y+&|v z&7kWQl@Eb6HP%hWJ0t!k4a~7utSr;(Qd~tMdaG|L<9NvpYF5uzzUguI%_(}a(ly~w zpI7T{p+`BEPd+Avy7R#xK+oiM^7YdDOL&y_!sEo-E|c!rE}M_6fSB@mo_D)_yx`lq zc0Kl^d!;>8_{$@&94iA`2LyJjB2Z8*C%FuwUP&;0=kid3w}9~E16|a(YhZ_) zvVM#d^g<3@5tghW&Rl^Ve&x8$5#M@A z-9FB&@I?gvbU8npYEi0rf!tw(t;!CAV@c`Zsa3eTxtE8HdUpnG5((A~F^w8x8m>>8 zs4ow_fv8Hu>=7NXv_Ll1m`97ab}2_nnz`Owq=Bn>!-JzPNDXew zw-VawwyhnM&+cxEvp)`u_y$_Hp%LM1?^IqU#55&Nn$kFd>^(kR(9uc|x0Vu`OD88@ z3FCIc2&#kas8xu};w0%8QTa#g9nrg71}iB&kY&z!2S23sYT0Kd)bv{ljPv0TjbW<0 z9yd37_|G$8PAEwQZX1;X;k>E;@QiI2sXGZRfSj^c$HKAI-UW&qL~- zHq;y(Na4-+i+@PE_ToqACcuoSDKd~4m<1);`p^LQGtd9RcjX|L?QwLO{qxd7=lTD0 zCi9;|z@MP#C!zX9u6|KKF-!Pg*v`e>)!_{LS;D~x2lQIxgx=9Xcp+fWUv1qGu8!yA z@b3m^cm8VWg|z)k*3;9I*OUKD7|jtOU_&)koipUfW9x);gE_$wf9U^Z@t+dOe??$Y z5|;3@4vE2C5imD|B@?r{i2I{k|#H z$&H3S!t?d<_GsfT`@Xv+YA$4~xbdmBoE=t`0SRxk6nef8RZJJ2h+Apeod|4Ae5AC{ z0*fZ2Bj2NA@}3_wP)>S@n;HOuy}FguYZyo!v<=>S173?ZZ4WSwKqUq~4bkha?o;l6 zhjPFUwhD4LW|Exp|K91}?u-A>c&o!pV%AuxS&mC9LoG|r1ykNn{n$pYAOZz7p;sM? zyR8-+G1&h(r7yID0E)noFSozK3M{^!?F8c1%8~!djuLRrx%`5 z29pli(mBLNWoq{=ykohCjrq3t)4TcZ)15mn_it+T%r+Lz1ylw%i*@-&M^}EhaW~$g zYFu8AnuAV3HKO01#!w96FMl;doC)XS5T~3Kw zQ26F)Naad-X2#PYCH5Z=Az?c*jdY)>6p2MhHa>6|S>M9auVV0-a`J~6efmVT{GLgxlMz#3g2yF? zG;-6%vDg;7V-}Rjcv;COB~$;r00OxXKo5I{rPcJlMCH!WG1PqB!N7qzeXG!dUkZUO zGGB35tyL(G7d++)c`%0C_(+*i|FzmRQv&~dZ0_jqfJkTsN}t_3A_7ml0D<|%K}?dS zvj&Uz>DSaI>K*&s`D~Teo=B;ELp$qMJ#$YPJ=NfTS~iNT){(E^sKL<+t<<`4L%YvF zkWvJXOeteuw2AE`D`B|v3o@}|`ft8^Nn%K%O7>40ArJLmZAyo1lXa3_qmT6`>1JHh z6QB!w`sAy=u{Nc^V=BFLCP%;J>z_ZF2mIji8O3)%VELwi80qHV&I=rCvMjbUO-sb3 zOQc5~@7>pBqMIEoX>Oi$Jd9STB0pOEdZo0RNlR+*;St|nY1z`i!}im(R(eg9OBj?t zXY9Y6fT08JZ?6l79OuUWd>C|Y2}KX(-;RdP4gVRypBwI@i}{N<{-X6oUVLsHj4omR zi5_26xJX&g6=HDC6#j*|UevjWB+qpUaDVmWFF<+G^dh-9H*G?ntNr2l|Hd&cs$8tw z&QHHqbi6XKhYcgN`lXi%)VJyggc4hPfTlJBgB|T#)71GGd-$C%tvm7F zp(JYz}&twn*OQ|5Z%YoNjMaq5ECdyb7+>)6= zvmWcauu1?4oO%_B-$1+I#1(W6`os}AES#Jq@6*69>F6<% ztWH75epSBbvPTP@?#_g58xynwELV_-qKdx$G}Rm#wK^BEoul@z!H0Mp{LmP^tt{}s z|9T;V2j9d6U=Lzt`SpI()+Hngo&a)pfD6dR5hzT_&ca4X4gi`vTG#-sgel!zEt&Z! zMMZ=(0QP3CUSShaXJ!RpG1s0R30{EF8_%z~vxTGbg8CX7Rg$F7g)a|NA!m^8~Ou09?&1%v{Y_%^h6;f8U~i zYl8qT?%+`e{i6=6IXf?(r5Tqwzqz>u7oP<$KY$;=$!WoFVZqDE$@!9p#R=qKVea&= zG3T@3=jY)z=LGPuvvYCq0UrCu`j<5(^6y3b+k=S4osM*ZJ;)s_1Ox_n5kDQP>?CF2 z;x8A{$Z$mCXu_*RiR~_>nLfN%ShSuSXewS>U)3QjhPYlm0}Ml@#!q zG#w`$j4@nKNM`AIXs*+D-FRh9=5HOz0LZZXL2FkMdPY0$+twvMvCbLnL;rJAWmB9I z3AlsRl)->E1I$;I~?)yQka zQ*n(bRzE)!pZ>-ia*@`DtIQZ@A?$;PaNfyjj948?F{bu_lB(O@zW~(SMjND!o%R2O z62KPYK3cS7b!q39Y{)A{=lwxvFOg2HmbIs1l{oUphC{4%lYNN^4dydNW&YJ|R|+AL z!J_n46OQ#vo(%VjmTMi#+IIkt*%0_w1d8}R(-H3>VKUFyFLQPEx+d`Wi%z57>0X81 zjU%Pid+DW#G;|y+Gq>}cab1#+2~K?U^*#@TgFjYt;Ne&F3(uKd*%DT}k0Y%Z3yWFV zydhrp#8qh}7Cl`ky}5G}X=*(`!B)M8`s-XzUhcl31JCnu69fb}hWv^aAZs%hfQ6>3 z3)m}xe%Z!B_6l&32j}Av{65K;>lCWo9jjXctaAjpSPc}3TEz!%WySjbP)hEEi1p3| zmJ2zbP?EvJe3Y8pik&cZ6PA5BYEe>>shn3SS&5>rZtm93CG)-;3shI=QBO@!Q`l%^ z($^VNYrp6aQZzO(7RvG=qiaY;jNI7Z%Nr^&Vf4Cd4hBSt`oEy|LfE|W+@CVU>xs3e zM{TOCV3b-_ZX&&zl#jnM98%l)Vb8%&h%b>|m@YFD`|U)>T3PhVXn*r^8JP!j&Vqjm zP?1dQ`S*q0GPdw*=hV1FeWE=J8O8L7Aw>nfZ1gzv5>mm|p;x88%?)$2Fg8IC?ysbZ zS4a|ka}4n52Evcq<+VM(mEs7^R>`SReARbn{JEqfKs6B}`$1zMxme5A&w7bjR@-9< z-Algis@-En{^;!;ck!Kc@twBS<8SOuIq9XY-;Bw*w*Sl(r*Xx78SS06>UH_s3ti!Z zYVTQ-^ZkG_JJMxtRmEp>s{0||6iy9N4?~Tq6~EC4hAO#N-me2MU0YW^z`Z1CId_R) zT2ji$@r!IT$SQkPg5&>%vxnMK~&BZ z*z6tsnF@+}zOLGHOV+yN+sp{f0-qWQVD8-%FsiyUL*Ri=gC6;?MH$j^5lTEyY>&nR zpBXv6wSb>z2CCr)7qG}=LXUn!gEefpS}#ZL03x zDT2$;xZpD)Cw`SZN&qwL9%_*vOQA>mt$&xIapCihHarXvfMuaa1Giq*|B`*w%-mY& zH~P2ouLu7J-bf4m@5JFyKvTiEKy|^NoSZ&244k&`1!d1|;d?jp`TV;#?+>C1Bm`{X zp|?yy@&0Uqqj~OZk3A$herO|fIWRTM=nbE>p5?Hvn%aW%&B6WEc}wQrtyX*BKtnKi z1X{qA_TWk}&`%M>!}^}BwN4)1jfD^3?iq5~5pvDh{Hsqq;69vx5%?V^357#tn;qcb0$NaEa^hA94BF zhQ+Y6DU_Nli(~IojA~nZg9_eR(V4dRP@=B%pr)m^x;_1Lk%cafi#$yv%q)c&2hw7~ zoTYVR^5A^!lDm{csiCL7f=xzkPHVgAUH5wE@B*ith}m)9^JL|t@4g&AWa|gL>e;l? z10&1^~m&$74~9Jbe9^Fd0a3ouXm z=%^EKrl3=dhUyJhqj5%}b9Y&$it8ew4tE#xV zRL)|gUu{hD$1u%k>s+qu4lvsJVvnt76%?13y*l}JqWV|Q$||2_3k{B<>0s~r?6+tA zy&L@R-T33qaCBM`*h`K9w_2Y2Wo}+&tw=k|zICv16gE!y6&(+GTKm|nbnG-^Qme*H zY3t5MEFui(+iS6)%ekh}Ljkn4sIg0#)HoV?gz4l`pRXxS`CCBLwu3D~cxkiHBkw)w z`FuY_l6b$QNnMhdA=;1mXq?f`1^H~QmGxx;Wq5$MMWL>uoB>u5y`yXXSjtmpxFYGh zT=_+!LGO-|dapwb`2yjc)vBZ!#Es!al0z&oZdzfQs^`czd?{N|e`a#bqFsYW zIKp_t**TnZiPswS<^(~CADfvHgE`HbFwlBXsvJRz@i_w}2CkB;Xz}YFSYi39gXzAsw}eMyuuy6q*5k8p@3RQ zW1yhmL5*|Yd#Hne=<~kk$(bVbTCXv=vIK`!8`nV$s3aeQv|i(csxupSHxU zQupa28kz10ihL$NgA17EfhuU9smYKTw0D0t^O~)M>ODZX8i35vX`vzP-HWil`CK(` z=o4J~7QYGw%*3WNR{(e6s(q9Ticex^ne$+5QW8o9hVnP4hBT}&Wen~@e7hKPs{y`E zsMjv>Jy*V#B8O;_+>K*%uMx6aqGh(bf)oO0on78XgHRI(gCY$P{S5+U5nO^4#xVTs zqhM|ht?nyy21h(K4CPEyLKU6J9OBRCSb~yf#KoY;MG|y{oBSvAXL3b@!|Mc(`WTTZ&LO1xjpou7P^2HEEd&dBv0Z4Rjxu zX@j4!TXIj&k9BbS;To70~V-cq4S?=6Ph(x9UuC6Scyo?h;j zIH7VlTYrKBl2Y;%(n?ej*|1K+OTS2cuX1-tb2~=y`6=j}MAERcxd7JQ7nEeklr?v| z_D6c%fd{%)J}1f4{QT(}%;`cafetzLpAr}7Xju>WN*3)7&~`7{w8LJm#RKnRn5KdL zuJCR*T9-Guz-sVcK6lC3(+A0ixxgIP95^?hcY-C0v|q`BT0165rVkPi>wbxKiMz@6 zuJjvx!ge1ELvhdj++BFA(&eB{MY`O_k`kiOWB56YEI9qpGiLV${jZkLflddP4Yq_} zI0y)W-~MEe^6Ox!w55>8S=~I8n4%?e;qVlRnLe~ky4kb zgoXSm<|7(?`vU1j`~@z-qJy=%!TF^3#|z$v`L}})T@NhPIt>WMklea1cxdp>1OX#j zV*q|+15Mw|5Z%+^nR?Bi`HT?Q<8Y8 z=7@|@R>OkLitxaGjGw;23X>eC?%12pNNMT)d6_7&K!-W(g++=&$BT7Y z5#)7}{lhT9R5bbFJkv_H*s>cmJMIFvEG5LI!295gMMcEmjLIedPaw_Fo;pvq&eu~R zjn=2nyJ1K59klNDb$>23k`F#hIE%C3Ab1P)Muet?7?^H0D>ehW6Wd^>F=d@$4a>11n0zq1{Irkx(MQf zF1wp_ZyoDcgg(Z(3~Rg8+lNBqb!J^BRK{=ky$RU5V&an}I^P*4LiX4K%xC2ygv&&|6&`RqI(zNEeFL&5lb~lcYHiQ9Ka7olO zYu>ENSND=XV26#X0QZK@>jq*mBZEZ|c~hV`%t92?>rfW`le|c1n!Mih2wnXEQ4yw^$eH`o zy`#v>YNNdlHFl2WYCjyQPT8A?xr&vlyX>WQ#@owO{OWRH{Lki+rDvw%qE&qhj)lZJ zW_&uR2LlAhffvUPz0$JODE&MenW*JEsMYQy2Y}ZFbjYv{Z$d^thM^WX+Ej0ke-u~K zu%m6A?H1_qHfbrgItt~uQfaIxzU(3LFp}+CgkLxj&Kk{mPCDNh?@ig>j*#8Y4Xrw3 z#4&T1dk!_4~WR`km*E8GhIm5b2-?b{yYVKGS;*bqRK=2RChPH3ZUjIEBxS+PQMUoMw&zx#o>~4 zm36W}hb^l&Lhl&G;g+i8G|JanlzvqHKNZ*ytgb2W$Xt{s>Fomm5LVBCJ>uwoYV*;~|w zj+s{V-a7T0Dci3#-@eoczo;bQ6(VYqE$9a>)etqQiI$pMady;+*BCFOwicg0W0_Z7 zR-81J{3Hv@jf%;YmZ1HRZl9YO%rhlaS!sH%YrQxkhaVnj|DBhz5v7^=Yk-w{?)^%r zP1=aqi5W*ubI3xj44ax0lI&D4>UPaRp+k23B=63Z&(u`vDTd3PRRlWH)Gy3D*4J;cd3!NmiuhE)`t)!yz$-1fv{a4<``ZKHoC6~BWG=E z`wOo~MzpuPZ3xth4n5_bch&%vb6%@YABbSDE#HQC&IZTMJeMM!HF2_wfv(cFmqm~E z#`uIj;+5Fy*OQVV>h*3{IZcX2Mh}V+?tGT5Zu^3bZsJu#(8M-2 zm2=capB%;PAP0gwhHsFCv({=M)B973KJkIian!N$E!~OJ;**F$lu8)#C#MwY!4^~5 zNtl#+@wnTPF7Si2a-^68qfGo{8hmo>;*+oYVAf&ZCZTDlU=a5s6nF;GvOh~iRVKiR zhXT5b$E|CQsmLpy(2XM3hj3U{^2i_sE{@98ZYY^A+nV>~mM}S|q$0DKZ`t;mIgx&2 zGCF&GCfJll@5LUY0d?O8uDP%^XF{e~a>`(q&+r^Eafl)q=n$eGrqLC$tl^P~dNs>8 zv0BG&j%L?uwk9M|B6sr8wl<^1uUy)Z7qJ_N^9ka<;%w%ko~TQ$5cK3un_%<0nJI0yZ~)SqsE$|RVlAd#`UDH%5{0NWoLa_;hZ>uam~K?|Z;JU<#NRBi@s?&jCNy!La~7q#%@ zu`tP+jU{{={Uv+qTD-STyv;*j)Yg;7)?c8KjE94$5x)3*UB+_#!n)xN8SmOB2Y~U+ z^m>$PWoo;oN5}WWAbq)eW!DIvx$ztJL3=xx%A&Q!2c_BZIq_Z_lR4v)U2HBVcMBvb z)ysX(WFNGpu!C++obN&84to~x3TFjZ)Hq4-!a;#yoO~IC`yl}ivR@JJ2d4ATy%#vI z2D-$fC*~lGZIJ`<^+B|#MOdE>t25j@oD$dqBzwe_B$0FMHQ{e~U2lA6v`y@)>_3!I za|0#6zf=Y>>wm@QMHHN1-)Vk_gC&DYb{*DPJJe!n)Wt2bNGP52%w6@}v!F^oS3H~Y zl~T#B+b2f8s>!V$0ygqolz$B1T#tLw)J5RZuK+GR?$<&sosE|Q%_}|*#cWS44N_KI zGWw7}r)F54sJkakR$3iLILR|Y{?4_IT(;mLbK=|FzW>9m&-tMZae^!$#aLB&2tgT} zyPDSP)`@K(5ceYWwx z+bPb!)Fb2uE7d%na?py3~zt5cH5E}jaJ^k?h^5> zKv?mAtH^i5G%tv26LFjeWMw;;rWWRM<7%Ts3n(){x#G%3GCSah;OVjCI~1rTZb7!i z)SaT*vmjKSqU3yjumYFiL1s?ywa=f_IQMwU+mQwrU@X1G7+X7bfi_g@IVoevM;Aci zw!!W3A~tpi)D4+&nktAT0+*2V)bX`1LwrW=;m42aU!{YIKNdEpRQYtK?Ms318Ma(% z+Dr{mf@x!$@s=4+*QKYteQcO+#ejI7!oPom%`e$RJ)!pfNWSNh3se1z#x+n{XH2!+ z^WChESIfIEcHHdy_kRiDQLuy%eIEQ2ucTy`$59{O5SoV!51?$*6P2sJ%YIYo_QVD&88$pFa>d zn9iLK3k_74`LK+p-cQWzQ|TVp33)|;N=c;lDlmj1Kl zaz9$G?gX%q2j>pA&qsLPG+36R+*P++$2Qrz$u@`NcqA7>=40aEVfA@l&a}x+hdUN( z`Oq=PNr&MW|6E#cw*SNZ_EzukIPK?!v24P*8Vkc8l5Nob8qf`Q;wS>%ecXH z%Fjs>)iGN4Cf>IGQ3rShXI89obT@C=OAoE<*17khf_~}v>Olsl)+5+(U5#!T%ucDi zz87}^jXGr0EgmK#oA`GO;U=fP8Y*U{qcpYRw}l@Gb$nj%ZhuLq2)K$wh_iwngiVg> z!fltl5w^wHL5t7jQ6?9?xjn5EYxryoTK5k;kH~T$uXafQ0C3G^2)YDyN2E!M$9UDI z64=r?2VZU=XchM-w7*WoH{j_YZ^vpMGXGWND?hfr;S0@QT*v^>mLcPVnkjveP%Y$K z8)zseF`R{jNhO;rz?`}P$ZB75S%RStq4PZJroc#I87$}XYS`=s@YA<2ArqR*778RQ zx)WNZ8q5z`Q@Eo6VT4)JzfHF-wV_c% z$v{p(0#Jmsm+r=^E})^Z=Hv1{6UG6~X>>3iO<3@VGyeFc*%&PAQzfi zJ&vmvvWqP=5*tn0js#HRa&Y}YZ+93iVAML{Km{;W520`@_O>Sx;bJF72%6( zaXntzX#QA8j;PN^{`|m)Czjjvf@Y2md=DfI^N%r?=h1St7Qv}mlsnuHN0B7ZqmAV9 z6UY&$^KrQ(vsN=j<`nPg)LgR9<}PYf7g(bbvS0||>{Vy;26}rVZ}&cZ?mzFGTEiWn z=Nh&bpyz-r>d{X>;Mns!J(P6s(BI#No*Zj{Fm?)X2I*T?Ub?^CuCmQb1P0-utZ>U^ zpP|@fnopG=9oFs&vWc)pzD&Wk{?4Cnm+baspz(o>#|qJcMA}s#-c2K&X&`bIHI(YY zm=T%?tLjKVKHOlO&&lD-#BoVuWo(#l!vJfLUB7}PD~x#E2(ajMaf8R(PnWG3nOefi z7{de7w<=Z7S=@*47-QJXhMVjC+&yNvDqC60vs0}Sa|nOw;vO}Qi9x?xw6Y84oT9{7 z06Qap-&Jr}TK#VJr$etZzC@Y?7ixM{>dl$1p3}Otl6zxsLWpnVbllSl>p!_z*Kx{B zI}tDB2DMwP{f$P80uQ*I-x@kT?CKjgZ?UhmDB>k`>(v`25+eM8|y^g_0MVKV^ ztnMhgXKQSiYX3@ql%jPP+C-B#&%xMqtUam2UL6*ejGK75#Gn9D=q?Z@H5mu3L%qZp z2xN@R72l|r?ZUpo{<)0A$UL6ty?z+ZQZwYl@Iv}nPqVPpnQcX%&8~_X+mIR`%LLuz z9qQVxzD^sFrfAbpvHC1^fjudMwO_cAr=MY-IP`7%n>d1*Aw6bvwb;pov+xpry>{P; zn)r?Ek{aGO90&d1J!-B|{~8zEYU7QYz-fv$A_xfV-?xmeV44Yl_3{1jg7H94*^x+^ z;GVIdL(}JOhPuq4Kjy1MCXa%WdhGhSr^oJ>?3oe1QpXZuN(u_3wV=LeXefpTEcl3@ z?17YY8uw5~BS3eL{jalmr4X28`&XXJM;^;p$Aht=CM_4_7CUhW@?O(!ONwsr@dNAF z&#sKDs)~;6`R1yOKNv8OQ;0*vY~URV1Zw=yseCR>@bLsIRvreV$s$pa%XqsWwMu1* z^x!`44P_q~xSB_>+(n}6I0*P<2oC+TE3+?TR zifjl)I)T9-az&j$F>ryx=oN0d-Id?M7KfYh)Z{_QK3&UIO(_USSQ(5knH|Q}9X8km zT9fvb81~bGl?P$UrfTwa9k!B=Z7WCfFmTCSf{ZY|!(8GFjlr-B0yjRDy&1MDW7ZZLsrH1*5=O3bsNCo7frIO zR>jyj%XtTVEZb|xH-ACSzqN7IMEf}>KXF?%hD=28)z97^1+t&eyI2d_1F5>?u1@w; z?{7~e&pu668;jgm1c~7xzPdXsFnM)d4^yy2%!Tc|#%d`T!br}9C@3XnEMkay6n?e9(Dsh*3Y>YWM)V^jI^=f)d#5)ko$!Ha zjQU~igdun?si4{Q{H3By8N&}nUK_dt_@|UkWb3^eKknYqp>MHUxTh5I@Q|mJ`Jh0> z`e9*)o)PC@YRGuRY7BR^O=BCLluBIE?V9NyreTtlyOa@eg+MSnNl!DQA1q4?k14?J z$4L?)F~Zbo6ou$5x5sQFg>UMw$KmER)gUS03co=3?9#4<;hMu11BXospr0Vgs~md+ zd`YLiNmw(CmxqcQF{Y5$#I`NHgO+m+P5g1wdy0-OXeF6*;6>C$Gs9f)qMgho1vy_? z%&n2aG$H=Y%{2N@qV(sHejDwkU65RXF0P$Sp1ujr-n*9_sDcCr#ZtOZ4+WuK@Sh8W z^AjKPSxlxkBU^7Ha68?($B>;WJ*#+7dWR%0k~rLR@uHRzid+@vRi8@|aFIwRk?gKR zWE7t;<+9e;P<@zz*MfzIj1iBqllsZAd7y{`LQF+0PH1V#)L>hQYN$h|>8@SaOtfgX z`O3v9Q?xytUs7aQTh+X^$&0)Fe1Lni6bT-hSiz1QK(jvbj z$AvF?tVLD<&QoGit!1;ZdDP9XxH@WYc+tMIwB7BcHqLw**1Slp>5Oi$wt-PL(|eyC z1ROiw1+){VCAT7{;~+}{XvtC!=Mi5|^Aj!GQMoUFe}l}?o@_17w?k4R_uaH$e^o&kT!dQ#}vPat`sp$A{CbdW-+%voSPHRM))(@#-mt|GE&9F)7@HSq<}CB9Y#h#wG9oQVO1@5Ex=n6k`{>y1t+-JAPtUPNz}{^Fld$+ zLZg%rv<+{Yb1kP<;>~~&vR^tqIp+jYWwdA&(onJKAH+#jB} zu!{_Bh?ezL^^W}_{9#K|Jwwn+gl8ik3vDlg5eOC9VRowAz_$*UrBjU?7=3X~~d$6q|SUj)40#Jt}mM*$1-|F9CB z++6G*S&bIvtN?p(ECPb_UF^xfRyaH^T0vtRn?A(0p>>Olg&f44GW2bt@D(C)=UVKKQ-Cca2Q^=cjg*T)isH*I=# z=UFS4m0u@Qi?=5%0E;gXF{3?j_fAO}yXmW=GqvsGcTa+pKNf_$K`@m}oAqZT^}NF< zc~*nfg1%~9bTKg`)#Usen(}ne{zXS=qkNY&q!%y zgvoytF>u@^g+)S9(?NRQyOBnszQJjCi=?Iq35D~Ep!W|XZ}1%a*UuC3?H}d8Cn^8Y z^aIc7e^HkIDE>V$^pBzh_+0XoCi+zSDb?_gHVb$e{T=b}DZ*1q%^!r<;DiGh;U5S# zPjQ~|Oa9>Wf^SBCwd6l+lc%ar6Y_slN5N$Ke+~Tqm7af!@-zqf2PGHlZ&4mIqEAtt zW?TNC_~QL7%46>3DazC9+&?I0VA|5(^yu+&_bJNLtEE3EM5KR<@_5no6y@nL_YcYp z#owYl9(tdmJU!0*LE)r+M0t9+`2+CxaqBacm4Bt3#PyIwQ7p6 VU<>;7?;hw7q+m;2Xa4o={{WSNc_IJ+ literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/AdjustToContentsWithAutoFilter.xlsx b/ClosedXML.Examples/Examples/Modified/AdjustToContentsWithAutoFilter.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1ff36679c34743422a597e40365ef6b37aadbbb1 GIT binary patch literal 6425 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 a(cf%*L)}yO2mt^T_-_loH6=fDc=dn5rb4y= literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/BasicTable.xlsx b/ClosedXML.Examples/Examples/Modified/BasicTable.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..747b0569d0c10dec9691dd3dcaae64486b9da7e1 GIT binary patch literal 6985 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 nPcBai_+6==T%HUF0Q{!#4YY}HGXwyT<}Gk!ga$ literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/BasicTable_Modified.xlsx b/ClosedXML.Examples/Examples/Modified/BasicTable_Modified.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e4cab6890d9aeb192dc28db62f590088e4697fa2 GIT binary patch literal 7103 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 B#~c6v literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/BlankCells.xlsx b/ClosedXML.Examples/Examples/Modified/BlankCells.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bf4348a6a611d8d5eb3ce9e1a9ed1788b06a2daa GIT binary patch literal 6170 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 V5E6ZFM2h<+!fji9zH?^4{{ZA0l2iZy literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/ClearingRanges.xlsx b/ClosedXML.Examples/Examples/Modified/ClearingRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..457ac892a5939f38662c292ea2b5f7f711bbc6de GIT binary patch literal 6879 zcmcJU2{hE-`^U%55VA+Y$WoS>VeDJkk}P9Svd)a%U}hL0Wlh#>m7TFGWG7^;h$u@+ zq^uPZN@V*FzI}aj`kwPUzw`SWpP4gr@ALlLdG7N(_ukjQFOZS5007j~09Tu@hU^<9 zARq|<&`!J<004lGD;V#Naj|oEcM;o&Y8=t4z17^1}44NZN7+>TMnx&l^A|!dv_~AO7c<$>MhlTl-M7KGV(X&}jpbSP= zuBYq3L~8P5J-oTLC)qZxSHy_fRg59+^E^FLzequz#en+>*WFwuW|IL=u-0Kbl=@4i zi7I!c`SO3bieE?bnn;`*eKvM6?)J{nSh>>hde14N8xk)*y-vj)=?~zqFQQ0nQAJUQ z=<51l8dC-fqub@FVvURi6q1Ish300bC$cYJ4!QI3o;Cb0w*mIt=9T6?mqrQz>|V4) zw^?IQu2``6?(q?YqTFn;;_e`o57d96=x%TCgg~jgBfQ*DXxtx!!N2za@fzD=98fqV5cp8M zfOyX%l|Y6FX?saoJCrT)Ult}SDGlNU|Gy0l<%2_^ktn2?2Zrb@49*FK{m1x_?g%*X zb1c}_!(%s~_XmhMkA(jBWBT_A0K1`Zwn$r?Eg0dBLH&6|zpSw+j5pEi*nhPFLt!#7 z7)sU-2}8=jphR6HL<(YW2a%PPKp~;BQsN$1HzdO2FQ3cEA)wMQI|RbcRvIP=+y8#x z-(pPpR}k;#zAw*79Xn#)n~(tjjKm;5?5p$y-QDC5En{kQAG;0A7WOn@Jt=)g{itZ1 zr(ltWoy985xt^0Yri0ak$uVb}H)*VAL-q&DXQNxD)q z(unXcjl+#R3RLA)OvA1(7%lSzXM)%vD=rtG&{7?#9CDtZ^x?K@%kvT~hTK1sRnsbh zhmUh5L|AmO#q8&!!@h@x3azu70 zYhC;=TGDz(ELCU^JW!}FrK#MW*nCdE^+IaN`*@5~9bM_08wuEQg@P4Pi(JbA-=!@b zg`v8*b@}w4#@Fnd4YP$=qV3?K5owcXVW3712TLSq@w^pWI}xan?Z^^rXD~(fC5!-v zMVu`cUOu|RnWtU^XVH!(7|=y%#L?|`r)UVZ=|;+Z{`TrOegoRx{As&nYED9*meZzO4n>YUHSH8d1LOa zuOBznch#F4@1;bGIa#i7rM$y)_V&M1YV)pCeqnQR+-CTkY5n6$N+G69#y9euN6h%* z`;w${Uur4m)8~{64ICAp^9}tZM5diD{|>ZugJYzowu*LDG5(H9OK0y%=L~^q8jiu2 zxiRWwRyQh)Q4)n$bNCig{ot~haif$!OC(UC?d@swcW&v;hvyEi#i)#nxkt7+$`!;- zS)F#v|L7v7VVXeA*6guD^1ExkatL4cC%Oem0{|TPE9!7pTv2=BHe`AM{T9O51Z=&^ z|7I%-B1%eJX>-O1O=p>YodyCs&#=>JXPsS?sG;m&r8W7o@!2jm6nBss^^m=pRFZa7o|kU=yz zk;#HSl{d%0{vUEF-5Uj?^5ZERd8JV4I}(eCIsD@A;M?tPo1ph|8ppUkf9L#h%aV&A zrS%AU8n|5JqVuMnI#4rbiRXOY$uZY$ZwY-GO)QUDz4HCG)HNf2)*svSYgF68?fIL_;a`Q(_rJ{MgFJhHJtv7O5ZeqN0L|Xq|+82W9(301=LHHI%Wi?hTOtg zD6((4Mg=HK{an*|dG4v(r?=mjxSb;_t0KN>7Ba;vC)drJn2}PQ=cp;Wo1ffZG3JlR z%^tE26?}K|&748Jy~~*bI67iVgQkaL;e&6;qs7F04ZK?7Bj|8dyRpEjYp)}YEI4&2 zCuZKbOu*_4j+-e2tUEhU0@khB6gVljKSs!3;h{YK1~1)OTT@~GFs!&h;TdfD?8=vO z4tm@>q9p-jzlZ7e#c{1z;zCtQT&Xzr!*n-yv5qJd4oj?)#24t^j`i*sW`wwCSwEiK zuv_7>Ax#DZwpAtQ^gETZTG;5icJbf5^=-)a<+;xyH~})Fenh`W<8r}}bKktropF_G zmR3z{SH8AYAJvX&v*)KL6K75W)*lPCXxJWPD0_0JtUbNIPjGUSvg&L~_KDEs>S;)X zPW)0(a@gtmT)ayjt$o*Es#eJ`=!0aEE3LTOV8o z@>1Wg178f>+{8~d4+OqpqZn{!&bY@tCZ;Gl8mVi)r3!l#r6*kw1oEn< zhFQn9&CPfWMJd%jeMI|6QpohZ;Y#jcrR42T!cqF08R)wk8*tZC)|GDP#i1{f<2MGz zG7}0%-LuBC81<4M!W?;pJd_G?Bd#p;oX_<}U0%{7#xY;|bZVXyPn46!;1y(73i|G% zdS5uRe>}}EkPwy;hP!Yr-=f(Yyy*h$Ui*H>bH1_3SUGlzE>2hd9dAWwCk5zj_+?N< za3?FMK?pfDux#di$?J_1iM7&QZgs1cdEN?!%HU3t9(qtJ{0Xai>g>uuX}3O?T(F@& zFR(g8l_f$c*pYpPn*i^jP|r@e5Uwg`#>k!4=U*Vc!flMG^WcjRVJFn#_##}0FFt%f z&wlrw!whQlW=$}Mt3EDZ42|gH1&XXuX1f*69w)&2h$uIgPj592sJ=FK7dih zQ5$E(sPQSoE}{)uJJN7|NH3tft}!n)gv2sleBvq2*F?7%7tk9&>yoT&-)741P@K$= z8m6ByYh+Rf%|r_)O?^`ddZnF^1T>nNk1p7FQT$?7dB*v1MM2s))J^wRVaff=rYmzx z*KREF{GP;K<#ATE6aYX27XZM#pTs!gIR^#ad)~|61#?|@E)9-tk(?$YzpbH@#TJia z##B?KwRH?)C%^mPKfg&I>X9vSFH{2Y@c}1-I-DXhZ~Xk& ztL!4cQJ(pApLdJ+ck5rfVpXi`S9y^iZ&9DWGUzpW!HX)cbCQ{J-O`~nf6-NTxYVlE z;xsScSwPGb+ZXvj!zI%aK_!kS%S^H7$+1S_s`s-*Hb>Oo^V=|0T*|Rp98}fer_zu; zX*t`A(^d-7Ovy`t@<7%i5(mjnFjJ*Sl?&5(OJKjpUhY(8{>WHaN`?{KbW}efOa&EX z)xo7dT$e5M{;n;SV^0w!Y+82mGueEsE%5&s14oc$2_x?Z3Gp6WjguEop4z+R-C7)oZ(sj?8A)l&O;+ zi|Yxrp@b|TiLk%h$`@|$fdBxVSu0*a7V8s>+X zziW({1>TsxGN4n^ox|bswhDm=Tu=iJ@c$p-#Qz&MxV_iMA6qm_GKPn=ShY zYecVhb}eL9<0F0Mce3M8rhNy5g@eYEBs(ugt=63$4u0#R`Gb#Fwm4?fQhV?i`^Lr~ z!?Og9zMjWUCbgfjS~+H{E}GewtXbyr?3#`!a99+mo00D1gkGWQ%TXdE>=4AQ2d5(+ zZbq;^@|NnQ^(gTvm8NTdrnZ_W;hn`6H5#9fyYO0HP>ln|t(M6Bc@mIPuq>Jde&EF4 zIz(kmK}8aCHpWGLO=5cC0t=Sr4oyLPeSNASWIU?6l2)Lld}KNS+2}L|lhn+g?IslF z+n1Nt%}mR%&I)!)P1i2~uPm5#-(&R$I`^cHP`*t^-)oymz@dA>td$Y%CR;>X2B*Fmg%Auejlk>Tx3S*mpw+k z@;$x=*>jMo72!R5{CyD1#?H@OhF2?|v(kKibg}v|np;7I6Du z2TsT+HPGkI*{**QvJ|@em_*Md(W*2#n&w@Vq<~IYmUW5hdb87omE&&Z73(|pk$ToX z-i~@bImgl%$Tj8l8|c|jzlX<8T=!KY5d!klu>==b+@*x-sMxxox@@yU1a#tqW~rPr ze`>)CeNQun%oh#z4|`zsMUW2_4fUKJcd^{|Tviag5fc3k^u>`~R=D$-_GenM%k*hu z`diS|8#^;b1}O>-%Fd7DHNUU5|EQ89a_48K)EOb2#SG(VqoYMp$3I(GQ`tecOb zn>l^$a#6?l3v;UnKc{fM)6k}*=7zO3W$N)jg`u=l$=f%-0<4a-#)QywIm^9yL%ZB>-_(mdHm;)Z5PDs5}g}bq}i{5nz-n zaVZp2UmObKc0lI-X|UJwcTXRz)8DdqJYF0xxhG8IbWrd`T^*x6q$lQt z#^P+z2-IKte_Q;g#P44bld>Wbu{R)j1O{b`Lm_#I1Cqz>F~DCfW|C^^#+o2y35Wz# z3?d^2l{SXT$U`LMC8We{ z5x04h@T7QWDmiigz;2U52x26hX;|t^PX5sp#oVmitYbg-{vIm}?v%8h=s7}=W4xE= z%kYempN2j82~Tw?@7KZX_~i-yc`PaPL7K@D>b+G(^b0vZ2bkxj62cZ~k(Ha?L}?U#6d46>`+0A&ZN^i(8{f~jINloI%KEJ zsp91y5GLe$>X}$wx)BaE7CUV7?jKyr9t=>-ld*0)!ZUtCRGfHVs$2|0cu4pORh7Jo z7;zb<*|$AMf`m%2by+sr=!w8ILA$~_ORyn-4K2Sl^@2MQ#X&(suxo95q`_K9daq_(S5uFHjI?2mk;QA1y?HMYD?q0RIQf2Tg+j literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/Collections.xlsx b/ClosedXML.Examples/Examples/Modified/Collections.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8a575953078e0a5466befbce897a12b32ca2b3e3 GIT binary patch literal 7012 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/ColumnCollection.xlsx b/ClosedXML.Examples/Examples/Modified/ColumnCollection.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b46824bc81c8bafb32922e3aea4604f62dda82b2 GIT binary patch literal 7376 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/CopyingRowsAndColumns.xlsx b/ClosedXML.Examples/Examples/Modified/CopyingRowsAndColumns.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..51824a51e9287b88c7a206808f502a8ec62aa68c GIT binary patch literal 9631 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 KLMo^KdGtTYBTz5^ literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/CopyingWorksheets.xlsx b/ClosedXML.Examples/Examples/Modified/CopyingWorksheets.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d4ed3d5108fff4446431fdc9447c014e2b385e39 GIT binary patch literal 13351 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 IwqM`=50%)9ZU6uP literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/DataTypes.xlsx b/ClosedXML.Examples/Examples/Modified/DataTypes.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0a97ac32f4db2f093e7eef4025cb4149645dd145 GIT binary patch literal 7431 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 Ozgy8<6?_I(0sjMtziBxD literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/DataTypesUnderDifferentCulture.xlsx b/ClosedXML.Examples/Examples/Modified/DataTypesUnderDifferentCulture.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c7ae2c7c02e41198d3a8cb5ae5ad5061123c656f GIT binary patch literal 7425 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%0A7|l>B z40QPr=Jm<~ZFpviSmtcAs&$wb12L9QZf;FgYcg!)pFmq)XD}}ejY*e7daY~}h@Mfu z&M^=Q$vXSUe!|))vK6?@u3`TwuxyTe=rfLu>v>d_PrUWs_Oii+-iyaLN|7YeHD^7k zUK4{@``#nAD?*D}oUh2NvkH6!`nF(er~1x|NJ$Met4X!s<<0Bzr3xJ>7N2yMqBIJr z0cv&dRa`h`R$fho5bt5>SA8Nx%@NO6!)oSQ40n_TmM1L=TMRosAj8OeB9m9eQ`qmO zMo_KBJ9lyr2tXZyqe!pck;x>ny67`Vpk1wkuJGt-^ERXsd?JIWHzs%+=^^5x%6>0n z;9rKaUeU|?fklv15)O5{bJ?w{(6O3oy}a$TGq2p$amH z3!2pHiD{M-x^Sf0dwEd#O;ZqUtS3CB4^&nG;U>!X^XfSkk4&PaEw1W=P7J?`cG>5&&MJvnXuhdG8O>cD zMhpAa07CL`qOo=<*^-2Xb)%={C2<5$X886ll}0IhkOZuzBc~r&Jq~v8{Fvw}eEsMJ za_H#9D8;+(lkJn9)2JH7d7VZHWPfkHvWO-8vcY-k?Hu_ULKjSUwY0b{FX5Ha5 zKB|X4ct-%bl$;5XTFR)%ZE1TD_%Nxg&94+YCFpiNep-*D53w8Bk}eTEt0B2?>m9m^ ztK_Jtp^?&sc9)-uY+{{t-O<(JT5Oj>WO2xAwuZwNprB2KSwoQ0Yswu$=dTjKRVx3z zzbOO{k4|fP(p|pm*oO6%vo(8$ZQ3# z|5OS=_ceai|6HlbCyau+<{s(Yd8DZ;F&S5zl;ITL&)#PjJ03zL93&_!H#jJ8W$_VG z+4`X3uWZt9uSLB0AGRt|6bcprs*wfd> z^^;Pe8^$Eg`h=CpG+jxrNzrOznES`WthEtM3f2=w2!2Ll!chOj$t?RpNLfRmV$)>L zG*sct9YYeFqW?zFXXBY^tEtdK>T?19D5XpiX(@qMB0Hp@5*9=8B4W17Pjf_nz9tp6o}sQtJzhpH;#5@v5`skec9rs1Wh~1{qxCI1 zZZVMF%<{|M68gdndZU}dX`R4+<1=5LGjy-0YC4hZLNv4#VaIIOesS~mD0MF-1{K-9 zlvr1s)-Pj%D9X!Tnk<9sG07`B1ps_NO_STCz(HlaJhhS3Co`!w1uXmbj?A?dFHG)@ z+*{$K!VoL^=3;S9irW$DD~IG1ZK2cu0w8Y=xb^$24mFFnxAS^_<+4QWFGP5 zz2>z}!i0!;86jAO``3KPojyH&#|mu)6*mFaby3c-M)t$vyy(nY;zYS5P0huh3}BH# z>IVa;2(R0Q0Km^LcwLwhnp)7`b4W22RGhgxaUTqsf34*{_zELX^>1nkq`YZ==E^eg zbdvOQzoGtyczM3D(QBg!LZ6<8jha*Dya$Tl8|q=Svu>?tt9cI+KI=NZ^`{$j$>3No z{`ivu3>>ejoR;sipaAO={E}&(Q^;Vo^RBnnE%QSf=;mlp>9{ z9rf!L;GtX5(MtK|UFI6)hhm;GXY~cMnTwjD8t{VxRJ_(Il!{-aI>j-En9kq6o4o?h zzw1(@9&#UPKb)3JasWw^IE)mYJCG&q7XhAyrJCe|-%Gb3R|+3j(D#vomN^)244htZ zjU!A=PepwT^(=(UJuwT>7`R1{>}e`RUPfG0$C~CAwe0dt%6(eGW46_ZH>zygvbqoi z$hxp}z}o-l3)Cqv5b0Ktv^+f!Fmv<;7?0r`(@8I@9!wY_lD(^|z(U%!+m{qok9ulp zi+f~Zc|v~}{%KbK9f?!$%BKcL`bXXU_ zyCs%9O61f%mU&tC1#Fb_3OU{6BDKcq)k|rc`(By*RcE=`)5hB|afSmEJt*N_ezg`+ z7MsJLWI*4q*T>RTt8^iLd|FQT`=Ykosk?gg`V8#ekE%HOQHo?cI2z@*YI4hTr7+{s zh08}~O7Ds8!ouCU`1G3iED@_CHOXg8%IxJF1bjv|U0R1y#;MyE4?KtzOGBQ@be(jS z*0$cI+sRatMRJC5aK=Luu-=c?eME!Od{!wos78|sH%wAL6M&X3NjZ*oeob^Fw5QHo zOjltL+U%INk|0`)$P6Q`Xz6IvZat5z^PQ-E8M~=FNNVO2^ z#`v>eFPn&I>u83J%{`_I>BJ3JHcZd(kcRboXVr+6yqKJlHBLU6Sgo*2aDmz0^x&1e zFfFGxuraq->Vi7Jo0t8v+$%_-|5cF7jkZNW1WmUcja#qgFJCLzm#a9_%0zeaOwee5SGa- zJ*Qg&^}HYDKOsJK#_czHPy?7m!W?0Tx@S-Wa@I zZ?StnH?K6)1LL4bTz*5aaOZ97kbJ!4L+!jF(TG*G=@=%b7q7-ryk}~+xqx^+@g_By z9A)F!+z(tUJl%Ze$TKALbI0!FqG?*#lCk z&Yz<17Q=4&@V{OJ*~%keJeA?J4}GnhHfnC+Fq0!ik5Z0G_&SC38DvGrK%Kpmo70lu zWCWE6DR|xUYkcC=*0zC*Rsssg(UAd*(=$uT0Eq?6^%6#qiuWSPdv^VfD9e#rS=}=L z_3OEp5<7Z2%N!MYCd)zOP}W&VN_XgNpz6UpvQ1y*?8oPi62)oeqZ>WmQ;sdR|JKmU zxl^qAU$iK||DUudQiGt)TG_&H8Z7avh9RYqf*(oAsn1MqC_je4V)PK0Y=dqJ7CfrW z_=O`}`>0Mr)H!)$n=K~SSjBKKwm!C=-r?aR*nKe`lNCRAGl>Z`?h$$pp?MBD44_!S z0=IP6bbKFE`U1>iAJAgJ-yptqk87$3i6DtNNyBKd>0@=>X+X@Jy|0Xs)oiLlpHJLG z@<^i#Icr6d=WUpzW|n%71{7j^w|BFpOc zzD=Am+(7-YHrHb!+oK{))=QKumq!`v20E1pdUh4R#1g=+_e?e!8htY5w78@St#C_M2 z2d!pT%~D{6A-QVtK6CgeT9}8sT+0+M7iDF!l!V@f(6t=Pv>qQHuhJV~glXZ$(=cCF5G?Wojzghu>ZtK~p;(qm+>S@Gw$q+pO7a7Rt@t)pxi-7l#n(|;V#eaM z#h3BlmNb;7uHJBKoj;h5-fb>-QO#{;ABunS)}MaxX$Du^`zLqV64C20=i>fv(b^}G z>>$X3)6S^dJ`)@CQk#jIa7Yc6UO;EQS|n@5`N=%>+8m!duWk1$;~MOUCswaP%-;i2 z!Ey!&Oq*bemafX79#jqr)^C1I8l$BP`c|G!k0Jxr*@8_k_C&rYIz{&7MZI?)_(@Rw z-~`2Q+4bi9OH*0KujK0@$=`g=N0_ zk>n7j3sUroKz+`6l5pyJ`CI!{DzT^vWP{cB#kRBWit6`HEd7!G$|!&ypYu5W=Pe3> z|H>$8?dV6l<~#$q2UF^;S()t-cgy9tq8wG@;a4=+d5+LLa8y z+gkGPg-UAf(oP1Jd$D{yJ7$@Y1xK=X$%wE}+p&F7MZSmcjIFYYFb`M{uNU4a+3mIE zu3iCW`>xv=*K<5Ac$RQHK$blfHs#oBud4IG>$(1*04#a0%B9@`JM)WM7Rt;t8RRgm zY#>=vlP6rRVXddBxX)1?T@8G~$tM--7I|3}lQnX}mKj}eG64hgZOdwXi1ecs4}_v$;W5Gc5w?u`bkU=4G1QMgSszOUeZymV zC_RA7d%X9_8i+5+C>bXGqeCHA92S8GWPrVhRzag?ka%x3{&gqEh&Ie7;IJC|)Y;$^ zxjZ`GbPj(rcQ0s652SWVqqkN!3qONBUt@((fO=|@v0g`lJ*|r*V!QmKZ;?^|7>f>^ zGu{#)YY5J%OQIh4&g;Jts|QFD!MhgI3PhRp`_FNty&buBiSGRJg;n?rpguhiJlFJz9dD^ zMfu9cc*2tT&QkYhv5#d+^nhmZXW z3!oT3{nVNVvWZ`>IX~QayETkU*%s08d0`w6`^;-OZjd*ghH+I!uJuzzDh0;SvoC z-Jq}L?Ur8GRi!`8C!Cv|CvMvwS@tMisYT_5W8>6Wa@pFJr=R7KD`@O01oc^A-Tqt? z50ZVE?-P?=H@r?SQDVE3!c;yH7Nz6u-Q6PgteO;kwm!V-jBZrHW@|^R>K~$=vrtQI zh=KT%Ryd3bsOhgnu7(ztWgFWdJz3-NNzfbW(lJR{y$7r9lZD88UmlWu%i1wifMD)< zj`@Sw0URSGxE#ZRje{WyrXOhdm>qHnbe{F*;;{#Opg%W7Ki&d8OA9|uj<7{XK+yQX zD;PP(wrY8*Y}9gN0>SJUPX^2Rin%%LOJ=6ElUxrbPI)aoG15c80M`zc*@GGF^<^OXq4C>uI`i!qbcJWrZcB=8XtDk4gcMhXmX$?Ec0zNNMxFX>bo3H{ zs11@skpPXaPb!$j$oh^6q7{%`A9G2*&SC$yAic_9LQt!hZ*(**sl z1reQ_n<$!O1X1==; zDsex9aOOWP3v7BM1j>HgmGG3$mQ3?p$2ztPd+&z?@IZF^Aff6BGN8A);N0WDt|MR}=eLtixl)79S)q3<(1gNoP zgUxs=TTjsegwWSkLDN9y$NLDC(cLvU^YR_~$fQM+ysDK^*3R-?fqi9rEu>~Tbi$h( zSB)%V*?I9>s!_D!5Bx5>zvj!m$8G1%ZwX*%m%lpRQ@#6kEOq*Rs>(?G?secJ5)8lF z!+c}E>olW#enedPHjswKq=_ z8XT8OUa;<(>K&%wQ#fHS=QdVjLWsq5(8pX_H1S~BJW;5GKfDOaFo&nC>YvH0he&dCdm;eG4aUa|e%N zIaPR83f$`+lsZq~bI&1(Sc)rxDbA}hOOb)7r4p!j*8yq8#~eA_)z%E1GiaJ9Xb4df zQMS^Te4h^#iCi&~F^c2fzD?KQS&68x!(!^FS@;}p-eSEB;+HMj8plo9JR@8fPOoDJdK5UUTe0CP~_-aIS8t!*$OV;96K$!6*+wgv>-#0 zD)n$4_VF}3*0dS1ojb1`A;#F9Ew^t7>X9s?=6De_tOSkbQ+JTe#~u~qrX1XzO7j8< zF8OOlFSrB^z#yVpym1~=!s6P}RLJoRAPd);XbIQMHzpH7ka-A2F}0`b6pf%*Gfu&t z>D3O4Axlaxf{JZ|QDtf*#>Y4OOiEQb#ubuR?beDXRQ5HsSKlpOsTg~@Td54^lV{)} z%ZjKr^q+OsmQ zYgB!`0rUFI+nU(ke0eF3z7p_YCgXnUUDy|Z5q4)(5Dr-(ANJRocEG>${2z)#VKT(I z1-S6#$Dt0-^Z(anWdD8L;ty@x4^iD8V!J`NI+OfP*0Tm-&g+&=NGU&Tor0z{l9}O$iu_)C**$v ziHrUeAO3RCpHzPia8>b!xXqvnd=YKHRewJSgT9ob16)A~Gyb6#bv69?G?KWY(#1m* zY7E_}(8Vh0AwwnIt%%#k0v(Xs>U=LKrV~vk6_2Z0%_Rf%m7s?;>(-rRtXxzqPbL>{ zO_)O$pJL!gdJylO(6D#huZm39vWwk44pi>T4|M}@luVoUrX_S0;+0TT6THP;wJJKF z7?f^wW)9SJ6-MISJ`0h2mfTUuXU{k93B#^8cvIS>JF(80w4m!;U$L0O#w=wO85dU6 zJGrA8GdWkUp3|zQWAlj&C?ARasFrh#p>eV)o{FQ*T-M6@;r61w^X@QsKIQoeJ)&Mk z*9zUB9II5phm?CQW`|Z)c@t_%P^HF6jl3MU6b&ZK!OhT0CcAIo?UgR=iVj)X@r(PD zaxcEkr(eK__U2Ge9Cf~AAPbE0K~mz(BD74ASQ>&Y`kFyS{mXDABFdSX_qFT zrmt?Lx$E9Yp;q7ExBZ5xrig$@^h0&`53+8!5B~J`o1pfW@!t!Ne_5u(eflRE@-M@` z7kmCPG=V>#{x1Fe-THU^;4f=M_%ixCHR10FzYF(%ArPVcMED08-|slTtJr?wsG|Qd zlK*JhemDJH((}vI7p~#{*Tnx9fzR(KzpD;@q0qra`hSD+Q-kn3%J18YzfgSPLHRc* zKQ|kHNBMoj;unfD>EELK+`jl7<@Y|~FBCeezeV}kRs0?0_g2R*ly2I;MfutI_#Nf< z$C+O!OpHHKet)?61@QNE@)rO$+y8^A`Rn%RfWOPGzi$78<8O1Vnj#83f`0si2QGjH L9*HxYKR*2rqPaEa literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/DefaultStyles.xlsx b/ClosedXML.Examples/Examples/Modified/DefaultStyles.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7d77c3231951f7a53ee50935528ae5354b43a6d1 GIT binary patch literal 7411 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/DeletingColumns.xlsx b/ClosedXML.Examples/Examples/Modified/DeletingColumns.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fd0d7605ddb2fda069b13e2bae171375e9bc8a3d GIT binary patch literal 6298 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 JX#?(^{U1|vC4>L~ literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/DeletingRanges.xlsx b/ClosedXML.Examples/Examples/Modified/DeletingRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..86cd60e8e73b7e6fbe73206bd101fb36707e8b7e GIT binary patch literal 6374 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/HeaderFooters.xlsx b/ClosedXML.Examples/Examples/Modified/HeaderFooters.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6a3af49f94f5074226e07bde18a26aa2cde02b26 GIT binary patch literal 6383 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 Oew&EAMig-W?*9OoVhwWu literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/HideSheets.xlsx b/ClosedXML.Examples/Examples/Modified/HideSheets.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e06f14dc1cde2a0b451d895ad8676546d83ac0f9 GIT binary patch literal 8602 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/HideUnhide.xlsx b/ClosedXML.Examples/Examples/Modified/HideUnhide.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..51ae5a3930bea7cbcb6c65746d96442c43066dc4 GIT binary patch literal 6287 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 Ay#N3J literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/Hyperlinks.xlsx b/ClosedXML.Examples/Examples/Modified/Hyperlinks.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..665d5498f142c7db9a2b720840950504a8ab42ce GIT binary patch literal 8188 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 A7XSbN literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/InsertColumns.xlsx b/ClosedXML.Examples/Examples/Modified/InsertColumns.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..12f9153243b9029407d737b0ecec1f53b60b4b99 GIT binary patch literal 6652 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/InsertRows.xlsx b/ClosedXML.Examples/Examples/Modified/InsertRows.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1108e54eb530f9718ed62883429506e021494333 GIT binary patch literal 6672 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 O?$v@LQF1It-~JEyEAzqt literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/InsertingData.xlsx b/ClosedXML.Examples/Examples/Modified/InsertingData.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b9a071edfaee6e0c8b82a88582fceda0a014cd35 GIT binary patch literal 7267 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 BIB);} literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/InsertingTables.xlsx b/ClosedXML.Examples/Examples/Modified/InsertingTables.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f08563a3fc50b37260da4d609a672e909b9e37e8 GIT binary patch literal 9727 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/MergedMoves.xlsx b/ClosedXML.Examples/Examples/Modified/MergedMoves.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..842049efde074f6ff258c7620239c00f895ce327 GIT binary patch literal 6457 zcmcIo2{e>#`=9JPVGtFDkZsHu`<5XwmMr15gc&oIY-46Dp~Y4t#Gr`CR>;04LiUKV zXDi`VmSl~P|Iqus%IQ7lJKy<#Gv|5cJoDVw@44^m`rX%aT|Yxzatd|;fQAO(X7|N7 zrBUD-%@F{gj&v{s003WCu#X4M1?A!4BI)bq8fn;J&?v>S4eaolg&7|?>*ar4mzhsc zRQ}nzV)5*`DX)=j9%|Ka+j;}b@()ezrAkVrrQbKd*%VMawjTv0y;n%-7Dd!|q}}#V zP!YWHReLaR`gJmVbP+y8R9-9&Pxd~&#%M31ge7x)NS&&1BAxB@-C~Toi@=0JTQGU* z9~Vu(iU$EtFTUtn)$Vq0yf#`C&ByKyXn)(@Njv$;t-4Yh=j{t*k{|P?QtPHT^`sNH zfqWlQncl-Utf{xyoZP!j4Hv?PtJHx}A8`5$*o82tIWZ7hO#c#YdUB?~4!@c;w#D<hf66c5^sDQwS z*aG6yL92j_(F$le2Z)>;3@wdj&EBeB>$I{%m;P6rM7@8|UI0RX#U2uL)NfCSrn;4r_R(cjj149=V6b^O2DfE8pE zWT6fUC^SY634@|#QPT2qNEvBqSr{5E4}qd2v3NJMJ@zl3!yqseN=6prfP~t^&~h^S z>jVG7G1b3G{A1_iueNYuNV{H#8~|V;k@&E$Qi$q%TmNh!YmEmnf$pJ*jww)3HZ;tv zNV6p|lOxLQZSUjhOXBjZ=Jh&hjBe`n?%Ok%KfCWPuP<{)4rYB3l}ZphMpRehJE@%w zm5jLeL~1dG=*enyB3sK@s;$BAGn;cGoqdUB-@`?#ijdgh=K`57f4+=kAM0g*{u1By z9$sup%esSPN#0CEt-<^&hn$M0>`(UZrck?3B&rYeT196rDZjDAYP}gt=#-a!nR~pp zLx%k5rvFZokNr%&*^NmdTJH3`zNTcOBPNwX?KwrSrIhl83a$@KWX18^*96`GN?mC2 z&*Yf(w>LIw%+dT{@qPY*Ko2T^xDRdxYp;c#_olrryIhGf@qX+6>Rfx;5$h#^p|0xe zQ|NJtc*<=|^Op^}YyNq8%t6=}K^Xvl;-kLza&KT%s=*3w!Or@x>e=7xtA~NjqSwwF zH=a_}V|Zh8`aZ{=54wJHN^zB_C8I{Kk8WJRm-%|dr$=9&#YN4UP$6i4vJ;Gf2T(yv5dHQ^hJ-f^>L> zP{nj&&${bAGbw11O+osy72B;Vt1Zi0b0dEKC#cup;al%z#B;gXFY_dg`*3&ljH|rx zE>(SPC-}~8@SNGx=29wQ)>M|airkFm{IT8fvYBtRRkN8giiLZRO3wL(ei9}}WGjw? zc5ZSFS5%hKuPeviRjY6761?=_)HE$u-&!?B^NNz$5%4=7w-ET%BRMRQhm#Z zVnQ1mlbP<`F_;g_?AwS^dne%$@xn>rQOuN$s9W|&7m2fGL>i7d?8=c}U9*!MoNq;P zi!dz!!1xz62$x+k`upN@J>TUL?|k$fGQdXzJGy3b)wR>?*rI zpXd2L#+P#YZsx*~J{3N}kImAlGd$h5TZ!K{*012->Z-5XDHfO_?sC#2&H$^Yat%H) z<#Bp^oc8W5R60&EDg)3K*YKKC&0<77Gl(s4I#co)UYRy;lNE_}GBpvt=yE+iB||6X z2}i_WINI81#%KX8R4foWe!A=&?{z`(K@7r8xnUw+l0Pd>a6}&(b0Vu}wl5-h^wP?U z%Amnp^NHHdU5YH$fj%e`Ke{itV}Wpbx3HX*IES|{c0WX+Sc8^;Y|3)VAAm$_2Bf1* z3x`28oF;}I5?YlmFg1|CA7qqhsuQ<(bHE{&zyM2(yr!GW$diy~-dZEFp^bAx_`hwP zrsF%UkXMfSfS>D7&0So}ShyWp$!^HMl+QxGZTdFWZc&e+@P297gZHk6l`~(STyCQ= z>cEEuPTX#(=|)B;e|#Cga%MFid?rk3W=Yq}`1^Ck1s|F4_3?Br>$9Qd`CRTkP-^1l z;6wmrpG@wTMzPqYv-te&3&E#?8RTCK6=WM8+E7Nxyn_4uP zaRHm7$G2vq1v|6^dYl?lU9CSu2Gi=L)W@7OZ8knlD21?woK$m0H-xLqy(wBB53-qf z$#FW2Dnw?uagE{1m{(ig#0@WBd+M0h>K5!8woqEN=idG2yxG>V(u-5JITb3?*UD3k z7G99qF-53=u3d2v?)6pR&JiZ}dJ(?m{%Cbzt$3jzr*-87XPaqX(AL{T^O;?xk$;CfvD_#GIla@4nxtkJQAcUG z1#-~FreEysX#>Gyn(o{pTIWZc%rXCXhd?FfT<%JCTS*_kSmt`+eV zE;X8MptQ|9oAedE1!li`9G;ivkW%Dx=_}Gk2{j30t6PnTR-@Mo)|9{Hpx&FI^0%O|drPB^b%RP}&o6&gR>&db=wlO(9`q|My~ z#)*bvw7v($Gn&NP{3L5gS3^^MIv556oM_d<*Ly(QZ!st%tR=o*Q(I`Jh|1s2& z=~#y>nfozIVq7j!9l9;(A=kUi`ztfOieqdlDFJ|IJOBXO4`vcbH8cjif8HnMf`z^Z z&snbTVi~n2{yY7GxmL|lWAOX32tA|d$u(b}*|#bEo$@&zk5xeY{B$3Jnj*=`M9W#J zZ*4#VK_bTA$rd}^y?y4#1|H@Bj`GfL`i?L9jBkEvk5;pNy3U9Gc!x&ka-Y|zt`~Jo z+aw$J=0(SX>_u1k!2+8GD^WgvbwJb<$7jVr<0Z3vAr-EcW!7jN3cQIV{7IVF_ORxA z0XxvKDeF$^;vnri!)sWgi4TBQWg=yE46Veu8;gA8+DRQu?T}V6u%a2-KNU+ zk)^bN94EBxq}xVSeIeUY|d4W2B>s!%znw?_W1wP?q3ufK8tIgQvSjXeLF*)(%MTJ9?#w_4pC6W!<57*8awW%46p{OQ{L7p1y)75o=j(u zo}Sk_eUt^ktKgGD^*PH%V#X_W>7Q$Hp~;JkUo%*$^4Om=*Hr-A?1rPE9AyoR8vFRl2&-xRi0OmAMX_Q4=Uor@gs6 zcmDhKvc_s_Z=sFq_a{MTIB2i#e9o}F`mKyC=T;kMs@mqlTOy}z!1k70bjOzwvgnA7 zqm1F2mF-7|XC77*YEm4FkdD1grYFIA98kufU>F!$Q(OOpeMq2!d67!1 zb>KZQ%NsSvLO5`D@dK0TquKYhtQ)c~PnoxIu7I$-la0npJ6R&ke?rjS37N98d`Q6fgu$BH^Q9x?)Nbs-*BO3j@8$dtN9e!OMcuUAAQ=v};Y+aI^rt3(HbM_jbN z^7F~(Mr~h2^c~~e+UjF|Nj%%#+3ajuIg8iMFbBG5J+!oCpUXnkGAeOdJ<>EM+sz2Q zOx>NKl1|)Bm$dDhj;P+g1$^!;(?yTX_brfRXnd)$9tZVKRPkWd4QS8&F_l>3A-7YVsKUH5m zJWWK`IFG@kwX$bA(jR9#6c<$eIV}gA5o(i}e!4(+dBMCR4;Vn_$U$-Lgxx@(RUJR^ zqysv=HWeoy+4b}sg31@(WB7EsqUx2`l}ClQ=Q>7QpXbzgp-kC_a#@E|qwV_5gH5e2 zrihpLf23h|ksD@O#*TVrW4{DBaFJ`|_;_{(_}VXDxb(_paJ}Rekal(;&#fY)37&gG zJUFCN4-*YFa))OycBz1QUe5L=`N8ByuU&{9#)Y&K5Xz>ISf5@6Rddbb6hr}-1HL#~ z9iLKW_a+1}gy4R3!WZ9rQcmR=Q|26U^ONvJ;d{+T3|!)D3KAn}$IGNo=@q8g=EFDZ zoOM@@yA_vg?m9#m*!p@q8FXeGOJ=6fQat~RiBt5wVf2UVei}!F=>!8qUC(05spVQYfh{c~5Lsu&s8#p(&vnO~iD+%2UiChJJ zcH)#5X?uy7r6;#$N*+7E16jYh`=^Ofl9HpU>{L1{)7&jFce2o0ehi5V5LSrgs}&~>aFrQQvw0>Bj;PpA2ewhx zy_$4xn0zG~J-9aG=Bw;x!Bn}N)Aa7Og-y}7DT3cLq&B|p*~W${&AULQ{^Zk%-^0HE zY#1A&LYTO+po~lXb%4L~{154+iB>RknA9Ha9Y&-)|Nq`k|K|eEUX#D4F8oj(ekeGK zX#0O87pxb~bzibU+k-K#q<4`!sYZfGLcpMZ#u6|%w*%GZXM_Da|BUp-JO2ag28nt3;!RB|5Q!-SNTF!8EwBmAw_!}21&r6`A8E| zB<$-;f8Q~e*3i751yY4dK_L=SauN{P3lKR)DQQKhtfZ8Jyo?k?%2FBp_vpWH4uIWA z@|c73e}@c}{t5YSAXVjk73Ls7Kgl2NB;oUDTs@5fi9~V~KMDpb4G(vclti%Ilg;oK z_o~?ZIQ=~ZB(#wAas;YUoCU7`3{YW6D{1$Z*pjak50*dJYS?oznL0XAW zQhSy|pT~ow2O?>xHp`%_XLeh4kw2emA4Y*9!iQ zFi*?;^c}JslMzL7*+f-rM3eOyt9gKkuY%^WvIxiEqHhTn^^@i@^QbTgiq|iIkD{Rz{u2=vaA12MgeH4q*KPYrQWd*u)*gMi%?Q+a}Ot=&l^-|80 z1HU^NKKLf3=FAI&^DqnhNQIq*t7VlOSG?2OfDAx!`tN9Hh3z7S@>~76(CeBq*5ti% zhPp?{*!L8Se-W8U`}U{LArbMw`1fM#fu#&7d_PIA2Zp~FxDE`zktDCfa@S$&!&=ON zbtI|G{GBp$7~!y*@e=~6eIg#Dg5B^G=Sf2^@GQ6k~sRCjc=$+Ns15vKu7x4 MliFQ-j=ih@19!iiL;wH) literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/MultipleRanges.xlsx b/ClosedXML.Examples/Examples/Modified/MultipleRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1b284833366c6627dd2f84f089bc62101c2b300c GIT binary patch literal 6370 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 YEPN9K8uAPQ0F2~!1G#}^=Gp%Cf0HCw%>V!Z literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/MultipleSheets.xlsx b/ClosedXML.Examples/Examples/Modified/MultipleSheets.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3ee2f03498325ca62eceff83a9506cbea53be3a8 GIT binary patch literal 7975 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ν z&38|JV9~v%ds)Y>sSy2+>2EpLpQ|u2{8nX$pZvMX7ZTq6s|bE(ZaeGpKUbL}ZSDR> zWoNy&S7q|#PaoZsA literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/NamedRanges.xlsx b/ClosedXML.Examples/Examples/Modified/NamedRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e533d1147dcf383b49b2299b41a0afcb9037fadf GIT binary patch literal 7667 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/Outline.xlsx b/ClosedXML.Examples/Examples/Modified/Outline.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..93417e1204179d7030d888d15e3357c758ef8a9a GIT binary patch literal 6310 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 WPE(OG1OU*JzV)Pb_6>0F>i+-_LNvAj literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/Page.xlsx b/ClosedXML.Examples/Examples/Modified/Page.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..85733f1ea2f0a58273cf25ccb85443e1a9f0b951 GIT binary patch literal 6857 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 Y%#3I#dH(Us3L}7)vVSe*`SI!h0F?(VPyhe` literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/PivotTables.xlsx b/ClosedXML.Examples/Examples/Modified/PivotTables.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7fa2390ffe2b59fb35b6e2511f7d1a953ef51e6b GIT binary patch literal 43713 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 AmjD0& literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/ResizingTables.xlsx b/ClosedXML.Examples/Examples/Modified/ResizingTables.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..90aec87ee5abbd3c02e7225c522d6eda791ee0ce GIT binary patch literal 13641 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/RowCells.xlsx b/ClosedXML.Examples/Examples/Modified/RowCells.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..def71bf2e54e158dd959faa193f7cb548b276062 GIT binary patch literal 6391 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/RowCollection.xlsx b/ClosedXML.Examples/Examples/Modified/RowCollection.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d4010ba8cef2bb5213ea5748b25a5bbf269b237e GIT binary patch literal 7178 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Ð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 Xi2)fQ&ilt*)BtkAu2uK={;&T7|Hugg literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/SheetTab.xlsx b/ClosedXML.Examples/Examples/Modified/SheetTab.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..15fe42af9f5e735b694dfac18463edb43d1f4b3b GIT binary patch literal 6245 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 J5f9wD`aeoa6w&|y literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/SheetViews.xlsx b/ClosedXML.Examples/Examples/Modified/SheetViews.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2b77aae99d98f562f012c0fde31aa50687634fb3 GIT binary patch literal 10269 zcmcJV1yoeqzsKp6PHBb)VThr-yBh=~hL9nLE(PJz9ZE?_Dk%a=V^9)O(%sS}sc!)9 zOkq-4^mW0y5qI(6Ba3}0E;^cNBjkD!nsFSAnd&E#O9(N11I;(qK`x3HZuY92!mpk^e#Xea-?xIOgy7lN$%HMx zAno{M@jiLI%QDx;M=e_2IB^vYuci2o;rRtQB035dBeg6Nt1y`DYDf%Kq?O!0Xs*f< zKZo82>y?dl(VbC^HOrP6!Ydz@9E~jPQ=mM5Kbs;wc%mDbV-tAl6e&}Twfvo&)cf9g z`i3Y_#C0RS=uv!l$v01CZYv~n7hHwfZEzQLup`59HF8BTQ@gnAs`THX$y8R zhjKVMgB@WyN3QkHmyKXJ#HHbn9x%vy-tUWmN8-gvm0$Wet914N+VgGxkVj z%q~pTB*Q|lj%SPa7$1mY4?6(Gu$w(VJetHCU{C1+No;-5sbp1d-EExjMq&6!lK16X zoyO$Lv3kGKFIA6xvVZF1=m%G|%&R#0Sef+c8+{EzeA}3xg~Z=gl8}qT7UPb;{mOT` zvo{_Xo$W5P9%lZD0E*3PDx6*&JZ{krfj&PDn+<&$$jPT_lvdNBn7T@J@ARVA08{QU zJ+a|#x2T#y?BN(k*&Bw$0Nv$K6Pg6odDSY+&<#%F!~<2-x>@E?`zfg>vIodkA;3yf zb!^`c={@hfobWl~F-yJ#aPV**e1^QkrecC}ZOIST9;y}>kRMhIUkn>RGF)F!K_QxM zF=Ag+o9$cJn9P!3&S2y9+&WZT&n&{`emlT#Fu?nKz$^JK?b=zgBpSlmSZEZ7!3jE5 z?oYRkRx#9WsdJAQj?o=wldy$_6IA0(!bNkct)qqy=8@E2s3#k=$In)qwzk@{nfSJw z)E#~@uOa?(=mmJn7ZfM>NMh1I$|cG2<;zeEuije$;Kjc_ooL;f^AFE=>ym93d7-5>6{uPL z0sd7V8AY^(Q@h>(XONI4YD>Y>ZvtvBG{++*2q=>x>2ix74ofpW!SabUeH`0A*=Lbe z64LlCdjW{GV%UK3ZF&|bEIEs-`TY~)DKX1AToV0%UUtX3u2yu|CEtS)Pj-FT*OB}0 zN%Sg;_Y5gJzNf)OnSGf(_H|Tk{)KJ^<(wp5JU;?qKjApGA*Hi$xqOg-~R%p-Rh zY;$)NmCWoYlGHcC7(atXup-*}-?-`wOTJ;=2eH36ONAHF-YBR0!SsbsRe$bvX$&IS zDV>2&DaA z;lfSbW+WuaH^2p^onJ?XT~xB-;P3C3_1GTYR*T9gWB zrCRU6wz?)v1%oY03$~>Sd@qOVUx4pxt!N%OjO5aWtTT+iRF}Yysprn;dp^6PmmH_1 zlyJe3+8Lw8;=T1za;w^VE_(J2y*#5<8V_QS@{Srr2?%dmPN%_~1N!3reBhq(iP<^8 z5VQ3-1^u}_)o#R_`%!b<))DNJR3W$k5({h>X{L@$N@*l^o|g&C)Sr5-S#|G#45NN3 zmGF{(O|LEY*4&9-RC-!7R^Ck{q2;Q_*7@OU?^Ay*@e&*1yKGJ@*;4cJv?#}gRSd1u zskWy4BzU5&W7+E*bB6nIc)1UOv?zb@r0q2Yi@M~p>Gu+R(QksIrOIq~8a6x$UH6+_ zx;Ne=%T*VF@lA+J?7#tAXutgZ2}TilgzVX@A!d8?AH;1-@TaecqypzI&K|$JODjdB zuHm!r$5V!5#V|#jWN|fubo>hvLG0m2iYcmcFErDdN9!gn%Or!WgWe5?HSA2hS4U$& zLk!UD2qN(P`r3M`HOO>sfS4tWESOiQZ3@AE8*A@jgAK~|CSdQG9q6e#YVvOQr^%xW z(8@f2&yuL1U8qx^p}ciQ-BQW`s=iVB&i$i?6@<4@M$XLw`|Ep!6+f~5Ntzbo$nYWT zQ7wX1x}?{nT|T5xTQJxS3JX@SUtCuuuXbw;EJVx&!;vVZ6BiZn$ z((6&i@_LLrK8i-n`T*ptnUE562|xd|z`xz25^!-W*es4Mw-MMNXWY5=A_)N!9bIF> z(B9wV!?aDZzp(MRdS6rm_q^rwu5J}hD=Zj(6}{7?-XFMBPi&_VNb8PVQ(88M_ss>4 zJmM?(q=1H#)tPI?eq||j^H>}*jaS4NPO8F4o>ar#rTm5WBVA0ZEv7ww00oLHaJzLj zu(4Bl*3i>mA<%*g=t#w%mi);SEvP1;dkvC0*lRcgqBzIGXZm2S&4!rVu&`w^_mp{R z@xjJ4u?q>cAB5F#I;n}lUn#{f0I`%z)$7xHQ~|c8Gvn?&3|54;C)pc)EZ-Kt zToi|AI`Qa!5!)o-SB>fz>j&T%aUYHkG1XXXPYW1)=>4V0le}jQ5hQC`UlO=os8_5A z?jkHzQLZf$;LzvM&lF>ev8{vl$!rY`1iibbnI}HeWY<&Fk|JQ^afL0me8RWId%MA~ zt<)6ADKwXaIKE1t&d5jGXKPdy@$7Z3%;0Qmz-DXNXgDDxA^HXK(n}GzGAErz9h6B1{3z!NOZex-^Vn^sNYC* zI>nG`nK8`1b25udqo!;dy^uuyV~A+9=G`B@uiD`u%%)G5CW2auT0Z)fXFj#5S@>Du zEuWo6Z^4-g(HQSy2FlhF#tNY1u|pJ(T}TN# zE!wzJ*-E6lny`)kAm<4iy;|7&GChk^FWlSIZKOc|kR5g^i_w2=qR86B8 z@uuyB4WbGt`|W$~`V#3N1t(@hI$)esKP%*bae{o!3ANt7!C4&P&{{Xeql5clly>BN z9MSRz3a7z*%+U7th(VAio(!v}Sr7W2%td#Cg$H_=o=eCnHfdA(=?&Q}^Y&L&xO%+* zlank?Bnp59Zf9ULLqEWEOnDmf1iNiDSR326P(3c4AhfM8LH9!j7DE~e)7cx;dUGbN z3PrvIzJ&5UxVk3I!vKf$?M7^sRwS%qdgBPPsJHKF9YMm?wt-o9@bL5Gd~Jq!KsI)U zr_uu%bdsWXM_DmUhXlq|QuP;>!b<~g6+MDs``+JSoaFpFCp_1jNIJsu*f~b4FT0?` zcuN>%9eNP4f;k<>I1hU%eH-CZ1Fe+J^22_nLrjwd52Noxku7&MU-Q(zG!qY)7N_u` zJCZQX%j~|2DIsraHt%ESczZHY6MqjK3#;CzgvFG=L!Pv54kUgy3^VtBHgQSRlo?)y zMvObf>=kxy$m#}IqN5saI6tv6!d{tMBkDTY=HyU3!#JRkck<#`|n1Vu4A(xbb4*L*ivr(bT|RPCE2U zQ`P1#QIKB{)3t)nI=+}^9GPZ9)%B_RL@iEYEgZXiwjY$p1< z)6fksi3Y*95ao9PbBb0;8^VrXNMuW`O%Soj*_fyW$d{hoMRI$(KrG!N20+oI5HLW% z0z7S;^d*>)AkA>@f_FGTcZJS7AL~>_dfCV-7JT{=u-Q^35Kc&u@Z?3$qP{oW{h6YN zwbh5;)lgF&1g7a!vCATV60xA>PbV;{ZfVAb(P9Ln1#kWJ8_0#Acdv@ZL>(7lLy>cZ zA$R$wiSnA`Tlwd6q5tqP43@lqhXr&E%LELTI~PQf+mV^r^)w1vR_qa2t8v*ZH8#Tq z4zyLw8m<|OUymx($AM7^365ifrg!!f#6&`0TqPjUgR2BoA2+DTf;@_0?=TTUA+^7p z*I?3%^BT`?MffVJ*i^@vpgHOhHmzst2Lxf?%esUmL(BNV;3~#eC7Dk}P9014cjQ3L zz{nFdVPGF5^r!iLjKr{_j1#wEd3Ca;sT4n<^d&5O*RW)@%yvvKB6|(MV9~g@@^QHD zjdgw{Nl><7$FN&X*Vo?KCOgs#T}BuzHCiY&cs@Gv#JD(hEm)pBd|SvaBssuCsT6(P z@)N2AV?9&pJQRZG&gXY*Dz|^6xReJ)pwBTg8$-K%Vyp*;Vp-cX->DO&wlMiM`;psk zCkC7tct4&m8IG-()sF(+@`{p(bJ!U{GPywX5CKeQ-mhUW5#PJ#nzAT7 z+@=qM#S{?>69&sDIXGPqeU)Pl^N+{=p9R8UDM)L8#&xW_QGbs;xD~ySqF*nIhMy@W zG!GV9gzc3;yfH^_5$mn5LyJdZ>{VzPb_9Rh&b$mQyqBQ`0~T7uw)ieX3pEZNzRjDX z-Xgl8U!f&F+w=~E5E;ly0V(+Wa`$vJr5XO8DG1ut=W*~qS1Y`~X!%vGY=hY63rf~X zHXb75_dkrB9aCit*KN0q&McTPTL@I2Cn241$PwAaKZ$C$=}k>NKi!48cy2@sz&aASh1#0y`o4Em*{X?=7a+SZn3++hhYXo`4)qbQl&^m$jl zFJv^n#(Z<2S|;>`y6qG0?;^@H9eiHyL1jPCJw%vHvoBG3G#_Y{bcu@1FI3XirmOh7 z_;}D(Ioc^;&=z4?n2 z;-u>&G#qf7ly)%=flE?;(g5h?E=jQ|>Kmv!Xn!FnA2fb?cxO(RyBf-*a^FeHN=AJOhu^it{Qy}d1j&vDW{kxJA6K8c+^`K3{N zT5hVlVbYxAZE3;Or>0-JQ8@*w_`R`3)@m?WH10V@zHI*$S6G%@`OKE9wMY1|@|vaQ z!$zH0!P!Yp1(QvfKgiysYlDuQBI_d6#fI}UOo^Hc{8b9ZB(S2%RJ_`D=`uhw=cUV% z$VBk4up;c%N~ zPGo|i7YPs+R?cOrv%2|>{#@iApE#%M|Dj?H`mfduh%+-~pRP zcZ=8FPC{n-Tgu%qSmgd47XE8kx*f^6?wluwY#j>0pFTDhcBVvPk86|Ds+Mrti>PNa zV8bA+_1Lo)y?jBhRbj0}Rg%W#2@MoeT0-+3y*{H_MD6DN2M2f*R4@45u|-D9 zRw#;|?w`(AR_21dHSwx3-@HpJ4N%CpQxgRTymk&FDYCfpy?>7^BT>GPq_c{0UJUHV zhsoPmJe$ptc@S=r54S;0 z&&vlujxH}t6iP!V(1S=P%pKJXBhjH_#F@w@f_jB!oExBX90S8n)oO8iud0ylJTFL@rDEgDtO7+xKFa zzQp)r%#>6*pOT7Z?82d!=lWRY@MnQyry@}REiJ};(1&P51lBkBs1e6pfdFQ$9|+r@ z9X&iZrbcp#;qa(8PQ0eKJ*Q80I%CDn-X76dt;V4#dJnlzD!Ze`cPtQ)otW5^6>LKU zzLuG`8ne>SO2Wk~5^o6wYVGQkGK!LZ+QW}kM1pE_NWIEtJ0F*srF(#1Wt3;SJtU<< zhbk*TZ?e+srX(69mzJN%Ma_8}ku-!zMSz;dTgiOKgByAnd%r`BU={au8KNuWxvdNp zGb-0TA{DpHcP9cx9*0Woc@`x>brJ%gEbX==3vPQ-skvAlCC}0EhK59CPP78Oz$dNQ z;?B?*lt59OSMK^PrE`Bwbk`AUC_IG2&iAAb+6T)` z#eTdBk|0J8xY)`w3plMtD30hL$r3-=97`lI^E*G|kL})>K!}Yz#={DisqMrYU&*N{ zmqEH4$&(O;pu&z%0atxTP$Mv;p|Rx^;V4}V&Nc=!W`4)F{j-!N)WBzKMt?Ni4JLMd z3LRO*hvV&+sT;x|WcGg5lVmWrx^tHm7ApdzFwk;-twj*pOap z6$BejH^i)9gf1B^#1ZAxR$wR*i5j5wxi;wFx@B?3pb!ASEMF*dN_)c{EtoZz?pAaY z=U@><^eW}la<0g(VrLy9QhZwS8DwS-nn~vAFo-&;WBvMM!d~t>Esa1)%(;ou&|Q+V zvmuQ%;f=Y5y-Q4+UDHgVKsLV=s|s5+xGDTq=!iE@1bF0F9yUN*48 zj;?hWRRW~EXm&34NB6b_YDCqJzt z)y%v+Y}G#J-Oa#3k`q#|$0lK&)rg&c>>~}&gh6+Q@JXTZGZZcradUfcr+H2=gGxfs z3hKkGQw5D8A6DGpjpCt!ug*|)Hmi3cT55J5I|)-<_JkQjgQE`sTec(u%pF}y>zIi5 zu`{OBFSw3Ee=cilrU~1K@h#@!V}FZab3_PfG~ZW!Bd~yyp;t~67=3g~?tBNRpzuhN zwy@3e!KXM@XyHPzhYpzD|f*E(LZVH}@>qwJ!9q#(q6q zaqtpxFvPCiEB-LkZ)jR^y6EP!#MPMGTz`BlhBgx@JeyVJ!m1+Lx5q%zM z867!*7&j+37dt0EI~Si07rziEj}SLM2Z)PHfR|s;NCf!j*}rsdgdJd>zqQ@}PFaxa zZ_0lPiHTfU%Qpk`H&53Qwm~FbXo^7-29X2mb-`dP?c@ma$KA{>_X0poE{nyUJ1A`1HbO5{@H;3@3r$osrD6o@QO(`me2aT9ZB{MUpQ@=~8IQp9X2-A!Y!TzqK z_zMMUtUXJo<-(0jfZcG*7cAFRj)TP5*OP$&oJKlh$o_YtwOZN5YIcB)1D>E$WJfkT zfaE7b!s@*zJ%>Bu{Oyo%0QK`cehp=K1j0)j^Gn?BUxAx4qRH1#uXQFol0{T5s#zwis`8 z9;03NLRES`f=da=WyAO3`F5FhRz1V!CA`08M z^&6F|rRUo!w^t!=R375}R^@6<^0vzD)u|hmXRt}dZ~AhzR&`tD_R7VLN*mE{Rj$@C zZmZm$(%z_Sll)fYYJz)P<@UVjMrG&jmCEf|(v86H6Yh<`DE0qC`n~yjG`Qb|>6@>o e1;D}mCTMFYBg3A<%Y8bya8|JAIgjr0(|-X8DJ7i% literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/Sheets.xlsx b/ClosedXML.Examples/Examples/Modified/Sheets.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b7f9bbbfd3d41b2181d71a93fa0374bde9122394 GIT binary patch literal 6918 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/ShiftingFormulas.xlsx b/ClosedXML.Examples/Examples/Modified/ShiftingFormulas.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..22f52422488b62941804610d01202be4d7b1c16e GIT binary patch literal 7636 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/ShowCase.xlsx b/ClosedXML.Examples/Examples/Modified/ShowCase.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bf4035b9cec68e3cbfa7c396aba5e1798de5b0f0 GIT binary patch literal 8171 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 Ca)A8+ literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/SortExample.xlsx b/ClosedXML.Examples/Examples/Modified/SortExample.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d0db288221c007751f7307e9b9fed9efe93c9191 GIT binary patch literal 12583 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

_nN;oTp8%+nRJh=XG76fIwklowPWpG=NHD7MbY{ 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/StyleRowsColumns.xlsx b/ClosedXML.Examples/Examples/Modified/StyleRowsColumns.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8b300d03688f0248e86ca3cd9a7d4be950ae2cef GIT binary patch literal 6556 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 Ol)M*iBZDCT;Qs)#&9tHb literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/StyleWorksheet.xlsx b/ClosedXML.Examples/Examples/Modified/StyleWorksheet.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f834c59a5223c40c7f51121fbdcab5e9fb3c58bd GIT binary patch literal 6482 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/TabColors.xlsx b/ClosedXML.Examples/Examples/Modified/TabColors.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c2fe6dd74110c795c444fefaf0a3a0a2ff24b34c GIT binary patch literal 8042 zcmcIp2{e@L+aLSB@5we~XAENrV<%gdL9!Er31gYDRVsV-8e6t($-X8_wk%~UvSmq9 zh{zHWLf_zhU*+_E=YRg^`{tZy=FB|z^?R+a=p#ogUS)X&W|#z0xGU5t7!a!$^hl|QQh5!!K%DI_cCvAsKO zaV6V0GOfjPTI)ujx4F40C|!OkBjsI2d0hYVtFPI{12=k7gZg-lw4V_RB_c?lQhXbM zT8S{JHrFDJ%o@15q!oM#+*B7(FB+YdQHqsN<}V{}5bSG9XB?NzN&Kp>6u06hUCgh2 zsoaUzw_dskg+8VD>ABH_CmKLTjrJ8AvSdj`e*Z$eLaA@5syte{zS>E6PIw)7!>HnW zAwQ#LX*yN;Kx5W@946&u+gHV3!_BuY$gg;6bVPI8D8a-Twas2f(kWiAp9Px+A>3uU4}l5r<`Cg9y|rM`QGyZ_#Od zPgIWN7Omw?JcGZC3OF*V-zvqmbgV%SFEXrAZM@*FD3Ivk`)Wgrydu`HoIY?b6v7<| z1%gGzfShooy}JVf=>!FOqa8(LfQkz8Fu1E78oL7JjPO8lVnvWBD9{;=_K*dEQ1;Gn zH#?N5y9XSJz2oTa}#vS`Og?EY59Uzhpkn=K*(o$mf;&6Kj zX&D&_2~iJ}n}fZ_Up5z)5|^}tOG!zAAuie+Th#WhfQA(-VuW3~u-U z05vv6e@8O&5Y@X zd=)3}!Zq|Sa~Z>hU7bjxu3^^6fK^|B`ohnm2&FM1M$`*ivKd0sm=XgCP`?mCSjo47 z-E#I>Vqj1~-qpB=oANNh579XpA~&XWb-3-(NEBhj>dG+LRF7Vuh-9b9m_UT%BhE+B zydG|EL%9 z*1pR5Z!#&}H{NI3$nM4=gCY`N(&WSn!_2ANryh>&lHRZO)@6!kKD+7 z8&anz@&#Bwnz|o5;F&BAL%9eJXth@%`Uu{&$>nsYzK^b7TEGn)oT2(%T~31SN84C6 z(b!NsbFA)h$^5ky9hJ{l!#c=zPHMvG;;ive8NE~mddx-X@tS%-o4x&WLi~8C^A=1{ zSh>NXwn_eC4y(@8ZRY7wB9+FLW;dVtY^Hu@qxp;=b;BSfryK9;FSSOb7F&$DNym-3 z^ax>=RcQUAbV!8_>ypJ;qJs58sTS6CXJ)blsO*J;r7pb7De3VNndv8=PWk9TvYn~+ z9+J^Y?VaFQ5e%;X%8v29c;zoH1fDkK%3Yt;(4W6b!%M*J zuM)zTIO4j2v`#mY6<0-k$#{z#Ig9Q)pT`@(L|l@fF1^2SO`B$}sY}xSbMajNJTgRc z%hy#A@VmX*1{I?fvAso?5CEX~%e`oSSNM@%n@nCsz7?as$&h`0R4XelM5fm#%Fb>) z2}#=2vo&_fG$|U=H}T^tbo1UW=}6|XE2T)_pe1C(zjkxBMYY9P}UN>5e3t_(I+d=ZIa3_r(g-eA&-{9IzSn|1T ztvgy&iHdr3X|(%H=P5^SX(e6Mcxaf~GFCTfU#1-781!`HPUG6!c75V=#CSIiyMpMh zk3M#M*BWH~VUSVa&Y2KN*|vAM0jm`2R~wxOSC@h7_Ysg}eWJv#5icgU_962hrC-fK z&m+R!`^_#mrq|6S4HB7}r>$9THO}MKN1J=J$ZRaG=U4os_&w5uf=lAMu}$Ct9st06 z9BGF+iE@U+(I{+9!G3^`_K8Msk#EJw_ZgH|qndCUI14P$0znjGceB`@Iz7*E(rGc!~*(G%$f^GIEU+wwkA&tA7 z?q%h%y?BEPdH}68JdWhyZh^cC*VHlnX=6)UK)){@#wda-hJrHq^9RZwYg|cDD1$X!-x}&5%np4h@XfPcwK)Plxf>$V{-R98oe@`sxt> z`6r2ZtF+K}8QpX~Q-=!v(T??_kVwG9q6rUP`d!5XRY8;mUBIFf0eVr zCf5BvV|>d@8d_SFUxw4z)u9Rsuv<6xo1dPKw%*5&q*Tp)FM73FkZ`F_?wvbl*sti*LDTUEin z8Rv!1+X5bsk z{7&$X$=rpi*D2#0cq@vnhCL0pmL^%G2=r!g%k#hFp1C_IK`3?eoG6}hA)hLI^nmGX zhcb)X%Pc;pmOJMN7_JPpo2oX^SyN?b7BH=<<1;`B#PsrK7*jlTHI;xwX3^xbY691L zu&&2{z$ckPvM>Pc^~3Dvh-X|iyyx{M0U^B7UW?OaE<2!|nxL`1*k$6Wy?A|S1sS{# zmSH62s&J@sEj3@e8ES71{VZk+7kqBc0hnnr1<}HIBW=5JNM+`;!n$XG2dH0CpYbU5)!#O|5SM6A3hVKz z`8&w%QCX1VYctXGT@ufaPBycSK=O0MPn5j|lFUe+Rq|c`7(;(i@55p0bN!wA*V!!| z;2x)b=%;8?R(9Z9p2O51PPOlr#{1zHrsm@sRo6Q$QS96=(+`?V1e+y?DZi3>H*-LD zHm`BNp}$nSs7>ibzBm7+NRn>(T>YN1F=x(#{cWq`)Caa8g>89qTPn^mm|T%;GgZ&E zvnIpSab{XI!#9C4@Q`EuZ={k;6Rbr`o3u21-TmP}Ya|xPYvQ0Y5d1_4?f=71C63*% zDdH|Of-cxZKPzsqXtN=wUc)b5*p)ty|5|!LUWxnmI$PPnsZEC8ma0|n|6ckbr*nVh zb}2UZosIC1avy!1``FT-{%h_VZ|7Wq#l`7wX40lThZ$JuGJ5theN@*3jW)aaN->`?*3hli3;1^Q!a zKi`_Vbd|!4d`m@NFt+w*q`KaCwj*&i@5Xj*e^X?UlKzY5G5wB_INgm|QP=>u%E`aK z4bMgVB%^fYZgKC*;>&HRIxGMq?b7N^*Z^SDDPT$#4vKt$3)~&@30igDyJb z>5fc+&o^z6+$%*vbxJajOry4hE8;H9Dj(t`w0*}W8XMzv#E2hV3Jh+|QuIK@5(Yx4 zO1w>0T@JfwYoPVG z>8h%G!~4}Se8NPCoDhC{Z(7D1+CXK3XpP4Vb+NAOIph*^Uo-@6;;pfoiOyD-a}CiF z-Ye>9pngApg&05wFL4eT2J#wx!6}Ptugn_Ld}e{q^k@*QUlxn-)Vvn-qG+j+$^J6u z`A@SuwS4`VIq~!Qu^b9=H@Dlr=3eNeY60ao26DG(?yN8AAMCBGZgvipTPqxt1Sv6+ z+}vNuwYj-ljawMm#gwVIvpgQpWOHNhhjd);+FRVXsBIdG2({X7nu+=BnsPOKmM95K zG_I})?O8xI`FVrD(8i``CG=z5HB_sl{A77uOB+9unu!AM3z>&CvV<^tC8OTVOkbe$YGE`XLMbn|Q`4NSu~4%XY! zFidB;Ua0b&f6>l-`{o>RAcNs zY51J^%w2};+6q!_2Iyttey>JjYILSpEFm2bE-=8BUD_9cyuxod$5PSDm`%YD*{7Xd zD>kpbK$-as@9c}YYeW3}LGKeKx-Lg=)d`LUzje|0&c!KH6uW1oJTubO8v^D$lH5Vw-UsCvKXT$F^|wXWBR3^z!f81XN#*}e(1XyJ-ycXY^U%Jh8rn>P3WgGXiz^_ zQ}@a{Aiq3%srRjGb77H9+TdWJl297 znekK$eLY{^@UvexzWT~#bgSwW1Igl>Vz-)*4wWJ{;oy*$y6`x0L!?SBMIRKz+Os&6 zdJQ5ydCNF%!Yia3tu1c?#`q4MS1?sOiyzMoaYR+dDWfu~Z3jZM$F$Gnv-zQh*rlNj zlnG zmUJq74O#sLN+!W+gSd~kuc_kjk#dvM2j^SdCj{#%+PT2H?XpA8>0*NBiLPeuY8n(= z6QmCLQaC&~>VeW1a(F5a(?dM(rcd%*m*Wi&iP;3MI5WxcclBs5lHplWroYqQ2XBS{ z{A6U9D(9piHJd|AxfCgc#0_n-+qn2dW`;2RQaM9l%+@Ze2RTSn^OiDKew+Oci(kig zE;56g3n2+N_|9WEn}p-vFjwml(RrqhzJ=P)1$Gg%yqZC@&b$(g8~rx#<|prFMp?UF z*zx|gnRUhPEc)6UxGAxvVS8JF_gW#^%UWCM+ zLcyY75b&S1Xt-gMO~vKhFt`KM4|1F z_E?Jgza!xPmGM=Ocd$QFNY>s9Zij|DaAFmbMITY}f8Q~cP*pS504j)!iGxMNq(#6| z#$ah#F$r05X;HAGw4{vqd2@Nt->d(^IRSRVP81vw{~a;}{0s8mKnn6l#Px}TeqoG} z*jbW(oIRsDHi!nXn})*;gN3R)63f1$Z4M_5D67NG;;RG;Jryu@SgqHfDau^QKKjG6 z;N2pgr-6?$+7SyP%eO0}I4m(19{hwcU_liiD5F|p=?LAjTcevvK@W`YM0n#QvB~s3k-$L@(e;QswZ6K&F3U+ znyNQw<@PJ_EN#_jcX6JZyyE@%;T%QMgqin~LW|rpy!O=^S`Vu)`|Xp!!fPZ+(FUjs zBJ!R1uz5;A#@snCz8FP;wvRfFxM{w@&C8KSPKDhW5j%2fFZGJIrSFiEEZ*l&d;LuA zQ|yW$3&n^UZ)0LCJwZl$h~Q&Rx8_x|wuu(PeT(hE$jNT}U3NNX>PxDC6prd!kRTy4 zB3}cwTPliS5Fs|Rgx87{QKbiE8ibu!W;ZWKr|&1zJfxzNnmOpt?Q)IC*?XO9YM_II zOMl4g{>uyxYx-Yar)DrG!hfDsok*HsUHQx8>O}C*^MMn=Ggun;^t9l#^l66rMEVUj zdj7;$pGG)M8lND9VrfwkV+hgv-?dYT2t&hz@J;v2>>3Jh5SEnP$!Qk2K=dzojhI_JD&JMSu@Zfz{cDm8BYPgVCj-J J?2!oo_#dhA4krKr literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/TransposeRanges.xlsx b/ClosedXML.Examples/Examples/Modified/TransposeRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3de344db407824bdeae61782ce35f6fb10e04be6 GIT binary patch literal 7199 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 z z>)X+(NBI97Rvu-smeqs+KpiUpK=*4{VQ`y81nB4a=ZIP})p280W%?nQ-C*c3p|52p1f>$nO1wVf=G+#HkWx{AWEy(Oc0L9SU^I)GvzhQ5O#ERnGAf zgD(NKF^^yFN#}WPX$fW96a>{=mKIMpe4St;>cphyF{oTp#8U}q$bfRD5OmTG*2^npwAi<*s%aR5MIwqq*=OSw7VY#BU zyE@kTnlBn0mEG!Q*T)Em62;{N30k@zJ$^?Uc!e-h?FFzV%K2Q@S+PZ|+Qk6;FRZ4* z3#De9L$pM(1zmO2vr9H406N5T`;cL-3x?P;#nCNg8Dknv<^+s6gJ8YlC56-6YQ=m&<@H#9w`ALFi~S|{Ttf7Y?O`90|sabU8b+1+~P5C+sk z^t<`2shme@7R@<63&tIcn_S5A^DPEn51;WY2e1ITe?KxjLqIL77RMT{(e$Wgd{4yKyN4RO-Op zJVIg?9<0?ivaGYz zh_!2FDAiY7YU;L8^aLuT6Qd=69USL1B%@%g!bT9!EpCf0i@t(>Tw(n-L~BfoC70bB zJ#L?in=JcaK-0@XD!$-z_mOePwJedfrtq65ObV4&jc(vn#mWUnG z_ciqMdG5K5+Jq7+|88UcUS z`Cp9D@{n9|0>=W5k88L(|Njn-{&P}!OtX$L+AqBJ3suU(VSlkjqzB6RC!2)BKnQ2t zT;z&d;DLp~Ag;gKVh|{o6TJC%gP&LaYUz!3_)FHy%S+fx?58jec7j1BI@*Rmxu}qX zD;fiJg(3dX|I6Y(#iswt=@jJQu%8ae!cYh(1_9^5IV6ku2~z*OVl1YtVx-2UASxmX z77~#X0!tc!rDR3KWJM)~MMT6z!IBbY@}NIk|Dkgt?1JOKwhsTDvXtcCl>Zb`kpGDr zPdeytoX-`9_h}NENMvwHB!%M!#|s8?Wj9wGGsRdP^I`PO<0W`eg3d8V2`!=ZiLj}@ zM6IM#2dL5~6}BFae^YR@kdp9=qgbbA1yN^RuKU`NlCskfN!O^*sBODCR|urXT$HrA zq@ERIALrrzHtfm7zClk;e7g?O^BQp*ZrLpVXY{F*L24*zRLYTMt zc3CNfo|J2(VuX6AlcM6~j?r}S-dD=*wXByjBQDn-49NJ|iMyK>WgX(>8&1mNOQt9w zBU&vkn_~g|-ZCo86%ls9rTa;yP4lxE>u$WY=)C4W!~tn6*d+dl7@U9kF}WSN%x=@v zrYX=aGj&zTOSUxYgG^5?EzqeOW=Cp%#DH~s?^IGcM2N)){;=17vM-|Oa9&)Am5R?x zBN zqMr)?g6~f2oTghRI)%i)Jo$@toi;ta**q~dKKs-3w_DHCDyP@hCo09b2V=NUoL*_4 x2>iZip9mxY{|6=fO&H{o!rCiC&P{{zd<4jTXf literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/TransposeRangesPlus.xlsx b/ClosedXML.Examples/Examples/Modified/TransposeRangesPlus.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..70e0162f9918a5c8210a9d562f4b516ee67021f2 GIT binary patch literal 6943 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/TwoPages.xlsx b/ClosedXML.Examples/Examples/Modified/TwoPages.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fb97e3a95eb8f07daba7ba60bb247b3ac42eb576 GIT binary patch literal 11635 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/UsingPhonetics.xlsx b/ClosedXML.Examples/Examples/Modified/UsingPhonetics.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7d0c0d6d06fe349c16a0b377330b23bb7f73fdcc GIT binary patch literal 6414 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 Yu<Z);Jopm26 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 NR{T*`obB-2{{RD-^!@+< literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/UsingTables.xlsx b/ClosedXML.Examples/Examples/Modified/UsingTables.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a6ca79c2450327a16a54cb12b409d5e978193304 GIT binary patch literal 9299 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/styleBorder.xlsx b/ClosedXML.Examples/Examples/Modified/styleBorder.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e9bd318e748fc683c842e35056a56817e6f848d2 GIT binary patch literal 6614 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 KuK?cNZ~q4)X2v-H literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/styleFill.xlsx b/ClosedXML.Examples/Examples/Modified/styleFill.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..91f9a5cf5efa8ce28d5ea1a0971ff22b5583e136 GIT binary patch literal 6414 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 literal 0 HcmV?d00001 diff --git a/ClosedXML.Examples/Examples/Modified/styleIncludeQuotePrefix.xlsx b/ClosedXML.Examples/Examples/Modified/styleIncludeQuotePrefix.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c9ea419d1e387fda9b3d74b5f7cc196ad282c943 GIT binary patch literal 7063 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 return null; + return mi.GetAttributes().First(); + } + + internal static String GetHeader(MemberInfo mi) + { + var attribute = GetXLColumnAttribute(mi); + if (attribute == null) return null; + return String.IsNullOrWhiteSpace(attribute.Header) ? null : attribute.Header; + } + + internal static Int32 GetOrder(MemberInfo mi) + { + var attribute = GetXLColumnAttribute(mi); + if (attribute == null) return Int32.MaxValue; + return attribute.Order; + } + + internal static Boolean IgnoreMember(MemberInfo mi) + { + var attribute = GetXLColumnAttribute(mi); + if (attribute == null) return false; + return attribute.Ignore; + } + } +} diff --git a/ClosedXML/ClosedXML.csproj b/ClosedXML/ClosedXML.csproj new file mode 100644 index 0000000..6257de1 --- /dev/null +++ b/ClosedXML/ClosedXML.csproj @@ -0,0 +1,91 @@ + + + + netstandard2.0;net40;net46 + 8.0 + ClosedXML + ClosedXML + 0.95.4 + Francois Botha, Aleksei Pankratev, Manuel de Leon, Amir Ghezelbash + Francois Botha, Aleksei Pankratev + + ClosedXML + See https://github.com/ClosedXML/ClosedXML/releases/tag/$(productVersion) + ClosedXML is a .NET library for reading, manipulating and writing Excel 2007+ (.xlsx, .xlsm) files. It aims to provide an intuitive and user-friendly interface to dealing with the underlying OpenXML API. + MIT + https://github.com/ClosedXML/ClosedXML + true + nuget-logo.png + https://raw.githubusercontent.com/ClosedXML/ClosedXML/develop/resources/logo/nuget-logo.png + true + $(NoWarn);NU1605;CS1591 + true + Debug;Release;Release.Signed + MIT + + + + ClosedXML.Signed + bin\Release.Signed\ + true + true + true + ClosedXML.snk + $(DefineConstants);RELEASE;STRONGNAME + + + + true + true + + + + $(DefineConstants);_NETSTANDARD_;_NETSTANDARD2_0_ + + + + $(DefineConstants);_NETFRAMEWORK_;_NET40_ + + + + $(DefineConstants);_NETFRAMEWORK_;_NET46_ + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ClosedXML/ClosedXML.nuspec b/ClosedXML/ClosedXML.nuspec new file mode 100644 index 0000000..f065911 --- /dev/null +++ b/ClosedXML/ClosedXML.nuspec @@ -0,0 +1,27 @@ + + + + $id$ + $version$ + $title$ + $author$ + $author$ + ClosedXML is a .NET library for reading, manipulating and writing Excel 2007+ (.xlsx, .xlsm) files. It aims to provide an intuitive and user-friendly interface to dealing with the underlying OpenXML API. + https://github.com/ClosedXML/ClosedXML/blob/master/LICENSE + https://github.com/ClosedXML/ClosedXML + false + @ClosedXML + ClosedXML + + + + + + + + + + + + + \ No newline at end of file diff --git a/ClosedXML/ClosedXML.snk b/ClosedXML/ClosedXML.snk new file mode 100644 index 0000000000000000000000000000000000000000..a17cff7ca6e08736fb1cb34fe2fb78dd2538bb8d GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097@`-`QKXZ~|dWD<<0Ju<{xxS3REG#fD>`kXX+v-y54cP=LhCw--* z#ZH~Hg>y#!*B8(sJ8X4@N8kwu@1XxOgH)#^X_Wc~ya61EV6&GsN?8#3zn5H*G18Aq zlPH)t7tXS}26fm?71YYx22fe0j=RjE)u?dKA#_Fyb*JK(Tq!Qy>IPo!%Ecrqzk+3~ zYEDo>0Ipgys{O_Sc)Xnd$i}z{gSf-B1h$a#;gE?it@uU=^9BT)|8MtGtqt%QwRx&G z-EO;UfkchjGeaQ9%2A3jD|v}+JI&)a;)OTvU(a&r(`cpWs~*kTOHVP;=NopJhJ2heC!9#ijkT>4 zCmWC4_A*kD HiddenRows { get; } + Boolean IsEnabled { get; set; } + IXLRange Range { get; set; } + Int32 SortColumn { get; set; } + Boolean Sorted { get; set; } + XLSortOrder SortOrder { get; set; } + IEnumerable VisibleRows { get; } + + IXLAutoFilter Clear(); + + IXLFilterColumn Column(String column); + + IXLFilterColumn Column(Int32 column); + + IXLAutoFilter Reapply(); + + IXLAutoFilter Sort(Int32 columnToSortBy = 1, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + } +} diff --git a/ClosedXML/Excel/AutoFilters/IXLCustomFilteredColumn.cs b/ClosedXML/Excel/AutoFilters/IXLCustomFilteredColumn.cs new file mode 100644 index 0000000..37c6a17 --- /dev/null +++ b/ClosedXML/Excel/AutoFilters/IXLCustomFilteredColumn.cs @@ -0,0 +1,19 @@ +using System; +namespace ClosedXML.Excel +{ + public interface IXLCustomFilteredColumn + { + void EqualTo(T value) where T : IComparable; + void NotEqualTo(T value) where T : IComparable; + void GreaterThan(T value) where T : IComparable; + void LessThan(T value) where T : IComparable; + void EqualOrGreaterThan(T value) where T : IComparable; + void EqualOrLessThan(T value) where T : IComparable; + void BeginsWith(String value); + void NotBeginsWith(String value); + void EndsWith(String value); + void NotEndsWith(String value); + void Contains(String value); + void NotContains(String value); + } +} \ No newline at end of file diff --git a/ClosedXML/Excel/AutoFilters/IXLFilterColumn.cs b/ClosedXML/Excel/AutoFilters/IXLFilterColumn.cs new file mode 100644 index 0000000..106f485 --- /dev/null +++ b/ClosedXML/Excel/AutoFilters/IXLFilterColumn.cs @@ -0,0 +1,72 @@ +using System; + +namespace ClosedXML.Excel +{ + public enum XLTopBottomType { Items, Percent } + + public enum XLDateTimeGrouping { Year, Month, Day, Hour, Minute, Second } + + public interface IXLFilterColumn + { + void Clear(); + + IXLFilteredColumn AddFilter(T value) where T : IComparable; + + IXLDateTimeGroupFilteredColumn AddDateGroupFilter(DateTime date, XLDateTimeGrouping dateTimeGrouping); + + void Top(Int32 value, XLTopBottomType type = XLTopBottomType.Items); + + void Bottom(Int32 value, XLTopBottomType type = XLTopBottomType.Items); + + void AboveAverage(); + + void BelowAverage(); + + IXLFilterConnector EqualTo(T value) where T : IComparable; + + IXLFilterConnector NotEqualTo(T value) where T : IComparable; + + IXLFilterConnector GreaterThan(T value) where T : IComparable; + + IXLFilterConnector LessThan(T value) where T : IComparable; + + IXLFilterConnector EqualOrGreaterThan(T value) where T : IComparable; + + IXLFilterConnector EqualOrLessThan(T value) where T : IComparable; + + void Between(T minValue, T maxValue) where T : IComparable; + + void NotBetween(T minValue, T maxValue) where T : IComparable; + + IXLFilterConnector BeginsWith(String value); + + IXLFilterConnector NotBeginsWith(String value); + + IXLFilterConnector EndsWith(String value); + + IXLFilterConnector NotEndsWith(String value); + + IXLFilterConnector Contains(String value); + + IXLFilterConnector NotContains(String value); + + XLFilterType FilterType { get; set; } + Int32 TopBottomValue { get; set; } + XLTopBottomType TopBottomType { get; set; } + XLTopBottomPart TopBottomPart { get; set; } + XLFilterDynamicType DynamicType { get; set; } + Double DynamicValue { get; set; } + + IXLFilterColumn SetFilterType(XLFilterType value); + + IXLFilterColumn SetTopBottomValue(Int32 value); + + IXLFilterColumn SetTopBottomType(XLTopBottomType value); + + IXLFilterColumn SetTopBottomPart(XLTopBottomPart value); + + IXLFilterColumn SetDynamicType(XLFilterDynamicType value); + + IXLFilterColumn SetDynamicValue(Double value); + } +} diff --git a/ClosedXML/Excel/AutoFilters/IXLFilterConnector.cs b/ClosedXML/Excel/AutoFilters/IXLFilterConnector.cs new file mode 100644 index 0000000..d5d52be --- /dev/null +++ b/ClosedXML/Excel/AutoFilters/IXLFilterConnector.cs @@ -0,0 +1,10 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLFilterConnector + { + IXLCustomFilteredColumn And { get; } + IXLCustomFilteredColumn Or { get; } + } +} diff --git a/ClosedXML/Excel/AutoFilters/IXLFilteredColumn.cs b/ClosedXML/Excel/AutoFilters/IXLFilteredColumn.cs new file mode 100644 index 0000000..86db9db --- /dev/null +++ b/ClosedXML/Excel/AutoFilters/IXLFilteredColumn.cs @@ -0,0 +1,8 @@ +using System; +namespace ClosedXML.Excel +{ + public interface IXLFilteredColumn + { + IXLFilteredColumn AddFilter(T value) where T : IComparable; + } +} \ No newline at end of file diff --git a/ClosedXML/Excel/AutoFilters/XLAutoFilter.cs b/ClosedXML/Excel/AutoFilters/XLAutoFilter.cs new file mode 100644 index 0000000..35a51cf --- /dev/null +++ b/ClosedXML/Excel/AutoFilters/XLAutoFilter.cs @@ -0,0 +1,179 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections.Generic; + + internal class XLAutoFilter : IXLAutoFilter + { + private readonly Dictionary _columns = new Dictionary(); + + public XLAutoFilter() + { + Filters = new Dictionary>(); + } + + public Dictionary> Filters { get; private set; } + + #region IXLAutoFilter Members + + [Obsolete("Use IsEnabled")] + public Boolean Enabled { get => IsEnabled; set => IsEnabled = value; } + public IEnumerable HiddenRows { get => Range.Rows(r => r.WorksheetRow().IsHidden); } + public Boolean IsEnabled { get; set; } + public IXLRange Range { get; set; } + public Int32 SortColumn { get; set; } + public Boolean Sorted { get; set; } + public XLSortOrder SortOrder { get; set; } + public IEnumerable VisibleRows { get => Range.Rows(r => !r.WorksheetRow().IsHidden); } + + IXLAutoFilter IXLAutoFilter.Clear() + { + return Clear(); + } + + public IXLFilterColumn Column(String column) + { + var columnNumber = XLHelper.GetColumnNumberFromLetter(column); + if (columnNumber < 1 || columnNumber > XLHelper.MaxColumnNumber) + throw new ArgumentOutOfRangeException(nameof(column), "Column '" + column + "' is outside the allowed column range."); + + return Column(columnNumber); + } + + public IXLFilterColumn Column(Int32 column) + { + if (column < 1 || column > XLHelper.MaxColumnNumber) + throw new ArgumentOutOfRangeException(nameof(column), "Column " + column + " is outside the allowed column range."); + + if (!_columns.TryGetValue(column, out XLFilterColumn filterColumn)) + { + filterColumn = new XLFilterColumn(this, column); + _columns.Add(column, filterColumn); + } + + return filterColumn; + } + + public IXLAutoFilter Reapply() + { + var ws = Range.Worksheet as XLWorksheet; + ws.SuspendEvents(); + + // Recalculate shown / hidden rows + var rows = Range.Rows(2, Range.RowCount()); + rows.ForEach(row => + row.WorksheetRow().Unhide() + ); + + foreach (IXLRangeRow row in rows) + { + var rowMatch = true; + + foreach (var columnIndex in Filters.Keys) + { + var columnFilters = Filters[columnIndex]; + + var columnFilterMatch = true; + + // If the first filter is an 'Or', we need to fudge the initial condition + if (columnFilters.Count > 0 && columnFilters.First().Connector == XLConnector.Or) + { + columnFilterMatch = false; + } + + foreach (var filter in columnFilters) + { + var condition = filter.Condition; + var isText = filter.Value is String; + var isDateTime = filter.Value is DateTime; + + Boolean filterMatch; + + if (isText) + filterMatch = condition(row.Cell(columnIndex).GetFormattedString()); + else if (isDateTime) + filterMatch = row.Cell(columnIndex).DataType == XLDataType.DateTime && + condition(row.Cell(columnIndex).GetDateTime()); + else + filterMatch = row.Cell(columnIndex).DataType == XLDataType.Number && + condition(row.Cell(columnIndex).GetDouble()); + + if (filter.Connector == XLConnector.And) + { + columnFilterMatch &= filterMatch; + if (!columnFilterMatch) break; + } + else + { + columnFilterMatch |= filterMatch; + if (columnFilterMatch) break; + } + } + + rowMatch &= columnFilterMatch; + + if (!rowMatch) break; + } + + if (!rowMatch) row.WorksheetRow().Hide(); + } + + ws.ResumeEvents(); + return this; + } + + IXLAutoFilter IXLAutoFilter.Sort(Int32 columnToSortBy, XLSortOrder sortOrder, Boolean matchCase, + Boolean ignoreBlanks) + { + return Sort(columnToSortBy, sortOrder, matchCase, ignoreBlanks); + } + + #endregion IXLAutoFilter Members + + public XLAutoFilter Clear() + { + if (!IsEnabled) return this; + + IsEnabled = false; + Filters.Clear(); + foreach (IXLRangeRow row in Range.Rows().Where(r => r.RowNumber() > 1)) + row.WorksheetRow().Unhide(); + return this; + } + + public XLAutoFilter Set(IXLRangeBase range) + { + var firstOverlappingTable = range.Worksheet.Tables.FirstOrDefault(t => t.RangeUsed().Intersects(range)); + if (firstOverlappingTable != null) + throw new InvalidOperationException($"The range {range.RangeAddress.ToStringRelative(includeSheet: true)} is already part of table '{firstOverlappingTable.Name}'"); + + Range = range.AsRange(); + IsEnabled = true; + return this; + } + + public XLAutoFilter Sort(Int32 columnToSortBy, XLSortOrder sortOrder, Boolean matchCase, Boolean ignoreBlanks) + { + if (!IsEnabled) + throw new InvalidOperationException("Filter has not been enabled."); + + var ws = Range.Worksheet as XLWorksheet; + ws.SuspendEvents(); + Range.Range(Range.FirstCell().CellBelow(), Range.LastCell()).Sort(columnToSortBy, sortOrder, matchCase, + ignoreBlanks); + + Sorted = true; + SortOrder = sortOrder; + SortColumn = columnToSortBy; + + ws.ResumeEvents(); + + Reapply(); + + return this; + } + } +} diff --git a/ClosedXML/Excel/AutoFilters/XLCustomFilteredColumn.cs b/ClosedXML/Excel/AutoFilters/XLCustomFilteredColumn.cs new file mode 100644 index 0000000..4c6bd52 --- /dev/null +++ b/ClosedXML/Excel/AutoFilters/XLCustomFilteredColumn.cs @@ -0,0 +1,141 @@ +using System; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLCustomFilteredColumn : IXLCustomFilteredColumn + { + private readonly XLAutoFilter _autoFilter; + private readonly Int32 _column; + private readonly XLConnector _connector; + + public XLCustomFilteredColumn(XLAutoFilter autoFilter, Int32 column, XLConnector connector) + { + _autoFilter = autoFilter; + _column = column; + _connector = connector; + } + + #region IXLCustomFilteredColumn Members + + public void EqualTo(T value) where T: IComparable + { + if (typeof(T) == typeof(String)) + { + ApplyCustomFilter(value, XLFilterOperator.Equal, + v => + v.ToString().Equals(value.ToString(), StringComparison.InvariantCultureIgnoreCase)); + } + else + { + ApplyCustomFilter(value, XLFilterOperator.Equal, + v => v.CastTo().CompareTo(value) == 0); + } + } + + public void NotEqualTo(T value) where T: IComparable + { + if (typeof(T) == typeof(String)) + { + ApplyCustomFilter(value, XLFilterOperator.NotEqual, + v => + !v.ToString().Equals(value.ToString(), StringComparison.InvariantCultureIgnoreCase)); + } + else + { + ApplyCustomFilter(value, XLFilterOperator.NotEqual, + v => v.CastTo().CompareTo(value) != 0); + } + } + + public void GreaterThan(T value) where T: IComparable + { + ApplyCustomFilter(value, XLFilterOperator.GreaterThan, + v => v.CastTo().CompareTo(value) > 0); + } + + public void LessThan(T value) where T: IComparable + { + ApplyCustomFilter(value, XLFilterOperator.LessThan, v => v.CastTo().CompareTo(value) < 0); + } + + public void EqualOrGreaterThan(T value) where T: IComparable + { + ApplyCustomFilter(value, XLFilterOperator.EqualOrGreaterThan, + v => v.CastTo().CompareTo(value) >= 0); + } + + public void EqualOrLessThan(T value) where T: IComparable + { + ApplyCustomFilter(value, XLFilterOperator.EqualOrLessThan, + v => v.CastTo().CompareTo(value) <= 0); + } + + public void BeginsWith(String value) + { + ApplyCustomFilter(value + "*", XLFilterOperator.Equal, + s => ((string)s).StartsWith(value, StringComparison.InvariantCultureIgnoreCase)); + } + + public void NotBeginsWith(String value) + { + ApplyCustomFilter(value + "*", XLFilterOperator.NotEqual, + s => + !((string)s).StartsWith(value, StringComparison.InvariantCultureIgnoreCase)); + } + + public void EndsWith(String value) + { + ApplyCustomFilter("*" + value, XLFilterOperator.Equal, + s => ((string)s).EndsWith(value, StringComparison.InvariantCultureIgnoreCase)); + } + + public void NotEndsWith(String value) + { + ApplyCustomFilter("*" + value, XLFilterOperator.NotEqual, + s => !((string)s).EndsWith(value, StringComparison.InvariantCultureIgnoreCase)); + } + + public void Contains(String value) + { + ApplyCustomFilter("*" + value + "*", XLFilterOperator.Equal, + s => ((string)s).ToLower().Contains(value.ToLower())); + } + + public void NotContains(String value) + { + ApplyCustomFilter("*" + value + "*", XLFilterOperator.Equal, + s => !((string)s).ToLower().Contains(value.ToLower())); + } + + #endregion + + private void ApplyCustomFilter(T value, XLFilterOperator op, Func condition) + where T : IComparable + { + _autoFilter.Filters[_column].Add(new XLFilter + { + Value = value, + Operator = op, + Connector = _connector, + Condition = condition + }); + var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount()); + foreach (IXLRangeRow row in rows) + { + if (_connector == XLConnector.And) + { + if (!row.WorksheetRow().IsHidden) + { + if (condition(row.Cell(_column).GetValue())) + row.WorksheetRow().Unhide(); + else + row.WorksheetRow().Hide(); + } + } + else if (condition(row.Cell(_column).GetValue())) + row.WorksheetRow().Unhide(); + } + } + } +} diff --git a/ClosedXML/Excel/AutoFilters/XLDateTimeGroupFilteredColumn.cs b/ClosedXML/Excel/AutoFilters/XLDateTimeGroupFilteredColumn.cs new file mode 100644 index 0000000..981532a --- /dev/null +++ b/ClosedXML/Excel/AutoFilters/XLDateTimeGroupFilteredColumn.cs @@ -0,0 +1,57 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLDateTimeGroupFilteredColumn + { + IXLDateTimeGroupFilteredColumn AddDateGroupFilter(DateTime date, XLDateTimeGrouping dateTimeGrouping); + } + + internal class XLDateTimeGroupFilteredColumn : IXLDateTimeGroupFilteredColumn + { + private readonly XLAutoFilter _autoFilter; + private readonly Int32 _column; + + public XLDateTimeGroupFilteredColumn(XLAutoFilter autoFilter, Int32 column) + { + _autoFilter = autoFilter; + _column = column; + } + + public IXLDateTimeGroupFilteredColumn AddDateGroupFilter(DateTime date, XLDateTimeGrouping dateTimeGrouping) + { + Func condition = date2 => IsMatch(date, (DateTime) date2, dateTimeGrouping); + + _autoFilter.Filters[_column].Add(new XLFilter + { + Value = date, + Condition = condition, + Operator = XLFilterOperator.Equal, + Connector = XLConnector.Or, + DateTimeGrouping = dateTimeGrouping + }); + + var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount()); + foreach (IXLRangeRow row in rows) + { + if (row.Cell(_column).DataType == XLDataType.DateTime && condition(row.Cell(_column).GetDateTime())) + row.WorksheetRow().Unhide(); + } + + return this; + } + + internal static Boolean IsMatch(DateTime date1, DateTime date2, XLDateTimeGrouping dateTimeGrouping) + { + Boolean isMatch = true; + if (isMatch && dateTimeGrouping >= XLDateTimeGrouping.Year) isMatch &= date1.Year.Equals(date2.Year); + if (isMatch && dateTimeGrouping >= XLDateTimeGrouping.Month) isMatch &= date1.Month.Equals(date2.Month); + if (isMatch && dateTimeGrouping >= XLDateTimeGrouping.Day) isMatch &= date1.Day.Equals(date2.Day); + if (isMatch && dateTimeGrouping >= XLDateTimeGrouping.Hour) isMatch &= date1.Hour.Equals(date2.Hour); + if (isMatch && dateTimeGrouping >= XLDateTimeGrouping.Minute) isMatch &= date1.Minute.Equals(date2.Minute); + if (isMatch && dateTimeGrouping >= XLDateTimeGrouping.Second) isMatch &= date1.Second.Equals(date2.Second); + + return isMatch; + } + } +} diff --git a/ClosedXML/Excel/AutoFilters/XLFilter.cs b/ClosedXML/Excel/AutoFilters/XLFilter.cs new file mode 100644 index 0000000..42ac112 --- /dev/null +++ b/ClosedXML/Excel/AutoFilters/XLFilter.cs @@ -0,0 +1,23 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + internal enum XLConnector { And, Or } + + internal enum XLFilterOperator { Equal, NotEqual, GreaterThan, LessThan, EqualOrGreaterThan, EqualOrLessThan } + + internal class XLFilter + { + public XLFilter(XLFilterOperator op = XLFilterOperator.Equal) + { + Operator = op; + } + + public Func Condition { get; set; } + public XLConnector Connector { get; set; } + public XLDateTimeGrouping DateTimeGrouping { get; set; } + public XLFilterOperator Operator { get; set; } + public Object Value { get; set; } + } +} diff --git a/ClosedXML/Excel/AutoFilters/XLFilterColumn.cs b/ClosedXML/Excel/AutoFilters/XLFilterColumn.cs new file mode 100644 index 0000000..3217cf7 --- /dev/null +++ b/ClosedXML/Excel/AutoFilters/XLFilterColumn.cs @@ -0,0 +1,432 @@ +using System; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections.Generic; + + internal class XLFilterColumn : IXLFilterColumn + { + private readonly XLAutoFilter _autoFilter; + private readonly Int32 _column; + + public XLFilterColumn(XLAutoFilter autoFilter, Int32 column) + { + _autoFilter = autoFilter; + _column = column; + } + + #region IXLFilterColumn Members + + public void Clear() + { + if (_autoFilter.Filters.ContainsKey(_column)) + _autoFilter.Filters.Remove(_column); + } + + public IXLFilteredColumn AddFilter(T value) where T : IComparable + { + if (typeof(T) == typeof(String)) + { + ApplyCustomFilter(value, XLFilterOperator.Equal, + v => + v.ToString().Equals(value.ToString(), StringComparison.InvariantCultureIgnoreCase), + XLFilterType.Regular); + } + else + { + ApplyCustomFilter(value, XLFilterOperator.Equal, + v => v.CastTo().CompareTo(value) == 0, XLFilterType.Regular); + } + return new XLFilteredColumn(_autoFilter, _column); + } + + public IXLDateTimeGroupFilteredColumn AddDateGroupFilter(DateTime date, XLDateTimeGrouping dateTimeGrouping) + { + Func condition = date2 => XLDateTimeGroupFilteredColumn.IsMatch(date, (DateTime)date2, dateTimeGrouping); + + _autoFilter.IsEnabled = true; + + if (_autoFilter.Filters.TryGetValue(_column, out List filterList)) + filterList.Add( + new XLFilter + { + Value = date, + Operator = XLFilterOperator.Equal, + Connector = XLConnector.Or, + Condition = condition, + DateTimeGrouping = dateTimeGrouping + } + ); + else + { + _autoFilter.Filters.Add( + _column, + new List + { + new XLFilter + { + Value = date, + Operator = XLFilterOperator.Equal, + Connector = XLConnector.Or, + Condition = condition, + DateTimeGrouping = dateTimeGrouping + } + } + ); + } + + _autoFilter.Column(_column).FilterType = XLFilterType.DateTimeGrouping; + + var ws = _autoFilter.Range.Worksheet as XLWorksheet; + ws.SuspendEvents(); + + var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount()); + + foreach (IXLRangeRow row in rows) + { + if (row.Cell(_column).DataType == XLDataType.DateTime && condition(row.Cell(_column).GetDateTime())) + row.WorksheetRow().Unhide(); + else + row.WorksheetRow().Hide(); + } + ws.ResumeEvents(); + + return new XLDateTimeGroupFilteredColumn(_autoFilter, _column); + } + + public void Top(Int32 value, XLTopBottomType type = XLTopBottomType.Items) + { + _autoFilter.Column(_column).TopBottomPart = XLTopBottomPart.Top; + SetTopBottom(value, type); + } + + public void Bottom(Int32 value, XLTopBottomType type = XLTopBottomType.Items) + { + _autoFilter.Column(_column).TopBottomPart = XLTopBottomPart.Bottom; + SetTopBottom(value, type, false); + } + + public void AboveAverage() + { + ShowAverage(true); + } + + public void BelowAverage() + { + ShowAverage(false); + } + + public IXLFilterConnector EqualTo(T value) where T : IComparable + { + if (typeof(T) == typeof(String)) + { + return ApplyCustomFilter(value, XLFilterOperator.Equal, + v => + v.ToString().Equals(value.ToString(), + StringComparison.InvariantCultureIgnoreCase)); + } + + return ApplyCustomFilter(value, XLFilterOperator.Equal, + v => v.CastTo().CompareTo(value) == 0); + } + + public IXLFilterConnector NotEqualTo(T value) where T : IComparable + { + if (typeof(T) == typeof(String)) + { + return ApplyCustomFilter(value, XLFilterOperator.NotEqual, + v => + !v.ToString().Equals(value.ToString(), + StringComparison.InvariantCultureIgnoreCase)); + } + + return ApplyCustomFilter(value, XLFilterOperator.NotEqual, + v => v.CastTo().CompareTo(value) != 0); + } + + public IXLFilterConnector GreaterThan(T value) where T : IComparable + { + return ApplyCustomFilter(value, XLFilterOperator.GreaterThan, + v => v.CastTo().CompareTo(value) > 0); + } + + public IXLFilterConnector LessThan(T value) where T : IComparable + { + return ApplyCustomFilter(value, XLFilterOperator.LessThan, + v => v.CastTo().CompareTo(value) < 0); + } + + public IXLFilterConnector EqualOrGreaterThan(T value) where T : IComparable + { + return ApplyCustomFilter(value, XLFilterOperator.EqualOrGreaterThan, + v => v.CastTo().CompareTo(value) >= 0); + } + + public IXLFilterConnector EqualOrLessThan(T value) where T : IComparable + { + return ApplyCustomFilter(value, XLFilterOperator.EqualOrLessThan, + v => v.CastTo().CompareTo(value) <= 0); + } + + public void Between(T minValue, T maxValue) where T : IComparable + { + EqualOrGreaterThan(minValue).And.EqualOrLessThan(maxValue); + } + + public void NotBetween(T minValue, T maxValue) where T : IComparable + { + LessThan(minValue).Or.GreaterThan(maxValue); + } + + public static Func BeginsWithFunction { get; } = (value, input) => ((string)input).StartsWith(value, StringComparison.InvariantCultureIgnoreCase); + + public IXLFilterConnector BeginsWith(String value) + { + return ApplyCustomFilter(value + "*", XLFilterOperator.Equal, s => BeginsWithFunction(value, s)); + } + + public IXLFilterConnector NotBeginsWith(String value) + { + return ApplyCustomFilter(value + "*", XLFilterOperator.NotEqual, s => !BeginsWithFunction(value, s)); + } + + public static Func EndsWithFunction { get; } = (value, input) => ((string)input).EndsWith(value, StringComparison.InvariantCultureIgnoreCase); + + public IXLFilterConnector EndsWith(String value) + { + return ApplyCustomFilter("*" + value, XLFilterOperator.Equal, s => EndsWithFunction(value, s)); + } + + public IXLFilterConnector NotEndsWith(String value) + { + return ApplyCustomFilter("*" + value, XLFilterOperator.NotEqual, s => !EndsWithFunction(value, s)); + } + + public static Func ContainsFunction { get; } = (value, input) => ((string)input).IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0; + + public IXLFilterConnector Contains(String value) + { + return ApplyCustomFilter("*" + value + "*", XLFilterOperator.Equal, s => ContainsFunction(value, s)); + } + + public IXLFilterConnector NotContains(String value) + { + return ApplyCustomFilter("*" + value + "*", XLFilterOperator.Equal, s => !ContainsFunction(value, s)); + } + + public XLFilterType FilterType { get; set; } + + public Int32 TopBottomValue { get; set; } + public XLTopBottomType TopBottomType { get; set; } + public XLTopBottomPart TopBottomPart { get; set; } + + public XLFilterDynamicType DynamicType { get; set; } + public Double DynamicValue { get; set; } + + #endregion IXLFilterColumn Members + + private void SetTopBottom(Int32 value, XLTopBottomType type, Boolean takeTop = true) + { + _autoFilter.IsEnabled = true; + _autoFilter.Column(_column).SetFilterType(XLFilterType.TopBottom) + .SetTopBottomValue(value) + .SetTopBottomType(type); + + var values = GetValues(value, type, takeTop); + + Clear(); + _autoFilter.Filters.Add(_column, new List()); + + Boolean addToList = true; + var ws = _autoFilter.Range.Worksheet as XLWorksheet; + ws.SuspendEvents(); + var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount()); + foreach (IXLRangeRow row in rows) + { + Boolean foundOne = false; + foreach (double val in values) + { + Func condition = v => (v as IComparable).CompareTo(val) == 0; + if (addToList) + { + _autoFilter.Filters[_column].Add(new XLFilter + { + Value = val, + Operator = XLFilterOperator.Equal, + Connector = XLConnector.Or, + Condition = condition + }); + } + + var cell = row.Cell(_column); + if (cell.DataType != XLDataType.Number || !condition(cell.GetDouble())) continue; + row.WorksheetRow().Unhide(); + foundOne = true; + } + if (!foundOne) + row.WorksheetRow().Hide(); + + addToList = false; + } + ws.ResumeEvents(); + } + + private IEnumerable GetValues(int value, XLTopBottomType type, bool takeTop) + { + var column = _autoFilter.Range.Column(_column); + var subColumn = column.Column(2, column.CellCount()); + var cellsUsed = subColumn.CellsUsed(c => c.DataType == XLDataType.Number); + if (takeTop) + { + if (type == XLTopBottomType.Items) + { + return cellsUsed.Select(c => c.GetDouble()).OrderByDescending(d => d).Take(value).Distinct(); + } + + var numerics1 = cellsUsed.Select(c => c.GetDouble()); + Int32 valsToTake1 = numerics1.Count() * value / 100; + return numerics1.OrderByDescending(d => d).Take(valsToTake1).Distinct(); + } + + if (type == XLTopBottomType.Items) + { + return cellsUsed.Select(c => c.GetDouble()).OrderBy(d => d).Take(value).Distinct(); + } + + var numerics = cellsUsed.Select(c => c.GetDouble()); + Int32 valsToTake = numerics.Count() * value / 100; + return numerics.OrderBy(d => d).Take(valsToTake).Distinct(); + } + + private void ShowAverage(Boolean aboveAverage) + { + _autoFilter.IsEnabled = true; + _autoFilter.Column(_column).SetFilterType(XLFilterType.Dynamic) + .SetDynamicType(aboveAverage + ? XLFilterDynamicType.AboveAverage + : XLFilterDynamicType.BelowAverage); + var values = GetAverageValues(aboveAverage); + + Clear(); + _autoFilter.Filters.Add(_column, new List()); + + Boolean addToList = true; + var ws = _autoFilter.Range.Worksheet as XLWorksheet; + ws.SuspendEvents(); + var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount()); + + foreach (IXLRangeRow row in rows) + { + Boolean foundOne = false; + foreach (double val in values) + { + Func condition = v => (v as IComparable).CompareTo(val) == 0; + if (addToList) + { + _autoFilter.Filters[_column].Add(new XLFilter + { + Value = val, + Operator = XLFilterOperator.Equal, + Connector = XLConnector.Or, + Condition = condition + }); + } + + var cell = row.Cell(_column); + if (cell.DataType != XLDataType.Number || !condition(cell.GetDouble())) continue; + row.WorksheetRow().Unhide(); + foundOne = true; + } + + if (!foundOne) + row.WorksheetRow().Hide(); + + addToList = false; + } + + ws.ResumeEvents(); + } + + private IEnumerable GetAverageValues(bool aboveAverage) + { + var column = _autoFilter.Range.Column(_column); + var subColumn = column.Column(2, column.CellCount()); + Double average = subColumn.CellsUsed(c => c.DataType == XLDataType.Number).Select(c => c.GetDouble()) + .Average(); + + if (aboveAverage) + { + return + subColumn.CellsUsed(c => c.DataType == XLDataType.Number).Select(c => c.GetDouble()) + .Where(c => c > average).Distinct(); + } + + return + subColumn.CellsUsed(c => c.DataType == XLDataType.Number).Select(c => c.GetDouble()) + .Where(c => c < average).Distinct(); + } + + private IXLFilterConnector ApplyCustomFilter(T value, XLFilterOperator op, Func condition, + XLFilterType filterType = XLFilterType.Custom) + where T : IComparable + { + _autoFilter.IsEnabled = true; + if (filterType == XLFilterType.Custom) + { + Clear(); + _autoFilter.Filters.Add(_column, + new List + { + new XLFilter + { + Value = value, + Operator = op, + Connector = XLConnector.Or, + Condition = condition + } + }); + } + else + { + if (_autoFilter.Filters.TryGetValue(_column, out List filterList)) + filterList.Add(new XLFilter + { + Value = value, + Operator = op, + Connector = XLConnector.Or, + Condition = condition + }); + else + { + _autoFilter.Filters.Add(_column, + new List + { + new XLFilter + { + Value = value, + Operator = op, + Connector = XLConnector.Or, + Condition = condition + } + }); + } + } + _autoFilter.Column(_column).FilterType = filterType; + _autoFilter.Reapply(); + return new XLFilterConnector(_autoFilter, _column); + } + + public IXLFilterColumn SetFilterType(XLFilterType value) { FilterType = value; return this; } + + public IXLFilterColumn SetTopBottomValue(Int32 value) { TopBottomValue = value; return this; } + + public IXLFilterColumn SetTopBottomType(XLTopBottomType value) { TopBottomType = value; return this; } + + public IXLFilterColumn SetTopBottomPart(XLTopBottomPart value) { TopBottomPart = value; return this; } + + public IXLFilterColumn SetDynamicType(XLFilterDynamicType value) { DynamicType = value; return this; } + + public IXLFilterColumn SetDynamicValue(Double value) { DynamicValue = value; return this; } + } +} diff --git a/ClosedXML/Excel/AutoFilters/XLFilterConnector.cs b/ClosedXML/Excel/AutoFilters/XLFilterConnector.cs new file mode 100644 index 0000000..3aac0ec --- /dev/null +++ b/ClosedXML/Excel/AutoFilters/XLFilterConnector.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLFilterConnector : IXLFilterConnector + { + private readonly XLAutoFilter _autoFilter; + private readonly Int32 _column; + + public XLFilterConnector(XLAutoFilter autoFilter, Int32 column) + { + _autoFilter = autoFilter; + _column = column; + } + + #region IXLFilterConnector Members + + public IXLCustomFilteredColumn And + { + get { return new XLCustomFilteredColumn(_autoFilter, _column, XLConnector.And); } + } + + public IXLCustomFilteredColumn Or + { + get { return new XLCustomFilteredColumn(_autoFilter, _column, XLConnector.Or); } + } + + #endregion + } +} \ No newline at end of file diff --git a/ClosedXML/Excel/AutoFilters/XLFilteredColumn.cs b/ClosedXML/Excel/AutoFilters/XLFilteredColumn.cs new file mode 100644 index 0000000..fde9dba --- /dev/null +++ b/ClosedXML/Excel/AutoFilters/XLFilteredColumn.cs @@ -0,0 +1,57 @@ +using System; + +namespace ClosedXML.Excel +{ + internal class XLFilteredColumn : IXLFilteredColumn + { + private readonly XLAutoFilter _autoFilter; + private readonly Int32 _column; + + public XLFilteredColumn(XLAutoFilter autoFilter, Int32 column) + { + _autoFilter = autoFilter; + _column = column; + } + + #region IXLFilteredColumn Members + + public IXLFilteredColumn AddFilter(T value) where T : IComparable + { + Func condition; + Boolean isText; + if (typeof(T) == typeof(String)) + { + condition = v => v.ToString().Equals(value.ToString(), StringComparison.InvariantCultureIgnoreCase); + isText = true; + } + else + { + condition = v => v.CastTo().CompareTo(value) == 0; + isText = false; + } + + _autoFilter.Filters[_column].Add(new XLFilter + { + Value = value, + Condition = condition, + Operator = XLFilterOperator.Equal, + Connector = XLConnector.Or + }); + + var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount()); + + foreach (IXLRangeRow row in rows) + { + if ((isText && condition(row.Cell(_column).GetString())) || + (!isText && row.Cell(_column).DataType == XLDataType.Number && + condition(row.Cell(_column).GetValue()))) + { + row.WorksheetRow().Unhide(); + } + } + return this; + } + + #endregion IXLFilteredColumn Members + } +} diff --git a/ClosedXML/Excel/Caching/IXLRepository.cs b/ClosedXML/Excel/Caching/IXLRepository.cs new file mode 100644 index 0000000..4b447a1 --- /dev/null +++ b/ClosedXML/Excel/Caching/IXLRepository.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel.Caching +{ + ///

+ /// Base interface for an abstract repository. + /// + internal interface IXLRepository + { + /// + /// Clear the repository; + /// + void Clear(); + } + + internal interface IXLRepository : IXLRepository, IEnumerable + where Tkey : struct, IEquatable + where Tvalue : class + { + /// + /// Put the into the repository under the specified + /// if there is no such key present. + /// + /// Key to identify the value. + /// Value to put into the repository if key does not exist. + /// Value stored in the repository under the specified . If key already existed + /// returned value may differ from the input one. + Tvalue Store(ref Tkey key, Tvalue value); + } +} diff --git a/ClosedXML/Excel/Caching/XLAlignmentRepository.cs b/ClosedXML/Excel/Caching/XLAlignmentRepository.cs new file mode 100644 index 0000000..1e091ae --- /dev/null +++ b/ClosedXML/Excel/Caching/XLAlignmentRepository.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel.Caching +{ + internal sealed class XLAlignmentRepository : XLRepositoryBase + { + #region Constructors + + public XLAlignmentRepository(Func createNew) + : base(createNew) + { + } + + public XLAlignmentRepository(Func createNew, IEqualityComparer comparer) + : base(createNew, comparer) + { + } + + #endregion Constructors + } +} diff --git a/ClosedXML/Excel/Caching/XLBorderRepository.cs b/ClosedXML/Excel/Caching/XLBorderRepository.cs new file mode 100644 index 0000000..2350e61 --- /dev/null +++ b/ClosedXML/Excel/Caching/XLBorderRepository.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel.Caching +{ + internal sealed class XLBorderRepository : XLRepositoryBase + { + #region Constructors + + public XLBorderRepository(Func createNew) + : base(createNew) + { + } + + public XLBorderRepository(Func createNew, IEqualityComparer comparer) + : base(createNew, comparer) + { + } + + #endregion Constructors + } +} diff --git a/ClosedXML/Excel/Caching/XLColorRepository.cs b/ClosedXML/Excel/Caching/XLColorRepository.cs new file mode 100644 index 0000000..d6d671b --- /dev/null +++ b/ClosedXML/Excel/Caching/XLColorRepository.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel.Caching +{ + internal sealed class XLColorRepository : XLRepositoryBase + { + #region Constructors + + public XLColorRepository(Func createNew) + : base(createNew) + { + } + + public XLColorRepository(Func createNew, IEqualityComparer comparer) + : base(createNew, comparer) + { + } + + #endregion Constructors + } +} diff --git a/ClosedXML/Excel/Caching/XLFillRepository.cs b/ClosedXML/Excel/Caching/XLFillRepository.cs new file mode 100644 index 0000000..1dbb79a --- /dev/null +++ b/ClosedXML/Excel/Caching/XLFillRepository.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel.Caching +{ + internal sealed class XLFillRepository : XLRepositoryBase + { + #region Constructors + + public XLFillRepository(Func createNew) + : base(createNew) + { + } + + public XLFillRepository(Func createNew, IEqualityComparer comparer) + : base(createNew, comparer) + { + } + + #endregion Constructors + } +} diff --git a/ClosedXML/Excel/Caching/XLFontRepository.cs b/ClosedXML/Excel/Caching/XLFontRepository.cs new file mode 100644 index 0000000..ba619ef --- /dev/null +++ b/ClosedXML/Excel/Caching/XLFontRepository.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel.Caching +{ + internal sealed class XLFontRepository : XLRepositoryBase + { + #region Constructors + + public XLFontRepository(Func createNew) + : base(createNew) + { + } + + public XLFontRepository(Func createNew, IEqualityComparer comparer) + : base(createNew, comparer) + { + } + + #endregion Constructors + } +} diff --git a/ClosedXML/Excel/Caching/XLNumberFormatRepository.cs b/ClosedXML/Excel/Caching/XLNumberFormatRepository.cs new file mode 100644 index 0000000..80e9d10 --- /dev/null +++ b/ClosedXML/Excel/Caching/XLNumberFormatRepository.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel.Caching +{ + internal sealed class XLNumberFormatRepository : XLRepositoryBase + { + #region Constructors + + public XLNumberFormatRepository(Func createNew) + : base(createNew) + { + } + + public XLNumberFormatRepository(Func createNew, IEqualityComparer comparer) + : base(createNew, comparer) + { + } + + #endregion Constructors + } +} diff --git a/ClosedXML/Excel/Caching/XLProtectionRepository.cs b/ClosedXML/Excel/Caching/XLProtectionRepository.cs new file mode 100644 index 0000000..44e7de3 --- /dev/null +++ b/ClosedXML/Excel/Caching/XLProtectionRepository.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel.Caching +{ + internal sealed class XLProtectionRepository : XLRepositoryBase + { + #region Constructors + + public XLProtectionRepository(Func createNew) + : base(createNew) + { + } + + public XLProtectionRepository(Func createNew, IEqualityComparer comparer) + : base(createNew, comparer) + { + } + + #endregion Constructors + } +} diff --git a/ClosedXML/Excel/Caching/XLRangeRepository.cs b/ClosedXML/Excel/Caching/XLRangeRepository.cs new file mode 100644 index 0000000..173322d --- /dev/null +++ b/ClosedXML/Excel/Caching/XLRangeRepository.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel.Caching +{ + internal class XLRangeRepository : XLWorkbookElementRepositoryBase + { + public XLRangeRepository(XLWorkbook workbook, Func createNew) : base(workbook, createNew) + { + } + + public XLRangeRepository(XLWorkbook workbook, Func createNew, IEqualityComparer Ñomparer) : base(workbook, createNew, Ñomparer) + { + } + } +} diff --git a/ClosedXML/Excel/Caching/XLRepositoryBase.cs b/ClosedXML/Excel/Caching/XLRepositoryBase.cs new file mode 100644 index 0000000..347bf36 --- /dev/null +++ b/ClosedXML/Excel/Caching/XLRepositoryBase.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Collections; + +namespace ClosedXML.Excel.Caching +{ + internal abstract class XLRepositoryBase : IXLRepository + { + public abstract void Clear(); + } + + internal abstract class XLRepositoryBase : XLRepositoryBase, IXLRepository + where Tkey : struct, IEquatable + where Tvalue : class + { + const int CONCURRENCY_LEVEL = 4; + const int INITIAL_CAPACITY = 1000; + + private readonly ConcurrentDictionary _storage; + private readonly Func _createNew; + + protected XLRepositoryBase(Func createNew) + : this(createNew, EqualityComparer.Default) + { + } + + protected XLRepositoryBase(Func createNew, IEqualityComparer comparer) + { + _storage = new ConcurrentDictionary(CONCURRENCY_LEVEL, INITIAL_CAPACITY, comparer); + _createNew = createNew; + } + + /// + /// Check if the specified key is presented in the repository. + /// + /// Key to look for. + /// Value from the repository stored under specified key or null if key does + /// not exist or the entry under this key has already bee GCed. + /// True if entry exists and alive, false otherwise. + public bool ContainsKey(ref Tkey key, out Tvalue value) + { + if (_storage.TryGetValue(key, out WeakReference cachedReference)) + { + value = cachedReference.Target as Tvalue; + return value != null; + } + value = null; + return false; + } + + /// + /// Put the entity into the repository under the specified key if no other entity with + /// the same key is presented. + /// + /// Key to identify the entity. + /// Entity to store. + /// Entity that is stored in the repository under the specified key + /// (it can be either the or another entity that has been added to + /// the repository before.) + public Tvalue Store(ref Tkey key, Tvalue value) + { + if (value == null) + return null; + + do + { + if (_storage.TryGetValue(key, out WeakReference cachedReference) && + cachedReference.Target is Tvalue storedValue) + { + return storedValue; + } + } while (!_storage.TryAdd(key, new WeakReference(value))); + + return value; + } + + public Tvalue GetOrCreate(ref Tkey key) + { + if (_storage.TryGetValue(key, out WeakReference cachedReference) && + cachedReference.Target is Tvalue storedValue) + { + return storedValue; + } + + _storage.TryRemove(key, out WeakReference _); + var value = _createNew(key); + return Store(ref key, value); + } + + public Tvalue Replace(ref Tkey oldKey, ref Tkey newKey) + { + if (_storage.TryRemove(oldKey, out WeakReference cachedReference) && cachedReference != null) + { + _storage.TryAdd(newKey, cachedReference); + return GetOrCreate(ref newKey); + } + + return null; + } + + public void Remove(ref Tkey key) + { + _storage.TryRemove(key, out WeakReference _); + } + + public override void Clear() + { + _storage.Clear(); + } + + /// + /// Enumerate items in repository removing "dead" entries. + /// + public IEnumerator GetEnumerator() + { + return _storage + .Select(pair => + { + var val = pair.Value.Target as Tvalue; + if (val == null) + { + _storage.TryRemove(pair.Key, out WeakReference _); + } + return val; + }) + .Where(val => val != null) + .GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/ClosedXML/Excel/Caching/XLStyleRepository.cs b/ClosedXML/Excel/Caching/XLStyleRepository.cs new file mode 100644 index 0000000..d5105d4 --- /dev/null +++ b/ClosedXML/Excel/Caching/XLStyleRepository.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel.Caching +{ + internal sealed class XLStyleRepository : XLRepositoryBase + { + #region Constructors + + public XLStyleRepository(Func createNew) + : base(createNew) + { + } + + public XLStyleRepository(Func createNew, IEqualityComparer comparer) + : base(createNew, comparer) + { + } + + #endregion Constructors + } +} diff --git a/ClosedXML/Excel/Caching/XLWorkbookElementRepositoryBase.cs b/ClosedXML/Excel/Caching/XLWorkbookElementRepositoryBase.cs new file mode 100644 index 0000000..a001f12 --- /dev/null +++ b/ClosedXML/Excel/Caching/XLWorkbookElementRepositoryBase.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel.Caching +{ + /// + /// Base repository for elements. + /// + internal abstract class XLWorkbookElementRepositoryBase : XLRepositoryBase + where Tkey : struct, IEquatable + where Tvalue : class + { + public XLWorkbook Workbook { get; private set; } + + public XLWorkbookElementRepositoryBase(XLWorkbook workbook, Func createNew) + : this(workbook, createNew, EqualityComparer.Default) + { + } + + public XLWorkbookElementRepositoryBase(XLWorkbook workbook, Func createNew, IEqualityComparer Ñomparer) + : base(createNew, Ñomparer) + { + Workbook = workbook; + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/CalcEngine.cs b/ClosedXML/Excel/CalcEngine/CalcEngine.cs new file mode 100644 index 0000000..75424ff --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/CalcEngine.cs @@ -0,0 +1,844 @@ +using ClosedXML.Excel.CalcEngine.Exceptions; +using ClosedXML.Excel.CalcEngine.Functions; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +namespace ClosedXML.Excel.CalcEngine +{ + /// + /// CalcEngine parses strings and returns Expression objects that can + /// be evaluated. + /// + /// + /// This class has three extensibility points: + /// Use the DataContext property to add an object's properties to the engine scope. + /// Use the RegisterFunction method to define custom functions. + /// Override the GetExternalObject method to add arbitrary variables to the engine scope. + /// + internal class CalcEngine + { + private const string defaultFunctionNameSpace = "_xlfn"; + + //--------------------------------------------------------------------------- + + #region ** fields + + // members + private string _expr; // expression being parsed + + private int _len; // length of the expression being parsed + private int _ptr; // current pointer into expression + private char[] _idChars; // valid characters in identifiers (besides alpha and digits) + private Token _token; // current token being parsed + private Dictionary _tkTbl; // table with tokens (+, -, etc) + private Dictionary _fnTbl; // table with constants and functions (pi, sin, etc) + private Dictionary _vars; // table with variables + private object _dataContext; // object with properties + private bool _optimize; // optimize expressions when parsing + protected ExpressionCache _cache; // cache with parsed expressions + private CultureInfo _ci; // culture info used to parse numbers/dates + private char _decimal, _listSep, _percent; // localized decimal separator, list separator, percent sign + + #endregion ** fields + + //--------------------------------------------------------------------------- + + #region ** ctor + + public CalcEngine() + { + CultureInfo = CultureInfo.InvariantCulture; + _tkTbl = GetSymbolTable(); + _fnTbl = GetFunctionTable(); + _vars = new Dictionary(StringComparer.OrdinalIgnoreCase); + _cache = new ExpressionCache(this); + _optimize = true; +#if DEBUG + //this.Test(); +#endif + } + + #endregion ** ctor + + //--------------------------------------------------------------------------- + + #region ** object model + + /// + /// Parses a string into an . + /// + /// String to parse. + /// An object that can be evaluated. + public Expression Parse(string expression) + { + // initialize + _expr = expression; + _len = _expr.Length; + _ptr = 0; + + // skip leading equals sign + if (_len > 0 && _expr[0] == '=') + _ptr++; + + // skip leading +'s + while (_len > _ptr && _expr[_ptr] == '+') + _ptr++; + + // parse the expression + var expr = ParseExpression(); + + // check for errors + if (_token.ID == TKID.OPEN) + Throw("Unknown function: " + expr.LastParseItem); + else if (_token.ID != TKID.END) + Throw("Expected end of expression"); + + // optimize expression + if (_optimize) + { + expr = expr.Optimize(); + } + + // done + return expr; + } + + /// + /// Evaluates a string. + /// + /// Expression to evaluate. + /// The value of the expression. + /// + /// If you are going to evaluate the same expression several times, + /// it is more efficient to parse it only once using the + /// method and then using the Expression.Evaluate method to evaluate + /// the parsed expression. + /// + public object Evaluate(string expression) + { + var x = _cache != null + ? _cache[expression] + : Parse(expression); + return x.Evaluate(); + } + + /// + /// Gets or sets whether the calc engine should keep a cache with parsed + /// expressions. + /// + public bool CacheExpressions + { + get { return _cache != null; } + set + { + if (value != CacheExpressions) + { + _cache = value + ? new ExpressionCache(this) + : null; + } + } + } + + /// + /// Gets or sets whether the calc engine should optimize expressions when + /// they are parsed. + /// + public bool OptimizeExpressions + { + get { return _optimize; } + set { _optimize = value; } + } + + /// + /// Gets or sets a string that specifies special characters that are valid for identifiers. + /// + /// + /// Identifiers must start with a letter or an underscore, which may be followed by + /// additional letters, underscores, or digits. This string allows you to specify + /// additional valid characters such as ':' or '!' (used in Excel range references + /// for example). + /// + public char[] IdentifierChars + { + get { return _idChars; } + set { _idChars = value; } + } + + /// + /// Registers a function that can be evaluated by this . + /// + /// Function name. + /// Minimum parameter count. + /// Maximum parameter count. + /// Delegate that evaluates the function. + public void RegisterFunction(string functionName, int parmMin, int parmMax, CalcEngineFunction fn) + { + _fnTbl.Add(functionName, new FunctionDefinition(parmMin, parmMax, fn)); + } + + /// + /// Registers a function that can be evaluated by this . + /// + /// Function name. + /// Parameter count. + /// Delegate that evaluates the function. + public void RegisterFunction(string functionName, int parmCount, CalcEngineFunction fn) + { + RegisterFunction(functionName, parmCount, parmCount, fn); + } + + /// + /// Gets an external object based on an identifier. + /// + /// + /// This method is useful when the engine needs to create objects dynamically. + /// For example, a spreadsheet calc engine would use this method to dynamically create cell + /// range objects based on identifiers that cannot be enumerated at design time + /// (such as "AB12", "A1:AB12", etc.) + /// + public virtual object GetExternalObject(string identifier) + { + return null; + } + + /// + /// Gets or sets the DataContext for this . + /// + /// + /// Once a DataContext is set, all public properties of the object become available + /// to the CalcEngine, including sub-properties such as "Address.Street". These may + /// be used with expressions just like any other constant. + /// + public virtual object DataContext + { + get { return _dataContext; } + set { _dataContext = value; } + } + + /// + /// Gets the dictionary that contains function definitions. + /// + public Dictionary Functions + { + get { return _fnTbl; } + } + + /// + /// Gets the dictionary that contains simple variables (not in the DataContext). + /// + public Dictionary Variables + { + get { return _vars; } + } + + /// + /// Gets or sets the to use when parsing numbers and dates. + /// + public CultureInfo CultureInfo + { + get { return _ci; } + set + { + _ci = value; + var nf = _ci.NumberFormat; + _decimal = nf.NumberDecimalSeparator[0]; + _percent = nf.PercentSymbol[0]; + _listSep = _ci.TextInfo.ListSeparator[0]; + } + } + + #endregion ** object model + + //--------------------------------------------------------------------------- + + #region ** token/keyword tables + + private static readonly IDictionary ErrorMap = new Dictionary() + { + ["#REF!"] = ErrorExpression.ExpressionErrorType.CellReference, + ["#VALUE!"] = ErrorExpression.ExpressionErrorType.CellValue, + ["#DIV/0!"] = ErrorExpression.ExpressionErrorType.DivisionByZero, + ["#NAME?"] = ErrorExpression.ExpressionErrorType.NameNotRecognized, + ["#N/A"] = ErrorExpression.ExpressionErrorType.NoValueAvailable, + ["#NULL!"] = ErrorExpression.ExpressionErrorType.NullValue, + ["#NUM!"] = ErrorExpression.ExpressionErrorType.NumberInvalid + }; + + // build/get static token table + private Dictionary GetSymbolTable() + { + if (_tkTbl == null) + { + _tkTbl = new Dictionary(); + AddToken('&', TKID.CONCAT, TKTYPE.ADDSUB); + AddToken('+', TKID.ADD, TKTYPE.ADDSUB); + AddToken('-', TKID.SUB, TKTYPE.ADDSUB); + AddToken('(', TKID.OPEN, TKTYPE.GROUP); + AddToken(')', TKID.CLOSE, TKTYPE.GROUP); + AddToken('*', TKID.MUL, TKTYPE.MULDIV); + AddToken('.', TKID.PERIOD, TKTYPE.GROUP); + AddToken('/', TKID.DIV, TKTYPE.MULDIV); + AddToken('\\', TKID.DIVINT, TKTYPE.MULDIV); + AddToken('%', TKID.DIV100, TKTYPE.MULDIV_UNARY); + AddToken('=', TKID.EQ, TKTYPE.COMPARE); + AddToken('>', TKID.GT, TKTYPE.COMPARE); + AddToken('<', TKID.LT, TKTYPE.COMPARE); + AddToken('^', TKID.POWER, TKTYPE.POWER); + AddToken("<>", TKID.NE, TKTYPE.COMPARE); + AddToken(">=", TKID.GE, TKTYPE.COMPARE); + AddToken("<=", TKID.LE, TKTYPE.COMPARE); + + // list separator is localized, not necessarily a comma + // so it can't be on the static table + //AddToken(',', TKID.COMMA, TKTYPE.GROUP); + } + return _tkTbl; + } + + private void AddToken(object symbol, TKID id, TKTYPE type) + { + var token = new Token(symbol, id, type); + _tkTbl.Add(symbol, token); + } + + // build/get static keyword table + private Dictionary GetFunctionTable() + { + if (_fnTbl == null) + { + // create table + _fnTbl = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + + // register built-in functions (and constants) + Engineering.Register(this); + Information.Register(this); + Logical.Register(this); + Lookup.Register(this); + MathTrig.Register(this); + Text.Register(this); + Statistical.Register(this); + DateAndTime.Register(this); + Financial.Register(this); + } + return _fnTbl; + } + + #endregion ** token/keyword tables + + //--------------------------------------------------------------------------- + + #region ** private stuff + + private Expression ParseExpression() + { + GetToken(); + return ParseCompare(); + } + + private Expression ParseCompare() + { + var x = ParseAddSub(); + while (_token.Type == TKTYPE.COMPARE) + { + var t = _token; + GetToken(); + var exprArg = ParseAddSub(); + x = new BinaryExpression(t, x, exprArg); + } + return x; + } + + private Expression ParseAddSub() + { + var x = ParseMulDiv(); + while (_token.Type == TKTYPE.ADDSUB) + { + var t = _token; + GetToken(); + var exprArg = ParseMulDiv(); + x = new BinaryExpression(t, x, exprArg); + } + return x; + } + + private Expression ParseMulDiv() + { + var x = ParsePower(); + while (_token.Type == TKTYPE.MULDIV) + { + var t = _token; + GetToken(); + var a = ParsePower(); + x = new BinaryExpression(t, x, a); + } + return x; + } + + private Expression ParsePower() + { + var x = ParseMulDivUnary(); + while (_token.Type == TKTYPE.POWER) + { + var t = _token; + GetToken(); + var a = ParseMulDivUnary(); + x = new BinaryExpression(t, x, a); + } + return x; + } + + private Expression ParseMulDivUnary() + { + var x = ParseUnary(); + while (_token.Type == TKTYPE.MULDIV_UNARY) + { + var t = _tkTbl['/']; + var a = new Expression(100); + x = new BinaryExpression(t, x, a); + GetToken(); + } + return x; + } + + private Expression ParseUnary() + { + // unary plus and minus + if (_token.Type == TKTYPE.ADDSUB) + { + var sign = 1; + do + { + if (_token.ID == TKID.SUB) + sign = -sign; + GetToken(); + } while (_token.Type == TKTYPE.ADDSUB); + var a = ParseAtom(); + var t = (sign == 1) + ? _tkTbl['+'] + : _tkTbl['-']; + return new UnaryExpression(t, a); + } + + // not unary, return atom + return ParseAtom(); + } + + private Expression ParseAtom() + { + string id; + Expression x = null; + + switch (_token.Type) + { + // literals + case TKTYPE.LITERAL: + x = new Expression(_token); + break; + + // identifiers + case TKTYPE.IDENTIFIER: + + // get identifier + id = (string)_token.Value; + FunctionDefinition functionDefinition; + + var foundFunction = _fnTbl.TryGetValue(id, out functionDefinition); + if (!foundFunction && id.StartsWith($"{defaultFunctionNameSpace}.")) + foundFunction = _fnTbl.TryGetValue(id.Substring(defaultFunctionNameSpace.Length + 1), out functionDefinition); + + // look for functions + if (foundFunction) + { + var p = GetParameters(); + var pCnt = p == null ? 0 : p.Count; + if (functionDefinition.ParmMin != -1 && pCnt < functionDefinition.ParmMin) + { + Throw(string.Format("Too few parameters for function '{0}'. Expected a minimum of {1} and a maximum of {2}.", id, functionDefinition.ParmMin, functionDefinition.ParmMax)); + } + if (functionDefinition.ParmMax != -1 && pCnt > functionDefinition.ParmMax) + { + Throw(string.Format("Too many parameters for function '{0}'.Expected a minimum of {1} and a maximum of {2}.", id, functionDefinition.ParmMin, functionDefinition.ParmMax)); + } + x = new FunctionExpression(functionDefinition, p); + break; + } + + // look for simple variables (much faster than binding!) + if (_vars.ContainsKey(id)) + { + x = new VariableExpression(_vars, id); + break; + } + + // look for external objects + var xObj = GetExternalObject(id); + if (xObj == null) + throw new NameNotRecognizedException($"The identifier `{id}` was not recognised."); + + x = new XObjectExpression(xObj); + break; + + // sub-expressions + case TKTYPE.GROUP: + + // Normally anything other than opening parenthesis is illegal here + // but Excel allows omitted parameters so return empty value expression. + if (_token.ID != TKID.OPEN) + { + return new EmptyValueExpression(); + } + + // get expression + GetToken(); + x = ParseCompare(); + + // check that the parenthesis was closed + if (_token.ID != TKID.CLOSE) + { + Throw("Unbalanced parenthesis."); + } + + break; + + case TKTYPE.ERROR: + x = new ErrorExpression((ErrorExpression.ExpressionErrorType)_token.Value); + break; + } + + // make sure we got something... + if (x == null) + { + Throw(); + } + + // done + GetToken(); + return x; + } + + #endregion ** private stuff + + //--------------------------------------------------------------------------- + + #region ** parser + + private static IDictionary matchingClosingSymbols = new Dictionary() + { + { '\'', '\'' }, + { '[', ']' } + }; + + private void GetToken() + { + // eat white space + while (_ptr < _len && _expr[_ptr] <= ' ') + { + _ptr++; + } + + // are we done? + if (_ptr >= _len) + { + _token = new Token(null, TKID.END, TKTYPE.GROUP); + return; + } + + // prepare to parse + int i; + var c = _expr[_ptr]; + + // operators + // this gets called a lot, so it's pretty optimized. + // note that operators must start with non-letter/digit characters. + var isLetter = char.IsLetter(c); + var isDigit = char.IsDigit(c); + + var isEnclosed = matchingClosingSymbols.TryGetValue(c, out char matchingClosingSymbol); + + if (!isLetter && !isDigit && !isEnclosed) + { + // if this is a number starting with a decimal, don't parse as operator + var nxt = _ptr + 1 < _len ? _expr[_ptr + 1] : '0'; + bool isNumber = c == _decimal && char.IsDigit(nxt); + if (!isNumber) + { + // look up localized list separator + if (c == _listSep) + { + _token = new Token(c, TKID.COMMA, TKTYPE.GROUP); + _ptr++; + return; + } + + // look up single-char tokens on table + if (_tkTbl.TryGetValue(c, out Token tk)) + { + // save token we found + _token = tk; + _ptr++; + + // look for double-char tokens (special case) + if (_ptr < _len + && (c == '>' || c == '<') + && _tkTbl.TryGetValue(_expr.Substring(_ptr - 1, 2), out tk)) + { + _token = tk; + _ptr++; + } + + // found token on the table + return; + } + } + } + + // parse numbers + if (isDigit || c == _decimal) + { + var sci = false; + var div = -1.0; // use double, not int (this may get really big) + var val = 0.0; + for (i = 0; i + _ptr < _len; i++) + { + c = _expr[_ptr + i]; + + // digits always OK + if (char.IsDigit(c)) + { + val = val * 10 + (c - '0'); + if (div > -1) + { + div *= 10; + } + continue; + } + + // one decimal is OK + if (c == _decimal && div < 0) + { + div = 1; + continue; + } + + // scientific notation? + if ((c == 'E' || c == 'e') && !sci) + { + sci = true; + c = _expr[_ptr + i + 1]; + if (c == '+' || c == '-') i++; + continue; + } + + // end of literal + break; + } + + // end of number, get value + if (!sci) + { + // much faster than ParseDouble + if (div > 1) + { + val /= div; + } + } + else + { + var lit = _expr.Substring(_ptr, i); + val = ParseDouble(lit, _ci); + } + + if (c != ':') + { + // build token + _token = new Token(val, TKID.ATOM, TKTYPE.LITERAL); + + // advance pointer and return + _ptr += i; + return; + } + } + + // parse strings + if (c == '\"') + { + // look for end quote, skip double quotes + for (i = 1; i + _ptr < _len; i++) + { + c = _expr[_ptr + i]; + if (c != '\"') continue; + char cNext = i + _ptr < _len - 1 ? _expr[_ptr + i + 1] : ' '; + if (cNext != '\"') break; + i++; + } + + // check that we got the end of the string + if (c != '\"') + { + Throw("Can't find final quote."); + } + + // end of string + var lit = _expr.Substring(_ptr + 1, i - 1); + _ptr += i + 1; + _token = new Token(lit.Replace("\"\"", "\""), TKID.ATOM, TKTYPE.LITERAL); + return; + } + + // parse #REF! (and other errors) in formula + if (c == '#' && ErrorMap.Any(pair => _len > _ptr + pair.Key.Length && _expr.Substring(_ptr, pair.Key.Length).Equals(pair.Key, StringComparison.OrdinalIgnoreCase))) + { + var errorPair = ErrorMap.Single(pair => _len > _ptr + pair.Key.Length && _expr.Substring(_ptr, pair.Key.Length).Equals(pair.Key, StringComparison.OrdinalIgnoreCase)); + _ptr += errorPair.Key.Length; + _token = new Token(errorPair.Value, TKID.ATOM, TKTYPE.ERROR); + return; + } + + // identifiers (functions, objects) must start with alpha or underscore + if (!isEnclosed && !isLetter && c != '_' && (_idChars == null || !_idChars.Contains(c))) + { + Throw("Identifier expected."); + } + + // and must contain only letters/digits/_idChars + for (i = 1; i + _ptr < _len; i++) + { + c = _expr[_ptr + i]; + isLetter = char.IsLetter(c); + isDigit = char.IsDigit(c); + + if (isEnclosed && c == matchingClosingSymbol) + { + isEnclosed = false; + matchingClosingSymbol = '\0'; + + i++; + c = _expr[_ptr + i]; + isLetter = char.IsLetter(c); + isDigit = char.IsDigit(c); + } + + var disallowedSymbols = new List() { '\\', '/', '*', '[', ':', '?' }; + if (isEnclosed && disallowedSymbols.Contains(c)) + break; + + var allowedSymbols = new List() { '_', '.' }; + + if (!isLetter && !isDigit + && !(isEnclosed || allowedSymbols.Contains(c)) + && (_idChars == null || !_idChars.Contains(c))) + break; + } + + // got identifier + var id = _expr.Substring(_ptr, i); + _ptr += i; + _token = new Token(id, TKID.ATOM, TKTYPE.IDENTIFIER); + } + + private static double ParseDouble(string str, CultureInfo ci) + { + if (str.Length > 0 && str[str.Length - 1] == ci.NumberFormat.PercentSymbol[0]) + { + str = str.Substring(0, str.Length - 1); + return double.Parse(str, NumberStyles.Any, ci) / 100.0; + } + return double.Parse(str, NumberStyles.Any, ci); + } + + private List GetParameters() // e.g. myfun(a, b, c+2) + { + // check whether next token is a (, + // restore state and bail if it's not + var pos = _ptr; + var tk = _token; + GetToken(); + if (_token.ID != TKID.OPEN) + { + _ptr = pos; + _token = tk; + return null; + } + + // check for empty Parameter list + pos = _ptr; + GetToken(); + if (_token.ID == TKID.CLOSE) + { + return null; + } + _ptr = pos; + + // get Parameters until we reach the end of the list + var parms = new List(); + var expr = ParseExpression(); + parms.Add(expr); + while (_token.ID == TKID.COMMA) + { + expr = ParseExpression(); + parms.Add(expr); + } + + // make sure the list was closed correctly + if (_token.ID == TKID.OPEN) + Throw("Unknown function: " + expr.LastParseItem); + else if (_token.ID != TKID.CLOSE) + Throw("Syntax error: expected ')'"); + + // done + return parms; + } + + private Token GetMember() + { + // check whether next token is a MEMBER token ('.'), + // restore state and bail if it's not + var pos = _ptr; + var tk = _token; + GetToken(); + if (_token.ID != TKID.PERIOD) + { + _ptr = pos; + _token = tk; + return null; + } + + // skip member token + GetToken(); + if (_token.Type != TKTYPE.IDENTIFIER) + { + Throw("Identifier expected"); + } + return _token; + } + + #endregion ** parser + + //--------------------------------------------------------------------------- + + #region ** static helpers + + private static void Throw() + { + Throw("Syntax error."); + } + + private static void Throw(string msg) + { + throw new ExpressionParseException(msg); + } + + #endregion ** static helpers + } + + /// + /// Delegate that represents CalcEngine functions. + /// + /// List of objects that represent the + /// parameters to be used in the function call. + /// The function result. + internal delegate object CalcEngineFunction(List parms); +} diff --git a/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs b/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs new file mode 100644 index 0000000..4b0f586 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; + +namespace ClosedXML.Excel.CalcEngine +{ + internal static class CalcEngineHelpers + { + private static Lazy>> patternReplacements = + new Lazy>>(() => + { + // key: the literal string to match + // value: a tuple: first item: the search pattern, second item: the replacement + return new Dictionary>() + { + [@"~~"] = new Tuple(@"~~", "~"), + [@"~*"] = new Tuple(@"~\*", @"\*"), + [@"~?"] = new Tuple(@"~\?", @"\?"), + [@"?"] = new Tuple(@"\?", ".?"), + [@"*"] = new Tuple(@"\*", ".*"), + }; + }); + + internal static bool ValueSatisfiesCriteria(object value, object criteria, CalcEngine ce) + { + // safety... + if (value == null) + { + return false; + } + + // Excel treats TRUE and 1 as unequal, but LibreOffice treats them as equal. We follow Excel's convention + if (criteria is Boolean b1) + return (value is Boolean b2) && b1.Equals(b2); + + if (value is Boolean) return false; + + // if criteria is a number, straight comparison + Double cdbl; + if (criteria is Double dbl2) cdbl = dbl2; + else if (criteria is Int32 i) cdbl = i; // results of DATE function can be an integer + else if (criteria is DateTime dt) cdbl = dt.ToOADate(); + else if (criteria is TimeSpan ts) cdbl = ts.TotalDays; + else if (criteria is String cs) + { + if (value is string && (value as string).Trim().Length == 0) + return cs.Length == 0; + + if (cs.Length == 0) + return cs.Equals(value); + + // if criteria is an expression (e.g. ">20"), use calc engine + if ((cs[0] == '=' && cs.IndexOfAny(new[] { '*', '?' }) < 0) + || cs[0] == '<' + || cs[0] == '>') + { + // build expression + var expression = string.Format("{0}{1}", value, cs); + + // add quotes if necessary + var pattern = @"([\w\s]+)(\W+)(\w+)"; + var m = Regex.Match(expression, pattern); + if (m.Groups.Count == 4 + && (!double.TryParse(m.Groups[1].Value, out double d) || + !double.TryParse(m.Groups[3].Value, out d))) + { + expression = string.Format("\"{0}\"{1}\"{2}\"", + m.Groups[1].Value, + m.Groups[2].Value, + m.Groups[3].Value); + } + + // evaluate + return (bool)ce.Evaluate(expression); + } + + // if criteria is a regular expression, use regex + if (cs.IndexOfAny(new[] { '*', '?' }) > -1) + { + if (cs[0] == '=') cs = cs.Substring(1); + + var pattern = Regex.Replace( + cs, + "(" + String.Join( + "|", + patternReplacements.Value.Values.Select(t => t.Item1)) + + ")", + m => patternReplacements.Value[m.Value].Item2); + pattern = $"^{pattern}$"; + + return Regex.IsMatch(value.ToString(), pattern, RegexOptions.IgnoreCase); + } + + // straight string comparison + if (value is string vs) + return vs.Equals(cs, StringComparison.OrdinalIgnoreCase); + else + return string.Equals(value.ToString(), cs, StringComparison.OrdinalIgnoreCase); + } + else + throw new NotImplementedException(); + + Double vdbl; + if (value is Double dbl) vdbl = dbl; + else if (value is Int32 i) vdbl = i; + else if (value is DateTime dt) vdbl = dt.ToOADate(); + else if (value is TimeSpan ts) vdbl = ts.TotalDays; + else if (value is String s) + { + if (!Double.TryParse(s, out vdbl)) return false; + } + else + throw new NotImplementedException(); + + return Math.Abs(vdbl - cdbl) < Double.Epsilon; + } + + internal static bool ValueIsBlank(object value) + { + if (value == null) + return true; + + if (value is string s) + return s.Length == 0; + + return false; + } + + /// + /// Get total count of cells in the specified range without initalizing them all + /// (which might cause serious performance issues on column-wide calculations). + /// + /// Expression referring to the cell range. + /// Total number of cells in the range. + internal static long GetTotalCellsCount(XObjectExpression rangeExpression) + { + var range = (rangeExpression?.Value as CellRangeReference)?.Range; + if (range == null) + return 0; + return (long)(range.LastColumn().ColumnNumber() - range.FirstColumn().ColumnNumber() + 1) * + (long)(range.LastRow().RowNumber() - range.FirstRow().RowNumber() + 1); + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/CellRangeReference.cs b/ClosedXML/Excel/CalcEngine/CellRangeReference.cs new file mode 100644 index 0000000..eadb0d2 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/CellRangeReference.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections; + +namespace ClosedXML.Excel.CalcEngine +{ + internal class CellRangeReference : IValueObject, IEnumerable + { + public CellRangeReference(IXLRange range, XLCalcEngine ce) + { + Range = range; + CalcEngine = ce; + } + + internal CalcEngine CalcEngine { get; } + public IXLRange Range { get; } + + // ** IValueObject + public object GetValue() + { + return GetValue(Range.FirstCell()); + } + + // ** IEnumerable + public IEnumerator GetEnumerator() + { + if (Range.Worksheet.IsEmpty(XLCellsUsedOptions.AllContents)) + yield break; + + var lastCellAddress = Range.Worksheet.LastCellUsed().Address; + var maxRow = Math.Min(Range.RangeAddress.LastAddress.RowNumber, lastCellAddress.RowNumber); + var maxColumn = Math.Min(Range.RangeAddress.LastAddress.ColumnNumber, lastCellAddress.ColumnNumber); + + var trimmedRange = (XLRangeBase)Range.Worksheet + .Range( + Range.FirstCell().Address, + new XLAddress(maxRow, maxColumn, fixedRow: false, fixedColumn: false) + ); + + foreach (var c in trimmedRange.CellValues()) + yield return c; + } + + private Boolean _evaluating; + + // ** implementation + private object GetValue(IXLCell cell) + { + if (_evaluating || (cell as XLCell).IsEvaluating) + { + throw new InvalidOperationException($"Circular Reference occured during evaluation. Cell: {cell.Address.ToString(XLReferenceStyle.Default, true)}"); + } + try + { + _evaluating = true; + var f = cell.FormulaA1; + if (String.IsNullOrWhiteSpace(f)) + return cell.Value; + else + { + return (cell as XLCell).Evaluate(); + } + } + finally + { + _evaluating = false; + } + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Exceptions/CalcEngineException.cs b/ClosedXML/Excel/CalcEngine/Exceptions/CalcEngineException.cs new file mode 100644 index 0000000..1e7f1f7 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Exceptions/CalcEngineException.cs @@ -0,0 +1,18 @@ +using System; + +namespace ClosedXML.Excel.CalcEngine.Exceptions +{ + public abstract class CalcEngineException : ArgumentException + { + protected CalcEngineException() + : base() + { } + protected CalcEngineException(string message) + : base(message) + { } + + protected CalcEngineException(string message, Exception innerException) + : base(message, innerException) + { } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Exceptions/CellReferenceException.cs b/ClosedXML/Excel/CalcEngine/Exceptions/CellReferenceException.cs new file mode 100644 index 0000000..91e219e --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Exceptions/CellReferenceException.cs @@ -0,0 +1,27 @@ +using System; + +namespace ClosedXML.Excel.CalcEngine.Exceptions +{ + /// + /// This error occurs when you delete a cell referred to in the + /// formula or if you paste cells over the ones referred to in the + /// formula. + /// Corresponds to the #REF! error in Excel + /// + /// + public class CellReferenceException : CalcEngineException + { + internal CellReferenceException() + : base() + { } + + internal CellReferenceException(string message) + : base(message) + { } + + internal CellReferenceException(string message, Exception innerException) + : base(message, innerException) + { } + + } +} diff --git a/ClosedXML/Excel/CalcEngine/Exceptions/CellValueException.cs b/ClosedXML/Excel/CalcEngine/Exceptions/CellValueException.cs new file mode 100644 index 0000000..ad129dc --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Exceptions/CellValueException.cs @@ -0,0 +1,26 @@ +using System; + +namespace ClosedXML.Excel.CalcEngine.Exceptions +{ + /// + /// This error is most often the result of specifying a + /// mathematical operation with one or more cells that contain + /// text. + /// Corresponds to the #VALUE! error in Excel + /// + /// + public class CellValueException : CalcEngineException + { + internal CellValueException() + : base() + { } + + internal CellValueException(string message) + : base(message) + { } + + internal CellValueException(string message, Exception innerException) + : base(message, innerException) + { } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Exceptions/DivisionByZeroException.cs b/ClosedXML/Excel/CalcEngine/Exceptions/DivisionByZeroException.cs new file mode 100644 index 0000000..8bc6b7b --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Exceptions/DivisionByZeroException.cs @@ -0,0 +1,26 @@ +using System; + +namespace ClosedXML.Excel.CalcEngine.Exceptions +{ + /// + /// The division operation in your formula refers to a cell that + /// contains the value 0 or is blank. + /// Corresponds to the #DIV/0! error in Excel + /// + /// + public class DivisionByZeroException : CalcEngineException + { + internal DivisionByZeroException() + : base() + { } + + internal DivisionByZeroException(string message) + : base(message) + { } + + internal DivisionByZeroException(string message, Exception innerException) + : base(message, innerException) + { } + + } +} diff --git a/ClosedXML/Excel/CalcEngine/Exceptions/NameNotRecognizedException.cs b/ClosedXML/Excel/CalcEngine/Exceptions/NameNotRecognizedException.cs new file mode 100644 index 0000000..7a93075 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Exceptions/NameNotRecognizedException.cs @@ -0,0 +1,27 @@ +using System; + +namespace ClosedXML.Excel.CalcEngine.Exceptions +{ + /// + /// This error value appears when you incorrectly type the range + /// name, refer to a deleted range name, or forget to put quotation + /// marks around a text string in a formula. + /// Corresponds to the #NAME? error in Excel + /// + /// + public class NameNotRecognizedException : CalcEngineException + { + internal NameNotRecognizedException() + : base() + { } + + internal NameNotRecognizedException(string message) + : base(message) + { } + + internal NameNotRecognizedException(string message, Exception innerException) + : base(message, innerException) + { } + + } +} diff --git a/ClosedXML/Excel/CalcEngine/Exceptions/NoValueAvailableException.cs b/ClosedXML/Excel/CalcEngine/Exceptions/NoValueAvailableException.cs new file mode 100644 index 0000000..318fb9a --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Exceptions/NoValueAvailableException.cs @@ -0,0 +1,27 @@ +using System; + +namespace ClosedXML.Excel.CalcEngine.Exceptions +{ + /// + /// Technically, this is not an error value but a special value + /// that you can manually enter into a cell to indicate that you + /// don’t yet have a necessary value. + /// Corresponds to the #N/A error in Excel. + /// + /// + public class NoValueAvailableException : CalcEngineException + { + internal NoValueAvailableException() + : base() + { } + + internal NoValueAvailableException(string message) + : base(message) + { } + + internal NoValueAvailableException(string message, Exception innerException) + : base(message, innerException) + { } + + } +} diff --git a/ClosedXML/Excel/CalcEngine/Exceptions/NullValueException.cs b/ClosedXML/Excel/CalcEngine/Exceptions/NullValueException.cs new file mode 100644 index 0000000..5cc74bc --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Exceptions/NullValueException.cs @@ -0,0 +1,27 @@ +using System; + +namespace ClosedXML.Excel.CalcEngine.Exceptions +{ + /// + /// Because a space indicates an intersection, this error will + /// occur if you insert a space instead of a comma(the union operator) + /// between ranges used in function arguments. + /// Corresponds to the #NULL! error in Excel + /// + /// + public class NullValueException : CalcEngineException + { + internal NullValueException() + : base() + { } + + internal NullValueException(string message) + : base(message) + { } + + internal NullValueException(string message, Exception innerException) + : base(message, innerException) + { } + + } +} diff --git a/ClosedXML/Excel/CalcEngine/Exceptions/NumberException.cs b/ClosedXML/Excel/CalcEngine/Exceptions/NumberException.cs new file mode 100644 index 0000000..7d248f5 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Exceptions/NumberException.cs @@ -0,0 +1,27 @@ +using System; + +namespace ClosedXML.Excel.CalcEngine.Exceptions +{ + /// + /// This error can be caused by an invalid argument in an Excel + /// function or a formula that produces a number too large or too small + /// to be represented in the worksheet. + /// Corresponds to the #NUM! error in Excel + /// + /// + public class NumberException : CalcEngineException + { + internal NumberException() + : base() + { } + + internal NumberException(string message) + : base(message) + { } + + internal NumberException(string message, Exception innerException) + : base(message, innerException) + { } + + } +} diff --git a/ClosedXML/Excel/CalcEngine/Expression.cs b/ClosedXML/Excel/CalcEngine/Expression.cs new file mode 100644 index 0000000..edb2d14 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Expression.cs @@ -0,0 +1,603 @@ +using ClosedXML.Excel.CalcEngine.Exceptions; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Threading; + +namespace ClosedXML.Excel.CalcEngine +{ + internal abstract class ExpressionBase + { + public abstract string LastParseItem { get; } + } + + /// + /// Base class that represents parsed expressions. + /// + /// + /// For example: + /// + /// Expression expr = scriptEngine.Parse(strExpression); + /// object val = expr.Evaluate(); + /// + /// + internal class Expression : ExpressionBase, IComparable + { + //--------------------------------------------------------------------------- + + #region ** fields + + internal readonly Token _token; + + #endregion ** fields + + //--------------------------------------------------------------------------- + + #region ** ctors + + internal Expression() + { + _token = new Token(null, TKID.ATOM, TKTYPE.IDENTIFIER); + } + + internal Expression(object value) + { + _token = new Token(value, TKID.ATOM, TKTYPE.LITERAL); + } + + internal Expression(Token tk) + { + _token = tk; + } + + #endregion ** ctors + + //--------------------------------------------------------------------------- + + #region ** object model + + public virtual object Evaluate() + { + if (_token.Type != TKTYPE.LITERAL) + { + throw new ArgumentException("Bad expression."); + } + return _token.Value; + } + + public virtual Expression Optimize() + { + return this; + } + + #endregion ** object model + + //--------------------------------------------------------------------------- + + #region ** implicit converters + + public static implicit operator string(Expression x) + { + if (x is ErrorExpression) + (x as ErrorExpression).ThrowApplicableException(); + + var v = x.Evaluate(); + + if (v == null) + return string.Empty; + + if (v is bool b) + return b.ToString().ToUpper(); + + return v.ToString(); + } + + public static implicit operator double(Expression x) + { + if (x is ErrorExpression) + (x as ErrorExpression).ThrowApplicableException(); + + // evaluate + var v = x.Evaluate(); + + // handle doubles + if (v is double dbl) + { + return dbl; + } + + // handle booleans + if (v is bool b) + { + return b ? 1 : 0; + } + + // handle dates + if (v is DateTime dt) + { + return dt.ToOADate(); + } + + if (v is TimeSpan ts) + { + return ts.TotalDays; + } + + // handle string + if (v is string s && double.TryParse(s, out var doubleValue)) + { + return doubleValue; + } + + // handle nulls + if (v == null || v is string) + { + return 0; + } + + // handle everything else + CultureInfo _ci = Thread.CurrentThread.CurrentCulture; + return (double)Convert.ChangeType(v, typeof(double), _ci); + } + + public static implicit operator bool(Expression x) + { + if (x is ErrorExpression) + (x as ErrorExpression).ThrowApplicableException(); + + // evaluate + var v = x.Evaluate(); + + // handle booleans + if (v is bool b) + { + return b; + } + + // handle nulls + if (v == null) + { + return false; + } + + // handle doubles + if (v is double dbl) + { + return dbl != 0; + } + + // handle everything else + return (double)Convert.ChangeType(v, typeof(double)) != 0; + } + + public static implicit operator DateTime(Expression x) + { + if (x is ErrorExpression) + (x as ErrorExpression).ThrowApplicableException(); + + // evaluate + var v = x.Evaluate(); + + // handle dates + if (v is DateTime dt) + { + return dt; + } + + if (v is TimeSpan ts) + { + return new DateTime().Add(ts); + } + + // handle numbers + if (v.IsNumber()) + { + return DateTime.FromOADate((double)x); + } + + // handle everything else + CultureInfo _ci = Thread.CurrentThread.CurrentCulture; + return (DateTime)Convert.ChangeType(v, typeof(DateTime), _ci); + } + + #endregion ** implicit converters + + //--------------------------------------------------------------------------- + + #region ** IComparable + + public int CompareTo(Expression other) + { + // get both values + var c1 = this.Evaluate() as IComparable; + var c2 = other.Evaluate() as IComparable; + + // handle nulls + if (c1 == null && c2 == null) + { + return 0; + } + if (c2 == null) + { + return -1; + } + if (c1 == null) + { + return +1; + } + + // make sure types are the same + if (c1.GetType() != c2.GetType()) + { + try + { + if (c1 is DateTime) + c2 = ((DateTime)other); + else if (c2 is DateTime) + c1 = ((DateTime)this); + else + c2 = Convert.ChangeType(c2, c1.GetType()) as IComparable; + } + catch (InvalidCastException) { return -1; } + catch (FormatException) { return -1; } + catch (OverflowException) { return -1; } + catch (ArgumentNullException) { return -1; } + } + + // String comparisons should be case insensitive + if (c1 is string s1 && c2 is string s2) + return StringComparer.OrdinalIgnoreCase.Compare(s1, s2); + else + return c1.CompareTo(c2); + } + + #endregion ** IComparable + + //--------------------------------------------------------------------------- + + #region ** ExpressionBase + + public override string LastParseItem + { + get { return _token?.Value?.ToString() ?? "Unknown value"; } + } + + #endregion ** ExpressionBase + } + + /// + /// Unary expression, e.g. +123 + /// + internal class UnaryExpression : Expression + { + // ** ctor + public UnaryExpression(Token tk, Expression expr) : base(tk) + { + Expression = expr; + } + + public Expression Expression { get; private set; } + + // ** object model + override public object Evaluate() + { + switch (_token.ID) + { + case TKID.ADD: + return +(double)Expression; + + case TKID.SUB: + return -(double)Expression; + } + throw new ArgumentException("Bad expression."); + } + + public override Expression Optimize() + { + Expression = Expression.Optimize(); + return Expression._token.Type == TKTYPE.LITERAL + ? new Expression(this.Evaluate()) + : this; + } + + public override string LastParseItem + { + get { return Expression.LastParseItem; } + } + } + + /// + /// Binary expression, e.g. 1+2 + /// + internal class BinaryExpression : Expression + { + // ** ctor + public BinaryExpression(Token tk, Expression exprLeft, Expression exprRight) : base(tk) + { + LeftExpression = exprLeft; + RightExpression = exprRight; + } + + public Expression LeftExpression { get; private set; } + public Expression RightExpression { get; private set; } + + // ** object model + override public object Evaluate() + { + // handle comparisons + if (_token.Type == TKTYPE.COMPARE) + { + var cmp = LeftExpression.CompareTo(RightExpression); + switch (_token.ID) + { + case TKID.GT: return cmp > 0; + case TKID.LT: return cmp < 0; + case TKID.GE: return cmp >= 0; + case TKID.LE: return cmp <= 0; + case TKID.EQ: return cmp == 0; + case TKID.NE: return cmp != 0; + } + } + + // handle everything else + switch (_token.ID) + { + case TKID.CONCAT: + return (string)LeftExpression + (string)RightExpression; + + case TKID.ADD: + return (double)LeftExpression + (double)RightExpression; + + case TKID.SUB: + return (double)LeftExpression - (double)RightExpression; + + case TKID.MUL: + return (double)LeftExpression * (double)RightExpression; + + case TKID.DIV: + if (Math.Abs((double)RightExpression) < double.Epsilon) + throw new DivisionByZeroException(); + + return (double)LeftExpression / (double)RightExpression; + + case TKID.DIVINT: + if (Math.Abs((double)RightExpression) < double.Epsilon) + throw new DivisionByZeroException(); + + return (double)(int)((double)LeftExpression / (double)RightExpression); + + case TKID.MOD: + if (Math.Abs((double)RightExpression) < double.Epsilon) + throw new DivisionByZeroException(); + + return (double)(int)((double)LeftExpression % (double)RightExpression); + + case TKID.POWER: + var a = (double)LeftExpression; + var b = (double)RightExpression; + if (b == 0.0) return 1.0; + if (b == 0.5) return Math.Sqrt(a); + if (b == 1.0) return a; + if (b == 2.0) return a * a; + if (b == 3.0) return a * a * a; + if (b == 4.0) return a * a * a * a; + return Math.Pow((double)LeftExpression, (double)RightExpression); + } + throw new ArgumentException("Bad expression."); + } + + public override Expression Optimize() + { + LeftExpression = LeftExpression.Optimize(); + RightExpression = RightExpression.Optimize(); + return LeftExpression._token.Type == TKTYPE.LITERAL && RightExpression._token.Type == TKTYPE.LITERAL + ? new Expression(this.Evaluate()) + : this; + } + + public override string LastParseItem + { + get { return RightExpression.LastParseItem; } + } + } + + /// + /// Function call expression, e.g. sin(0.5) + /// + internal class FunctionExpression : Expression + { + // ** ctor + internal FunctionExpression() + { } + + public FunctionExpression(FunctionDefinition function, List parms) + { + FunctionDefinition = function; + Parameters = parms; + } + + // ** object model + override public object Evaluate() + { + return FunctionDefinition.Function(Parameters); + } + + public FunctionDefinition FunctionDefinition { get; } + public List Parameters { get; } + + public override Expression Optimize() + { + bool allLits = true; + if (Parameters != null) + { + for (int i = 0; i < Parameters.Count; i++) + { + var p = Parameters[i].Optimize(); + Parameters[i] = p; + if (p._token.Type != TKTYPE.LITERAL) + { + allLits = false; + } + } + } + return allLits + ? new Expression(this.Evaluate()) + : this; + } + + public override string LastParseItem + { + get { return Parameters.Last().LastParseItem; } + } + } + + /// + /// Simple variable reference. + /// + internal class VariableExpression : Expression + { + private readonly Dictionary _dct; + private readonly string _name; + + public VariableExpression(Dictionary dct, string name) + { + _dct = dct; + _name = name; + } + + public override object Evaluate() + { + return _dct[_name]; + } + + public override string LastParseItem + { + get { return _name; } + } + } + + /// + /// Expression that represents an external object. + /// + internal class XObjectExpression : Expression, IEnumerable + { + private readonly object _value; + + // ** ctor + internal XObjectExpression(object value) + { + _value = value; + } + + public object Value { get { return _value; } } + + // ** object model + public override object Evaluate() + { + // use IValueObject if available + var iv = _value as IValueObject; + if (iv != null) + { + return iv.GetValue(); + } + + // return raw object + return _value; + } + + public IEnumerator GetEnumerator() + { + if (_value is string s) + { + yield return s; + } + else if (_value is IEnumerable ie) + { + foreach (var o in ie) + yield return o; + } + else + { + yield return _value; + } + } + + public override string LastParseItem + { + get { return Value.ToString(); } + } + } + + /// + /// Expression that represents an omitted parameter. + /// + internal class EmptyValueExpression : Expression + { + internal EmptyValueExpression() + { + } + + public override string LastParseItem + { + get { return ""; } + } + } + + internal class ErrorExpression : Expression + { + internal enum ExpressionErrorType + { + CellReference, + CellValue, + DivisionByZero, + NameNotRecognized, + NoValueAvailable, + NullValue, + NumberInvalid + } + + internal ErrorExpression(ExpressionErrorType eet) + : base(new Token(eet, TKID.ATOM, TKTYPE.ERROR)) + { } + + public override object Evaluate() + { + return this._token.Value; + } + + public void ThrowApplicableException() + { + var eet = (ExpressionErrorType)_token.Value; + switch (eet) + { + // TODO: include last token in exception message + case ExpressionErrorType.CellReference: + throw new CellReferenceException(); + case ExpressionErrorType.CellValue: + throw new CellValueException(); + case ExpressionErrorType.DivisionByZero: + throw new DivisionByZeroException(); + case ExpressionErrorType.NameNotRecognized: + throw new NameNotRecognizedException(); + case ExpressionErrorType.NoValueAvailable: + throw new NoValueAvailableException(); + case ExpressionErrorType.NullValue: + throw new NullValueException(); + case ExpressionErrorType.NumberInvalid: + throw new NumberException(); + } + } + } + + /// + /// Interface supported by external objects that have to return a value + /// other than themselves (e.g. a cell range object should return the + /// cell content instead of the range itself). + /// + public interface IValueObject + { + object GetValue(); + } +} diff --git a/ClosedXML/Excel/CalcEngine/ExpressionCache.cs b/ClosedXML/Excel/CalcEngine/ExpressionCache.cs new file mode 100644 index 0000000..b688271 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/ExpressionCache.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ClosedXML.Excel.CalcEngine +{ + /// + /// Caches expressions based on their string representation. + /// This saves parsing time. + /// + /// + /// Uses weak references to avoid accumulating unused expressions. + /// + class ExpressionCache + { + Dictionary _dct; + CalcEngine _ce; + int _hitCount; + + public ExpressionCache(CalcEngine ce) + { + _ce = ce; + _dct = new Dictionary(); + } + + // gets the parsed version of a string expression + public Expression this[string expression] + { + get + { + Expression x; + if (_dct.TryGetValue(expression, out WeakReference wr) && wr.IsAlive) + { + x = wr.Target as Expression; + } + else + { + // remove all dead references from dictionary + if (wr != null && _dct.Count > 100 && _hitCount++ > 100) + { + RemoveDeadReferences(); + _hitCount = 0; + } + + // store this expression + x = _ce.Parse(expression); + _dct[expression] = new WeakReference(x); + } + return x; + } + } + + // remove all dead references from the cache + void RemoveDeadReferences() + { + for (bool done = false; !done; ) + { + done = true; + foreach (var k in _dct.Keys) + { + if (!_dct[k].IsAlive) + { + _dct.Remove(k); + done = false; + break; + } + } + } + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/ExpressionParseException.cs b/ClosedXML/Excel/CalcEngine/ExpressionParseException.cs new file mode 100644 index 0000000..2de2293 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/ExpressionParseException.cs @@ -0,0 +1,21 @@ +using System; +using System.Text; + +namespace ClosedXML.Excel.CalcEngine +{ + /// + /// The exception that is thrown when the strings to be parsed to an expression is invalid. + /// + public class ExpressionParseException : Exception + { + /// + /// Initializes a new instance of the ExpressionParseException class with a + /// specified error message. + /// + /// The message that describes the error. + public ExpressionParseException(string message) + : base(message) + { + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/FunctionDefinition.cs b/ClosedXML/Excel/CalcEngine/FunctionDefinition.cs new file mode 100644 index 0000000..5f4a55c --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/FunctionDefinition.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ClosedXML.Excel.CalcEngine +{ + /// + /// Function definition class (keeps function name, parameter counts, and delegate). + /// + internal class FunctionDefinition + { + // ** fields + public int ParmMin, ParmMax; + public CalcEngineFunction Function; + + // ** ctor + public FunctionDefinition(int parmMin, int parmMax, CalcEngineFunction function) + { + ParmMin = parmMin; + ParmMax = parmMax; + Function = function; + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/Database.cs b/ClosedXML/Excel/CalcEngine/Functions/Database.cs new file mode 100644 index 0000000..1c25747 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Functions/Database.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel.CalcEngine.Functions +{ + internal static class Database + { + public static void Register(CalcEngine ce) + { + //ce.RegisterFunction("DAVERAGE", 3, Daverage); // Returns the average of selected database entries + //ce.RegisterFunction("DCOUNT", 1, Dcount); // Counts the cells that contain numbers in a database + //ce.RegisterFunction("DCOUNTA", 1, Dcounta); // Counts nonblank cells in a database + //ce.RegisterFunction("DGET", 1, Dget); // Extracts from a database a single record that matches the specified criteria + //ce.RegisterFunction("DMAX", 1, Dmax); // Returns the maximum value from selected database entries + //ce.RegisterFunction("DMIN", 1, Dmin); // Returns the minimum value from selected database entries + //ce.RegisterFunction("DPRODUCT", 1, Dproduct); // Multiplies the values in a particular field of records that match the criteria in a database + //ce.RegisterFunction("DSTDEV", 1, Dstdev); // Estimates the standard deviation based on a sample of selected database entries + //ce.RegisterFunction("DSTDEVP", 1, Dstdevp); // Calculates the standard deviation based on the entire population of selected database entries + //ce.RegisterFunction("DSUM", 1, Dsum); // Adds the numbers in the field column of records in the database that match the criteria + //ce.RegisterFunction("DVAR", 1, Dvar); // Estimates variance based on a sample from selected database entries + //ce.RegisterFunction("DVARP", 1, Dvarp); // Calculates variance based on the entire population of selected database entries + } + + static object Daverage(List p) + { + var b = true; + foreach (var v in p) + { + b = b && (bool)v; + } + return b; + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/DateAndTime.cs b/ClosedXML/Excel/CalcEngine/Functions/DateAndTime.cs new file mode 100644 index 0000000..2e11991 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Functions/DateAndTime.cs @@ -0,0 +1,408 @@ +using ClosedXML.Excel.CalcEngine.Exceptions; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +namespace ClosedXML.Excel.CalcEngine.Functions +{ + internal static class DateAndTime + { + public static void Register(CalcEngine ce) + { + ce.RegisterFunction("DATE", 3, Date); // Returns the serial number of a particular date + ce.RegisterFunction("DATEDIF", 3, Datedif); // Calculates the number of days, months, or years between two dates + ce.RegisterFunction("DATEVALUE", 1, Datevalue); // Converts a date in the form of text to a serial number + ce.RegisterFunction("DAY", 1, Day); // Converts a serial number to a day of the month + ce.RegisterFunction("DAYS", 2, Days); // Returns the number of days between two dates. + ce.RegisterFunction("DAYS360", 2, 3, Days360); // Calculates the number of days between two dates based on a 360-day year + ce.RegisterFunction("EDATE", 2, Edate); // Returns the serial number of the date that is the indicated number of months before or after the start date + ce.RegisterFunction("EOMONTH", 2, Eomonth); // Returns the serial number of the last day of the month before or after a specified number of months + ce.RegisterFunction("HOUR", 1, Hour); // Converts a serial number to an hour + ce.RegisterFunction("ISOWEEKNUM", 1, IsoWeekNum); // Returns number of the ISO week number of the year for a given date. + ce.RegisterFunction("MINUTE", 1, Minute); // Converts a serial number to a minute + ce.RegisterFunction("MONTH", 1, Month); // Converts a serial number to a month + ce.RegisterFunction("NETWORKDAYS", 2, 3, Networkdays); // Returns the number of whole workdays between two dates + ce.RegisterFunction("NOW", 0, Now); // Returns the serial number of the current date and time + ce.RegisterFunction("SECOND", 1, Second); // Converts a serial number to a second + ce.RegisterFunction("TIME", 3, Time); // Returns the serial number of a particular time + ce.RegisterFunction("TIMEVALUE", 1, Timevalue); // Converts a time in the form of text to a serial number + ce.RegisterFunction("TODAY", 0, Today); // Returns the serial number of today's date + ce.RegisterFunction("WEEKDAY", 1, 2, Weekday); // Converts a serial number to a day of the week + ce.RegisterFunction("WEEKNUM", 1, 2, Weeknum); // Converts a serial number to a number representing where the week falls numerically with a year + ce.RegisterFunction("WORKDAY", 2, 3, Workday); // Returns the serial number of the date before or after a specified number of workdays + ce.RegisterFunction("YEAR", 1, Year); // Converts a serial number to a year + ce.RegisterFunction("YEARFRAC", 2, 3, Yearfrac); // Returns the year fraction representing the number of whole days between start_date and end_date + } + + /// + /// Calculates number of business days, taking into account: + /// - weekends (Saturdays and Sundays) + /// - bank holidays in the middle of the week + /// + /// First day in the time interval + /// Last day in the time interval + /// List of bank holidays excluding weekends + /// Number of business days during the 'span' + private static int BusinessDaysUntil(DateTime firstDay, DateTime lastDay, IEnumerable bankHolidays) + { + firstDay = firstDay.Date; + lastDay = lastDay.Date; + if (firstDay > lastDay) + return -BusinessDaysUntil(lastDay, firstDay, bankHolidays); + + TimeSpan span = lastDay - firstDay; + int businessDays = span.Days + 1; + int fullWeekCount = businessDays / 7; + // find out if there are weekends during the time exceedng the full weeks + if (businessDays > fullWeekCount * 7) + { + // we are here to find out if there is a 1-day or 2-days weekend + // in the time interval remaining after subtracting the complete weeks + var firstDayOfWeek = (int)firstDay.DayOfWeek; + var lastDayOfWeek = (int)lastDay.DayOfWeek; + if (lastDayOfWeek < firstDayOfWeek) + lastDayOfWeek += 7; + if (firstDayOfWeek <= 6) + { + if (lastDayOfWeek >= 7)// Both Saturday and Sunday are in the remaining time interval + businessDays -= 2; + else if (lastDayOfWeek >= 6)// Only Saturday is in the remaining time interval + businessDays -= 1; + } + else if (firstDayOfWeek <= 7 && lastDayOfWeek >= 7)// Only Sunday is in the remaining time interval + businessDays -= 1; + } + + // subtract the weekends during the full weeks in the interval + businessDays -= fullWeekCount + fullWeekCount; + + // subtract the number of bank holidays during the time interval + foreach (var bh in bankHolidays) + { + if (firstDay <= bh && bh <= lastDay) + --businessDays; + } + + return businessDays; + } + + private static object Date(List p) + { + var year = (int)p[0]; + var month = (int)p[1]; + var day = (int)p[2]; + + // Excel allows months and days outside the normal range, and adjusts the date accordingly + if (month > 12 || month < 1) + { + year += (int)Math.Floor((double)(month - 1d) / 12.0); + month -= (int)Math.Floor((double)(month - 1d) / 12.0) * 12; + } + + int daysAdjustment = 0; + if (day > DateTime.DaysInMonth(year, month)) + { + daysAdjustment = day - DateTime.DaysInMonth(year, month); + day = DateTime.DaysInMonth(year, month); + } + else if (day < 1) + { + daysAdjustment = day - 1; + day = 1; + } + + return (int)Math.Floor(new DateTime(year, month, day).AddDays(daysAdjustment).ToOADate()); + } + + private static object Datedif(List p) + { + DateTime startDate = p[0]; + DateTime endDate = p[1]; + string unit = p[2]; + + if (startDate > endDate) + throw new NumberException("The start date is greater than the end date"); + + return (unit.ToUpper()) switch + { + "Y" => endDate.Year - startDate.Year - (new DateTime(startDate.Year, endDate.Month, endDate.Day) < startDate ? 1 : 0), + "M" => Math.Truncate((endDate.Year - startDate.Year) * 12d + endDate.Month - startDate.Month - (endDate.Day < startDate.Day ? 1 : 0)), + "D" => Math.Truncate(endDate.Date.Subtract(startDate.Date).TotalDays), + + // Microsoft discouranges the use of the MD parameter + // https://support.microsoft.com/en-us/office/datedif-function-25dba1a4-2812-480b-84dd-8b32a451b35c + "MD" => (endDate.Day - startDate.Day + DateTime.DaysInMonth(startDate.Year, startDate.Month)) % DateTime.DaysInMonth(startDate.Year, startDate.Month), + + "YM" => (endDate.Month - startDate.Month + 12) % 12 - (endDate.Day < startDate.Day ? 1 : 0), + "YD" => Math.Truncate(new DateTime(startDate.Year + (new DateTime(startDate.Year, endDate.Month, endDate.Day) < startDate ? 1 : 0), endDate.Month, endDate.Day).Subtract(startDate).TotalDays), + _ => throw new NumberException(), + }; + } + + private static object Datevalue(List p) + { + var date = (string)p[0]; + + return (int)Math.Floor(DateTime.Parse(date).ToOADate()); + } + + private static object Day(List p) + { + var date = (DateTime)p[0]; + + return date.Day; + } + + private static object Days(List p) + { + Type type; + + int end_date; + + type = p[0]._token.Value.GetType(); + if (type == typeof(string)) + end_date = (int)Datevalue(new List() { p[0] }); + else + end_date = (int)p[0]; + + int start_date; + + type = p[1]._token.Value.GetType(); + if (type == typeof(string)) + start_date = (int)Datevalue(new List() { p[1] }); + else + start_date = (int)p[1]; + + return end_date - start_date; + } + + private static object Days360(List p) + { + var date1 = (DateTime)p[0]; + var date2 = (DateTime)p[1]; + var isEuropean = p.Count == 3 ? p[2] : false; + + return Days360(date1, date2, isEuropean); + } + + private static Int32 Days360(DateTime date1, DateTime date2, Boolean isEuropean) + { + var d1 = date1.Day; + var m1 = date1.Month; + var y1 = date1.Year; + var d2 = date2.Day; + var m2 = date2.Month; + var y2 = date2.Year; + + if (isEuropean) + { + if (d1 == 31) d1 = 30; + if (d2 == 31) d2 = 30; + } + else + { + if (d1 == 31) d1 = 30; + if (d2 == 31 && d1 == 30) d2 = 30; + } + + return 360 * (y2 - y1) + 30 * (m2 - m1) + (d2 - d1); + } + + private static object Edate(List p) + { + var date = (DateTime)p[0]; + var mod = (int)p[1]; + + var retDate = date.AddMonths(mod); + return retDate; + } + + private static object Eomonth(List p) + { + var start_date = (DateTime)p[0]; + var months = (int)p[1]; + + var retDate = start_date.AddMonths(months); + return new DateTime(retDate.Year, retDate.Month, DateTime.DaysInMonth(retDate.Year, retDate.Month)); + } + + private static Double GetYearAverage(DateTime date1, DateTime date2) + { + var daysInYears = new List(); + for (int year = date1.Year; year <= date2.Year; year++) + daysInYears.Add(DateTime.IsLeapYear(year) ? 366 : 365); + return daysInYears.Average(); + } + + private static object Hour(List p) + { + var date = (DateTime)p[0]; + + return date.Hour; + } + + // http://stackoverflow.com/questions/11154673/get-the-correct-week-number-of-a-given-date + private static object IsoWeekNum(List p) + { + var date = (DateTime)p[0]; + + // Seriously cheat. If its Monday, Tuesday or Wednesday, then it'll + // be the same week# as whatever Thursday, Friday or Saturday are, + // and we always get those right + DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(date); + if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday) + { + date = date.AddDays(3); + } + + // Return the week of our adjusted day + return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); + } + + private static object Minute(List p) + { + var date = (DateTime)p[0]; + + return date.Minute; + } + + private static object Month(List p) + { + var date = (DateTime)p[0]; + + return date.Month; + } + + private static object Networkdays(List p) + { + var date1 = (DateTime)p[0]; + var date2 = (DateTime)p[1]; + var bankHolidays = new List(); + if (p.Count == 3) + { + var t = new Tally { p[2] }; + + bankHolidays.AddRange(t.Select(XLHelper.GetDate)); + } + + return BusinessDaysUntil(date1, date2, bankHolidays); + } + + private static object Now(List p) + { + return DateTime.Now; + } + + private static object Second(List p) + { + var date = (DateTime)p[0]; + + return date.Second; + } + + private static object Time(List p) + { + var hour = (int)p[0]; + var minute = (int)p[1]; + var second = (int)p[2]; + + return new TimeSpan(0, hour, minute, second); + } + + private static object Timevalue(List p) + { + var date = (DateTime)p[0]; + + return (DateTime.MinValue + date.TimeOfDay).ToOADate(); + } + + private static object Today(List p) + { + return DateTime.Today; + } + + private static object Weekday(List p) + { + var dayOfWeek = (int)((DateTime)p[0]).DayOfWeek; + var retType = p.Count == 2 ? (int)p[1] : 1; + + if (retType == 2) return dayOfWeek; + if (retType == 1) return dayOfWeek + 1; + + return dayOfWeek - 1; + } + + private static object Weeknum(List p) + { + var date = (DateTime)p[0]; + var retType = p.Count == 2 ? (int)p[1] : 1; + + DayOfWeek dayOfWeek = retType == 1 ? DayOfWeek.Sunday : DayOfWeek.Monday; + var cal = new GregorianCalendar(GregorianCalendarTypes.Localized); + var val = cal.GetWeekOfYear(date, CalendarWeekRule.FirstDay, dayOfWeek); + + return val; + } + + private static object Workday(List p) + { + var startDate = (DateTime)p[0]; + var daysRequired = (int)p[1]; + + if (daysRequired == 0) return startDate; + + var bankHolidays = new List(); + if (p.Count == 3) + { + var t = new Tally { p[2] }; + + bankHolidays.AddRange(t.Select(XLHelper.GetDate)); + } + var testDate = startDate.AddDays(((daysRequired / 7) + 2) * 7 * Math.Sign(daysRequired)); + var return_date = Workday(startDate, testDate, daysRequired, bankHolidays); + if (Math.Sign(daysRequired) == 1) + return_date = return_date.NextWorkday(bankHolidays); + else + return_date = return_date.PreviousWorkDay(bankHolidays); + + return return_date; + } + + private static DateTime Workday(DateTime startDate, DateTime testDate, int daysRequired, IEnumerable bankHolidays) + { + var businessDays = BusinessDaysUntil(startDate, testDate, bankHolidays); + if (businessDays == daysRequired) + return testDate; + + int days = businessDays > daysRequired ? -1 : 1; + + return Workday(startDate, testDate.AddDays(days), daysRequired, bankHolidays); + } + + private static object Year(List p) + { + var date = (DateTime)p[0]; + + return date.Year; + } + + private static object Yearfrac(List p) + { + var date1 = (DateTime)p[0]; + var date2 = (DateTime)p[1]; + var option = p.Count == 3 ? (int)p[2] : 0; + + if (option == 0) + return Days360(date1, date2, false) / 360.0; + if (option == 1) + return Math.Floor((date2 - date1).TotalDays) / GetYearAverage(date1, date2); + if (option == 2) + return Math.Floor((date2 - date1).TotalDays) / 360.0; + if (option == 3) + return Math.Floor((date2 - date1).TotalDays) / 365.0; + + return Days360(date1, date2, true) / 360.0; + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/Engineering.cs b/ClosedXML/Excel/CalcEngine/Functions/Engineering.cs new file mode 100644 index 0000000..2ae0a9f --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Functions/Engineering.cs @@ -0,0 +1,63 @@ +namespace ClosedXML.Excel.CalcEngine +{ + internal static class Engineering + { + public static void Register(CalcEngine ce) + { + // BESSELI Returns the modified Bessel function In(x) + // BESSELJ Returns the Bessel function Jn(x) + // BESSELK Returns the modified Bessel function Kn(x) + // BESSELY Returns the Bessel function Yn(x) + // BIN2DEC Converts a binary number to decimal + // BIN2HEX Converts a binary number to hexadecimal + // BIN2OCT Converts a binary number to octal + // BITAND Returns a bitwise 'And' of two numbers + // BITLSHIFT Returns a number shifted left by shift_amount bits + // BITOR Returns a bitwise 'Or' of two numbers + // BITRSHIFT Returns a number shifted right by shift_amount bits + // BITXOR Returns a bitwise 'Exclusive Or' of two numbers + // COMPLEX Converts real and imaginary coefficients into a complex number + // CONVERT Converts a number from one measurement system to another + // DEC2BIN Converts a decimal number to binary + // DEC2HEX Converts a decimal number to hexadecimal + // DEC2OCT Converts a decimal number to octal + // DELTA Tests whether two values are equal + // ERF Returns the error function + // ERF.PRECISE Returns the error function + // ERFC Returns the complementary error function + // ERFC.PRECISE Returns the complementary ERF function integrated between x and infinity + // GESTEP Tests whether a number is greater than a threshold value + // HEX2BIN Converts a hexadecimal number to binary + // HEX2DEC Converts a hexadecimal number to decimal + // HEX2OCT Converts a hexadecimal number to octal + // IMABS Returns the absolute value(modulus) of a complex number + // IMAGINARY Returns the imaginary coefficient of a complex number + // IMARGUMENT Returns the argument theta, an angle expressed in radians + // IMCONJUGATE Returns the complex conjugate of a complex number + // IMCOS Returns the cosine of a complex number + // IMCOSH Returns the hyperbolic cosine of a complex number + // IMCOT Returns the cotangent of a complex number + // IMCSC Returns the cosecant of a complex number + // IMCSCH Returns the hyperbolic cosecant of a complex number + // IMDIV Returns the quotient of two complex numbers + // IMEXP Returns the exponential of a complex number + // IMLN Returns the natural logarithm of a complex number + // IMLOG10 Returns the base - 10 logarithm of a complex number + // IMLOG2 Returns the base - 2 logarithm of a complex number + // IMPOWER Returns a complex number raised to an integer power + // IMPRODUCT Returns the product of from 2 to 255 complex numbers + // IMREAL Returns the real coefficient of a complex number + // IMSEC Returns the secant of a complex number + // IMSECH Returns the hyperbolic secant of a complex number + // IMSIN Returns the sine of a complex number + // IMSINH Returns the hyperbolic sine of a complex number + // IMSQRT Returns the square root of a complex number + // IMSUB Returns the difference between two complex numbers + // IMSUM Returns the sum of complex numbers + // IMTAN Returns the tangent of a complex number + // OCT2BIN Converts an octal number to binary + // OCT2DEC Converts an octal number to decimal + // OCT2HEX Converts an octal number to hexadecimal + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/Financial.cs b/ClosedXML/Excel/CalcEngine/Functions/Financial.cs new file mode 100644 index 0000000..d8523d9 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Functions/Financial.cs @@ -0,0 +1,64 @@ +namespace ClosedXML.Excel.CalcEngine +{ + internal static class Financial + { + public static void Register(CalcEngine ce) + { + // ACCRINT Returns the accrued interest for a security that pays periodic interest + // ACCRINTM Returns the accrued interest for a security that pays interest at maturity + // AMORDEGRC Returns the depreciation for each accounting period by using a depreciation coefficient + // AMORLINC Returns the depreciation for each accounting period + // COUPDAYBS Returns the number of days from the beginning of the coupon period to the settlement date + // COUPDAYS Returns the number of days in the coupon period that contains the settlement date + // COUPDAYSNC Returns the number of days from the settlement date to the next coupon date + // COUPNCD Returns the next coupon date after the settlement date + // COUPNUM Returns the number of coupons payable between the settlement date and maturity date + // COUPPCD Returns the previous coupon date before the settlement date + // CUMIPMT Returns the cumulative interest paid between two periods + // CUMPRINC Returns the cumulative principal paid on a loan between two periods + // DB Returns the depreciation of an asset for a specified period by using the fixed-declining balance method + // DDB Returns the depreciation of an asset for a specified period by using the double-declining balance method or some other method that you specify + // DISC Returns the discount rate for a security + // DOLLARDE Converts a dollar price, expressed as a fraction, into a dollar price, expressed as a decimal number + // DOLLARFR Converts a dollar price, expressed as a decimal number, into a dollar price, expressed as a fraction + // DURATION Returns the annual duration of a security with periodic interest payments + // EFFECT Returns the effective annual interest rate + // FV Returns the future value of an investment + // FVSCHEDULE Returns the future value of an initial principal after applying a series of compound interest rates + // INTRATE Returns the interest rate for a fully invested security + // IPMT Returns the interest payment for an investment for a given period + // IRR Returns the internal rate of return for a series of cash flows + // ISPMT Calculates the interest paid during a specific period of an investment + // MDURATION Returns the Macauley modified duration for a security with an assumed par value of $100 + // MIRR Returns the internal rate of return where positive and negative cash flows are financed at different rates + // NOMINAL Returns the annual nominal interest rate + // NPER Returns the number of periods for an investment + // NPV Returns the net present value of an investment based on a series of periodic cash flows and a discount rate + // ODDFPRICE Returns the price per $100 face value of a security with an odd first period + // ODDFYIELD Returns the yield of a security with an odd first period + // ODDLPRICE Returns the price per $100 face value of a security with an odd last period + // ODDLYIELD Returns the yield of a security with an odd last period + // PDURATION Returns the number of periods required by an investment to reach a specified value + // PMT Returns the periodic payment for an annuity + // PPMT Returns the payment on the principal for an investment for a given period + // PRICE Returns the price per $100 face value of a security that pays periodic interest + // PRICEDISC Returns the price per $100 face value of a discounted security + // PRICEMAT Returns the price per $100 face value of a security that pays interest at maturity + // PV Returns the present value of an investment + // RATE Returns the interest rate per period of an annuity + // RECEIVED Returns the amount received at maturity for a fully invested security + // RRI Returns an equivalent interest rate for the growth of an investment + // SLN Returns the straight-line depreciation of an asset for one period + // SYD Returns the sum-of-years' digits depreciation of an asset for a specified period + // TBILLEQ Returns the bond-equivalent yield for a Treasury bill + // TBILLPRICE Returns the price per $100 face value for a Treasury bill + // TBILLYIELD Returns the yield for a Treasury bill + // VDB Returns the depreciation of an asset for a specified or partial period by using a declining balance method + // XIRR Returns the internal rate of return for a schedule of cash flows that is not necessarily periodic + // XNPV Returns the net present value for a schedule of cash flows that is not necessarily periodic + // YIELD Returns the yield on a security that pays periodic interest + // YIELDDISC Returns the annual yield for a discounted security; for example, a Treasury bill + // YIELDMAT Returns the annual yield of a security that pays interest at maturity + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/Information.cs b/ClosedXML/Excel/CalcEngine/Functions/Information.cs new file mode 100644 index 0000000..be8b7bc --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Functions/Information.cs @@ -0,0 +1,216 @@ +using ClosedXML.Excel.CalcEngine.Exceptions; +using System; +using System.Collections.Generic; +using System.Globalization; + +namespace ClosedXML.Excel.CalcEngine.Functions +{ + internal static class Information + { + public static void Register(CalcEngine ce) + { + //TODO: Add documentation + ce.RegisterFunction("ERRORTYPE", 1, ErrorType); + ce.RegisterFunction("ISBLANK", 1, int.MaxValue, IsBlank); + ce.RegisterFunction("ISERR", 1, int.MaxValue, IsErr); + ce.RegisterFunction("ISERROR", 1, int.MaxValue, IsError); + ce.RegisterFunction("ISEVEN", 1, IsEven); + ce.RegisterFunction("ISLOGICAL", 1, int.MaxValue, IsLogical); + ce.RegisterFunction("ISNA", 1, int.MaxValue, IsNa); + ce.RegisterFunction("ISNONTEXT", 1, int.MaxValue, IsNonText); + ce.RegisterFunction("ISNUMBER", 1, int.MaxValue, IsNumber); + ce.RegisterFunction("ISODD", 1, IsOdd); + ce.RegisterFunction("ISREF", 1, int.MaxValue, IsRef); + ce.RegisterFunction("ISTEXT", 1, int.MaxValue, IsText); + ce.RegisterFunction("N", 1, N); + ce.RegisterFunction("NA", 0, NA); + ce.RegisterFunction("TYPE", 1, Type); + } + + static IDictionary errorTypes = new Dictionary() + { + [ErrorExpression.ExpressionErrorType.NullValue] = 1, + [ErrorExpression.ExpressionErrorType.DivisionByZero] = 2, + [ErrorExpression.ExpressionErrorType.CellValue] = 3, + [ErrorExpression.ExpressionErrorType.CellReference] = 4, + [ErrorExpression.ExpressionErrorType.NameNotRecognized] = 5, + [ErrorExpression.ExpressionErrorType.NumberInvalid] = 6, + [ErrorExpression.ExpressionErrorType.NoValueAvailable] = 7 + }; + + static object ErrorType(List p) + { + var v = p[0].Evaluate(); + + if (v is ErrorExpression.ExpressionErrorType) + return errorTypes[(ErrorExpression.ExpressionErrorType)v]; + else + throw new NoValueAvailableException(); + } + + static object IsBlank(List p) + { + var v = (string) p[0]; + var isBlank = string.IsNullOrEmpty(v); + + + if (isBlank && p.Count > 1) { + var sublist = p.GetRange(1, p.Count); + isBlank = (bool)IsBlank(sublist); + } + + return isBlank; + } + + static object IsErr(List p) + { + var v = p[0].Evaluate(); + + return v is ErrorExpression.ExpressionErrorType + && ((ErrorExpression.ExpressionErrorType)v) != ErrorExpression.ExpressionErrorType.NoValueAvailable; + } + + static object IsError(List p) + { + var v = p[0].Evaluate(); + + return v is ErrorExpression.ExpressionErrorType; + } + + static object IsEven(List p) + { + var v = p[0].Evaluate(); + if (v is double) + { + return Math.Abs((double) v%2) < 1; + } + //TODO: Error Exceptions + throw new ArgumentException("Expression doesn't evaluate to double"); + } + + static object IsLogical(List p) + { + var v = p[0].Evaluate(); + var isLogical = v is bool; + + if (isLogical && p.Count > 1) + { + var sublist = p.GetRange(1, p.Count); + isLogical = (bool) IsLogical(sublist); + } + + return isLogical; + } + + static object IsNa(List p) + { + var v = p[0].Evaluate(); + + return v is ErrorExpression.ExpressionErrorType + && ((ErrorExpression.ExpressionErrorType)v) == ErrorExpression.ExpressionErrorType.NoValueAvailable; + } + + static object IsNonText(List p) + { + return !(bool) IsText(p); + } + + static object IsNumber(List p) + { + var v = p[0].Evaluate(); + + var isNumber = v is double; //Normal number formatting + if (!isNumber) + { + isNumber = v is DateTime; //Handle DateTime Format + } + if (!isNumber) + { + //Handle Number Styles + try + { + var stringValue = (string) v; + return double.TryParse(stringValue.TrimEnd('%', ' '), NumberStyles.Any, null, out double dv); + } + catch (Exception) + { + isNumber = false; + } + } + + if (isNumber && p.Count > 1) + { + var sublist = p.GetRange(1, p.Count); + isNumber = (bool)IsNumber(sublist); + } + + return isNumber; + } + + static object IsOdd(List p) + { + return !(bool) IsEven(p); + } + + static object IsRef(List p) + { + var oe = p[0] as XObjectExpression; + if (oe == null) + return false; + + var crr = oe.Value as CellRangeReference; + + return crr != null; + } + + static object IsText(List p) + { + //Evaluate Expressions + var isText = !(bool) IsBlank(p); + if (isText) + { + isText = !(bool) IsNumber(p); + } + if (isText) + { + isText = !(bool) IsLogical(p); + } + return isText; + } + + static object N(List p) + { + return (double) p[0]; + } + + static object NA(List p) + { + return ErrorExpression.ExpressionErrorType.NoValueAvailable; + } + + static object Type(List p) + { + if ((bool) IsNumber(p)) + { + return 1; + } + if ((bool) IsText(p)) + { + return 2; + } + if ((bool) IsLogical(p)) + { + return 4; + } + if ((bool) IsError(p)) + { + return 16; + } + if(p.Count > 1) + { + return 64; + } + return null; + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/Logical.cs b/ClosedXML/Excel/CalcEngine/Functions/Logical.cs new file mode 100644 index 0000000..d5fa418 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Functions/Logical.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel.CalcEngine +{ + internal static class Logical + { + public static void Register(CalcEngine ce) + { + ce.RegisterFunction("AND", 1, int.MaxValue, And); + ce.RegisterFunction("OR", 1, int.MaxValue, Or); + ce.RegisterFunction("NOT", 1, Not); + ce.RegisterFunction("IF", 2, 3, If); + ce.RegisterFunction("TRUE", 0, True); + ce.RegisterFunction("FALSE", 0, False); + ce.RegisterFunction("IFERROR",2,IfError); + } + + static object And(List p) + { + var b = true; + foreach (var v in p) + { + b = b && v; + } + return b; + } + + static object Or(List p) + { + var b = false; + foreach (var v in p) + { + b = b || v; + } + return b; + } + + static object Not(List p) + { + return !p[0]; + } + + static object If(List p) + { + if (p[0]) + { + return p[1].Evaluate(); + } + else if (p.Count > 2) + { + if (p[2] is EmptyValueExpression) + return false; + else + return p[2].Evaluate(); + } + else return false; + } + + static object True(List p) + { + return true; + } + + static object False(List p) + { + return false; + } + + static object IfError(List p) + { + try + { + return p[0].Evaluate(); + } + catch (ArgumentException) + { + return p[1].Evaluate(); + } + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/Lookup.cs b/ClosedXML/Excel/CalcEngine/Functions/Lookup.cs new file mode 100644 index 0000000..1b9937a --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Functions/Lookup.cs @@ -0,0 +1,266 @@ +// Keep this file CodeMaid organised and cleaned +using ClosedXML.Excel.CalcEngine.Exceptions; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel.CalcEngine.Functions +{ + internal static class Lookup + { + public static void Register(CalcEngine ce) + { + //ce.RegisterFunction("ADDRESS", , Address); // Returns a reference as text to a single cell in a worksheet + //ce.RegisterFunction("AREAS", , Areas); // Returns the number of areas in a reference + //ce.RegisterFunction("CHOOSE", , Choose); // Chooses a value from a list of values + //ce.RegisterFunction("COLUMN", , Column); // Returns the column number of a reference + //ce.RegisterFunction("COLUMNS", , Columns); // Returns the number of columns in a reference + //ce.RegisterFunction("FORMULATEXT", , Formulatext); // Returns the formula at the given reference as text + //ce.RegisterFunction("GETPIVOTDATA", , Getpivotdata); // Returns data stored in a PivotTable report + ce.RegisterFunction("HLOOKUP", 3, 4, Hlookup); // Looks in the top row of an array and returns the value of the indicated cell + ce.RegisterFunction("HYPERLINK", 1, 2, Hyperlink); // Creates a shortcut or jump that opens a document stored on a network server, an intranet, or the Internet + ce.RegisterFunction("INDEX", 2, 4, Index); // Uses an index to choose a value from a reference or array + //ce.RegisterFunction("INDIRECT", , Indirect); // Returns a reference indicated by a text value + //ce.RegisterFunction("LOOKUP", , Lookup); // Looks up values in a vector or array + ce.RegisterFunction("MATCH", 2, 3, Match); // Looks up values in a reference or array + //ce.RegisterFunction("OFFSET", , Offset); // Returns a reference offset from a given reference + //ce.RegisterFunction("ROW", , Row); // Returns the row number of a reference + //ce.RegisterFunction("ROWS", , Rows); // Returns the number of rows in a reference + //ce.RegisterFunction("RTD", , Rtd); // Retrieves real-time data from a program that supports COM automation + //ce.RegisterFunction("TRANSPOSE", , Transpose); // Returns the transpose of an array + ce.RegisterFunction("VLOOKUP", 3, 4, Vlookup); // Looks in the first column of an array and moves across the row to return the value of a cell + } + + private static IXLRange ExtractRange(Expression expression) + { + if (!(expression is XObjectExpression objectExpression)) + throw new NoValueAvailableException("Parameter has to be a valid range"); + + if (!(objectExpression.Value is CellRangeReference cellRangeReference)) + throw new NoValueAvailableException("lookup_array has to be a range"); + + var range = cellRangeReference.Range; + return range; + } + + private static object Hlookup(List p) + { + var lookup_value = p[0]; + var range = ExtractRange(p[1]); + var row_index_num = (int)p[2]; + var range_lookup = p.Count < 4 + || p[3] is EmptyValueExpression + || (bool)(p[3]); + + if (row_index_num < 1) + throw new CellReferenceException("Row index has to be positive"); + + if (row_index_num > range.RowCount()) + throw new CellReferenceException("Row index has to be positive"); + + IXLRangeColumn matching_column; + matching_column = range.FindColumn(c => !c.Cell(1).IsEmpty() && new Expression(c.Cell(1).Value).CompareTo(lookup_value) == 0); + if (range_lookup && matching_column == null) + { + var first_column = range.FirstColumn().ColumnNumber(); + var number_of_columns_in_range = range.ColumnsUsed().Count(); + + matching_column = range.FindColumn(c => + { + var column_index_in_range = c.ColumnNumber() - first_column + 1; + if (column_index_in_range < number_of_columns_in_range && !c.Cell(1).IsEmpty() && new Expression(c.Cell(1).Value).CompareTo(lookup_value) <= 0 && !c.ColumnRight().Cell(1).IsEmpty() && new Expression(c.ColumnRight().Cell(1).Value).CompareTo(lookup_value) > 0) + return true; + else if (column_index_in_range == number_of_columns_in_range && !c.Cell(1).IsEmpty() && new Expression(c.Cell(1).Value).CompareTo(lookup_value) <= 0) + return true; + else + return false; + }); + } + + if (matching_column == null) + throw new NoValueAvailableException("No matches found."); + + return matching_column + .Cell(row_index_num) + .Value; + } + + private static object Hyperlink(List p) + { + String address = p[0]; + String toolTip = p.Count == 2 ? p[1] : String.Empty; + return new XLHyperlink(address, toolTip); + } + + private static object Index(List p) + { + // This is one of the few functions that is "overloaded" + var range = ExtractRange(p[0]); + + if (range.ColumnCount() > 1 && range.RowCount() > 1) + { + var row_num = (int)p[1]; + var column_num = (int)p[2]; + + if (row_num > range.RowCount()) + throw new CellReferenceException("Out of bound row number"); + + if (column_num > range.ColumnCount()) + throw new CellReferenceException("Out of bound column number"); + + return range.Row(row_num).Cell(column_num).Value; + } + else if (p.Count == 2) + { + var cellOffset = (int)p[1]; + if (cellOffset > range.RowCount() * range.ColumnCount()) + throw new CellReferenceException(); + + return range.Cells().ElementAt(cellOffset - 1).Value; + } + else + { + int column_num = 1; + int row_num = 1; + + if (!(p[1] is EmptyValueExpression)) + row_num = (int)p[1]; + + if (!(p[2] is EmptyValueExpression)) + column_num = (int)p[2]; + + var rangeIsRow = range.RowCount() == 1; + if (rangeIsRow && row_num > 1) + throw new CellReferenceException(); + + if (!rangeIsRow && column_num > 1) + throw new CellReferenceException(); + + if (row_num > range.RowCount()) + throw new CellReferenceException("Out of bound row number"); + + if (column_num > range.ColumnCount()) + throw new CellReferenceException("Out of bound column number"); + + return range.Row(row_num).Cell(column_num).Value; + } + } + + private static object Match(List p) + { + var lookup_value = p[0]; + var range = ExtractRange(p[1]); + int match_type = 1; + if (p.Count > 2) + match_type = Math.Sign((int)p[2]); + + if (range.ColumnCount() != 1 && range.RowCount() != 1) + throw new CellValueException("Range has to be 1-dimensional"); + + Predicate lookupPredicate = null; + switch (match_type) + { + case 0: + lookupPredicate = i => i == 0; + break; + + case 1: + lookupPredicate = i => i <= 0; + break; + + case -1: + lookupPredicate = i => i >= 0; + break; + + default: + throw new NoValueAvailableException("Invalid match_type"); + } + + IXLCell foundCell = null; + + if (match_type == 0) + foundCell = range + .CellsUsed(XLCellsUsedOptions.Contents, c => lookupPredicate.Invoke(new Expression(c.Value).CompareTo(lookup_value))) + .FirstOrDefault(); + else + { + object previousValue = null; + foundCell = range + .CellsUsed(XLCellsUsedOptions.Contents) + .TakeWhile(c => + { + var currentCellExpression = new Expression(c.Value); + + if (previousValue != null) + { + // When match_type != 0, we have to assume that the order of the items being search is ascending or descending + var previousValueExpression = new Expression(previousValue); + if (!lookupPredicate.Invoke(previousValueExpression.CompareTo(currentCellExpression))) + return false; + } + + previousValue = c.Value; + + return lookupPredicate.Invoke(currentCellExpression.CompareTo(lookup_value)); + }) + .LastOrDefault(); + } + + if (foundCell == null) + throw new NoValueAvailableException(); + + var firstCell = range.FirstCell(); + + return (foundCell.Address.ColumnNumber - firstCell.Address.ColumnNumber + 1) * (foundCell.Address.RowNumber - firstCell.Address.RowNumber + 1); + } + + private static object Vlookup(List p) + { + var lookup_value = p[0]; + var range = ExtractRange(p[1]); + var col_index_num = (int)p[2]; + var range_lookup = p.Count < 4 + || p[3] is EmptyValueExpression + || (bool)(p[3]); + + if (col_index_num < 1) + throw new CellReferenceException("Column index has to be positive"); + + if (col_index_num > range.ColumnCount()) + throw new CellReferenceException("Colum index must be smaller or equal to the number of columns in the table array"); + + IXLRangeRow matching_row; + try + { + matching_row = range.FindRow(r => !r.Cell(1).IsEmpty() && new Expression(r.Cell(1).Value).CompareTo(lookup_value) == 0); + } + catch (Exception ex) + { + throw new NoValueAvailableException("No matches found", ex); + } + if (range_lookup && matching_row == null) + { + var first_row = range.FirstRow().RowNumber(); + var number_of_rows_in_range = range.RowsUsed().Count(); + + matching_row = range.FindRow(r => + { + var row_index_in_range = r.RowNumber() - first_row + 1; + if (row_index_in_range < number_of_rows_in_range && !r.Cell(1).IsEmpty() && new Expression(r.Cell(1).Value).CompareTo(lookup_value) <= 0 && !r.RowBelow().Cell(1).IsEmpty() && new Expression(r.RowBelow().Cell(1).Value).CompareTo(lookup_value) > 0) + return true; + else if (row_index_in_range == number_of_rows_in_range && !r.Cell(1).IsEmpty() && new Expression(r.Cell(1).Value).CompareTo(lookup_value) <= 0) + return true; + else + return false; + }); + } + + if (matching_row == null) + throw new NoValueAvailableException("No matches found."); + + return matching_row + .Cell(col_index_num) + .Value; + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs b/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs new file mode 100644 index 0000000..7e6dd81 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs @@ -0,0 +1,1095 @@ +using ClosedXML.Excel.CalcEngine.Exceptions; +using ClosedXML.Excel.CalcEngine.Functions; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel.CalcEngine +{ + internal static class MathTrig + { + private static readonly Random _rnd = new Random(); + + public static void Register(CalcEngine ce) + { + ce.RegisterFunction("ABS", 1, Abs); + ce.RegisterFunction("ACOS", 1, Acos); + ce.RegisterFunction("ACOSH", 1, Acosh); + ce.RegisterFunction("ACOT", 1, Acot); + ce.RegisterFunction("ACOTH", 1, Acoth); + ce.RegisterFunction("ARABIC", 1, Arabic); + ce.RegisterFunction("ASIN", 1, Asin); + ce.RegisterFunction("ASINH", 1, Asinh); + ce.RegisterFunction("ATAN", 1, Atan); + ce.RegisterFunction("ATAN2", 2, Atan2); + ce.RegisterFunction("ATANH", 1, Atanh); + ce.RegisterFunction("BASE", 2, 3, Base); + ce.RegisterFunction("CEILING", 2, Ceiling); + ce.RegisterFunction("CEILING.MATH", 1, 3, CeilingMath); + ce.RegisterFunction("COMBIN", 2, Combin); + ce.RegisterFunction("COMBINA", 2, CombinA); + ce.RegisterFunction("COS", 1, Cos); + ce.RegisterFunction("COSH", 1, Cosh); + ce.RegisterFunction("COT", 1, Cot); + ce.RegisterFunction("COTH", 1, Coth); + ce.RegisterFunction("CSC", 1, Csc); + ce.RegisterFunction("CSCH", 1, Csch); + ce.RegisterFunction("DECIMAL", 2, MathTrig.Decimal); + ce.RegisterFunction("DEGREES", 1, Degrees); + ce.RegisterFunction("EVEN", 1, Even); + ce.RegisterFunction("EXP", 1, Exp); + ce.RegisterFunction("FACT", 1, Fact); + ce.RegisterFunction("FACTDOUBLE", 1, FactDouble); + ce.RegisterFunction("FLOOR", 2, Floor); + ce.RegisterFunction("FLOOR.MATH", 1, 3, FloorMath); + ce.RegisterFunction("GCD", 1, 255, Gcd); + ce.RegisterFunction("INT", 1, Int); + ce.RegisterFunction("LCM", 1, 255, Lcm); + ce.RegisterFunction("LN", 1, Ln); + ce.RegisterFunction("LOG", 1, 2, Log); + ce.RegisterFunction("LOG10", 1, Log10); + ce.RegisterFunction("MDETERM", 1, MDeterm); + ce.RegisterFunction("MINVERSE", 1, MInverse); + ce.RegisterFunction("MMULT", 2, MMult); + ce.RegisterFunction("MOD", 2, Mod); + ce.RegisterFunction("MROUND", 2, MRound); + ce.RegisterFunction("MULTINOMIAL", 1, 255, Multinomial); + ce.RegisterFunction("ODD", 1, Odd); + ce.RegisterFunction("PI", 0, Pi); + ce.RegisterFunction("POWER", 2, Power); + ce.RegisterFunction("PRODUCT", 1, 255, Product); + ce.RegisterFunction("QUOTIENT", 2, Quotient); + ce.RegisterFunction("RADIANS", 1, Radians); + ce.RegisterFunction("RAND", 0, Rand); + ce.RegisterFunction("RANDBETWEEN", 2, RandBetween); + ce.RegisterFunction("ROMAN", 1, 2, Roman); + ce.RegisterFunction("ROUND", 2, Round); + ce.RegisterFunction("ROUNDDOWN", 2, RoundDown); + ce.RegisterFunction("ROUNDUP", 1, 2, RoundUp); + ce.RegisterFunction("SEC", 1, Sec); + ce.RegisterFunction("SECH", 1, Sech); + ce.RegisterFunction("SERIESSUM", 4, SeriesSum); + ce.RegisterFunction("SIGN", 1, Sign); + ce.RegisterFunction("SIN", 1, Sin); + ce.RegisterFunction("SINH", 1, Sinh); + ce.RegisterFunction("SQRT", 1, Sqrt); + ce.RegisterFunction("SQRTPI", 1, SqrtPi); + ce.RegisterFunction("SUBTOTAL", 2, 255, Subtotal); + ce.RegisterFunction("SUM", 1, int.MaxValue, Sum); + ce.RegisterFunction("SUMIF", 2, 3, SumIf); + ce.RegisterFunction("SUMIFS", 3, 255, SumIfs); + ce.RegisterFunction("SUMPRODUCT", 1, 30, SumProduct); + ce.RegisterFunction("SUMSQ", 1, 255, SumSq); + //ce.RegisterFunction("SUMX2MY2", SumX2MY2, 1); + //ce.RegisterFunction("SUMX2PY2", SumX2PY2, 1); + //ce.RegisterFunction("SUMXMY2", SumXMY2, 1); + ce.RegisterFunction("TAN", 1, Tan); + ce.RegisterFunction("TANH", 1, Tanh); + ce.RegisterFunction("TRUNC", 1, 2, Trunc); + } + + private static object Abs(List p) + { + return Math.Abs(p[0]); + } + + private static object Acos(List p) + { + double input = p[0]; + if (Math.Abs(input) > 1) + throw new NumberException(); + + return Math.Acos(p[0]); + } + + private static object Asin(List p) + { + double input = p[0]; + if (Math.Abs(input) > 1) + throw new NumberException(); + + return Math.Asin(input); + } + + private static object Atan(List p) + { + return Math.Atan(p[0]); + } + + private static object Atan2(List p) + { + double x = p[0]; + double y = p[1]; + if (x == 0 && y == 0) + throw new DivisionByZeroException(); + + return Math.Atan2(y, x); + } + + private static object Ceiling(List p) + { + double number = p[0]; + double significance = p[1]; + + if (significance == 0) + return 0d; + else if (significance < 0 && number > 0) + throw new NumberException(); + else if (significance < 0) + return -Math.Ceiling(-number / -significance) * -significance; + else + return Math.Ceiling(number / significance) * significance; + } + + private static object CeilingMath(List p) + { + double number = p[0]; + double significance = 1; + if (p.Count > 1) significance = p[1]; + + double mode = 0; + if (p.Count > 2) mode = p[2]; + + if (significance == 0) + return 0d; + else if (number >= 0) + return Math.Ceiling(number / Math.Abs(significance)) * Math.Abs(significance); + else if (mode == 0) + return Math.Ceiling(number / Math.Abs(significance)) * Math.Abs(significance); + else + return -Math.Ceiling(-number / Math.Abs(significance)) * Math.Abs(significance); + } + + private static object Cos(List p) + { + return Math.Cos(p[0]); + } + + private static object Cosh(List p) + { + return Math.Cosh(p[0]); + } + + private static object Cot(List p) + { + var tan = (double)Math.Tan(p[0]); + + if (tan == 0) + throw new DivisionByZeroException(); + + return 1 / tan; + } + + private static object Coth(List p) + { + double input = p[0]; + if (input == 0) + throw new DivisionByZeroException(); + + return 1 / Math.Tanh(input); + } + + private static object Csc(List p) + { + double input = p[0]; + if (input == 0) + throw new DivisionByZeroException(); + + return 1 / Math.Sin(input); + } + + private static object Csch(List p) + { + if (Math.Abs((double)p[0].Evaluate()) < Double.Epsilon) + throw new DivisionByZeroException(); + + return 1 / Math.Sinh(p[0]); + } + + private static object Decimal(List p) + { + string source = p[0]; + double radix = p[1]; + + if (radix < 2 || radix > 36) + throw new NumberException(); + + var asciiValues = Encoding.ASCII.GetBytes(source.ToUpperInvariant()); + + double result = 0; + int i = 0; + + foreach (byte digit in asciiValues) + { + if (digit > 90) + { + throw new NumberException(); + } + + int digitNumber = digit >= 48 && digit < 58 + ? digit - 48 + : digit - 55; + + if (digitNumber > radix - 1) + throw new NumberException(); + + result = result * radix + digitNumber; + i++; + } + + return result; + } + + private static object Exp(List p) + { + return Math.Exp(p[0]); + } + + private static object Floor(List p) + { + double number = p[0]; + double significance = p[1]; + + if (significance == 0) + throw new DivisionByZeroException(); + else if (significance < 0 && number > 0) + throw new NumberException(); + else if (significance < 0) + return -Math.Floor(-number / -significance) * -significance; + else + return Math.Floor(number / significance) * significance; + } + + private static object FloorMath(List p) + { + double number = p[0]; + double significance = 1; + if (p.Count > 1) significance = p[1]; + + double mode = 0; + if (p.Count > 2) mode = p[2]; + + if (significance == 0) + return 0d; + else if (number >= 0) + return Math.Floor(number / Math.Abs(significance)) * Math.Abs(significance); + else if (mode == 0) + return Math.Floor(number / Math.Abs(significance)) * Math.Abs(significance); + else + return -Math.Floor(-number / Math.Abs(significance)) * Math.Abs(significance); + } + + private static object Int(List p) + { + return Math.Floor(p[0]); + } + + private static object Ln(List p) + { + return Math.Log(p[0]); + } + + private static object Log(List p) + { + var lbase = p.Count > 1 ? (double)p[1] : 10; + return Math.Log(p[0], lbase); + } + + private static object Log10(List p) + { + return Math.Log10(p[0]); + } + + private static object Pi(List p) + { + return Math.PI; + } + + private static object Power(List p) + { + return Math.Pow(p[0], p[1]); + } + + private static object Rand(List p) + { + return _rnd.NextDouble(); + } + + private static object RandBetween(List p) + { + return _rnd.Next((int)(double)p[0], (int)(double)p[1]); + } + + private static object Sign(List p) + { + return Math.Sign(p[0]); + } + + private static object Sin(List p) + { + return Math.Sin(p[0]); + } + + private static object Sinh(List p) + { + return Math.Sinh(p[0]); + } + + private static object Sqrt(List p) + { + return Math.Sqrt(p[0]); + } + + private static object Sum(List p) + { + var tally = new Tally(); + foreach (var e in p) + { + tally.Add(e); + } + return tally.Sum(); + } + + private static object SumIf(List p) + { + // get parameters + var range = p[0] as IEnumerable; // range of values to match the criteria against + var sumRange = p.Count < 3 ? + p[0] as XObjectExpression : + p[2] as XObjectExpression; // range of values to sum up + var criteria = p[1].Evaluate(); // the criteria to evaluate + + var rangeValues = range.Cast().ToList(); + var sumRangeValues = sumRange.Cast().ToList(); + + // compute total + var ce = new CalcEngine(); + var tally = new Tally(); + for (var i = 0; i < Math.Max(rangeValues.Count, sumRangeValues.Count); i++) + { + var targetValue = i < rangeValues.Count ? rangeValues[i] : string.Empty; + if (CalcEngineHelpers.ValueSatisfiesCriteria(targetValue, criteria, ce)) + { + var value = i < sumRangeValues.Count ? sumRangeValues[i] : 0d; + tally.AddValue(value); + } + } + + // done + return tally.Sum(); + } + + private static object SumIfs(List p) + { + // get parameters + var sumRange = p[0] as IEnumerable; + + var sumRangeValues = new List(); + foreach (var value in sumRange) + { + sumRangeValues.Add(value); + } + + var ce = new CalcEngine(); + var tally = new Tally(); + + int numberOfCriteria = p.Count / 2; // int division returns floor() automatically, that's what we want. + + // prepare criteria-parameters: + var criteriaRanges = new Tuple>[numberOfCriteria]; + for (int criteriaPair = 0; criteriaPair < numberOfCriteria; criteriaPair++) + { + var criteriaRange = p[criteriaPair * 2 + 1] as IEnumerable; + + if (criteriaRange == null) + throw new CellReferenceException($"Expected parameter {criteriaPair * 2 + 2} to be a range"); + + var criterion = p[criteriaPair * 2 + 2].Evaluate(); + var criteriaRangeValues = criteriaRange.Cast().ToList(); + + criteriaRanges[criteriaPair] = new Tuple>( + criterion, + criteriaRangeValues); + } + + for (var i = 0; i < sumRangeValues.Count; i++) + { + bool shouldUseValue = true; + + foreach (var criteriaPair in criteriaRanges) + { + if (!CalcEngineHelpers.ValueSatisfiesCriteria( + i < criteriaPair.Item2.Count ? criteriaPair.Item2[i] : string.Empty, + criteriaPair.Item1, + ce)) + { + shouldUseValue = false; + break; // we're done with the inner loop as we can't ever get true again. + } + } + + if (shouldUseValue) + tally.AddValue(sumRangeValues[i]); + } + + // done + return tally.Sum(); + } + + private static object SumProduct(List p) + { + // all parameters should be IEnumerable + if (p.Any(param => !(param is IEnumerable))) + throw new NoValueAvailableException(); + + var counts = p.Cast().Select(param => + { + int i = 0; + foreach (var item in param) + i++; + return i; + }) + .Distinct(); + + // All parameters should have the same length + if (counts.Count() > 1) + throw new NoValueAvailableException(); + + var values = p + .Cast() + .Select(range => + { + var results = new List(); + foreach (var c in range) + { + if (c.IsNumber()) + results.Add(c.CastTo()); + else + results.Add(0.0); + } + return results; + }) + .ToArray(); + + return Enumerable.Range(0, counts.Single()) + .Aggregate(0d, (t, i) => + t + values.Aggregate(1d, + (product, list) => product * list[i] + ) + ); + } + + private static object Tan(List p) + { + return Math.Tan(p[0]); + } + + private static object Tanh(List p) + { + return Math.Tanh(p[0]); + } + + private static object Trunc(List p) + { + var number = (double)p[0]; + + var num_digits = 0d; + if (p.Count > 1) + num_digits = (double)p[1]; + + var scaling = Math.Pow(10, num_digits); + + var truncated = (int)(number * scaling); + return (double)truncated / scaling; + } + + public static double DegreesToRadians(double degrees) + { + return (Math.PI / 180.0) * degrees; + } + + public static double RadiansToDegrees(double radians) + { + return (180.0 / Math.PI) * radians; + } + + public static double GradsToRadians(double grads) + { + return (grads / 200.0) * Math.PI; + } + + public static double RadiansToGrads(double radians) + { + return (radians / Math.PI) * 200.0; + } + + public static double DegreesToGrads(double degrees) + { + return (degrees / 9.0) * 10.0; + } + + public static double GradsToDegrees(double grads) + { + return (grads / 10.0) * 9.0; + } + + public static double ASinh(double x) + { + return (Math.Log(x + Math.Sqrt(x * x + 1.0))); + } + + private static object Acosh(List p) + { + double number = p[0]; + if (number < 1) + throw new NumberException(); + + return XLMath.ACosh(p[0]); + } + + private static object Acot(List p) + { + double x = Math.Atan(1.0 / p[0]); + + // Acot in Excel calculates the modulus of the function above. + // as the % operator is not the modulus, but the remainder, we have to calculate the modulus by hand: + while (x < 0) + x = x + Math.PI; + + return x; + } + + private static object Acoth(List p) + { + double number = p[0]; + if (Math.Abs(number) < 1) + throw new NumberException(); + + return 0.5 * Math.Log((number + 1) / (number - 1)); + } + + private static object Arabic(List p) + { + string input = ((string)p[0]).Trim(); + + try + { + if (input.Length == 0) + return 0; + if (input == "-") + throw new NumberException(); + else if (input[0] == '-') + return -XLMath.RomanToArabic(input.Substring(1)); + else + return XLMath.RomanToArabic(input); + } + catch (ArgumentOutOfRangeException) + { + throw new CellValueException(); + } + catch + { + throw; + } + } + + private static object Asinh(List p) + { + return XLMath.ASinh(p[0]); + } + + private static object Atanh(List p) + { + double input = p[0]; + if (Math.Abs(input) >= 1) + throw new NumberException(); + + return XLMath.ATanh(p[0]); + } + + private static object Base(List p) + { + long number; + int radix; + int minLength = 0; + + var rawNumber = p[0].Evaluate(); + if (rawNumber is long || rawNumber is int || rawNumber is byte || rawNumber is double || rawNumber is float) + number = Convert.ToInt64(rawNumber); + else + throw new CellValueException(); + + var rawRadix = p[1].Evaluate(); + if (rawRadix is long || rawRadix is int || rawRadix is byte || rawRadix is double || rawRadix is float) + radix = Convert.ToInt32(rawRadix); + else + throw new CellValueException(); + + if (p.Count > 2) + { + var rawMinLength = p[2].Evaluate(); + if (rawMinLength is long || rawMinLength is int || rawMinLength is byte || rawMinLength is double || rawMinLength is float) + minLength = Convert.ToInt32(rawMinLength); + else + throw new CellValueException(); + } + + if (number < 0 || radix < 2 || radix > 36) + throw new NumberException(); + + return XLMath.ChangeBase(number, radix).PadLeft(minLength, '0'); + } + + private static object Combin(List p) + { + Int32 n; + Int32 k; + + var rawN = p[0].Evaluate(); + var rawK = p[1].Evaluate(); + if (rawN is long || rawN is int || rawN is byte || rawN is double || rawN is float) + n = (int)Math.Floor((double)rawN); + else + throw new NumberException(); + + if (rawK is long || rawK is int || rawK is byte || rawK is double || rawK is float) + k = (int)Math.Floor((double)rawK); + else + throw new NumberException(); + + n = (int)p[0]; + k = (int)p[1]; + + if (n < 0 || n < k || k < 0) + throw new NumberException(); + + return XLMath.Combin(n, k); + } + + private static object CombinA(List p) + { + Int32 number = (int)p[0]; // casting truncates towards 0 as specified + Int32 chosen = (int)p[1]; + + if (number < 0 || number < chosen) + throw new NumberException(); + if (chosen < 0) + throw new NumberException(); + + int n = number + chosen - 1; + int k = number - 1; + + return n == k || k == 0 + ? 1 + : (long)XLMath.Combin(n, k); + } + + private static object Degrees(List p) + { + return p[0] * (180.0 / Math.PI); + } + + private static object Fact(List p) + { + var input = p[0].Evaluate(); + + if (!(input is long || input is int || input is byte || input is double || input is float)) + throw new CellValueException(); + + var num = Math.Floor((double)input); + double fact = 1.0; + + if (num < 0) + throw new NumberException(); + + if (num > 1) + for (int i = 2; i <= num; i++) + fact *= i; + return fact; + } + + private static object FactDouble(List p) + { + var input = p[0].Evaluate(); + + if (!(input is long || input is int || input is byte || input is double || input is float)) + throw new CellValueException(); + + var num = Math.Floor(p[0]); + double fact = 1.0; + + if (num < -1) + throw new NumberException(); + + if (num > 1) + { + var start = Math.Abs(num % 2) < XLHelper.Epsilon ? 2 : 1; + for (int i = start; i <= num; i = i + 2) + fact *= i; + } + return fact; + } + + private static object Gcd(List p) + { + return p.Select(v => (int)v).Aggregate(Gcd); + } + + private static int Gcd(int a, int b) + { + return b == 0 ? a : Gcd(b, a % b); + } + + private static object Lcm(List p) + { + return p.Select(v => (int)v).Aggregate(Lcm); + } + + private static int Lcm(int a, int b) + { + if (a == 0 || b == 0) return 0; + return a * (b / Gcd(a, b)); + } + + private static object Mod(List p) + { + double number = p[0]; + double divisor = p[1]; + + return number - Math.Floor(number / divisor) * divisor; + } + + private static object MRound(List p) + { + var number = (Double)p[0]; + var multiple = (Double)p[1]; + + if (Math.Sign(number) != Math.Sign(multiple)) + throw new NumberException($"The Number and Multiple arguments must have the same sign."); + + return Math.Round(number / multiple, MidpointRounding.AwayFromZero) * multiple; + } + + private static object Multinomial(List p) + { + return Multinomial(p.Select(v => (double)v).ToList()); + } + + private static double Multinomial(List numbers) + { + double numbersSum = 0; + foreach (var number in numbers) + numbersSum += number; + + double maxNumber = numbers.Max(); + var denomFactorPowers = new double[(uint)numbers.Max() + 1]; + foreach (var number in numbers) + for (int i = 2; i <= number; i++) + denomFactorPowers[i]++; + for (int i = 2; i < denomFactorPowers.Length; i++) + denomFactorPowers[i]--; // reduce with nominator; + + int currentFactor = 2; + double currentPower = 1; + double result = 1; + for (double i = maxNumber + 1; i <= numbersSum; i++) + { + double tempDenom = 1; + while (tempDenom < result && currentFactor < denomFactorPowers.Length) + { + if (currentPower > denomFactorPowers[currentFactor]) + { + currentFactor++; + currentPower = 1; + } + else + { + tempDenom *= currentFactor; + currentPower++; + } + } + result = result / tempDenom * i; + } + + return result; + } + + private static object Odd(List p) + { + var num = (int)Math.Ceiling(p[0]); + var addValue = num >= 0 ? 1 : -1; + return XLMath.IsOdd(num) ? num : num + addValue; + } + + private static object Even(List p) + { + var num = (int)Math.Ceiling(p[0]); + var addValue = num >= 0 ? 1 : -1; + return XLMath.IsEven(num) ? num : num + addValue; + } + + private static object Product(List p) + { + if (p.Count == 0) return 0; + Double total = 1; + p.ForEach(v => total *= v); + return total; + } + + private static object Quotient(List p) + { + Double n = p[0]; + Double k = p[1]; + + return (int)(n / k); + } + + private static object Radians(List p) + { + return p[0] * Math.PI / 180.0; + } + + private static object Roman(List p) + { + if (p.Count == 1 + || (Boolean.TryParse(p[1]._token.Value.ToString(), out bool boolTemp) && boolTemp) + || (Int32.TryParse(p[1]._token.Value.ToString(), out int intTemp) && intTemp == 1)) + return XLMath.ToRoman((int)p[0]); + + throw new ArgumentException("Can only support classic roman types."); + } + + private static object Round(List p) + { + var value = (Double)p[0]; + var digits = (Int32)(Double)p[1]; + if (digits >= 0) + { + return Math.Round(value, digits, MidpointRounding.AwayFromZero); + } + else + { + digits = Math.Abs(digits); + double temp = value / Math.Pow(10, digits); + temp = Math.Round(temp, 0, MidpointRounding.AwayFromZero); + return temp * Math.Pow(10, digits); + } + } + + private static object RoundDown(List p) + { + var value = (Double)p[0]; + var digits = (Int32)(Double)p[1]; + + if (value >= 0) + return Math.Floor(value * Math.Pow(10, digits)) / Math.Pow(10, digits); + + return Math.Ceiling(value * Math.Pow(10, digits)) / Math.Pow(10, digits); + } + + private static object RoundUp(List p) + { + var value = (Double)p[0]; + var digits = (Int32)(Double)p[1]; + + if (value >= 0) + return Math.Ceiling(value * Math.Pow(10, digits)) / Math.Pow(10, digits); + + return Math.Floor(value * Math.Pow(10, digits)) / Math.Pow(10, digits); + } + + private static object Sec(List p) + { + if (double.TryParse(p[0], out double number)) + return 1.0 / Math.Cos(number); + else + throw new CellValueException(); + } + + private static object Sech(List p) + { + return 1.0 / Math.Cosh(p[0]); + } + + private static object SeriesSum(List p) + { + var x = (Double)p[0]; + var n = (Double)p[1]; + var m = (Double)p[2]; + var obj = p[3] as XObjectExpression; + + if (obj == null) + return p[3] * Math.Pow(x, n); + + Double total = 0; + Int32 i = 0; + foreach (var e in obj) + { + total += (double)e * Math.Pow(x, n + i * m); + i++; + } + + return total; + } + + private static object SqrtPi(List p) + { + var num = (Double)p[0]; + return Math.Sqrt(Math.PI * num); + } + + private static object Subtotal(List p) + { + // Skip cells that already evaluate a SUBTOTAL + bool hasSubtotalInFormula(Expression e) + { + if (e is FunctionExpression fe && (fe.FunctionDefinition.Function.Method.Name == nameof(Subtotal) || fe.Parameters.Any(fp => hasSubtotalInFormula(fp)))) + return true; + + if (e is BinaryExpression be) + return hasSubtotalInFormula(be.LeftExpression) || hasSubtotalInFormula(be.RightExpression); + + if (e is UnaryExpression ue) + return hasSubtotalInFormula(ue.Expression); + + return false; + }; + + IEnumerable extractExpressionsWithoutSubtotal(CellRangeReference crr) + { + var ce = crr.CalcEngine as XLCalcEngine; + + return crr.Range + .CellsUsed() + .Where(c => + { + if (c.HasFormula) + { + var expression = ce.ExpressionCache[c.FormulaA1]; + return !hasSubtotalInFormula(expression); + } + else + return true; + }) + .Select(c => new XObjectExpression(new CellRangeReference(c.AsRange(), (XLCalcEngine)crr.CalcEngine)) as Expression); + }; + + var expressions = p.Skip(1) + .SelectMany(e => + e is XObjectExpression xoe && xoe.Value is CellRangeReference crr + ? extractExpressionsWithoutSubtotal(crr) + : new[] { e }) + .ToArray(); + + var fId = (int)(Double)p[0]; + var tally = new Tally(expressions); + + switch (fId) + { + case 1: + return tally.Average(); + + case 2: + return tally.Count(true); + + case 3: + return tally.Count(false); + + case 4: + return tally.Max(); + + case 5: + return tally.Min(); + + case 6: + return tally.Product(); + + case 7: + return tally.Std(); + + case 8: + return tally.StdP(); + + case 9: + return tally.Sum(); + + case 10: + return tally.Var(); + + case 11: + return tally.VarP(); + + default: + throw new ArgumentException("Function not supported."); + } + } + + private static object SumSq(List p) + { + var t = new Tally(p); + return t.NumericValues().Sum(v => Math.Pow(v, 2)); + } + + private static object MMult(List p) + { + Double[,] A = GetArray(p[0]); + Double[,] B = GetArray(p[1]); + + if (A.GetLength(0) != B.GetLength(0) || A.GetLength(1) != B.GetLength(1)) + throw new ArgumentException("Ranges must have the same number of rows and columns."); + + var C = new double[A.GetLength(0), A.GetLength(1)]; + for (int i = 0; i < A.GetLength(0); i++) + { + for (int j = 0; j < B.GetLength(1); j++) + { + for (int k = 0; k < A.GetLength(1); k++) + { + C[i, j] += A[i, k] * B[k, j]; + } + } + } + + return C; + } + + private static double[,] GetArray(Expression expression) + { + var oExp1 = expression as XObjectExpression; + if (oExp1 == null) return new[,] { { (Double)expression } }; + + var range = (oExp1.Value as CellRangeReference).Range; + var rowCount = range.RowCount(); + var columnCount = range.ColumnCount(); + var arr = new double[rowCount, columnCount]; + + for (int row = 0; row < rowCount; row++) + { + for (int column = 0; column < columnCount; column++) + { + arr[row, column] = range.Cell(row + 1, column + 1).GetDouble(); + } + } + + return arr; + } + + private static object MDeterm(List p) + { + var arr = GetArray(p[0]); + var m = new XLMatrix(arr); + + return m.Determinant(); + } + + private static object MInverse(List p) + { + var arr = GetArray(p[0]); + var m = new XLMatrix(arr); + + return m.Invert().mat; + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/Statistical.cs b/ClosedXML/Excel/CalcEngine/Functions/Statistical.cs new file mode 100644 index 0000000..28eb388 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Functions/Statistical.cs @@ -0,0 +1,276 @@ +using ClosedXML.Excel.CalcEngine.Exceptions; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel.CalcEngine +{ + internal static class Statistical + { + public static void Register(CalcEngine ce) + { + //ce.RegisterFunction("AVEDEV", AveDev, 1, int.MaxValue); + ce.RegisterFunction("AVERAGE", 1, int.MaxValue, Average); // Returns the average (arithmetic mean) of the arguments + ce.RegisterFunction("AVERAGEA", 1, int.MaxValue, AverageA); + //BETADIST Returns the beta cumulative distribution function + //BETAINV Returns the inverse of the cumulative distribution function for a specified beta distribution + //BINOMDIST Returns the individual term binomial distribution probability + //CHIDIST Returns the one-tailed probability of the chi-squared distribution + //CHIINV Returns the inverse of the one-tailed probability of the chi-squared distribution + //CHITEST Returns the test for independence + //CONFIDENCE Returns the confidence interval for a population mean + //CORREL Returns the correlation coefficient between two data sets + ce.RegisterFunction("COUNT", 1, int.MaxValue, Count); + ce.RegisterFunction("COUNTA", 1, int.MaxValue, CountA); + ce.RegisterFunction("COUNTBLANK", 1, CountBlank); + ce.RegisterFunction("COUNTIF", 2, CountIf); + ce.RegisterFunction("COUNTIFS", 2, 144, CountIfs); + //COVAR Returns covariance, the average of the products of paired deviations + //CRITBINOM Returns the smallest value for which the cumulative binomial distribution is less than or equal to a criterion value + //DEVSQ Returns the sum of squares of deviations + //EXPONDIST Returns the exponential distribution + //FDIST Returns the F probability distribution + //FINV Returns the inverse of the F probability distribution + //FISHER Returns the Fisher transformation + //FISHERINV Returns the inverse of the Fisher transformation + //FORECAST Returns a value along a linear trend + //FREQUENCY Returns a frequency distribution as a vertical array + //FTEST Returns the result of an F-test + //GAMMADIST Returns the gamma distribution + //GAMMAINV Returns the inverse of the gamma cumulative distribution + //GAMMALN Returns the natural logarithm of the gamma function, Γ(x) + //GEOMEAN Returns the geometric mean + //GROWTH Returns values along an exponential trend + //HARMEAN Returns the harmonic mean + //HYPGEOMDIST Returns the hypergeometric distribution + //INTERCEPT Returns the intercept of the linear regression line + //KURT Returns the kurtosis of a data set + //LARGE Returns the k-th largest value in a data set + //LINEST Returns the parameters of a linear trend + //LOGEST Returns the parameters of an exponential trend + //LOGINV Returns the inverse of the lognormal distribution + //LOGNORMDIST Returns the cumulative lognormal distribution + ce.RegisterFunction("MAX", 1, int.MaxValue, Max); + ce.RegisterFunction("MAXA", 1, int.MaxValue, MaxA); + //MEDIAN Returns the median of the given numbers + ce.RegisterFunction("MIN", 1, int.MaxValue, Min); + ce.RegisterFunction("MINA", 1, int.MaxValue, MinA); + //MODE Returns the most common value in a data set + //NEGBINOMDIST Returns the negative binomial distribution + //NORMDIST Returns the normal cumulative distribution + //NORMINV Returns the inverse of the normal cumulative distribution + //NORMSDIST Returns the standard normal cumulative distribution + //NORMSINV Returns the inverse of the standard normal cumulative distribution + //PEARSON Returns the Pearson product moment correlation coefficient + //PERCENTILE Returns the k-th percentile of values in a range + //PERCENTRANK Returns the percentage rank of a value in a data set + //PERMUT Returns the number of permutations for a given number of objects + //POISSON Returns the Poisson distribution + //PROB Returns the probability that values in a range are between two limits + //QUARTILE Returns the quartile of a data set + //RANK Returns the rank of a number in a list of numbers + //RSQ Returns the square of the Pearson product moment correlation coefficient + //SKEW Returns the skewness of a distribution + //SLOPE Returns the slope of the linear regression line + //SMALL Returns the k-th smallest value in a data set + //STANDARDIZE Returns a normalized value + ce.RegisterFunction("STDEV", 1, int.MaxValue, StDev); + ce.RegisterFunction("STDEVA", 1, int.MaxValue, StDevA); + ce.RegisterFunction("STDEVP", 1, int.MaxValue, StDevP); + ce.RegisterFunction("STDEVPA", 1, int.MaxValue, StDevPA); + ce.RegisterFunction("STDEV.S", 1, int.MaxValue, StDev); + ce.RegisterFunction("STDEV.P", 1, int.MaxValue, StDevP); + //STEYX Returns the standard error of the predicted y-value for each x in the regression + //TDIST Returns the Student's t-distribution + //TINV Returns the inverse of the Student's t-distribution + //TREND Returns values along a linear trend + //TRIMMEAN Returns the mean of the interior of a data set + //TTEST Returns the probability associated with a Student's t-test + ce.RegisterFunction("VAR", 1, int.MaxValue, Var); + ce.RegisterFunction("VARA", 1, int.MaxValue, VarA); + ce.RegisterFunction("VARP", 1, int.MaxValue, VarP); + ce.RegisterFunction("VARPA", 1, int.MaxValue, VarPA); + ce.RegisterFunction("VAR.S", 1, int.MaxValue, Var); + ce.RegisterFunction("VAR.P", 1, int.MaxValue, VarP); + //WEIBULL Returns the Weibull distribution + //ZTEST Returns the one-tailed probability-value of a z-test + } + + private static object Average(List p) + { + return GetTally(p, true).Average(); + } + + private static object AverageA(List p) + { + return GetTally(p, false).Average(); + } + + private static object Count(List p) + { + return GetTally(p, true).Count(); + } + + private static object CountA(List p) + { + return GetTally(p, false).Count(); + } + + private static object CountBlank(List p) + { + if ((p[0] as XObjectExpression)?.Value as CellRangeReference == null) + throw new NoValueAvailableException("COUNTBLANK should have a single argument which is a range reference"); + + var e = p[0] as XObjectExpression; + long totalCount = CalcEngineHelpers.GetTotalCellsCount(e); + long nonBlankCount = 0; + foreach (var value in e) + { + if (!CalcEngineHelpers.ValueIsBlank(value)) + nonBlankCount++; + } + + return 0d + totalCount - nonBlankCount; + } + + private static object CountIf(List p) + { + CalcEngine ce = new CalcEngine(); + var cnt = 0.0; + long processedCount = 0; + if (p[0] is XObjectExpression ienum) + { + long totalCount = CalcEngineHelpers.GetTotalCellsCount(ienum); + var criteria = p[1].Evaluate(); + foreach (var value in ienum) + { + if (CalcEngineHelpers.ValueSatisfiesCriteria(value, criteria, ce)) + cnt++; + processedCount++; + } + + // Add count of empty cells outside the used range if they match criteria + if (CalcEngineHelpers.ValueSatisfiesCriteria(string.Empty, criteria, ce)) + cnt += (totalCount - processedCount); + } + + return cnt; + } + + private static object CountIfs(List p) + { + // get parameters + var ce = new CalcEngine(); + long count = 0; + + int numberOfCriteria = p.Count / 2; + + long totalCount = 0; + // prepare criteria-parameters: + var criteriaRanges = new Tuple>[numberOfCriteria]; + for (int criteriaPair = 0; criteriaPair < numberOfCriteria; criteriaPair++) + { + var criteriaRange = p[criteriaPair * 2] as XObjectExpression; + var criterion = p[(criteriaPair * 2) + 1].Evaluate(); + var criteriaRangeValues = new List(); + foreach (var value in criteriaRange) + { + criteriaRangeValues.Add(value); + } + + criteriaRanges[criteriaPair] = new Tuple>( + criterion, + criteriaRangeValues); + + if (totalCount == 0) + totalCount = CalcEngineHelpers.GetTotalCellsCount(criteriaRange); + } + + long processedCount = 0; + for (var i = 0; i < criteriaRanges[0].Item2.Count; i++) + { + if (criteriaRanges.All(criteriaPair => CalcEngineHelpers.ValueSatisfiesCriteria( + criteriaPair.Item2[i], criteriaPair.Item1, ce))) + count++; + + processedCount++; + } + + // Add count of empty cells outside the used range if they match criteria + if (criteriaRanges.All(criteriaPair => CalcEngineHelpers.ValueSatisfiesCriteria( + string.Empty, criteriaPair.Item1, ce))) + { + count += (totalCount - processedCount); + } + + // done + return count; + } + + private static object Max(List p) + { + return GetTally(p, true).Max(); + } + + private static object MaxA(List p) + { + return GetTally(p, false).Max(); + } + + private static object Min(List p) + { + return GetTally(p, true).Min(); + } + + private static object MinA(List p) + { + return GetTally(p, false).Min(); + } + + private static object StDev(List p) + { + return GetTally(p, true).Std(); + } + + private static object StDevA(List p) + { + return GetTally(p, false).Std(); + } + + private static object StDevP(List p) + { + return GetTally(p, true).StdP(); + } + + private static object StDevPA(List p) + { + return GetTally(p, false).StdP(); + } + + private static object Var(List p) + { + return GetTally(p, true).Var(); + } + + private static object VarA(List p) + { + return GetTally(p, false).Var(); + } + + private static object VarP(List p) + { + return GetTally(p, true).VarP(); + } + + private static object VarPA(List p) + { + return GetTally(p, false).VarP(); + } + + // utility for tallying statistics + private static Tally GetTally(List p, bool numbersOnly) + { + return new Tally(p, numbersOnly); + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/Tally.cs b/ClosedXML/Excel/CalcEngine/Functions/Tally.cs new file mode 100644 index 0000000..8a881c8 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Functions/Tally.cs @@ -0,0 +1,239 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Threading; + +namespace ClosedXML.Excel.CalcEngine +{ + internal class Tally : IEnumerable + { + private readonly List _list = new List(); + private readonly bool NumbersOnly; + + private double[] _numericValues; + + public Tally() + : this(false) + { } + + public Tally(bool numbersOnly) + : this(null, numbersOnly) + { } + + public Tally(IEnumerable p) + : this(p, false) + { } + + public Tally(IEnumerable p, bool numbersOnly) + { + if (p != null) + { + foreach (var e in p) + { + Add(e); + } + } + + NumbersOnly = numbersOnly; + } + + public void Add(Expression e) + { + // handle enumerables + if (e is IEnumerable ienum) + { + foreach (var value in ienum) + { + _list.Add(value); + } + _numericValues = null; + return; + } + + // handle expressions + var val = e.Evaluate(); + if (val is string || !(val is IEnumerable valEnumerable)) + _list.Add(val); + else + foreach (var v in valEnumerable) + _list.Add(v); + + _numericValues = null; + } + + public void AddValue(Object v) + { + _list.Add(v); + _numericValues = null; + } + + public double Count() + { + return Count(NumbersOnly); + } + + public double Count(bool numbersOnly) + { + if (numbersOnly) + return NumericValuesInternal().Length; + else + return _list.Count(o => !CalcEngineHelpers.ValueIsBlank(o)); + } + + private IEnumerable NumericValuesEnumerable() + { + foreach (var value in _list) + { + if (value is string || !(value is IEnumerable vEnumerable)) + { + if (TryParseToDouble(value, aggressiveConversion: false, out double tmp)) + yield return tmp; + } + else + { + foreach (var v in vEnumerable) + { + if (TryParseToDouble(v, aggressiveConversion: false, out double tmp)) + yield return tmp; + } + } + } + } + + // If aggressiveConversion == true, then try to parse non-numeric types to double too + private bool TryParseToDouble(object value, bool aggressiveConversion, out double d) + { + d = 0; + if (value.IsNumber()) + { + d = Convert.ToDouble(value); + return true; + } + else if (value is Boolean b) + { + if (!aggressiveConversion) return false; + + d = (b ? 1 : 0); + return true; + } + else if (value is DateTime dt) + { + d = dt.ToOADate(); + return true; + } + else if (value is TimeSpan ts) + { + d = ts.TotalDays; + return true; + } + else if (value is string s) + { + if (!aggressiveConversion) return false; + return double.TryParse(s, out d); + } + + return false; + } + + private double[] NumericValuesInternal() + => LazyInitializer.EnsureInitialized(ref _numericValues, () => NumericValuesEnumerable().ToArray()); + + public IEnumerable NumericValues() + => NumericValuesInternal().AsEnumerable(); + + public double Product() + { + var nums = NumericValuesInternal(); + return nums.Length == 0 + ? 0 + : nums.Aggregate(1d, (a, b) => a * b); + } + + public double Sum() => NumericValuesInternal().Sum(); + + public double Average() + { + var nums = NumericValuesInternal(); + if (nums.Length == 0) throw new ApplicationException("No values"); + return nums.Average(); + } + + public double Min() + { + var nums = NumericValuesInternal(); + return nums.Length == 0 ? 0 : nums.Min(); + } + + public double Max() + { + var nums = NumericValuesInternal(); + return nums.Length == 0 ? 0 : nums.Max(); + } + + public double Range() => Max() - Min(); + + private static double Sum2(IEnumerable nums) + { + return nums.Sum(d => d * d); + } + + public double VarP() + { + var nums = NumericValuesInternal(); + var avg = nums.Average(); + var sum2 = Sum2(nums); + var count = nums.Length; + return count <= 1 ? 0 : sum2 / count - avg * avg; + } + + public double StdP() + { + var nums = NumericValuesInternal(); + var avg = nums.Average(); + var sum2 = nums.Sum(d => d * d); + var count = nums.Length; + return count <= 1 ? 0 : Math.Sqrt(sum2 / count - avg * avg); + } + + public double Var() + { + var nums = NumericValuesInternal(); + var avg = nums.Average(); + var sum2 = Sum2(nums); + var count = nums.Length; + return count <= 1 ? 0 : (sum2 / count - avg * avg) * count / (count - 1); + } + + public double Std() + { + var values = NumericValuesInternal(); + var count = values.Length; + double ret = 0; + if (count != 0) + { + //Compute the Average + double avg = values.Average(); + //Perform the Sum of (value-avg)_2_2 + double sum = values.Sum(d => Math.Pow(d - avg, 2)); + //Put it all together + ret = Math.Sqrt((sum) / (count - 1)); + } + else + { + throw new ApplicationException("No values"); + } + return ret; + } + + public IEnumerator GetEnumerator() + { + return _list.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/Text.cs b/ClosedXML/Excel/CalcEngine/Functions/Text.cs new file mode 100644 index 0000000..13d1a67 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Functions/Text.cs @@ -0,0 +1,479 @@ +using ClosedXML.Excel.CalcEngine.Exceptions; +using ExcelNumberFormat; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace ClosedXML.Excel.CalcEngine +{ + internal static class Text + { + public static void Register(CalcEngine ce) + { + ce.RegisterFunction("ASC", 1, Asc); // Changes full-width (double-byte) English letters or katakana within a character string to half-width (single-byte) characters + //ce.RegisterFunction("BAHTTEXT Converts a number to text, using the ß (baht) currency format + ce.RegisterFunction("CHAR", 1, _Char); // Returns the character specified by the code number + ce.RegisterFunction("CLEAN", 1, Clean); // Removes all nonprintable characters from text + ce.RegisterFunction("CODE", 1, Code); // Returns a numeric code for the first character in a text string + ce.RegisterFunction("CONCAT", 1, int.MaxValue, Concat); // Joins several text items into one text item + ce.RegisterFunction("CONCATENATE", 1, int.MaxValue, Concatenate); // Joins several text items into one text item + ce.RegisterFunction("DOLLAR", 1, 2, Dollar); // Converts a number to text, using the $ (dollar) currency format + ce.RegisterFunction("EXACT", 2, Exact); // Checks to see if two text values are identical + ce.RegisterFunction("FIND", 2, 3, Find); //Finds one text value within another (case-sensitive) + ce.RegisterFunction("FIXED", 1, 3, Fixed); // Formats a number as text with a fixed number of decimals + //ce.RegisterFunction("JIS Changes half-width (single-byte) English letters or katakana within a character string to full-width (double-byte) characters + ce.RegisterFunction("LEFT", 1, 2, Left); // LEFTB Returns the leftmost characters from a text value + ce.RegisterFunction("LEN", 1, Len); //, Returns the number of characters in a text string + ce.RegisterFunction("LOWER", 1, Lower); // Converts text to lowercase + ce.RegisterFunction("MID", 3, Mid); // Returns a specific number of characters from a text string starting at the position you specify + ce.RegisterFunction("NUMBERVALUE", 1, 3, NumberValue); // Converts a text argument to a number + //ce.RegisterFunction("PHONETIC Extracts the phonetic (furigana) characters from a text string + ce.RegisterFunction("PROPER", 1, Proper); // Capitalizes the first letter in each word of a text value + ce.RegisterFunction("REPLACE", 4, Replace); // Replaces characters within text + ce.RegisterFunction("REPT", 2, Rept); // Repeats text a given number of times + ce.RegisterFunction("RIGHT", 1, 2, Right); // Returns the rightmost characters from a text value + ce.RegisterFunction("SEARCH", 2, 3, Search); // Finds one text value within another (not case-sensitive) + ce.RegisterFunction("SUBSTITUTE", 3, 4, Substitute); // Substitutes new text for old text in a text string + ce.RegisterFunction("T", 1, T); // Converts its arguments to text + ce.RegisterFunction("TEXT", 2, _Text); // Formats a number and converts it to text + ce.RegisterFunction("TEXTJOIN", 3, 254, TextJoin); // Joins text via delimiter + ce.RegisterFunction("TRIM", 1, Trim); // Removes spaces from text + ce.RegisterFunction("UPPER", 1, Upper); // Converts text to uppercase + ce.RegisterFunction("VALUE", 1, Value); // Converts a text argument to a number + } + + private static object _Char(List p) + { + var i = (int)p[0]; + if (i < 1 || i > 255) + throw new CellValueException(string.Format("The number {0} is out of the required range (1 to 255)", i)); + + var c = (char)i; + return c.ToString(); + } + + private static object Code(List p) + { + var s = (string)p[0]; + return (int)s[0]; + } + + private static object Concat(List p) + { + var sb = new StringBuilder(); + foreach (var x in p) + { + if (x is IEnumerable enumerable) + { + foreach (var i in enumerable) + sb.Append((string)(new Expression(i))); + } + else + sb.Append((string)x); + } + return sb.ToString(); + } + + private static object Concatenate(List p) + { + var sb = new StringBuilder(); + foreach (var x in p) + { + if (x is XObjectExpression objectExpression) + { + if (objectExpression.Value is CellRangeReference cellRangeReference) + { + if (!cellRangeReference.Range.RangeAddress.IsValid) + throw new CellReferenceException(); + + // Only single cell range references allows at this stage. See unit test for more details + if (cellRangeReference.Range.RangeAddress.NumberOfCells > 1) + throw new CellValueException("This function does not accept cell ranges as parameters."); + } + else + // I'm unsure about what else objectExpression.Value could be, but let's throw CellReferenceException + throw new CellReferenceException(); + } + + sb.Append((string)x); + } + return sb.ToString(); + } + + private static object Find(List p) + { + var srch = (string)p[0]; + var text = (string)p[1]; + var start = 0; + if (p.Count > 2) + { + start = (int)p[2] - 1; + } + var index = text.IndexOf(srch, start, StringComparison.Ordinal); + if (index == -1) + throw new ArgumentException("String not found."); + else + return index + 1; + } + + private static object Left(List p) + { + var str = (string)p[0]; + var n = 1; + if (p.Count > 1) + { + n = (int)p[1]; + } + if (n >= str.Length) return str; + + return str.Substring(0, n); + } + + private static object Len(List p) + { + return ((string)p[0]).Length; + } + + private static object Lower(List p) + { + return ((string)p[0]).ToLower(); + } + + private static object Mid(List p) + { + var str = (string)p[0]; + var start = (int)p[1] - 1; + var length = (int)p[2]; + if (start > str.Length - 1) + return String.Empty; + if (start + length > str.Length - 1) + return str.Substring(start); + return str.Substring(start, length); + } + + private static string MatchHandler(Match m) + { + return m.Groups[1].Value.ToUpper() + m.Groups[2].Value; + } + + private static object Proper(List p) + { + var s = (string)p[0]; + if (s.Length == 0) return ""; + + MatchEvaluator evaluator = new MatchEvaluator(MatchHandler); + StringBuilder sb = new StringBuilder(); + + string pattern = "\\b(\\w)(\\w+)?\\b"; + Regex regex = new Regex(pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase); + return regex.Replace(s.ToLower(), evaluator); + } + + private static object Replace(List p) + { + // old start len new + var s = (string)p[0]; + var start = (int)p[1] - 1; + var len = (int)p[2]; + var rep = (string)p[3]; + + if (s.Length == 0) return rep; + + var sb = new StringBuilder(); + sb.Append(s.Substring(0, start)); + sb.Append(rep); + sb.Append(s.Substring(start + len)); + + return sb.ToString(); + } + + private static object Rept(List p) + { + var sb = new StringBuilder(); + var s = (string)p[0]; + var repeats = (int)p[1]; + if (repeats < 0) throw new IndexOutOfRangeException("repeats"); + for (int i = 0; i < repeats; i++) + { + sb.Append(s); + } + return sb.ToString(); + } + + private static object Right(List p) + { + var str = (string)p[0]; + var n = 1; + if (p.Count > 1) + { + n = (int)p[1]; + } + + if (n >= str.Length) return str; + + return str.Substring(str.Length - n); + } + + private static string WildcardToRegex(string pattern) + { + return Regex.Escape(pattern) + .Replace(".", "\\.") + .Replace("\\*", ".*") + .Replace("\\?", "."); + } + + private static object Search(List p) + { + var search = WildcardToRegex(p[0]); + var text = (string)p[1]; + + if ("" == text) throw new ArgumentException("Invalid input string."); + + var start = 0; + if (p.Count > 2) + { + start = (int)p[2] - 1; + } + + Regex r = new Regex(search, RegexOptions.Compiled | RegexOptions.IgnoreCase); + var match = r.Match(text.Substring(start)); + if (!match.Success) + throw new ArgumentException("Search failed."); + else + return match.Index + start + 1; + //var index = text.IndexOf(search, start, StringComparison.OrdinalIgnoreCase); + //if (index == -1) + // throw new ArgumentException("String not found."); + //else + // return index + 1; + } + + private static object Substitute(List p) + { + // get parameters + var text = (string)p[0]; + var oldText = (string)p[1]; + var newText = (string)p[2]; + + if ("" == text) return ""; + if ("" == oldText) return text; + + // if index not supplied, replace all + if (p.Count == 3) + { + return text.Replace(oldText, newText); + } + + // replace specific instance + int index = (int)p[3]; + if (index < 1) + { + throw new ArgumentException("Invalid index in Substitute."); + } + int pos = text.IndexOf(oldText); + while (pos > -1 && index > 1) + { + pos = text.IndexOf(oldText, pos + 1); + index--; + } + return pos > -1 + ? text.Substring(0, pos) + newText + text.Substring(pos + oldText.Length) + : text; + } + + private static object T(List p) + { + if (p[0]._token.Value.GetType() == typeof(string)) + return (string)p[0]; + else + return ""; + } + + private static object _Text(List p) + { + var value = p[0].Evaluate(); + + // Input values of type string don't get any formatting applied. + if (value is string) return value; + + var number = (double)p[0]; + var format = (string)p[1]; + if (string.IsNullOrEmpty(format.Trim())) return ""; + + var nf = new NumberFormat(format); + + if (nf.IsDateTimeFormat) + return nf.Format(DateTime.FromOADate(number), CultureInfo.InvariantCulture); + else + return nf.Format(number, CultureInfo.InvariantCulture); + } + + /// + /// A function to Join text https://support.office.com/en-us/article/textjoin-function-357b449a-ec91-49d0-80c3-0e8fc845691c + /// + /// Parameters + /// string + /// + /// Delimiter in first param must be a string + /// or + /// Second param must be a boolen (TRUE/FALSE) + /// + private static object TextJoin(List p) + { + var values = new List(); + string delimiter; + bool ignoreEmptyStrings; + try + { + delimiter = (string)p[0]; + ignoreEmptyStrings = (bool)p[1]; + } + catch (Exception e) + { + throw new CellValueException("Failed to parse arguments", e); + } + + foreach (var param in p.Skip(2)) + { + if (param is XObjectExpression tableArray) + { + if (!(tableArray.Value is CellRangeReference rangeReference)) + throw new NoValueAvailableException("tableArray has to be a range"); + + var range = rangeReference.Range; + IEnumerable cellValues; + if (ignoreEmptyStrings) + cellValues = range.CellsUsed() + .Select(c => c.GetString()) + .Where(s => !string.IsNullOrEmpty(s)); + else + cellValues = (range as XLRange).CellValues() + .Cast() + .Select(o => o.ToString()); + + values.AddRange(cellValues); + } + else + { + values.Add((string)param); + } + } + + var retVal = string.Join(delimiter, values); + + if (retVal.Length > 32767) + throw new CellValueException(); + + return retVal; + } + + private static object Trim(List p) + { + //Should not trim non breaking space + //See http://office.microsoft.com/en-us/excel-help/trim-function-HP010062581.aspx + return ((string)p[0]).Trim(' '); + } + + private static object Upper(List p) + { + return ((string)p[0]).ToUpper(); + } + + private static object Value(List p) + { + return double.Parse(p[0], NumberStyles.Any, CultureInfo.InvariantCulture); + } + + private static object NumberValue(List p) + { + var numberFormatInfo = new NumberFormatInfo(); + + numberFormatInfo.NumberDecimalSeparator = p.Count > 1 ? p[1] : CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator; + numberFormatInfo.CurrencyDecimalSeparator = numberFormatInfo.NumberDecimalSeparator; + + numberFormatInfo.NumberGroupSeparator = p.Count > 2 ? p[2] : CultureInfo.InvariantCulture.NumberFormat.NumberGroupSeparator; + numberFormatInfo.CurrencyGroupSeparator = numberFormatInfo.NumberGroupSeparator; + + if (numberFormatInfo.NumberDecimalSeparator == numberFormatInfo.NumberGroupSeparator) + { + throw new CellValueException("CurrencyDecimalSeparator and CurrencyGroupSeparator have to be different."); + } + + //Remove all whitespace characters + var input = Regex.Replace(p[0], @"\s+", "", RegexOptions.Compiled); + if (string.IsNullOrEmpty(input)) + { + return 0d; + } + + if (double.TryParse(input, NumberStyles.Any, numberFormatInfo, out var result)) + { + if (result <= -1e308 || result >= 1e308) + throw new CellValueException("The value is too large"); + + if (result >= -1e-309 && result <= 1e-309 && result != 0) + throw new CellValueException("The value is too tiny"); + + if (result >= -1e-308 && result <= 1e-308) + result = 0d; + + return result; + } + + throw new CellValueException("Could not convert the value to a number"); + } + + private static object Asc(List p) + { + return (string)p[0]; + } + + private static object Clean(List p) + { + var s = (string)p[0]; + + var result = new StringBuilder(); + foreach (var c in from c in s let b = (byte)c where b >= 32 select c) + { + result.Append(c); + } + return result.ToString(); + } + + private static object Dollar(List p) + { + Double value = p[0]; + int dec = p.Count == 2 ? (int)p[1] : 2; + + return value.ToString("C" + dec); + } + + private static object Exact(List p) + { + var t1 = (string)p[0]; + var t2 = (string)p[1]; + + return t1 == t2; + } + + private static object Fixed(List p) + { + if (p[0]._token.Value.GetType() == typeof(string)) + throw new ApplicationException("Input type can't be string"); + + Double value = p[0]; + int decimal_places = p.Count >= 2 ? (int)p[1] : 2; + Boolean no_commas = p.Count == 3 && p[2]; + + var retVal = value.ToString("N" + decimal_places); + if (no_commas) + return retVal.Replace(",", String.Empty); + else + return retVal; + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/XLMath.cs b/ClosedXML/Excel/CalcEngine/Functions/XLMath.cs new file mode 100644 index 0000000..3adcaa5 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Functions/XLMath.cs @@ -0,0 +1,186 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel.CalcEngine.Functions +{ + public static class XLMath + { + public static double DegreesToRadians(double degrees) + { + return (Math.PI / 180.0) * degrees; + } + + public static double RadiansToDegrees(double radians) + { + return (180.0 / Math.PI) * radians; + } + + public static double GradsToRadians(double grads) + { + return (grads / 200.0) * Math.PI; + } + + public static double RadiansToGrads(double radians) + { + return (radians / Math.PI) * 200.0; + } + + public static double DegreesToGrads(double degrees) + { + return (degrees / 9.0) * 10.0; + } + + public static double GradsToDegrees(double grads) + { + return (grads / 10.0) * 9.0; + } + + public static double ASinh(double x) + { + return (Math.Log(x + Math.Sqrt(x * x + 1.0))); + } + + public static double ACosh(double x) + { + return (Math.Log(x + Math.Sqrt((x * x) - 1.0))); + } + + public static double ATanh(double x) + { + return (Math.Log((1.0 + x) / (1.0 - x)) / 2.0); + } + + public static double ACoth(double x) + { + //return (Math.Log((x + 1.0) / (x - 1.0)) / 2.0); + return (ATanh(1.0 / x)); + } + + public static double ASech(double x) + { + return (ACosh(1.0 / x)); + } + + public static double ACsch(double x) + { + return (ASinh(1.0 / x)); + } + + public static double Sech(double x) + { + return (1.0 / Math.Cosh(x)); + } + + public static double Csch(double x) + { + return (1.0 / Math.Sinh(x)); + } + + public static double Coth(double x) + { + return (Math.Cosh(x) / Math.Sinh(x)); + } + + public static double Combin(Int32 n, Int32 k) + { + if (k == 0) return 1; + return n * Combin(n - 1, k - 1) / k; + } + + public static Boolean IsEven(Int32 value) + { + return Math.Abs(value % 2) == 0; + } + public static Boolean IsOdd(Int32 value) + { + return Math.Abs(value % 2) != 0; + } + + public static string ToRoman(int number) + { + if ((number < 0) || (number > 3999)) throw new ArgumentOutOfRangeException("insert value betwheen 1 and 3999"); + if (number < 1) return string.Empty; + if (number >= 1000) return "M" + ToRoman(number - 1000); + if (number >= 900) return "CM" + ToRoman(number - 900); + if (number >= 500) return "D" + ToRoman(number - 500); + if (number >= 400) return "CD" + ToRoman(number - 400); + if (number >= 100) return "C" + ToRoman(number - 100); + if (number >= 90) return "XC" + ToRoman(number - 90); + if (number >= 50) return "L" + ToRoman(number - 50); + if (number >= 40) return "XL" + ToRoman(number - 40); + if (number >= 10) return "X" + ToRoman(number - 10); + if (number >= 9) return "IX" + ToRoman(number - 9); + if (number >= 5) return "V" + ToRoman(number - 5); + if (number >= 4) return "IV" + ToRoman(number - 4); + if (number >= 1) return "I" + ToRoman(number - 1); + throw new ArgumentOutOfRangeException("something bad happened"); + } + + public static int RomanToArabic(string text) + { + if (text.Length == 0) + return 0; + if (text.StartsWith("M", StringComparison.InvariantCultureIgnoreCase)) + return 1000 + RomanToArabic(text.Substring(1)); + if (text.StartsWith("CM", StringComparison.InvariantCultureIgnoreCase)) + return 900 + RomanToArabic(text.Substring(2)); + if (text.StartsWith("D", StringComparison.InvariantCultureIgnoreCase)) + return 500 + RomanToArabic(text.Substring(1)); + if (text.StartsWith("CD", StringComparison.InvariantCultureIgnoreCase)) + return 400 + RomanToArabic(text.Substring(2)); + if (text.StartsWith("C", StringComparison.InvariantCultureIgnoreCase)) + return 100 + RomanToArabic(text.Substring(1)); + if (text.StartsWith("XC", StringComparison.InvariantCultureIgnoreCase)) + return 90 + RomanToArabic(text.Substring(2)); + if (text.StartsWith("L", StringComparison.InvariantCultureIgnoreCase)) + return 50 + RomanToArabic(text.Substring(1)); + if (text.StartsWith("XL", StringComparison.InvariantCultureIgnoreCase)) + return 40 + RomanToArabic(text.Substring(2)); + if (text.StartsWith("X", StringComparison.InvariantCultureIgnoreCase)) + return 10 + RomanToArabic(text.Substring(1)); + if (text.StartsWith("IX", StringComparison.InvariantCultureIgnoreCase)) + return 9 + RomanToArabic(text.Substring(2)); + if (text.StartsWith("V", StringComparison.InvariantCultureIgnoreCase)) + return 5 + RomanToArabic(text.Substring(1)); + if (text.StartsWith("IV", StringComparison.InvariantCultureIgnoreCase)) + return 4 + RomanToArabic(text.Substring(2)); + if (text.StartsWith("I", StringComparison.InvariantCultureIgnoreCase)) + return 1 + RomanToArabic(text.Substring(1)); + + throw new ArgumentOutOfRangeException("text is not a valid roman number"); + } + + public static string ChangeBase(long number, int radix) + { + if (number < 0) + throw new ArgumentOutOfRangeException("number must be greater or equal to 0"); + if (radix < 2) + throw new ArgumentOutOfRangeException("radix must be greater or equal to 2"); + if (radix > 36) + throw new ArgumentOutOfRangeException("radix must be smaller than or equal to 36"); + + StringBuilder sb = new StringBuilder(); + long remaining = number; + + if (remaining == 0) + { + sb.Insert(0, '0'); + } + + while (remaining > 0) + { + var nextDigitDecimal = remaining % radix; + remaining = remaining / radix; + + if (nextDigitDecimal < 10) + sb.Insert(0, nextDigitDecimal); + else + sb.Insert(0, (char)(nextDigitDecimal + 55)); + } + + return sb.ToString(); + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/XLMatrix.cs b/ClosedXML/Excel/CalcEngine/Functions/XLMatrix.cs new file mode 100644 index 0000000..79d6a70 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Functions/XLMatrix.cs @@ -0,0 +1,594 @@ +using System; +using System.Linq; +using System.Text.RegularExpressions; + +namespace ClosedXML.Excel.CalcEngine.Functions +{ + internal class XLMatrix + { + public XLMatrix L; + public XLMatrix U; + public int cols; + private double detOfP = 1; + public double[,] mat; + private int[] pi; + public int rows; + + public XLMatrix(int iRows, int iCols) // XLMatrix Class constructor + { + rows = iRows; + cols = iCols; + mat = new double[rows,cols]; + } + public XLMatrix(Double[,] arr) + :this(arr.GetLength(0), arr.GetLength(1)) + { + var roCount = arr.GetLength(0); + var coCount = arr.GetLength(1); + for (int ro = 0; ro < roCount; ro++) + { + for (int co = 0; co < coCount; co++) + { + mat[ro, co] = arr[ro, co]; + } + } + } + + public double this[int iRow, int iCol] // Access this matrix as a 2D array + { + get { return mat[iRow, iCol]; } + set { mat[iRow, iCol] = value; } + } + + public Boolean IsSquare() + { + return (rows == cols); + } + + public XLMatrix GetCol(int k) + { + var m = new XLMatrix(rows, 1); + for (var i = 0; i < rows; i++) m[i, 0] = mat[i, k]; + return m; + } + + public void SetCol(XLMatrix v, int k) + { + for (var i = 0; i < rows; i++) mat[i, k] = v[i, 0]; + } + + public void MakeLU() // Function for LU decomposition + { + if (!IsSquare()) throw new InvalidOperationException("The matrix is not square!"); + L = IdentityMatrix(rows, cols); + U = Duplicate(); + + pi = new int[rows]; + for (var i = 0; i < rows; i++) pi[i] = i; + + var k0 = 0; + + for (var k = 0; k < cols - 1; k++) + { + double p = 0; + for (var i = k; i < rows; i++) // find the row with the biggest pivot + { + if (Math.Abs(U[i, k]) > p) + { + p = Math.Abs(U[i, k]); + k0 = i; + } + } + if (p == 0) + throw new InvalidOperationException("The matrix is singular!"); + + var pom1 = pi[k]; + pi[k] = pi[k0]; + pi[k0] = pom1; // switch two rows in permutation matrix + + double pom2; + for (var i = 0; i < k; i++) + { + pom2 = L[k, i]; + L[k, i] = L[k0, i]; + L[k0, i] = pom2; + } + + if (k != k0) detOfP *= -1; + + for (var i = 0; i < cols; i++) // Switch rows in U + { + pom2 = U[k, i]; + U[k, i] = U[k0, i]; + U[k0, i] = pom2; + } + + for (var i = k + 1; i < rows; i++) + { + L[i, k] = U[i, k]/U[k, k]; + for (var j = k; j < cols; j++) + U[i, j] = U[i, j] - L[i, k]*U[k, j]; + } + } + } + + + public XLMatrix SolveWith(XLMatrix v) // Function solves Ax = v in confirmity with solution vector "v" + { + if (rows != cols) throw new InvalidOperationException("The matrix is not square!"); + if (rows != v.rows) throw new ArgumentException("Wrong number of results in solution vector!"); + if (L == null) MakeLU(); + + var b = new XLMatrix(rows, 1); + for (var i = 0; i < rows; i++) b[i, 0] = v[pi[i], 0]; // switch two items in "v" due to permutation matrix + + var z = SubsForth(L, b); + var x = SubsBack(U, z); + + return x; + } + + public XLMatrix Invert() // Function returns the inverted matrix + { + if (L == null) MakeLU(); + + var inv = new XLMatrix(rows, cols); + + for (var i = 0; i < rows; i++) + { + var Ei = ZeroMatrix(rows, 1); + Ei[i, 0] = 1; + var col = SolveWith(Ei); + inv.SetCol(col, i); + } + return inv; + } + + + public double Determinant() // Function for determinant + { + if (L == null) MakeLU(); + var det = detOfP; + for (var i = 0; i < rows; i++) det *= U[i, i]; + return det; + } + + public XLMatrix GetP() // Function returns permutation matrix "P" due to permutation vector "pi" + { + if (L == null) MakeLU(); + + var matrix = ZeroMatrix(rows, cols); + for (var i = 0; i < rows; i++) matrix[pi[i], i] = 1; + return matrix; + } + + public XLMatrix Duplicate() // Function returns the copy of this matrix + { + var matrix = new XLMatrix(rows, cols); + for (var i = 0; i < rows; i++) + for (var j = 0; j < cols; j++) + matrix[i, j] = mat[i, j]; + return matrix; + } + + public static XLMatrix SubsForth(XLMatrix A, XLMatrix b) // Function solves Ax = b for A as a lower triangular matrix + { + if (A.L == null) A.MakeLU(); + var n = A.rows; + var x = new XLMatrix(n, 1); + + for (var i = 0; i < n; i++) + { + x[i, 0] = b[i, 0]; + for (var j = 0; j < i; j++) x[i, 0] -= A[i, j]*x[j, 0]; + x[i, 0] = x[i, 0]/A[i, i]; + } + return x; + } + + public static XLMatrix SubsBack(XLMatrix A, XLMatrix b) // Function solves Ax = b for A as an upper triangular matrix + { + if (A.L == null) A.MakeLU(); + var n = A.rows; + var x = new XLMatrix(n, 1); + + for (var i = n - 1; i > -1; i--) + { + x[i, 0] = b[i, 0]; + for (var j = n - 1; j > i; j--) x[i, 0] -= A[i, j]*x[j, 0]; + x[i, 0] = x[i, 0]/A[i, i]; + } + return x; + } + + public static XLMatrix ZeroMatrix(int iRows, int iCols) // Function generates the zero matrix + { + var matrix = new XLMatrix(iRows, iCols); + for (var i = 0; i < iRows; i++) + for (var j = 0; j < iCols; j++) + matrix[i, j] = 0; + return matrix; + } + + public static XLMatrix IdentityMatrix(int iRows, int iCols) // Function generates the identity matrix + { + var matrix = ZeroMatrix(iRows, iCols); + for (var i = 0; i < Math.Min(iRows, iCols); i++) + matrix[i, i] = 1; + return matrix; + } + + public static XLMatrix RandomMatrix(int iRows, int iCols, int dispersion) // Function generates the zero matrix + { + var random = new Random(); + var matrix = new XLMatrix(iRows, iCols); + for (var i = 0; i < iRows; i++) + for (var j = 0; j < iCols; j++) + matrix[i, j] = random.Next(-dispersion, dispersion); + return matrix; + } + + public static XLMatrix Parse(string ps) // Function parses the matrix from string + { + var s = NormalizeMatrixString(ps); + var rows = Regex.Split(s, "\r\n"); + var nums = rows[0].Split(' '); + var matrix = new XLMatrix(rows.Length, nums.Length); + try + { + for (var i = 0; i < rows.Length; i++) + { + nums = rows[i].Split(' '); + for (var j = 0; j < nums.Length; j++) matrix[i, j] = double.Parse(nums[j]); + } + } + catch (FormatException fe) + { + throw new FormatException("Wrong input format!", fe); + } + return matrix; + } + + public override string ToString() // Function returns matrix as a string + { + var s = ""; + for (var i = 0; i < rows; i++) + { + for (var j = 0; j < cols; j++) s += String.Format("{0,5:0.00}", mat[i, j]) + " "; + s += "\r\n"; + } + return s; + } + + public static XLMatrix Transpose(XLMatrix m) // XLMatrix transpose, for any rectangular matrix + { + var t = new XLMatrix(m.cols, m.rows); + for (var i = 0; i < m.rows; i++) + for (var j = 0; j < m.cols; j++) + t[j, i] = m[i, j]; + return t; + } + + public static XLMatrix Power(XLMatrix m, int pow) // Power matrix to exponent + { + if (pow == 0) return IdentityMatrix(m.rows, m.cols); + if (pow == 1) return m.Duplicate(); + if (pow == -1) return m.Invert(); + + XLMatrix x; + if (pow < 0) + { + x = m.Invert(); + pow *= -1; + } + else x = m.Duplicate(); + + var ret = IdentityMatrix(m.rows, m.cols); + while (pow != 0) + { + if ((pow & 1) == 1) ret *= x; + x *= x; + pow >>= 1; + } + return ret; + } + + private static void SafeAplusBintoC(XLMatrix A, int xa, int ya, XLMatrix B, int xb, int yb, XLMatrix C, int size) + { + for (var i = 0; i < size; i++) // rows + for (var j = 0; j < size; j++) // cols + { + C[i, j] = 0; + if (xa + j < A.cols && ya + i < A.rows) C[i, j] += A[ya + i, xa + j]; + if (xb + j < B.cols && yb + i < B.rows) C[i, j] += B[yb + i, xb + j]; + } + } + + private static void SafeAminusBintoC(XLMatrix A, int xa, int ya, XLMatrix B, int xb, int yb, XLMatrix C, int size) + { + for (var i = 0; i < size; i++) // rows + for (var j = 0; j < size; j++) // cols + { + C[i, j] = 0; + if (xa + j < A.cols && ya + i < A.rows) C[i, j] += A[ya + i, xa + j]; + if (xb + j < B.cols && yb + i < B.rows) C[i, j] -= B[yb + i, xb + j]; + } + } + + private static void SafeACopytoC(XLMatrix A, int xa, int ya, XLMatrix C, int size) + { + for (var i = 0; i < size; i++) // rows + for (var j = 0; j < size; j++) // cols + { + C[i, j] = 0; + if (xa + j < A.cols && ya + i < A.rows) C[i, j] += A[ya + i, xa + j]; + } + } + + private static void AplusBintoC(XLMatrix A, int xa, int ya, XLMatrix B, int xb, int yb, XLMatrix C, int size) + { + for (var i = 0; i < size; i++) // rows + for (var j = 0; j < size; j++) C[i, j] = A[ya + i, xa + j] + B[yb + i, xb + j]; + } + + private static void AminusBintoC(XLMatrix A, int xa, int ya, XLMatrix B, int xb, int yb, XLMatrix C, int size) + { + for (var i = 0; i < size; i++) // rows + for (var j = 0; j < size; j++) C[i, j] = A[ya + i, xa + j] - B[yb + i, xb + j]; + } + + private static void ACopytoC(XLMatrix A, int xa, int ya, XLMatrix C, int size) + { + for (var i = 0; i < size; i++) // rows + for (var j = 0; j < size; j++) C[i, j] = A[ya + i, xa + j]; + } + + private static XLMatrix StrassenMultiply(XLMatrix A, XLMatrix B) // Smart matrix multiplication + { + if (A.cols != B.rows) throw new ArgumentException("Wrong dimension of matrix!"); + + XLMatrix R; + + var msize = Math.Max(Math.Max(A.rows, A.cols), Math.Max(B.rows, B.cols)); + + if (msize < 32) + { + R = ZeroMatrix(A.rows, B.cols); + for (var i = 0; i < R.rows; i++) + for (var j = 0; j < R.cols; j++) + for (var k = 0; k < A.cols; k++) + R[i, j] += A[i, k]*B[k, j]; + return R; + } + + var size = 1; + var n = 0; + while (msize > size) + { + size *= 2; + n++; + } + + var h = size/2; + + + var mField = new XLMatrix[n,9]; + + /* + * 8x8, 8x8, 8x8, ... + * 4x4, 4x4, 4x4, ... + * 2x2, 2x2, 2x2, ... + * . . . + */ + + for (var i = 0; i < n - 4; i++) // rows + { + var z = (int) Math.Pow(2, n - i - 1); + for (var j = 0; j < 9; j++) mField[i, j] = new XLMatrix(z, z); + } + + SafeAplusBintoC(A, 0, 0, A, h, h, mField[0, 0], h); + SafeAplusBintoC(B, 0, 0, B, h, h, mField[0, 1], h); + StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 1], 1, mField); // (A11 + A22) * (B11 + B22); + + SafeAplusBintoC(A, 0, h, A, h, h, mField[0, 0], h); + SafeACopytoC(B, 0, 0, mField[0, 1], h); + StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 2], 1, mField); // (A21 + A22) * B11; + + SafeACopytoC(A, 0, 0, mField[0, 0], h); + SafeAminusBintoC(B, h, 0, B, h, h, mField[0, 1], h); + StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 3], 1, mField); //A11 * (B12 - B22); + + SafeACopytoC(A, h, h, mField[0, 0], h); + SafeAminusBintoC(B, 0, h, B, 0, 0, mField[0, 1], h); + StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 4], 1, mField); //A22 * (B21 - B11); + + SafeAplusBintoC(A, 0, 0, A, h, 0, mField[0, 0], h); + SafeACopytoC(B, h, h, mField[0, 1], h); + StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 5], 1, mField); //(A11 + A12) * B22; + + SafeAminusBintoC(A, 0, h, A, 0, 0, mField[0, 0], h); + SafeAplusBintoC(B, 0, 0, B, h, 0, mField[0, 1], h); + StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 6], 1, mField); //(A21 - A11) * (B11 + B12); + + SafeAminusBintoC(A, h, 0, A, h, h, mField[0, 0], h); + SafeAplusBintoC(B, 0, h, B, h, h, mField[0, 1], h); + StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 7], 1, mField); // (A12 - A22) * (B21 + B22); + + R = new XLMatrix(A.rows, B.cols); // result + + // C11 + for (var i = 0; i < Math.Min(h, R.rows); i++) // rows + for (var j = 0; j < Math.Min(h, R.cols); j++) // cols + R[i, j] = mField[0, 1 + 1][i, j] + mField[0, 1 + 4][i, j] - mField[0, 1 + 5][i, j] + + mField[0, 1 + 7][i, j]; + + // C12 + for (var i = 0; i < Math.Min(h, R.rows); i++) // rows + for (var j = h; j < Math.Min(2*h, R.cols); j++) // cols + R[i, j] = mField[0, 1 + 3][i, j - h] + mField[0, 1 + 5][i, j - h]; + + // C21 + for (var i = h; i < Math.Min(2*h, R.rows); i++) // rows + for (var j = 0; j < Math.Min(h, R.cols); j++) // cols + R[i, j] = mField[0, 1 + 2][i - h, j] + mField[0, 1 + 4][i - h, j]; + + // C22 + for (var i = h; i < Math.Min(2*h, R.rows); i++) // rows + for (var j = h; j < Math.Min(2*h, R.cols); j++) // cols + R[i, j] = mField[0, 1 + 1][i - h, j - h] - mField[0, 1 + 2][i - h, j - h] + + mField[0, 1 + 3][i - h, j - h] + mField[0, 1 + 6][i - h, j - h]; + + return R; + } + + // function for square matrix 2^N x 2^N + + private static void StrassenMultiplyRun(XLMatrix A, XLMatrix B, XLMatrix C, int l, XLMatrix[,] f) + // A * B into C, level of recursion, matrix field + { + var size = A.rows; + var h = size/2; + + if (size < 32) + { + for (var i = 0; i < C.rows; i++) + for (var j = 0; j < C.cols; j++) + { + C[i, j] = 0; + for (var k = 0; k < A.cols; k++) C[i, j] += A[i, k]*B[k, j]; + } + return; + } + + AplusBintoC(A, 0, 0, A, h, h, f[l, 0], h); + AplusBintoC(B, 0, 0, B, h, h, f[l, 1], h); + StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 1], l + 1, f); // (A11 + A22) * (B11 + B22); + + AplusBintoC(A, 0, h, A, h, h, f[l, 0], h); + ACopytoC(B, 0, 0, f[l, 1], h); + StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 2], l + 1, f); // (A21 + A22) * B11; + + ACopytoC(A, 0, 0, f[l, 0], h); + AminusBintoC(B, h, 0, B, h, h, f[l, 1], h); + StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 3], l + 1, f); //A11 * (B12 - B22); + + ACopytoC(A, h, h, f[l, 0], h); + AminusBintoC(B, 0, h, B, 0, 0, f[l, 1], h); + StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 4], l + 1, f); //A22 * (B21 - B11); + + AplusBintoC(A, 0, 0, A, h, 0, f[l, 0], h); + ACopytoC(B, h, h, f[l, 1], h); + StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 5], l + 1, f); //(A11 + A12) * B22; + + AminusBintoC(A, 0, h, A, 0, 0, f[l, 0], h); + AplusBintoC(B, 0, 0, B, h, 0, f[l, 1], h); + StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 6], l + 1, f); //(A21 - A11) * (B11 + B12); + + AminusBintoC(A, h, 0, A, h, h, f[l, 0], h); + AplusBintoC(B, 0, h, B, h, h, f[l, 1], h); + StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 7], l + 1, f); // (A12 - A22) * (B21 + B22); + + // C11 + for (var i = 0; i < h; i++) // rows + for (var j = 0; j < h; j++) // cols + C[i, j] = f[l, 1 + 1][i, j] + f[l, 1 + 4][i, j] - f[l, 1 + 5][i, j] + f[l, 1 + 7][i, j]; + + // C12 + for (var i = 0; i < h; i++) // rows + for (var j = h; j < size; j++) // cols + C[i, j] = f[l, 1 + 3][i, j - h] + f[l, 1 + 5][i, j - h]; + + // C21 + for (var i = h; i < size; i++) // rows + for (var j = 0; j < h; j++) // cols + C[i, j] = f[l, 1 + 2][i - h, j] + f[l, 1 + 4][i - h, j]; + + // C22 + for (var i = h; i < size; i++) // rows + for (var j = h; j < size; j++) // cols + C[i, j] = f[l, 1 + 1][i - h, j - h] - f[l, 1 + 2][i - h, j - h] + f[l, 1 + 3][i - h, j - h] + + f[l, 1 + 6][i - h, j - h]; + } + + public static XLMatrix StupidMultiply(XLMatrix m1, XLMatrix m2) // Stupid matrix multiplication + { + if (m1.cols != m2.rows) throw new ArgumentException("Wrong dimensions of matrix!"); + + var result = ZeroMatrix(m1.rows, m2.cols); + for (var i = 0; i < result.rows; i++) + for (var j = 0; j < result.cols; j++) + for (var k = 0; k < m1.cols; k++) + result[i, j] += m1[i, k]*m2[k, j]; + return result; + } + + private static XLMatrix Multiply(double n, XLMatrix m) // Multiplication by constant n + { + var r = new XLMatrix(m.rows, m.cols); + for (var i = 0; i < m.rows; i++) + for (var j = 0; j < m.cols; j++) + r[i, j] = m[i, j]*n; + return r; + } + + private static XLMatrix Add(XLMatrix m1, XLMatrix m2) + { + if (m1.rows != m2.rows || m1.cols != m2.cols) + throw new ArgumentException("Matrices must have the same dimensions!"); + var r = new XLMatrix(m1.rows, m1.cols); + for (var i = 0; i < r.rows; i++) + for (var j = 0; j < r.cols; j++) + r[i, j] = m1[i, j] + m2[i, j]; + return r; + } + + public static string NormalizeMatrixString(string matStr) // From Andy - thank you! :) + { + // Remove any multiple spaces + while (matStr.IndexOf(" ") != -1) + matStr = matStr.Replace(" ", " "); + + // Remove any spaces before or after newlines + matStr = matStr.Replace(" \r\n", "\r\n"); + matStr = matStr.Replace("\r\n ", "\r\n"); + + // If the data ends in a newline, remove the trailing newline. + // Make it easier by first replacing \r\n’s with |’s then + // restore the |’s with \r\n’s + matStr = matStr.Replace("\r\n", "|"); + while (matStr.LastIndexOf("|") == (matStr.Length - 1)) + matStr = matStr.Substring(0, matStr.Length - 1); + + matStr = matStr.Replace("|", "\r\n"); + return matStr; + } + + // O P E R A T O R S + + public static XLMatrix operator -(XLMatrix m) + { + return Multiply(-1, m); + } + + public static XLMatrix operator +(XLMatrix m1, XLMatrix m2) + { + return Add(m1, m2); + } + + public static XLMatrix operator -(XLMatrix m1, XLMatrix m2) + { + return Add(m1, -m2); + } + + public static XLMatrix operator *(XLMatrix m1, XLMatrix m2) + { + return StrassenMultiply(m1, m2); + } + + public static XLMatrix operator *(double n, XLMatrix m) + { + return Multiply(n, m); + } + } +} \ No newline at end of file diff --git a/ClosedXML/Excel/CalcEngine/Token.cs b/ClosedXML/Excel/CalcEngine/Token.cs new file mode 100644 index 0000000..5677b68 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/Token.cs @@ -0,0 +1,53 @@ +namespace ClosedXML.Excel.CalcEngine +{ + /// + /// Represents a node in the expression tree. + /// + internal class Token + { + // ** fields + public TKID ID; + + public TKTYPE Type; + public object Value; + + // ** ctor + public Token(object value, TKID id, TKTYPE type) + { + Value = value; + ID = id; + Type = type; + } + } + + /// + /// Token types (used when building expressions, sequence defines operator priority) + /// + internal enum TKTYPE + { + COMPARE, // < > = <= >= + ADDSUB, // + - + MULDIV, // * / + POWER, // ^ + MULDIV_UNARY,// % + GROUP, // ( ) , . + LITERAL, // 123.32, "Hello", etc. + IDENTIFIER, // functions, external objects, bindings + ERROR // e.g. #REF! + } + + /// + /// Token ID (used when evaluating expressions) + /// + internal enum TKID + { + GT, LT, GE, LE, EQ, NE, // COMPARE + ADD, SUB, // ADDSUB + MUL, DIV, DIVINT, MOD, // MULDIV + POWER, // POWER + DIV100, // MULTIV_UNARY + OPEN, CLOSE, END, COMMA, PERIOD, // GROUP + ATOM, // LITERAL, IDENTIFIER + CONCAT + } +} diff --git a/ClosedXML/Excel/CalcEngine/XLAddressComparer.cs b/ClosedXML/Excel/CalcEngine/XLAddressComparer.cs new file mode 100644 index 0000000..ca2c1c6 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/XLAddressComparer.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel.CalcEngine +{ + internal class XLAddressComparer : IEqualityComparer + { + private readonly bool _ignoreFixed; + + public XLAddressComparer(bool ignoreFixed) + { + _ignoreFixed = ignoreFixed; + } + + public bool Equals(IXLAddress x, IXLAddress y) + { + return (x == null && y == null) || + (x != null && y != null && + string.Equals(x.Worksheet.Name, y.Worksheet.Name, StringComparison.InvariantCultureIgnoreCase) && + x.ColumnNumber == y.ColumnNumber && + x.RowNumber == y.RowNumber && + (_ignoreFixed || x.FixedColumn == y.FixedColumn && + x.FixedRow == y.FixedRow)); + } + + public int GetHashCode(IXLAddress obj) + { + return new + { + WorksheetName = obj.Worksheet.Name.ToUpperInvariant(), + obj.ColumnNumber, + obj.RowNumber, + FixedColumn = (_ignoreFixed ? false : obj.FixedColumn), + FixedRow = (_ignoreFixed ? false : obj.FixedRow) + }.GetHashCode(); + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/XLCalcEngine.cs b/ClosedXML/Excel/CalcEngine/XLCalcEngine.cs new file mode 100644 index 0000000..5c1a7ff --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/XLCalcEngine.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel.CalcEngine +{ + internal class XLCalcEngine : CalcEngine + { + private readonly IXLWorksheet _ws; + private readonly XLWorkbook _wb; + + public XLCalcEngine() + { } + + public XLCalcEngine(XLWorkbook wb) + { + _wb = wb; + IdentifierChars = new char[] { '$', ':', '!' }; + } + + public XLCalcEngine(IXLWorksheet ws) : this(ws.Workbook) + { + _ws = ws; + } + + private IList _cellRanges; + + public ExpressionCache ExpressionCache => this._cache; + + /// + /// Get a collection of cell ranges included into the expression. Order is not preserved. + /// + /// Formula to parse. + /// Collection of ranges included into the expression. + public IEnumerable GetPrecedentRanges(string expression) + { + _cellRanges = new List(); + Parse(expression); + var ranges = _cellRanges; + _cellRanges = null; + var visitedRanges = new HashSet(new XLRangeAddressComparer(true)); + foreach (var range in ranges) + { + if (!visitedRanges.Contains(range.RangeAddress)) + { + visitedRanges.Add(range.RangeAddress); + yield return range; + } + } + } + + public IEnumerable GetPrecedentCells(string expression) + { + if (!String.IsNullOrWhiteSpace(expression)) + { + var ranges = GetPrecedentRanges(expression); + var visitedCells = new HashSet(new XLAddressComparer(true)); + var cells = ranges.SelectMany(range => range.Cells()).Distinct(); + foreach (var cell in cells) + { + if (!visitedCells.Contains(cell.Address)) + { + visitedCells.Add(cell.Address); + yield return cell; + } + } + } + } + + public override object GetExternalObject(string identifier) + { + if (identifier.Contains("!") && _wb != null) + { + var referencedSheetNames = identifier.Split(':') + .Select(part => + { + if (part.Contains("!")) + return part.Substring(0, part.IndexOf('!')).ToLower(); + else + return null; + }) + .Where(sheet => sheet != null) + .Distinct(); + + if (!referencedSheetNames.Any()) + return GetCellRangeReference(_ws.Range(identifier)); + else if (referencedSheetNames.Count() > 1) + throw new ArgumentOutOfRangeException(referencedSheetNames.Last(), "Cross worksheet references may references no more than 1 other worksheet"); + else + { + if (!_wb.TryGetWorksheet(referencedSheetNames.Single(), out IXLWorksheet worksheet)) + throw new ArgumentOutOfRangeException(referencedSheetNames.Single(), "The required worksheet cannot be found"); + + identifier = identifier.ToLower().Replace(string.Format("{0}!", worksheet.Name.ToLower()), ""); + + return GetCellRangeReference(worksheet.Range(identifier)); + } + } + else if (_ws != null) + { + if (TryGetNamedRange(identifier, _ws, out IXLNamedRange namedRange)) + { + var references = (namedRange as XLNamedRange).RangeList.Select(r => + XLHelper.IsValidRangeAddress(r) + ? GetCellRangeReference(_ws.Workbook.Range(r)) + : new XLCalcEngine(_ws).Evaluate(r.ToString()) + ); + if (references.Count() == 1) + return references.Single(); + return references; + } + + return GetCellRangeReference(_ws.Range(identifier)); + } + else if (XLHelper.IsValidRangeAddress(identifier)) + return identifier; + else + return null; + } + + private bool TryGetNamedRange(string identifier, IXLWorksheet worksheet, out IXLNamedRange namedRange) + { + return worksheet.NamedRanges.TryGetValue(identifier, out namedRange) || + worksheet.Workbook.NamedRanges.TryGetValue(identifier, out namedRange); + } + + private CellRangeReference GetCellRangeReference(IXLRange range) + { + if (range == null) + return null; + + var res = new CellRangeReference(range, this); + _cellRanges?.Add(res.Range); + return res; + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/XLRangeAddressComparer.cs b/ClosedXML/Excel/CalcEngine/XLRangeAddressComparer.cs new file mode 100644 index 0000000..a6f7594 --- /dev/null +++ b/ClosedXML/Excel/CalcEngine/XLRangeAddressComparer.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; + +namespace ClosedXML.Excel.CalcEngine +{ + internal class XLRangeAddressComparer : IEqualityComparer + { + private readonly XLAddressComparer _addressComparer; + + public XLRangeAddressComparer(bool ignoreFixed) + { + _addressComparer = new XLAddressComparer(ignoreFixed); + } + + public bool Equals(IXLRangeAddress x, IXLRangeAddress y) + { + return (x == null && y == null) || + (x != null && y != null && + _addressComparer.Equals(x.FirstAddress, y.FirstAddress) && + _addressComparer.Equals(x.LastAddress, y.LastAddress)); + } + + public int GetHashCode(IXLRangeAddress obj) + { + return new + { + FirstHash = _addressComparer.GetHashCode(obj.FirstAddress), + LastHash = _addressComparer.GetHashCode(obj.LastAddress), + }.GetHashCode(); + } + } +} diff --git a/ClosedXML/Excel/Cells/IXLCell.cs b/ClosedXML/Excel/Cells/IXLCell.cs new file mode 100644 index 0000000..2989c0a --- /dev/null +++ b/ClosedXML/Excel/Cells/IXLCell.cs @@ -0,0 +1,400 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; + +namespace ClosedXML.Excel +{ + public enum XLDataType { Text, Number, Boolean, DateTime, TimeSpan } + + public enum XLTableCellType { None, Header, Data, Total } + + public interface IXLCell + { + Boolean Active { get; set; } + + /// Gets this cell's address, relative to the worksheet. + /// The cell's address. + IXLAddress Address { get; } + + /// + /// Calculated value of cell formula. Is used for decreasing number of computations perfromed. + /// May hold invalid value when flag is True. + /// + Object CachedValue { get; } + + IXLComment Comment { get; } + + /// + /// Returns the current region. The current region is a range bounded by any combination of blank rows and blank columns + /// + /// + /// The current region. + /// + IXLRange CurrentRegion { get; } + + /// + /// Gets or sets the type of this cell's data. + /// Changing the data type will cause ClosedXML to covert the current value to the new data type. + /// An exception will be thrown if the current value cannot be converted to the new data type. + /// + /// + /// The type of the cell's data. + /// + /// + XLDataType DataType { get; set; } + + IXLDataValidation DataValidation { get; } + + /// + /// Gets or sets the cell's formula with A1 references. + /// + /// The formula with A1 references. + String FormulaA1 { get; set; } + + /// + /// Gets or sets the cell's formula with R1C1 references. + /// + /// The formula with R1C1 references. + String FormulaR1C1 { get; set; } + + IXLRangeAddress FormulaReference { get; set; } + + Boolean HasArrayFormula { get; } + + Boolean HasComment { get; } + + Boolean HasDataValidation { get; } + + Boolean HasFormula { get; } + + Boolean HasHyperlink { get; } + + Boolean HasRichText { get; } + + Boolean HasSparkline { get; } + + XLHyperlink Hyperlink { get; set; } + + /// + /// Flag indicating that previously calculated cell value may be not valid anymore and has to be re-evaluated. + /// + Boolean NeedsRecalculation { get; } + + IXLDataValidation NewDataValidation { get; } + + IXLRichText RichText { get; } + + /// + /// Gets or sets a value indicating whether this cell's text should be shared or not. + /// + /// + /// If false the cell's text will not be shared and stored as an inline value. + /// + Boolean ShareString { get; set; } + + IXLSparkline Sparkline { get; } + + /// + /// Gets or sets the cell's style. + /// + IXLStyle Style { get; set; } + + /// + /// Gets or sets the cell's value. To get or set a strongly typed value, use the GetValue<T> and SetValue methods. + /// ClosedXML will try to detect the data type through parsing. If it can't then the value will be left as a string. + /// If the object is an IEnumerable, ClosedXML will copy the collection's data into a table starting from this cell. + /// If the object is a range, ClosedXML will copy the range starting from this cell. + /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. + /// If the value starts with a single quote, ClosedXML will assume the value is a text variable and will prefix the value with a single quote in Excel too. + /// + /// + /// The object containing the value(s) to set. + /// + Object Value { get; set; } + + IXLWorksheet Worksheet { get; } + + IXLConditionalFormat AddConditionalFormat(); + + /// + /// Creates a named range out of this cell. + /// If the named range exists, it will add this range to that named range. + /// The default scope for the named range is Workbook. + /// + /// Name of the range. + IXLCell AddToNamed(String rangeName); + + /// + /// Creates a named range out of this cell. + /// If the named range exists, it will add this range to that named range. + /// Name of the range. + /// The scope for the named range. + /// + IXLCell AddToNamed(String rangeName, XLScope scope); + + /// + /// Creates a named range out of this cell. + /// If the named range exists, it will add this range to that named range. + /// Name of the range. + /// The scope for the named range. + /// The comments for the named range. + /// + IXLCell AddToNamed(String rangeName, XLScope scope, String comment); + + /// + /// Returns this cell as an IXLRange. + /// + IXLRange AsRange(); + + IXLCell CellAbove(); + + IXLCell CellAbove(Int32 step); + + IXLCell CellBelow(); + + IXLCell CellBelow(Int32 step); + + IXLCell CellLeft(); + + IXLCell CellLeft(Int32 step); + + IXLCell CellRight(); + + IXLCell CellRight(Int32 step); + + /// + /// Clears the contents of this cell. + /// + /// Specify what you want to clear. + IXLCell Clear(XLClearOptions clearOptions = XLClearOptions.All); + + IXLCell CopyFrom(IXLCell otherCell); + + IXLCell CopyFrom(String otherCell); + + IXLCell CopyTo(IXLCell target); + + IXLCell CopyTo(String target); + + /// + /// Deletes the current cell and shifts the surrounding cells according to the shiftDeleteCells parameter. + /// + /// How to shift the surrounding cells. + void Delete(XLShiftDeletedCells shiftDeleteCells); + + /// + /// Gets the cell's value converted to Boolean. + /// ClosedXML will try to covert the current value to Boolean. + /// An exception will be thrown if the current value cannot be converted to Boolean. + /// + Boolean GetBoolean(); + + /// + /// Gets the cell's value converted to DateTime. + /// ClosedXML will try to covert the current value to DateTime. + /// An exception will be thrown if the current value cannot be converted to DateTime. + /// + DateTime GetDateTime(); + + /// + /// Gets the cell's value converted to Double. + /// ClosedXML will try to covert the current value to Double. + /// An exception will be thrown if the current value cannot be converted to Double. + /// + Double GetDouble(); + + /// + /// Gets the cell's value formatted depending on the cell's data type and style. + /// + String GetFormattedString(); + + XLHyperlink GetHyperlink(); + + /// + /// Gets the cell's value converted to a String. + /// + String GetString(); + + /// + /// Gets the cell's value converted to TimeSpan. + /// ClosedXML will try to covert the current value to TimeSpan. + /// An exception will be thrown if the current value cannot be converted to TimeSpan. + /// + TimeSpan GetTimeSpan(); + + /// + /// Gets the cell's value converted to the T type. + /// ClosedXML will try to covert the current value to the T type. + /// An exception will be thrown if the current value cannot be converted to the T type. + /// + /// The return type. + /// + T GetValue(); + + IXLCells InsertCellsAbove(int numberOfRows); + + IXLCells InsertCellsAfter(int numberOfColumns); + + IXLCells InsertCellsBefore(int numberOfColumns); + + IXLCells InsertCellsBelow(int numberOfRows); + + /// + /// Inserts the IEnumerable data elements and returns the range it occupies. + /// + /// The IEnumerable data. + IXLRange InsertData(IEnumerable data); + + /// + /// Inserts the IEnumerable data elements and returns the range it occupies. + /// + /// The IEnumerable data. + /// if set to true the data will be transposed before inserting. + /// + IXLRange InsertData(IEnumerable data, Boolean transpose); + + /// + /// Inserts the data of a data table. + /// + /// The data table. + /// The range occupied by the inserted data + IXLRange InsertData(DataTable dataTable); + + /// + /// Inserts the IEnumerable data elements as a table and returns it. + /// The new table will receive a generic name: Table# + /// + /// The table data. + IXLTable InsertTable(IEnumerable data); + + /// + /// Inserts the IEnumerable data elements as a table and returns it. + /// The new table will receive a generic name: Table# + /// + /// The table data. + /// + /// if set to true it will create an Excel table. + /// if set to false the table will be created in memory. + /// + IXLTable InsertTable(IEnumerable data, Boolean createTable); + + /// + /// Creates an Excel table from the given IEnumerable data elements. + /// + /// The table data. + /// Name of the table. + IXLTable InsertTable(IEnumerable data, String tableName); + + /// + /// Inserts the IEnumerable data elements as a table and returns it. + /// + /// The table data. + /// Name of the table. + /// + /// if set to true it will create an Excel table. + /// if set to false the table will be created in memory. + /// + IXLTable InsertTable(IEnumerable data, String tableName, Boolean createTable); + + /// + /// Inserts the DataTable data elements as a table and returns it. + /// The new table will receive a generic name: Table# + /// + /// The table data. + IXLTable InsertTable(DataTable data); + + /// + /// Inserts the DataTable data elements as a table and returns it. + /// The new table will receive a generic name: Table# + /// + /// The table data. + /// + /// if set to true it will create an Excel table. + /// if set to false the table will be created in memory. + /// + IXLTable InsertTable(DataTable data, Boolean createTable); + + /// + /// Creates an Excel table from the given DataTable data elements. + /// + /// The table data. + /// Name of the table. + IXLTable InsertTable(DataTable data, String tableName); + + /// + /// Inserts the DataTable data elements as a table and returns it. + /// + /// The table data. + /// Name of the table. + /// + /// if set to true it will create an Excel table. + /// if set to false the table will be created in memory. + /// + IXLTable InsertTable(DataTable data, String tableName, Boolean createTable); + + /// + /// Invalidate so the formula will be re-evaluated next time is accessed. + /// If cell does not contain formula nothing happens. + /// + void InvalidateFormula(); + + Boolean IsEmpty(); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + Boolean IsEmpty(Boolean includeFormats); + + Boolean IsEmpty(XLCellsUsedOptions options); + + Boolean IsMerged(); + + IXLRange MergedRange(); + + void Select(); + + IXLCell SetActive(Boolean value = true); + + /// + /// Sets the type of this cell's data. + /// Changing the data type will cause ClosedXML to covert the current value to the new data type. + /// An exception will be thrown if the current value cannot be converted to the new data type. + /// + /// Type of the data. + /// + IXLCell SetDataType(XLDataType dataType); + + IXLDataValidation SetDataValidation(); + + IXLCell SetFormulaA1(String formula); + + IXLCell SetFormulaR1C1(String formula); + + /// + /// Sets the cell's value. + /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from this cell. + /// If the object is a range ClosedXML will copy the range starting from this cell. + /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. + /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. + /// + /// + /// The object containing the value(s) to set. + /// + IXLCell SetValue(T value); + + XLTableCellType TableCellType(); + + /// + /// Returns a string that represents the current state of the cell according to the format. + /// + /// A: address, F: formula, NF: number format, BG: background color, FG: foreground color, V: formatted value + /// + string ToString(string format); + + Boolean TryGetValue(out T value); + + IXLColumn WorksheetColumn(); + + IXLRow WorksheetRow(); + } +} diff --git a/ClosedXML/Excel/Cells/IXLCells.cs b/ClosedXML/Excel/Cells/IXLCells.cs new file mode 100644 index 0000000..7148908 --- /dev/null +++ b/ClosedXML/Excel/Cells/IXLCells.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLCells : IEnumerable + { + /// + /// Sets the cells' value. + /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from each cell. + /// If the object is a range ClosedXML will copy the range starting from each cell. + /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. + /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. + /// + /// + /// The object containing the value(s) to set. + /// + Object Value { set; } + + /// + /// Sets the type of the cells' data. + /// Changing the data type will cause ClosedXML to covert the current value to the new data type. + /// An exception will be thrown if the current value cannot be converted to the new data type. + /// + /// + /// The type of the cell's data. + /// + /// + XLDataType DataType { set; } + + IXLCells SetDataType(XLDataType dataType); + + /// + /// Clears the contents of these cells. + /// + /// Specify what you want to clear. + IXLCells Clear(XLClearOptions clearOptions = XLClearOptions.All); + + /// + /// Delete the comments of these cells. + /// + void DeleteComments(); + + /// + /// Delete the sparklines of these cells. + /// + void DeleteSparklines(); + + /// + /// Sets the cells' formula with A1 references. + /// + /// The formula with A1 references. + String FormulaA1 { set; } + + /// + /// Sets the cells' formula with R1C1 references. + /// + /// The formula with R1C1 references. + String FormulaR1C1 { set; } + + IXLStyle Style { get; set; } + + void Select(); + } +} diff --git a/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/Excel/Cells/XLCell.cs new file mode 100644 index 0000000..af98050 --- /dev/null +++ b/ClosedXML/Excel/Cells/XLCell.cs @@ -0,0 +1,3152 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Globalization; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; + +namespace ClosedXML.Excel +{ + using Attributes; + using ClosedXML.Extensions; + + [DebuggerDisplay("{Address}")] + internal class XLCell : XLStylizedBase, IXLCell, IXLStylized + { + public static readonly DateTime BaseDate = new DateTime(1899, 12, 30); + + private static readonly Regex A1Regex = new Regex( + @"(?<=\W)(\$?[a-zA-Z]{1,3}\$?\d{1,7})(?=\W)" // A1 + + @"|(?<=\W)(\$?\d{1,7}:\$?\d{1,7})(?=\W)" // 1:1 + + @"|(?<=\W)(\$?[a-zA-Z]{1,3}:\$?[a-zA-Z]{1,3})(?=\W)", RegexOptions.Compiled); // A:A + + public static readonly Regex A1SimpleRegex = new Regex( + // @"(?<=\W)" // Start with non word + @"(?" // Start Group to pick + + @"(?" // Start Sheet Name, optional + + @"(" + + @"\'([^\[\]\*/\\\?:\']+|\'\')\'" + // Sheet name with special characters, surrounding apostrophes are required + + @"|" + + @"\'?\w+\'?" // Sheet name with letters and numbers, surrounding apostrophes are optional + + @")" + + @"!)?" // End Sheet Name, optional + + @"(?" // Start range + + @"(?:\$?[a-zA-Z]{1,3}\$?\d{1,7})?" // A1 Address 2, optional + + @"(?![\w\d])" // followed by anything but a letter or a number + + @"|" + + @"(?\$?\d{1,7}:\$?\d{1,7})" // 1:1 + + @"|" + + @"(?\$?[a-zA-Z]{1,3}:\$?[a-zA-Z]{1,3})" // A:A + + @")" // End Range + + @")" // End Group to pick + //+ @"(?=\W)" // End with non word + , RegexOptions.Compiled); + + private static readonly Regex A1RowRegex = new Regex( + @"(\$?\d{1,7}:\$?\d{1,7})" // 1:1 + , RegexOptions.Compiled); + + private static readonly Regex A1ColumnRegex = new Regex( + @"(\$?[a-zA-Z]{1,3}:\$?[a-zA-Z]{1,3})" // A:A + , RegexOptions.Compiled); + + private static readonly Regex R1C1Regex = new Regex( + @"(?<=\W)([Rr](?:\[-?\d{0,7}\]|\d{0,7})?[Cc](?:\[-?\d{0,7}\]|\d{0,7})?)(?=\W)" // R1C1 + + @"|(?<=\W)([Rr]\[?-?\d{0,7}\]?:[Rr]\[?-?\d{0,7}\]?)(?=\W)" // R:R + + @"|(?<=\W)([Cc]\[?-?\d{0,5}\]?:[Cc]\[?-?\d{0,5}\]?)(?=\W)", RegexOptions.Compiled); // C:C + + private static readonly Regex utfPattern = new Regex(@"(? + /// Get the data validation rule containing current cell or create a new one if no rule was defined for cell. + /// + public IXLDataValidation DataValidation + { + get + { + return SetDataValidation(); + } + } + + internal XLComment Comment + { + get + { + if (_comment == null) + { + CreateComment(); + } + + return _comment; + } + } + + internal XLComment CreateComment(int? shapeId = null) + { + _comment = new XLComment(this, shapeId: shapeId); + return _comment; + } + + #region IXLCell Members + + IXLDataValidation IXLCell.DataValidation + { + get { return DataValidation; } + } + + IXLWorksheet IXLCell.Worksheet + { + get { return Worksheet; } + } + + IXLAddress IXLCell.Address + { + get { return Address; } + } + + IXLRange IXLCell.AsRange() + { + return AsRange(); + } + + public IXLCell SetValue(T value) + { + if (value is IEnumerable ie && !(value is string)) + { + this.InsertData(ie); + return this; + } + else + return SetValue(value, true); + } + + internal IXLCell SetValue(T value, bool setTableHeader) + { + if (IsInferiorMergedCell()) + return this; + + if (value == null) + return this.Clear(XLClearOptions.Contents); + + FormulaA1 = String.Empty; + _richText = null; + + if (setTableHeader) + { + if (SetTableHeaderValue(value)) return this; + if (SetTableTotalsRowLabel(value)) return this; + } + + var style = GetStyleForRead(); + Boolean parsed; + string parsedValue; + + // For SetValue we set the cell value directly to the parameter + // as opposed to the other SetValue(object value) where we parse the string and try to decude the value + var tuple = SetKnownTypedValue(value, style, acceptString: true); + parsedValue = tuple.Item1; + parsed = tuple.Item2; + + // If parsing was unsuccessful, we throw an ArgumentException + // because we are using SetValue (typed). + // Only in SetValue(object value) to we try to fall back to a value of a different type + if (!parsed) + throw new ArgumentException($"Unable to set cell value to {value.ObjectToInvariantString()}"); + + SetInternalCellValueString(parsedValue, validate: true, parseToCachedValue: false); + + CachedValue = null; + + return this; + } + + // TODO: Replace with (string, bool) ValueTuple later + private Tuple SetKnownTypedValue(T value, XLStyleValue style, Boolean acceptString) + { + string parsedValue; + bool parsed; + if (value is String && acceptString || value is char || value is Guid || value is Enum) + { + parsedValue = value.ObjectToInvariantString(); + _dataType = XLDataType.Text; + if (parsedValue.Contains(Environment.NewLine) && !style.Alignment.WrapText) + Style.Alignment.WrapText = true; + + parsed = true; + } + else if (value.Equals(DBNull.Value)) + { + parsedValue = ""; + _dataType = XLDataType.Text; + parsed = true; + } + else if (value is DateTime d && d >= BaseDate) + { + parsedValue = d.ToOADate().ToInvariantString(); + parsed = true; + SetDateTimeFormat(style, d.Date == d); + } + else if (value is TimeSpan ts) + { + parsedValue = ts.TotalDays.ToInvariantString(); + parsed = true; + SetTimeSpanFormat(style); + } + else if (value is Boolean b) + { + parsedValue = b ? "1" : "0"; + _dataType = XLDataType.Boolean; + parsed = true; + } + else if (value.IsNumber()) + { + if ( + (value is double d1 && (double.IsNaN(d1) || double.IsInfinity(d1))) + || (value is float f && (float.IsNaN(f) || float.IsInfinity(f))) + ) + { + parsedValue = value.ToString(); + _dataType = XLDataType.Text; + parsed = parsedValue.Length != 0; + } + else + { + parsedValue = value.ObjectToInvariantString(); + _dataType = XLDataType.Number; + } + parsed = true; + } + else + { + parsed = false; + parsedValue = null; + } + + return new Tuple(parsedValue, parsed); + } + + private string DeduceCellValueByParsing(string value, XLStyleValue style) + { + if (String.IsNullOrEmpty(value)) + { + _dataType = XLDataType.Text; + } + else if (value[0] == '\'') + { + // If a user sets a cell value to a value starting with a single quote + // ensure the data type is text + // and that it will be prefixed with a quote in Excel too + + value = value.Substring(1, value.Length - 1); + + _dataType = XLDataType.Text; + if (value.Contains(Environment.NewLine) && !style.Alignment.WrapText) + Style.Alignment.WrapText = true; + + this.Style.SetIncludeQuotePrefix(); + } + else if (!string.Equals(value.Trim(), "NaN", StringComparison.OrdinalIgnoreCase) && + Double.TryParse(value, XLHelper.NumberStyle, XLHelper.ParseCulture, out Double _)) + _dataType = XLDataType.Number; + else if (TimeSpan.TryParse(value, out TimeSpan ts)) + { + value = ts.ToInvariantString(); + SetTimeSpanFormat(style); + } + else if (DateTime.TryParse(value, out DateTime dt) && dt >= BaseDate) + { + value = dt.ToOADate().ToInvariantString(); + SetDateTimeFormat(style, dt.Date == dt); + } + else if (Boolean.TryParse(value, out Boolean b)) + { + value = b ? "1" : "0"; + _dataType = XLDataType.Boolean; + } + else + { + _dataType = XLDataType.Text; + if (value.Contains(Environment.NewLine) && !style.Alignment.WrapText) + Style.Alignment.WrapText = true; + } + + return value; + } + + public T GetValue() + { + if (TryGetValue(out T retVal)) + return retVal; + + throw new FormatException($"Cannot convert {this.Address.ToStringRelative(true)}'s value to " + typeof(T)); + } + + public string GetString() + { + return GetValue(); + } + + public double GetDouble() + { + return GetValue(); + } + + public bool GetBoolean() + { + return GetValue(); + } + + public DateTime GetDateTime() + { + return GetValue(); + } + + public TimeSpan GetTimeSpan() + { + return GetValue(); + } + + public string GetFormattedString() + { + var format = GetFormat(); + try + { + return Value.ToExcelFormat(format); + } + catch { } + + try + { + return CachedValue.ToExcelFormat(format); + } + catch { } + + return _cellValue; + } + + /// + /// Flag showing that the cell is in formula evaluation state. + /// + internal bool IsEvaluating { get; private set; } + + /// + /// Calculate a value of the specified formula. + /// + /// Cell formula to evaluate. + /// Null if formula is empty or null, calculated value otherwise. + private object RecalculateFormula(string fA1) + { + if (string.IsNullOrEmpty(fA1)) + return null; + + if (IsEvaluating) + throw new InvalidOperationException("Circular Reference"); + + if (fA1[0] == '{') + fA1 = fA1.Substring(1, fA1.Length - 2); + + string sName; + string cAddress; + if (fA1.Contains('!')) + { + sName = fA1.Substring(0, fA1.IndexOf('!')); + if (sName[0] == '\'') + sName = sName.Substring(1, sName.Length - 2); + + cAddress = fA1.Substring(fA1.IndexOf('!') + 1); + } + else + { + sName = Worksheet.Name; + cAddress = fA1; + } + + if (Worksheet.Workbook.Worksheets.Contains(sName) + && XLHelper.IsValidA1Address(cAddress)) + { + try + { + IsEvaluating = true; + var referenceCell = Worksheet.Workbook.Worksheet(sName).Cell(cAddress); + if (referenceCell.IsEmpty(XLCellsUsedOptions.AllContents)) + return 0; + else + return referenceCell.Value; + } + finally + { + IsEvaluating = false; + } + } + + object retVal; + try + { + IsEvaluating = true; + + if (Worksheet.Workbook.Worksheets.Contains(sName) + && XLHelper.IsValidA1Address(cAddress)) + { + var referenceCell = Worksheet.Workbook.Worksheet(sName).Cell(cAddress); + if (referenceCell.IsEmpty(XLCellsUsedOptions.AllContents)) + return 0; + else + return referenceCell.Value; + } + + retVal = Worksheet.Evaluate(fA1); + } + finally + { + IsEvaluating = false; + } + + if (retVal is IEnumerable retValEnumerable && !(retVal is String)) + return retValEnumerable.Cast().First(); + + return retVal; + } + + public void InvalidateFormula() + { + NeedsRecalculation = true; + Worksheet.Workbook.InvalidateFormulas(); + ModifiedAtVersion = Worksheet.Workbook.RecalculationCounter; + } + + /// + /// Perform an evaluation of cell formula. If cell does not contain formula nothing happens, if cell does not need + /// recalculation ( is False) nothing happens either, unless flag is specified. + /// Otherwise recalculation is perfomed, result value is preserved in and returned. + /// + /// Flag indicating whether a recalculation must be performed even is cell does not need it. + /// Null if cell does not contain a formula. Calculated value otherwise. + public Object Evaluate(Boolean force = false) + { + if (force || NeedsRecalculation) + { + if (HasFormula) + { + CachedValue = RecalculateFormula(FormulaA1); + UpdateCachedValueFromDataType(); + } + else + CachedValue = null; + + EvaluatedAtVersion = Worksheet.Workbook.RecalculationCounter; + NeedsRecalculation = false; + } + return CachedValue; + } + + internal void SetInternalCellValueString(String cellValue) + { + SetInternalCellValueString(cellValue, validate: false, parseToCachedValue: this.HasFormula); + } + + private void SetInternalCellValueString(String cellValue, Boolean validate, Boolean parseToCachedValue) + { + if (validate) + { + if (cellValue.Length > 32767) throw new ArgumentOutOfRangeException(nameof(cellValue), "Cells can hold a maximum of 32,767 characters."); + } + + this._cellValue = cellValue; + + if (parseToCachedValue) + CachedValue = ParseCellValueFromString(); + } + + private void UpdateCachedValueFromDataType() + { + if (CachedValue is double d) + { + if (this.DataType == XLDataType.DateTime && d.IsValidOADateNumber()) + CachedValue = DateTime.FromOADate(d); + else if (this.DataType == XLDataType.TimeSpan) + CachedValue = XLHelper.GetTimeSpan(d); + } + else if (CachedValue is DateTime dt) + { + if (this.DataType == XLDataType.Number) + CachedValue = dt.ToOADate(); + else if (this.DataType == XLDataType.TimeSpan) + CachedValue = XLHelper.GetTimeSpan(dt.ToOADate()); + } + else if (CachedValue is TimeSpan ts) + { + if (this.DataType == XLDataType.DateTime) + CachedValue = DateTime.FromOADate(ts.TotalDays); + else if (this.DataType == XLDataType.Number) + CachedValue = ts.TotalDays; + } + } + + internal void SetDataTypeFast(XLDataType dataType) + { + this._dataType = dataType; + } + + private Object ParseCellValueFromString() + { + return ParseCellValueFromString(_cellValue, _dataType, out String error); + } + + private Object ParseCellValueFromString(String cellValue, XLDataType dataType, out String error) + { + error = ""; + if ("" == cellValue) + return ""; + + if (dataType == XLDataType.Boolean) + { + if (bool.TryParse(cellValue, out Boolean b)) + return b; + else if (cellValue == "0") + return false; + else if (cellValue == "1") + return true; + else + return !string.IsNullOrEmpty(cellValue); + } + + if (dataType == XLDataType.DateTime) + { + if (Double.TryParse(cellValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out Double d)) + { + if (d.IsValidOADateNumber()) + return DateTime.FromOADate(d); + else + return d; + } + else if (DateTime.TryParse(cellValue, out DateTime dt)) + return dt; + else + { + error = string.Format("Cannot set data type to DateTime because '{0}' is not recognized as a date.", cellValue); + return null; + } + } + if (dataType == XLDataType.Number) + { + var v = cellValue; + Double factor = 1.0; + if (v.EndsWith("%")) + { + v = v.Substring(0, v.Length - 1); + factor = 1 / 100.0; + } + + if (Double.TryParse(v, XLHelper.NumberStyle, CultureInfo.InvariantCulture, out Double d)) + return d * factor; + else + { + error = string.Format("Cannot set data type to Number because '{0}' is not recognized as a number.", cellValue); + return null; + } + } + + if (dataType == XLDataType.TimeSpan) + { + if (TimeSpan.TryParse(cellValue, out TimeSpan ts)) + return ts; + else if (Double.TryParse(cellValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out Double d)) + return XLHelper.GetTimeSpan(d); + else + { + error = string.Format("Cannot set data type to TimeSpan because '{0}' is not recognized as a TimeSpan.", cellValue); + return null; + } + } + + return cellValue; + } + + public override string ToString() => ToString("A"); + + public string ToString(string format) + { + return (format.ToUpper()) switch + { + "A" => this.Address.ToString(), + "F" => HasFormula ? this.FormulaA1 : string.Empty, + "NF" => Style.NumberFormat.Format, + "FG" => Style.Font.FontColor.ToString(), + "BG" => Style.Fill.BackgroundColor.ToString(), + "V" => GetFormattedString(), + _ => throw new FormatException($"Format {format} was not recognised."), + }; + } + + public object Value + { + get + { + if (!String.IsNullOrWhiteSpace(_formulaA1) || + !String.IsNullOrEmpty(_formulaR1C1)) + { + return Evaluate(); + } + + var cellValue = HasRichText ? _richText.ToString() : _cellValue; + return ParseCellValueFromString(cellValue, _dataType, out _); + } + set + { + if (IsInferiorMergedCell()) + return; + + FormulaA1 = String.Empty; + + if (value is XLCells) throw new ArgumentException("Cannot assign IXLCells object to the cell value."); + + if (SetTableHeaderValue(value)) return; + + if (SetRangeRows(value)) return; + + if (SetRangeColumns(value)) return; + + if (SetDataTable(value)) return; + + if (SetEnumerable(value)) return; + + if (SetRange(value)) return; + + if (!SetRichText(value)) + SetValue(value); + + CachedValue = null; + + if (_cellValue.Length > 32767) throw new ArgumentOutOfRangeException(nameof(value), "Cells can hold only 32,767 characters."); + } + } + + public IXLTable InsertTable(IEnumerable data) + { + return InsertTable(data, null, true); + } + + public IXLTable InsertTable(IEnumerable data, bool createTable) + { + return InsertTable(data, null, createTable); + } + + public IXLTable InsertTable(IEnumerable data, string tableName) + { + return InsertTable(data, tableName, true); + } + + public IXLTable InsertTable(IEnumerable data, String tableName, Boolean createTable) + { + return InsertTable(data, tableName, createTable, addHeadings: true, transpose: false); + } + + public IXLTable InsertTable(IEnumerable data, String tableName, Boolean createTable, Boolean addHeadings, Boolean transpose) + { + if (createTable && this.Worksheet.Tables.Any(t => t.Contains(this))) + throw new InvalidOperationException(String.Format("This cell '{0}' is already part of a table.", this.Address.ToString())); + + var range = InsertDataInternal(data, addHeadings, transpose); + + if (createTable) + // Create a table and save it in the file + return tableName == null ? range.CreateTable() : range.CreateTable(tableName); + else + // Create a table, but keep it in memory. Saved file will contain only "raw" data and column headers + return tableName == null ? range.AsTable() : range.AsTable(tableName); + } + + public IXLTable InsertTable(DataTable data) + { + return InsertTable(data, null, true); + } + + public IXLTable InsertTable(DataTable data, Boolean createTable) + { + return InsertTable(data, null, createTable); + } + + public IXLTable InsertTable(DataTable data, String tableName) + { + return InsertTable(data, tableName, true); + } + + public IXLTable InsertTable(DataTable data, String tableName, Boolean createTable) + { + if (data == null || data.Columns.Count == 0) + return null; + + if (XLHelper.IsValidA1Address(tableName) || XLHelper.IsValidRCAddress(tableName)) + throw new InvalidOperationException(string.Format("Table name cannot be a valid Cell Address '{0}'.", tableName)); + + if (createTable && this.Worksheet.Tables.Any(t => t.Contains(this))) + throw new InvalidOperationException(String.Format("This cell '{0}' is already part of a table.", this.Address.ToString())); + + if (data.Rows.Cast().Any()) + return InsertTable(data.Rows.Cast(), tableName, createTable); + + var co = _columnNumber; + + foreach (DataColumn col in data.Columns) + { + Worksheet.SetValue(col.ColumnName, _rowNumber, co); + co++; + } + + ClearMerged(); + var range = Worksheet.Range( + _rowNumber, + _columnNumber, + _rowNumber, + co - 1); + + if (createTable) + // Create a table and save it in the file + return tableName == null ? range.CreateTable() : range.CreateTable(tableName); + else + // Create a table, but keep it in memory. Saved file will contain only "raw" data and column headers + return tableName == null ? range.AsTable() : range.AsTable(tableName); + } + + internal XLRange InsertDataInternal(IEnumerable data, Boolean addHeadings, Boolean transpose) + { + if (data == null || data is String) + return null; + + var currentRowNumber = _rowNumber; + if (addHeadings && !transpose) currentRowNumber++; + + var currentColumnNumber = _columnNumber; + if (addHeadings && transpose) currentColumnNumber++; + + var firstRowNumber = _rowNumber; + var hasHeadings = false; + var maximumColumnNumber = currentColumnNumber; + var maximumRowNumber = currentRowNumber; + + var itemType = data.GetItemType(); + var isArray = itemType.IsArray; + var isDataTable = itemType == typeof(DataTable); + var isDataReader = itemType == typeof(IDataReader); + + // Inline functions to handle looping with transposing + ////////////////////////////////////////////////////// + void incrementFieldPosition() + { + if (transpose) + { + maximumRowNumber = Math.Max(maximumRowNumber, currentRowNumber); + currentRowNumber++; + } + else + { + maximumColumnNumber = Math.Max(maximumColumnNumber, currentColumnNumber); + currentColumnNumber++; + } + } + + void incrementRecordPosition() + { + if (transpose) + { + maximumColumnNumber = Math.Max(maximumColumnNumber, currentColumnNumber); + currentColumnNumber++; + } + else + { + maximumRowNumber = Math.Max(maximumRowNumber, currentRowNumber); + currentRowNumber++; + } + } + + void resetRecordPosition() + { + if (transpose) + currentRowNumber = _rowNumber; + else + currentColumnNumber = _columnNumber; + } + ////////////////////////////////////////////////////// + + if (!data.Any()) + { + if (itemType.IsSimpleType()) + maximumColumnNumber = _columnNumber; + else + maximumColumnNumber = _columnNumber + itemType.GetFields().Length + itemType.GetProperties().Length - 1; + } + else if (itemType.IsSimpleType()) + { + foreach (object o in data) + { + resetRecordPosition(); + + if (addHeadings && !hasHeadings) + { + var fieldName = XLColumnAttribute.GetHeader(itemType); + if (String.IsNullOrWhiteSpace(fieldName)) + fieldName = itemType.Name; + + Worksheet.SetValue(fieldName, firstRowNumber, currentColumnNumber); + hasHeadings = true; + resetRecordPosition(); + } + + Worksheet.SetValue(o, currentRowNumber, currentColumnNumber); + incrementFieldPosition(); + incrementRecordPosition(); + } + } + else + { + const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static; + var memberCache = new Dictionary(); + MemberInfo[] members = null; + bool isPlainObject = itemType == typeof(object); + + if (!isPlainObject) + { + members = itemType.GetFields(bindingFlags).Cast() + .Concat(itemType.GetProperties(bindingFlags)) + .Where(mi => !XLColumnAttribute.IgnoreMember(mi)) + .OrderBy(mi => XLColumnAttribute.GetOrder(mi)) + .ToArray(); + } + + foreach (T m in data) + { + resetRecordPosition(); + + if (m == null) + { + Worksheet.SetValue(String.Empty, currentRowNumber, currentColumnNumber); + incrementRecordPosition(); + continue; + } + + if (m.GetType().IsSimpleType()) + { + if (addHeadings && !hasHeadings) + { + var fieldName = XLColumnAttribute.GetHeader(itemType); + if (String.IsNullOrWhiteSpace(fieldName)) + fieldName = itemType.Name; + + Worksheet.SetValue(fieldName, firstRowNumber, currentColumnNumber); + hasHeadings = true; + resetRecordPosition(); + } + + Worksheet.SetValue(m as object, currentRowNumber, currentColumnNumber); + incrementFieldPosition(); + } + else + { + if (isPlainObject) + { + // In this case data is just IEnumerable, which means we have to determine the runtime type of each element + // This is very inefficient and we prefer type of T to be a concrete class or struct + var type = m.GetType(); + + isArray |= type.IsArray; + isDataTable |= type == typeof(DataRow); + isDataReader |= type == typeof(IDataRecord); + + if (!memberCache.TryGetValue(type, out members)) + { + members = type.GetFields(bindingFlags).Cast() + .Concat(type.GetProperties(bindingFlags)) + .Where(mi => !XLColumnAttribute.IgnoreMember(mi)) + .OrderBy(mi => XLColumnAttribute.GetOrder(mi)) + .ToArray(); + + memberCache.Add(type, members); + } + } + + if (isArray) + { + foreach (var item in (m as Array)) + { + Worksheet.SetValue(item, currentRowNumber, currentColumnNumber); + incrementFieldPosition(); + } + } + else if (isDataTable || m is DataRow) + { + var row = m as DataRow; + if (!isDataTable) + isDataTable = true; + + if (addHeadings && !hasHeadings) + { + foreach (var fieldName in from DataColumn column in row.Table.Columns + select String.IsNullOrWhiteSpace(column.Caption) + ? column.ColumnName + : column.Caption) + { + Worksheet.SetValue(fieldName, firstRowNumber, currentColumnNumber); + incrementFieldPosition(); + } + + resetRecordPosition(); + hasHeadings = true; + } + + foreach (var item in row.ItemArray) + { + Worksheet.SetValue(item, currentRowNumber, currentColumnNumber); + incrementFieldPosition(); + } + } + else if (isDataReader || m is IDataRecord) + { + if (!isDataReader) + isDataReader = true; + + var record = m as IDataRecord; + + var fieldCount = record.FieldCount; + if (addHeadings && !hasHeadings) + { + for (var i = 0; i < fieldCount; i++) + { + Worksheet.SetValue(record.GetName(i), firstRowNumber, currentColumnNumber); + incrementFieldPosition(); + } + + resetRecordPosition(); + hasHeadings = true; + } + + for (var i = 0; i < fieldCount; i++) + { + Worksheet.SetValue(record[i], currentRowNumber, currentColumnNumber); + incrementFieldPosition(); + } + } + else + { + if (addHeadings && !hasHeadings) + { + foreach (var mi in members) + { + if (!(mi is IEnumerable)) + { + var fieldName = XLColumnAttribute.GetHeader(mi); + if (String.IsNullOrWhiteSpace(fieldName)) + fieldName = mi.Name; + + Worksheet.SetValue(fieldName, firstRowNumber, currentColumnNumber); + } + + incrementFieldPosition(); + } + + resetRecordPosition(); + hasHeadings = true; + } + + foreach (var mi in members) + { + if (mi.MemberType == MemberTypes.Property && (mi as PropertyInfo).GetGetMethod().IsStatic) + Worksheet.SetValue((mi as PropertyInfo).GetValue(null, null), currentRowNumber, currentColumnNumber); + else if (mi.MemberType == MemberTypes.Field && (mi as FieldInfo).IsStatic) + Worksheet.SetValue((mi as FieldInfo).GetValue(null), currentRowNumber, currentColumnNumber); + else if (mi.MemberType == MemberTypes.Property) + Worksheet.SetValue((mi as PropertyInfo).GetValue(m, null), currentRowNumber, currentColumnNumber); + else if (mi.MemberType == MemberTypes.Field) + Worksheet.SetValue((mi as FieldInfo).GetValue(m), currentRowNumber, currentColumnNumber); + + incrementFieldPosition(); + } + } + } + + incrementRecordPosition(); + } + } + + ClearMerged(); + + var range = Worksheet.Range( + _rowNumber, + _columnNumber, + maximumRowNumber, + maximumColumnNumber); + + return range; + } + + public XLTableCellType TableCellType() + { + var table = this.Worksheet.Tables.FirstOrDefault(t => t.AsRange().Contains(this)); + if (table == null) return XLTableCellType.None; + + if (table.ShowHeaderRow && table.HeadersRow().RowNumber().Equals(this._rowNumber)) return XLTableCellType.Header; + if (table.ShowTotalsRow && table.TotalsRow().RowNumber().Equals(this._rowNumber)) return XLTableCellType.Total; + + return XLTableCellType.Data; + } + + public IXLRange InsertData(IEnumerable data) + { + if (data == null || data is String) + return null; + + return InsertDataInternal(data?.Cast(), addHeadings: false, transpose: false); + } + + public IXLRange InsertData(IEnumerable data, Boolean transpose) + { + if (data == null || data is String) + return null; + + return InsertDataInternal(data?.Cast(), addHeadings: false, transpose: transpose); + } + + public IXLRange InsertData(DataTable dataTable) + { + if (dataTable == null) + return null; + + return InsertDataInternal(dataTable?.Rows?.Cast(), addHeadings: false, transpose: false); + } + + public IXLCell SetDataType(XLDataType dataType) + { + DataType = dataType; + return this; + } + + public XLDataType DataType + { + get { return _dataType; } + set + { + if (_dataType == value) return; + + if (HasRichText) + { + _cellValue = _richText.ToString(); + _richText = null; + } + + if (!string.IsNullOrEmpty(_cellValue)) + { + // If we're converting the DataType to Text, there are some quirky rules currently + if (value == XLDataType.Text) + { + var v = Value; + switch (v) + { + case DateTime d: + _cellValue = d.ToOADate().ToInvariantString(); + break; + + case TimeSpan ts: + _cellValue = ts.TotalDays.ToInvariantString(); + break; + + case Boolean b: + _cellValue = b ? "True" : "False"; + break; + + default: + _cellValue = v.ObjectToInvariantString(); + break; + } + } + else + { + var v = ParseCellValueFromString(_cellValue, value, out String error); + + if (!String.IsNullOrWhiteSpace(error)) + throw new ArgumentException(error, nameof(value)); + + _cellValue = v?.ObjectToInvariantString() ?? ""; + + var style = GetStyleForRead(); + switch (v) + { + case DateTime d: + _cellValue = d.ToOADate().ToInvariantString(); + + if (style.NumberFormat.Format.Length == 0 && style.NumberFormat.NumberFormatId == 0) + Style.NumberFormat.NumberFormatId = _cellValue.Contains('.') ? 22 : 14; + + break; + + case TimeSpan ts: + if (style.NumberFormat.Format.Length == 0 && style.NumberFormat.NumberFormatId == 0) + Style.NumberFormat.NumberFormatId = 46; + + break; + + case Boolean b: + _cellValue = b ? "1" : "0"; + break; + } + } + } + + _dataType = value; + + if (HasFormula && !NeedsRecalculation) + UpdateCachedValueFromDataType(); + else + CachedValue = null; + } + } + + public IXLCell Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + return Clear(clearOptions, false); + } + + internal IXLCell Clear(XLClearOptions clearOptions, bool calledFromRange) + { + //Note: We have to check if the cell is part of a merged range. If so we have to clear the whole range + //Checking if called from range to avoid stack overflow + if (!calledFromRange && IsMerged()) + { + var firstOrDefault = Worksheet.Internals.MergedRanges.GetIntersectedRanges(Address).FirstOrDefault(); + if (firstOrDefault != null) + firstOrDefault.Clear(clearOptions); + } + else + { + if (clearOptions.HasFlag(XLClearOptions.Contents)) + { + Hyperlink = null; + _richText = null; + _cellValue = String.Empty; + FormulaA1 = String.Empty; + } + + if (clearOptions.HasFlag(XLClearOptions.DataType)) + _dataType = XLDataType.Text; + + if (clearOptions.HasFlag(XLClearOptions.NormalFormats)) + SetStyle(Worksheet.Style); + + if (clearOptions.HasFlag(XLClearOptions.ConditionalFormats)) + { + AsRange().RemoveConditionalFormatting(); + } + + if (clearOptions.HasFlag(XLClearOptions.Comments)) + _comment = null; + + if (clearOptions.HasFlag(XLClearOptions.Sparklines)) + { + AsRange().RemoveSparklines(); + } + + if (clearOptions.HasFlag(XLClearOptions.DataValidation) && HasDataValidation) + { + var validation = NewDataValidation; + Worksheet.DataValidations.Delete(validation); + } + + if (clearOptions.HasFlag(XLClearOptions.MergedRanges) && IsMerged()) + { + ClearMerged(); + } + } + + return this; + } + + public void Delete(XLShiftDeletedCells shiftDeleteCells) + { + Worksheet.Range(Address, Address).Delete(shiftDeleteCells); + } + + public string FormulaA1 + { + get + { + if (String.IsNullOrWhiteSpace(_formulaA1)) + { + if (!String.IsNullOrWhiteSpace(_formulaR1C1)) + { + _formulaA1 = GetFormulaA1(_formulaR1C1); + return FormulaA1; + } + + return String.Empty; + } + + if (_formulaA1.Trim()[0] == '=') + return _formulaA1.Substring(1); + + if (_formulaA1.Trim().StartsWith("{=")) + return "{" + _formulaA1.Substring(2); + + return _formulaA1; + } + + set + { + if (IsInferiorMergedCell()) + return; + + InvalidateFormula(); + + _formulaA1 = String.IsNullOrWhiteSpace(value) ? null : value; + + _formulaR1C1 = null; + } + } + + public string FormulaR1C1 + { + get + { + if (String.IsNullOrWhiteSpace(_formulaR1C1)) + _formulaR1C1 = GetFormulaR1C1(FormulaA1); + + return _formulaR1C1; + } + + set + { + if (IsInferiorMergedCell()) + return; + + InvalidateFormula(); + + _formulaR1C1 = String.IsNullOrWhiteSpace(value) ? null : value; + + _formulaA1 = null; + } + } + + public bool ShareString { get; set; } + + public XLHyperlink Hyperlink + { + get + { + if (_hyperlink == null) + Hyperlink = new XLHyperlink(); + + return _hyperlink; + } + + set + { + if (Worksheet.Hyperlinks.Any(hl => Address.Equals(hl.Cell.Address))) + Worksheet.Hyperlinks.Delete(Address); + + _hyperlink = value; + + if (_hyperlink == null) return; + + _hyperlink.Worksheet = Worksheet; + _hyperlink.Cell = this; + + Worksheet.Hyperlinks.Add(_hyperlink); + + if (SettingHyperlink) return; + + if (GetStyleForRead().Font.FontColor.Equals(Worksheet.StyleValue.Font.FontColor)) + Style.Font.FontColor = XLColor.FromTheme(XLThemeColor.Hyperlink); + + if (GetStyleForRead().Font.Underline == Worksheet.StyleValue.Font.Underline) + Style.Font.Underline = XLFontUnderlineValues.Single; + } + } + + public IXLCells InsertCellsAbove(int numberOfRows) + { + return AsRange().InsertRowsAbove(numberOfRows).Cells(); + } + + public IXLCells InsertCellsBelow(int numberOfRows) + { + return AsRange().InsertRowsBelow(numberOfRows).Cells(); + } + + public IXLCells InsertCellsAfter(int numberOfColumns) + { + return AsRange().InsertColumnsAfter(numberOfColumns).Cells(); + } + + public IXLCells InsertCellsBefore(int numberOfColumns) + { + return AsRange().InsertColumnsBefore(numberOfColumns).Cells(); + } + + public IXLCell AddToNamed(string rangeName) + { + AsRange().AddToNamed(rangeName); + return this; + } + + public IXLCell AddToNamed(string rangeName, XLScope scope) + { + AsRange().AddToNamed(rangeName, scope); + return this; + } + + public IXLCell AddToNamed(string rangeName, XLScope scope, string comment) + { + AsRange().AddToNamed(rangeName, scope, comment); + return this; + } + + private bool _recalculationNeededLastValue; + + /// + /// Flag indicating that previously calculated cell value may be not valid anymore and has to be re-evaluated. + /// + public bool NeedsRecalculation + { + get + { + if (String.IsNullOrWhiteSpace(_formulaA1) && String.IsNullOrEmpty(_formulaR1C1)) + return false; + + if (NeedsRecalculationEvaluatedAtVersion == Worksheet.Workbook.RecalculationCounter) + return _recalculationNeededLastValue; + + bool res = EvaluatedAtVersion < ModifiedAtVersion || // the cell itself was modified + GetAffectingCells().Any(cell => cell.ModifiedAtVersion > EvaluatedAtVersion || // the affecting cell was modified after this one was evaluated + cell.EvaluatedAtVersion > EvaluatedAtVersion || // the affecting cell was evaluated after this one (normally this should not happen) + cell.NeedsRecalculation); // the affecting cell needs recalculation (recursion to walk through dependencies) + + NeedsRecalculation = res; + return res; + } + internal set + { + _recalculationNeededLastValue = value; + NeedsRecalculationEvaluatedAtVersion = Worksheet.Workbook.RecalculationCounter; + } + } + + private IEnumerable GetAffectingCells() + { + return Worksheet.CalcEngine.GetPrecedentCells(_formulaA1).Cast(); + } + + /// + /// The value of that workbook had at the moment of cell last modification. + /// If this value is greater than then cell needs re-evaluation, as well as all dependent cells do. + /// + private long ModifiedAtVersion { get; set; } + + /// + /// The value of that workbook had at the moment of cell formula evaluation. + /// If this value equals to it indicates that stores + /// correct value and no re-evaluation has to be performed. + /// + private long EvaluatedAtVersion { get; set; } + + /// + /// The value of that workbook had at the moment of determining whether the cell + /// needs re-evaluation (due to it has been edited or some of the affecting cells has). If thie value equals to + /// it indicates that stores correct value and no check has to be performed. + /// + private long NeedsRecalculationEvaluatedAtVersion { get; set; } + + private Object cachedValue; + + public Object CachedValue + { + get + { + if (!HasFormula && cachedValue == null) + cachedValue = Value; + + return cachedValue; + } + private set + { + if (value != null && !HasFormula) + throw new InvalidOperationException("Cached values can be set only for cells with formulas"); + + cachedValue = value; + } + } + + public IXLRichText RichText + { + get + { + if (_richText == null) + { + var style = GetStyleForRead(); + _richText = _cellValue.Length == 0 + ? new XLRichText(new XLFont(Style as XLStyle, style.Font)) + : new XLRichText(GetFormattedString(), new XLFont(Style as XLStyle, style.Font)); + } + + return _richText; + } + } + + public bool HasRichText + { + get { return _richText != null; } + } + + IXLComment IXLCell.Comment + { + get { return Comment; } + } + + public bool HasComment + { + get { return _comment != null; } + } + + public Boolean IsMerged() + { + return Worksheet.Internals.MergedRanges.Contains(this); + } + + public IXLRange MergedRange() + { + return Worksheet + .Internals + .MergedRanges + .GetIntersectedRanges(this) + .FirstOrDefault(); + } + + public Boolean IsEmpty() + { + return IsEmpty(XLCellsUsedOptions.AllContents); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public Boolean IsEmpty(Boolean includeFormats) + { + return IsEmpty(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + public Boolean IsEmpty(XLCellsUsedOptions options) + { + if (InnerText.Length > 0) + return false; + + if (options.HasFlag(XLCellsUsedOptions.NormalFormats)) + { + if (StyleValue.IncludeQuotePrefix) + return false; + + if (!StyleValue.Equals(Worksheet.StyleValue)) + return false; + + if (StyleValue.Equals(Worksheet.StyleValue)) + { + if (Worksheet.Internals.RowsCollection.TryGetValue(_rowNumber, out XLRow row) && !row.StyleValue.Equals(Worksheet.StyleValue)) + return false; + + if (Worksheet.Internals.ColumnsCollection.TryGetValue(_columnNumber, out XLColumn column) && !column.StyleValue.Equals(Worksheet.StyleValue)) + return false; + } + } + + if (options.HasFlag(XLCellsUsedOptions.MergedRanges) && IsMerged()) + return false; + + if (options.HasFlag(XLCellsUsedOptions.Comments) && HasComment) + return false; + + if (options.HasFlag(XLCellsUsedOptions.DataValidation) && HasDataValidation) + return false; + + if (options.HasFlag(XLCellsUsedOptions.ConditionalFormats) + && Worksheet.ConditionalFormats.SelectMany(cf => cf.Ranges).Any(range => range.Contains(this))) + return false; + + if (options.HasFlag(XLCellsUsedOptions.Sparklines) && HasSparkline) + return false; + + return true; + } + + public IXLColumn WorksheetColumn() + { + return Worksheet.Column(_columnNumber); + } + + public IXLRow WorksheetRow() + { + return Worksheet.Row(_rowNumber); + } + + public IXLCell CopyTo(IXLCell target) + { + (target as XLCell).CopyFrom(this, XLCellCopyOptions.All); + return target; + } + + public IXLCell CopyTo(String target) + { + return CopyTo(GetTargetCell(target, Worksheet)); + } + + public IXLCell CopyFrom(IXLCell otherCell) + { + return CopyFrom(otherCell as XLCell, XLCellCopyOptions.All); + } + + public IXLCell CopyFrom(String otherCell) + { + return CopyFrom(GetTargetCell(otherCell, Worksheet)); + } + + public IXLCell SetFormulaA1(String formula) + { + FormulaA1 = formula; + return this; + } + + public IXLCell SetFormulaR1C1(String formula) + { + FormulaR1C1 = formula; + return this; + } + + public Boolean HasSparkline => Sparkline != null; + + /// The sparkline assigned to the cell + public IXLSparkline Sparkline => Worksheet.SparklineGroups.GetSparkline(this); + + public Boolean HasDataValidation + { + get { return GetDataValidation() != null; } + } + + /// + /// Get the data validation rule containing current cell. + /// + /// The data validation rule applying to the current cell or null if there is no such rule. + private IXLDataValidation GetDataValidation() + { + Worksheet.DataValidations.TryGet(AsRange().RangeAddress, out var dataValidation); + return dataValidation; + } + + public IXLDataValidation SetDataValidation() + { + var validation = GetDataValidation(); + if (validation == null) + { + validation = new XLDataValidation(AsRange()); + Worksheet.DataValidations.Add(validation); + } + return validation; + } + + public void Select() + { + AsRange().Select(); + } + + public IXLConditionalFormat AddConditionalFormat() + { + return AsRange().AddConditionalFormat(); + } + + public Boolean Active + { + get { return Worksheet.ActiveCell == this; } + set + { + if (value) + Worksheet.ActiveCell = this; + else if (Active) + Worksheet.ActiveCell = null; + } + } + + public IXLCell SetActive(Boolean value = true) + { + Active = value; + return this; + } + + public Boolean HasHyperlink + { + get { return _hyperlink != null; } + } + + public XLHyperlink GetHyperlink() + { + if (HasHyperlink) + return Hyperlink; + + return Value as XLHyperlink; + } + + public Boolean TryGetValue(out T value) + { + var targetType = typeof(T); + var underlyingType = targetType.GetUnderlyingType(); + var isNullable = targetType.IsNullableType(); + + Object currentValue; + try + { + currentValue = Value; + } + catch + { + // May fail for formula evaluation + value = default; + return false; + } + + if (isNullable && (currentValue == null || currentValue is string s && String.IsNullOrEmpty(s))) + { + value = default; + return true; + } + + if (targetType != typeof(String) // Strings are handled later and have some specifics to UTF handling + && currentValue is T t) + { + value = t; + return true; + } + + if (TryGetDateTimeValue(out value, currentValue)) return true; + + if (TryGetTimeSpanValue(out value, currentValue)) return true; + + if (TryGetBooleanValue(out value, currentValue)) return true; + + if (TryGetRichStringValue(out value)) return true; + + if (TryGetStringValue(out value, currentValue)) return true; + + if (TryGetHyperlink(out value)) return true; + + if (currentValue.IsNumber()) + { + try + { + value = (T)Convert.ChangeType(currentValue, underlyingType); + return true; + } + catch (Exception) + { + value = default; + return false; + } + } + + var strValue = currentValue.ToString(); + + if (underlyingType == typeof(sbyte)) return TryGetBasicValue(strValue, sbyte.TryParse, out value); + if (underlyingType == typeof(byte)) return TryGetBasicValue(strValue, byte.TryParse, out value); + if (underlyingType == typeof(short)) return TryGetBasicValue(strValue, short.TryParse, out value); + if (underlyingType == typeof(ushort)) return TryGetBasicValue(strValue, ushort.TryParse, out value); + if (underlyingType == typeof(int)) return TryGetBasicValue(strValue, int.TryParse, out value); + if (underlyingType == typeof(uint)) return TryGetBasicValue(strValue, uint.TryParse, out value); + if (underlyingType == typeof(long)) return TryGetBasicValue(strValue, long.TryParse, out value); + if (underlyingType == typeof(ulong)) return TryGetBasicValue(strValue, ulong.TryParse, out value); + if (underlyingType == typeof(float)) return TryGetBasicValue(strValue, float.TryParse, out value); + if (underlyingType == typeof(double)) return TryGetBasicValue(strValue, double.TryParse, out value); + if (underlyingType == typeof(decimal)) return TryGetBasicValue(strValue, decimal.TryParse, out value); + + if (underlyingType.IsEnum) + { + if (Enum.IsDefined(underlyingType, strValue)) + { + value = (T)Enum.Parse(underlyingType, strValue, ignoreCase: false); + return true; + } + value = default; + return false; + } + + try + { + value = (T)Convert.ChangeType(currentValue, targetType); + return true; + } + catch + { + value = default; + return false; + } + } + + private static bool TryGetDateTimeValue(out T value, object currentValue) + { + if (typeof(T) != typeof(DateTime) && typeof(T) != typeof(DateTime?)) + { + value = default; + return false; + } + + if (currentValue is T v) { value = v; return true; } + + if (currentValue.IsNumber()) + { + var dbl1 = Convert.ToDouble(currentValue); + if (dbl1.IsValidOADateNumber()) + { + value = (T)Convert.ChangeType(DateTime.FromOADate(dbl1), typeof(T)); + return true; + } + } + + if (DateTime.TryParse(currentValue.ToString(), out DateTime ts)) + { + value = (T)Convert.ChangeType(ts, typeof(T)); + return true; + } + + // If the cell value is a string, e.g. "42020", we could theoretically coerce it to a DateTime, but this seems to go against what is expected. + // Leaving this code block here, though. Maybe we revert our decision later. + + //if (Double.TryParse(currentValue.ObjectToInvariantString(), out Double dbl2) && dbl2.IsValidOADateNumber()) + //{ + // value = (T)Convert.ChangeType(DateTime.FromOADate(dbl2), typeof(T)); + // return true; + //} + + value = default; + return false; + } + + private static bool TryGetTimeSpanValue(out T value, object currentValue) + { + if (typeof(T) != typeof(TimeSpan) && typeof(T) != typeof(TimeSpan?)) + { + value = default; + return false; + } + + if (currentValue is T v) { value = v; return true; } + + if (!TimeSpan.TryParse(currentValue.ToString(), out TimeSpan ts)) + { + value = default; + return false; + } + + value = (T)Convert.ChangeType(ts, typeof(T)); + return true; + } + + private bool TryGetRichStringValue(out T value) + { + if (typeof(T) == typeof(IXLRichText)) + { + value = (T)RichText; + return true; + } + value = default; + return false; + } + + private static bool TryGetStringValue(out T value, object currentValue) + { + if (typeof(T) == typeof(String)) + { + var s = currentValue.ToString(); + var matches = utfPattern.Matches(s); + + if (matches.Count == 0) + { + value = (T)Convert.ChangeType(s, typeof(T)); + return true; + } + + var sb = new StringBuilder(); + var lastIndex = 0; + + foreach (var match in matches.Cast()) + { + var matchString = match.Value; + var matchIndex = match.Index; + sb.Append(s.Substring(lastIndex, matchIndex - lastIndex)); + + sb.Append((char)int.Parse(match.Groups[1].Value, NumberStyles.AllowHexSpecifier)); + + lastIndex = matchIndex + matchString.Length; + } + + if (lastIndex < s.Length) + sb.Append(s.Substring(lastIndex)); + + value = (T)Convert.ChangeType(sb.ToString(), typeof(T)); + return true; + } + value = default; + return false; + } + + private static Boolean TryGetBooleanValue(out T value, object currentValue) + { + if (typeof(T) != typeof(Boolean) && typeof(T) != typeof(Boolean?)) + { + value = default; + return false; + } + + if (currentValue is T v) { value = v; return true; } + + if (!Boolean.TryParse(currentValue.ToString(), out Boolean b)) + { + value = default; + return false; + } + + value = (T)Convert.ChangeType(b, typeof(T)); + return true; + } + + private Boolean TryGetHyperlink(out T value) + { + if (typeof(T) == typeof(XLHyperlink)) + { + var hyperlink = GetHyperlink(); + if (hyperlink != null) + { + value = (T)Convert.ChangeType(hyperlink, typeof(T)); + return true; + } + } + + value = default; + return false; + } + + private delegate Boolean ParseFunction(String s, NumberStyles style, IFormatProvider provider, out T result); + + private static Boolean TryGetBasicValue(String currentValue, ParseFunction parseFunction, out T value) + { + if (parseFunction.Invoke(currentValue, NumberStyles.Any, null, out U result)) + { + value = (T)Convert.ChangeType(result, typeof(T).GetUnderlyingType()); + return true; + } + + value = default; + return false; + } + + #endregion IXLCell Members + + #region IXLStylized Members + + public override IEnumerable Styles + { + get + { + yield return Style; + } + } + + void IXLStylized.ModifyStyle(Func modification) + { + //XLCell cannot have children so the base method may be optimized + var styleKey = modification(StyleValue.Key); + StyleValue = XLStyleValue.FromKey(ref styleKey); + } + + protected override IEnumerable Children + { + get { yield break; } + } + + public override IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges { AsRange() }; + return retVal; + } + } + + #endregion IXLStylized Members + + private Boolean SetTableHeaderValue(object value) + { + foreach (var table in Worksheet.Tables.Where(t => t.ShowHeaderRow)) + { + var cell = table.HeadersRow().CellsUsed(c => c.Address.Equals(this.Address)).FirstOrDefault(); + if (cell != null) + { + var oldName = cell.GetString(); + var field = table.Field(oldName); + field.Name = value.ToString(); + return true; + } + } + + return false; + } + + private Boolean SetTableTotalsRowLabel(object value) + { + foreach (var table in Worksheet.Tables.Where(t => t.ShowTotalsRow)) + { + var cell = table.TotalsRow().Cells(c => c.Address.Equals(this.Address)).FirstOrDefault(); + if (cell != null) + { + var field = table.Fields.First(f => f.Column.ColumnNumber() == cell.WorksheetColumn().ColumnNumber()); + field.TotalsRowFunction = XLTotalsRowFunction.None; + + SetInternalCellValueString(value.ObjectToInvariantString(), validate: true, parseToCachedValue: false); + + field.TotalsRowLabel = _cellValue; + this.DataType = XLDataType.Text; + return true; + } + } + + return false; + } + + private bool SetRangeColumns(object value) + { + if (value is XLRangeColumns columns) + { + var cell = this; + foreach (var column in columns) + { + cell.SetRange(column); + cell = cell.CellRight(); + } + return true; + } + else + + return SetColumns(value); + } + + private bool SetColumns(object value) + { + if (value is XLColumns columns) + { + var cell = this; + foreach (var column in columns) + { + cell.SetRange(column); + cell = cell.CellRight(); + } + return true; + } + else + return false; + } + + private bool SetRangeRows(object value) + { + if (value is XLRangeRows rows) + { + var cell = this; + foreach (var row in rows) + { + cell.SetRange(row); + cell = cell.CellBelow(); + } + return true; + } + else + return SetRows(value); + } + + private bool SetRows(object value) + { + if (value is XLRows rows) + { + var cell = this; + foreach (var row in rows) + { + cell.SetRange(row); + cell = cell.CellBelow(); + } + return true; + } + else + return false; + } + + public XLRange AsRange() + { + return Worksheet.Range(Address, Address); + } + + #region Styles + + private XLStyleValue GetStyleForRead() + { + return StyleValue; + } + + private void SetStyle(IXLStyle styleToUse) + { + Style = styleToUse; + } + + public Boolean IsDefaultWorksheetStyle() + { + return StyleValue == Worksheet.StyleValue; + } + + #endregion Styles + + public void DeleteComment() + { + Clear(XLClearOptions.Comments); + } + + public void DeleteSparkline() + { + Clear(XLClearOptions.Sparklines); + } + + private bool IsDateFormat() + { + var style = GetStyleForRead(); + return _dataType == XLDataType.Number + && String.IsNullOrWhiteSpace(style.NumberFormat.Format) + && ((style.NumberFormat.NumberFormatId >= 14 + && style.NumberFormat.NumberFormatId <= 22) + || (style.NumberFormat.NumberFormatId >= 45 + && style.NumberFormat.NumberFormatId <= 47)); + } + + private string GetFormat() + { + var style = GetStyleForRead(); + if (String.IsNullOrWhiteSpace(style.NumberFormat.Format)) + { + var formatCodes = XLPredefinedFormat.FormatCodes; + if (formatCodes.TryGetValue(style.NumberFormat.NumberFormatId, out string format)) + return format; + else + return string.Empty; + } + else + return style.NumberFormat.Format; + } + + private bool SetRichText(object value) + { + if (value is XLRichText asRichString) + { + _richText = asRichString; + _dataType = XLDataType.Text; + return true; + } + else + return false; + } + + private Boolean SetRange(Object rangeObject) + { + var asRange = (rangeObject as XLRangeBase) + ?? (rangeObject as XLCell)?.AsRange(); + + if (asRange != null) + { + var maxRows = asRange.RowCount(); + var maxColumns = asRange.ColumnCount(); + + var lastRow = Math.Min(_rowNumber + maxRows - 1, XLHelper.MaxRowNumber); + var lastColumn = Math.Min(_columnNumber + maxColumns - 1, XLHelper.MaxColumnNumber); + + var targetRange = Worksheet.Range(_rowNumber, _columnNumber, lastRow, lastColumn); + + if (!(asRange is XLRow || asRange is XLColumn)) + { + targetRange.Clear(); + } + + var minRow = asRange.RangeAddress.FirstAddress.RowNumber; + var minColumn = asRange.RangeAddress.FirstAddress.ColumnNumber; + var cellsUsed = asRange.CellsUsed(XLCellsUsedOptions.All + & ~XLCellsUsedOptions.ConditionalFormats + & ~XLCellsUsedOptions.DataValidation + & ~XLCellsUsedOptions.MergedRanges); + foreach (var sourceCell in cellsUsed) + { + Worksheet.Cell( + _rowNumber + sourceCell.Address.RowNumber - minRow, + _columnNumber + sourceCell.Address.ColumnNumber - minColumn + ).CopyFromInternal(sourceCell as XLCell, + XLCellCopyOptions.All & ~XLCellCopyOptions.ConditionalFormats); //Conditional formats are copied separately + } + + var rangesToMerge = asRange.Worksheet.Internals.MergedRanges + .Where(mr => asRange.Contains(mr)) + .Select(mr => + { + var firstRow = _rowNumber + (mr.RangeAddress.FirstAddress.RowNumber - asRange.RangeAddress.FirstAddress.RowNumber); + var firstColumn = _columnNumber + (mr.RangeAddress.FirstAddress.ColumnNumber - asRange.RangeAddress.FirstAddress.ColumnNumber); + return (IXLRange)Worksheet.Range + ( + firstRow, + firstColumn, + firstRow + mr.RowCount() - 1, + firstColumn + mr.ColumnCount() - 1 + ); + }) + .ToList(); + + rangesToMerge.ForEach(r => r.Merge(false)); + + var dataValidations = asRange.Worksheet.DataValidations + .GetAllInRange(asRange.RangeAddress) + .ToList(); + + foreach (var dataValidation in dataValidations) + { + XLDataValidation newDataValidation = null; + foreach (var dvRange in dataValidation.Ranges.Where(r => r.Intersects(asRange))) + { + var dvTargetAddress = dvRange.RangeAddress.Relative(asRange.RangeAddress, targetRange.RangeAddress); + var dvTargetRange = Worksheet.Range(dvTargetAddress); + if (newDataValidation == null) + { + newDataValidation = dvTargetRange.SetDataValidation() as XLDataValidation; + newDataValidation.CopyFrom(dataValidation); + } + else + newDataValidation.AddRange(dvTargetRange); + } + } + + CopyConditionalFormatsFrom(asRange); + + return true; + } + + return false; + } + + private void CopyConditionalFormatsFrom(XLCell otherCell) + { + var conditionalFormats = otherCell + .Worksheet + .ConditionalFormats + .Where(c => c.Ranges.GetIntersectedRanges(otherCell).Any()) + .ToList(); + + foreach (var cf in conditionalFormats) + { + if (otherCell.Worksheet == Worksheet) + { + if (!cf.Ranges.GetIntersectedRanges(this).Any()) + { + cf.Ranges.Add(this); + } + } + else + { + CopyConditionalFormatsFrom(otherCell.AsRange()); + } + } + } + + private void CopyConditionalFormatsFrom(XLRangeBase fromRange) + { + var srcSheet = fromRange.Worksheet; + int minRo = fromRange.RangeAddress.FirstAddress.RowNumber; + int minCo = fromRange.RangeAddress.FirstAddress.ColumnNumber; + if (srcSheet.ConditionalFormats.Any(r => r.Ranges.GetIntersectedRanges(fromRange.RangeAddress).Any())) + { + var fs = srcSheet.ConditionalFormats.SelectMany(cf => cf.Ranges.GetIntersectedRanges(fromRange.RangeAddress)).ToArray(); + if (fs.Any()) + { + minRo = fs.Max(r => r.RangeAddress.LastAddress.RowNumber); + minCo = fs.Max(r => r.RangeAddress.LastAddress.ColumnNumber); + } + } + int rCnt = minRo - fromRange.RangeAddress.FirstAddress.RowNumber + 1; + int cCnt = minCo - fromRange.RangeAddress.FirstAddress.ColumnNumber + 1; + rCnt = Math.Min(rCnt, fromRange.RowCount()); + cCnt = Math.Min(cCnt, fromRange.ColumnCount()); + var toRange = Worksheet.Range(this, Worksheet.Cell(_rowNumber + rCnt - 1, _columnNumber + cCnt - 1)); + var formats = srcSheet.ConditionalFormats.Where(f => f.Ranges.GetIntersectedRanges(fromRange.RangeAddress).Any()); + + foreach (var cf in formats.ToList()) + { + var fmtRanges = cf.Ranges + .GetIntersectedRanges(fromRange.RangeAddress) + .Select(r => r.RangeAddress.Intersection(fromRange.RangeAddress).Relative(fromRange.RangeAddress, toRange.RangeAddress).AsRange() as XLRange) + .ToList(); + + var c = new XLConditionalFormat(fmtRanges, true); + c.CopyFrom(cf); + c.AdjustFormulas((XLCell)cf.Ranges.First().FirstCell(), fmtRanges.First().FirstCell()); + + Worksheet.ConditionalFormats.Add(c); + } + } + + private bool SetDataTable(object o) + { + if (o is DataTable dataTable) + return InsertData(dataTable) != null; + else + return false; + } + + private bool SetEnumerable(object collectionObject) + { + // IXLRichText implements IEnumerable, but we don't want to handle this here. + if (collectionObject is IXLRichText) return false; + + var asEnumerable = collectionObject as IEnumerable; + return InsertData(asEnumerable) != null; + } + + private void ClearMerged() + { + List mergeToDelete = Worksheet.Internals.MergedRanges.GetIntersectedRanges(Address).ToList(); + + mergeToDelete.ForEach(m => Worksheet.Internals.MergedRanges.Remove(m)); + } + + private void SetValue(object value) + { + if (value == null) + { + this.Clear(XLClearOptions.Contents); + return; + } + + FormulaA1 = String.Empty; + _richText = null; + + var style = GetStyleForRead(); + Boolean parsed = false; + string parsedValue = string.Empty; + + //// + // Try easy parsing first. If that doesn't work, we'll have to ToString it and parse it slowly + + // When number format starts with @, we treat any value as text - no parsing required + // This doesn't happen in the SetValue() version + if (style.NumberFormat.Format == "@") + { + parsedValue = value.ObjectToInvariantString(); + + _dataType = XLDataType.Text; + if (parsedValue.Contains(Environment.NewLine) && !style.Alignment.WrapText) + Style.Alignment.WrapText = true; + + parsed = true; + } + else + { + // Don't accept strings, because we're going to try to parse them later + var tuple = SetKnownTypedValue(value, style, acceptString: false); + parsedValue = tuple.Item1; + parsed = tuple.Item2; + } + + //// + if (!parsed) + { + // We'll have to parse it slowly :-( + parsedValue = DeduceCellValueByParsing(value.ToString(), style); + } + + if (SetTableHeaderValue(parsedValue)) return; + if (SetTableTotalsRowLabel(parsedValue)) return; + + SetInternalCellValueString(parsedValue, validate: true, parseToCachedValue: false); + CachedValue = null; + } + + private void SetDateTimeFormat(XLStyleValue style, Boolean onlyDatePart) + { + _dataType = XLDataType.DateTime; + + if (style.NumberFormat.Format.Length == 0 && style.NumberFormat.NumberFormatId == 0) + Style.NumberFormat.NumberFormatId = onlyDatePart ? 14 : 22; + } + + private void SetTimeSpanFormat(XLStyleValue style) + { + _dataType = XLDataType.TimeSpan; + + if (style.NumberFormat.Format.Length == 0 && style.NumberFormat.NumberFormatId == 0) + Style.NumberFormat.NumberFormatId = 46; + } + + internal string GetFormulaR1C1(string value) + { + return GetFormula(value, FormulaConversionType.A1ToR1C1, 0, 0); + } + + internal string GetFormulaA1(string value) + { + return GetFormula(value, FormulaConversionType.R1C1ToA1, 0, 0); + } + + private string GetFormula(string strValue, FormulaConversionType conversionType, int rowsToShift, + int columnsToShift) + { + if (String.IsNullOrWhiteSpace(strValue)) + return String.Empty; + + var value = ">" + strValue + "<"; + + var regex = conversionType == FormulaConversionType.A1ToR1C1 ? A1Regex : R1C1Regex; + + var sb = new StringBuilder(); + var lastIndex = 0; + + foreach (var match in regex.Matches(value).Cast()) + { + var matchString = match.Value; + var matchIndex = match.Index; + if (value.Substring(0, matchIndex).CharCount('"') % 2 == 0 + && value.Substring(0, matchIndex).CharCount('\'') % 2 == 0) + { + // Check if the match is in between quotes + sb.Append(value.Substring(lastIndex, matchIndex - lastIndex)); + sb.Append(conversionType == FormulaConversionType.A1ToR1C1 + ? GetR1C1Address(matchString, rowsToShift, columnsToShift) + : GetA1Address(matchString, rowsToShift, columnsToShift)); + } + else + sb.Append(value.Substring(lastIndex, matchIndex - lastIndex + matchString.Length)); + lastIndex = matchIndex + matchString.Length; + } + + if (lastIndex < value.Length) + sb.Append(value.Substring(lastIndex)); + + var retVal = sb.ToString(); + return retVal.Substring(1, retVal.Length - 2); + } + + private string GetA1Address(string r1C1Address, int rowsToShift, int columnsToShift) + { + var addressToUse = r1C1Address.ToUpper(); + + if (addressToUse.Contains(':')) + { + var parts = addressToUse.Split(':'); + var p1 = parts[0]; + var p2 = parts[1]; + string leftPart; + string rightPart; + if (p1.StartsWith("R")) + { + leftPart = GetA1Row(p1, rowsToShift); + rightPart = GetA1Row(p2, rowsToShift); + } + else + { + leftPart = GetA1Column(p1, columnsToShift); + rightPart = GetA1Column(p2, columnsToShift); + } + + return leftPart + ":" + rightPart; + } + + try + { + var rowPart = addressToUse.Substring(0, addressToUse.IndexOf("C")); + var rowToReturn = GetA1Row(rowPart, rowsToShift); + + var columnPart = addressToUse.Substring(addressToUse.IndexOf("C")); + var columnToReturn = GetA1Column(columnPart, columnsToShift); + + var retAddress = columnToReturn + rowToReturn; + return retAddress; + } + catch (ArgumentOutOfRangeException) + { + return "#REF!"; + } + } + + private string GetA1Column(string columnPart, int columnsToShift) + { + string columnToReturn; + if (columnPart == "C") + columnToReturn = XLHelper.GetColumnLetterFromNumber(_columnNumber + columnsToShift); + else + { + var bIndex = columnPart.IndexOf("["); + var mIndex = columnPart.IndexOf("-"); + if (bIndex >= 0) + { + columnToReturn = XLHelper.GetColumnLetterFromNumber( + _columnNumber + + Int32.Parse(columnPart.Substring(bIndex + 1, columnPart.Length - bIndex - 2)) + columnsToShift + ); + } + else if (mIndex >= 0) + { + columnToReturn = XLHelper.GetColumnLetterFromNumber( + _columnNumber + Int32.Parse(columnPart.Substring(mIndex)) + columnsToShift + ); + } + else + { + columnToReturn = "$" + + XLHelper.GetColumnLetterFromNumber(Int32.Parse(columnPart.Substring(1)) + + columnsToShift); + } + } + + return columnToReturn; + } + + private string GetA1Row(string rowPart, int rowsToShift) + { + string rowToReturn; + if (rowPart == "R") + rowToReturn = (_rowNumber + rowsToShift).ToString(); + else + { + var bIndex = rowPart.IndexOf("["); + if (bIndex >= 0) + { + rowToReturn = + (_rowNumber + Int32.Parse(rowPart.Substring(bIndex + 1, rowPart.Length - bIndex - 2)) + + rowsToShift).ToString(); + } + else + rowToReturn = "$" + (Int32.Parse(rowPart.Substring(1)) + rowsToShift); + } + + return rowToReturn; + } + + private string GetR1C1Address(string a1Address, int rowsToShift, int columnsToShift) + { + if (a1Address.Contains(':')) + { + var parts = a1Address.Split(':'); + var p1 = parts[0]; + var p2 = parts[1]; + if (Int32.TryParse(p1.Replace("$", string.Empty), out Int32 row1)) + { + var row2 = Int32.Parse(p2.Replace("$", string.Empty)); + var leftPart = GetR1C1Row(row1, p1.Contains('$'), rowsToShift); + var rightPart = GetR1C1Row(row2, p2.Contains('$'), rowsToShift); + return leftPart + ":" + rightPart; + } + else + { + var column1 = XLHelper.GetColumnNumberFromLetter(p1.Replace("$", string.Empty)); + var column2 = XLHelper.GetColumnNumberFromLetter(p2.Replace("$", string.Empty)); + var leftPart = GetR1C1Column(column1, p1.Contains('$'), columnsToShift); + var rightPart = GetR1C1Column(column2, p2.Contains('$'), columnsToShift); + return leftPart + ":" + rightPart; + } + } + + var address = XLAddress.Create(Worksheet, a1Address); + + var rowPart = GetR1C1Row(address.RowNumber, address.FixedRow, rowsToShift); + var columnPart = GetR1C1Column(address.ColumnNumber, address.FixedColumn, columnsToShift); + + return rowPart + columnPart; + } + + private string GetR1C1Row(int rowNumber, bool fixedRow, int rowsToShift) + { + string rowPart; + rowNumber += rowsToShift; + var rowDiff = rowNumber - _rowNumber; + if (rowDiff != 0 || fixedRow) + rowPart = fixedRow ? "R" + rowNumber : "R[" + rowDiff + "]"; + else + rowPart = "R"; + + return rowPart; + } + + private string GetR1C1Column(int columnNumber, bool fixedColumn, int columnsToShift) + { + string columnPart; + columnNumber += columnsToShift; + var columnDiff = columnNumber - _columnNumber; + if (columnDiff != 0 || fixedColumn) + columnPart = fixedColumn ? "C" + columnNumber : "C[" + columnDiff + "]"; + else + columnPart = "C"; + + return columnPart; + } + + internal void CopyValuesFrom(XLCell source) + { + _cellValue = source._cellValue; + _dataType = source._dataType; + FormulaR1C1 = source.FormulaR1C1; + _richText = source._richText == null ? null : new XLRichText(source._richText, source.Style.Font); + _comment = source._comment == null ? null : new XLComment(this, source._comment, source.Style.Font, source._comment.Style); + if (source._hyperlink != null) + { + SettingHyperlink = true; + Hyperlink = new XLHyperlink(source.Hyperlink); + SettingHyperlink = false; + } + } + + private IXLCell GetTargetCell(String target, XLWorksheet defaultWorksheet) + { + var pair = target.Split('!'); + if (pair.Length == 1) + return defaultWorksheet.Cell(target); + + var wsName = pair[0]; + if (wsName.StartsWith("'")) + wsName = wsName.Substring(1, wsName.Length - 2); + return defaultWorksheet.Workbook.Worksheet(wsName).Cell(pair[1]); + } + + internal IXLCell CopyFromInternal(XLCell otherCell, XLCellCopyOptions options) + { + if (options.HasFlag(XLCellCopyOptions.Values)) + CopyValuesFrom(otherCell); + + if (options.HasFlag(XLCellCopyOptions.Styles)) + InnerStyle = otherCell.InnerStyle; + + if (options.HasFlag(XLCellCopyOptions.Sparklines)) + CopySparklineFrom(otherCell); + + if (options.HasFlag(XLCellCopyOptions.ConditionalFormats)) + CopyConditionalFormatsFrom(otherCell); + + if (options.HasFlag(XLCellCopyOptions.DataValidations)) + CopyDataValidationFrom(otherCell); + + return this; + } + + private void CopySparklineFrom(XLCell otherCell) + { + if (!otherCell.HasSparkline) return; + + var sourceDataAddress = otherCell.Sparkline.SourceData.RangeAddress.ToString(); + var shiftedRangeAddress = GetFormulaA1(otherCell.GetFormulaR1C1(sourceDataAddress)); + var sourceDataWorksheet = otherCell.Worksheet == otherCell.Sparkline.SourceData.Worksheet + ? Worksheet + : otherCell.Sparkline.SourceData.Worksheet; + var sourceData = sourceDataWorksheet.Range(shiftedRangeAddress); + + IXLSparklineGroup group; + if (otherCell.Worksheet == Worksheet) + { + group = otherCell.Sparkline.SparklineGroup; + } + else + { + group = Worksheet.SparklineGroups.Add(new XLSparklineGroup(Worksheet, otherCell.Sparkline.SparklineGroup)); + if (otherCell.Sparkline.SparklineGroup.DateRange != null) + { + var dateRangeWorksheet = + otherCell.Worksheet == otherCell.Sparkline.SparklineGroup.DateRange.Worksheet + ? Worksheet + : otherCell.Sparkline.SparklineGroup.DateRange.Worksheet; + var dateRangeAddress = otherCell.Sparkline.SparklineGroup.DateRange.RangeAddress.ToString(); + var shiftedDateRangeAddress = GetFormulaA1(otherCell.GetFormulaR1C1(dateRangeAddress)); + group.SetDateRange(dateRangeWorksheet.Range(shiftedDateRangeAddress)); + } + } + + group.Add(this, sourceData); + } + + public IXLCell CopyFrom(IXLCell otherCell, XLCellCopyOptions options) + { + var source = otherCell as XLCell; // To expose GetFormulaR1C1, etc + + CopyFromInternal(source, options); + return this; + } + + private void CopyDataValidationFrom(XLCell otherCell) + { + var eventTracking = Worksheet.EventTrackingEnabled; + Worksheet.EventTrackingEnabled = false; + if (otherCell.HasDataValidation) + CopyDataValidation(otherCell, otherCell.DataValidation); + else if (HasDataValidation) + { + Worksheet.DataValidations.Delete(AsRange()); + } + Worksheet.EventTrackingEnabled = eventTracking; + } + + internal void CopyDataValidation(XLCell otherCell, IXLDataValidation otherDv) + { + var thisDv = SetDataValidation() as XLDataValidation; + thisDv.CopyFrom(otherDv); + thisDv.Value = GetFormulaA1(otherCell.GetFormulaR1C1(otherDv.Value)); + thisDv.MinValue = GetFormulaA1(otherCell.GetFormulaR1C1(otherDv.MinValue)); + thisDv.MaxValue = GetFormulaA1(otherCell.GetFormulaR1C1(otherDv.MaxValue)); + } + + internal void ShiftFormulaRows(XLRange shiftedRange, int rowsShifted) + { + FormulaA1 = ShiftFormulaRows(FormulaA1, Worksheet, shiftedRange, rowsShifted); + } + + internal static String ShiftFormulaRows(String formulaA1, XLWorksheet worksheetInAction, XLRange shiftedRange, + int rowsShifted) + { + if (String.IsNullOrWhiteSpace(formulaA1)) return String.Empty; + + var value = formulaA1; + + var regex = A1SimpleRegex; + + var sb = new StringBuilder(); + var lastIndex = 0; + + var shiftedWsName = shiftedRange.Worksheet.Name; + foreach (var match in regex.Matches(value).Cast()) + { + var matchString = match.Value; + var matchIndex = match.Index; + if (value.Substring(0, matchIndex).CharCount('"') % 2 == 0) + { + // Check that the match is not between quotes + sb.Append(value.Substring(lastIndex, matchIndex - lastIndex)); + string sheetName; + var useSheetName = false; + if (matchString.Contains('!')) + { + sheetName = matchString.Substring(0, matchString.IndexOf('!')); + if (sheetName[0] == '\'') + sheetName = sheetName.Substring(1, sheetName.Length - 2); + useSheetName = true; + } + else + sheetName = worksheetInAction.Name; + + if (String.Compare(sheetName, shiftedWsName, true) == 0) + { + var rangeAddress = matchString.Substring(matchString.IndexOf('!') + 1); + if (!A1ColumnRegex.IsMatch(rangeAddress)) + { + var matchRange = worksheetInAction.Workbook.Worksheet(sheetName).Range(rangeAddress); + if (shiftedRange.RangeAddress.FirstAddress.RowNumber <= matchRange.RangeAddress.LastAddress.RowNumber + && shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= matchRange.RangeAddress.FirstAddress.ColumnNumber + && shiftedRange.RangeAddress.LastAddress.ColumnNumber >= matchRange.RangeAddress.LastAddress.ColumnNumber) + { + if (useSheetName) + { + sb.Append(sheetName.EscapeSheetName()); + sb.Append('!'); + } + + if (A1RowRegex.IsMatch(rangeAddress)) + { + var rows = rangeAddress.Split(':'); + var row1String = rows[0]; + var row2String = rows[1]; + string row1; + if (row1String[0] == '$') + { + row1 = "$" + + (XLHelper.TrimRowNumber(Int32.Parse(row1String.Substring(1)) + rowsShifted)).ToInvariantString(); + } + else + row1 = (XLHelper.TrimRowNumber(Int32.Parse(row1String) + rowsShifted)).ToInvariantString(); + + string row2; + if (row2String[0] == '$') + { + row2 = "$" + + (XLHelper.TrimRowNumber(Int32.Parse(row2String.Substring(1)) + rowsShifted)).ToInvariantString(); + } + else + row2 = (XLHelper.TrimRowNumber(Int32.Parse(row2String) + rowsShifted)).ToInvariantString(); + + sb.Append(row1); + sb.Append(':'); + sb.Append(row2); + } + else if (shiftedRange.RangeAddress.FirstAddress.RowNumber <= + matchRange.RangeAddress.FirstAddress.RowNumber) + { + if (rangeAddress.Contains(':')) + { + sb.Append( + new XLAddress( + worksheetInAction, + XLHelper.TrimRowNumber(matchRange.RangeAddress.FirstAddress.RowNumber + rowsShifted), + matchRange.RangeAddress.FirstAddress.ColumnLetter, + matchRange.RangeAddress.FirstAddress.FixedRow, + matchRange.RangeAddress.FirstAddress.FixedColumn)); + sb.Append(':'); + sb.Append( + new XLAddress( + worksheetInAction, + XLHelper.TrimRowNumber(matchRange.RangeAddress.LastAddress.RowNumber + rowsShifted), + matchRange.RangeAddress.LastAddress.ColumnLetter, + matchRange.RangeAddress.LastAddress.FixedRow, + matchRange.RangeAddress.LastAddress.FixedColumn)); + } + else + { + sb.Append( + new XLAddress( + worksheetInAction, + XLHelper.TrimRowNumber(matchRange.RangeAddress.FirstAddress.RowNumber + rowsShifted), + matchRange.RangeAddress.FirstAddress.ColumnLetter, + matchRange.RangeAddress.FirstAddress.FixedRow, + matchRange.RangeAddress.FirstAddress.FixedColumn)); + } + } + else + { + sb.Append(matchRange.RangeAddress.FirstAddress); + sb.Append(':'); + sb.Append( + new XLAddress( + worksheetInAction, + XLHelper.TrimRowNumber(matchRange.RangeAddress.LastAddress.RowNumber + rowsShifted), + matchRange.RangeAddress.LastAddress.ColumnLetter, + matchRange.RangeAddress.LastAddress.FixedRow, + matchRange.RangeAddress.LastAddress.FixedColumn)); + } + } + else + sb.Append(matchString); + } + else + sb.Append(matchString); + } + else + sb.Append(matchString); + } + else + sb.Append(value.Substring(lastIndex, matchIndex - lastIndex + matchString.Length)); + + lastIndex = matchIndex + matchString.Length; + } + + if (lastIndex < value.Length) + sb.Append(value.Substring(lastIndex)); + + return sb.ToString(); + } + + internal void ShiftFormulaColumns(XLRange shiftedRange, int columnsShifted) + { + FormulaA1 = ShiftFormulaColumns(FormulaA1, Worksheet, shiftedRange, columnsShifted); + } + + internal static String ShiftFormulaColumns(String formulaA1, XLWorksheet worksheetInAction, XLRange shiftedRange, + int columnsShifted) + { + if (String.IsNullOrWhiteSpace(formulaA1)) return String.Empty; + + var value = formulaA1; + + var regex = A1SimpleRegex; + + var sb = new StringBuilder(); + var lastIndex = 0; + + foreach (var match in regex.Matches(value).Cast()) + { + var matchString = match.Value; + var matchIndex = match.Index; + if (value.Substring(0, matchIndex).CharCount('"') % 2 == 0) + { + // Check that the match is not between quotes + sb.Append(value.Substring(lastIndex, matchIndex - lastIndex)); + string sheetName; + var useSheetName = false; + if (matchString.Contains('!')) + { + sheetName = matchString.Substring(0, matchString.IndexOf('!')); + if (sheetName[0] == '\'') + sheetName = sheetName.Substring(1, sheetName.Length - 2); + useSheetName = true; + } + else + sheetName = worksheetInAction.Name; + + if (String.Compare(sheetName, shiftedRange.Worksheet.Name, true) == 0) + { + var rangeAddress = matchString.Substring(matchString.IndexOf('!') + 1); + if (!A1RowRegex.IsMatch(rangeAddress)) + { + var matchRange = worksheetInAction.Workbook.Worksheet(sheetName).Range(rangeAddress); + + if (shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= + matchRange.RangeAddress.LastAddress.ColumnNumber + && + shiftedRange.RangeAddress.FirstAddress.RowNumber <= + matchRange.RangeAddress.FirstAddress.RowNumber + && + shiftedRange.RangeAddress.LastAddress.RowNumber >= + matchRange.RangeAddress.LastAddress.RowNumber) + { + if (useSheetName) + { + sb.Append(sheetName.EscapeSheetName()); + sb.Append('!'); + } + + if (A1ColumnRegex.IsMatch(rangeAddress)) + { + var columns = rangeAddress.Split(':'); + var column1String = columns[0]; + var column2String = columns[1]; + string column1; + if (column1String[0] == '$') + { + column1 = "$" + + XLHelper.GetColumnLetterFromNumber( + XLHelper.GetColumnNumberFromLetter( + column1String.Substring(1)) + columnsShifted, true); + } + else + { + column1 = + XLHelper.GetColumnLetterFromNumber( + XLHelper.GetColumnNumberFromLetter(column1String) + + columnsShifted, true); + } + + string column2; + if (column2String[0] == '$') + { + column2 = "$" + + XLHelper.GetColumnLetterFromNumber( + XLHelper.GetColumnNumberFromLetter( + column2String.Substring(1)) + columnsShifted, true); + } + else + { + column2 = + XLHelper.GetColumnLetterFromNumber( + XLHelper.GetColumnNumberFromLetter(column2String) + + columnsShifted, true); + } + + sb.Append(column1); + sb.Append(':'); + sb.Append(column2); + } + else if (shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= + matchRange.RangeAddress.FirstAddress.ColumnNumber) + { + if (rangeAddress.Contains(':')) + { + sb.Append( + new XLAddress( + worksheetInAction, + matchRange.RangeAddress.FirstAddress.RowNumber, + XLHelper.TrimColumnNumber(matchRange.RangeAddress.FirstAddress.ColumnNumber + columnsShifted), + matchRange.RangeAddress.FirstAddress.FixedRow, + matchRange.RangeAddress.FirstAddress.FixedColumn)); + sb.Append(':'); + sb.Append( + new XLAddress( + worksheetInAction, + matchRange.RangeAddress.LastAddress.RowNumber, + XLHelper.TrimColumnNumber(matchRange.RangeAddress.LastAddress.ColumnNumber + columnsShifted), + matchRange.RangeAddress.LastAddress.FixedRow, + matchRange.RangeAddress.LastAddress.FixedColumn)); + } + else + { + sb.Append( + new XLAddress( + worksheetInAction, + matchRange.RangeAddress.FirstAddress.RowNumber, + XLHelper.TrimColumnNumber(matchRange.RangeAddress.FirstAddress.ColumnNumber + columnsShifted), + matchRange.RangeAddress.FirstAddress.FixedRow, + matchRange.RangeAddress.FirstAddress.FixedColumn)); + } + } + else + { + sb.Append(matchRange.RangeAddress.FirstAddress); + sb.Append(':'); + sb.Append( + new XLAddress( + worksheetInAction, + matchRange.RangeAddress.LastAddress.RowNumber, + XLHelper.TrimColumnNumber(matchRange.RangeAddress.LastAddress.ColumnNumber + columnsShifted), + matchRange.RangeAddress.LastAddress.FixedRow, + matchRange.RangeAddress.LastAddress.FixedColumn)); + } + } + else + sb.Append(matchString); + } + else + sb.Append(matchString); + } + else + sb.Append(matchString); + } + else + sb.Append(value.Substring(lastIndex, matchIndex - lastIndex + matchString.Length)); + lastIndex = matchIndex + matchString.Length; + } + + if (lastIndex < value.Length) + sb.Append(value.Substring(lastIndex)); + + return sb.ToString(); + } + + private XLCell CellShift(Int32 rowsToShift, Int32 columnsToShift) + { + return Worksheet.Cell(_rowNumber + rowsToShift, _columnNumber + columnsToShift); + } + + #region Nested type: FormulaConversionType + + private enum FormulaConversionType + { + A1ToR1C1, + R1C1ToA1 + }; + + #endregion Nested type: FormulaConversionType + + #region XLCell Above + + IXLCell IXLCell.CellAbove() + { + return CellAbove(); + } + + IXLCell IXLCell.CellAbove(Int32 step) + { + return CellAbove(step); + } + + public XLCell CellAbove() + { + return CellAbove(1); + } + + public XLCell CellAbove(Int32 step) + { + return CellShift(step * -1, 0); + } + + #endregion XLCell Above + + #region XLCell Below + + IXLCell IXLCell.CellBelow() + { + return CellBelow(); + } + + IXLCell IXLCell.CellBelow(Int32 step) + { + return CellBelow(step); + } + + public XLCell CellBelow() + { + return CellBelow(1); + } + + public XLCell CellBelow(Int32 step) + { + return CellShift(step, 0); + } + + #endregion XLCell Below + + #region XLCell Left + + IXLCell IXLCell.CellLeft() + { + return CellLeft(); + } + + IXLCell IXLCell.CellLeft(Int32 step) + { + return CellLeft(step); + } + + public XLCell CellLeft() + { + return CellLeft(1); + } + + public XLCell CellLeft(Int32 step) + { + return CellShift(0, step * -1); + } + + #endregion XLCell Left + + #region XLCell Right + + IXLCell IXLCell.CellRight() + { + return CellRight(); + } + + IXLCell IXLCell.CellRight(Int32 step) + { + return CellRight(step); + } + + public XLCell CellRight() + { + return CellRight(1); + } + + public XLCell CellRight(Int32 step) + { + return CellShift(0, step); + } + + #endregion XLCell Right + + public Boolean HasFormula { get { return !String.IsNullOrWhiteSpace(FormulaA1); } } + + public Boolean HasArrayFormula { get { return FormulaA1.StartsWith("{"); } } + + public IXLRangeAddress FormulaReference { get; set; } + + public IXLRange CurrentRegion + { + get + { + return this.Worksheet.Range(FindCurrentRegion(this.AsRange())); + } + } + + internal IXLRangeAddress FindCurrentRegion(IXLRangeBase range) + { + var rangeAddress = range.RangeAddress; + + var filledCells = range + .SurroundingCells(c => !(c as XLCell).IsEmpty(XLCellsUsedOptions.AllContents)) + .Concat(this.Worksheet.Range(rangeAddress).Cells()); + + var grownRangeAddress = new XLRangeAddress( + new XLAddress(this.Worksheet, filledCells.Min(c => c.Address.RowNumber), filledCells.Min(c => c.Address.ColumnNumber), false, false), + new XLAddress(this.Worksheet, filledCells.Max(c => c.Address.RowNumber), filledCells.Max(c => c.Address.ColumnNumber), false, false) + ); + + if (rangeAddress.Equals(grownRangeAddress)) + return this.Worksheet.Range(grownRangeAddress).RangeAddress; + else + return FindCurrentRegion(this.Worksheet.Range(grownRangeAddress)); + } + + internal bool IsInferiorMergedCell() + { + return this.IsMerged() && !this.Address.Equals(this.MergedRange().RangeAddress.FirstAddress); + } + + internal bool IsSuperiorMergedCell() + { + return this.IsMerged() && this.Address.Equals(this.MergedRange().RangeAddress.FirstAddress); + } + } +} diff --git a/ClosedXML/Excel/Cells/XLCellCopyOptions.cs b/ClosedXML/Excel/Cells/XLCellCopyOptions.cs new file mode 100644 index 0000000..6c8e59e --- /dev/null +++ b/ClosedXML/Excel/Cells/XLCellCopyOptions.cs @@ -0,0 +1,16 @@ +using System; + +namespace ClosedXML.Excel +{ + [Flags] + internal enum XLCellCopyOptions + { + None = 0, + Values = 1 << 1, + Styles = 1 << 2, + ConditionalFormats = 1 << 3, + DataValidations = 1 << 4, + Sparklines = 1 << 5, + All = Values | Styles | ConditionalFormats | DataValidations | Sparklines + } +} diff --git a/ClosedXML/Excel/Cells/XLCells.cs b/ClosedXML/Excel/Cells/XLCells.cs new file mode 100644 index 0000000..e91501e --- /dev/null +++ b/ClosedXML/Excel/Cells/XLCells.cs @@ -0,0 +1,276 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + using System.Linq; + + internal class XLCells : XLStylizedBase, IXLCells, IXLStylized, IEnumerable + { + #region Fields + + private readonly List _rangeAddresses = new List(); + private readonly bool _usedCellsOnly; + private readonly Func _predicate; + private readonly XLCellsUsedOptions _options; + private bool _styleInitialized = false; + + #endregion Fields + + #region Constructor + + public XLCells(bool usedCellsOnly, XLCellsUsedOptions options, Func predicate = null) + : base(XLStyle.Default.Value) + { + _usedCellsOnly = usedCellsOnly; + _options = options; + _predicate = predicate ?? (_ => true); + } + + #endregion Constructor + + #region IEnumerable Members + + private IEnumerable GetAllCells() + { + var grouppedAddresses = _rangeAddresses.GroupBy(addr => addr.Worksheet); + foreach (var worksheetGroup in grouppedAddresses) + { + var ws = worksheetGroup.Key; + var sheetPoints = worksheetGroup.SelectMany(addr => GetAllCellsInRange(addr)) + .Distinct(); + foreach (var sheetPoint in sheetPoints) + { + var c = ws.Cell(sheetPoint.Row, sheetPoint.Column); + if (_predicate(c)) + yield return c; + } + } + } + + private IEnumerable GetAllCellsInRange(IXLRangeAddress rangeAddress) + { + if (!rangeAddress.IsValid) + yield break; + + var normalizedAddress = ((XLRangeAddress)rangeAddress).Normalize(); + var minRow = normalizedAddress.FirstAddress.RowNumber; + var maxRow = normalizedAddress.LastAddress.RowNumber; + var minColumn = normalizedAddress.FirstAddress.ColumnNumber; + var maxColumn = normalizedAddress.LastAddress.ColumnNumber; + + for (var ro = minRow; ro <= maxRow; ro++) + { + for (var co = minColumn; co <= maxColumn; co++) + { + yield return new XLSheetPoint(ro, co); + } + } + } + + private IEnumerable GetUsedCells() + { + var grouppedAddresses = _rangeAddresses.GroupBy(addr => addr.Worksheet); + foreach (var worksheetGroup in grouppedAddresses) + { + var ws = worksheetGroup.Key; + + var usedCellsCandidates = GetUsedCellsCandidates(ws); + + var cells = worksheetGroup.SelectMany(addr => GetUsedCellsInRange(addr, ws, usedCellsCandidates)) + .OrderBy(cell => cell.Address.RowNumber) + .ThenBy(cell => cell.Address.ColumnNumber); + + var visitedCells = new HashSet(); + foreach (var cell in cells) + { + if (visitedCells.Contains(cell.Address)) continue; + + visitedCells.Add(cell.Address); + + yield return cell; + } + } + } + + private IEnumerable GetUsedCellsInRange(XLRangeAddress rangeAddress, XLWorksheet worksheet, IEnumerable usedCellsCandidates) + { + if (!rangeAddress.IsValid) + yield break; + var normalizedAddress = rangeAddress.Normalize(); + var minRow = normalizedAddress.FirstAddress.RowNumber; + var maxRow = normalizedAddress.LastAddress.RowNumber; + var minColumn = normalizedAddress.FirstAddress.ColumnNumber; + var maxColumn = normalizedAddress.LastAddress.ColumnNumber; + + var cellRange = worksheet.Internals.CellsCollection + .GetCells(minRow, minColumn, maxRow, maxColumn, _predicate) + .Where(c => !c.IsEmpty(_options)); + + foreach (var cell in cellRange) + { + if (_predicate(cell)) + yield return cell; + } + + foreach (var sheetPoint in usedCellsCandidates) + { + if (sheetPoint.Row.Between(minRow, maxRow) && + sheetPoint.Column.Between(minColumn, maxColumn)) + { + var cell = worksheet.Cell(sheetPoint.Row, sheetPoint.Column); + + if (_predicate(cell)) + yield return cell; + } + } + } + + private IEnumerable GetUsedCellsCandidates(XLWorksheet worksheet) + { + var candidates = Enumerable.Empty(); + + if (_options.HasFlag(XLCellsUsedOptions.MergedRanges)) + candidates = candidates.Union( + worksheet.Internals.MergedRanges.SelectMany(r => GetAllCellsInRange(r.RangeAddress))); + + if (_options.HasFlag(XLCellsUsedOptions.ConditionalFormats)) + candidates = candidates.Union( + worksheet.ConditionalFormats.SelectMany(cf => cf.Ranges.SelectMany(r => GetAllCellsInRange(r.RangeAddress)))); + + if (_options.HasFlag(XLCellsUsedOptions.DataValidation)) + candidates = candidates.Union( + worksheet.DataValidations.SelectMany(dv => dv.Ranges.SelectMany(r => GetAllCellsInRange(r.RangeAddress)))); + + return candidates.Distinct(); + } + + public IEnumerator GetEnumerator() + { + var cells = (_usedCellsOnly) ? GetUsedCells() : GetAllCells(); + foreach (var cell in cells) + { + yield return cell; + } + } + + #endregion IEnumerable Members + + #region IXLCells Members + + IEnumerator IEnumerable.GetEnumerator() + { + foreach (XLCell cell in this) + yield return cell; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public Object Value + { + set { this.ForEach(c => c.Value = value); } + } + + public IXLCells SetDataType(XLDataType dataType) + { + this.ForEach(c => c.DataType = dataType); + return this; + } + + public XLDataType DataType + { + set { this.ForEach(c => c.DataType = value); } + } + + public IXLCells Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + this.ForEach(c => c.Clear(clearOptions)); + return this; + } + + public void DeleteComments() + { + this.ForEach(c => c.DeleteComment()); + } + + public void DeleteSparklines() + { + this.ForEach(c => c.DeleteSparkline()); + } + + public String FormulaA1 + { + set { this.ForEach(c => c.FormulaA1 = value); } + } + + public String FormulaR1C1 + { + set { this.ForEach(c => c.FormulaR1C1 = value); } + } + + #endregion IXLCells Members + + #region IXLStylized Members + + public override IEnumerable Styles + { + get + { + yield return Style; + foreach (XLCell c in this) + yield return c.Style; + } + } + + protected override IEnumerable Children + { + get + { + foreach (XLCell c in this) + yield return c; + } + } + + public override IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges(); + this.ForEach(c => retVal.Add(c.AsRange())); + return retVal; + } + } + + #endregion IXLStylized Members + + public void Add(XLRangeAddress rangeAddress) + { + _rangeAddresses.Add(rangeAddress); + + if (_styleInitialized) + return; + + var worksheetStyle = rangeAddress.Worksheet?.Style; + if (worksheetStyle == null) + return; + + InnerStyle = worksheetStyle; + _styleInitialized = true; + } + + public void Add(XLCell cell) + { + Add(new XLRangeAddress(cell.Address, cell.Address)); + } + + public void Select() + { + foreach (var cell in this) + cell.Select(); + } + } +} diff --git a/ClosedXML/Excel/Cells/XLCellsCollection.cs b/ClosedXML/Excel/Cells/XLCellsCollection.cs new file mode 100644 index 0000000..187d4b1 --- /dev/null +++ b/ClosedXML/Excel/Cells/XLCellsCollection.cs @@ -0,0 +1,421 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLCellsCollection + { + internal Dictionary ColumnsUsed { get; } = new Dictionary(); + internal Dictionary> Deleted { get; } = new Dictionary>(); + internal Dictionary> RowsCollection { get; } = new Dictionary>(); + + public Int32 MaxColumnUsed; + public Int32 MaxRowUsed; + public Dictionary RowsUsed = new Dictionary(); + + public XLCellsCollection() + { + Clear(); + } + + public Int32 Count { get; private set; } + + public void Add(XLSheetPoint sheetPoint, XLCell cell) + { + Add(sheetPoint.Row, sheetPoint.Column, cell); + } + + public void Add(Int32 row, Int32 column, XLCell cell) + { + Count++; + + IncrementUsage(RowsUsed, row); + IncrementUsage(ColumnsUsed, column); + + if (!RowsCollection.TryGetValue(row, out Dictionary columnsCollection)) + { + columnsCollection = new Dictionary(); + RowsCollection.Add(row, columnsCollection); + } + columnsCollection.Add(column, cell); + if (row > MaxRowUsed) MaxRowUsed = row; + if (column > MaxColumnUsed) MaxColumnUsed = column; + + if (Deleted.TryGetValue(row, out HashSet delHash)) + delHash.Remove(column); + } + + private static void IncrementUsage(Dictionary dictionary, Int32 key) + { + if (dictionary.TryGetValue(key, out Int32 value)) + dictionary[key] = value + 1; + else + dictionary.Add(key, 1); + } + + /// + /// True if the number was lowered to zero so MaxColumnUsed or MaxRowUsed may require + /// recomputation. + private static bool DecrementUsage(Dictionary dictionary, Int32 key) + { + if (!dictionary.TryGetValue(key, out Int32 count)) return false; + + if (count > 1) + { + dictionary[key]--; + return false; + } + else + { + dictionary.Remove(key); + return true; + } + } + + public void Clear() + { + Count = 0; + RowsUsed.Clear(); + ColumnsUsed.Clear(); + + RowsCollection.Clear(); + MaxRowUsed = 0; + MaxColumnUsed = 0; + } + + public void Remove(XLSheetPoint sheetPoint) + { + Remove(sheetPoint.Row, sheetPoint.Column); + } + + public void Remove(Int32 row, Int32 column) + { + Count--; + var rowRemoved = DecrementUsage(RowsUsed, row); + var columnRemoved = DecrementUsage(ColumnsUsed, column); + + if (rowRemoved && row == MaxRowUsed) + { + MaxRowUsed = RowsUsed.Keys.Any() + ? RowsUsed.Keys.Max() + : 0; + } + + if (columnRemoved && column == MaxColumnUsed) + { + MaxColumnUsed = ColumnsUsed.Keys.Any() + ? ColumnsUsed.Keys.Max() + : 0; + } + + if (Deleted.TryGetValue(row, out HashSet delHash)) + { + if (!delHash.Contains(column)) + delHash.Add(column); + } + else + { + delHash = new HashSet(); + delHash.Add(column); + Deleted.Add(row, delHash); + } + + if (RowsCollection.TryGetValue(row, out Dictionary columnsCollection)) + { + columnsCollection.Remove(column); + if (columnsCollection.Count == 0) + { + RowsCollection.Remove(row); + } + } + } + + internal IEnumerable GetCells(Int32 rowStart, Int32 columnStart, + Int32 rowEnd, Int32 columnEnd, + Func predicate = null) + { + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + for (int ro = rowStart; ro <= finalRow; ro++) + { + if (RowsCollection.TryGetValue(ro, out Dictionary columnsCollection)) + { + for (int co = columnStart; co <= finalColumn; co++) + { + if (columnsCollection.TryGetValue(co, out XLCell cell) + && (predicate == null || predicate(cell))) + yield return cell; + } + } + } + } + + public int FirstRowUsed(int rowStart, int columnStart, int rowEnd, int columnEnd, XLCellsUsedOptions options, + Func predicate = null) + { + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + for (int ro = rowStart; ro <= finalRow; ro++) + { + if (RowsCollection.TryGetValue(ro, out Dictionary columnsCollection)) + { + for (int co = columnStart; co <= finalColumn; co++) + { + if (columnsCollection.TryGetValue(co, out XLCell cell) + && !cell.IsEmpty(options) + && (predicate == null || predicate(cell))) + + return ro; + } + } + } + + return 0; + } + + public int FirstColumnUsed(int rowStart, int columnStart, int rowEnd, int columnEnd, XLCellsUsedOptions options, + Func predicate = null) + { + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + int firstColumnUsed = finalColumn; + var found = false; + for (int ro = rowStart; ro <= finalRow; ro++) + { + if (RowsCollection.TryGetValue(ro, out Dictionary columnsCollection)) + { + for (int co = columnStart; co <= firstColumnUsed; co++) + { + if (columnsCollection.TryGetValue(co, out XLCell cell) + && !cell.IsEmpty(options) + && (predicate == null || predicate(cell)) + && co <= firstColumnUsed) + { + firstColumnUsed = co; + found = true; + break; + } + } + } + } + + return found ? firstColumnUsed : 0; + } + + public int LastRowUsed(int rowStart, int columnStart, int rowEnd, int columnEnd, XLCellsUsedOptions options, + Func predicate = null) + { + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + for (int ro = finalRow; ro >= rowStart; ro--) + { + if (RowsCollection.TryGetValue(ro, out Dictionary columnsCollection)) + { + for (int co = finalColumn; co >= columnStart; co--) + { + if (columnsCollection.TryGetValue(co, out XLCell cell) + && !cell.IsEmpty(options) + && (predicate == null || predicate(cell))) + + return ro; + } + } + } + return 0; + } + + public int LastColumnUsed(int rowStart, int columnStart, int rowEnd, int columnEnd, XLCellsUsedOptions options, + Func predicate = null) + { + int maxCo = 0; + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + for (int ro = finalRow; ro >= rowStart; ro--) + { + if (RowsCollection.TryGetValue(ro, out Dictionary columnsCollection)) + { + for (int co = finalColumn; co >= columnStart && co > maxCo; co--) + { + if (columnsCollection.TryGetValue(co, out XLCell cell) + && !cell.IsEmpty(options) + && (predicate == null || predicate(cell))) + + maxCo = co; + } + } + } + return maxCo; + } + + public void RemoveAll(Int32 rowStart, Int32 columnStart, + Int32 rowEnd, Int32 columnEnd) + { + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + for (int ro = rowStart; ro <= finalRow; ro++) + { + if (RowsCollection.TryGetValue(ro, out Dictionary columnsCollection)) + { + for (int co = columnStart; co <= finalColumn; co++) + { + if (columnsCollection.ContainsKey(co)) + Remove(ro, co); + } + } + } + } + + public IEnumerable GetSheetPoints(Int32 rowStart, Int32 columnStart, + Int32 rowEnd, Int32 columnEnd) + { + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + for (int ro = rowStart; ro <= finalRow; ro++) + { + if (RowsCollection.TryGetValue(ro, out Dictionary columnsCollection)) + { + for (int co = columnStart; co <= finalColumn; co++) + { + if (columnsCollection.ContainsKey(co)) + yield return new XLSheetPoint(ro, co); + } + } + } + } + + public XLCell GetCell(Int32 row, Int32 column) + { + if (row > MaxRowUsed || column > MaxColumnUsed) + return null; + + if (RowsCollection.TryGetValue(row, out Dictionary columnsCollection)) + { + return columnsCollection.TryGetValue(column, out XLCell cell) ? cell : null; + } + return null; + } + + public XLCell GetCell(XLSheetPoint sp) + { + return GetCell(sp.Row, sp.Column); + } + + internal void SwapRanges(XLSheetRange sheetRange1, XLSheetRange sheetRange2, XLWorksheet worksheet) + { + Int32 rowCount = sheetRange1.LastPoint.Row - sheetRange1.FirstPoint.Row + 1; + Int32 columnCount = sheetRange1.LastPoint.Column - sheetRange1.FirstPoint.Column + 1; + for (int row = 0; row < rowCount; row++) + { + for (int column = 0; column < columnCount; column++) + { + var sp1 = new XLSheetPoint(sheetRange1.FirstPoint.Row + row, sheetRange1.FirstPoint.Column + column); + var sp2 = new XLSheetPoint(sheetRange2.FirstPoint.Row + row, sheetRange2.FirstPoint.Column + column); + var cell1 = GetCell(sp1); + var cell2 = GetCell(sp2); + + if (cell1 == null) cell1 = worksheet.Cell(sp1.Row, sp1.Column); + if (cell2 == null) cell2 = worksheet.Cell(sp2.Row, sp2.Column); + + //if (cell1 != null) + //{ + cell1.Address = new XLAddress(cell1.Worksheet, sp2.Row, sp2.Column, false, false); + Remove(sp1); + //if (cell2 != null) + Add(sp1, cell2); + //} + + //if (cell2 == null) continue; + + cell2.Address = new XLAddress(cell2.Worksheet, sp1.Row, sp1.Column, false, false); + Remove(sp2); + //if (cell1 != null) + Add(sp2, cell1); + } + } + } + + internal IEnumerable GetCells() + { + return GetCells(1, 1, MaxRowUsed, MaxColumnUsed); + } + + internal IEnumerable GetCells(Func predicate) + { + for (int ro = 1; ro <= MaxRowUsed; ro++) + { + if (RowsCollection.TryGetValue(ro, out Dictionary columnsCollection)) + { + for (int co = 1; co <= MaxColumnUsed; co++) + { + if (columnsCollection.TryGetValue(co, out XLCell cell) + && (predicate == null || predicate(cell))) + yield return cell; + } + } + } + } + + public Boolean Contains(Int32 row, Int32 column) + { + return RowsCollection.TryGetValue(row, out Dictionary columnsCollection) + && columnsCollection.ContainsKey(column); + } + + public Int32 MinRowInColumn(Int32 column) + { + for (int row = 1; row <= MaxRowUsed; row++) + { + if (RowsCollection.TryGetValue(row, out Dictionary columnsCollection) + && columnsCollection.ContainsKey(column)) + + return row; + } + + return 0; + } + + public Int32 MaxRowInColumn(Int32 column) + { + for (int row = MaxRowUsed; row >= 1; row--) + { + if (RowsCollection.TryGetValue(row, out Dictionary columnsCollection) + && columnsCollection.ContainsKey(column)) + + return row; + } + + return 0; + } + + public Int32 MinColumnInRow(Int32 row) + { + if (RowsCollection.TryGetValue(row, out Dictionary columnsCollection) + && columnsCollection.Any()) + + return columnsCollection.Keys.Min(); + + return 0; + } + + public Int32 MaxColumnInRow(Int32 row) + { + if (RowsCollection.TryGetValue(row, out Dictionary columnsCollection) + && columnsCollection.Any()) + + return columnsCollection.Keys.Max(); + + return 0; + } + + public IEnumerable GetCellsInColumn(Int32 column) + { + return GetCells(1, column, MaxRowUsed, column); + } + + public IEnumerable GetCellsInRow(Int32 row) + { + return GetCells(row, 1, row, MaxColumnUsed); + } + } +} diff --git a/ClosedXML/Excel/Charts/IXLChart.cs b/ClosedXML/Excel/Charts/IXLChart.cs new file mode 100644 index 0000000..7cfc813 --- /dev/null +++ b/ClosedXML/Excel/Charts/IXLChart.cs @@ -0,0 +1,90 @@ +using System; + +namespace ClosedXML.Excel +{ + public enum XLChartType { + Area, + Area3D, + AreaStacked, + AreaStacked100Percent, + AreaStacked100Percent3D, + AreaStacked3D, + BarClustered, + BarClustered3D, + BarStacked, + BarStacked100Percent, + BarStacked100Percent3D, + BarStacked3D, + Bubble, + Bubble3D, + Column3D, + ColumnClustered, + ColumnClustered3D, + ColumnStacked, + ColumnStacked100Percent, + ColumnStacked100Percent3D, + ColumnStacked3D, + Cone, + ConeClustered, + ConeHorizontalClustered, + ConeHorizontalStacked, + ConeHorizontalStacked100Percent, + ConeStacked, + ConeStacked100Percent, + Cylinder, + CylinderClustered, + CylinderHorizontalClustered, + CylinderHorizontalStacked, + CylinderHorizontalStacked100Percent, + CylinderStacked, + CylinderStacked100Percent, + Doughnut, + DoughnutExploded, + Line, + Line3D, + LineStacked, + LineStacked100Percent, + LineWithMarkers, + LineWithMarkersStacked, + LineWithMarkersStacked100Percent, + Pie, + Pie3D, + PieExploded, + PieExploded3D, + PieToBar, + PieToPie, + Pyramid, + PyramidClustered, + PyramidHorizontalClustered, + PyramidHorizontalStacked, + PyramidHorizontalStacked100Percent, + PyramidStacked, + PyramidStacked100Percent, + Radar, + RadarFilled, + RadarWithMarkers, + StockHighLowClose, + StockOpenHighLowClose, + StockVolumeHighLowClose, + StockVolumeOpenHighLowClose, + Surface, + SurfaceContour, + SurfaceContourWireframe, + SurfaceWireframe, + XYScatterMarkers, + XYScatterSmoothLinesNoMarkers, + XYScatterSmoothLinesWithMarkers, + XYScatterStraightLinesNoMarkers, + XYScatterStraightLinesWithMarkers + } + public interface IXLChart: IXLDrawing + { + Boolean RightAngleAxes { get; set; } + IXLChart SetRightAngleAxes(); + IXLChart SetRightAngleAxes(Boolean rightAngleAxes); + + XLChartType ChartType { get; set; } + IXLChart SetChartType(XLChartType chartType); + + } +} diff --git a/ClosedXML/Excel/Charts/IXLCharts.cs b/ClosedXML/Excel/Charts/IXLCharts.cs new file mode 100644 index 0000000..70c1478 --- /dev/null +++ b/ClosedXML/Excel/Charts/IXLCharts.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLCharts: IEnumerable + { + void Add(IXLChart chart); + } +} diff --git a/ClosedXML/Excel/Charts/XLChart.cs b/ClosedXML/Excel/Charts/XLChart.cs new file mode 100644 index 0000000..d928e6c --- /dev/null +++ b/ClosedXML/Excel/Charts/XLChart.cs @@ -0,0 +1,161 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal enum XLChartTypeCategory { Bar3D } + internal enum XLBarOrientation { Vertical, Horizontal } + internal enum XLBarGrouping { Clustered, Percent, Stacked, Standard } + internal class XLChart: XLDrawing, IXLChart + { + internal IXLWorksheet worksheet; + public XLChart(XLWorksheet worksheet) + { + Container = this; + this.worksheet = worksheet; + Int32 zOrder; + if (worksheet.Charts.Any()) + zOrder = worksheet.Charts.Max(c => c.ZOrder) + 1; + else + zOrder = 1; + ZOrder = zOrder; + ShapeId = worksheet.Workbook.ShapeIdManager.GetNext(); + RightAngleAxes = true; + } + + public Boolean RightAngleAxes { get; set; } + public IXLChart SetRightAngleAxes() + { + RightAngleAxes = true; + return this; + } + public IXLChart SetRightAngleAxes(Boolean rightAngleAxes) + { + RightAngleAxes = rightAngleAxes; + return this; + } + + public XLChartType ChartType { get; set; } + public IXLChart SetChartType(XLChartType chartType) + { + ChartType = chartType; + return this; + } + + public XLChartTypeCategory ChartTypeCategory + { + get + { + if (Bar3DCharts.Contains(ChartType)) + return XLChartTypeCategory.Bar3D; + else + throw new NotImplementedException(); + + } + } + + private HashSet Bar3DCharts = new HashSet { + XLChartType.BarClustered3D, + XLChartType.BarStacked100Percent3D, + XLChartType.BarStacked3D, + XLChartType.Column3D, + XLChartType.ColumnClustered3D, + XLChartType.ColumnStacked100Percent3D, + XLChartType.ColumnStacked3D + }; + + public XLBarOrientation BarOrientation + { + get + { + if (HorizontalCharts.Contains(ChartType)) + return XLBarOrientation.Horizontal; + else + return XLBarOrientation.Vertical; + } + } + + private HashSet HorizontalCharts = new HashSet{ + XLChartType.BarClustered, + XLChartType.BarClustered3D, + XLChartType.BarStacked, + XLChartType.BarStacked100Percent, + XLChartType.BarStacked100Percent3D, + XLChartType.BarStacked3D, + XLChartType.ConeHorizontalClustered, + XLChartType.ConeHorizontalStacked, + XLChartType.ConeHorizontalStacked100Percent, + XLChartType.CylinderHorizontalClustered, + XLChartType.CylinderHorizontalStacked, + XLChartType.CylinderHorizontalStacked100Percent, + XLChartType.PyramidHorizontalClustered, + XLChartType.PyramidHorizontalStacked, + XLChartType.PyramidHorizontalStacked100Percent + }; + + public XLBarGrouping BarGrouping + { + get + { + if (ClusteredCharts.Contains(ChartType)) + return XLBarGrouping.Clustered; + else if (PercentCharts.Contains(ChartType)) + return XLBarGrouping.Percent; + else if (StackedCharts.Contains(ChartType)) + return XLBarGrouping.Stacked; + else + return XLBarGrouping.Standard; + } + } + + public HashSet ClusteredCharts = new HashSet() + { + XLChartType.BarClustered, + XLChartType.BarClustered3D, + XLChartType.ColumnClustered, + XLChartType.ColumnClustered3D, + XLChartType.ConeClustered, + XLChartType.ConeHorizontalClustered, + XLChartType.CylinderClustered, + XLChartType.CylinderHorizontalClustered, + XLChartType.PyramidClustered, + XLChartType.PyramidHorizontalClustered + }; + + public HashSet PercentCharts = new HashSet() { + XLChartType.AreaStacked100Percent, + XLChartType.AreaStacked100Percent3D, + XLChartType.BarStacked100Percent, + XLChartType.BarStacked100Percent3D, + XLChartType.ColumnStacked100Percent, + XLChartType.ColumnStacked100Percent3D, + XLChartType.ConeHorizontalStacked100Percent, + XLChartType.ConeStacked100Percent, + XLChartType.CylinderHorizontalStacked100Percent, + XLChartType.CylinderStacked100Percent, + XLChartType.LineStacked100Percent, + XLChartType.LineWithMarkersStacked100Percent, + XLChartType.PyramidHorizontalStacked100Percent, + XLChartType.PyramidStacked100Percent + }; + + public HashSet StackedCharts = new HashSet() + { + XLChartType.AreaStacked, + XLChartType.AreaStacked3D, + XLChartType.BarStacked, + XLChartType.BarStacked3D, + XLChartType.ColumnStacked, + XLChartType.ColumnStacked3D, + XLChartType.ConeHorizontalStacked, + XLChartType.ConeStacked, + XLChartType.CylinderHorizontalStacked, + XLChartType.CylinderStacked, + XLChartType.LineStacked, + XLChartType.LineWithMarkersStacked, + XLChartType.PyramidHorizontalStacked, + XLChartType.PyramidStacked + }; + } +} diff --git a/ClosedXML/Excel/Charts/XLCharts.cs b/ClosedXML/Excel/Charts/XLCharts.cs new file mode 100644 index 0000000..112a6fc --- /dev/null +++ b/ClosedXML/Excel/Charts/XLCharts.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLCharts: IXLCharts + { + private List charts = new List(); + public IEnumerator GetEnumerator() + { + return charts.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Add(IXLChart chart) + { + charts.Add(chart); + } + } +} diff --git a/ClosedXML/Excel/Columns/IXLColumn.cs b/ClosedXML/Excel/Columns/IXLColumn.cs new file mode 100644 index 0000000..db2aecb --- /dev/null +++ b/ClosedXML/Excel/Columns/IXLColumn.cs @@ -0,0 +1,197 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLColumn : IXLRangeBase + { + /// + /// Gets or sets the width of this column. + /// + /// + /// The width of this column. + /// + Double Width { get; set; } + + /// + /// Deletes this column and shifts the columns at the right of this one accordingly. + /// + void Delete(); + + /// + /// Gets this column's number + /// + Int32 ColumnNumber(); + + /// + /// Gets this column's letter + /// + String ColumnLetter(); + + /// + /// Inserts X number of columns at the right of this one. + /// All columns at the right will be shifted accordingly. + /// + /// The number of columns to insert. + IXLColumns InsertColumnsAfter(Int32 numberOfColumns); + + /// + /// Inserts X number of columns at the left of this one. + /// This column and all at the right will be shifted accordingly. + /// + /// The number of columns to insert. + IXLColumns InsertColumnsBefore(Int32 numberOfColumns); + + /// + /// Gets the cell in the specified row. + /// + /// The cell's row. + IXLCell Cell(Int32 rowNumber); + + /// + /// Returns the specified group of cells, separated by commas. + /// e.g. Cells("1"), Cells("1:5"), Cells("1,3:5") + /// + /// The column cells to return. + new IXLCells Cells(String cellsInColumn); + + /// + /// Returns the specified group of cells. + /// + /// The first row in the group of cells to return. + /// The last row in the group of cells to return. + IXLCells Cells(Int32 firstRow, Int32 lastRow); + + /// + /// Adjusts the width of the column based on its contents. + /// + IXLColumn AdjustToContents(); + + /// + /// Adjusts the width of the column based on its contents, starting from the startRow. + /// + /// The row to start calculating the column width. + IXLColumn AdjustToContents(Int32 startRow); + + /// + /// Adjusts the width of the column based on its contents, starting from the startRow and ending at endRow. + /// + /// The row to start calculating the column width. + /// The row to end calculating the column width. + IXLColumn AdjustToContents(Int32 startRow, Int32 endRow); + + IXLColumn AdjustToContents(Double minWidth, Double maxWidth); + + IXLColumn AdjustToContents(Int32 startRow, Double minWidth, Double maxWidth); + + IXLColumn AdjustToContents(Int32 startRow, Int32 endRow, Double minWidth, Double maxWidth); + + /// + /// Hides this column. + /// + IXLColumn Hide(); + + /// Unhides this column. + IXLColumn Unhide(); + + /// + /// Gets a value indicating whether this column is hidden or not. + /// + /// + /// true if this column is hidden; otherwise, false. + /// + Boolean IsHidden { get; } + + /// + /// Gets or sets the outline level of this column. + /// + /// + /// The outline level of this column. + /// + Int32 OutlineLevel { get; set; } + + /// + /// Adds this column to the next outline level (Increments the outline level for this column by 1). + /// + IXLColumn Group(); + + /// + /// Adds this column to the next outline level (Increments the outline level for this column by 1). + /// + /// If set to true the column will be shown collapsed. + IXLColumn Group(Boolean collapse); + + /// + /// Sets outline level for this column. + /// + /// The outline level. + IXLColumn Group(Int32 outlineLevel); + + /// + /// Sets outline level for this column. + /// + /// The outline level. + /// If set to true the column will be shown collapsed. + IXLColumn Group(Int32 outlineLevel, Boolean collapse); + + /// + /// Adds this column to the previous outline level (decrements the outline level for this column by 1). + /// + IXLColumn Ungroup(); + + /// + /// Adds this column to the previous outline level (decrements the outline level for this column by 1). + /// + /// If set to true it will remove this column from all outline levels. + IXLColumn Ungroup(Boolean fromAll); + + /// + /// Show this column as collapsed. + /// + IXLColumn Collapse(); + + /// Expands this column (if it's collapsed). + IXLColumn Expand(); + + Int32 CellCount(); + + IXLRangeColumn CopyTo(IXLCell cell); + + IXLRangeColumn CopyTo(IXLRangeBase range); + + IXLColumn CopyTo(IXLColumn column); + + IXLColumn Sort(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + IXLRangeColumn Column(Int32 start, Int32 end); + + IXLRangeColumn Column(IXLCell start, IXLCell end); + + IXLRangeColumns Columns(String columns); + + /// + /// Adds a vertical page break after this column. + /// + IXLColumn AddVerticalPageBreak(); + + IXLColumn SetDataType(XLDataType dataType); + + IXLColumn ColumnLeft(); + + IXLColumn ColumnLeft(Int32 step); + + IXLColumn ColumnRight(); + + IXLColumn ColumnRight(Int32 step); + + /// + /// Clears the contents of this column. + /// + /// Specify what you want to clear. + new IXLColumn Clear(XLClearOptions clearOptions = XLClearOptions.All); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRangeColumn ColumnUsed(Boolean includeFormats); + + IXLRangeColumn ColumnUsed(XLCellsUsedOptions options = XLCellsUsedOptions.AllContents); + } +} diff --git a/ClosedXML/Excel/Columns/IXLColumns.cs b/ClosedXML/Excel/Columns/IXLColumns.cs new file mode 100644 index 0000000..56a8edf --- /dev/null +++ b/ClosedXML/Excel/Columns/IXLColumns.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLColumns : IEnumerable + { + /// + /// Sets the width of all columns. + /// + /// + /// The width of all columns. + /// + Double Width { set; } + + /// + /// Deletes all columns and shifts the columns at the right of them accordingly. + /// + void Delete(); + + /// + /// Adjusts the width of all columns based on its contents. + /// + IXLColumns AdjustToContents(); + + /// + /// Adjusts the width of all columns based on its contents, starting from the startRow. + /// + /// The row to start calculating the column width. + IXLColumns AdjustToContents(Int32 startRow); + + /// + /// Adjusts the width of all columns based on its contents, starting from the startRow and ending at endRow. + /// + /// The row to start calculating the column width. + /// The row to end calculating the column width. + IXLColumns AdjustToContents(Int32 startRow, Int32 endRow); + + IXLColumns AdjustToContents(Double minWidth, Double maxWidth); + + IXLColumns AdjustToContents(Int32 startRow, Double minWidth, Double maxWidth); + + IXLColumns AdjustToContents(Int32 startRow, Int32 endRow, Double minWidth, Double maxWidth); + + /// + /// Hides all columns. + /// + void Hide(); + + /// Unhides all columns. + void Unhide(); + + /// + /// Increments the outline level of all columns by 1. + /// + void Group(); + + /// + /// Increments the outline level of all columns by 1. + /// + /// If set to true the columns will be shown collapsed. + void Group(Boolean collapse); + + /// + /// Sets outline level for all columns. + /// + /// The outline level. + void Group(Int32 outlineLevel); + + /// + /// Sets outline level for all columns. + /// + /// The outline level. + /// If set to true the columns will be shown collapsed. + void Group(Int32 outlineLevel, Boolean collapse); + + /// + /// Decrements the outline level of all columns by 1. + /// + void Ungroup(); + + /// + /// Decrements the outline level of all columns by 1. + /// + /// If set to true it will remove the columns from all outline levels. + void Ungroup(Boolean fromAll); + + /// + /// Show all columns as collapsed. + /// + void Collapse(); + + /// Expands all columns (if they're collapsed). + void Expand(); + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + /// + /// Returns the collection of cells that have a value. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + IXLCells CellsUsed(Boolean includeFormats); + + IXLStyle Style { get; set; } + + /// + /// Adds a vertical page break after these columns. + /// + IXLColumns AddVerticalPageBreaks(); + + IXLColumns SetDataType(XLDataType dataType); + + /// + /// Clears the contents of these columns. + /// + /// Specify what you want to clear. + IXLColumns Clear(XLClearOptions clearOptions = XLClearOptions.All); + + void Select(); + } +} diff --git a/ClosedXML/Excel/Columns/XLColumn.cs b/ClosedXML/Excel/Columns/XLColumn.cs new file mode 100644 index 0000000..e651d44 --- /dev/null +++ b/ClosedXML/Excel/Columns/XLColumn.cs @@ -0,0 +1,666 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLColumn : XLRangeBase, IXLColumn + { + #region Private fields + + private int _outlineLevel; + + #endregion Private fields + + #region Constructor + + /// + /// The direct contructor should only be used in . + /// + public XLColumn(XLWorksheet worksheet, Int32 column) + : base(XLRangeAddress.EntireColumn(worksheet, column), worksheet.StyleValue) + { + SetColumnNumber(column); + + Width = worksheet.ColumnWidth; + } + + #endregion Constructor + + public override XLRangeType RangeType + { + get { return XLRangeType.Column; } + } + + public override IEnumerable Styles + { + get + { + yield return Style; + + int column = ColumnNumber(); + + foreach (XLCell cell in Worksheet.Internals.CellsCollection.GetCellsInColumn(column)) + yield return cell.Style; + } + } + + protected override IEnumerable Children + { + get + { + int column = ColumnNumber(); + foreach (XLCell cell in Worksheet.Internals.CellsCollection.GetCellsInColumn(column)) + yield return cell; + } + } + + public Boolean Collapsed { get; set; } + + #region IXLColumn Members + + public Double Width { get; set; } + + public void Delete() + { + int columnNumber = ColumnNumber(); + Delete(XLShiftDeletedCells.ShiftCellsLeft); + Worksheet.DeleteColumn(columnNumber); + } + + public new IXLColumn Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + base.Clear(clearOptions); + return this; + } + + public IXLCell Cell(Int32 rowNumber) + { + return Cell(rowNumber, 1); + } + + public override IXLCells Cells(String cellsInColumn) + { + var retVal = new XLCells(false, XLCellsUsedOptions.All); + var rangePairs = cellsInColumn.Split(','); + foreach (string pair in rangePairs) + retVal.Add(Range(pair.Trim()).RangeAddress); + return retVal; + } + + public override IXLCells Cells() + { + return Cells(true, XLCellsUsedOptions.All); + } + + public override IXLCells Cells(Boolean usedCellsOnly) + { + if (usedCellsOnly) + return Cells(true, XLCellsUsedOptions.AllContents); + else + return Cells(FirstCellUsed().Address.RowNumber, LastCellUsed().Address.RowNumber); + } + + public IXLCells Cells(Int32 firstRow, Int32 lastRow) + { + return Cells(firstRow + ":" + lastRow); + } + + public new IXLColumns InsertColumnsAfter(Int32 numberOfColumns) + { + int columnNum = ColumnNumber(); + Worksheet.Internals.ColumnsCollection.ShiftColumnsRight(columnNum + 1, numberOfColumns); + Worksheet.Column(columnNum).InsertColumnsAfterVoid(true, numberOfColumns); + var newColumns = Worksheet.Columns(columnNum + 1, columnNum + numberOfColumns); + CopyColumns(newColumns); + return newColumns; + } + + public new IXLColumns InsertColumnsBefore(Int32 numberOfColumns) + { + int columnNum = ColumnNumber(); + if (columnNum > 1) + { + return Worksheet.Column(columnNum - 1).InsertColumnsAfter(numberOfColumns); + } + + Worksheet.Internals.ColumnsCollection.ShiftColumnsRight(columnNum, numberOfColumns); + Worksheet.Column(columnNum).InsertColumnsBeforeVoid(true, numberOfColumns); + + return Worksheet.Columns(columnNum, columnNum + numberOfColumns - 1); + } + + private void CopyColumns(IXLColumns newColumns) + { + foreach (var newColumn in newColumns) + { + var internalColumn = Worksheet.Internals.ColumnsCollection[newColumn.ColumnNumber()]; + internalColumn.Width = Width; + internalColumn.InnerStyle = InnerStyle; + internalColumn.Collapsed = Collapsed; + internalColumn.IsHidden = IsHidden; + internalColumn._outlineLevel = OutlineLevel; + } + } + + public IXLColumn AdjustToContents() + { + return AdjustToContents(1); + } + + public IXLColumn AdjustToContents(Int32 startRow) + { + return AdjustToContents(startRow, XLHelper.MaxRowNumber); + } + + public IXLColumn AdjustToContents(Int32 startRow, Int32 endRow) + { + return AdjustToContents(startRow, endRow, 0, Double.MaxValue); + } + + public IXLColumn AdjustToContents(Double minWidth, Double maxWidth) + { + return AdjustToContents(1, XLHelper.MaxRowNumber, minWidth, maxWidth); + } + + public IXLColumn AdjustToContents(Int32 startRow, Double minWidth, Double maxWidth) + { + return AdjustToContents(startRow, XLHelper.MaxRowNumber, minWidth, maxWidth); + } + + public IXLColumn AdjustToContents(Int32 startRow, Int32 endRow, Double minWidth, Double maxWidth) + { + var fontCache = new Dictionary(); + + Double colMaxWidth = minWidth; + + List autoFilterRows = new List(); + if (this.Worksheet.AutoFilter != null && this.Worksheet.AutoFilter.Range != null) + autoFilterRows.Add(this.Worksheet.AutoFilter.Range.FirstRow().RowNumber()); + + autoFilterRows.AddRange(Worksheet.Tables.Where(t => + t.AutoFilter != null + && t.AutoFilter.Range != null + && !autoFilterRows.Contains(t.AutoFilter.Range.FirstRow().RowNumber())) + .Select(t => t.AutoFilter.Range.FirstRow().RowNumber())); + + XLStyle cellStyle = null; + foreach (var c in Column(startRow, endRow).CellsUsed().Cast()) + { + if (c.IsMerged()) continue; + if (cellStyle == null || cellStyle.Value != c.StyleValue) + cellStyle = c.Style as XLStyle; + + Double thisWidthMax = 0; + Int32 textRotation = cellStyle.Alignment.TextRotation; + if (c.HasRichText || textRotation != 0 || c.InnerText.Contains(Environment.NewLine)) + { + var kpList = new List>(); + + #region if (c.HasRichText) + + if (c.HasRichText) + { + foreach (IXLRichString rt in c.RichText) + { + String formattedString = rt.Text; + var arr = formattedString.Split(new[] { Environment.NewLine }, StringSplitOptions.None); + Int32 arrCount = arr.Count(); + for (Int32 i = 0; i < arrCount; i++) + { + String s = arr[i]; + if (i < arrCount - 1) + s += Environment.NewLine; + kpList.Add(new KeyValuePair(rt, s)); + } + } + } + else + { + String formattedString = c.GetFormattedString(); + var arr = formattedString.Split(new[] { Environment.NewLine }, StringSplitOptions.None); + Int32 arrCount = arr.Count(); + for (Int32 i = 0; i < arrCount; i++) + { + String s = arr[i]; + if (i < arrCount - 1) + s += Environment.NewLine; + kpList.Add(new KeyValuePair(cellStyle.Font, s)); + } + } + + #endregion if (c.HasRichText) + + #region foreach (var kp in kpList) + + Double runningWidth = 0; + Boolean rotated = false; + Double maxLineWidth = 0; + Int32 lineCount = 1; + foreach (KeyValuePair kp in kpList) + { + var f = kp.Key; + String formattedString = kp.Value; + + Int32 newLinePosition = formattedString.IndexOf(Environment.NewLine); + if (textRotation == 0) + { + #region if (newLinePosition >= 0) + + if (newLinePosition >= 0) + { + if (newLinePosition > 0) + runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition), fontCache); + + if (runningWidth > thisWidthMax) + thisWidthMax = runningWidth; + + runningWidth = newLinePosition < formattedString.Length - 2 + ? f.GetWidth(formattedString.Substring(newLinePosition + 2), fontCache) + : 0; + } + else + runningWidth += f.GetWidth(formattedString, fontCache); + + #endregion if (newLinePosition >= 0) + } + else + { + #region if (textRotation == 255) + + if (textRotation == 255) + { + if (runningWidth <= 0) + runningWidth = f.GetWidth("X", fontCache); + + if (newLinePosition >= 0) + runningWidth += f.GetWidth("X", fontCache); + } + else + { + rotated = true; + Double vWidth = f.GetWidth("X", fontCache); + if (vWidth > maxLineWidth) + maxLineWidth = vWidth; + + if (newLinePosition >= 0) + { + lineCount++; + + if (newLinePosition > 0) + runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition), fontCache); + + if (runningWidth > thisWidthMax) + thisWidthMax = runningWidth; + + runningWidth = newLinePosition < formattedString.Length - 2 + ? f.GetWidth(formattedString.Substring(newLinePosition + 2), fontCache) + : 0; + } + else + runningWidth += f.GetWidth(formattedString, fontCache); + } + + #endregion if (textRotation == 255) + } + } + + #endregion foreach (var kp in kpList) + + if (runningWidth > thisWidthMax) + thisWidthMax = runningWidth; + + #region if (rotated) + + if (rotated) + { + Int32 rotation; + if (textRotation == 90 || textRotation == 180 || textRotation == 255) + rotation = 90; + else + rotation = textRotation % 90; + + Double r = DegreeToRadian(rotation); + + thisWidthMax = (thisWidthMax * Math.Cos(r)) + (maxLineWidth * lineCount); + } + + #endregion if (rotated) + } + else + thisWidthMax = cellStyle.Font.GetWidth(c.GetFormattedString(), fontCache); + + if (autoFilterRows.Contains(c.Address.RowNumber)) + thisWidthMax += 2.7148; // Allow room for arrow icon in autofilter + + if (thisWidthMax >= maxWidth) + { + colMaxWidth = maxWidth; + break; + } + + if (thisWidthMax > colMaxWidth) + colMaxWidth = thisWidthMax + 1; + } + + if (colMaxWidth <= 0) + colMaxWidth = Worksheet.ColumnWidth; + + Width = colMaxWidth; + + foreach (IDisposable font in fontCache.Values) + { + font.Dispose(); + } + return this; + } + + public IXLColumn Hide() + { + IsHidden = true; + return this; + } + + public IXLColumn Unhide() + { + IsHidden = false; + return this; + } + + public Boolean IsHidden { get; set; } + + public Int32 OutlineLevel + { + get { return _outlineLevel; } + set + { + if (value < 0 || value > 8) + throw new ArgumentOutOfRangeException("value", "Outline level must be between 0 and 8."); + + Worksheet.IncrementColumnOutline(value); + Worksheet.DecrementColumnOutline(_outlineLevel); + _outlineLevel = value; + } + } + + public IXLColumn Group() + { + return Group(false); + } + + public IXLColumn Group(Boolean collapse) + { + if (OutlineLevel < 8) + OutlineLevel += 1; + + Collapsed = collapse; + return this; + } + + public IXLColumn Group(Int32 outlineLevel) + { + return Group(outlineLevel, false); + } + + public IXLColumn Group(Int32 outlineLevel, Boolean collapse) + { + OutlineLevel = outlineLevel; + Collapsed = collapse; + return this; + } + + public IXLColumn Ungroup() + { + return Ungroup(false); + } + + public IXLColumn Ungroup(Boolean ungroupFromAll) + { + if (ungroupFromAll) + OutlineLevel = 0; + else + { + if (OutlineLevel > 0) + OutlineLevel -= 1; + } + return this; + } + + public IXLColumn Collapse() + { + Collapsed = true; + return Hide(); + } + + public IXLColumn Expand() + { + Collapsed = false; + return Unhide(); + } + + public Int32 CellCount() + { + return RangeAddress.LastAddress.ColumnNumber - RangeAddress.FirstAddress.ColumnNumber + 1; + } + + public IXLColumn Sort(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, + Boolean ignoreBlanks = true) + { + Sort(1, sortOrder, matchCase, ignoreBlanks); + return this; + } + + IXLRangeColumn IXLColumn.CopyTo(IXLCell target) + { + var copy = AsRange().CopyTo(target); + return copy.Column(1); + } + + IXLRangeColumn IXLColumn.CopyTo(IXLRangeBase target) + { + var copy = AsRange().CopyTo(target); + return copy.Column(1); + } + + public IXLColumn CopyTo(IXLColumn column) + { + column.Clear(); + var newColumn = (XLColumn)column; + newColumn.Width = Width; + newColumn.InnerStyle = InnerStyle; + newColumn.IsHidden = IsHidden; + + (this as XLRangeBase).CopyTo(column); + + return newColumn; + } + + public IXLRangeColumn Column(Int32 start, Int32 end) + { + return Range(start, 1, end, 1).Column(1); + } + + public IXLRangeColumn Column(IXLCell start, IXLCell end) + { + return Column(start.Address.RowNumber, end.Address.RowNumber); + } + + public IXLRangeColumns Columns(String columns) + { + var retVal = new XLRangeColumns(); + var columnPairs = columns.Split(','); + foreach (string pair in columnPairs) + AsRange().Columns(pair.Trim()).ForEach(retVal.Add); + return retVal; + } + + /// + /// Adds a vertical page break after this column. + /// + public IXLColumn AddVerticalPageBreak() + { + Worksheet.PageSetup.AddVerticalPageBreak(ColumnNumber()); + return this; + } + + public IXLColumn SetDataType(XLDataType dataType) + { + DataType = dataType; + return this; + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public IXLRangeColumn ColumnUsed(Boolean includeFormats) + { + return ColumnUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + public IXLRangeColumn ColumnUsed(XLCellsUsedOptions options = XLCellsUsedOptions.AllContents) + { + return Column((this as IXLRangeBase).FirstCellUsed(options), + (this as IXLRangeBase).LastCellUsed(options)); + } + + #endregion IXLColumn Members + + public override XLRange AsRange() + { + return Range(1, 1, XLHelper.MaxRowNumber, 1); + } + + internal override void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted) + { + return; // Columns are shifted by XLColumnCollection + } + + internal override void WorksheetRangeShiftedRows(XLRange range, int rowsShifted) + { + //do nothing + } + + internal void SetColumnNumber(int column) + { + RangeAddress = new XLRangeAddress( + new XLAddress(Worksheet, + 1, + column, + RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn), + new XLAddress(Worksheet, + XLHelper.MaxRowNumber, + column, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn)); + } + + public override XLRange Range(String rangeAddressStr) + { + String rangeAddressToUse; + if (rangeAddressStr.Contains(':') || rangeAddressStr.Contains('-')) + { + if (rangeAddressStr.Contains('-')) + rangeAddressStr = rangeAddressStr.Replace('-', ':'); + + var arrRange = rangeAddressStr.Split(':'); + string firstPart = arrRange[0]; + string secondPart = arrRange[1]; + rangeAddressToUse = FixColumnAddress(firstPart) + ":" + FixColumnAddress(secondPart); + } + else + rangeAddressToUse = FixColumnAddress(rangeAddressStr); + + var rangeAddress = new XLRangeAddress(Worksheet, rangeAddressToUse); + return Range(rangeAddress); + } + + public IXLRangeColumn Range(int firstRow, int lastRow) + { + return Range(firstRow, 1, lastRow, 1).Column(1); + } + + private static double DegreeToRadian(double angle) + { + return Math.PI * angle / 180.0; + } + + private XLColumn ColumnShift(Int32 columnsToShift) + { + return Worksheet.Column(ColumnNumber() + columnsToShift); + } + + #region XLColumn Left + + IXLColumn IXLColumn.ColumnLeft() + { + return ColumnLeft(); + } + + IXLColumn IXLColumn.ColumnLeft(Int32 step) + { + return ColumnLeft(step); + } + + public XLColumn ColumnLeft() + { + return ColumnLeft(1); + } + + public XLColumn ColumnLeft(Int32 step) + { + return ColumnShift(step * -1); + } + + #endregion XLColumn Left + + #region XLColumn Right + + IXLColumn IXLColumn.ColumnRight() + { + return ColumnRight(); + } + + IXLColumn IXLColumn.ColumnRight(Int32 step) + { + return ColumnRight(step); + } + + public XLColumn ColumnRight() + { + return ColumnRight(1); + } + + public XLColumn ColumnRight(Int32 step) + { + return ColumnShift(step); + } + + #endregion XLColumn Right + + public override Boolean IsEmpty() + { + return IsEmpty(XLCellsUsedOptions.AllContents); + } + + public override Boolean IsEmpty(XLCellsUsedOptions options) + { + if (options.HasFlag(XLCellsUsedOptions.NormalFormats) && + !StyleValue.Equals(Worksheet.StyleValue)) + return false; + + return base.IsEmpty(options); + } + + public override Boolean IsEntireRow() + { + return false; + } + + public override Boolean IsEntireColumn() + { + return true; + } + } +} diff --git a/ClosedXML/Excel/Columns/XLColumnCollection.cs b/ClosedXML/Excel/Columns/XLColumnCollection.cs new file mode 100644 index 0000000..4c33ee9 --- /dev/null +++ b/ClosedXML/Excel/Columns/XLColumnCollection.cs @@ -0,0 +1,118 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLColumnsCollection : IDictionary + { + public void ShiftColumnsRight(Int32 startingColumn, Int32 columnsToShift) + { + foreach (var co in _dictionary.Keys.Where(k => k >= startingColumn).OrderByDescending(k => k)) + { + var columnToMove = _dictionary[co]; + _dictionary.Remove(co); + Int32 newColumnNum = co + columnsToShift; + if (newColumnNum <= XLHelper.MaxColumnNumber) + { + columnToMove.SetColumnNumber(newColumnNum); + _dictionary.Add(newColumnNum, columnToMove); + } + } + } + + private readonly Dictionary _dictionary = new Dictionary(); + + public void Add(int key, XLColumn value) + { + _dictionary.Add(key, value); + } + + public bool ContainsKey(int key) + { + return _dictionary.ContainsKey(key); + } + + public ICollection Keys + { + get { return _dictionary.Keys; } + } + + public bool Remove(int key) + { + return _dictionary.Remove(key); + } + + public bool TryGetValue(int key, out XLColumn value) + { + return _dictionary.TryGetValue(key, out value); + } + + public ICollection Values + { + get { return _dictionary.Values; } + } + + public XLColumn this[int key] + { + get + { + return _dictionary[key]; + } + set + { + _dictionary[key] = value; + } + } + + public void Add(KeyValuePair item) + { + _dictionary.Add(item.Key, item.Value); + } + + public void Clear() + { + _dictionary.Clear(); + } + + public bool Contains(KeyValuePair item) + { + return _dictionary.Contains(item); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public int Count + { + get { return _dictionary.Count; } + } + + public bool IsReadOnly + { + get { return false; } + } + + public bool Remove(KeyValuePair item) + { + return _dictionary.Remove(item.Key); + } + + public IEnumerator> GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + public void RemoveAll(Func predicate) + { + _dictionary.RemoveAll(predicate); + } + } +} diff --git a/ClosedXML/Excel/Columns/XLColumns.cs b/ClosedXML/Excel/Columns/XLColumns.cs new file mode 100644 index 0000000..108f70b --- /dev/null +++ b/ClosedXML/Excel/Columns/XLColumns.cs @@ -0,0 +1,282 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections; + + internal class XLColumns : XLStylizedBase, IXLColumns, IXLStylized + { + private readonly List _columns = new List(); + private readonly XLWorksheet _worksheet; + + /// + /// Create a new instance of . + /// + /// If worksheet is specified it means that the created instance represents + /// all columns on a worksheet so changing its width will affect all columns. + /// Default style to use when initializing child entries. + public XLColumns(XLWorksheet worksheet, XLStyleValue defaultStyle = null) + : base(defaultStyle) + { + _worksheet = worksheet; + } + + #region IXLColumns Members + + public IEnumerator GetEnumerator() + { + return _columns.Cast().OrderBy(r => r.ColumnNumber()).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public Double Width + { + set + { + _columns.ForEach(c => c.Width = value); + + if (_worksheet == null) return; + + _worksheet.ColumnWidth = value; + _worksheet.Internals.ColumnsCollection.ForEach(c => c.Value.Width = value); + } + } + + public void Delete() + { + if (_worksheet != null) + { + _worksheet.Internals.ColumnsCollection.Clear(); + _worksheet.Internals.CellsCollection.Clear(); + } + else + { + var toDelete = new Dictionary>(); + foreach (XLColumn c in _columns) + { + if (!toDelete.TryGetValue(c.Worksheet, out List list)) + { + list = new List(); + toDelete.Add(c.Worksheet, list); + } + + list.Add(c.ColumnNumber()); + } + + foreach (KeyValuePair> kp in toDelete) + { + foreach (int c in kp.Value.OrderByDescending(c => c)) + kp.Key.Column(c).Delete(); + } + } + } + + public IXLColumns AdjustToContents() + { + _columns.ForEach(c => c.AdjustToContents()); + return this; + } + + public IXLColumns AdjustToContents(Int32 startRow) + { + _columns.ForEach(c => c.AdjustToContents(startRow)); + return this; + } + + public IXLColumns AdjustToContents(Int32 startRow, Int32 endRow) + { + _columns.ForEach(c => c.AdjustToContents(startRow, endRow)); + return this; + } + + public IXLColumns AdjustToContents(Double minWidth, Double maxWidth) + { + _columns.ForEach(c => c.AdjustToContents(minWidth, maxWidth)); + return this; + } + + public IXLColumns AdjustToContents(Int32 startRow, Double minWidth, Double maxWidth) + { + _columns.ForEach(c => c.AdjustToContents(startRow, minWidth, maxWidth)); + return this; + } + + public IXLColumns AdjustToContents(Int32 startRow, Int32 endRow, Double minWidth, Double maxWidth) + { + _columns.ForEach(c => c.AdjustToContents(startRow, endRow, minWidth, maxWidth)); + return this; + } + + public void Hide() + { + _columns.ForEach(c => c.Hide()); + } + + public void Unhide() + { + _columns.ForEach(c => c.Unhide()); + } + + public void Group() + { + Group(false); + } + + public void Group(Int32 outlineLevel) + { + Group(outlineLevel, false); + } + + public void Ungroup() + { + Ungroup(false); + } + + public void Group(Boolean collapse) + { + _columns.ForEach(c => c.Group(collapse)); + } + + public void Group(Int32 outlineLevel, Boolean collapse) + { + _columns.ForEach(c => c.Group(outlineLevel, collapse)); + } + + public void Ungroup(Boolean ungroupFromAll) + { + _columns.ForEach(c => c.Ungroup(ungroupFromAll)); + } + + public void Collapse() + { + _columns.ForEach(c => c.Collapse()); + } + + public void Expand() + { + _columns.ForEach(c => c.Expand()); + } + + public IXLCells Cells() + { + var cells = new XLCells(false, XLCellsUsedOptions.All); + foreach (XLColumn container in _columns) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed() + { + var cells = new XLCells(true, XLCellsUsedOptions.All); + foreach (XLColumn container in _columns) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed(Boolean includeFormats) + { + return CellsUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + public IXLCells CellsUsed(XLCellsUsedOptions options) + { + var cells = new XLCells(true, options); + foreach (XLColumn container in _columns) + cells.Add(container.RangeAddress); + return cells; + } + + /// + /// Adds a vertical page break after this column. + /// + public IXLColumns AddVerticalPageBreaks() + { + foreach (XLColumn col in _columns) + col.Worksheet.PageSetup.AddVerticalPageBreak(col.ColumnNumber()); + return this; + } + + public IXLColumns SetDataType(XLDataType dataType) + { + _columns.ForEach(c => c.DataType = dataType); + return this; + } + + #endregion IXLColumns Members + + #region IXLStylized Members + + public override IEnumerable Styles + { + get + { + yield return Style; + if (_worksheet != null) + yield return _worksheet.Style; + else + { + foreach (IXLStyle s in _columns.SelectMany(col => col.Styles)) + { + yield return s; + } + } + } + } + + protected override IEnumerable Children + { + get + { + if (_worksheet != null) + yield return _worksheet; + else + { + foreach (XLColumn column in _columns) + yield return column; + } + } + } + + public override IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges(); + this.ForEach(c => retVal.Add(c.AsRange())); + return retVal; + } + } + + #endregion IXLStylized Members + + public void Add(XLColumn column) + { + _columns.Add(column); + } + + public void CollapseOnly() + { + _columns.ForEach(c => c.Collapsed = true); + } + + public IXLColumns Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + _columns.ForEach(c => c.Clear(clearOptions)); + return this; + } + + public void Select() + { + foreach (var range in this) + range.Select(); + } + } +} diff --git a/ClosedXML/Excel/Comments/IXLComment.cs b/ClosedXML/Excel/Comments/IXLComment.cs new file mode 100644 index 0000000..9b3b30e --- /dev/null +++ b/ClosedXML/Excel/Comments/IXLComment.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLComment : IXLFormattedText, IXLDrawing + { + /// + /// Gets or sets this comment's author's name + /// + String Author { get; set; } + /// + /// Sets the name of the comment's author + /// + /// Author's name + IXLComment SetAuthor(String value); + + /// + /// Adds a bolded line with the author's name + /// + IXLRichString AddSignature(); + + void Delete(); + } + +} diff --git a/ClosedXML/Excel/Comments/XLComment.cs b/ClosedXML/Excel/Comments/XLComment.cs new file mode 100644 index 0000000..9144c40 --- /dev/null +++ b/ClosedXML/Excel/Comments/XLComment.cs @@ -0,0 +1,202 @@ +using System; + +namespace ClosedXML.Excel +{ + internal class XLComment : XLFormattedText, IXLComment + { + private XLCell _cell; + + public XLComment(XLCell cell, IXLFontBase defaultFont = null, int? shapeId = null) + : base(defaultFont ?? XLFont.DefaultCommentFont) + { + Initialize(cell, shapeId: shapeId); + } + + public XLComment(XLCell cell, XLFormattedText defaultComment, IXLFontBase defaultFont, IXLDrawingStyle style) + : base(defaultComment, defaultFont) + { + Initialize(cell, style); + } + + public XLComment(XLCell cell, String text, IXLFontBase defaultFont) + : base(text, defaultFont) + { + Initialize(cell); + } + + #region IXLComment Members + + public String Author { get; set; } + + public IXLComment SetAuthor(String value) + { + Author = value; + return this; + } + + public IXLRichString AddSignature() + { + AddText(Author + ":").SetBold(); + return AddText(Environment.NewLine); + } + + public void Delete() + { + _cell.DeleteComment(); + } + + #endregion IXLComment Members + + #region IXLDrawing + + public String Name { get; set; } + public String Description { get; set; } + public XLDrawingAnchor Anchor { get; set; } + public Boolean HorizontalFlip { get; set; } + public Boolean VerticalFlip { get; set; } + public Int32 Rotation { get; set; } + public Int32 ExtentLength { get; set; } + public Int32 ExtentWidth { get; set; } + public Int32 ShapeId { get; internal set; } + public Boolean Visible { get; set; } + + public IXLComment SetVisible() + { + Visible = true; + return Container; + } + + public IXLComment SetVisible(Boolean hidden) + { + Visible = hidden; + return Container; + } + + public IXLDrawingPosition Position { get; private set; } + + public Int32 ZOrder { get; set; } + + public IXLComment SetZOrder(Int32 zOrder) + { + ZOrder = zOrder; + return Container; + } + + public IXLDrawingStyle Style { get; private set; } + + public IXLComment SetName(String name) + { + Name = name; + return Container; + } + + public IXLComment SetDescription(String description) + { + Description = description; + return Container; + } + + public IXLComment SetHorizontalFlip() + { + HorizontalFlip = true; + return Container; + } + + public IXLComment SetHorizontalFlip(Boolean horizontalFlip) + { + HorizontalFlip = horizontalFlip; + return Container; + } + + public IXLComment SetVerticalFlip() + { + VerticalFlip = true; + return Container; + } + + public IXLComment SetVerticalFlip(Boolean verticalFlip) + { + VerticalFlip = verticalFlip; + return Container; + } + + public IXLComment SetRotation(Int32 rotation) + { + Rotation = rotation; + return Container; + } + + public IXLComment SetExtentLength(Int32 extentLength) + { + ExtentLength = extentLength; + return Container; + } + + public IXLComment SetExtentWidth(Int32 extentWidth) + { + ExtentWidth = extentWidth; + return Container; + } + + #endregion IXLDrawing + + private void Initialize(XLCell cell, IXLDrawingStyle style = null, int? shapeId = null) + { + style = style ?? XLDrawingStyle.DefaultCommentStyle; + shapeId = shapeId ?? cell.Worksheet.Workbook.ShapeIdManager.GetNext(); + + Author = cell.Worksheet.Author; + Container = this; + Anchor = XLDrawingAnchor.MoveAndSizeWithCells; + Style = new XLDrawingStyle(); + Int32 previousRowNumber = cell.Address.RowNumber; + Double previousRowOffset = 0; + + if (previousRowNumber > 1) + { + previousRowNumber--; + + if (cell.Worksheet.Internals.RowsCollection.TryGetValue(previousRowNumber, out XLRow previousRow)) + previousRowOffset = Math.Max(0, previousRow.Height - 7); + else + previousRowOffset = Math.Max(0, cell.Worksheet.RowHeight - 7); + } + + Position = new XLDrawingPosition + { + Column = cell.Address.ColumnNumber + 1, + ColumnOffset = 2, + Row = previousRowNumber, + RowOffset = previousRowOffset + }; + + ZOrder = cell.Worksheet.ZOrder++; + Style + .Margins.SetLeft(style.Margins.Left) + .Margins.SetRight(style.Margins.Right) + .Margins.SetTop(style.Margins.Top) + .Margins.SetBottom(style.Margins.Bottom) + .Margins.SetAutomatic(style.Margins.Automatic) + .Size.SetHeight(style.Size.Height) + .Size.SetWidth(style.Size.Width) + .ColorsAndLines.SetLineColor(style.ColorsAndLines.LineColor) + .ColorsAndLines.SetFillColor(style.ColorsAndLines.FillColor) + .ColorsAndLines.SetLineDash(style.ColorsAndLines.LineDash) + .ColorsAndLines.SetLineStyle(style.ColorsAndLines.LineStyle) + .ColorsAndLines.SetLineWeight(style.ColorsAndLines.LineWeight) + .ColorsAndLines.SetFillTransparency(style.ColorsAndLines.FillTransparency) + .ColorsAndLines.SetLineTransparency(style.ColorsAndLines.LineTransparency) + .Alignment.SetHorizontal(style.Alignment.Horizontal) + .Alignment.SetVertical(style.Alignment.Vertical) + .Alignment.SetDirection(style.Alignment.Direction) + .Alignment.SetOrientation(style.Alignment.Orientation) + .Alignment.SetAutomaticSize(style.Alignment.AutomaticSize) + .Properties.SetPositioning(style.Properties.Positioning) + .Protection.SetLocked(style.Protection.Locked) + .Protection.SetLockText(style.Protection.LockText); + + _cell = cell; + ShapeId = shapeId.Value; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMax.cs b/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMax.cs new file mode 100644 index 0000000..40217cd --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMax.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLCFColorScaleMax + { + void Maximum(XLCFContentType type, String value, XLColor color); + void Maximum(XLCFContentType type, Double value, XLColor color); + void HighestValue(XLColor color); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMid.cs b/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMid.cs new file mode 100644 index 0000000..95e5145 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMid.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLCFColorScaleMid + { + IXLCFColorScaleMax Midpoint(XLCFContentType type, String value, XLColor color); + IXLCFColorScaleMax Midpoint(XLCFContentType type, Double value, XLColor color); + void Maximum(XLCFContentType type, String value, XLColor color); + void Maximum(XLCFContentType type, Double value, XLColor color); + void HighestValue(XLColor color); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMin.cs b/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMin.cs new file mode 100644 index 0000000..7abc9ea --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMin.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public enum XLCFContentType { Number, Percent, Formula, Percentile, Minimum, Maximum } + public interface IXLCFColorScaleMin + { + IXLCFColorScaleMid Minimum(XLCFContentType type, String value, XLColor color); + IXLCFColorScaleMid Minimum(XLCFContentType type, Double value, XLColor color); + IXLCFColorScaleMid LowestValue(XLColor color); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMax.cs b/ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMax.cs new file mode 100644 index 0000000..05df66a --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMax.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLCFDataBarMax + { + void Maximum(XLCFContentType type, String value); + void Maximum(XLCFContentType type, Double value); + void HighestValue(); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMin.cs b/ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMin.cs new file mode 100644 index 0000000..cd1236f --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMin.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLCFDataBarMin + { + IXLCFDataBarMax Minimum(XLCFContentType type, String value); + IXLCFDataBarMax Minimum(XLCFContentType type, Double value); + IXLCFDataBarMax LowestValue(); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/IXLCFIconSet.cs b/ClosedXML/Excel/ConditionalFormats/IXLCFIconSet.cs new file mode 100644 index 0000000..e9f8073 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/IXLCFIconSet.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public enum XLCFIconSetOperator {GreaterThan, EqualOrGreaterThan} + public interface IXLCFIconSet + { + IXLCFIconSet AddValue(XLCFIconSetOperator setOperator, String value, XLCFContentType type); + IXLCFIconSet AddValue(XLCFIconSetOperator setOperator, Double value, XLCFContentType type); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs b/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs new file mode 100644 index 0000000..ba18bf4 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs @@ -0,0 +1,177 @@ +using System; + +namespace ClosedXML.Excel +{ + public enum XLTimePeriod + { + Yesterday, + Today, + Tomorrow, + InTheLast7Days, + LastWeek, + ThisWeek, + NextWeek, + LastMonth, + ThisMonth, + NextMonth + } + + public enum XLIconSetStyle + { + ThreeArrows, + ThreeArrowsGray, + ThreeFlags, + ThreeTrafficLights1, + ThreeTrafficLights2, + ThreeSigns, + ThreeSymbols, + ThreeSymbols2, + FourArrows, + FourArrowsGray, + FourRedToBlack, + FourRating, + FourTrafficLights, + FiveArrows, + FiveArrowsGray, + FiveRating, + FiveQuarters + } + + public enum XLConditionalFormatType + { + Expression, + CellIs, + ColorScale, + DataBar, + IconSet, + Top10, + IsUnique, + IsDuplicate, + ContainsText, + NotContainsText, + StartsWith, + EndsWith, + IsBlank, + NotBlank, + IsError, + NotError, + TimePeriod, + AboveAverage + } + + public enum XLCFOperator { Equal, NotEqual, GreaterThan, LessThan, EqualOrGreaterThan, EqualOrLessThan, Between, NotBetween, Contains, NotContains, StartsWith, EndsWith } + + public interface IXLConditionalFormat + { + IXLStyle Style { get; set; } + + IXLStyle WhenIsBlank(); + + IXLStyle WhenNotBlank(); + + IXLStyle WhenIsError(); + + IXLStyle WhenNotError(); + + IXLStyle WhenDateIs(XLTimePeriod timePeriod); + + IXLStyle WhenContains(String value); + + IXLStyle WhenNotContains(String value); + + IXLStyle WhenStartsWith(String value); + + IXLStyle WhenEndsWith(String value); + + IXLStyle WhenEquals(String value); + + IXLStyle WhenNotEquals(String value); + + IXLStyle WhenGreaterThan(String value); + + IXLStyle WhenLessThan(String value); + + IXLStyle WhenEqualOrGreaterThan(String value); + + IXLStyle WhenEqualOrLessThan(String value); + + IXLStyle WhenBetween(String minValue, String maxValue); + + IXLStyle WhenNotBetween(String minValue, String maxValue); + + IXLStyle WhenEquals(Double value); + + IXLStyle WhenNotEquals(Double value); + + IXLStyle WhenGreaterThan(Double value); + + IXLStyle WhenLessThan(Double value); + + IXLStyle WhenEqualOrGreaterThan(Double value); + + IXLStyle WhenEqualOrLessThan(Double value); + + IXLStyle WhenBetween(Double minValue, Double maxValue); + + IXLStyle WhenNotBetween(Double minValue, Double maxValue); + + IXLStyle WhenIsDuplicate(); + + IXLStyle WhenIsUnique(); + + IXLStyle WhenIsTrue(String formula); + + IXLStyle WhenIsTop(Int32 value, XLTopBottomType topBottomType = XLTopBottomType.Items); + + IXLStyle WhenIsBottom(Int32 value, XLTopBottomType topBottomType); + + IXLCFColorScaleMin ColorScale(); + + IXLCFDataBarMin DataBar(XLColor color, Boolean showBarOnly = false); + + IXLCFDataBarMin DataBar(XLColor positiveColor, XLColor negativeColor, Boolean showBarOnly = false); + + IXLCFIconSet IconSet(XLIconSetStyle iconSetStyle, Boolean reverseIconOrder = false, Boolean showIconOnly = false); + + XLConditionalFormatType ConditionalFormatType { get; } + + XLIconSetStyle IconSetStyle { get; } + + XLTimePeriod TimePeriod { get; } + + Boolean ReverseIconOrder { get; } + + Boolean ShowIconOnly { get; } + + Boolean ShowBarOnly { get; } + + Boolean StopIfTrue { get; } + + /// + /// The first of the . + /// + IXLRange Range { get; set; } + + IXLRanges Ranges { get; } + + XLDictionary Values { get; } + + XLDictionary Colors { get; } + + XLDictionary ContentTypes { get; } + + XLDictionary IconSetOperators { get; } + + XLCFOperator Operator { get; } + + Boolean Bottom { get; } + + Boolean Percent { get; } + + IXLConditionalFormat SetStopIfTrue(); + + IXLConditionalFormat SetStopIfTrue(Boolean value); + + IXLConditionalFormat CopyTo(IXLWorksheet targetSheet); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormats.cs b/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormats.cs new file mode 100644 index 0000000..cae5f8c --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormats.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLConditionalFormats : IEnumerable + { + void Add(IXLConditionalFormat conditionalFormat); + + void RemoveAll(); + + void Remove(Predicate predicate); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/IXLCFConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/IXLCFConverter.cs new file mode 100644 index 0000000..bfa1778 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/IXLCFConverter.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal interface IXLCFConverter + { + ConditionalFormattingRule Convert(IXLConditionalFormat cf, Int32 priority, XLWorkbook.SaveContext context); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/IXLCFConverterExtension.cs b/ClosedXML/Excel/ConditionalFormats/Save/IXLCFConverterExtension.cs new file mode 100644 index 0000000..82b11a0 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/IXLCFConverterExtension.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml.Office2010.Excel; + +namespace ClosedXML.Excel +{ + internal interface IXLCFConverterExtension + { + ConditionalFormattingRule Convert(IXLConditionalFormat cf, XLWorkbook.SaveContext context); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFBaseConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFBaseConverter.cs new file mode 100644 index 0000000..5461406 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFBaseConverter.cs @@ -0,0 +1,18 @@ +using ClosedXML.Utils; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal static class XLCFBaseConverter + { + public static ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority) + { + return new ConditionalFormattingRule + { + Type = cf.ConditionalFormatType.ToOpenXml(), + Priority = priority, + StopIfTrue = OpenXmlHelper.GetBooleanValue(cf.StopIfTrue, false) + }; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFCellIsConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFCellIsConverter.cs new file mode 100644 index 0000000..256eaef --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFCellIsConverter.cs @@ -0,0 +1,46 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using System; +using System.Globalization; + +namespace ClosedXML.Excel +{ + internal class XLCFCellIsConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + String val = GetQuoted(cf.Values[1]); + + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + var cfStyle = (cf.Style as XLStyle).Value; + if (!cfStyle.Equals(XLWorkbook.DefaultStyleValue)) + conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cfStyle]; + + conditionalFormattingRule.Operator = cf.Operator.ToOpenXml(); + + var formula = new Formula(val); + conditionalFormattingRule.Append(formula); + + if (cf.Operator == XLCFOperator.Between || cf.Operator == XLCFOperator.NotBetween) + { + var formula2 = new Formula { Text = GetQuoted(cf.Values[2]) }; + conditionalFormattingRule.Append(formula2); + } + + return conditionalFormattingRule; + } + + private String GetQuoted(XLFormula formula) + { + String value = formula.Value; + + if (formula.IsFormula || + value.StartsWith("\"") && value.EndsWith("\"") || + Double.TryParse(value, XLHelper.NumberStyle, XLHelper.ParseCulture, out double num)) + { + return value; + } + + return String.Format("\"{0}\"", value.Replace("\"", "\"\"")); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs new file mode 100644 index 0000000..b47906e --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs @@ -0,0 +1,51 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFColorScaleConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, Int32 priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + + var colorScale = new ColorScale(); + for (Int32 i = 1; i <= cf.ContentTypes.Count; i++) + { + var type = cf.ContentTypes[i].ToOpenXml(); + var val = cf.Values.TryGetValue(i, out XLFormula formula) ? formula?.Value : null; + + var conditionalFormatValueObject = new ConditionalFormatValueObject { Type = type }; + if (val != null) + conditionalFormatValueObject.Val = val; + + colorScale.Append(conditionalFormatValueObject); + } + + for (Int32 i = 1; i <= cf.Colors.Count; i++) + { + var xlColor = cf.Colors[i]; + var color = new Color(); + switch (xlColor.ColorType) + { + case XLColorType.Color: + color.Rgb = xlColor.Color.ToHex(); + break; + case XLColorType.Theme: + color.Theme = System.Convert.ToUInt32(xlColor.ThemeColor); + break; + + case XLColorType.Indexed: + color.Indexed = System.Convert.ToUInt32(xlColor.Indexed); + break; + } + + colorScale.Append(color); + } + + conditionalFormattingRule.Append(colorScale); + + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFContainsConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFContainsConverter.cs new file mode 100644 index 0000000..d4a43af --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFContainsConverter.cs @@ -0,0 +1,26 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFContainsConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + String val = cf.Values[1].Value; + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + var cfStyle = (cf.Style as XLStyle).Value; + if (!cfStyle.Equals(XLWorkbook.DefaultStyleValue)) + conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cfStyle]; + + conditionalFormattingRule.Operator = ConditionalFormattingOperatorValues.ContainsText; + conditionalFormattingRule.Text = val; + + var formula = new Formula { Text = "NOT(ISERROR(SEARCH(\"" + val + "\"," + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + ")))" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs new file mode 100644 index 0000000..c451c7c --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs @@ -0,0 +1,42 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLCFConverters + { + private static readonly Dictionary Converters; + static XLCFConverters() + { + Converters = new Dictionary + { + {XLConditionalFormatType.ColorScale, new XLCFColorScaleConverter()}, + {XLConditionalFormatType.StartsWith, new XLCFStartsWithConverter()}, + {XLConditionalFormatType.EndsWith, new XLCFEndsWithConverter()}, + {XLConditionalFormatType.IsBlank, new XLCFIsBlankConverter()}, + {XLConditionalFormatType.NotBlank, new XLCFNotBlankConverter()}, + {XLConditionalFormatType.IsError, new XLCFIsErrorConverter()}, + {XLConditionalFormatType.NotError, new XLCFNotErrorConverter()}, + {XLConditionalFormatType.ContainsText, new XLCFContainsConverter()}, + {XLConditionalFormatType.NotContainsText, new XLCFNotContainsConverter()}, + {XLConditionalFormatType.CellIs, new XLCFCellIsConverter()}, + {XLConditionalFormatType.IsUnique, new XLCFUniqueConverter()}, + {XLConditionalFormatType.IsDuplicate, new XLCFUniqueConverter()}, + {XLConditionalFormatType.Expression, new XLCFCellIsConverter()}, + {XLConditionalFormatType.Top10, new XLCFTopConverter()}, + {XLConditionalFormatType.DataBar, new XLCFDataBarConverter()}, + {XLConditionalFormatType.IconSet, new XLCFIconSetConverter()}, + {XLConditionalFormatType.TimePeriod, new XLCFDatesOccurringConverter()} + }; + } + + public static ConditionalFormattingRule Convert(IXLConditionalFormat conditionalFormat, Int32 priority, XLWorkbook.SaveContext context) + { + if (!Converters.TryGetValue(conditionalFormat.ConditionalFormatType, out var converter)) + throw new NotImplementedException(string.Format("Conditional formatting rule '{0}' hasn't been implemented", conditionalFormat.ConditionalFormatType)); + + return converter.Convert(conditionalFormat, priority, context); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFConvertersExtension.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFConvertersExtension.cs new file mode 100644 index 0000000..7b85951 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFConvertersExtension.cs @@ -0,0 +1,28 @@ +using DocumentFormat.OpenXml.Office2010.Excel; +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLCFConvertersExtension + { + private readonly static Dictionary Converters; + + static XLCFConvertersExtension() + { + XLCFConvertersExtension.Converters = new Dictionary() + { + { XLConditionalFormatType.DataBar, new XLCFDataBarConverterExtension() } + }; + } + + public XLCFConvertersExtension() + { + } + + public static ConditionalFormattingRule Convert(IXLConditionalFormat conditionalFormat, XLWorkbook.SaveContext context) + { + return XLCFConvertersExtension.Converters[conditionalFormat.ConditionalFormatType].Convert(conditionalFormat, context); + } + } +} \ No newline at end of file diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs new file mode 100644 index 0000000..91919a9 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs @@ -0,0 +1,82 @@ +using ClosedXML.Extensions; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Spreadsheet; +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFDataBarConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, Int32 priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + + var dataBar = new DataBar { ShowValue = !cf.ShowBarOnly }; + + var conditionalFormatValueObject1 = GetConditionalFormatValueObjectByIndex(cf, 1, ConditionalFormatValueObjectValues.Min); + var conditionalFormatValueObject2 = GetConditionalFormatValueObjectByIndex(cf, 2, ConditionalFormatValueObjectValues.Max); + + var color = new Color(); + switch (cf.Colors[1].ColorType) + { + case XLColorType.Color: + color.Rgb = cf.Colors[1].Color.ToHex(); + break; + + case XLColorType.Theme: + color.Theme = System.Convert.ToUInt32(cf.Colors[1].ThemeColor); + break; + + case XLColorType.Indexed: + color.Indexed = System.Convert.ToUInt32(cf.Colors[1].Indexed); + break; + } + + dataBar.Append(conditionalFormatValueObject1); + dataBar.Append(conditionalFormatValueObject2); + dataBar.Append(color); + + conditionalFormattingRule.Append(dataBar); + + var conditionalFormattingRuleExtensionList = new ConditionalFormattingRuleExtensionList(); + conditionalFormattingRuleExtensionList.Append(BuildRuleExtension(cf)); + conditionalFormattingRule.Append(conditionalFormattingRuleExtensionList); + + return conditionalFormattingRule; + } + + private ConditionalFormattingRuleExtension BuildRuleExtension(IXLConditionalFormat cf) + { + var conditionalFormattingRuleExtension = new ConditionalFormattingRuleExtension { Uri = "{B025F937-C7B1-47D3-B67F-A62EFF666E3E}" }; + conditionalFormattingRuleExtension.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); + var id = new DocumentFormat.OpenXml.Office2010.Excel.Id + { + Text = (cf as XLConditionalFormat).Id.WrapInBraces() + }; + conditionalFormattingRuleExtension.Append(id); + + return conditionalFormattingRuleExtension; + } + + private ConditionalFormatValueObject GetConditionalFormatValueObjectByIndex(IXLConditionalFormat cf, int index, ConditionalFormatValueObjectValues defaultType) + { + var conditionalFormatValueObject = new ConditionalFormatValueObject(); + + if (cf.ContentTypes.TryGetValue(index, out var contentType)) + { + conditionalFormatValueObject.Type = contentType.ToOpenXml(); + } + else + { + conditionalFormatValueObject.Type = defaultType; + } + + if (cf.Values.TryGetValue(index, out var value1) && value1?.Value != null) + { + conditionalFormatValueObject.Val = value1.Value; + } + + return conditionalFormatValueObject; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverterExtension.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverterExtension.cs new file mode 100644 index 0000000..8c24428 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverterExtension.cs @@ -0,0 +1,91 @@ +using ClosedXML.Extensions; +using DocumentFormat.OpenXml.Office.Excel; +using DocumentFormat.OpenXml.Office2010.Excel; +using System; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLCFDataBarConverterExtension : IXLCFConverterExtension + { + public XLCFDataBarConverterExtension() + { + } + + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, XLWorkbook.SaveContext context) + { + ConditionalFormattingRule conditionalFormattingRule = new ConditionalFormattingRule() + { + Type = DocumentFormat.OpenXml.Spreadsheet.ConditionalFormatValues.DataBar, + Id = (cf as XLConditionalFormat).Id.WrapInBraces() + }; + + DataBar dataBar = new DataBar() + { + MinLength = 0, + MaxLength = 100, + Gradient = true, + ShowValue = !cf.ShowBarOnly + }; + + var cfMinType = cf.ContentTypes.TryGetValue(1, out var contentType1) + ? Convert(contentType1.ToOpenXml()) + : ConditionalFormattingValueObjectTypeValues.AutoMin; + var cfMin = new ConditionalFormattingValueObject { Type = cfMinType }; + if (cf.Values.Any() && cf.Values[1]?.Value != null) + { + cfMin.Type = ConditionalFormattingValueObjectTypeValues.Numeric; + cfMin.Append(new Formula() { Text = cf.Values[1].Value }); + } + + var cfMaxType = cf.ContentTypes.TryGetValue(2, out var contentType2) + ? Convert(contentType2.ToOpenXml()) + : ConditionalFormattingValueObjectTypeValues.AutoMax; + var cfMax = new ConditionalFormattingValueObject { Type = cfMaxType }; + if (cf.Values.Count >= 2 && cf.Values[2]?.Value != null) + { + cfMax.Type = ConditionalFormattingValueObjectTypeValues.Numeric; + cfMax.Append(new Formula() { Text = cf.Values[2].Value }); + } + + var barAxisColor = new BarAxisColor { Rgb = XLColor.Black.Color.ToHex() }; + + var negativeFillColor = new NegativeFillColor { Rgb = cf.Colors[1].Color.ToHex() }; + if (cf.Colors.Count == 2) + { + negativeFillColor = new NegativeFillColor { Rgb = cf.Colors[2].Color.ToHex() }; + } + + dataBar.Append(cfMin); + dataBar.Append(cfMax); + + dataBar.Append(negativeFillColor); + dataBar.Append(barAxisColor); + + conditionalFormattingRule.Append(dataBar); + + return conditionalFormattingRule; + } + + private ConditionalFormattingValueObjectTypeValues Convert(DocumentFormat.OpenXml.Spreadsheet.ConditionalFormatValueObjectValues obj) + { + switch (obj) + { + case DocumentFormat.OpenXml.Spreadsheet.ConditionalFormatValueObjectValues.Max: + return ConditionalFormattingValueObjectTypeValues.AutoMax; + case DocumentFormat.OpenXml.Spreadsheet.ConditionalFormatValueObjectValues.Min: + return ConditionalFormattingValueObjectTypeValues.AutoMin; + case DocumentFormat.OpenXml.Spreadsheet.ConditionalFormatValueObjectValues.Number: + return ConditionalFormattingValueObjectTypeValues.Numeric; + case DocumentFormat.OpenXml.Spreadsheet.ConditionalFormatValueObjectValues.Percent: + return ConditionalFormattingValueObjectTypeValues.Percent; + case DocumentFormat.OpenXml.Spreadsheet.ConditionalFormatValueObjectValues.Percentile: + return ConditionalFormattingValueObjectTypeValues.Percentile; + case DocumentFormat.OpenXml.Spreadsheet.ConditionalFormatValueObjectValues.Formula: + return ConditionalFormattingValueObjectTypeValues.Formula; + default: + throw new NotImplementedException(); + } + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFDatesOccuringConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFDatesOccuringConverter.cs new file mode 100644 index 0000000..e71d3c4 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFDatesOccuringConverter.cs @@ -0,0 +1,40 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLCFDatesOccurringConverter : IXLCFConverter + { + private static readonly IDictionary formulaTemplates = new Dictionary() + { + [XLTimePeriod.Today] = "FLOOR({0},1)=TODAY()", + [XLTimePeriod.Yesterday] = "FLOOR({0},1)=TODAY()-1", + [XLTimePeriod.Tomorrow] = "FLOOR({0},1)=TODAY()+1", + [XLTimePeriod.InTheLast7Days] = "AND(TODAY()-FLOOR({0},1)<=6,FLOOR({0},1)<=TODAY())", + [XLTimePeriod.ThisMonth] = "AND(MONTH({0})=MONTH(TODAY()),YEAR({0})=YEAR(TODAY()))", + [XLTimePeriod.LastMonth] = "AND(MONTH({0})=MONTH(EDATE(TODAY(),0-1)),YEAR({0})=YEAR(EDATE(TODAY(),0-1)))", + [XLTimePeriod.NextMonth] = "AND(MONTH({0})=MONTH(EDATE(TODAY(),0+1)),YEAR({0})=YEAR(EDATE(TODAY(),0+1)))", + [XLTimePeriod.ThisWeek] = "AND(TODAY()-ROUNDDOWN({0},0)<=WEEKDAY(TODAY())-1,ROUNDDOWN({0},0)-TODAY()<=7-WEEKDAY(TODAY()))", + [XLTimePeriod.LastWeek] = "AND(TODAY()-ROUNDDOWN({0},0)<=WEEKDAY(TODAY())-1,ROUNDDOWN({0},0)-TODAY()<=7-WEEKDAY(TODAY()))", + [XLTimePeriod.NextWeek] = "AND(ROUNDDOWN({0},0)-TODAY()>(7-WEEKDAY(TODAY())),ROUNDDOWN({0},0)-TODAY()<(15-WEEKDAY(TODAY())))" + }; + + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + var cfStyle = (cf.Style as XLStyle).Value; + if (!cfStyle.Equals(XLWorkbook.DefaultStyleValue)) + conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cfStyle]; + + conditionalFormattingRule.TimePeriod = cf.TimePeriod.ToOpenXml(); + + var address = cf.Range.RangeAddress.FirstAddress.ToStringRelative(false); + var formula = new Formula { Text = String.Format(formulaTemplates[cf.TimePeriod], address) }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFEndsWithConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFEndsWithConverter.cs new file mode 100644 index 0000000..df10a31 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFEndsWithConverter.cs @@ -0,0 +1,28 @@ +using System; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFEndsWithConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + String val = cf.Values[1].Value; + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + var cfStyle = (cf.Style as XLStyle).Value; + if (!cfStyle.Equals(XLWorkbook.DefaultStyleValue)) + conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cfStyle]; + + conditionalFormattingRule.Operator = ConditionalFormattingOperatorValues.EndsWith; + conditionalFormattingRule.Text = val; + + var formula = new Formula { Text = "RIGHT(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "," + val.Length.ToString() + ")=\"" + val + "\"" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + + + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFIconSetConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIconSetConverter.cs new file mode 100644 index 0000000..722465d --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIconSetConverter.cs @@ -0,0 +1,24 @@ +using System; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFIconSetConverter:IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, Int32 priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + + var iconSet = new IconSet {ShowValue = !cf.ShowIconOnly, Reverse = cf.ReverseIconOrder, IconSetValue = cf.IconSetStyle.ToOpenXml()}; + Int32 count = cf.Values.Count; + for(Int32 i=1;i<= count; i++ ) + { + var conditionalFormatValueObject = new ConditionalFormatValueObject { Type = cf.ContentTypes[i].ToOpenXml(), Val = cf.Values[i].Value, GreaterThanOrEqual = cf.IconSetOperators[i] == XLCFIconSetOperator.EqualOrGreaterThan}; + iconSet.Append(conditionalFormatValueObject); + + } + conditionalFormattingRule.Append(iconSet); + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsBlankConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsBlankConverter.cs new file mode 100644 index 0000000..8571b7f --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsBlankConverter.cs @@ -0,0 +1,22 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFIsBlankConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + var cfStyle = (cf.Style as XLStyle).Value; + if (!cfStyle.Equals(XLWorkbook.DefaultStyleValue)) + conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cfStyle]; + + var formula = new Formula { Text = "LEN(TRIM(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))=0" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsErrorConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsErrorConverter.cs new file mode 100644 index 0000000..b98be05 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsErrorConverter.cs @@ -0,0 +1,22 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFIsErrorConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + var cfStyle = (cf.Style as XLStyle).Value; + if (!cfStyle.Equals(XLWorkbook.DefaultStyleValue)) + conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cfStyle]; + + var formula = new Formula { Text = "ISERROR(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + ")" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotBlankConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotBlankConverter.cs new file mode 100644 index 0000000..d6b6041 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotBlankConverter.cs @@ -0,0 +1,22 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFNotBlankConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + var cfStyle = (cf.Style as XLStyle).Value; + if (!cfStyle.Equals(XLWorkbook.DefaultStyleValue)) + conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cfStyle]; + + var formula = new Formula { Text = "LEN(TRIM(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))>0" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotContainsConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotContainsConverter.cs new file mode 100644 index 0000000..94d310a --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotContainsConverter.cs @@ -0,0 +1,26 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFNotContainsConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + String val = cf.Values[1].Value; + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + var cfStyle = (cf.Style as XLStyle).Value; + if (!cfStyle.Equals(XLWorkbook.DefaultStyleValue)) + conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cfStyle]; + + conditionalFormattingRule.Operator = ConditionalFormattingOperatorValues.NotContains; + conditionalFormattingRule.Text = val; + + var formula = new Formula { Text = "ISERROR(SEARCH(\"" + val + "\"," + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotErrorConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotErrorConverter.cs new file mode 100644 index 0000000..e09299d --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotErrorConverter.cs @@ -0,0 +1,22 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFNotErrorConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + var cfStyle = (cf.Style as XLStyle).Value; + if (!cfStyle.Equals(XLWorkbook.DefaultStyleValue)) + conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cfStyle]; + + var formula = new Formula { Text = "NOT(ISERROR(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFStartsWithConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFStartsWithConverter.cs new file mode 100644 index 0000000..1b5d124 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFStartsWithConverter.cs @@ -0,0 +1,26 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFStartsWithConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + String val = cf.Values[1].Value; + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + var cfStyle = (cf.Style as XLStyle).Value; + if (!cfStyle.Equals(XLWorkbook.DefaultStyleValue)) + conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cfStyle]; + + conditionalFormattingRule.Operator = ConditionalFormattingOperatorValues.BeginsWith; + conditionalFormattingRule.Text = val; + + var formula = new Formula { Text = "LEFT(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "," + val.Length.ToString() + ")=\"" + val + "\"" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFTopConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFTopConverter.cs new file mode 100644 index 0000000..4870315 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFTopConverter.cs @@ -0,0 +1,22 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFTopConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + UInt32 val = UInt32.Parse(cf.Values[1].Value); + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + var cfStyle = (cf.Style as XLStyle).Value; + if (!cfStyle.Equals(XLWorkbook.DefaultStyleValue)) + conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cfStyle]; + + conditionalFormattingRule.Percent = cf.Percent; + conditionalFormattingRule.Rank = val; + conditionalFormattingRule.Bottom = cf.Bottom; + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFUniqueConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFUniqueConverter.cs new file mode 100644 index 0000000..fddc065 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFUniqueConverter.cs @@ -0,0 +1,18 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFUniqueConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = XLCFBaseConverter.Convert(cf, priority); + var cfStyle = (cf.Style as XLStyle).Value; + if (!cfStyle.Equals(XLWorkbook.DefaultStyleValue)) + conditionalFormattingRule.FormatId = (UInt32)context.DifferentialFormats[cfStyle]; + + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMax.cs b/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMax.cs new file mode 100644 index 0000000..8d4cd00 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMax.cs @@ -0,0 +1,30 @@ +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFColorScaleMax : IXLCFColorScaleMax + { + private readonly XLConditionalFormat _conditionalFormat; + public XLCFColorScaleMax(XLConditionalFormat conditionalFormat) + { + _conditionalFormat = conditionalFormat; + } + + public void Maximum(XLCFContentType type, String value, XLColor color) + { + _conditionalFormat.Values.Add(new XLFormula { Value = value }); + _conditionalFormat.Colors.Add(color); + _conditionalFormat.ContentTypes.Add(type); + } + public void Maximum(XLCFContentType type, Double value, XLColor color) + { + Maximum(type, value.ToInvariantString(), color); + } + public void HighestValue(XLColor color) + { + _conditionalFormat.Values.Add(null); + _conditionalFormat.Colors.Add(color); + _conditionalFormat.ContentTypes.Add(XLCFContentType.Maximum); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMid.cs b/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMid.cs new file mode 100644 index 0000000..222649e --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMid.cs @@ -0,0 +1,38 @@ +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFColorScaleMid : IXLCFColorScaleMid + { + private readonly XLConditionalFormat _conditionalFormat; + public XLCFColorScaleMid(XLConditionalFormat conditionalFormat) + { + _conditionalFormat = conditionalFormat; + } + public IXLCFColorScaleMax Midpoint(XLCFContentType type, String value, XLColor color) + { + _conditionalFormat.Values.Add(new XLFormula { Value = value }); + _conditionalFormat.Colors.Add(color); + _conditionalFormat.ContentTypes.Add(type); + return new XLCFColorScaleMax(_conditionalFormat); + } + public IXLCFColorScaleMax Midpoint(XLCFContentType type, Double value, XLColor color) + { + return Midpoint(type, value.ToInvariantString(), color); + } + public void Maximum(XLCFContentType type, String value, XLColor color) + { + Midpoint(type, value, color); + } + public void Maximum(XLCFContentType type, Double value, XLColor color) + { + Maximum(type, value.ToInvariantString(), color); + } + public void HighestValue(XLColor color) + { + _conditionalFormat.Values.Initialize(null); + _conditionalFormat.Colors.Add(color); + _conditionalFormat.ContentTypes.Add(XLCFContentType.Maximum); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMin.cs b/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMin.cs new file mode 100644 index 0000000..35c9a78 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMin.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLCFColorScaleMin : IXLCFColorScaleMin + { + private readonly XLConditionalFormat _conditionalFormat; + public XLCFColorScaleMin(XLConditionalFormat conditionalFormat) + { + _conditionalFormat = conditionalFormat; + } + + public IXLCFColorScaleMid Minimum(XLCFContentType type, String value, XLColor color) + { + _conditionalFormat.Values.Initialize(new XLFormula { Value = value }); + _conditionalFormat.Colors.Initialize(color); + _conditionalFormat.ContentTypes.Initialize(type); + return new XLCFColorScaleMid(_conditionalFormat); + } + public IXLCFColorScaleMid Minimum(XLCFContentType type, Double value, XLColor color) + { + return Minimum(type, value.ToInvariantString(), color); + } + + public IXLCFColorScaleMid LowestValue(XLColor color) + { + _conditionalFormat.Values.Initialize(null); + _conditionalFormat.Colors.Initialize(color); + _conditionalFormat.ContentTypes.Initialize(XLCFContentType.Minimum); + return new XLCFColorScaleMid(_conditionalFormat); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/XLCFDataBarMax.cs b/ClosedXML/Excel/ConditionalFormats/XLCFDataBarMax.cs new file mode 100644 index 0000000..50658ac --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/XLCFDataBarMax.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLCFDataBarMax : IXLCFDataBarMax + { + private readonly XLConditionalFormat _conditionalFormat; + public XLCFDataBarMax(XLConditionalFormat conditionalFormat) + { + _conditionalFormat = conditionalFormat; + } + + public void Maximum(XLCFContentType type, String value) + { + _conditionalFormat.ContentTypes.Add(type); + _conditionalFormat.Values.Add(new XLFormula { Value = value }); + } + public void Maximum(XLCFContentType type, Double value) + { + Maximum(type, value.ToInvariantString()); + } + + public void HighestValue() + { + Maximum(XLCFContentType.Maximum, "0"); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/XLCFDataBarMin.cs b/ClosedXML/Excel/ConditionalFormats/XLCFDataBarMin.cs new file mode 100644 index 0000000..b6803dc --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/XLCFDataBarMin.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLCFDataBarMin : IXLCFDataBarMin + { + private readonly XLConditionalFormat _conditionalFormat; + public XLCFDataBarMin(XLConditionalFormat conditionalFormat) + { + _conditionalFormat = conditionalFormat; + } + + public IXLCFDataBarMax Minimum(XLCFContentType type, String value) + { + _conditionalFormat.ContentTypes.Initialize(type); + _conditionalFormat.Values.Initialize(new XLFormula { Value = value }); + return new XLCFDataBarMax(_conditionalFormat); + } + public IXLCFDataBarMax Minimum(XLCFContentType type, Double value) + { + return Minimum(type, value.ToInvariantString()); + } + + public IXLCFDataBarMax LowestValue() + { + return Minimum(XLCFContentType.Minimum, "0"); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/XLCFIconSet.cs b/ClosedXML/Excel/ConditionalFormats/XLCFIconSet.cs new file mode 100644 index 0000000..2c88ea5 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/XLCFIconSet.cs @@ -0,0 +1,24 @@ +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFIconSet : IXLCFIconSet + { + private readonly XLConditionalFormat _conditionalFormat; + public XLCFIconSet(XLConditionalFormat conditionalFormat) + { + _conditionalFormat = conditionalFormat; + } + public IXLCFIconSet AddValue(XLCFIconSetOperator setOperator, String value, XLCFContentType type) + { + _conditionalFormat.IconSetOperators.Add(setOperator); + _conditionalFormat.Values.Add(new XLFormula { Value = value }); + _conditionalFormat.ContentTypes.Add(type); + return new XLCFIconSet(_conditionalFormat); + } + public IXLCFIconSet AddValue(XLCFIconSetOperator setOperator, Double value, XLCFContentType type) + { + return AddValue(setOperator, value.ToInvariantString(), type); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs b/ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs new file mode 100644 index 0000000..7012825 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs @@ -0,0 +1,600 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLConditionalFormat : XLStylizedBase, IXLConditionalFormat, IXLStylized + { + private sealed class FullEqualityComparer : IEqualityComparer + { + private readonly bool _compareRange; + private readonly DictionaryComparer _colorsComparer = new DictionaryComparer(); + private readonly EnumerableComparer _listComparer = new EnumerableComparer(); + private readonly DictionaryComparer _contentsTypeComparer = new DictionaryComparer(); + private readonly DictionaryComparer _iconSetTypeComparer = new DictionaryComparer(); + + public FullEqualityComparer(bool compareRange) + { + _compareRange = compareRange; + } + + public bool Equals(IXLConditionalFormat x, IXLConditionalFormat y) + { + var xx = (XLConditionalFormat)x; + var yy = (XLConditionalFormat)y; + if (ReferenceEquals(xx, yy)) return true; + if (ReferenceEquals(xx, null)) return false; + if (ReferenceEquals(yy, null)) return false; + if (xx.GetType() != yy.GetType()) return false; + + var xxValues = xx.Values.Values.Where(v => v == null || !v.IsFormula).Select(v => v?.Value); + var yyValues = yy.Values.Values.Where(v => v == null || !v.IsFormula).Select(v => v?.Value); + var xxFormulas = x.Ranges.Count > 0 ? xx.Values.Values.Where(v => v != null && v.IsFormula).Select(f => ((XLCell)x.Ranges.First().FirstCell()).GetFormulaR1C1(f.Value)) : null; + var yyFormulas = y.Ranges.Count > 0 ? yy.Values.Values.Where(v => v != null && v.IsFormula).Select(f => ((XLCell)y.Ranges.First().FirstCell()).GetFormulaR1C1(f.Value)) : null; + + var xStyle = xx.StyleValue; + var yStyle = yy.StyleValue; + + return Equals(xStyle, yStyle) + && xx.CopyDefaultModify == yy.CopyDefaultModify + && xx.ConditionalFormatType == yy.ConditionalFormatType + && xx.TimePeriod == yy.TimePeriod + && xx.IconSetStyle == yy.IconSetStyle + && xx.Operator == yy.Operator + && xx.Bottom == yy.Bottom + && xx.Percent == yy.Percent + && xx.ReverseIconOrder == yy.ReverseIconOrder + && xx.StopIfTrue == yy.StopIfTrue + && xx.ShowIconOnly == yy.ShowIconOnly + && xx.ShowBarOnly == yy.ShowBarOnly + && _listComparer.Equals(xxValues, yyValues) + && _listComparer.Equals(xxFormulas, yyFormulas) + && _colorsComparer.Equals(xx.Colors, yy.Colors) + && _contentsTypeComparer.Equals(xx.ContentTypes, yy.ContentTypes) + && _iconSetTypeComparer.Equals(xx.IconSetOperators, yy.IconSetOperators) + && (!_compareRange || XLRanges.Equals(xx.Ranges, yy.Ranges)); + } + + public int GetHashCode(IXLConditionalFormat obj) + { + var xx = (XLConditionalFormat)obj; + var xStyle = (obj.Style as XLStyle).Value; + var xValues = xx.Values.Values.Where(v => !v.IsFormula).Select(v => v.Value); + if (obj.Ranges.Count > 0) + xValues = xValues + .Union(xx.Values.Values.Where(v => v.IsFormula).Select(f => ((XLCell)obj.Ranges.First().FirstCell()).GetFormulaR1C1(f.Value))); + + unchecked + { + var hashCode = xStyle.GetHashCode(); + hashCode = (hashCode * 397) ^ xx.StyleValue.GetHashCode(); + hashCode = (hashCode * 397) ^ xx.CopyDefaultModify.GetHashCode(); + hashCode = (hashCode * 397) ^ xValues.GetHashCode(); + hashCode = (hashCode * 397) ^ (xx.Colors != null ? xx.Colors.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ (xx.ContentTypes != null ? xx.ContentTypes.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ (xx.IconSetOperators != null ? xx.IconSetOperators.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ (_compareRange && xx.Ranges != null ? xx.Ranges.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ (int)xx.ConditionalFormatType; + hashCode = (hashCode * 397) ^ (int)xx.TimePeriod; + hashCode = (hashCode * 397) ^ (int)xx.IconSetStyle; + hashCode = (hashCode * 397) ^ (int)xx.Operator; + hashCode = (hashCode * 397) ^ xx.Bottom.GetHashCode(); + hashCode = (hashCode * 397) ^ xx.Percent.GetHashCode(); + hashCode = (hashCode * 397) ^ xx.ReverseIconOrder.GetHashCode(); + hashCode = (hashCode * 397) ^ xx.ShowIconOnly.GetHashCode(); + hashCode = (hashCode * 397) ^ xx.ShowBarOnly.GetHashCode(); + hashCode = (hashCode * 397) ^ xx.StopIfTrue.GetHashCode(); + return hashCode; + } + } + } + + internal void AdjustFormulas(XLCell baseCell, XLCell targetCell) + { + var keys = Values.Keys.ToList(); + foreach (var key in keys) + { + if (Values[key] == null || !Values[key].IsFormula) + continue; + + var r1c1 = baseCell.GetFormulaR1C1(Values[key].Value); + Values[key] = new XLFormula { _value = targetCell.GetFormulaA1(r1c1), IsFormula = true }; + } + } + + private static readonly IEqualityComparer FullComparerInstance = new FullEqualityComparer(true); + + public static IEqualityComparer FullComparer + { + get { return FullComparerInstance; } + } + + private static readonly IEqualityComparer NoRangeComparerInstance = new FullEqualityComparer(false); + + public static IEqualityComparer NoRangeComparer + { + get { return NoRangeComparerInstance; } + } + + #region Constructors + + private XLConditionalFormat(XLStyleValue style) + : base(XLStyle.Default.Value) + { + Id = Guid.NewGuid(); + Ranges = new XLRanges(); + Values = new XLDictionary(); + Colors = new XLDictionary(); + ContentTypes = new XLDictionary(); + IconSetOperators = new XLDictionary(); + } + + public XLConditionalFormat(XLRange range, Boolean copyDefaultModify = false) + : this(XLStyle.Default.Value) + { + if (range != null) + Ranges.Add(range); + CopyDefaultModify = copyDefaultModify; + } + + public XLConditionalFormat(IEnumerable ranges, Boolean copyDefaultModify = false) + : this(XLStyle.Default.Value) + { + ranges?.ForEach(range => Ranges.Add(range)); + CopyDefaultModify = copyDefaultModify; + } + + public XLConditionalFormat(XLConditionalFormat conditionalFormat, IXLRange targetRange) + : this(conditionalFormat, new[] { targetRange }) + { + } + + public XLConditionalFormat(XLConditionalFormat conditionalFormat, IEnumerable targetRanges) + : this(conditionalFormat.StyleValue) + { + targetRanges?.ForEach(range => Ranges.Add(range)); + CopyFrom(conditionalFormat); + } + + #endregion Constructors + + public Guid Id { get; internal set; } + + internal Int32 OriginalPriority { get; set; } + + public Boolean CopyDefaultModify { get; set; } + + public override IEnumerable Styles + { + get + { + yield return Style; + } + } + + protected override IEnumerable Children + { + get { yield break; } + } + + public override IXLRanges RangesUsed + { + get { return new XLRanges(); } + } + + public XLDictionary Values { get; private set; } + + public XLDictionary Colors { get; private set; } + + public XLDictionary ContentTypes { get; private set; } + + public XLDictionary IconSetOperators { get; private set; } + + public IXLRange Range + { + get { return Ranges.FirstOrDefault(); } + set + { + Ranges.RemoveAll(); + Ranges.Add(value); + } + } + + public IXLRanges Ranges { get; private set; } + + public XLConditionalFormatType ConditionalFormatType { get; set; } + + public XLTimePeriod TimePeriod { get; set; } + + public XLIconSetStyle IconSetStyle { get; set; } + + public XLCFOperator Operator { get; set; } + + public Boolean Bottom { get; set; } + + public Boolean Percent { get; set; } + + public Boolean ReverseIconOrder { get; set; } + + public Boolean ShowIconOnly { get; set; } + + public Boolean ShowBarOnly { get; set; } + + public Boolean StopIfTrue { get; set; } + + public IXLConditionalFormat SetStopIfTrue() + { + return SetStopIfTrue(true); + } + + public IXLConditionalFormat SetStopIfTrue(bool value) + { + this.StopIfTrue = value; + return this; + } + + public IXLConditionalFormat CopyTo(IXLWorksheet targetSheet) + { + if (targetSheet == Range?.Worksheet) + throw new InvalidOperationException("Cannot copy conditional format to the worksheet it already belongs to."); + var targetRanges = Ranges.Select(r => targetSheet.Range(((XLRangeAddress)r.RangeAddress).WithoutWorksheet())); + var newCf = new XLConditionalFormat(this, targetRanges); + targetSheet.ConditionalFormats.Add(newCf); + return newCf; + } + + public void CopyFrom(IXLConditionalFormat other) + { + InnerStyle = other.Style; + ConditionalFormatType = other.ConditionalFormatType; + TimePeriod = other.TimePeriod; + IconSetStyle = other.IconSetStyle; + Operator = other.Operator; + Bottom = other.Bottom; + Percent = other.Percent; + ReverseIconOrder = other.ReverseIconOrder; + ShowIconOnly = other.ShowIconOnly; + ShowBarOnly = other.ShowBarOnly; + StopIfTrue = other.StopIfTrue; + + Values.Clear(); + other.Values.ForEach(kp => Values.Add(kp.Key, new XLFormula(kp.Value))); + //CopyDictionary(Values, other.Values); + CopyDictionary(Colors, other.Colors); + CopyDictionary(ContentTypes, other.ContentTypes); + CopyDictionary(IconSetOperators, other.IconSetOperators); + } + + private void CopyDictionary(XLDictionary target, XLDictionary source) + { + target.Clear(); + source.ForEach(kp => target.Add(kp.Key, kp.Value)); + } + + public IXLStyle WhenIsBlank() + { + ConditionalFormatType = XLConditionalFormatType.IsBlank; + return Style; + } + + public IXLStyle WhenNotBlank() + { + ConditionalFormatType = XLConditionalFormatType.NotBlank; + return Style; + } + + public IXLStyle WhenIsError() + { + ConditionalFormatType = XLConditionalFormatType.IsError; + return Style; + } + + public IXLStyle WhenNotError() + { + ConditionalFormatType = XLConditionalFormatType.NotError; + return Style; + } + + public IXLStyle WhenDateIs(XLTimePeriod timePeriod) + { + TimePeriod = timePeriod; + ConditionalFormatType = XLConditionalFormatType.TimePeriod; + return Style; + } + + public IXLStyle WhenContains(String value) + { + Values.Initialize(new XLFormula { Value = value }); + ConditionalFormatType = XLConditionalFormatType.ContainsText; + Operator = XLCFOperator.Contains; + return Style; + } + + public IXLStyle WhenNotContains(String value) + { + Values.Initialize(new XLFormula { Value = value }); + ConditionalFormatType = XLConditionalFormatType.NotContainsText; + Operator = XLCFOperator.NotContains; + return Style; + } + + public IXLStyle WhenStartsWith(String value) + { + Values.Initialize(new XLFormula { Value = value }); + ConditionalFormatType = XLConditionalFormatType.StartsWith; + Operator = XLCFOperator.StartsWith; + return Style; + } + + public IXLStyle WhenEndsWith(String value) + { + Values.Initialize(new XLFormula { Value = value }); + ConditionalFormatType = XLConditionalFormatType.EndsWith; + Operator = XLCFOperator.EndsWith; + return Style; + } + + public IXLStyle WhenEquals(String value) + { + Values.Initialize(new XLFormula { Value = value }); + Operator = XLCFOperator.Equal; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenNotEquals(String value) + { + Values.Initialize(new XLFormula { Value = value }); + Operator = XLCFOperator.NotEqual; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenGreaterThan(String value) + { + Values.Initialize(new XLFormula { Value = value }); + Operator = XLCFOperator.GreaterThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenLessThan(String value) + { + Values.Initialize(new XLFormula { Value = value }); + Operator = XLCFOperator.LessThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenEqualOrGreaterThan(String value) + { + Values.Initialize(new XLFormula { Value = value }); + Operator = XLCFOperator.EqualOrGreaterThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenEqualOrLessThan(String value) + { + Values.Initialize(new XLFormula { Value = value }); + Operator = XLCFOperator.EqualOrLessThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenBetween(String minValue, String maxValue) + { + Values.Initialize(new XLFormula { Value = minValue }); + Values.Add(new XLFormula { Value = maxValue }); + Operator = XLCFOperator.Between; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenNotBetween(String minValue, String maxValue) + { + Values.Initialize(new XLFormula { Value = minValue }); + Values.Add(new XLFormula { Value = maxValue }); + Operator = XLCFOperator.NotBetween; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenEquals(Double value) + { + Values.Initialize(new XLFormula(value)); + Operator = XLCFOperator.Equal; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenNotEquals(Double value) + { + Values.Initialize(new XLFormula(value)); + Operator = XLCFOperator.NotEqual; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenGreaterThan(Double value) + { + Values.Initialize(new XLFormula(value)); + Operator = XLCFOperator.GreaterThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenLessThan(Double value) + { + Values.Initialize(new XLFormula(value)); + Operator = XLCFOperator.LessThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenEqualOrGreaterThan(Double value) + { + Values.Initialize(new XLFormula(value)); + Operator = XLCFOperator.EqualOrGreaterThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenEqualOrLessThan(Double value) + { + Values.Initialize(new XLFormula(value)); + Operator = XLCFOperator.EqualOrLessThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenBetween(Double minValue, Double maxValue) + { + Values.Initialize(new XLFormula(minValue)); + Values.Add(new XLFormula(maxValue)); + Operator = XLCFOperator.Between; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenNotBetween(Double minValue, Double maxValue) + { + Values.Initialize(new XLFormula(minValue)); + Values.Add(new XLFormula(maxValue)); + Operator = XLCFOperator.NotBetween; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenIsDuplicate() + { + ConditionalFormatType = XLConditionalFormatType.IsDuplicate; + return Style; + } + + public IXLStyle WhenIsUnique() + { + ConditionalFormatType = XLConditionalFormatType.IsUnique; + return Style; + } + + public IXLStyle WhenIsTrue(String formula) + { + String f = formula.TrimStart()[0] == '=' ? formula : "=" + formula; + Values.Initialize(new XLFormula { Value = f }); + ConditionalFormatType = XLConditionalFormatType.Expression; + return Style; + } + + public IXLStyle WhenIsTop(Int32 value, XLTopBottomType topBottomType = XLTopBottomType.Items) + { + Values.Initialize(new XLFormula(value)); + Percent = topBottomType == XLTopBottomType.Percent; + ConditionalFormatType = XLConditionalFormatType.Top10; + Bottom = false; + return Style; + } + + public IXLStyle WhenIsBottom(Int32 value, XLTopBottomType topBottomType = XLTopBottomType.Items) + { + Values.Initialize(new XLFormula(value)); + Percent = topBottomType == XLTopBottomType.Percent; + ConditionalFormatType = XLConditionalFormatType.Top10; + Bottom = true; + return Style; + } + + public IXLCFColorScaleMin ColorScale() + { + ConditionalFormatType = XLConditionalFormatType.ColorScale; + return new XLCFColorScaleMin(this); + } + + public IXLCFDataBarMin DataBar(XLColor color, Boolean showBarOnly = false) + { + Colors.Initialize(color); + ShowBarOnly = showBarOnly; + ConditionalFormatType = XLConditionalFormatType.DataBar; + return new XLCFDataBarMin(this); + } + + public IXLCFDataBarMin DataBar(XLColor positiveColor, XLColor negativeColor, Boolean showBarOnly = false) + { + Colors.Initialize(positiveColor); + Colors.Add(negativeColor); + ShowBarOnly = showBarOnly; + ConditionalFormatType = XLConditionalFormatType.DataBar; + return new XLCFDataBarMin(this); + } + + public IXLCFIconSet IconSet(XLIconSetStyle iconSetStyle, Boolean reverseIconOrder = false, Boolean showIconOnly = false) + { + IconSetOperators.Clear(); + Values.Clear(); + ContentTypes.Clear(); + ConditionalFormatType = XLConditionalFormatType.IconSet; + IconSetStyle = iconSetStyle; + ReverseIconOrder = reverseIconOrder; + ShowIconOnly = showIconOnly; + return new XLCFIconSet(this); + } + } + + internal class DictionaryComparer : + IEqualityComparer> + { + private readonly IEqualityComparer _valueComparer; + + public DictionaryComparer(IEqualityComparer valueComparer = null) + { + this._valueComparer = valueComparer ?? EqualityComparer.Default; + } + + public bool Equals(Dictionary x, Dictionary y) + { + if (x.Count != y.Count) + return false; + if (x.Keys.Except(y.Keys).Any()) + return false; + if (y.Keys.Except(x.Keys).Any()) + return false; + foreach (var pair in x) + if (!_valueComparer.Equals(pair.Value, y[pair.Key])) + return false; + return true; + } + + public int GetHashCode(Dictionary obj) + { + throw new NotImplementedException(); + } + } + + internal class EnumerableComparer : IEqualityComparer> + { + private readonly IEqualityComparer _valueComparer; + + public EnumerableComparer(IEqualityComparer valueComparer = null) + { + this._valueComparer = valueComparer ?? EqualityComparer.Default; + } + + public bool Equals(IEnumerable x, IEnumerable y) + { + return SetEquals(x, y, _valueComparer); + } + + public int GetHashCode(IEnumerable obj) + { + throw new NotImplementedException(); + } + + public static bool SetEquals(IEnumerable first, IEnumerable second, + IEqualityComparer comparer) + { + return new HashSet(second, comparer ?? EqualityComparer.Default) + .SetEquals(first); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/XLConditionalFormats.cs b/ClosedXML/Excel/ConditionalFormats/XLConditionalFormats.cs new file mode 100644 index 0000000..5a000f6 --- /dev/null +++ b/ClosedXML/Excel/ConditionalFormats/XLConditionalFormats.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLConditionalFormats : IXLConditionalFormats + { + private readonly List _conditionalFormats = new List(); + + private static readonly List _conditionalFormatTypesExcludedFromConsolidation = new List() + { + XLConditionalFormatType.DataBar, + XLConditionalFormatType.ColorScale, + XLConditionalFormatType.IconSet, + XLConditionalFormatType.Top10, + XLConditionalFormatType.AboveAverage, + XLConditionalFormatType.IsDuplicate, + XLConditionalFormatType.IsUnique + }; + + public void Add(IXLConditionalFormat conditionalFormat) + { + _conditionalFormats.Add(conditionalFormat); + } + + public IEnumerator GetEnumerator() + { + return _conditionalFormats.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Remove(Predicate predicate) + { + _conditionalFormats.RemoveAll(predicate); + } + + /// + /// The method consolidate the same conditional formats, which are located in adjacent ranges. + /// + internal void Consolidate() + { + var formats = _conditionalFormats + .Where(cf => cf.Ranges.Any()) + .ToList(); + _conditionalFormats.Clear(); + + while (formats.Count > 0) + { + var item = formats.First(); + + if (!_conditionalFormatTypesExcludedFromConsolidation.Contains(item.ConditionalFormatType)) + { + var rangesToJoin = new XLRanges(); + item.Ranges.ForEach(r => rangesToJoin.Add(r)); + var firstRange = item.Ranges.First(); + var skippedRanges = new XLRanges(); + Func IsSameFormat = f => + f != item && f.Ranges.First().Worksheet.Position == firstRange.Worksheet.Position && + XLConditionalFormat.NoRangeComparer.Equals(f, item); + + //Get the top left corner of the rectangle covering all the ranges + var baseAddress = new XLAddress( + item.Ranges.Select(r => r.RangeAddress.FirstAddress.RowNumber).Min(), + item.Ranges.Select(r => r.RangeAddress.FirstAddress.ColumnNumber).Min(), + false, false); + var baseCell = firstRange.Worksheet.Cell(baseAddress) as XLCell; + + int i = 1; + bool stop = false; + List similarFormats = new List(); + do + { + stop = (i >= formats.Count); + + if (!stop) + { + var nextFormat = formats[i]; + + var intersectsSkipped = + skippedRanges.Any(left => nextFormat.Ranges.GetIntersectedRanges(left.RangeAddress).Any()); + + var isSameFormat = IsSameFormat(nextFormat); + + if (isSameFormat && !intersectsSkipped) + { + similarFormats.Add(nextFormat); + nextFormat.Ranges.ForEach(r => rangesToJoin.Add(r)); + } + else if (rangesToJoin.Any(left => nextFormat.Ranges.GetIntersectedRanges(left.RangeAddress).Any()) || + intersectsSkipped) + { + // if we reached the rule intersecting any of captured ranges stop for not breaking the priorities + stop = true; + } + + if (!isSameFormat) + nextFormat.Ranges.ForEach(r => skippedRanges.Add(r)); + } + + i++; + } while (!stop); + + var consRanges = rangesToJoin.Consolidate(); + item.Ranges.RemoveAll(); + consRanges.ForEach(r => item.Ranges.Add(r)); + + var targetCell = item.Ranges.First().FirstCell() as XLCell; + (item as XLConditionalFormat).AdjustFormulas(baseCell, targetCell); + + similarFormats.ForEach(cf => formats.Remove(cf)); + } + + _conditionalFormats.Add(item); + formats.Remove(item); + } + } + + public void RemoveAll() + { + _conditionalFormats.Clear(); + } + + /// + /// Reorders the according to original priority. Done during load process + /// + public void ReorderAccordingToOriginalPriority() + { + var reorderedFormats = _conditionalFormats.OrderBy(cf => (cf as XLConditionalFormat).OriginalPriority).ToList(); + _conditionalFormats.Clear(); + _conditionalFormats.AddRange(reorderedFormats); + } + } +} diff --git a/ClosedXML/Excel/ContentManagers/XLBaseContentManager.cs b/ClosedXML/Excel/ContentManagers/XLBaseContentManager.cs new file mode 100644 index 0000000..6d031b5 --- /dev/null +++ b/ClosedXML/Excel/ContentManagers/XLBaseContentManager.cs @@ -0,0 +1,38 @@ +using DocumentFormat.OpenXml; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel.ContentManagers +{ + internal abstract class XLBaseContentManager + { + + } + + internal abstract class XLBaseContentManager : XLBaseContentManager + where T : struct, IConvertible + + { + protected readonly IDictionary contents = new Dictionary(); + + public OpenXmlElement GetPreviousElementFor(T content) + { + var i = content.CastTo(); + + var previousElements = contents.Keys + .Where(key => key.CastTo() < i && contents[key] != null) + .OrderBy(key => key.CastTo()); + + if (previousElements.Any()) + return contents[previousElements.Last()]; + else + return null; + } + + public void SetElement(T content, OpenXmlElement element) + { + contents[content] = element; + } + } +} diff --git a/ClosedXML/Excel/ContentManagers/XLSheetViewContentManager.cs b/ClosedXML/Excel/ContentManagers/XLSheetViewContentManager.cs new file mode 100644 index 0000000..12c74ad --- /dev/null +++ b/ClosedXML/Excel/ContentManagers/XLSheetViewContentManager.cs @@ -0,0 +1,24 @@ +using DocumentFormat.OpenXml.Spreadsheet; +using System.Linq; + +namespace ClosedXML.Excel.ContentManagers +{ + internal enum XLSheetViewContents + { + Pane, + Selection, + PivotSelection, + ExtensionList + } + + internal class XLSheetViewContentManager : XLBaseContentManager + { + public XLSheetViewContentManager(SheetView sheetView) + { + contents.Add(XLSheetViewContents.Pane, sheetView.Elements().LastOrDefault()); + contents.Add(XLSheetViewContents.Selection, sheetView.Elements().LastOrDefault()); + contents.Add(XLSheetViewContents.PivotSelection, sheetView.Elements().LastOrDefault()); + contents.Add(XLSheetViewContents.ExtensionList, sheetView.Elements().LastOrDefault()); + } + } +} diff --git a/ClosedXML/Excel/ContentManagers/XLWorksheetContentManager.cs b/ClosedXML/Excel/ContentManagers/XLWorksheetContentManager.cs new file mode 100644 index 0000000..d3f90c0 --- /dev/null +++ b/ClosedXML/Excel/ContentManagers/XLWorksheetContentManager.cs @@ -0,0 +1,97 @@ +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Spreadsheet; +using System.Linq; + +namespace ClosedXML.Excel.ContentManagers +{ + internal enum XLWorksheetContents + { + SheetProperties = 1, + SheetDimension = 2, + SheetViews = 3, + SheetFormatProperties = 4, + Columns = 5, + SheetData = 6, + SheetCalculationProperties = 7, + SheetProtection = 8, + ProtectedRanges = 9, + Scenarios = 10, + AutoFilter = 11, + SortState = 12, + DataConsolidate = 13, + CustomSheetViews = 14, + MergeCells = 15, + PhoneticProperties = 16, + ConditionalFormatting = 17, + DataValidations = 18, + Hyperlinks = 19, + PrintOptions = 20, + PageMargins = 21, + PageSetup = 22, + HeaderFooter = 23, + RowBreaks = 24, + ColumnBreaks = 25, + CustomProperties = 26, + CellWatches = 27, + IgnoredErrors = 28, + SmartTags = 29, + Drawing = 30, + LegacyDrawing = 31, + LegacyDrawingHeaderFooter = 32, + DrawingHeaderFooter = 33, + Picture = 34, + OleObjects = 35, + Controls = 36, + AlternateContent = 37, + WebPublishItems = 38, + TableParts = 39, + WorksheetExtensionList = 40 + } + + internal class XLWorksheetContentManager : XLBaseContentManager + { + public XLWorksheetContentManager(Worksheet opWorksheet) + { + contents.Add(XLWorksheetContents.SheetProperties, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.SheetDimension, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.SheetViews, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.SheetFormatProperties, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.Columns, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.SheetData, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.SheetCalculationProperties, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.SheetProtection, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.ProtectedRanges, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.Scenarios, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.AutoFilter, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.SortState, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.DataConsolidate, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.CustomSheetViews, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.MergeCells, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.PhoneticProperties, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.ConditionalFormatting, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.DataValidations, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.Hyperlinks, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.PrintOptions, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.PageMargins, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.PageSetup, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.HeaderFooter, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.RowBreaks, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.ColumnBreaks, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.CustomProperties, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.CellWatches, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.IgnoredErrors, opWorksheet.Elements().LastOrDefault()); + //contents.Add(XLWSContents.SmartTags, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.Drawing, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.LegacyDrawing, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.LegacyDrawingHeaderFooter, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.DrawingHeaderFooter, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.Picture, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.OleObjects, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.Controls, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.AlternateContent, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.WebPublishItems, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.TableParts, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWorksheetContents.WorksheetExtensionList, opWorksheet.Elements().LastOrDefault()); + } + } +} diff --git a/ClosedXML/Excel/Coordinates/IXLAddress.cs b/ClosedXML/Excel/Coordinates/IXLAddress.cs new file mode 100644 index 0000000..6158251 --- /dev/null +++ b/ClosedXML/Excel/Coordinates/IXLAddress.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLAddress : IEqualityComparer, IEquatable + { + String ColumnLetter { get; } + Int32 ColumnNumber { get; } + Boolean FixedColumn { get; } + Boolean FixedRow { get; } + Int32 RowNumber { get; } + String UniqueId { get; } + IXLWorksheet Worksheet { get; } + + String ToString(XLReferenceStyle referenceStyle); + + String ToString(XLReferenceStyle referenceStyle, Boolean includeSheet); + + String ToStringFixed(); + + String ToStringFixed(XLReferenceStyle referenceStyle); + + String ToStringFixed(XLReferenceStyle referenceStyle, Boolean includeSheet); + + String ToStringRelative(); + + + String ToStringRelative(Boolean includeSheet); + } +} diff --git a/ClosedXML/Excel/Coordinates/XLAddress.cs b/ClosedXML/Excel/Coordinates/XLAddress.cs new file mode 100644 index 0000000..11d34d1 --- /dev/null +++ b/ClosedXML/Excel/Coordinates/XLAddress.cs @@ -0,0 +1,465 @@ +using ClosedXML.Extensions; +using System; +using System.Diagnostics; + +namespace ClosedXML.Excel +{ + internal struct XLAddress : IXLAddress, IEquatable + { + #region Static + /// + /// Create address without worksheet. For calculation only! + /// + /// + /// + public static XLAddress Create(string cellAddressString) + { + return Create(null, cellAddressString); + } + + public static XLAddress Create(XLWorksheet worksheet, string cellAddressString) + { + var fixedColumn = cellAddressString[0] == '$'; + Int32 startPos; + if (fixedColumn) + { + startPos = 1; + } + else + { + startPos = 0; + } + + int rowPos = startPos; + while (cellAddressString[rowPos] > '9') + { + rowPos++; + } + + var fixedRow = cellAddressString[rowPos] == '$'; + string columnLetter; + int rowNumber; + if (fixedRow) + { + if (fixedColumn) + { + columnLetter = cellAddressString.Substring(startPos, rowPos - 1); + } + else + { + columnLetter = cellAddressString.Substring(startPos, rowPos); + } + + rowNumber = int.Parse(cellAddressString.Substring(rowPos + 1), XLHelper.NumberStyle, XLHelper.ParseCulture); + } + else + { + if (fixedColumn) + { + columnLetter = cellAddressString.Substring(startPos, rowPos - 1); + } + else + { + columnLetter = cellAddressString.Substring(startPos, rowPos); + } + + rowNumber = Int32.Parse(cellAddressString.Substring(rowPos), XLHelper.NumberStyle, XLHelper.ParseCulture); + } + return new XLAddress(worksheet, rowNumber, columnLetter, fixedRow, fixedColumn); + } + + #endregion Static + + #region Private fields + + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private bool _fixedRow; + + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private bool _fixedColumn; + + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly int _rowNumber; + + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly int _columnNumber; + + private string _trimmedAddress; + + #endregion Private fields + + #region Constructors + + /// + /// Initializes a new struct using a mixed notation. Attention: without worksheet for calculation only! + /// + /// The row number of the cell address. + /// The column letter of the cell address. + /// + /// + public XLAddress(int rowNumber, string columnLetter, bool fixedRow, bool fixedColumn) + : this(null, rowNumber, columnLetter, fixedRow, fixedColumn) + { + } + + /// + /// Initializes a new struct using a mixed notation. + /// + /// + /// The row number of the cell address. + /// The column letter of the cell address. + /// + /// + public XLAddress(XLWorksheet worksheet, int rowNumber, string columnLetter, bool fixedRow, bool fixedColumn) + : this(worksheet, rowNumber, XLHelper.GetColumnNumberFromLetter(columnLetter), fixedRow, fixedColumn) + { + } + + /// + /// Initializes a new struct using R1C1 notation. Attention: without worksheet for calculation only! + /// + /// The row number of the cell address. + /// The column number of the cell address. + /// + /// + public XLAddress(int rowNumber, int columnNumber, bool fixedRow, bool fixedColumn) + : this(null, rowNumber, columnNumber, fixedRow, fixedColumn) + { + } + + /// + /// Initializes a new struct using R1C1 notation. + /// + /// + /// The row number of the cell address. + /// The column number of the cell address. + /// + /// + public XLAddress(XLWorksheet worksheet, int rowNumber, int columnNumber, bool fixedRow, bool fixedColumn) : this() + + { + Worksheet = worksheet; + + _rowNumber = rowNumber; + _columnNumber = columnNumber; + _fixedColumn = fixedColumn; + _fixedRow = fixedRow; + } + + #endregion Constructors + + #region Properties + + public XLWorksheet Worksheet { get; internal set; } + + IXLWorksheet IXLAddress.Worksheet + { + [DebuggerStepThrough] + get { return Worksheet; } + } + + public bool HasWorksheet + { + [DebuggerStepThrough] + get { return Worksheet != null; } + } + + public bool FixedRow + { + get { return _fixedRow; } + } + + public bool FixedColumn + { + get { return _fixedColumn; } + } + + /// + /// Gets the row number of this address. + /// + public Int32 RowNumber + { + get { return _rowNumber; } + } + + /// + /// Gets the column number of this address. + /// + public Int32 ColumnNumber + { + get { return _columnNumber; } + } + + /// + /// Gets the column letter(s) of this address. + /// + public String ColumnLetter + { + get { return XLHelper.GetColumnLetterFromNumber(_columnNumber); } + } + + #endregion Properties + + #region Overrides + + public override string ToString() + { + if (!IsValid) + return "#REF!"; + + String retVal = ColumnLetter; + if (_fixedColumn) + { + retVal = "$" + retVal; + } + if (_fixedRow) + { + retVal += "$"; + } + retVal += _rowNumber.ToInvariantString(); + return retVal; + } + + public string ToString(XLReferenceStyle referenceStyle) + { + return ToString(referenceStyle, false); + } + + public string ToString(XLReferenceStyle referenceStyle, bool includeSheet) + { + string address; + if (!IsValid) + address = "#REF!"; + else if (referenceStyle == XLReferenceStyle.A1) + address = GetTrimmedAddress(); + else if (referenceStyle == XLReferenceStyle.R1C1 + || HasWorksheet && Worksheet.Workbook.ReferenceStyle == XLReferenceStyle.R1C1) + address = "R" + _rowNumber.ToInvariantString() + "C" + ColumnNumber.ToInvariantString(); + else + address = GetTrimmedAddress(); + + if (includeSheet) + return String.Concat( + WorksheetIsDeleted ? "#REF" : Worksheet.Name.EscapeSheetName(), + '!', + address); + + return address; + } + + #endregion Overrides + + #region Methods + + public string GetTrimmedAddress() + { + return _trimmedAddress ?? (_trimmedAddress = ColumnLetter + _rowNumber.ToInvariantString()); + } + + #endregion Methods + + #region Operator Overloads + + public static XLAddress operator +(XLAddress left, XLAddress right) + { + return new XLAddress(left.Worksheet, + left.RowNumber + right.RowNumber, + left.ColumnNumber + right.ColumnNumber, + left._fixedRow, + left._fixedColumn); + } + + public static XLAddress operator -(XLAddress left, XLAddress right) + { + return new XLAddress(left.Worksheet, + left.RowNumber - right.RowNumber, + left.ColumnNumber - right.ColumnNumber, + left._fixedRow, + left._fixedColumn); + } + + public static XLAddress operator +(XLAddress left, Int32 right) + { + return new XLAddress(left.Worksheet, + left.RowNumber + right, + left.ColumnNumber + right, + left._fixedRow, + left._fixedColumn); + } + + public static XLAddress operator -(XLAddress left, Int32 right) + { + return new XLAddress(left.Worksheet, + left.RowNumber - right, + left.ColumnNumber - right, + left._fixedRow, + left._fixedColumn); + } + + public static Boolean operator ==(XLAddress left, XLAddress right) + { + if (ReferenceEquals(left, right)) + { + return true; + } + return !ReferenceEquals(left, null) && left.Equals(right); + } + + public static Boolean operator !=(XLAddress left, XLAddress right) + { + return !(left == right); + } + + #endregion Operator Overloads + + #region Interface Requirements + + #region IEqualityComparer Members + + public Boolean Equals(IXLAddress x, IXLAddress y) + { + return x == y; + } + + public new Boolean Equals(object x, object y) + { + return x == y; + } + + #endregion IEqualityComparer Members + + #region IEquatable Members + + public bool Equals(IXLAddress other) + { + if (other == null) + return false; + + return _rowNumber == other.RowNumber && + _columnNumber == other.ColumnNumber && + _fixedRow == other.FixedRow && + _fixedColumn == other.FixedColumn; + } + + public bool Equals(XLAddress other) + { + return _rowNumber == other._rowNumber && + _columnNumber == other._columnNumber && + _fixedRow == other._fixedRow && + _fixedColumn == other._fixedColumn; + } + + public override Boolean Equals(Object other) + { + return Equals(other as IXLAddress); + } + + public override int GetHashCode() + { + var hashCode = 2122234362; + hashCode = hashCode * -1521134295 + _fixedRow.GetHashCode(); + hashCode = hashCode * -1521134295 + _fixedColumn.GetHashCode(); + hashCode = hashCode * -1521134295 + _rowNumber.GetHashCode(); + hashCode = hashCode * -1521134295 + _columnNumber.GetHashCode(); + return hashCode; + } + + public int GetHashCode(IXLAddress obj) + { + return ((XLAddress)obj).GetHashCode(); + } + + #endregion IEquatable Members + + #endregion Interface Requirements + + public String ToStringRelative() + { + return ToStringRelative(false); + } + + public String ToStringFixed() + { + return ToStringFixed(XLReferenceStyle.Default); + } + + public String ToStringRelative(Boolean includeSheet) + { + var address = IsValid ? GetTrimmedAddress() : "#REF!"; + + if (includeSheet) + return String.Concat( + WorksheetIsDeleted ? "#REF" : Worksheet.Name.EscapeSheetName(), + '!', + address + ); + + return address; + } + + internal XLAddress WithoutWorksheet() + { + return new XLAddress(RowNumber, ColumnNumber, FixedRow, FixedColumn); + } + + public String ToStringFixed(XLReferenceStyle referenceStyle) + { + return ToStringFixed(referenceStyle, false); + } + + public String ToStringFixed(XLReferenceStyle referenceStyle, Boolean includeSheet) + { + String address; + + if (referenceStyle == XLReferenceStyle.Default && HasWorksheet) + referenceStyle = Worksheet.Workbook.ReferenceStyle; + + if (referenceStyle == XLReferenceStyle.Default) + referenceStyle = XLReferenceStyle.A1; + + Debug.Assert(referenceStyle != XLReferenceStyle.Default); + + if (!IsValid) + { + address = "#REF!"; + } + else + { + switch (referenceStyle) + { + case XLReferenceStyle.A1: + address = String.Concat('$', ColumnLetter, '$', _rowNumber.ToInvariantString()); + break; + + case XLReferenceStyle.R1C1: + address = String.Concat('R', _rowNumber.ToInvariantString(), 'C', ColumnNumber); + break; + + default: + throw new NotImplementedException(); + } + } + + if (includeSheet) + return String.Concat( + WorksheetIsDeleted ? "#REF" : Worksheet.Name.EscapeSheetName(), + '!', + address); + + return address; + } + + public String UniqueId { get { return RowNumber.ToString("0000000") + ColumnNumber.ToString("00000"); } } + + public bool IsValid + { + get + { + return 0 < RowNumber && RowNumber <= XLHelper.MaxRowNumber && + 0 < ColumnNumber && ColumnNumber <= XLHelper.MaxColumnNumber; + } + } + + private bool WorksheetIsDeleted => Worksheet?.IsDeleted == true; + } +} diff --git a/ClosedXML/Excel/Coordinates/XLSheetPoint.cs b/ClosedXML/Excel/Coordinates/XLSheetPoint.cs new file mode 100644 index 0000000..f1c3cea --- /dev/null +++ b/ClosedXML/Excel/Coordinates/XLSheetPoint.cs @@ -0,0 +1,41 @@ +using System; + +namespace ClosedXML.Excel +{ + internal struct XLSheetPoint:IEquatable + { + public XLSheetPoint(Int32 row, Int32 column) + { + Row = row; + Column = column; + } + + public readonly Int32 Row; + public readonly Int32 Column; + + public override bool Equals(object obj) + { + return Equals((XLSheetPoint)obj); + } + + public bool Equals(XLSheetPoint other) + { + return Row == other.Row && Column == other.Column; + } + + public override int GetHashCode() + { + return (Row * -1) ^ Column; + } + + public static bool operator==(XLSheetPoint a, XLSheetPoint b) + { + return a.Row == b.Row && a.Column == b.Column; + } + + public static bool operator !=(XLSheetPoint a, XLSheetPoint b) + { + return a.Row != b.Row || a.Column != b.Column; + } + } +} diff --git a/ClosedXML/Excel/Coordinates/XLSheetRange.cs b/ClosedXML/Excel/Coordinates/XLSheetRange.cs new file mode 100644 index 0000000..9fb23a2 --- /dev/null +++ b/ClosedXML/Excel/Coordinates/XLSheetRange.cs @@ -0,0 +1,26 @@ +using System; + +namespace ClosedXML.Excel +{ + internal struct XLSheetRange:IEquatable + { + public XLSheetRange(XLSheetPoint firstPoint, XLSheetPoint lastPoint) + { + FirstPoint = firstPoint; + LastPoint = lastPoint; + } + + public readonly XLSheetPoint FirstPoint; + public readonly XLSheetPoint LastPoint; + + public bool Equals(XLSheetRange other) + { + return FirstPoint.Equals(other.FirstPoint) && LastPoint.Equals(other.LastPoint); + } + + public override int GetHashCode() + { + return FirstPoint.GetHashCode() ^ LastPoint.GetHashCode(); + } + } +} diff --git a/ClosedXML/Excel/CustomProperties/IXLCustomProperties.cs b/ClosedXML/Excel/CustomProperties/IXLCustomProperties.cs new file mode 100644 index 0000000..83e906a --- /dev/null +++ b/ClosedXML/Excel/CustomProperties/IXLCustomProperties.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLCustomProperties: IEnumerable + { + void Add(IXLCustomProperty customProperty); + void Add(String name, T value); + void Delete(String name); + IXLCustomProperty CustomProperty(String name); + + } +} diff --git a/ClosedXML/Excel/CustomProperties/IXLCustomProperty.cs b/ClosedXML/Excel/CustomProperties/IXLCustomProperty.cs new file mode 100644 index 0000000..cfed06e --- /dev/null +++ b/ClosedXML/Excel/CustomProperties/IXLCustomProperty.cs @@ -0,0 +1,13 @@ +using System; + +namespace ClosedXML.Excel +{ + public enum XLCustomPropertyType { Text, Number, Date, Boolean} + public interface IXLCustomProperty + { + String Name { get; set; } + XLCustomPropertyType Type { get; } + Object Value { get; set; } + T GetValue(); + } +} diff --git a/ClosedXML/Excel/CustomProperties/XLCustomProperties.cs b/ClosedXML/Excel/CustomProperties/XLCustomProperties.cs new file mode 100644 index 0000000..0322069 --- /dev/null +++ b/ClosedXML/Excel/CustomProperties/XLCustomProperties.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLCustomProperties: IXLCustomProperties, IEnumerable + { + XLWorkbook workbook; + public XLCustomProperties(XLWorkbook workbook) + { + this.workbook = workbook; + } + + private Dictionary customProperties = new Dictionary(); + public void Add(IXLCustomProperty customProperty) + { + customProperties.Add(customProperty.Name, customProperty); + } + public void Add(String name, T value) + { + var cp = new XLCustomProperty(workbook) { Name = name, Value = value }; + Add(cp); + } + + public void Delete(String name) + { + customProperties.Remove(name); + } + public IXLCustomProperty CustomProperty(String name) + { + return customProperties[name]; + } + + public IEnumerator GetEnumerator() + { + return customProperties.Values.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + + } +} diff --git a/ClosedXML/Excel/CustomProperties/XLCustomProperty.cs b/ClosedXML/Excel/CustomProperties/XLCustomProperty.cs new file mode 100644 index 0000000..a1d4d19 --- /dev/null +++ b/ClosedXML/Excel/CustomProperties/XLCustomProperty.cs @@ -0,0 +1,60 @@ +using System; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLCustomProperty : IXLCustomProperty + { + private readonly XLWorkbook _workbook; + + private String name; + + public XLCustomProperty(XLWorkbook workbook) + { + _workbook = workbook; + } + + #region IXLCustomProperty Members + + public String Name + { + get { return name; } + set + { + if (name == value) return; + + if (_workbook.CustomProperties.Any(t => t.Name == value)) + throw new ArgumentException( + String.Format("This workbook already contains a custom property named '{0}'", value)); + + name = value; + } + } + + public XLCustomPropertyType Type + { + get + { + if (Value is DateTime) + return XLCustomPropertyType.Date; + + if (Value is Boolean) + return XLCustomPropertyType.Boolean; + + if (Double.TryParse(Value.ToString(), out Double dTest)) + return XLCustomPropertyType.Number; + + return XLCustomPropertyType.Text; + } + } + + public Object Value { get; set; } + + public T GetValue() + { + return (T)Convert.ChangeType(Value, typeof(T)); + } + + #endregion + } +} diff --git a/ClosedXML/Excel/DataValidation/IXLDataValidation.cs b/ClosedXML/Excel/DataValidation/IXLDataValidation.cs new file mode 100644 index 0000000..895bfa1 --- /dev/null +++ b/ClosedXML/Excel/DataValidation/IXLDataValidation.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public enum XLErrorStyle { Stop, Warning, Information } + public enum XLAllowedValues { AnyValue, WholeNumber, Decimal, Date, Time, TextLength, List, Custom } + public enum XLOperator { EqualTo, NotEqualTo, GreaterThan, LessThan, EqualOrGreaterThan, EqualOrLessThan, Between, NotBetween } + public interface IXLDataValidation + { + /// + /// A collection of ranges the data validation rule applies too. + /// + IEnumerable Ranges { get; } + + /// + /// Add a range to the collection of ranges this rule applies to. + /// If the specified range does not belong to the worksheet of the data validation + /// rule it is transferred to the target worksheet. + /// + /// A range to add. + void AddRange(IXLRange range); + + /// + /// Add a collection of ranges to the collection of ranges this rule applies to. + /// Ranges that do not belong to the worksheet of the data validation + /// rule are transferred to the target worksheet. + /// + /// Ranges to add. + void AddRanges(IEnumerable ranges); + + /// + /// Detach data validation rule of all ranges it applies to. + /// + void ClearRanges(); + + /// + /// Remove the specified range from the collection of range this rule applies to. + /// + /// A range to remove. + bool RemoveRange(IXLRange range); + + //void Delete(); + //void CopyFrom(IXLDataValidation dataValidation); + Boolean ShowInputMessage { get; set; } + Boolean ShowErrorMessage { get; set; } + Boolean IgnoreBlanks { get; set; } + Boolean InCellDropdown { get; set; } + String InputTitle { get; set; } + String InputMessage { get; set; } + String ErrorTitle { get; set; } + String ErrorMessage { get; set; } + XLErrorStyle ErrorStyle { get; set; } + XLAllowedValues AllowedValues { get; set; } + XLOperator Operator { get; set; } + + String Value { get; set; } + String MinValue { get; set; } + String MaxValue { get; set; } + + XLWholeNumberCriteria WholeNumber { get; } + XLDecimalCriteria Decimal { get; } + XLDateCriteria Date { get; } + XLTimeCriteria Time { get; } + XLTextLengthCriteria TextLength { get; } + + void List(String list); + void List(String list, Boolean inCellDropdown); + void List(IXLRange range); + void List(IXLRange range, Boolean inCellDropdown); + + void Custom(String customValidation); + void Clear(); + Boolean IsDirty(); + } +} diff --git a/ClosedXML/Excel/DataValidation/IXLDataValidations.cs b/ClosedXML/Excel/DataValidation/IXLDataValidations.cs new file mode 100644 index 0000000..76b2e48 --- /dev/null +++ b/ClosedXML/Excel/DataValidation/IXLDataValidations.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLDataValidations : IEnumerable + { + IXLWorksheet Worksheet { get; } + + /// + /// Add data validation rule to the collection. If the specified rule refers to another + /// worksheet than the collection, the copy will be created and its ranges will refer + /// to the worksheet of the collection. Otherwise the original instance will be placed + /// in the collection. + /// + /// A data validation rule to add. + /// The instance that has actually been added in the collection + /// (may be a copy of the specified one). + IXLDataValidation Add(IXLDataValidation dataValidation); + + Boolean ContainsSingle(IXLRange range); + + void Delete(Predicate predicate); + + /// + /// Get the data validation rule for the range with the specified address if it exists. + /// + /// A range address. + /// Data validation rule which ranges collection includes the specified + /// address. The specified range should be fully covered with the data validation rule. + /// For example, if the rule is applied to ranges A1:A3,C1:C3 then this method will + /// return True for ranges A1:A3, C1:C2, A2:A3, and False for ranges A1:C3, A1:C1, etc. + /// True is the data validation rule was found, false otherwise. + bool TryGet(IXLRangeAddress rangeAddress, out IXLDataValidation dataValidation); + + /// + /// Get all data validation rules applied to ranges that intersect the specified range. + /// + IEnumerable GetAllInRange(IXLRangeAddress rangeAddress); + } +} diff --git a/ClosedXML/Excel/DataValidation/IXLValidationCriteria.cs b/ClosedXML/Excel/DataValidation/IXLValidationCriteria.cs new file mode 100644 index 0000000..9463193 --- /dev/null +++ b/ClosedXML/Excel/DataValidation/IXLValidationCriteria.cs @@ -0,0 +1,34 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLValidationCriteria + { + void EqualTo(String value); + void NotEqualTo(String value); + void GreaterThan(String value); + void LessThan(String value); + void EqualOrGreaterThan(String value); + void EqualOrLessThan(String value); + void Between(String minValue, String maxValue); + void NotBetween(String minValue, String maxValue); + + void EqualTo(IXLRange range); + void NotEqualTo(IXLRange range); + void GreaterThan(IXLRange range); + void LessThan(IXLRange range); + void EqualOrGreaterThan(IXLRange range); + void EqualOrLessThan(IXLRange range); + void Between(IXLRange minValue, IXLRange maxValue); + void NotBetween(IXLRange minValue, IXLRange maxValue); + + void EqualTo(IXLCell cell); + void NotEqualTo(IXLCell cell); + void GreaterThan(IXLCell cell); + void LessThan(IXLCell cell); + void EqualOrGreaterThan(IXLCell cell); + void EqualOrLessThan(IXLCell cell); + void Between(IXLCell minValue, IXLCell maxValue); + void NotBetween(IXLCell minValue, IXLCell maxValue); + } +} diff --git a/ClosedXML/Excel/DataValidation/XLDataValidation.cs b/ClosedXML/Excel/DataValidation/XLDataValidation.cs new file mode 100644 index 0000000..82b22ae --- /dev/null +++ b/ClosedXML/Excel/DataValidation/XLDataValidation.cs @@ -0,0 +1,294 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLDataValidation : IXLDataValidation + { + private readonly XLWorksheet _worksheet; + private readonly XLRanges _ranges; + + internal XLWorksheet Worksheet => _worksheet; + + + private XLDataValidation(XLWorksheet worksheet) + { + _worksheet = worksheet ?? throw new ArgumentNullException(nameof(worksheet)); + _ranges = new XLRanges(); + Initialize(); + } + + public XLDataValidation(IXLRange range) + : this(range?.Worksheet as XLWorksheet) + { + if (range == null) throw new ArgumentNullException(nameof(range)); + + AddRange(range); + } + + public XLDataValidation(IXLDataValidation dataValidation, XLWorksheet worksheet) + : this(worksheet) + { + _worksheet = worksheet; + CopyFrom(dataValidation); + } + + private void Initialize() + { + AllowedValues = XLAllowedValues.AnyValue; + IgnoreBlanks = true; + ShowErrorMessage = true; + ShowInputMessage = true; + InCellDropdown = true; + InputTitle = String.Empty; + InputMessage = String.Empty; + ErrorTitle = String.Empty; + ErrorMessage = String.Empty; + ErrorStyle = XLErrorStyle.Stop; + Operator = XLOperator.Between; + Value = String.Empty; + MinValue = String.Empty; + MaxValue = String.Empty; + } + + public Boolean IsDirty() + { + return + AllowedValues != XLAllowedValues.AnyValue + || (ShowInputMessage && + (!String.IsNullOrWhiteSpace(InputTitle) || !String.IsNullOrWhiteSpace(InputMessage))) + || (ShowErrorMessage && + (!String.IsNullOrWhiteSpace(ErrorTitle) || !String.IsNullOrWhiteSpace(ErrorMessage))); + } + + #region IXLDataValidation Members + + public IEnumerable Ranges => _ranges.AsEnumerable(); + + /// + /// Add a range to the collection of ranges this rule applies to. + /// If the specified range does not belong to the worksheet of the data validation + /// rule it is transferred to the target worksheet. + /// + /// A range to add. + public void AddRange(IXLRange range) + { + if (range == null) throw new ArgumentNullException(nameof(range)); + + if (range.Worksheet != Worksheet) + range = Worksheet.Range(((XLRangeAddress) range.RangeAddress).WithoutWorksheet()); + + _ranges.Add(range); + + RangeAdded?.Invoke(this, new RangeEventArgs(range)); + } + + /// + /// Add a collection of ranges to the collection of ranges this rule applies to. + /// Ranges that do not belong to the worksheet of the data validation + /// rule are transferred to the target worksheet. + /// + /// Ranges to add. + public void AddRanges(IEnumerable ranges) + { + ranges = ranges ?? Enumerable.Empty(); + + foreach (var range in ranges) + { + AddRange(range); + } + } + + /// + /// Detach data validation rule of all ranges it applies to. + /// + public void ClearRanges() + { + var allRanges = _ranges.ToList(); + _ranges.RemoveAll(); + + foreach (var range in allRanges) + { + RangeRemoved?.Invoke(this, new RangeEventArgs(range)); + } + } + + /// + /// Remove the specified range from the collection of range this rule applies to. + /// + /// A range to remove. + public bool RemoveRange(IXLRange range) + { + if (range == null) + return false; + + var res = _ranges.Remove(range); + + if (res) + { + RangeRemoved?.Invoke(this, new RangeEventArgs(range)); + } + + return res; + } + + public Boolean IgnoreBlanks { get; set; } + public Boolean InCellDropdown { get; set; } + public Boolean ShowInputMessage { get; set; } + public String InputTitle { get; set; } + public String InputMessage { get; set; } + public Boolean ShowErrorMessage { get; set; } + public String ErrorTitle { get; set; } + public String ErrorMessage { get; set; } + public XLErrorStyle ErrorStyle { get; set; } + public XLAllowedValues AllowedValues { get; set; } + public XLOperator Operator { get; set; } + + public String Value + { + get { return MinValue; } + set { MinValue = value; } + } + + private String minValue; + public String MinValue { get => minValue; set { Validate(value); minValue = value; } } + + private String maxValue; + public String MaxValue { get => maxValue; set { Validate(value); maxValue = value; } } + + public XLWholeNumberCriteria WholeNumber + { + get + { + AllowedValues = XLAllowedValues.WholeNumber; + return new XLWholeNumberCriteria(this); + } + } + + public XLDecimalCriteria Decimal + { + get + { + AllowedValues = XLAllowedValues.Decimal; + return new XLDecimalCriteria(this); + } + } + + public XLDateCriteria Date + { + get + { + AllowedValues = XLAllowedValues.Date; + return new XLDateCriteria(this); + } + } + + public XLTimeCriteria Time + { + get + { + AllowedValues = XLAllowedValues.Time; + return new XLTimeCriteria(this); + } + } + + public XLTextLengthCriteria TextLength + { + get + { + AllowedValues = XLAllowedValues.TextLength; + return new XLTextLengthCriteria(this); + } + } + + public void List(String list) + { + List(list, true); + } + + public void List(String list, Boolean inCellDropdown) + { + AllowedValues = XLAllowedValues.List; + InCellDropdown = inCellDropdown; + Value = list; + } + + public void List(IXLRange range) + { + List(range, true); + } + + public void List(IXLRange range, Boolean inCellDropdown) + { + List(range.RangeAddress.ToStringFixed(XLReferenceStyle.A1, true)); + } + + public void Custom(String customValidation) + { + AllowedValues = XLAllowedValues.Custom; + Value = customValidation; + } + + #endregion IXLDataValidation Members + + public void CopyFrom(IXLDataValidation dataValidation) + { + if (dataValidation == this) return; + + if (!_ranges.Any()) + AddRanges(dataValidation.Ranges); + + IgnoreBlanks = dataValidation.IgnoreBlanks; + InCellDropdown = dataValidation.InCellDropdown; + ShowErrorMessage = dataValidation.ShowErrorMessage; + ShowInputMessage = dataValidation.ShowInputMessage; + InputTitle = dataValidation.InputTitle; + InputMessage = dataValidation.InputMessage; + ErrorTitle = dataValidation.ErrorTitle; + ErrorMessage = dataValidation.ErrorMessage; + ErrorStyle = dataValidation.ErrorStyle; + AllowedValues = dataValidation.AllowedValues; + Operator = dataValidation.Operator; + MinValue = dataValidation.MinValue; + MaxValue = dataValidation.MaxValue; + } + + public void Clear() + { + Initialize(); + } + + private void Validate(String value) + { + if (value.Length > 255) + throw new ArgumentOutOfRangeException(nameof(value), "The maximum allowed length of the value is 255 characters."); + } + + internal event EventHandler RangeAdded; + + internal event EventHandler RangeRemoved; + + internal void SplitBy(IXLRangeAddress rangeAddress) + { + var rangesToSplit = _ranges.GetIntersectedRanges(rangeAddress).ToList(); + + foreach (var rangeToSplit in rangesToSplit) + { + var newRanges = (rangeToSplit as XLRange).Split(rangeAddress, includeIntersection: false); + RemoveRange(rangeToSplit); + newRanges.ForEach(AddRange); + } + } + } + + internal class RangeEventArgs : EventArgs + { + public RangeEventArgs(IXLRange range) + { + Range = range ?? throw new ArgumentNullException(nameof(range)); + } + + public IXLRange Range { get; } + } +} diff --git a/ClosedXML/Excel/DataValidation/XLDataValidations.cs b/ClosedXML/Excel/DataValidation/XLDataValidations.cs new file mode 100644 index 0000000..22367c0 --- /dev/null +++ b/ClosedXML/Excel/DataValidation/XLDataValidations.cs @@ -0,0 +1,282 @@ +using System; +using System.Collections.Generic; +using ClosedXML.Excel.Ranges.Index; + +namespace ClosedXML.Excel +{ + using System.Collections; + using System.Linq; + + internal class XLDataValidations : IXLDataValidations + { + private readonly XLRangeIndex _dataValidationIndex; + + internal XLWorksheet Worksheet => _worksheet; + + private readonly XLWorksheet _worksheet; + private readonly List _dataValidations = new List(); + + public XLDataValidations(XLWorksheet worksheet) + { + _worksheet = worksheet ?? throw new ArgumentNullException(nameof(worksheet)); + _dataValidationIndex = new XLRangeIndex(_worksheet); + } + + #region IXLDataValidations Members + + IXLWorksheet IXLDataValidations.Worksheet => _worksheet; + + public IXLDataValidation Add(IXLDataValidation dataValidation) + { + return Add(dataValidation, skipIntersectionsCheck: false); + } + + internal IXLDataValidation Add(IXLDataValidation dataValidation, bool skipIntersectionsCheck) + { + if (dataValidation == null) throw new ArgumentNullException(nameof(dataValidation)); + + XLDataValidation xlDataValidation; + if (!(dataValidation is XLDataValidation) || + dataValidation.Ranges.Any(r => r.Worksheet != Worksheet)) + { + xlDataValidation = new XLDataValidation(dataValidation, Worksheet); + } + else + { + xlDataValidation = (XLDataValidation)dataValidation; + } + + xlDataValidation.RangeAdded += OnRangeAdded; + xlDataValidation.RangeRemoved += OnRangeRemoved; + + foreach (var range in xlDataValidation.Ranges) + { + ProcessRangeAdded(range, xlDataValidation, skipIntersectionsCheck); + } + + _dataValidations.Add(xlDataValidation); + + return xlDataValidation; + } + + public void Delete(Predicate predicate) + { + var dataValidationsToRemove = _dataValidations.Where(dv => predicate(dv)) + .ToList(); + + dataValidationsToRemove.ForEach(Delete); + } + + /// + /// Get the data validation rule for the range with the specified address if it exists. + /// + /// A range address. + /// Data validation rule which ranges collection includes the specified + /// address. The specified range should be fully covered with the data validation rule. + /// For example, if the rule is applied to ranges A1:A3,C1:C3 then this method will + /// return True for ranges A1:A3, C1:C2, A2:A3, and False for ranges A1:C3, A1:C1, etc. + /// True is the data validation rule was found, false otherwise. + public bool TryGet(IXLRangeAddress rangeAddress, out IXLDataValidation dataValidation) + { + dataValidation = null; + if (rangeAddress == null || !rangeAddress.IsValid) + return false; + + var candidates = _dataValidationIndex.GetIntersectedRanges((XLRangeAddress) rangeAddress) + .Where(c => c.RangeAddress.Contains(rangeAddress.FirstAddress) && + c.RangeAddress.Contains(rangeAddress.LastAddress)); + + if (!candidates.Any()) + return false; + + dataValidation = candidates.First().DataValidation; + + return true; + } + + /// + /// Get all data validation rules applied to ranges that intersect the specified range. + /// + public IEnumerable GetAllInRange(IXLRangeAddress rangeAddress) + { + if (rangeAddress == null || !rangeAddress.IsValid) + return Enumerable.Empty(); + + return _dataValidationIndex.GetIntersectedRanges((XLRangeAddress) rangeAddress) + .Select(indexEntry => indexEntry.DataValidation) + .Distinct(); + } + + + public IEnumerator GetEnumerator() + { + return _dataValidations.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public Boolean ContainsSingle(IXLRange range) + { + Int32 count = 0; + foreach (var xlDataValidation in _dataValidations.Where(dv => dv.Ranges.Contains(range))) + { + count++; + if (count > 1) return false; + } + + return count == 1; + } + + public void Delete(IXLDataValidation dataValidation) + { + if (!_dataValidations.Remove(dataValidation)) + return; + var xlDataValidation = dataValidation as XLDataValidation; + xlDataValidation.RangeAdded -= OnRangeAdded; + xlDataValidation.RangeRemoved -= OnRangeRemoved; + + foreach (var range in dataValidation.Ranges) + { + ProcessRangeRemoved(range); + } + } + + public void Delete(IXLRange range) + { + if (range == null) throw new ArgumentNullException(nameof(range)); + + var dataValidationsToRemove = _dataValidationIndex.GetIntersectedRanges((XLRangeAddress) range.RangeAddress) + .Select(e => e.DataValidation) + .Distinct() + .ToList(); + + dataValidationsToRemove.ForEach(Delete); + } + + #endregion IXLDataValidations Members + + public void Consolidate() + { + Func areEqual = (dv1, dv2) => + { + return + dv1.IgnoreBlanks == dv2.IgnoreBlanks && + dv1.InCellDropdown == dv2.InCellDropdown && + dv1.ShowErrorMessage == dv2.ShowErrorMessage && + dv1.ShowInputMessage == dv2.ShowInputMessage && + dv1.InputTitle == dv2.InputTitle && + dv1.InputMessage == dv2.InputMessage && + dv1.ErrorTitle == dv2.ErrorTitle && + dv1.ErrorMessage == dv2.ErrorMessage && + dv1.ErrorStyle == dv2.ErrorStyle && + dv1.AllowedValues == dv2.AllowedValues && + dv1.Operator == dv2.Operator && + dv1.MinValue == dv2.MinValue && + dv1.MaxValue == dv2.MaxValue && + dv1.Value == dv2.Value; + }; + + var rules = _dataValidations.ToList(); + rules.ForEach(Delete); + + while (rules.Any()) + { + var similarRules = rules.Where(r => areEqual(rules.First(), r)).ToList(); + similarRules.ForEach(r => rules.Remove(r)); + + var consRule = similarRules.First(); + var ranges = similarRules.SelectMany(dv => dv.Ranges).ToList(); + + IXLRanges consolidatedRanges = new XLRanges(); + ranges.ForEach(r => consolidatedRanges.Add(r)); + consolidatedRanges = consolidatedRanges.Consolidate(); + + consRule.ClearRanges(); + consRule.AddRanges(consolidatedRanges); + Add(consRule); + } + } + + + private void OnRangeAdded(object sender, RangeEventArgs e) + { + ProcessRangeAdded(e.Range, sender as XLDataValidation, skipIntersectionCheck: false); + } + private void OnRangeRemoved(object sender, RangeEventArgs e) + { + ProcessRangeRemoved(e.Range); + } + + private void ProcessRangeAdded(IXLRange range, XLDataValidation dataValidation, bool skipIntersectionCheck) + { + if (!skipIntersectionCheck) + { + SplitExistingRanges(range.RangeAddress); + } + + var indexEntry = new XLDataValidationIndexEntry(range.RangeAddress, dataValidation); + _dataValidationIndex.Add(indexEntry); + } + + /// + /// The flag used to avoid unnecessary check for splitting intersected ranges when we already + /// are performing the splitting. + /// + private bool _skipSplittingExistingRanges = false; + private void SplitExistingRanges(IXLRangeAddress rangeAddress) + { + if (_skipSplittingExistingRanges) return; + + try + { + _skipSplittingExistingRanges = true; + var entries = _dataValidationIndex.GetIntersectedRanges((XLRangeAddress) rangeAddress) + .ToList(); + + foreach (var entry in entries) + { + entry.DataValidation.SplitBy(rangeAddress); + } + } + finally + { + _skipSplittingExistingRanges = false; + } + + //TODO Remove empty data validations + } + + private void ProcessRangeRemoved(IXLRange range) + { + var entry = _dataValidationIndex.GetIntersectedRanges((XLRangeAddress) range.RangeAddress) + .SingleOrDefault(e => Equals(e.RangeAddress, range.RangeAddress)); + + if (entry != null) + { + _dataValidationIndex.Remove(entry.RangeAddress); + } + } + + /// + /// Class used for indexing data validation rules. + /// + private class XLDataValidationIndexEntry : IXLAddressable + { + /// + /// Gets an object with the boundaries of this range. + /// + public IXLRangeAddress RangeAddress { get; } + + public XLDataValidation DataValidation { get; } + + public XLDataValidationIndexEntry(IXLRangeAddress rangeAddress, XLDataValidation dataValidation) + { + RangeAddress = rangeAddress; + DataValidation = dataValidation; + } + } + } +} diff --git a/ClosedXML/Excel/DataValidation/XLDateCriteria.cs b/ClosedXML/Excel/DataValidation/XLDateCriteria.cs new file mode 100644 index 0000000..9f9bac0 --- /dev/null +++ b/ClosedXML/Excel/DataValidation/XLDateCriteria.cs @@ -0,0 +1,63 @@ +using System; +using System.Globalization; + +namespace ClosedXML.Excel +{ + public class XLDateCriteria : XLValidationCriteria + { + public XLDateCriteria(IXLDataValidation dataValidation) + : base(dataValidation) + { + } + + public void EqualTo(DateTime value) + { + dataValidation.Value = value.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.EqualTo; + } + + public void NotEqualTo(DateTime value) + { + dataValidation.Value = value.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.NotEqualTo; + } + + public void GreaterThan(DateTime value) + { + dataValidation.Value = value.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.GreaterThan; + } + + public void LessThan(DateTime value) + { + dataValidation.Value = value.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.LessThan; + } + + public void EqualOrGreaterThan(DateTime value) + { + dataValidation.Value = value.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + + public void EqualOrLessThan(DateTime value) + { + dataValidation.Value = value.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + + public void Between(DateTime minValue, DateTime maxValue) + { + dataValidation.MinValue = minValue.ToOADate().ToInvariantString(); + dataValidation.MaxValue = maxValue.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.Between; + } + + public void NotBetween(DateTime minValue, DateTime maxValue) + { + dataValidation.MinValue = minValue.ToOADate().ToInvariantString(); + dataValidation.MaxValue = maxValue.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.NotBetween; + } + } +} \ No newline at end of file diff --git a/ClosedXML/Excel/DataValidation/XLDecimalCriteria.cs b/ClosedXML/Excel/DataValidation/XLDecimalCriteria.cs new file mode 100644 index 0000000..88088a1 --- /dev/null +++ b/ClosedXML/Excel/DataValidation/XLDecimalCriteria.cs @@ -0,0 +1,62 @@ +using System; + +namespace ClosedXML.Excel +{ + public class XLDecimalCriteria : XLValidationCriteria + { + public XLDecimalCriteria(IXLDataValidation dataValidation) + : base(dataValidation) + { + } + + public void EqualTo(Double value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualTo; + } + + public void NotEqualTo(Double value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.NotEqualTo; + } + + public void GreaterThan(Double value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.GreaterThan; + } + + public void LessThan(Double value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.LessThan; + } + + public void EqualOrGreaterThan(Double value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + + public void EqualOrLessThan(Double value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + + public void Between(Double minValue, Double maxValue) + { + dataValidation.MinValue = minValue.ToString(); + dataValidation.MaxValue = maxValue.ToString(); + dataValidation.Operator = XLOperator.Between; + } + + public void NotBetween(Double minValue, Double maxValue) + { + dataValidation.MinValue = minValue.ToString(); + dataValidation.MaxValue = maxValue.ToString(); + dataValidation.Operator = XLOperator.NotBetween; + } + } +} \ No newline at end of file diff --git a/ClosedXML/Excel/DataValidation/XLTextLengthCriteria.cs b/ClosedXML/Excel/DataValidation/XLTextLengthCriteria.cs new file mode 100644 index 0000000..6a1ce41 --- /dev/null +++ b/ClosedXML/Excel/DataValidation/XLTextLengthCriteria.cs @@ -0,0 +1,62 @@ +using System; + +namespace ClosedXML.Excel +{ + public class XLTextLengthCriteria : XLValidationCriteria + { + public XLTextLengthCriteria(IXLDataValidation dataValidation) + : base(dataValidation) + { + } + + public void EqualTo(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualTo; + } + + public void NotEqualTo(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.NotEqualTo; + } + + public void GreaterThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.GreaterThan; + } + + public void LessThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.LessThan; + } + + public void EqualOrGreaterThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + + public void EqualOrLessThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + + public void Between(Int32 minValue, Int32 maxValue) + { + dataValidation.MinValue = minValue.ToString(); + dataValidation.MaxValue = maxValue.ToString(); + dataValidation.Operator = XLOperator.Between; + } + + public void NotBetween(Int32 minValue, Int32 maxValue) + { + dataValidation.MinValue = minValue.ToString(); + dataValidation.MaxValue = maxValue.ToString(); + dataValidation.Operator = XLOperator.NotBetween; + } + } +} \ No newline at end of file diff --git a/ClosedXML/Excel/DataValidation/XLTimeCriteria.cs b/ClosedXML/Excel/DataValidation/XLTimeCriteria.cs new file mode 100644 index 0000000..51a4f80 --- /dev/null +++ b/ClosedXML/Excel/DataValidation/XLTimeCriteria.cs @@ -0,0 +1,67 @@ +using System; + +namespace ClosedXML.Excel +{ + public class XLTimeCriteria : XLValidationCriteria + { + public XLTimeCriteria(IXLDataValidation dataValidation) + : base(dataValidation) + { + } + + private static String GetXLTime(TimeSpan value) + { + return (value.TotalHours / 24.0).ToString(); + } + + public void EqualTo(TimeSpan value) + { + dataValidation.Value = GetXLTime(value); + dataValidation.Operator = XLOperator.EqualTo; + } + + public void NotEqualTo(TimeSpan value) + { + dataValidation.Value = GetXLTime(value); + dataValidation.Operator = XLOperator.NotEqualTo; + } + + public void GreaterThan(TimeSpan value) + { + dataValidation.Value = GetXLTime(value); + dataValidation.Operator = XLOperator.GreaterThan; + } + + public void LessThan(TimeSpan value) + { + dataValidation.Value = GetXLTime(value); + dataValidation.Operator = XLOperator.LessThan; + } + + public void EqualOrGreaterThan(TimeSpan value) + { + dataValidation.Value = GetXLTime(value); + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + + public void EqualOrLessThan(TimeSpan value) + { + dataValidation.Value = GetXLTime(value); + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + + public void Between(TimeSpan minValue, TimeSpan maxValue) + { + dataValidation.MinValue = GetXLTime(minValue); + dataValidation.MaxValue = GetXLTime(maxValue); + dataValidation.Operator = XLOperator.Between; + } + + public void NotBetween(TimeSpan minValue, TimeSpan maxValue) + { + dataValidation.MinValue = GetXLTime(minValue); + dataValidation.MaxValue = GetXLTime(maxValue); + dataValidation.Operator = XLOperator.NotBetween; + } + } +} \ No newline at end of file diff --git a/ClosedXML/Excel/DataValidation/XLValidationCriteria.cs b/ClosedXML/Excel/DataValidation/XLValidationCriteria.cs new file mode 100644 index 0000000..8932e7f --- /dev/null +++ b/ClosedXML/Excel/DataValidation/XLValidationCriteria.cs @@ -0,0 +1,169 @@ +using System; + +namespace ClosedXML.Excel +{ + public abstract class XLValidationCriteria : IXLValidationCriteria + { + protected IXLDataValidation dataValidation; + + internal XLValidationCriteria(IXLDataValidation dataValidation) + { + this.dataValidation = dataValidation; + } + + #region IXLValidationCriteria Members + + public void EqualTo(String value) + { + dataValidation.Value = value; + dataValidation.Operator = XLOperator.EqualTo; + } + + public void NotEqualTo(String value) + { + dataValidation.Value = value; + dataValidation.Operator = XLOperator.NotEqualTo; + } + + public void GreaterThan(String value) + { + dataValidation.Value = value; + dataValidation.Operator = XLOperator.GreaterThan; + } + + public void LessThan(String value) + { + dataValidation.Value = value; + dataValidation.Operator = XLOperator.LessThan; + } + + public void EqualOrGreaterThan(String value) + { + dataValidation.Value = value; + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + + public void EqualOrLessThan(String value) + { + dataValidation.Value = value; + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + + public void Between(String minValue, String maxValue) + { + dataValidation.MinValue = minValue; + dataValidation.MaxValue = maxValue; + dataValidation.Operator = XLOperator.Between; + } + + public void NotBetween(String minValue, String maxValue) + { + dataValidation.MinValue = minValue; + dataValidation.MaxValue = maxValue; + dataValidation.Operator = XLOperator.NotBetween; + } + + + public void EqualTo(IXLRange range) + { + dataValidation.Value = range.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.EqualTo; + } + + public void NotEqualTo(IXLRange range) + { + dataValidation.Value = range.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.NotEqualTo; + } + + public void GreaterThan(IXLRange range) + { + dataValidation.Value = range.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.GreaterThan; + } + + public void LessThan(IXLRange range) + { + dataValidation.Value = range.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.LessThan; + } + + public void EqualOrGreaterThan(IXLRange range) + { + dataValidation.Value = range.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + + public void EqualOrLessThan(IXLRange range) + { + dataValidation.Value = range.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + + public void Between(IXLRange minValue, IXLRange maxValue) + { + dataValidation.MinValue = minValue.RangeAddress.ToStringFixed(); + dataValidation.MaxValue = maxValue.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.Between; + } + + public void NotBetween(IXLRange minValue, IXLRange maxValue) + { + dataValidation.MinValue = minValue.RangeAddress.ToStringFixed(); + dataValidation.MaxValue = maxValue.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.NotBetween; + } + + public void EqualTo(IXLCell cell) + { + dataValidation.Value = cell.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.EqualTo; + } + + public void NotEqualTo(IXLCell cell) + { + dataValidation.Value = cell.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.NotEqualTo; + } + + public void GreaterThan(IXLCell cell) + { + dataValidation.Value = cell.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.GreaterThan; + } + + public void LessThan(IXLCell cell) + { + dataValidation.Value = cell.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.LessThan; + } + + public void EqualOrGreaterThan(IXLCell cell) + { + dataValidation.Value = cell.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + + public void EqualOrLessThan(IXLCell cell) + { + dataValidation.Value = cell.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + + public void Between(IXLCell minValue, IXLCell maxValue) + { + dataValidation.MinValue = minValue.Address.ToStringFixed(); + dataValidation.MaxValue = maxValue.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.Between; + } + + public void NotBetween(IXLCell minValue, IXLCell maxValue) + { + dataValidation.MinValue = minValue.Address.ToStringFixed(); + dataValidation.MaxValue = maxValue.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.NotBetween; + } + + #endregion + } +} \ No newline at end of file diff --git a/ClosedXML/Excel/DataValidation/XLWholeNumberCriteria.cs b/ClosedXML/Excel/DataValidation/XLWholeNumberCriteria.cs new file mode 100644 index 0000000..2fdcef1 --- /dev/null +++ b/ClosedXML/Excel/DataValidation/XLWholeNumberCriteria.cs @@ -0,0 +1,57 @@ +using System; + +namespace ClosedXML.Excel +{ + public class XLWholeNumberCriteria : XLValidationCriteria + { + public XLWholeNumberCriteria(IXLDataValidation dataValidation): base(dataValidation) + { + + } + + public void EqualTo(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualTo; + } + public void NotEqualTo(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.NotEqualTo; + } + public void GreaterThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.GreaterThan; + } + public void LessThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.LessThan; + } + public void EqualOrGreaterThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + public void EqualOrLessThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + public void Between(Int32 minValue, Int32 maxValue) + { + dataValidation.MinValue = minValue.ToString(); + dataValidation.MaxValue = maxValue.ToString(); + dataValidation.Operator = XLOperator.Between; + } + public void NotBetween(Int32 minValue, Int32 maxValue) + { + dataValidation.MinValue = minValue.ToString(); + dataValidation.MaxValue = maxValue.ToString(); + dataValidation.Operator = XLOperator.NotBetween; + } + + + } +} diff --git a/ClosedXML/Excel/Drawings/IXLDrawing.cs b/ClosedXML/Excel/Drawings/IXLDrawing.cs new file mode 100644 index 0000000..c006315 --- /dev/null +++ b/ClosedXML/Excel/Drawings/IXLDrawing.cs @@ -0,0 +1,45 @@ +using System; + +namespace ClosedXML.Excel +{ + public enum XLDrawingAnchor { MoveAndSizeWithCells, MoveWithCells, Absolute} + public interface IXLDrawing + { + Int32 ShapeId { get; } + + Boolean Visible { get; set; } + T SetVisible(); + T SetVisible(Boolean hidden); + + ////String Name { get; set; } + ////T SetName(String name); + + ////String Description { get; set; } + ////T SetDescription(String description); + + IXLDrawingPosition Position { get; } + + Int32 ZOrder { get; set; } + T SetZOrder(Int32 zOrder); + + //Boolean HorizontalFlip { get; set; } + //T SetHorizontalFlip(); + //T SetHorizontalFlip(Boolean horizontalFlip); + + //Boolean VerticalFlip { get; set; } + //T SetVerticalFlip(); + //T SetVerticalFlip(Boolean verticalFlip); + + //Int32 Rotation { get; set; } + //T SetRotation(Int32 rotation); + + //Int32 ExtentLength { get; set; } + //T SetExtentLength(Int32 ExtentLength); + + //Int32 ExtentWidth { get; set; } + //T SetExtentWidth(Int32 extentWidth); + + IXLDrawingStyle Style { get; } + + } +} diff --git a/ClosedXML/Excel/Drawings/IXLDrawingPosition.cs b/ClosedXML/Excel/Drawings/IXLDrawingPosition.cs new file mode 100644 index 0000000..2b33229 --- /dev/null +++ b/ClosedXML/Excel/Drawings/IXLDrawingPosition.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingPosition + { + Int32 Column { get; set; } + IXLDrawingPosition SetColumn(Int32 column); + Double ColumnOffset { get; set; } + IXLDrawingPosition SetColumnOffset(Double columnOffset); + + Int32 Row { get; set; } + IXLDrawingPosition SetRow(Int32 row); + Double RowOffset { get; set; } + IXLDrawingPosition SetRowOffset(Double rowOffset); + } +} diff --git a/ClosedXML/Excel/Drawings/IXLPicture.cs b/ClosedXML/Excel/Drawings/IXLPicture.cs new file mode 100644 index 0000000..2036470 --- /dev/null +++ b/ClosedXML/Excel/Drawings/IXLPicture.cs @@ -0,0 +1,86 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Drawing; +using System.IO; + +namespace ClosedXML.Excel.Drawings +{ + public interface IXLPicture : IDisposable + { + IXLCell BottomRightCell { get; } + + /// + /// Type of image. The supported formats are defined by OpenXML's ImagePartType. + /// Default value is "jpeg" + /// + XLPictureFormat Format { get; } + + Int32 Height { get; set; } + + Int32 Id { get; } + + MemoryStream ImageStream { get; } + + Int32 Left { get; set; } + + String Name { get; set; } + + Int32 OriginalHeight { get; } + + Int32 OriginalWidth { get; } + + XLPicturePlacement Placement { get; set; } + + Int32 Top { get; set; } + + IXLCell TopLeftCell { get; } + + Int32 Width { get; set; } + + IXLWorksheet Worksheet { get; } + + /// + /// Create a copy of the picture on a different worksheet. + /// + /// The worksheet to which the picture will be copied. + /// A created copy of the picture. + IXLPicture CopyTo(IXLWorksheet targetSheet); + + /// + /// Deletes this picture. + /// + void Delete(); + + /// + /// Create a copy of the picture on the same worksheet. + /// + /// A created copy of the picture. + IXLPicture Duplicate(); + + Point GetOffset(XLMarkerPosition position); + + IXLPicture MoveTo(Int32 left, Int32 top); + + IXLPicture MoveTo(IXLCell cell); + + IXLPicture MoveTo(IXLCell cell, Int32 xOffset, Int32 yOffset); + + IXLPicture MoveTo(IXLCell cell, Point offset); + + IXLPicture MoveTo(IXLCell fromCell, IXLCell toCell); + + IXLPicture MoveTo(IXLCell fromCell, Int32 fromCellXOffset, Int32 fromCellYOffset, IXLCell toCell, Int32 toCellXOffset, Int32 toCellYOffset); + + IXLPicture MoveTo(IXLCell fromCell, Point fromOffset, IXLCell toCell, Point toOffset); + + IXLPicture Scale(Double factor, Boolean relativeToOriginal = false); + + IXLPicture ScaleHeight(Double factor, Boolean relativeToOriginal = false); + + IXLPicture ScaleWidth(Double factor, Boolean relativeToOriginal = false); + + IXLPicture WithPlacement(XLPicturePlacement value); + + IXLPicture WithSize(Int32 width, Int32 height); + } +} diff --git a/ClosedXML/Excel/Drawings/IXLPictures.cs b/ClosedXML/Excel/Drawings/IXLPictures.cs new file mode 100644 index 0000000..34ed782 --- /dev/null +++ b/ClosedXML/Excel/Drawings/IXLPictures.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; + +namespace ClosedXML.Excel.Drawings +{ + public interface IXLPictures : IEnumerable + { + int Count { get; } + + IXLPicture Add(Stream stream); + + IXLPicture Add(Stream stream, String name); + + IXLPicture Add(Stream stream, XLPictureFormat format); + + IXLPicture Add(Stream stream, XLPictureFormat format, String name); + + IXLPicture Add(Bitmap bitmap); + + IXLPicture Add(Bitmap bitmap, String name); + + IXLPicture Add(String imageFile); + + IXLPicture Add(String imageFile, String name); + + bool Contains(String pictureName); + + void Delete(String pictureName); + + void Delete(IXLPicture picture); + + IXLPicture Picture(String pictureName); + + bool TryGetPicture(String pictureName, out IXLPicture picture); + } +} diff --git a/ClosedXML/Excel/Drawings/PictureEnums.cs b/ClosedXML/Excel/Drawings/PictureEnums.cs new file mode 100644 index 0000000..f00f85b --- /dev/null +++ b/ClosedXML/Excel/Drawings/PictureEnums.cs @@ -0,0 +1,28 @@ +namespace ClosedXML.Excel.Drawings +{ + public enum XLMarkerPosition + { + TopLeft, + BottomRight + } + + public enum XLPictureFormat + { + Bmp = 0, + Gif = 1, + Png = 2, + Tiff = 3, + Icon = 4, + Pcx = 5, + Jpeg = 6 + //Emf = 7, + //Wmf = 8 + } + + public enum XLPicturePlacement + { + MoveAndSize = 0, + Move = 1, + FreeFloating = 2 + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingAlignment.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingAlignment.cs new file mode 100644 index 0000000..eb68bbb --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingAlignment.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public enum XLDrawingTextDirection + { + Context, + LeftToRight, + RightToLeft + } + public enum XLDrawingTextOrientation + { + LeftToRight, + Vertical, + BottomToTop, + TopToBottom + } + public enum XLDrawingHorizontalAlignment { Left, Justify, Center, Right, Distributed } + public enum XLDrawingVerticalAlignment { Top, Justify, Center, Bottom, Distributed } + public interface IXLDrawingAlignment + { + XLDrawingHorizontalAlignment Horizontal { get; set; } + XLDrawingVerticalAlignment Vertical { get; set; } + Boolean AutomaticSize { get; set; } + XLDrawingTextDirection Direction { get; set; } + XLDrawingTextOrientation Orientation { get; set; } + + IXLDrawingStyle SetHorizontal(XLDrawingHorizontalAlignment value); + IXLDrawingStyle SetVertical(XLDrawingVerticalAlignment value); + IXLDrawingStyle SetAutomaticSize(); IXLDrawingStyle SetAutomaticSize(Boolean value); + IXLDrawingStyle SetDirection(XLDrawingTextDirection value); + IXLDrawingStyle SetOrientation(XLDrawingTextOrientation value); + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingColorsAndLines.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingColorsAndLines.cs new file mode 100644 index 0000000..72a6fec --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingColorsAndLines.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public enum XLDashStyle + { + Solid, + RoundDot, + SquareDot, + Dash, + DashDot, + LongDash, + LongDashDot, + LongDashDotDot + } + public enum XLLineStyle + { + Single, ThinThin, ThinThick, ThickThin, ThickBetweenThin + } + public interface IXLDrawingColorsAndLines + { + XLColor FillColor { get; set; } + Double FillTransparency { get; set; } + XLColor LineColor { get; set; } + Double LineTransparency { get; set; } + Double LineWeight { get; set; } + XLDashStyle LineDash { get; set; } + XLLineStyle LineStyle { get; set; } + + IXLDrawingStyle SetFillColor(XLColor value); + IXLDrawingStyle SetFillTransparency(Double value); + IXLDrawingStyle SetLineColor(XLColor value); + IXLDrawingStyle SetLineTransparency(Double value); + IXLDrawingStyle SetLineWeight(Double value); + IXLDrawingStyle SetLineDash(XLDashStyle value); + IXLDrawingStyle SetLineStyle(XLLineStyle value); + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingFont.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingFont.cs new file mode 100644 index 0000000..878f23b --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingFont.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingFont : IXLFontBase + { + IXLDrawingStyle SetBold(); IXLDrawingStyle SetBold(Boolean value); + IXLDrawingStyle SetItalic(); IXLDrawingStyle SetItalic(Boolean value); + IXLDrawingStyle SetUnderline(); IXLDrawingStyle SetUnderline(XLFontUnderlineValues value); + IXLDrawingStyle SetStrikethrough(); IXLDrawingStyle SetStrikethrough(Boolean value); + IXLDrawingStyle SetVerticalAlignment(XLFontVerticalTextAlignmentValues value); + IXLDrawingStyle SetShadow(); IXLDrawingStyle SetShadow(Boolean value); + IXLDrawingStyle SetFontSize(Double value); + IXLDrawingStyle SetFontColor(XLColor value); + IXLDrawingStyle SetFontName(String value); + IXLDrawingStyle SetFontFamilyNumbering(XLFontFamilyNumberingValues value); + IXLDrawingStyle SetFontCharSet(XLFontCharSet value); + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingMargins.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingMargins.cs new file mode 100644 index 0000000..759cd44 --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingMargins.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingMargins + { + Boolean Automatic { get; set; } + Double Left { get; set; } + Double Right { get; set; } + Double Top { get; set; } + Double Bottom { get; set; } + Double All { set; } + + IXLDrawingStyle SetAutomatic(); IXLDrawingStyle SetAutomatic(Boolean value); + IXLDrawingStyle SetLeft(Double value); + IXLDrawingStyle SetRight(Double value); + IXLDrawingStyle SetTop(Double value); + IXLDrawingStyle SetBottom(Double value); + IXLDrawingStyle SetAll(Double value); + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingProperties.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingProperties.cs new file mode 100644 index 0000000..6157946 --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingProperties.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingProperties + { + XLDrawingAnchor Positioning { get; set; } + IXLDrawingStyle SetPositioning(XLDrawingAnchor value); + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingProtection.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingProtection.cs new file mode 100644 index 0000000..36f896b --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingProtection.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingProtection + { + Boolean Locked { get; set; } + Boolean LockText { get; set; } + + IXLDrawingStyle SetLocked(); IXLDrawingStyle SetLocked(Boolean value); + IXLDrawingStyle SetLockText(); IXLDrawingStyle SetLockText(Boolean value); + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingSize.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingSize.cs new file mode 100644 index 0000000..5b83d32 --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingSize.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingSize + { + Boolean AutomaticSize { get; set; } + Double Height { get; set; } + Double Width { get; set; } + + IXLDrawingStyle SetAutomaticSize(); IXLDrawingStyle SetAutomaticSize(Boolean value); + IXLDrawingStyle SetHeight(Double value); + IXLDrawingStyle SetWidth(Double value); + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingStyle.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingStyle.cs new file mode 100644 index 0000000..9eed6a8 --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingStyle.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingStyle + { + //IXLDrawingFont Font { get; } + IXLDrawingAlignment Alignment { get; } + IXLDrawingColorsAndLines ColorsAndLines { get; } + IXLDrawingSize Size { get; } + IXLDrawingProtection Protection { get; } + IXLDrawingProperties Properties { get; } + IXLDrawingMargins Margins { get; } + IXLDrawingWeb Web { get; } + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingWeb.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingWeb.cs new file mode 100644 index 0000000..0032488 --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingWeb.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingWeb + { + String AlternateText { get; set; } + IXLDrawingStyle SetAlternateText(String value); + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingAlignment.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingAlignment.cs new file mode 100644 index 0000000..3da9f89 --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingAlignment.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingAlignment: IXLDrawingAlignment + { + private readonly IXLDrawingStyle _style; + + public XLDrawingAlignment(IXLDrawingStyle style) + { + _style = style; + } + public XLDrawingHorizontalAlignment Horizontal { get; set; } public IXLDrawingStyle SetHorizontal(XLDrawingHorizontalAlignment value) { Horizontal = value; return _style; } + public XLDrawingVerticalAlignment Vertical { get; set; } public IXLDrawingStyle SetVertical(XLDrawingVerticalAlignment value) { Vertical = value; return _style; } + public Boolean AutomaticSize { get; set; } public IXLDrawingStyle SetAutomaticSize() { AutomaticSize = true; return _style; } public IXLDrawingStyle SetAutomaticSize(Boolean value) { AutomaticSize = value; return _style; } + public XLDrawingTextDirection Direction { get; set; } public IXLDrawingStyle SetDirection(XLDrawingTextDirection value) { Direction = value; return _style; } + public XLDrawingTextOrientation Orientation { get; set; } public IXLDrawingStyle SetOrientation(XLDrawingTextOrientation value) { Orientation = value; return _style; } + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingColorsAndLines.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingColorsAndLines.cs new file mode 100644 index 0000000..ec8e4db --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingColorsAndLines.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingColorsAndLines: IXLDrawingColorsAndLines + { + private readonly IXLDrawingStyle _style; + + public XLDrawingColorsAndLines(IXLDrawingStyle style) + { + _style = style; + } + public XLColor FillColor { get; set; } public IXLDrawingStyle SetFillColor(XLColor value) { FillColor = value; return _style; } + public Double FillTransparency { get; set; } public IXLDrawingStyle SetFillTransparency(Double value) { FillTransparency = value; return _style; } + public XLColor LineColor { get; set; } public IXLDrawingStyle SetLineColor(XLColor value) { LineColor = value; return _style; } + public Double LineTransparency { get; set; } public IXLDrawingStyle SetLineTransparency(Double value) { LineTransparency = value; return _style; } + public Double LineWeight { get; set; } public IXLDrawingStyle SetLineWeight(Double value) { LineWeight = value; return _style; } + public XLDashStyle LineDash { get; set; } public IXLDrawingStyle SetLineDash(XLDashStyle value) { LineDash = value; return _style; } + public XLLineStyle LineStyle { get; set; } public IXLDrawingStyle SetLineStyle(XLLineStyle value) { LineStyle = value; return _style; } + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingFont.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingFont.cs new file mode 100644 index 0000000..744d781 --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingFont.cs @@ -0,0 +1,127 @@ +using System; + +namespace ClosedXML.Excel +{ + internal class XLDrawingFont : IXLDrawingFont + { + private readonly IXLDrawingStyle _style; + + public XLDrawingFont(IXLDrawingStyle style) + { + _style = style; + FontName = "Tahoma"; + FontSize = 9; + Underline = XLFontUnderlineValues.None; + FontColor = XLColor.FromIndex(64); + } + + public Boolean Bold { get; set; } + public Boolean Italic { get; set; } + public XLFontUnderlineValues Underline { get; set; } + public Boolean Strikethrough { get; set; } + public XLFontVerticalTextAlignmentValues VerticalAlignment { get; set; } + public Boolean Shadow { get; set; } + public Double FontSize { get; set; } + public XLColor FontColor { get; set; } + public String FontName { get; set; } + public XLFontFamilyNumberingValues FontFamilyNumbering { get; set; } + + public XLFontCharSet FontCharSet { get; set; } + + public IXLDrawingStyle SetBold() + { + Bold = true; + return _style; + } + + public IXLDrawingStyle SetBold(Boolean value) + { + Bold = value; + return _style; + } + + public IXLDrawingStyle SetItalic() + { + Italic = true; + return _style; + } + + public IXLDrawingStyle SetItalic(Boolean value) + { + Italic = value; + return _style; + } + + public IXLDrawingStyle SetUnderline() + { + Underline = XLFontUnderlineValues.Single; + return _style; + } + + public IXLDrawingStyle SetUnderline(XLFontUnderlineValues value) + { + Underline = value; + return _style; + } + + public IXLDrawingStyle SetStrikethrough() + { + Strikethrough = true; + return _style; + } + + public IXLDrawingStyle SetStrikethrough(Boolean value) + { + Strikethrough = value; + return _style; + } + + public IXLDrawingStyle SetVerticalAlignment(XLFontVerticalTextAlignmentValues value) + { + VerticalAlignment = value; + return _style; + } + + public IXLDrawingStyle SetShadow() + { + Shadow = true; + return _style; + } + + public IXLDrawingStyle SetShadow(Boolean value) + { + Shadow = value; + return _style; + } + + public IXLDrawingStyle SetFontSize(Double value) + { + FontSize = value; + return _style; + } + + public IXLDrawingStyle SetFontColor(XLColor value) + { + FontColor = value; + return _style; + } + + public IXLDrawingStyle SetFontName(String value) + { + FontName = value; + return _style; + } + + public IXLDrawingStyle SetFontFamilyNumbering(XLFontFamilyNumberingValues value) + { + FontFamilyNumbering = value; + return _style; + } + + public IXLDrawingStyle SetFontCharSet(XLFontCharSet value) + { + FontCharSet = value; + return _style; + } + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingMargins.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingMargins.cs new file mode 100644 index 0000000..650f7a1 --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingMargins.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingMargins: IXLDrawingMargins + { + private readonly IXLDrawingStyle _style; + public XLDrawingMargins(IXLDrawingStyle style) + { + _style = style; + } + public Boolean Automatic { get; set; } public IXLDrawingStyle SetAutomatic() { Automatic = true; return _style; } public IXLDrawingStyle SetAutomatic(Boolean value) { Automatic = value; return _style; } + Double _left; + public Double Left { get { return _left; } set { _left = value; Automatic = false; } } + public IXLDrawingStyle SetLeft(Double value) { Left = value; return _style; } + Double _right; + public Double Right { get { return _right; } set { _right = value; Automatic = false; } } public IXLDrawingStyle SetRight(Double value) { Right = value; return _style; } + Double _top; + public Double Top { get { return _top; } set { _top = value; Automatic = false; } } public IXLDrawingStyle SetTop(Double value) { Top = value; return _style; } + Double _bottom; + public Double Bottom { get { return _bottom; } set { _bottom = value; Automatic = false; } } public IXLDrawingStyle SetBottom(Double value) { Bottom = value; return _style; } + public Double All + { + set + { + _left = value; + _right = value; + _top = value; + _bottom = value; + Automatic = false; + } + } + public IXLDrawingStyle SetAll(Double value) { All = value; return _style; } + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingProperties.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingProperties.cs new file mode 100644 index 0000000..a702762 --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingProperties.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingProperties : IXLDrawingProperties + { + private readonly IXLDrawingStyle _style; + + public XLDrawingProperties(IXLDrawingStyle style) + { + _style = style; + } + public XLDrawingAnchor Positioning { get; set; } public IXLDrawingStyle SetPositioning(XLDrawingAnchor value) { Positioning = value; return _style; } + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingProtection.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingProtection.cs new file mode 100644 index 0000000..8d0c570 --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingProtection.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingProtection : IXLDrawingProtection + { + private readonly IXLDrawingStyle _style; + + public XLDrawingProtection(IXLDrawingStyle style) + { + _style = style; + } + public Boolean Locked { get; set; } public IXLDrawingStyle SetLocked() { Locked = true; return _style; } public IXLDrawingStyle SetLocked(Boolean value) { Locked = value; return _style; } + public Boolean LockText { get; set; } public IXLDrawingStyle SetLockText() { LockText = true; return _style; } public IXLDrawingStyle SetLockText(Boolean value) { LockText = value; return _style; } + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingSize.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingSize.cs new file mode 100644 index 0000000..84f4f1b --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingSize.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingSize : IXLDrawingSize + { + private readonly IXLDrawingStyle _style; + + public XLDrawingSize(IXLDrawingStyle style) + { + _style = style; + } + + public Boolean AutomaticSize { get { return _style.Alignment.AutomaticSize; } set { _style.Alignment.AutomaticSize = value; } } + public IXLDrawingStyle SetAutomaticSize() { AutomaticSize = true; return _style; } public IXLDrawingStyle SetAutomaticSize(Boolean value) { AutomaticSize = value; return _style; } + public Double Height { get; set; } public IXLDrawingStyle SetHeight(Double value) { Height = value; return _style; } + public Double Width { get; set; } public IXLDrawingStyle SetWidth(Double value) { Width = value; return _style; } + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingStyle.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingStyle.cs new file mode 100644 index 0000000..6fd952a --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingStyle.cs @@ -0,0 +1,60 @@ +namespace ClosedXML.Excel +{ + internal class XLDrawingStyle : IXLDrawingStyle + { + public XLDrawingStyle() + { + //Font = new XLDrawingFont(this); + Alignment = new XLDrawingAlignment(this); + ColorsAndLines = new XLDrawingColorsAndLines(this); + Size = new XLDrawingSize(this); + Protection = new XLDrawingProtection(this); + Properties = new XLDrawingProperties(this); + Margins = new XLDrawingMargins(this); + Web = new XLDrawingWeb(this); + } + + //public IXLDrawingFont Font { get; private set; } + public IXLDrawingAlignment Alignment { get; private set; } + + public IXLDrawingColorsAndLines ColorsAndLines { get; private set; } + public IXLDrawingSize Size { get; private set; } + public IXLDrawingProtection Protection { get; private set; } + public IXLDrawingProperties Properties { get; private set; } + public IXLDrawingMargins Margins { get; private set; } + public IXLDrawingWeb Web { get; private set; } + + public static IXLDrawingStyle DefaultCommentStyle + { + get + { + var defaultCommentStyle = new XLDrawingStyle(); + + defaultCommentStyle + .Margins.SetLeft(0.1) + .Margins.SetRight(0.1) + .Margins.SetTop(0.05) + .Margins.SetBottom(0.05) + .Margins.SetAutomatic() + .Size.SetHeight(59.25) + .Size.SetWidth(19.2) + .ColorsAndLines.SetLineColor(XLColor.Black) + .ColorsAndLines.SetFillColor(XLColor.FromArgb(255, 255, 225)) + .ColorsAndLines.SetLineDash(XLDashStyle.Solid) + .ColorsAndLines.SetLineStyle(XLLineStyle.Single) + .ColorsAndLines.SetLineWeight(0.75) + .ColorsAndLines.SetFillTransparency(1) + .ColorsAndLines.SetLineTransparency(1) + .Alignment.SetHorizontal(XLDrawingHorizontalAlignment.Left) + .Alignment.SetVertical(XLDrawingVerticalAlignment.Top) + .Alignment.SetDirection(XLDrawingTextDirection.LeftToRight) + .Alignment.SetOrientation(XLDrawingTextOrientation.LeftToRight) + .Properties.SetPositioning(XLDrawingAnchor.Absolute) + .Protection.SetLocked() + .Protection.SetLockText(); + + return defaultCommentStyle; + } + } + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingWeb.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingWeb.cs new file mode 100644 index 0000000..f47cb3b --- /dev/null +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingWeb.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingWeb : IXLDrawingWeb + { + private readonly IXLDrawingStyle _style; + + public XLDrawingWeb(IXLDrawingStyle style) + { + _style = style; + } + public String AlternateText { get; set; } public IXLDrawingStyle SetAlternateText(String value) { AlternateText = value; return _style; } + + } +} diff --git a/ClosedXML/Excel/Drawings/XLDrawing.cs b/ClosedXML/Excel/Drawings/XLDrawing.cs new file mode 100644 index 0000000..c3e3a83 --- /dev/null +++ b/ClosedXML/Excel/Drawings/XLDrawing.cs @@ -0,0 +1,114 @@ +using System; + +namespace ClosedXML.Excel +{ + internal class XLDrawing: IXLDrawing + { + internal T Container; + public XLDrawing() + { + Style = new XLDrawingStyle(); + Position = new XLDrawingPosition(); + } + + public Int32 ShapeId { get; internal set; } + + public Boolean Visible { get; set; } + public T SetVisible() + { + Visible = true; + return Container; + } + public T SetVisible(Boolean hidden) + { + Visible = hidden; + return Container; + } + + public String Name { get; set; } + public T SetName(String name) + { + Name = name; + return Container; + } + + public String Description { get; set; } + public T SetDescription(String description) + { + Description = description; + return Container; + } + + public IXLDrawingPosition Position { get; private set; } + + public Int32 ZOrder { get; set; } + public T SetZOrder(Int32 zOrder) + { + ZOrder = zOrder; + return Container; + } + + public Boolean HorizontalFlip { get; set; } + public T SetHorizontalFlip() + { + HorizontalFlip = true; + return Container; + } + public T SetHorizontalFlip(Boolean horizontalFlip) + { + HorizontalFlip = horizontalFlip; + return Container; + } + + public Boolean VerticalFlip { get; set; } + public T SetVerticalFlip() + { + VerticalFlip = true; + return Container; + } + public T SetVerticalFlip(Boolean verticalFlip) + { + VerticalFlip = verticalFlip; + return Container; + } + + public Int32 Rotation { get; set; } + public T SetRotation(Int32 rotation) + { + Rotation = rotation; + return Container; + } + + public Int32 OffsetX { get; set; } + public T SetOffsetX(Int32 offsetX) + { + OffsetX = offsetX; + return Container; + } + + public Int32 OffsetY { get; set; } + public T SetOffsetY(Int32 offsetY) + { + OffsetY = offsetY; + return Container; + } + + public Int32 ExtentLength { get; set; } + public T SetExtentLength(Int32 extentLength) + { + ExtentLength = extentLength; + return Container; + } + + public Int32 ExtentWidth { get; set; } + public T SetExtentWidth(Int32 extentWidth) + { + ExtentWidth = extentWidth; + return Container; + } + + public IXLDrawingStyle Style { get; private set; } + + + } +} diff --git a/ClosedXML/Excel/Drawings/XLDrawingPosition.cs b/ClosedXML/Excel/Drawings/XLDrawingPosition.cs new file mode 100644 index 0000000..b7309f2 --- /dev/null +++ b/ClosedXML/Excel/Drawings/XLDrawingPosition.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingPosition: IXLDrawingPosition + { + public Int32 Column { get; set; } + public IXLDrawingPosition SetColumn(Int32 column) { Column = column; return this; } + public Double ColumnOffset { get; set; } + public IXLDrawingPosition SetColumnOffset(Double columnOffset) { ColumnOffset = columnOffset; return this; } + + public Int32 Row { get; set; } + public IXLDrawingPosition SetRow(Int32 row) { Row = row; return this; } + public Double RowOffset { get; set; } + public IXLDrawingPosition SetRowOffset(Double rowOffset) { RowOffset = rowOffset; return this; } + } +} diff --git a/ClosedXML/Excel/Drawings/XLMarker.cs b/ClosedXML/Excel/Drawings/XLMarker.cs new file mode 100644 index 0000000..57d496a --- /dev/null +++ b/ClosedXML/Excel/Drawings/XLMarker.cs @@ -0,0 +1,37 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Diagnostics; +using System.Drawing; + +namespace ClosedXML.Excel.Drawings +{ + [DebuggerDisplay("{Address} {Offset}")] + internal class XLMarker + { + // Using a range to store the location so that it gets added to the range repository + // and hence will be adjusted when there are insertions / deletions + private readonly IXLRange rangeCell; + + internal XLMarker(IXLCell cell) + : this(cell.AsRange(), new Point(0, 0)) + { } + + internal XLMarker(IXLCell cell, Point offset) + : this(cell.AsRange(), offset) + { } + + private XLMarker(IXLRange rangeCell, Point offset) + { + if (rangeCell.RowCount() != 1 || rangeCell.ColumnCount() != 1) + throw new ArgumentException("Range should contain only one cell.", nameof(rangeCell)); + + this.rangeCell = rangeCell; + this.Offset = offset; + } + + public IXLCell Cell { get => rangeCell.FirstCell(); } + public Int32 ColumnNumber { get => rangeCell.RangeAddress.FirstAddress.ColumnNumber; } + public Point Offset { get; set; } + public Int32 RowNumber { get => rangeCell.RangeAddress.FirstAddress.RowNumber; } + } +} diff --git a/ClosedXML/Excel/Drawings/XLPicture.cs b/ClosedXML/Excel/Drawings/XLPicture.cs new file mode 100644 index 0000000..6dd3776 --- /dev/null +++ b/ClosedXML/Excel/Drawings/XLPicture.cs @@ -0,0 +1,448 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Reflection; + +namespace ClosedXML.Excel.Drawings +{ + [DebuggerDisplay("{Name}")] + internal class XLPicture : IXLPicture + { + private const String InvalidNameChars = @":\/?*[]"; + private static IDictionary FormatMap; + private Int32 height; + private Int32 id; + private String name = string.Empty; + private Int32 width; + + static XLPicture() + { + var properties = typeof(ImageFormat).GetProperties(BindingFlags.Static | BindingFlags.Public); + FormatMap = Enum.GetValues(typeof(XLPictureFormat)) + .Cast() + .Where(pf => properties.Any(pi => pi.Name.Equals(pf.ToString(), StringComparison.OrdinalIgnoreCase))) + .ToDictionary( + pf => pf, + pf => properties.Single(pi => pi.Name.Equals(pf.ToString(), StringComparison.OrdinalIgnoreCase)).GetValue(null, null) as ImageFormat + ); + } + + internal XLPicture(IXLWorksheet worksheet, Stream stream) + : this(worksheet) + { + if (stream == null) throw new ArgumentNullException(nameof(stream)); + + this.ImageStream = new MemoryStream(); + { + stream.Position = 0; + stream.CopyTo(ImageStream); + ImageStream.Seek(0, SeekOrigin.Begin); + + using (var bitmap = new Bitmap(ImageStream)) + { + if (FormatMap.Values.Select(f => f.Guid).Contains(bitmap.RawFormat.Guid)) + this.Format = FormatMap.Single(f => f.Value.Guid.Equals(bitmap.RawFormat.Guid)).Key; + + DeduceDimensionsFromBitmap(bitmap); + } + ImageStream.Seek(0, SeekOrigin.Begin); + } + } + + internal XLPicture(IXLWorksheet worksheet, Stream stream, XLPictureFormat format) + : this(worksheet) + { + if (stream == null) throw new ArgumentNullException(nameof(stream)); + this.Format = format; + + this.ImageStream = new MemoryStream(); + { + stream.Position = 0; + stream.CopyTo(ImageStream); + ImageStream.Seek(0, SeekOrigin.Begin); + + using (var bitmap = new Bitmap(ImageStream)) + { + if (FormatMap.TryGetValue(this.Format, out ImageFormat imageFormat) && imageFormat.Guid != bitmap.RawFormat.Guid) + throw new ArgumentException("The picture format in the stream and the parameter don't match"); + + DeduceDimensionsFromBitmap(bitmap); + } + ImageStream.Seek(0, SeekOrigin.Begin); + } + } + + internal XLPicture(IXLWorksheet worksheet, Bitmap bitmap) + : this(worksheet) + { + if (bitmap == null) throw new ArgumentNullException(nameof(bitmap)); + this.ImageStream = new MemoryStream(); + bitmap.Save(ImageStream, bitmap.RawFormat); + ImageStream.Seek(0, SeekOrigin.Begin); + DeduceDimensionsFromBitmap(bitmap); + + var formats = FormatMap.Where(f => f.Value.Guid.Equals(bitmap.RawFormat.Guid)); + if (!formats.Any() || formats.Count() > 1) + throw new ArgumentException("Unsupported or unknown image format in bitmap"); + + this.Format = formats.Single().Key; + } + + private XLPicture(IXLWorksheet worksheet) + { + this.Worksheet = worksheet ?? throw new ArgumentNullException(nameof(worksheet)); + this.Placement = XLPicturePlacement.MoveAndSize; + this.Markers = new Dictionary() + { + [XLMarkerPosition.TopLeft] = null, + [XLMarkerPosition.BottomRight] = null + }; + + // Calculate default picture ID + var allPictures = worksheet.Workbook.Worksheets.SelectMany(ws => ws.Pictures); + if (allPictures.Any()) + this.id = allPictures.Max(p => p.Id) + 1; + else + this.id = 1; + } + + public IXLCell BottomRightCell + { + get + { + return Markers[XLMarkerPosition.BottomRight].Cell; + } + + private set + { + if (!value.Worksheet.Equals(this.Worksheet)) + throw new InvalidOperationException("A picture and its anchor cells must be on the same worksheet"); + + this.Markers[XLMarkerPosition.BottomRight] = new XLMarker(value); + } + } + + public XLPictureFormat Format { get; private set; } + + public Int32 Height + { + get { return height; } + set + { + if (this.Placement == XLPicturePlacement.MoveAndSize) + throw new ArgumentException("To set the height, the placement should be FreeFloating or Move"); + height = value; + } + } + + public Int32 Id + { + get { return id; } + internal set + { + if ((Worksheet.Pictures.FirstOrDefault(p => p.Id.Equals(value)) ?? this) != this) + throw new ArgumentException($"The picture ID '{value}' already exists."); + + id = value; + } + } + + public MemoryStream ImageStream { get; private set; } + + public Int32 Left + { + get { return Markers[XLMarkerPosition.TopLeft]?.Offset.X ?? 0; } + set + { + if (this.Placement != XLPicturePlacement.FreeFloating) + throw new ArgumentException("To set the left-hand offset, the placement should be FreeFloating"); + + Markers[XLMarkerPosition.TopLeft] = new XLMarker(Worksheet.Cell(1, 1), new Point(value, this.Top)); + } + } + + public String Name + { + get { return name; } + set + { + if (name == value) return; + + if ((Worksheet.Pictures.FirstOrDefault(p => p.Name.Equals(value, StringComparison.OrdinalIgnoreCase)) ?? this) != this) + throw new ArgumentException($"The picture name '{value}' already exists."); + + SetName(value); + } + } + + public Int32 OriginalHeight { get; private set; } + + public Int32 OriginalWidth { get; private set; } + + public XLPicturePlacement Placement { get; set; } + + public Int32 Top + { + get { return Markers[XLMarkerPosition.TopLeft]?.Offset.Y ?? 0; } + set + { + if (this.Placement != XLPicturePlacement.FreeFloating) + throw new ArgumentException("To set the top offset, the placement should be FreeFloating"); + + Markers[XLMarkerPosition.TopLeft] = new XLMarker(Worksheet.Cell(1, 1), new Point(this.Left, value)); + } + } + + public IXLCell TopLeftCell + { + get + { + return Markers[XLMarkerPosition.TopLeft].Cell; + } + + private set + { + if (!value.Worksheet.Equals(this.Worksheet)) + throw new InvalidOperationException("A picture and its anchor cells must be on the same worksheet"); + + this.Markers[XLMarkerPosition.TopLeft] = new XLMarker(value); + } + } + + public Int32 Width + { + get { return width; } + set + { + if (this.Placement == XLPicturePlacement.MoveAndSize) + throw new ArgumentException("To set the width, the placement should be FreeFloating or Move"); + width = value; + } + } + + public IXLWorksheet Worksheet { get; } + + internal IDictionary Markers { get; private set; } + + internal String RelId { get; set; } + + /// + /// Create a copy of the picture on a different worksheet. + /// + /// The worksheet to which the picture will be copied. + /// A created copy of the picture. + public IXLPicture CopyTo(IXLWorksheet targetSheet) + { + return CopyTo((XLWorksheet)targetSheet); + } + + public void Delete() + { + Worksheet.Pictures.Delete(this.Name); + } + + // Used by Janitor.Fody + private void DisposeManaged() + { + this.ImageStream.Dispose(); + } + +#if _NET40_ + + public void Dispose() + { + // net40 doesn't support Janitor.Fody, so let's dispose manually + DisposeManaged(); + } + +#else + + public void Dispose() + { + // Leave this empty (for non net40 targets) so that Janitor.Fody can do its work + } + +#endif + + /// + /// Create a copy of the picture on the same worksheet. + /// + /// A created copy of the picture. + public IXLPicture Duplicate() + { + return CopyTo(Worksheet); + } + + public Point GetOffset(XLMarkerPosition position) + { + return Markers[position].Offset; + } + + public IXLPicture MoveTo(Int32 left, Int32 top) + { + this.Placement = XLPicturePlacement.FreeFloating; + this.Left = left; + this.Top = top; + return this; + } + + public IXLPicture MoveTo(IXLCell cell) + { + return MoveTo(cell, 0, 0); + } + + public IXLPicture MoveTo(IXLCell cell, Int32 xOffset, Int32 yOffset) + { + return MoveTo(cell, new Point(xOffset, yOffset)); + } + + public IXLPicture MoveTo(IXLCell cell, Point offset) + { + if (cell == null) throw new ArgumentNullException(nameof(cell)); + this.Placement = XLPicturePlacement.Move; + this.TopLeftCell = cell; + this.Markers[XLMarkerPosition.TopLeft].Offset = offset; + return this; + } + + public IXLPicture MoveTo(IXLCell fromCell, IXLCell toCell) + { + return MoveTo(fromCell, 0, 0, toCell, 0, 0); + } + + public IXLPicture MoveTo(IXLCell fromCell, Int32 fromCellXOffset, Int32 fromCellYOffset, IXLCell toCell, Int32 toCellXOffset, Int32 toCellYOffset) + { + return MoveTo(fromCell, new Point(fromCellXOffset, fromCellYOffset), toCell, new Point(toCellXOffset, toCellYOffset)); + } + + public IXLPicture MoveTo(IXLCell fromCell, Point fromOffset, IXLCell toCell, Point toOffset) + { + if (fromCell == null) throw new ArgumentNullException(nameof(fromCell)); + if (toCell == null) throw new ArgumentNullException(nameof(toCell)); + this.Placement = XLPicturePlacement.MoveAndSize; + + this.TopLeftCell = fromCell; + this.Markers[XLMarkerPosition.TopLeft].Offset = fromOffset; + + this.BottomRightCell = toCell; + this.Markers[XLMarkerPosition.BottomRight].Offset = toOffset; + + return this; + } + + public IXLPicture Scale(Double factor, Boolean relativeToOriginal = false) + { + return this.ScaleHeight(factor, relativeToOriginal).ScaleWidth(factor, relativeToOriginal); + } + + public IXLPicture ScaleHeight(Double factor, Boolean relativeToOriginal = false) + { + this.Height = Convert.ToInt32((relativeToOriginal ? this.OriginalHeight : this.Height) * factor); + return this; + } + + public IXLPicture ScaleWidth(Double factor, Boolean relativeToOriginal = false) + { + this.Width = Convert.ToInt32((relativeToOriginal ? this.OriginalWidth : this.Width) * factor); + return this; + } + + public IXLPicture WithPlacement(XLPicturePlacement value) + { + this.Placement = value; + return this; + } + + public IXLPicture WithSize(Int32 width, Int32 height) + { + this.Width = width; + this.Height = height; + return this; + } + + internal IXLPicture CopyTo(XLWorksheet targetSheet) + { + if (targetSheet == null) + targetSheet = Worksheet as XLWorksheet; + + IXLPicture newPicture; + if (targetSheet == Worksheet) + newPicture = targetSheet.AddPicture(ImageStream, Format); + else + newPicture = targetSheet.AddPicture(ImageStream, Format, Name); + + newPicture = newPicture + .WithPlacement(XLPicturePlacement.FreeFloating) + .WithSize(Width, Height) + .WithPlacement(Placement); + + switch (Placement) + { + case XLPicturePlacement.FreeFloating: + newPicture.MoveTo(Left, Top); + break; + + case XLPicturePlacement.Move: + newPicture.MoveTo(targetSheet.Cell(TopLeftCell.Address), GetOffset(XLMarkerPosition.TopLeft)); + break; + + case XLPicturePlacement.MoveAndSize: + newPicture.MoveTo(targetSheet.Cell(TopLeftCell.Address), GetOffset(XLMarkerPosition.TopLeft), targetSheet.Cell(BottomRightCell.Address), + GetOffset(XLMarkerPosition.BottomRight)); + break; + } + + return newPicture; + } + + internal void SetName(string value) + { + if (String.IsNullOrWhiteSpace(value)) + throw new ArgumentException("Picture names cannot be empty"); + + if (value.IndexOfAny(InvalidNameChars.ToCharArray()) != -1) + throw new ArgumentException($"Picture names cannot contain any of the following characters: {InvalidNameChars}"); + + if (value.Length > 31) + throw new ArgumentException("Picture names cannot be more than 31 characters"); + + name = value; + } + + private static ImageFormat FromMimeType(string mimeType) + { + var guid = ImageCodecInfo.GetImageDecoders().FirstOrDefault(c => c.MimeType.Equals(mimeType, StringComparison.OrdinalIgnoreCase))?.FormatID; + if (!guid.HasValue) return null; + var property = typeof(System.Drawing.Imaging.ImageFormat).GetProperties(BindingFlags.Public | BindingFlags.Static) + .FirstOrDefault(pi => (pi.GetValue(null, null) as ImageFormat).Guid.Equals(guid.Value)); + + if (property == null) return null; + return (property.GetValue(null, null) as ImageFormat); + } + + private static string GetMimeType(Image i) + { + var imgguid = i.RawFormat.Guid; + foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageDecoders()) + { + if (codec.FormatID == imgguid) + return codec.MimeType; + } + return "image/unknown"; + } + + private void DeduceDimensionsFromBitmap(Bitmap bitmap) + { + this.OriginalWidth = bitmap.Width; + this.OriginalHeight = bitmap.Height; + + this.width = bitmap.Width; + this.height = bitmap.Height; + } + } +} diff --git a/ClosedXML/Excel/Drawings/XLPictures.cs b/ClosedXML/Excel/Drawings/XLPictures.cs new file mode 100644 index 0000000..6e17a7a --- /dev/null +++ b/ClosedXML/Excel/Drawings/XLPictures.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; + +namespace ClosedXML.Excel.Drawings +{ + internal class XLPictures : IXLPictures, IEnumerable + { + private readonly List _pictures = new List(); + private readonly XLWorksheet _worksheet; + + public XLPictures(XLWorksheet worksheet) + { + _worksheet = worksheet; + Deleted = new HashSet(); + } + + public int Count + { + [DebuggerStepThrough] + get { return _pictures.Count; } + } + + internal ICollection Deleted { get; private set; } + + public IXLPicture Add(Stream stream) + { + var picture = new XLPicture(_worksheet, stream); + _pictures.Add(picture); + picture.Name = GetNextPictureName(); + return picture; + } + + public IXLPicture Add(Stream stream, string name) + { + var picture = Add(stream); + picture.Name = name; + return picture; + } + + public IXLPicture Add(Stream stream, XLPictureFormat format) + { + var picture = new XLPicture(_worksheet, stream, format); + _pictures.Add(picture); + picture.Name = GetNextPictureName(); + return picture; + } + + public IXLPicture Add(Stream stream, XLPictureFormat format, string name) + { + var picture = Add(stream, format); + picture.Name = name; + return picture; + } + + public IXLPicture Add(Bitmap bitmap) + { + var picture = new XLPicture(_worksheet, bitmap); + _pictures.Add(picture); + picture.Name = GetNextPictureName(); + return picture; + } + + public IXLPicture Add(Bitmap bitmap, string name) + { + var picture = Add(bitmap); + picture.Name = name; + return picture; + } + + public IXLPicture Add(string imageFile) + { + using (var fs = File.OpenRead(imageFile)) + { + var picture = new XLPicture(_worksheet, fs); + _pictures.Add(picture); + picture.Name = GetNextPictureName(); + return picture; + } + } + + public IXLPicture Add(string imageFile, string name) + { + var picture = Add(imageFile); + picture.Name = name; + return picture; + } + + public bool Contains(string pictureName) + { + return _pictures.Any(p => string.Equals(p.Name, pictureName, StringComparison.OrdinalIgnoreCase)); + } + + public void Delete(IXLPicture picture) + { + Delete(picture.Name); + } + + public void Delete(string pictureName) + { + var picturesToDelete = _pictures + .Where(picture => picture.Name.Equals(pictureName, StringComparison.OrdinalIgnoreCase)) + .ToList(); + + if (!picturesToDelete.Any()) + throw new ArgumentOutOfRangeException(nameof(pictureName), $"Picture {pictureName} was not found."); + + foreach (var picture in picturesToDelete) + { + if (!string.IsNullOrEmpty(picture.RelId)) + Deleted.Add(picture.RelId); + + _pictures.Remove(picture); + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _pictures.Cast().GetEnumerator(); + } + + public IEnumerator GetEnumerator() + { + return ((IEnumerable)_pictures).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLPicture Picture(string pictureName) + { + if (TryGetPicture(pictureName, out IXLPicture p)) + return p; + + throw new ArgumentOutOfRangeException(nameof(pictureName), $"Picture {pictureName} was not found."); + } + + public bool TryGetPicture(string pictureName, out IXLPicture picture) + { + var matches = _pictures.Where(p => p.Name.Equals(pictureName, StringComparison.OrdinalIgnoreCase)); + if (matches.Any()) + { + picture = matches.First(); + return true; + } + picture = null; + return false; + } + + internal IXLPicture Add(Stream stream, string name, int Id) + { + var picture = Add(stream) as XLPicture; + picture.SetName(name); + picture.Id = Id; + return picture; + } + + private String GetNextPictureName() + { + var pictureNumber = this.Count; + while (_pictures.Any(p => p.Name == $"Picture {pictureNumber}")) + { + pictureNumber++; + } + return $"Picture {pictureNumber}"; + } + } +} diff --git a/ClosedXML/Excel/EnumConverter.cs b/ClosedXML/Excel/EnumConverter.cs new file mode 100644 index 0000000..31b1414 --- /dev/null +++ b/ClosedXML/Excel/EnumConverter.cs @@ -0,0 +1,1703 @@ +using ClosedXML.Excel.Drawings; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Spreadsheet; +using System; +using Vml = DocumentFormat.OpenXml.Vml; +using X14 = DocumentFormat.OpenXml.Office2010.Excel; +using Xdr = DocumentFormat.OpenXml.Drawing.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal static class EnumConverter + { + #region To OpenXml + + public static UnderlineValues ToOpenXml(this XLFontUnderlineValues value) + { + switch (value) + { + case XLFontUnderlineValues.Double: + return UnderlineValues.Double; + + case XLFontUnderlineValues.DoubleAccounting: + return UnderlineValues.DoubleAccounting; + + case XLFontUnderlineValues.None: + return UnderlineValues.None; + + case XLFontUnderlineValues.Single: + return UnderlineValues.Single; + + case XLFontUnderlineValues.SingleAccounting: + return UnderlineValues.SingleAccounting; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static OrientationValues ToOpenXml(this XLPageOrientation value) + { + switch (value) + { + case XLPageOrientation.Default: + return OrientationValues.Default; + + case XLPageOrientation.Landscape: + return OrientationValues.Landscape; + + case XLPageOrientation.Portrait: + return OrientationValues.Portrait; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static VerticalAlignmentRunValues ToOpenXml(this XLFontVerticalTextAlignmentValues value) + { + switch (value) + { + case XLFontVerticalTextAlignmentValues.Baseline: + return VerticalAlignmentRunValues.Baseline; + + case XLFontVerticalTextAlignmentValues.Subscript: + return VerticalAlignmentRunValues.Subscript; + + case XLFontVerticalTextAlignmentValues.Superscript: + return VerticalAlignmentRunValues.Superscript; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static PatternValues ToOpenXml(this XLFillPatternValues value) + { + switch (value) + { + case XLFillPatternValues.DarkDown: + return PatternValues.DarkDown; + + case XLFillPatternValues.DarkGray: + return PatternValues.DarkGray; + + case XLFillPatternValues.DarkGrid: + return PatternValues.DarkGrid; + + case XLFillPatternValues.DarkHorizontal: + return PatternValues.DarkHorizontal; + + case XLFillPatternValues.DarkTrellis: + return PatternValues.DarkTrellis; + + case XLFillPatternValues.DarkUp: + return PatternValues.DarkUp; + + case XLFillPatternValues.DarkVertical: + return PatternValues.DarkVertical; + + case XLFillPatternValues.Gray0625: + return PatternValues.Gray0625; + + case XLFillPatternValues.Gray125: + return PatternValues.Gray125; + + case XLFillPatternValues.LightDown: + return PatternValues.LightDown; + + case XLFillPatternValues.LightGray: + return PatternValues.LightGray; + + case XLFillPatternValues.LightGrid: + return PatternValues.LightGrid; + + case XLFillPatternValues.LightHorizontal: + return PatternValues.LightHorizontal; + + case XLFillPatternValues.LightTrellis: + return PatternValues.LightTrellis; + + case XLFillPatternValues.LightUp: + return PatternValues.LightUp; + + case XLFillPatternValues.LightVertical: + return PatternValues.LightVertical; + + case XLFillPatternValues.MediumGray: + return PatternValues.MediumGray; + + case XLFillPatternValues.None: + return PatternValues.None; + + case XLFillPatternValues.Solid: + return PatternValues.Solid; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static BorderStyleValues ToOpenXml(this XLBorderStyleValues value) + { + switch (value) + { + case XLBorderStyleValues.DashDot: + return BorderStyleValues.DashDot; + + case XLBorderStyleValues.DashDotDot: + return BorderStyleValues.DashDotDot; + + case XLBorderStyleValues.Dashed: + return BorderStyleValues.Dashed; + + case XLBorderStyleValues.Dotted: + return BorderStyleValues.Dotted; + + case XLBorderStyleValues.Double: + return BorderStyleValues.Double; + + case XLBorderStyleValues.Hair: + return BorderStyleValues.Hair; + + case XLBorderStyleValues.Medium: + return BorderStyleValues.Medium; + + case XLBorderStyleValues.MediumDashDot: + return BorderStyleValues.MediumDashDot; + + case XLBorderStyleValues.MediumDashDotDot: + return BorderStyleValues.MediumDashDotDot; + + case XLBorderStyleValues.MediumDashed: + return BorderStyleValues.MediumDashed; + + case XLBorderStyleValues.None: + return BorderStyleValues.None; + + case XLBorderStyleValues.SlantDashDot: + return BorderStyleValues.SlantDashDot; + + case XLBorderStyleValues.Thick: + return BorderStyleValues.Thick; + + case XLBorderStyleValues.Thin: + return BorderStyleValues.Thin; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static HorizontalAlignmentValues ToOpenXml(this XLAlignmentHorizontalValues value) + { + switch (value) + { + case XLAlignmentHorizontalValues.Center: + return HorizontalAlignmentValues.Center; + + case XLAlignmentHorizontalValues.CenterContinuous: + return HorizontalAlignmentValues.CenterContinuous; + + case XLAlignmentHorizontalValues.Distributed: + return HorizontalAlignmentValues.Distributed; + + case XLAlignmentHorizontalValues.Fill: + return HorizontalAlignmentValues.Fill; + + case XLAlignmentHorizontalValues.General: + return HorizontalAlignmentValues.General; + + case XLAlignmentHorizontalValues.Justify: + return HorizontalAlignmentValues.Justify; + + case XLAlignmentHorizontalValues.Left: + return HorizontalAlignmentValues.Left; + + case XLAlignmentHorizontalValues.Right: + return HorizontalAlignmentValues.Right; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static VerticalAlignmentValues ToOpenXml(this XLAlignmentVerticalValues value) + { + switch (value) + { + case XLAlignmentVerticalValues.Bottom: + return VerticalAlignmentValues.Bottom; + + case XLAlignmentVerticalValues.Center: + return VerticalAlignmentValues.Center; + + case XLAlignmentVerticalValues.Distributed: + return VerticalAlignmentValues.Distributed; + + case XLAlignmentVerticalValues.Justify: + return VerticalAlignmentValues.Justify; + + case XLAlignmentVerticalValues.Top: + return VerticalAlignmentValues.Top; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static PageOrderValues ToOpenXml(this XLPageOrderValues value) + { + switch (value) + { + case XLPageOrderValues.DownThenOver: + return PageOrderValues.DownThenOver; + + case XLPageOrderValues.OverThenDown: + return PageOrderValues.OverThenDown; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static CellCommentsValues ToOpenXml(this XLShowCommentsValues value) + { + switch (value) + { + case XLShowCommentsValues.AsDisplayed: + return CellCommentsValues.AsDisplayed; + + case XLShowCommentsValues.AtEnd: + return CellCommentsValues.AtEnd; + + case XLShowCommentsValues.None: + return CellCommentsValues.None; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static PrintErrorValues ToOpenXml(this XLPrintErrorValues value) + { + switch (value) + { + case XLPrintErrorValues.Blank: + return PrintErrorValues.Blank; + + case XLPrintErrorValues.Dash: + return PrintErrorValues.Dash; + + case XLPrintErrorValues.Displayed: + return PrintErrorValues.Displayed; + + case XLPrintErrorValues.NA: + return PrintErrorValues.NA; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static CalculateModeValues ToOpenXml(this XLCalculateMode value) + { + switch (value) + { + case XLCalculateMode.Auto: + return CalculateModeValues.Auto; + + case XLCalculateMode.AutoNoTable: + return CalculateModeValues.AutoNoTable; + + case XLCalculateMode.Manual: + return CalculateModeValues.Manual; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static ReferenceModeValues ToOpenXml(this XLReferenceStyle value) + { + switch (value) + { + case XLReferenceStyle.R1C1: + return ReferenceModeValues.R1C1; + + case XLReferenceStyle.A1: + return ReferenceModeValues.A1; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static uint ToOpenXml(this XLAlignmentReadingOrderValues value) + { + switch (value) + { + case XLAlignmentReadingOrderValues.ContextDependent: + return 0; + + case XLAlignmentReadingOrderValues.LeftToRight: + return 1; + + case XLAlignmentReadingOrderValues.RightToLeft: + return 2; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static TotalsRowFunctionValues ToOpenXml(this XLTotalsRowFunction value) + { + switch (value) + { + case XLTotalsRowFunction.None: + return TotalsRowFunctionValues.None; + + case XLTotalsRowFunction.Sum: + return TotalsRowFunctionValues.Sum; + + case XLTotalsRowFunction.Minimum: + return TotalsRowFunctionValues.Minimum; + + case XLTotalsRowFunction.Maximum: + return TotalsRowFunctionValues.Maximum; + + case XLTotalsRowFunction.Average: + return TotalsRowFunctionValues.Average; + + case XLTotalsRowFunction.Count: + return TotalsRowFunctionValues.Count; + + case XLTotalsRowFunction.CountNumbers: + return TotalsRowFunctionValues.CountNumbers; + + case XLTotalsRowFunction.StandardDeviation: + return TotalsRowFunctionValues.StandardDeviation; + + case XLTotalsRowFunction.Variance: + return TotalsRowFunctionValues.Variance; + + case XLTotalsRowFunction.Custom: + return TotalsRowFunctionValues.Custom; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static DataValidationValues ToOpenXml(this XLAllowedValues value) + { + switch (value) + { + case XLAllowedValues.AnyValue: + return DataValidationValues.None; + + case XLAllowedValues.Custom: + return DataValidationValues.Custom; + + case XLAllowedValues.Date: + return DataValidationValues.Date; + + case XLAllowedValues.Decimal: + return DataValidationValues.Decimal; + + case XLAllowedValues.List: + return DataValidationValues.List; + + case XLAllowedValues.TextLength: + return DataValidationValues.TextLength; + + case XLAllowedValues.Time: + return DataValidationValues.Time; + + case XLAllowedValues.WholeNumber: + return DataValidationValues.Whole; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static DataValidationErrorStyleValues ToOpenXml(this XLErrorStyle value) + { + switch (value) + { + case XLErrorStyle.Information: + return DataValidationErrorStyleValues.Information; + + case XLErrorStyle.Warning: + return DataValidationErrorStyleValues.Warning; + + case XLErrorStyle.Stop: + return DataValidationErrorStyleValues.Stop; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static DataValidationOperatorValues ToOpenXml(this XLOperator value) + { + switch (value) + { + case XLOperator.Between: + return DataValidationOperatorValues.Between; + + case XLOperator.EqualOrGreaterThan: + return DataValidationOperatorValues.GreaterThanOrEqual; + + case XLOperator.EqualOrLessThan: + return DataValidationOperatorValues.LessThanOrEqual; + + case XLOperator.EqualTo: + return DataValidationOperatorValues.Equal; + + case XLOperator.GreaterThan: + return DataValidationOperatorValues.GreaterThan; + + case XLOperator.LessThan: + return DataValidationOperatorValues.LessThan; + + case XLOperator.NotBetween: + return DataValidationOperatorValues.NotBetween; + + case XLOperator.NotEqualTo: + return DataValidationOperatorValues.NotEqual; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static SheetStateValues ToOpenXml(this XLWorksheetVisibility value) + { + switch (value) + { + case XLWorksheetVisibility.Visible: + return SheetStateValues.Visible; + + case XLWorksheetVisibility.Hidden: + return SheetStateValues.Hidden; + + case XLWorksheetVisibility.VeryHidden: + return SheetStateValues.VeryHidden; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static PhoneticAlignmentValues ToOpenXml(this XLPhoneticAlignment value) + { + switch (value) + { + case XLPhoneticAlignment.Center: + return PhoneticAlignmentValues.Center; + + case XLPhoneticAlignment.Distributed: + return PhoneticAlignmentValues.Distributed; + + case XLPhoneticAlignment.Left: + return PhoneticAlignmentValues.Left; + + case XLPhoneticAlignment.NoControl: + return PhoneticAlignmentValues.NoControl; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static PhoneticValues ToOpenXml(this XLPhoneticType value) + { + switch (value) + { + case XLPhoneticType.FullWidthKatakana: + return PhoneticValues.FullWidthKatakana; + + case XLPhoneticType.HalfWidthKatakana: + return PhoneticValues.HalfWidthKatakana; + + case XLPhoneticType.Hiragana: + return PhoneticValues.Hiragana; + + case XLPhoneticType.NoConversion: + return PhoneticValues.NoConversion; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static DataConsolidateFunctionValues ToOpenXml(this XLPivotSummary value) + { + switch (value) + { + case XLPivotSummary.Sum: return DataConsolidateFunctionValues.Sum; + case XLPivotSummary.Count: return DataConsolidateFunctionValues.Count; + case XLPivotSummary.Average: return DataConsolidateFunctionValues.Average; + case XLPivotSummary.Minimum: return DataConsolidateFunctionValues.Minimum; + case XLPivotSummary.Maximum: return DataConsolidateFunctionValues.Maximum; + case XLPivotSummary.Product: return DataConsolidateFunctionValues.Product; + case XLPivotSummary.CountNumbers: return DataConsolidateFunctionValues.CountNumbers; + case XLPivotSummary.StandardDeviation: return DataConsolidateFunctionValues.StandardDeviation; + case XLPivotSummary.PopulationStandardDeviation: return DataConsolidateFunctionValues.StandardDeviationP; + case XLPivotSummary.Variance: return DataConsolidateFunctionValues.Variance; + case XLPivotSummary.PopulationVariance: return DataConsolidateFunctionValues.VarianceP; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static ShowDataAsValues ToOpenXml(this XLPivotCalculation value) + { + switch (value) + { + case XLPivotCalculation.Normal: return ShowDataAsValues.Normal; + case XLPivotCalculation.DifferenceFrom: return ShowDataAsValues.Difference; + case XLPivotCalculation.PercentageOf: return ShowDataAsValues.Percent; + case XLPivotCalculation.PercentageDifferenceFrom: return ShowDataAsValues.PercentageDifference; + case XLPivotCalculation.RunningTotal: return ShowDataAsValues.RunTotal; + case XLPivotCalculation.PercentageOfRow: return ShowDataAsValues.PercentOfRaw; // There's a typo in the OpenXML SDK =) + case XLPivotCalculation.PercentageOfColumn: return ShowDataAsValues.PercentOfColumn; + case XLPivotCalculation.PercentageOfTotal: return ShowDataAsValues.PercentOfTotal; + case XLPivotCalculation.Index: return ShowDataAsValues.Index; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static FilterOperatorValues ToOpenXml(this XLFilterOperator value) + { + switch (value) + { + case XLFilterOperator.Equal: return FilterOperatorValues.Equal; + case XLFilterOperator.NotEqual: return FilterOperatorValues.NotEqual; + case XLFilterOperator.GreaterThan: return FilterOperatorValues.GreaterThan; + case XLFilterOperator.EqualOrGreaterThan: return FilterOperatorValues.GreaterThanOrEqual; + case XLFilterOperator.LessThan: return FilterOperatorValues.LessThan; + case XLFilterOperator.EqualOrLessThan: return FilterOperatorValues.LessThanOrEqual; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static DynamicFilterValues ToOpenXml(this XLFilterDynamicType value) + { + switch (value) + { + case XLFilterDynamicType.AboveAverage: return DynamicFilterValues.AboveAverage; + case XLFilterDynamicType.BelowAverage: return DynamicFilterValues.BelowAverage; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static DateTimeGroupingValues ToOpenXml(this XLDateTimeGrouping value) + { + switch (value) + { + case XLDateTimeGrouping.Year: return DateTimeGroupingValues.Year; + case XLDateTimeGrouping.Month: return DateTimeGroupingValues.Month; + case XLDateTimeGrouping.Day: return DateTimeGroupingValues.Day; + case XLDateTimeGrouping.Hour: return DateTimeGroupingValues.Hour; + case XLDateTimeGrouping.Minute: return DateTimeGroupingValues.Minute; + case XLDateTimeGrouping.Second: return DateTimeGroupingValues.Second; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static SheetViewValues ToOpenXml(this XLSheetViewOptions value) + { + switch (value) + { + case XLSheetViewOptions.Normal: return SheetViewValues.Normal; + case XLSheetViewOptions.PageBreakPreview: return SheetViewValues.PageBreakPreview; + case XLSheetViewOptions.PageLayout: return SheetViewValues.PageLayout; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static Vml.StrokeLineStyleValues ToOpenXml(this XLLineStyle value) + { + switch (value) + { + case XLLineStyle.Single: return Vml.StrokeLineStyleValues.Single; + case XLLineStyle.ThickBetweenThin: return Vml.StrokeLineStyleValues.ThickBetweenThin; + case XLLineStyle.ThickThin: return Vml.StrokeLineStyleValues.ThickThin; + case XLLineStyle.ThinThick: return Vml.StrokeLineStyleValues.ThinThick; + case XLLineStyle.ThinThin: return Vml.StrokeLineStyleValues.ThinThin; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static ConditionalFormatValues ToOpenXml(this XLConditionalFormatType value) + { + switch (value) + { + case XLConditionalFormatType.Expression: return ConditionalFormatValues.Expression; + case XLConditionalFormatType.CellIs: return ConditionalFormatValues.CellIs; + case XLConditionalFormatType.ColorScale: return ConditionalFormatValues.ColorScale; + case XLConditionalFormatType.DataBar: return ConditionalFormatValues.DataBar; + case XLConditionalFormatType.IconSet: return ConditionalFormatValues.IconSet; + case XLConditionalFormatType.Top10: return ConditionalFormatValues.Top10; + case XLConditionalFormatType.IsUnique: return ConditionalFormatValues.UniqueValues; + case XLConditionalFormatType.IsDuplicate: return ConditionalFormatValues.DuplicateValues; + case XLConditionalFormatType.ContainsText: return ConditionalFormatValues.ContainsText; + case XLConditionalFormatType.NotContainsText: return ConditionalFormatValues.NotContainsText; + case XLConditionalFormatType.StartsWith: return ConditionalFormatValues.BeginsWith; + case XLConditionalFormatType.EndsWith: return ConditionalFormatValues.EndsWith; + case XLConditionalFormatType.IsBlank: return ConditionalFormatValues.ContainsBlanks; + case XLConditionalFormatType.NotBlank: return ConditionalFormatValues.NotContainsBlanks; + case XLConditionalFormatType.IsError: return ConditionalFormatValues.ContainsErrors; + case XLConditionalFormatType.NotError: return ConditionalFormatValues.NotContainsErrors; + case XLConditionalFormatType.TimePeriod: return ConditionalFormatValues.TimePeriod; + case XLConditionalFormatType.AboveAverage: return ConditionalFormatValues.AboveAverage; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static ConditionalFormatValueObjectValues ToOpenXml(this XLCFContentType value) + { + switch (value) + { + case XLCFContentType.Number: return ConditionalFormatValueObjectValues.Number; + case XLCFContentType.Percent: return ConditionalFormatValueObjectValues.Percent; + case XLCFContentType.Maximum: return ConditionalFormatValueObjectValues.Max; + case XLCFContentType.Minimum: return ConditionalFormatValueObjectValues.Min; + case XLCFContentType.Formula: return ConditionalFormatValueObjectValues.Formula; + case XLCFContentType.Percentile: return ConditionalFormatValueObjectValues.Percentile; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static ConditionalFormattingOperatorValues ToOpenXml(this XLCFOperator value) + { + switch (value) + { + case XLCFOperator.LessThan: return ConditionalFormattingOperatorValues.LessThan; + case XLCFOperator.EqualOrLessThan: return ConditionalFormattingOperatorValues.LessThanOrEqual; + case XLCFOperator.Equal: return ConditionalFormattingOperatorValues.Equal; + case XLCFOperator.NotEqual: return ConditionalFormattingOperatorValues.NotEqual; + case XLCFOperator.EqualOrGreaterThan: return ConditionalFormattingOperatorValues.GreaterThanOrEqual; + case XLCFOperator.GreaterThan: return ConditionalFormattingOperatorValues.GreaterThan; + case XLCFOperator.Between: return ConditionalFormattingOperatorValues.Between; + case XLCFOperator.NotBetween: return ConditionalFormattingOperatorValues.NotBetween; + case XLCFOperator.Contains: return ConditionalFormattingOperatorValues.ContainsText; + case XLCFOperator.NotContains: return ConditionalFormattingOperatorValues.NotContains; + case XLCFOperator.StartsWith: return ConditionalFormattingOperatorValues.BeginsWith; + case XLCFOperator.EndsWith: return ConditionalFormattingOperatorValues.EndsWith; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static IconSetValues ToOpenXml(this XLIconSetStyle value) + { + switch (value) + { + case XLIconSetStyle.ThreeArrows: return IconSetValues.ThreeArrows; + case XLIconSetStyle.ThreeArrowsGray: return IconSetValues.ThreeArrowsGray; + case XLIconSetStyle.ThreeFlags: return IconSetValues.ThreeFlags; + case XLIconSetStyle.ThreeTrafficLights1: return IconSetValues.ThreeTrafficLights1; + case XLIconSetStyle.ThreeTrafficLights2: return IconSetValues.ThreeTrafficLights2; + case XLIconSetStyle.ThreeSigns: return IconSetValues.ThreeSigns; + case XLIconSetStyle.ThreeSymbols: return IconSetValues.ThreeSymbols; + case XLIconSetStyle.ThreeSymbols2: return IconSetValues.ThreeSymbols2; + case XLIconSetStyle.FourArrows: return IconSetValues.FourArrows; + case XLIconSetStyle.FourArrowsGray: return IconSetValues.FourArrowsGray; + case XLIconSetStyle.FourRedToBlack: return IconSetValues.FourRedToBlack; + case XLIconSetStyle.FourRating: return IconSetValues.FourRating; + case XLIconSetStyle.FourTrafficLights: return IconSetValues.FourTrafficLights; + case XLIconSetStyle.FiveArrows: return IconSetValues.FiveArrows; + case XLIconSetStyle.FiveArrowsGray: return IconSetValues.FiveArrowsGray; + case XLIconSetStyle.FiveRating: return IconSetValues.FiveRating; + case XLIconSetStyle.FiveQuarters: return IconSetValues.FiveQuarters; + + default: + throw new ArgumentOutOfRangeException("Not implemented value!"); + } + } + + public static TimePeriodValues ToOpenXml(this XLTimePeriod value) + { + switch (value) + { + case XLTimePeriod.Yesterday: return TimePeriodValues.Yesterday; + case XLTimePeriod.Today: return TimePeriodValues.Today; + case XLTimePeriod.Tomorrow: return TimePeriodValues.Tomorrow; + case XLTimePeriod.InTheLast7Days: return TimePeriodValues.Last7Days; + case XLTimePeriod.LastWeek: return TimePeriodValues.LastWeek; + case XLTimePeriod.ThisWeek: return TimePeriodValues.ThisWeek; + case XLTimePeriod.NextWeek: return TimePeriodValues.NextWeek; + case XLTimePeriod.LastMonth: return TimePeriodValues.LastMonth; + case XLTimePeriod.ThisMonth: return TimePeriodValues.ThisMonth; + case XLTimePeriod.NextMonth: return TimePeriodValues.NextMonth; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static ImagePartType ToOpenXml(this XLPictureFormat value) + { + return Enum.Parse(typeof(ImagePartType), value.ToString()).CastTo(); + } + + public static Xdr.EditAsValues ToOpenXml(this XLPicturePlacement value) + { + switch (value) + { + case XLPicturePlacement.FreeFloating: + return Xdr.EditAsValues.Absolute; + + case XLPicturePlacement.Move: + return Xdr.EditAsValues.OneCell; + + case XLPicturePlacement.MoveAndSize: + return Xdr.EditAsValues.TwoCell; + + default: + throw new ArgumentOutOfRangeException("Not implemented value!"); + } + } + + public static PivotAreaValues ToOpenXml(this XLPivotAreaValues value) + { + switch (value) + { + case XLPivotAreaValues.None: + return PivotAreaValues.None; + + case XLPivotAreaValues.Normal: + return PivotAreaValues.Normal; + + case XLPivotAreaValues.Data: + return PivotAreaValues.Data; + + case XLPivotAreaValues.All: + return PivotAreaValues.All; + + case XLPivotAreaValues.Origin: + return PivotAreaValues.Origin; + + case XLPivotAreaValues.Button: + return PivotAreaValues.Button; + + case XLPivotAreaValues.TopRight: + return PivotAreaValues.TopRight; + + case XLPivotAreaValues.TopEnd: + return PivotAreaValues.TopEnd; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "XLPivotAreaValues value not implemented"); + } + } + + public static X14.SparklineTypeValues ToOpenXml(this XLSparklineType value) + { + switch (value) + { + case XLSparklineType.Line: return X14.SparklineTypeValues.Line; + case XLSparklineType.Column: return X14.SparklineTypeValues.Column; + case XLSparklineType.Stacked: return X14.SparklineTypeValues.Stacked; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static X14.SparklineAxisMinMaxValues ToOpenXml(this XLSparklineAxisMinMax value) + { + switch (value) + { + case XLSparklineAxisMinMax.Automatic: return X14.SparklineAxisMinMaxValues.Individual; + case XLSparklineAxisMinMax.SameForAll: return X14.SparklineAxisMinMaxValues.Group; + case XLSparklineAxisMinMax.Custom: return X14.SparklineAxisMinMaxValues.Custom; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static X14.DisplayBlanksAsValues ToOpenXml(this XLDisplayBlanksAsValues value) + { + switch (value) + { + case XLDisplayBlanksAsValues.Interpolate: return X14.DisplayBlanksAsValues.Span; + case XLDisplayBlanksAsValues.NotPlotted: return X14.DisplayBlanksAsValues.Gap; + case XLDisplayBlanksAsValues.Zero: return X14.DisplayBlanksAsValues.Zero; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + #endregion To OpenXml + + #region To ClosedXml + + public static XLFontUnderlineValues ToClosedXml(this UnderlineValues value) + { + switch (value) + { + case UnderlineValues.Double: + return XLFontUnderlineValues.Double; + + case UnderlineValues.DoubleAccounting: + return XLFontUnderlineValues.DoubleAccounting; + + case UnderlineValues.None: + return XLFontUnderlineValues.None; + + case UnderlineValues.Single: + return XLFontUnderlineValues.Single; + + case UnderlineValues.SingleAccounting: + return XLFontUnderlineValues.SingleAccounting; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLPageOrientation ToClosedXml(this OrientationValues value) + { + switch (value) + { + case OrientationValues.Default: + return XLPageOrientation.Default; + + case OrientationValues.Landscape: + return XLPageOrientation.Landscape; + + case OrientationValues.Portrait: + return XLPageOrientation.Portrait; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLFontVerticalTextAlignmentValues ToClosedXml(this VerticalAlignmentRunValues value) + { + switch (value) + { + case VerticalAlignmentRunValues.Baseline: + return XLFontVerticalTextAlignmentValues.Baseline; + + case VerticalAlignmentRunValues.Subscript: + return XLFontVerticalTextAlignmentValues.Subscript; + + case VerticalAlignmentRunValues.Superscript: + return XLFontVerticalTextAlignmentValues.Superscript; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLFillPatternValues ToClosedXml(this PatternValues value) + { + switch (value) + { + case PatternValues.DarkDown: + return XLFillPatternValues.DarkDown; + + case PatternValues.DarkGray: + return XLFillPatternValues.DarkGray; + + case PatternValues.DarkGrid: + return XLFillPatternValues.DarkGrid; + + case PatternValues.DarkHorizontal: + return XLFillPatternValues.DarkHorizontal; + + case PatternValues.DarkTrellis: + return XLFillPatternValues.DarkTrellis; + + case PatternValues.DarkUp: + return XLFillPatternValues.DarkUp; + + case PatternValues.DarkVertical: + return XLFillPatternValues.DarkVertical; + + case PatternValues.Gray0625: + return XLFillPatternValues.Gray0625; + + case PatternValues.Gray125: + return XLFillPatternValues.Gray125; + + case PatternValues.LightDown: + return XLFillPatternValues.LightDown; + + case PatternValues.LightGray: + return XLFillPatternValues.LightGray; + + case PatternValues.LightGrid: + return XLFillPatternValues.LightGrid; + + case PatternValues.LightHorizontal: + return XLFillPatternValues.LightHorizontal; + + case PatternValues.LightTrellis: + return XLFillPatternValues.LightTrellis; + + case PatternValues.LightUp: + return XLFillPatternValues.LightUp; + + case PatternValues.LightVertical: + return XLFillPatternValues.LightVertical; + + case PatternValues.MediumGray: + return XLFillPatternValues.MediumGray; + + case PatternValues.None: + return XLFillPatternValues.None; + + case PatternValues.Solid: + return XLFillPatternValues.Solid; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLBorderStyleValues ToClosedXml(this BorderStyleValues value) + { + switch (value) + { + case BorderStyleValues.DashDot: + return XLBorderStyleValues.DashDot; + + case BorderStyleValues.DashDotDot: + return XLBorderStyleValues.DashDotDot; + + case BorderStyleValues.Dashed: + return XLBorderStyleValues.Dashed; + + case BorderStyleValues.Dotted: + return XLBorderStyleValues.Dotted; + + case BorderStyleValues.Double: + return XLBorderStyleValues.Double; + + case BorderStyleValues.Hair: + return XLBorderStyleValues.Hair; + + case BorderStyleValues.Medium: + return XLBorderStyleValues.Medium; + + case BorderStyleValues.MediumDashDot: + return XLBorderStyleValues.MediumDashDot; + + case BorderStyleValues.MediumDashDotDot: + return XLBorderStyleValues.MediumDashDotDot; + + case BorderStyleValues.MediumDashed: + return XLBorderStyleValues.MediumDashed; + + case BorderStyleValues.None: + return XLBorderStyleValues.None; + + case BorderStyleValues.SlantDashDot: + return XLBorderStyleValues.SlantDashDot; + + case BorderStyleValues.Thick: + return XLBorderStyleValues.Thick; + + case BorderStyleValues.Thin: + return XLBorderStyleValues.Thin; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLAlignmentHorizontalValues ToClosedXml(this HorizontalAlignmentValues value) + { + switch (value) + { + case HorizontalAlignmentValues.Center: + return XLAlignmentHorizontalValues.Center; + + case HorizontalAlignmentValues.CenterContinuous: + return XLAlignmentHorizontalValues.CenterContinuous; + + case HorizontalAlignmentValues.Distributed: + return XLAlignmentHorizontalValues.Distributed; + + case HorizontalAlignmentValues.Fill: + return XLAlignmentHorizontalValues.Fill; + + case HorizontalAlignmentValues.General: + return XLAlignmentHorizontalValues.General; + + case HorizontalAlignmentValues.Justify: + return XLAlignmentHorizontalValues.Justify; + + case HorizontalAlignmentValues.Left: + return XLAlignmentHorizontalValues.Left; + + case HorizontalAlignmentValues.Right: + return XLAlignmentHorizontalValues.Right; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLAlignmentVerticalValues ToClosedXml(this VerticalAlignmentValues value) + { + switch (value) + { + case VerticalAlignmentValues.Bottom: + return XLAlignmentVerticalValues.Bottom; + + case VerticalAlignmentValues.Center: + return XLAlignmentVerticalValues.Center; + + case VerticalAlignmentValues.Distributed: + return XLAlignmentVerticalValues.Distributed; + + case VerticalAlignmentValues.Justify: + return XLAlignmentVerticalValues.Justify; + + case VerticalAlignmentValues.Top: + return XLAlignmentVerticalValues.Top; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLPageOrderValues ToClosedXml(this PageOrderValues value) + { + switch (value) + { + case PageOrderValues.DownThenOver: + return XLPageOrderValues.DownThenOver; + + case PageOrderValues.OverThenDown: + return XLPageOrderValues.OverThenDown; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLShowCommentsValues ToClosedXml(this CellCommentsValues value) + { + switch (value) + { + case CellCommentsValues.AsDisplayed: + return XLShowCommentsValues.AsDisplayed; + + case CellCommentsValues.AtEnd: + return XLShowCommentsValues.AtEnd; + + case CellCommentsValues.None: + return XLShowCommentsValues.None; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLPrintErrorValues ToClosedXml(this PrintErrorValues value) + { + switch (value) + { + case PrintErrorValues.Blank: + return XLPrintErrorValues.Blank; + + case PrintErrorValues.Dash: + return XLPrintErrorValues.Dash; + + case PrintErrorValues.Displayed: + return XLPrintErrorValues.Displayed; + + case PrintErrorValues.NA: + return XLPrintErrorValues.NA; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLCalculateMode ToClosedXml(this CalculateModeValues value) + { + switch (value) + { + case CalculateModeValues.Auto: + return XLCalculateMode.Auto; + + case CalculateModeValues.AutoNoTable: + return XLCalculateMode.AutoNoTable; + + case CalculateModeValues.Manual: + return XLCalculateMode.Manual; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLReferenceStyle ToClosedXml(this ReferenceModeValues value) + { + switch (value) + { + case ReferenceModeValues.R1C1: + return XLReferenceStyle.R1C1; + + case ReferenceModeValues.A1: + return XLReferenceStyle.A1; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLAlignmentReadingOrderValues ToClosedXml(this uint value) + { + switch (value) + { + case 0: + return XLAlignmentReadingOrderValues.ContextDependent; + + case 1: + return XLAlignmentReadingOrderValues.LeftToRight; + + case 2: + return XLAlignmentReadingOrderValues.RightToLeft; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLTotalsRowFunction ToClosedXml(this TotalsRowFunctionValues value) + { + switch (value) + { + case TotalsRowFunctionValues.None: + return XLTotalsRowFunction.None; + + case TotalsRowFunctionValues.Sum: + return XLTotalsRowFunction.Sum; + + case TotalsRowFunctionValues.Minimum: + return XLTotalsRowFunction.Minimum; + + case TotalsRowFunctionValues.Maximum: + return XLTotalsRowFunction.Maximum; + + case TotalsRowFunctionValues.Average: + return XLTotalsRowFunction.Average; + + case TotalsRowFunctionValues.Count: + return XLTotalsRowFunction.Count; + + case TotalsRowFunctionValues.CountNumbers: + return XLTotalsRowFunction.CountNumbers; + + case TotalsRowFunctionValues.StandardDeviation: + return XLTotalsRowFunction.StandardDeviation; + + case TotalsRowFunctionValues.Variance: + return XLTotalsRowFunction.Variance; + + case TotalsRowFunctionValues.Custom: + return XLTotalsRowFunction.Custom; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLAllowedValues ToClosedXml(this DataValidationValues value) + { + switch (value) + { + case DataValidationValues.None: + return XLAllowedValues.AnyValue; + + case DataValidationValues.Custom: + return XLAllowedValues.Custom; + + case DataValidationValues.Date: + return XLAllowedValues.Date; + + case DataValidationValues.Decimal: + return XLAllowedValues.Decimal; + + case DataValidationValues.List: + return XLAllowedValues.List; + + case DataValidationValues.TextLength: + return XLAllowedValues.TextLength; + + case DataValidationValues.Time: + return XLAllowedValues.Time; + + case DataValidationValues.Whole: + return XLAllowedValues.WholeNumber; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLErrorStyle ToClosedXml(this DataValidationErrorStyleValues value) + { + switch (value) + { + case DataValidationErrorStyleValues.Information: + return XLErrorStyle.Information; + + case DataValidationErrorStyleValues.Warning: + return XLErrorStyle.Warning; + + case DataValidationErrorStyleValues.Stop: + return XLErrorStyle.Stop; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLOperator ToClosedXml(this DataValidationOperatorValues value) + { + switch (value) + { + case DataValidationOperatorValues.Between: + return XLOperator.Between; + + case DataValidationOperatorValues.GreaterThanOrEqual: + return XLOperator.EqualOrGreaterThan; + + case DataValidationOperatorValues.LessThanOrEqual: + return XLOperator.EqualOrLessThan; + + case DataValidationOperatorValues.Equal: + return XLOperator.EqualTo; + + case DataValidationOperatorValues.GreaterThan: + return XLOperator.GreaterThan; + + case DataValidationOperatorValues.LessThan: + return XLOperator.LessThan; + + case DataValidationOperatorValues.NotBetween: + return XLOperator.NotBetween; + + case DataValidationOperatorValues.NotEqual: + return XLOperator.NotEqualTo; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLWorksheetVisibility ToClosedXml(this SheetStateValues value) + { + switch (value) + { + case SheetStateValues.Visible: + return XLWorksheetVisibility.Visible; + + case SheetStateValues.Hidden: + return XLWorksheetVisibility.Hidden; + + case SheetStateValues.VeryHidden: + return XLWorksheetVisibility.VeryHidden; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLPhoneticAlignment ToClosedXml(this PhoneticAlignmentValues value) + { + switch (value) + { + case PhoneticAlignmentValues.Center: + return XLPhoneticAlignment.Center; + + case PhoneticAlignmentValues.Distributed: + return XLPhoneticAlignment.Distributed; + + case PhoneticAlignmentValues.Left: + return XLPhoneticAlignment.Left; + + case PhoneticAlignmentValues.NoControl: + return XLPhoneticAlignment.NoControl; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLPhoneticType ToClosedXml(this PhoneticValues value) + { + switch (value) + { + case PhoneticValues.FullWidthKatakana: return XLPhoneticType.FullWidthKatakana; + case PhoneticValues.HalfWidthKatakana: + return XLPhoneticType.HalfWidthKatakana; + + case PhoneticValues.Hiragana: + return XLPhoneticType.Hiragana; + + case PhoneticValues.NoConversion: + return XLPhoneticType.NoConversion; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLPivotSummary ToClosedXml(this DataConsolidateFunctionValues value) + { + switch (value) + { + case DataConsolidateFunctionValues.Sum: return XLPivotSummary.Sum; + case DataConsolidateFunctionValues.Count: return XLPivotSummary.Count; + case DataConsolidateFunctionValues.Average: return XLPivotSummary.Average; + case DataConsolidateFunctionValues.Minimum: return XLPivotSummary.Minimum; + case DataConsolidateFunctionValues.Maximum: return XLPivotSummary.Maximum; + case DataConsolidateFunctionValues.Product: return XLPivotSummary.Product; + case DataConsolidateFunctionValues.CountNumbers: return XLPivotSummary.CountNumbers; + case DataConsolidateFunctionValues.StandardDeviation: return XLPivotSummary.StandardDeviation; + case DataConsolidateFunctionValues.StandardDeviationP: return XLPivotSummary.PopulationStandardDeviation; + case DataConsolidateFunctionValues.Variance: return XLPivotSummary.Variance; + case DataConsolidateFunctionValues.VarianceP: return XLPivotSummary.PopulationVariance; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLPivotCalculation ToClosedXml(this ShowDataAsValues value) + { + switch (value) + { + case ShowDataAsValues.Normal: return XLPivotCalculation.Normal; + case ShowDataAsValues.Difference: return XLPivotCalculation.DifferenceFrom; + case ShowDataAsValues.Percent: return XLPivotCalculation.PercentageOf; + case ShowDataAsValues.PercentageDifference: return XLPivotCalculation.PercentageDifferenceFrom; + case ShowDataAsValues.RunTotal: return XLPivotCalculation.RunningTotal; + case ShowDataAsValues.PercentOfRaw: return XLPivotCalculation.PercentageOfRow; // There's a typo in the OpenXML SDK =) + case ShowDataAsValues.PercentOfColumn: return XLPivotCalculation.PercentageOfColumn; + case ShowDataAsValues.PercentOfTotal: return XLPivotCalculation.PercentageOfTotal; + case ShowDataAsValues.Index: return XLPivotCalculation.Index; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLFilterOperator ToClosedXml(this FilterOperatorValues value) + { + switch (value) + { + case FilterOperatorValues.Equal: return XLFilterOperator.Equal; + case FilterOperatorValues.NotEqual: return XLFilterOperator.NotEqual; + case FilterOperatorValues.GreaterThan: return XLFilterOperator.GreaterThan; + case FilterOperatorValues.LessThan: return XLFilterOperator.LessThan; + case FilterOperatorValues.GreaterThanOrEqual: return XLFilterOperator.EqualOrGreaterThan; + case FilterOperatorValues.LessThanOrEqual: return XLFilterOperator.EqualOrLessThan; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLFilterDynamicType ToClosedXml(this DynamicFilterValues value) + { + switch (value) + { + case DynamicFilterValues.AboveAverage: return XLFilterDynamicType.AboveAverage; + case DynamicFilterValues.BelowAverage: return XLFilterDynamicType.BelowAverage; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLDateTimeGrouping ToClosedXml(this DateTimeGroupingValues value) + { + switch (value) + { + case DateTimeGroupingValues.Year: return XLDateTimeGrouping.Year; + case DateTimeGroupingValues.Month: return XLDateTimeGrouping.Month; + case DateTimeGroupingValues.Day: return XLDateTimeGrouping.Day; + case DateTimeGroupingValues.Hour: return XLDateTimeGrouping.Hour; + case DateTimeGroupingValues.Minute: return XLDateTimeGrouping.Minute; + case DateTimeGroupingValues.Second: return XLDateTimeGrouping.Second; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLSheetViewOptions ToClosedXml(this SheetViewValues value) + { + switch (value) + { + case SheetViewValues.Normal: return XLSheetViewOptions.Normal; + case SheetViewValues.PageBreakPreview: return XLSheetViewOptions.PageBreakPreview; + case SheetViewValues.PageLayout: return XLSheetViewOptions.PageLayout; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLLineStyle ToClosedXml(this Vml.StrokeLineStyleValues value) + { + switch (value) + { + case Vml.StrokeLineStyleValues.Single: return XLLineStyle.Single; + case Vml.StrokeLineStyleValues.ThickBetweenThin: return XLLineStyle.ThickBetweenThin; + case Vml.StrokeLineStyleValues.ThickThin: return XLLineStyle.ThickThin; + case Vml.StrokeLineStyleValues.ThinThick: return XLLineStyle.ThinThick; + case Vml.StrokeLineStyleValues.ThinThin: return XLLineStyle.ThinThin; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLConditionalFormatType ToClosedXml(this ConditionalFormatValues value) + { + switch (value) + { + case ConditionalFormatValues.Expression: return XLConditionalFormatType.Expression; + case ConditionalFormatValues.CellIs: return XLConditionalFormatType.CellIs; + case ConditionalFormatValues.ColorScale: return XLConditionalFormatType.ColorScale; + case ConditionalFormatValues.DataBar: return XLConditionalFormatType.DataBar; + case ConditionalFormatValues.IconSet: return XLConditionalFormatType.IconSet; + case ConditionalFormatValues.Top10: return XLConditionalFormatType.Top10; + case ConditionalFormatValues.UniqueValues: return XLConditionalFormatType.IsUnique; + case ConditionalFormatValues.DuplicateValues: return XLConditionalFormatType.IsDuplicate; + case ConditionalFormatValues.ContainsText: return XLConditionalFormatType.ContainsText; + case ConditionalFormatValues.NotContainsText: return XLConditionalFormatType.NotContainsText; + case ConditionalFormatValues.BeginsWith: return XLConditionalFormatType.StartsWith; + case ConditionalFormatValues.EndsWith: return XLConditionalFormatType.EndsWith; + case ConditionalFormatValues.ContainsBlanks: return XLConditionalFormatType.IsBlank; + case ConditionalFormatValues.NotContainsBlanks: return XLConditionalFormatType.NotBlank; + case ConditionalFormatValues.ContainsErrors: return XLConditionalFormatType.IsError; + case ConditionalFormatValues.NotContainsErrors: return XLConditionalFormatType.NotError; + case ConditionalFormatValues.TimePeriod: return XLConditionalFormatType.TimePeriod; + case ConditionalFormatValues.AboveAverage: return XLConditionalFormatType.AboveAverage; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLCFContentType ToClosedXml(this ConditionalFormatValueObjectValues value) + { + switch (value) + { + case ConditionalFormatValueObjectValues.Number: return XLCFContentType.Number; + case ConditionalFormatValueObjectValues.Percent: return XLCFContentType.Percent; + case ConditionalFormatValueObjectValues.Max: return XLCFContentType.Maximum; + case ConditionalFormatValueObjectValues.Min: return XLCFContentType.Minimum; + case ConditionalFormatValueObjectValues.Formula: return XLCFContentType.Formula; + case ConditionalFormatValueObjectValues.Percentile: return XLCFContentType.Percentile; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLCFOperator ToClosedXml(this ConditionalFormattingOperatorValues value) + { + switch (value) + { + case ConditionalFormattingOperatorValues.LessThan: return XLCFOperator.LessThan; + case ConditionalFormattingOperatorValues.LessThanOrEqual: return XLCFOperator.EqualOrLessThan; + case ConditionalFormattingOperatorValues.Equal: return XLCFOperator.Equal; + case ConditionalFormattingOperatorValues.NotEqual: return XLCFOperator.NotEqual; + case ConditionalFormattingOperatorValues.GreaterThanOrEqual: return XLCFOperator.EqualOrGreaterThan; + case ConditionalFormattingOperatorValues.GreaterThan: return XLCFOperator.GreaterThan; + case ConditionalFormattingOperatorValues.Between: return XLCFOperator.Between; + case ConditionalFormattingOperatorValues.NotBetween: return XLCFOperator.NotBetween; + case ConditionalFormattingOperatorValues.ContainsText: return XLCFOperator.Contains; + case ConditionalFormattingOperatorValues.NotContains: return XLCFOperator.NotContains; + case ConditionalFormattingOperatorValues.BeginsWith: return XLCFOperator.StartsWith; + case ConditionalFormattingOperatorValues.EndsWith: return XLCFOperator.EndsWith; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLIconSetStyle ToClosedXml(this IconSetValues value) + { + switch (value) + { + case IconSetValues.ThreeArrows: return XLIconSetStyle.ThreeArrows; + case IconSetValues.ThreeArrowsGray: return XLIconSetStyle.ThreeArrowsGray; + case IconSetValues.ThreeFlags: return XLIconSetStyle.ThreeFlags; + case IconSetValues.ThreeTrafficLights1: return XLIconSetStyle.ThreeTrafficLights1; + case IconSetValues.ThreeTrafficLights2: return XLIconSetStyle.ThreeTrafficLights2; + case IconSetValues.ThreeSigns: return XLIconSetStyle.ThreeSigns; + case IconSetValues.ThreeSymbols: return XLIconSetStyle.ThreeSymbols; + case IconSetValues.ThreeSymbols2: return XLIconSetStyle.ThreeSymbols2; + case IconSetValues.FourArrows: return XLIconSetStyle.FourArrows; + case IconSetValues.FourArrowsGray: return XLIconSetStyle.FourArrowsGray; + case IconSetValues.FourRedToBlack: return XLIconSetStyle.FourRedToBlack; + case IconSetValues.FourRating: return XLIconSetStyle.FourRating; + case IconSetValues.FourTrafficLights: return XLIconSetStyle.FourTrafficLights; + case IconSetValues.FiveArrows: return XLIconSetStyle.FiveArrows; + case IconSetValues.FiveArrowsGray: return XLIconSetStyle.FiveArrowsGray; + case IconSetValues.FiveRating: return XLIconSetStyle.FiveRating; + case IconSetValues.FiveQuarters: return XLIconSetStyle.FiveQuarters; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLTimePeriod ToClosedXml(this TimePeriodValues value) + { + switch (value) + { + case TimePeriodValues.Yesterday: return XLTimePeriod.Yesterday; + case TimePeriodValues.Today: return XLTimePeriod.Today; + case TimePeriodValues.Tomorrow: return XLTimePeriod.Tomorrow; + case TimePeriodValues.Last7Days: return XLTimePeriod.InTheLast7Days; + case TimePeriodValues.LastWeek: return XLTimePeriod.LastWeek; + case TimePeriodValues.ThisWeek: return XLTimePeriod.ThisWeek; + case TimePeriodValues.NextWeek: return XLTimePeriod.NextWeek; + case TimePeriodValues.LastMonth: return XLTimePeriod.LastMonth; + case TimePeriodValues.ThisMonth: return XLTimePeriod.ThisMonth; + case TimePeriodValues.NextMonth: return XLTimePeriod.NextMonth; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLPictureFormat ToClosedXml(this ImagePartType value) + { + return Enum.Parse(typeof(XLPictureFormat), value.ToString()).CastTo(); + } + + public static XLPicturePlacement ToClosedXml(this Xdr.EditAsValues value) + { + switch (value) + { + case Xdr.EditAsValues.Absolute: + return XLPicturePlacement.FreeFloating; + + case Xdr.EditAsValues.OneCell: + return XLPicturePlacement.Move; + + case Xdr.EditAsValues.TwoCell: + return XLPicturePlacement.MoveAndSize; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLPivotAreaValues ToClosedXml(this PivotAreaValues value) + { + switch (value) + { + case PivotAreaValues.None: + return XLPivotAreaValues.None; + + case PivotAreaValues.Normal: + return XLPivotAreaValues.Normal; + + case PivotAreaValues.Data: + return XLPivotAreaValues.Data; + + case PivotAreaValues.All: + return XLPivotAreaValues.All; + + case PivotAreaValues.Origin: + return XLPivotAreaValues.Origin; + + case PivotAreaValues.Button: + return XLPivotAreaValues.Button; + + case PivotAreaValues.TopRight: + return XLPivotAreaValues.TopRight; + + case PivotAreaValues.TopEnd: + return XLPivotAreaValues.TopEnd; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "PivotAreaValues value not implemented"); + } + } + + public static XLSparklineType ToClosedXml(this X14.SparklineTypeValues value) + { + switch (value) + { + case X14.SparklineTypeValues.Line: return XLSparklineType.Line; + case X14.SparklineTypeValues.Column: return XLSparklineType.Column; + case X14.SparklineTypeValues.Stacked: return XLSparklineType.Stacked; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLSparklineAxisMinMax ToClosedXml(this X14.SparklineAxisMinMaxValues value) + { + switch (value) + { + case X14.SparklineAxisMinMaxValues.Individual: return XLSparklineAxisMinMax.Automatic; + case X14.SparklineAxisMinMaxValues.Group: return XLSparklineAxisMinMax.SameForAll; + case X14.SparklineAxisMinMaxValues.Custom: return XLSparklineAxisMinMax.Custom; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + public static XLDisplayBlanksAsValues ToClosedXml(this X14.DisplayBlanksAsValues value) + { + switch (value) + { + case X14.DisplayBlanksAsValues.Span: return XLDisplayBlanksAsValues.Interpolate; + case X14.DisplayBlanksAsValues.Gap: return XLDisplayBlanksAsValues.NotPlotted; + case X14.DisplayBlanksAsValues.Zero: return XLDisplayBlanksAsValues.Zero; + + default: + throw new ArgumentOutOfRangeException(nameof(value), "Not implemented value!"); + } + } + + #endregion To ClosedXml + } +} diff --git a/ClosedXML/Excel/Exceptions/ClosedXMLException.cs b/ClosedXML/Excel/Exceptions/ClosedXMLException.cs new file mode 100644 index 0000000..3a00816 --- /dev/null +++ b/ClosedXML/Excel/Exceptions/ClosedXMLException.cs @@ -0,0 +1,19 @@ +using System; + +namespace ClosedXML.Excel.Exceptions +{ + public abstract class ClosedXMLException : Exception + { + protected ClosedXMLException() + : base() + { } + + protected ClosedXMLException(String message) + : base(message) + { } + + protected ClosedXMLException(String message, Exception innerException) + : base(message, innerException) + { } + } +} diff --git a/ClosedXML/Excel/Exceptions/EmptyTableException.cs b/ClosedXML/Excel/Exceptions/EmptyTableException.cs new file mode 100644 index 0000000..1f657e2 --- /dev/null +++ b/ClosedXML/Excel/Exceptions/EmptyTableException.cs @@ -0,0 +1,19 @@ +using System; + +namespace ClosedXML.Excel.Exceptions +{ + public class EmptyTableException : ClosedXMLException + { + public EmptyTableException() + : base() + { } + + public EmptyTableException(String message) + : base(message) + { } + + public EmptyTableException(String message, Exception innerException) + : base(message, innerException) + { } + } +} diff --git a/ClosedXML/Excel/Hyperlinks/IXLHyperlinks.cs b/ClosedXML/Excel/Hyperlinks/IXLHyperlinks.cs new file mode 100644 index 0000000..a569e49 --- /dev/null +++ b/ClosedXML/Excel/Hyperlinks/IXLHyperlinks.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLHyperlinks: IEnumerable + { + void Add(XLHyperlink hyperlink); + void Delete(XLHyperlink hyperlink); + void Delete(IXLAddress address); + + } +} diff --git a/ClosedXML/Excel/Hyperlinks/XLHyperlink_Internal.cs b/ClosedXML/Excel/Hyperlinks/XLHyperlink_Internal.cs new file mode 100644 index 0000000..3705568 --- /dev/null +++ b/ClosedXML/Excel/Hyperlinks/XLHyperlink_Internal.cs @@ -0,0 +1,66 @@ +using System; + +namespace ClosedXML.Excel +{ + public partial class XLHyperlink + { + internal XLHyperlink() + { + + } + + internal XLHyperlink(XLHyperlink hyperlink) + { + _externalAddress = hyperlink._externalAddress; + _internalAddress = hyperlink._internalAddress; + Tooltip = hyperlink.Tooltip; + IsExternal = hyperlink.IsExternal; + } + + internal void SetValues(String address, String tooltip) + { + Tooltip = tooltip; + if (address[0] == '.') + { + _externalAddress = new Uri(address, UriKind.Relative); + IsExternal = true; + } + else + { + if (Uri.TryCreate(address, UriKind.Absolute, out Uri uri)) + { + _externalAddress = uri; + IsExternal = true; + } + else + { + _internalAddress = address; + IsExternal = false; + } + } + } + + internal void SetValues(Uri uri, String tooltip) + { + Tooltip = tooltip; + _externalAddress = uri; + IsExternal = true; + } + + internal void SetValues(IXLCell cell, String tooltip) + { + Tooltip = tooltip; + _internalAddress = cell.Address.ToString(XLReferenceStyle.A1, true); + IsExternal = false; + } + + internal void SetValues(IXLRangeBase range, String tooltip) + { + Tooltip = tooltip; + _internalAddress = range.RangeAddress.ToString(XLReferenceStyle.A1, true); + IsExternal = false; + } + + internal XLWorksheet Worksheet { get; set; } + } +} diff --git a/ClosedXML/Excel/Hyperlinks/XLHyperlink_public.cs b/ClosedXML/Excel/Hyperlinks/XLHyperlink_public.cs new file mode 100644 index 0000000..cbc96f5 --- /dev/null +++ b/ClosedXML/Excel/Hyperlinks/XLHyperlink_public.cs @@ -0,0 +1,110 @@ +using ClosedXML.Extensions; +using System; +using System.Linq; + +namespace ClosedXML.Excel +{ + public partial class XLHyperlink + { + private Uri _externalAddress; + private String _internalAddress; + + public XLHyperlink(String address) + { + SetValues(address, String.Empty); + } + + public XLHyperlink(String address, String tooltip) + { + SetValues(address, tooltip); + } + + public XLHyperlink(IXLCell cell) + { + SetValues(cell, String.Empty); + } + + public XLHyperlink(IXLCell cell, String tooltip) + { + SetValues(cell, tooltip); + } + + public XLHyperlink(IXLRangeBase range) + { + SetValues(range, String.Empty); + } + + public XLHyperlink(IXLRangeBase range, String tooltip) + { + SetValues(range, tooltip); + } + + public XLHyperlink(Uri uri) + { + SetValues(uri, String.Empty); + } + + public XLHyperlink(Uri uri, String tooltip) + { + SetValues(uri, tooltip); + } + + public Boolean IsExternal { get; set; } + + public Uri ExternalAddress + { + get + { + return IsExternal ? _externalAddress : null; + } + set + { + _externalAddress = value; + IsExternal = true; + } + } + + public IXLCell Cell { get; internal set; } + + public String InternalAddress + { + get + { + if (IsExternal) + return null; + if (_internalAddress.Contains('!')) + { + return _internalAddress[0] != '\'' + ? String.Concat( + _internalAddress + .Substring(0, _internalAddress.IndexOf('!')) + .EscapeSheetName(), + '!', + _internalAddress.Substring(_internalAddress.IndexOf('!') + 1)) + : _internalAddress; + } + return String.Concat( + Worksheet.Name.EscapeSheetName(), + '!', + _internalAddress); + } + set + { + _internalAddress = value; + IsExternal = false; + } + } + + public String Tooltip { get; set; } + + public void Delete() + { + if (Cell == null) return; + Worksheet.Hyperlinks.Delete(Cell.Address); + if (Cell.Style.Font.FontColor.Equals(XLColor.FromTheme(XLThemeColor.Hyperlink))) + Cell.Style.Font.FontColor = Worksheet.StyleValue.Font.FontColor; + + Cell.Style.Font.Underline = Worksheet.StyleValue.Font.Underline; + } + } +} diff --git a/ClosedXML/Excel/Hyperlinks/XLHyperlinks.cs b/ClosedXML/Excel/Hyperlinks/XLHyperlinks.cs new file mode 100644 index 0000000..6ba4cfc --- /dev/null +++ b/ClosedXML/Excel/Hyperlinks/XLHyperlinks.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLHyperlinks: IXLHyperlinks + { + private Dictionary hyperlinks = new Dictionary(); + public IEnumerator GetEnumerator() + { + return hyperlinks.Values.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Add(XLHyperlink hyperlink) + { + hyperlinks.Add(hyperlink.Cell.Address, hyperlink); + } + + public void Delete(XLHyperlink hyperlink) + { + hyperlinks.Remove(hyperlink.Cell.Address); + } + + public void Delete(IXLAddress address) + { + hyperlinks.Remove(address); + } + + } +} diff --git a/ClosedXML/Excel/IXLFileSharing.cs b/ClosedXML/Excel/IXLFileSharing.cs new file mode 100644 index 0000000..d75c18e --- /dev/null +++ b/ClosedXML/Excel/IXLFileSharing.cs @@ -0,0 +1,17 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + public interface IXLFileSharing + { + //String AlgorithmName { get; set; } + //Byte[] HashValue { get; set; } + Boolean ReadOnlyRecommended { get; set; } + + //Byte[] ReservationPassword { get; set; } + //Byte[] SaltValue { get; set; } + //Int32 SpinCount { get; set; } + String UserName { get; set; } + } +} diff --git a/ClosedXML/Excel/IXLOutline.cs b/ClosedXML/Excel/IXLOutline.cs new file mode 100644 index 0000000..33b4711 --- /dev/null +++ b/ClosedXML/Excel/IXLOutline.cs @@ -0,0 +1,11 @@ + +namespace ClosedXML.Excel +{ + public enum XLOutlineSummaryVLocation { Top, Bottom }; + public enum XLOutlineSummaryHLocation { Left, Right }; + public interface IXLOutline + { + XLOutlineSummaryVLocation SummaryVLocation { get; set; } + XLOutlineSummaryHLocation SummaryHLocation { get; set; } + } +} diff --git a/ClosedXML/Excel/IXLSheetView.cs b/ClosedXML/Excel/IXLSheetView.cs new file mode 100644 index 0000000..7a7f14e --- /dev/null +++ b/ClosedXML/Excel/IXLSheetView.cs @@ -0,0 +1,78 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + public enum XLSheetViewOptions { Normal, PageBreakPreview, PageLayout } + + public interface IXLSheetView + { + /// + /// Gets or sets the column after which the horizontal split should take place. + /// + Int32 SplitColumn { get; set; } + + /// + /// Gets or sets the row after which the vertical split should take place. + /// + Int32 SplitRow { get; set; } + + /// + /// Gets or sets the location of the top left visible cell + /// + /// + /// The scroll position's top left cell. + /// + IXLAddress TopLeftCellAddress { get; set; } + + XLSheetViewOptions View { get; set; } + + IXLWorksheet Worksheet { get; } + + /// + /// Window zoom magnification for current view representing percent values. Horizontal and vertical scale together. + /// + /// Representing percent values ranging from 10 to 400. + Int32 ZoomScale { get; set; } + + /// + /// Zoom magnification to use when in normal view. Horizontal and vertical scale together + /// + /// Representing percent values ranging from 10 to 400. + Int32 ZoomScaleNormal { get; set; } + + /// + /// Zoom magnification to use when in page layout view. Horizontal and vertical scale together. + /// + /// Representing percent values ranging from 10 to 400. + Int32 ZoomScalePageLayoutView { get; set; } + + /// + /// Zoom magnification to use when in page break preview. Horizontal and vertical scale together. + /// + /// Representing percent values ranging from 10 to 400. + Int32 ZoomScaleSheetLayoutView { get; set; } + + /// + /// Freezes the specified rows and columns. + /// + /// The rows to freeze. + /// The columns to freeze. + void Freeze(Int32 rows, Int32 columns); + + /// + /// Freezes the left X columns. + /// + /// The columns to freeze. + void FreezeColumns(Int32 columns); + + //Boolean FreezePanes { get; set; } + /// + /// Freezes the top X rows. + /// + /// The rows to freeze. + void FreezeRows(Int32 rows); + + IXLSheetView SetView(XLSheetViewOptions value); + } +} diff --git a/ClosedXML/Excel/IXLTheme.cs b/ClosedXML/Excel/IXLTheme.cs new file mode 100644 index 0000000..b506e22 --- /dev/null +++ b/ClosedXML/Excel/IXLTheme.cs @@ -0,0 +1,20 @@ +namespace ClosedXML.Excel +{ + public interface IXLTheme + { + XLColor Background1 { get; set; } + XLColor Text1 { get; set; } + XLColor Background2 { get; set; } + XLColor Text2 { get; set; } + XLColor Accent1 { get; set; } + XLColor Accent2 { get; set; } + XLColor Accent3 { get; set; } + XLColor Accent4 { get; set; } + XLColor Accent5 { get; set; } + XLColor Accent6 { get; set; } + XLColor Hyperlink { get; set; } + XLColor FollowedHyperlink { get; set; } + + XLColor ResolveThemeColor(XLThemeColor themeColor); + } +} diff --git a/ClosedXML/Excel/IXLWorkbook.cs b/ClosedXML/Excel/IXLWorkbook.cs new file mode 100644 index 0000000..49f84af --- /dev/null +++ b/ClosedXML/Excel/IXLWorkbook.cs @@ -0,0 +1,248 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.IO; + +namespace ClosedXML.Excel +{ + public interface IXLWorkbook : IXLProtectable, IDisposable + { + String Author { get; set; } + + /// + /// Gets or sets the workbook's calculation mode. + /// + XLCalculateMode CalculateMode { get; set; } + + Boolean CalculationOnSave { get; set; } + + /// + /// Gets or sets the default column width for the workbook. + /// All new worksheets will use this column width. + /// + Double ColumnWidth { get; set; } + + IXLCustomProperties CustomProperties { get; } + + Boolean DefaultRightToLeft { get; } + + Boolean DefaultShowFormulas { get; } + + Boolean DefaultShowGridLines { get; } + + Boolean DefaultShowOutlineSymbols { get; } + + Boolean DefaultShowRowColHeaders { get; } + + Boolean DefaultShowRuler { get; } + + Boolean DefaultShowWhiteSpace { get; } + + Boolean DefaultShowZeros { get; } + + IXLFileSharing FileSharing { get; } + + Boolean ForceFullCalculation { get; set; } + + Boolean FullCalculationOnLoad { get; set; } + + Boolean FullPrecision { get; set; } + + //Boolean IsPasswordProtected { get; } + + //Boolean IsProtected { get; } + + Boolean LockStructure { get; set; } + + Boolean LockWindows { get; set; } + + /// + /// Gets an object to manipulate this workbook's named ranges. + /// + IXLNamedRanges NamedRanges { get; } + + /// + /// Gets or sets the default outline options for the workbook. + /// All new worksheets will use these outline options. + /// + IXLOutline Outline { get; set; } + + /// + /// Gets or sets the default page options for the workbook. + /// All new worksheets will use these page options. + /// + IXLPageSetup PageOptions { get; set; } + + /// + /// Gets or sets the workbook's properties. + /// + XLWorkbookProperties Properties { get; set; } + + /// + /// Gets or sets the workbook's reference style. + /// + XLReferenceStyle ReferenceStyle { get; set; } + + Boolean RightToLeft { get; set; } + + /// + /// Gets or sets the default row height for the workbook. + /// All new worksheets will use this row height. + /// + Double RowHeight { get; set; } + + Boolean ShowFormulas { get; set; } + + Boolean ShowGridLines { get; set; } + + Boolean ShowOutlineSymbols { get; set; } + + Boolean ShowRowColHeaders { get; set; } + + Boolean ShowRuler { get; set; } + + Boolean ShowWhiteSpace { get; set; } + + Boolean ShowZeros { get; set; } + + /// + /// Gets or sets the default style for the workbook. + /// All new worksheets will use this style. + /// + IXLStyle Style { get; set; } + + /// + /// Gets an object to manipulate this workbook's theme. + /// + IXLTheme Theme { get; } + + Boolean Use1904DateSystem { get; set; } + + /// + /// Gets an object to manipulate the worksheets. + /// + IXLWorksheets Worksheets { get; } + + IXLWorksheet AddWorksheet(); + + IXLWorksheet AddWorksheet(Int32 position); + + IXLWorksheet AddWorksheet(String sheetName); + + IXLWorksheet AddWorksheet(String sheetName, Int32 position); + + IXLWorksheet AddWorksheet(DataTable dataTable); + + void AddWorksheet(DataSet dataSet); + + void AddWorksheet(IXLWorksheet worksheet); + + IXLWorksheet AddWorksheet(DataTable dataTable, String sheetName); + + IXLCell Cell(String namedCell); + + IXLCells Cells(String namedCells); + + IXLCustomProperty CustomProperty(String name); + + Object Evaluate(String expression); + + IXLCells FindCells(Func predicate); + + IXLColumns FindColumns(Func predicate); + + IXLRows FindRows(Func predicate); + + IXLNamedRange NamedRange(String rangeName); + + [Obsolete("Use Protect(String password, Algorithm algorithm, TElement allowedElements)")] + IXLWorkbookProtection Protect(Boolean lockStructure, Boolean lockWindows, String password); + + [Obsolete("Use Protect(String password, Algorithm algorithm, TElement allowedElements)")] + IXLWorkbookProtection Protect(Boolean lockStructure); + + [Obsolete("Use Protect(String password, Algorithm algorithm, TElement allowedElements)")] + IXLWorkbookProtection Protect(Boolean lockStructure, Boolean lockWindows); + + IXLRange Range(String range); + + IXLRange RangeFromFullAddress(String rangeAddress, out IXLWorksheet ws); + + IXLRanges Ranges(String ranges); + + /// + /// Force recalculation of all cell formulas. + /// + void RecalculateAllFormulas(); + + /// + /// Saves the current workbook. + /// + void Save(); + + /// + /// Saves the current workbook and optionally performs validation + /// + void Save(Boolean validate, Boolean evaluateFormulae = false); + + void Save(SaveOptions options); + + /// + /// Saves the current workbook to a file. + /// + void SaveAs(String file); + + /// + /// Saves the current workbook to a file and optionally validates it. + /// + void SaveAs(String file, Boolean validate, Boolean evaluateFormulae = false); + + void SaveAs(String file, SaveOptions options); + + /// + /// Saves the current workbook to a stream. + /// + void SaveAs(Stream stream); + + /// + /// Saves the current workbook to a stream and optionally validates it. + /// + void SaveAs(Stream stream, Boolean validate, Boolean evaluateFormulae = false); + + void SaveAs(Stream stream, SaveOptions options); + + /// + /// Searches the cells' contents for a given piece of text + /// + /// The search text. + /// The compare options. + /// if set to true search formulae instead of cell values. + /// + IEnumerable Search(String searchText, CompareOptions compareOptions = CompareOptions.Ordinal, Boolean searchFormulae = false); + + XLWorkbook SetLockStructure(Boolean value); + + XLWorkbook SetLockWindows(Boolean value); + + XLWorkbook SetUse1904DateSystem(); + + XLWorkbook SetUse1904DateSystem(Boolean value); + + /// + /// Gets the Excel table of the given name + /// + /// Name of the table to return. + /// One of the enumeration values that specifies how the strings will be compared. + /// The table with given name + /// If no tables with this name could be found in the workbook. + IXLTable Table(String tableName, StringComparison comparisonType = StringComparison.OrdinalIgnoreCase); + + Boolean TryGetWorksheet(String name, out IXLWorksheet worksheet); + + IXLWorksheet Worksheet(String name); + + IXLWorksheet Worksheet(Int32 position); + } +} diff --git a/ClosedXML/Excel/IXLWorksheet.cs b/ClosedXML/Excel/IXLWorksheet.cs new file mode 100644 index 0000000..0d57d7c --- /dev/null +++ b/ClosedXML/Excel/IXLWorksheet.cs @@ -0,0 +1,483 @@ +using ClosedXML.Excel.Drawings; +using System; +using System.Drawing; +using System.IO; + +namespace ClosedXML.Excel +{ + public enum XLWorksheetVisibility { Visible, Hidden, VeryHidden } + + public interface IXLWorksheet : IXLRangeBase, IXLProtectable + { + /// + /// Gets the workbook that contains this worksheet + /// + XLWorkbook Workbook { get; } + + /// + /// Gets or sets the default column width for this worksheet. + /// + Double ColumnWidth { get; set; } + + /// + /// Gets or sets the default row height for this worksheet. + /// + Double RowHeight { get; set; } + + /// + /// Gets or sets the name (caption) of this worksheet. + /// + String Name { get; set; } + + /// + /// Gets or sets the position of the sheet. + /// When setting the Position all other sheets' positions are shifted accordingly. + /// + Int32 Position { get; set; } + + /// + /// Gets an object to manipulate the sheet's print options. + /// + IXLPageSetup PageSetup { get; } + + /// + /// Gets an object to manipulate the Outline levels. + /// + IXLOutline Outline { get; } + + /// + /// Gets the first row of the worksheet. + /// + IXLRow FirstRow(); + + /// + /// Gets the first row of the worksheet that contains a cell with a value. + /// Formatted empty cells do not count. + /// + IXLRow FirstRowUsed(); + + /// + /// Gets the first row of the worksheet that contains a cell with a value. + /// + /// If set to true formatted empty cells will count as used. + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRow FirstRowUsed(Boolean includeFormats); + + IXLRow FirstRowUsed(XLCellsUsedOptions options); + + /// + /// Gets the last row of the worksheet. + /// + IXLRow LastRow(); + + /// + /// Gets the last row of the worksheet that contains a cell with a value. + /// + IXLRow LastRowUsed(); + + /// + /// Gets the last row of the worksheet that contains a cell with a value. + /// + /// If set to true formatted empty cells will count as used. + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRow LastRowUsed(Boolean includeFormats); + + IXLRow LastRowUsed(XLCellsUsedOptions options); + + /// + /// Gets the first column of the worksheet. + /// + IXLColumn FirstColumn(); + + /// + /// Gets the first column of the worksheet that contains a cell with a value. + /// + IXLColumn FirstColumnUsed(); + + /// + /// Gets the first column of the worksheet that contains a cell with a value. + /// + /// If set to true formatted empty cells will count as used. + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLColumn FirstColumnUsed(Boolean includeFormats); + + IXLColumn FirstColumnUsed(XLCellsUsedOptions options); + + /// + /// Gets the last column of the worksheet. + /// + IXLColumn LastColumn(); + + /// + /// Gets the last column of the worksheet that contains a cell with a value. + /// + IXLColumn LastColumnUsed(); + + /// + /// Gets the last column of the worksheet that contains a cell with a value. + /// + /// If set to true formatted empty cells will count as used. + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLColumn LastColumnUsed(Boolean includeFormats); + + IXLColumn LastColumnUsed(XLCellsUsedOptions options); + + /// + /// Gets a collection of all columns in this worksheet. + /// + IXLColumns Columns(); + + /// + /// Gets a collection of the specified columns in this worksheet, separated by commas. + /// e.g. Columns("G:H"), Columns("10:11,13:14"), Columns("P:Q,S:T"), Columns("V") + /// + /// The columns to return. + IXLColumns Columns(String columns); + + /// + /// Gets a collection of the specified columns in this worksheet. + /// + /// The first column to return. + /// The last column to return. + IXLColumns Columns(String firstColumn, String lastColumn); + + /// + /// Gets a collection of the specified columns in this worksheet. + /// + /// The first column to return. + /// The last column to return. + IXLColumns Columns(Int32 firstColumn, Int32 lastColumn); + + /// + /// Gets a collection of all rows in this worksheet. + /// + IXLRows Rows(); + + /// + /// Gets a collection of the specified rows in this worksheet, separated by commas. + /// e.g. Rows("4:5"), Rows("7:8,10:11"), Rows("13") + /// + /// The rows to return. + IXLRows Rows(String rows); + + /// + /// Gets a collection of the specified rows in this worksheet. + /// + /// The first row to return. + /// The last row to return. + /// + IXLRows Rows(Int32 firstRow, Int32 lastRow); + + /// + /// Gets the specified row of the worksheet. + /// + /// The worksheet's row. + IXLRow Row(Int32 row); + + /// + /// Gets the specified column of the worksheet. + /// + /// The worksheet's column. + IXLColumn Column(Int32 column); + + /// + /// Gets the specified column of the worksheet. + /// + /// The worksheet's column. + IXLColumn Column(String column); + + /// + /// Gets the cell at the specified row and column. + /// + /// The cell's row. + /// The cell's column. + IXLCell Cell(int row, int column); + + /// Gets the cell at the specified address. + /// The cell address in the worksheet. + IXLCell Cell(string cellAddressInRange); + + /// + /// Gets the cell at the specified row and column. + /// + /// The cell's row. + /// The cell's column. + IXLCell Cell(int row, string column); + + /// Gets the cell at the specified address. + /// The cell address in the worksheet. + IXLCell Cell(IXLAddress cellAddressInRange); + + /// + /// Returns the specified range. + /// + /// The range boundaries. + IXLRange Range(IXLRangeAddress rangeAddress); + + /// Returns the specified range. + /// e.g. Range("A1"), Range("A1:C2") + /// The range boundaries. + IXLRange Range(string rangeAddress); + + /// Returns the specified range. + /// The first cell in the range. + /// The last cell in the range. + IXLRange Range(IXLCell firstCell, IXLCell lastCell); + + /// Returns the specified range. + /// The first cell address in the worksheet. + /// The last cell address in the worksheet. + IXLRange Range(string firstCellAddress, string lastCellAddress); + + /// Returns the specified range. + /// The first cell address in the worksheet. + /// The last cell address in the worksheet. + IXLRange Range(IXLAddress firstCellAddress, IXLAddress lastCellAddress); + + /// Returns a collection of ranges, separated by commas. + /// e.g. Ranges("A1"), Ranges("A1:C2"), Ranges("A1:B2,D1:D4") + /// The ranges to return. + IXLRanges Ranges(string ranges); + + /// Returns the specified range. + /// The first cell's row of the range to return. + /// The first cell's column of the range to return. + /// The last cell's row of the range to return. + /// The last cell's column of the range to return. + /// . + IXLRange Range(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn); + + /// Gets the number of rows in this worksheet. + int RowCount(); + + /// Gets the number of columns in this worksheet. + int ColumnCount(); + + /// + /// Collapses all outlined rows. + /// + IXLWorksheet CollapseRows(); + + /// + /// Collapses all outlined columns. + /// + IXLWorksheet CollapseColumns(); + + /// + /// Expands all outlined rows. + /// + IXLWorksheet ExpandRows(); + + /// + /// Expands all outlined columns. + /// + IXLWorksheet ExpandColumns(); + + /// + /// Collapses the outlined rows of the specified level. + /// + /// The outline level. + IXLWorksheet CollapseRows(Int32 outlineLevel); + + /// + /// Collapses the outlined columns of the specified level. + /// + /// The outline level. + IXLWorksheet CollapseColumns(Int32 outlineLevel); + + /// + /// Expands the outlined rows of the specified level. + /// + /// The outline level. + IXLWorksheet ExpandRows(Int32 outlineLevel); + + /// + /// Expands the outlined columns of the specified level. + /// + /// The outline level. + IXLWorksheet ExpandColumns(Int32 outlineLevel); + + /// + /// Deletes this worksheet. + /// + void Delete(); + + /// + /// Gets an object to manage this worksheet's named ranges. + /// + IXLNamedRanges NamedRanges { get; } + + /// + /// Gets the specified named range. + /// + /// Name of the range. + IXLNamedRange NamedRange(String rangeName); + + /// + /// Gets an object to manage how the worksheet is going to displayed by Excel. + /// + IXLSheetView SheetView { get; } + + /// + /// Gets the Excel table of the given index + /// + /// Index of the table to return + IXLTable Table(Int32 index); + + /// + /// Gets the Excel table of the given name + /// + /// Name of the table to return + IXLTable Table(String name); + + /// + /// Gets an object to manage this worksheet's Excel tables + /// + IXLTables Tables { get; } + + /// + /// Copies the + /// + /// + /// + IXLWorksheet CopyTo(String newSheetName); + + IXLWorksheet CopyTo(String newSheetName, Int32 position); + + IXLWorksheet CopyTo(XLWorkbook workbook, String newSheetName); + + IXLWorksheet CopyTo(XLWorkbook workbook, String newSheetName, Int32 position); + + IXLRange RangeUsed(); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRange RangeUsed(bool includeFormats); + + IXLRange RangeUsed(XLCellsUsedOptions options); + + IXLDataValidations DataValidations { get; } + + XLWorksheetVisibility Visibility { get; set; } + + IXLWorksheet Hide(); + + IXLWorksheet Unhide(); + + IXLSortElements SortRows { get; } + + IXLSortElements SortColumns { get; } + + IXLRange Sort(); + + IXLRange Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + IXLRange Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + IXLRange SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + //IXLCharts Charts { get; } + + Boolean ShowFormulas { get; set; } + + Boolean ShowGridLines { get; set; } + + Boolean ShowOutlineSymbols { get; set; } + + Boolean ShowRowColHeaders { get; set; } + + Boolean ShowRuler { get; set; } + + Boolean ShowWhiteSpace { get; set; } + + Boolean ShowZeros { get; set; } + + IXLWorksheet SetShowFormulas(); IXLWorksheet SetShowFormulas(Boolean value); + + IXLWorksheet SetShowGridLines(); IXLWorksheet SetShowGridLines(Boolean value); + + IXLWorksheet SetShowOutlineSymbols(); IXLWorksheet SetShowOutlineSymbols(Boolean value); + + IXLWorksheet SetShowRowColHeaders(); IXLWorksheet SetShowRowColHeaders(Boolean value); + + IXLWorksheet SetShowRuler(); IXLWorksheet SetShowRuler(Boolean value); + + IXLWorksheet SetShowWhiteSpace(); IXLWorksheet SetShowWhiteSpace(Boolean value); + + IXLWorksheet SetShowZeros(); IXLWorksheet SetShowZeros(Boolean value); + + XLColor TabColor { get; set; } + + IXLWorksheet SetTabColor(XLColor color); + + Boolean TabSelected { get; set; } + + Boolean TabActive { get; set; } + + IXLWorksheet SetTabSelected(); IXLWorksheet SetTabSelected(Boolean value); + + IXLWorksheet SetTabActive(); IXLWorksheet SetTabActive(Boolean value); + + IXLPivotTable PivotTable(String name); + + IXLPivotTables PivotTables { get; } + + Boolean RightToLeft { get; set; } + + IXLWorksheet SetRightToLeft(); IXLWorksheet SetRightToLeft(Boolean value); + + IXLAutoFilter AutoFilter { get; } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRows RowsUsed(Boolean includeFormats, Func predicate = null); + + IXLRows RowsUsed(XLCellsUsedOptions options = XLCellsUsedOptions.AllContents, Func predicate = null); + + IXLRows RowsUsed(Func predicate); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLColumns ColumnsUsed(Boolean includeFormats, Func predicate = null); + + IXLColumns ColumnsUsed(XLCellsUsedOptions options = XLCellsUsedOptions.AllContents, Func predicate = null); + + IXLColumns ColumnsUsed(Func predicate); + + IXLRanges MergedRanges { get; } + + IXLConditionalFormats ConditionalFormats { get; } + + IXLSparklineGroups SparklineGroups { get; } + + IXLRanges SelectedRanges { get; } + + IXLCell ActiveCell { get; set; } + + Object Evaluate(String expression); + + /// + /// Force recalculation of all cell formulas. + /// + void RecalculateAllFormulas(); + + String Author { get; set; } + + IXLPictures Pictures { get; } + + IXLPicture Picture(String pictureName); + + IXLPicture AddPicture(Stream stream); + + IXLPicture AddPicture(Stream stream, String name); + + IXLPicture AddPicture(Stream stream, XLPictureFormat format); + + IXLPicture AddPicture(Stream stream, XLPictureFormat format, String name); + + IXLPicture AddPicture(Bitmap bitmap); + + IXLPicture AddPicture(Bitmap bitmap, String name); + + IXLPicture AddPicture(String imageFile); + + IXLPicture AddPicture(String imageFile, String name); + } +} diff --git a/ClosedXML/Excel/IXLWorksheets.cs b/ClosedXML/Excel/IXLWorksheets.cs new file mode 100644 index 0000000..ea79b0b --- /dev/null +++ b/ClosedXML/Excel/IXLWorksheets.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Data; + +namespace ClosedXML.Excel +{ + public interface IXLWorksheets : IEnumerable + { + int Count { get; } + + IXLWorksheet Add(); + + IXLWorksheet Add(Int32 position); + + IXLWorksheet Add(String sheetName); + + IXLWorksheet Add(String sheetName, Int32 position); + + IXLWorksheet Add(DataTable dataTable); + + IXLWorksheet Add(DataTable dataTable, String sheetName); + + void Add(DataSet dataSet); + + Boolean Contains(String sheetName); + + void Delete(String sheetName); + + void Delete(Int32 position); + + bool TryGetWorksheet(string sheetName, out IXLWorksheet worksheet); + + IXLWorksheet Worksheet(String sheetName); + + IXLWorksheet Worksheet(Int32 position); + } +} diff --git a/ClosedXML/Excel/LoadOptions.cs b/ClosedXML/Excel/LoadOptions.cs new file mode 100644 index 0000000..3f4afc5 --- /dev/null +++ b/ClosedXML/Excel/LoadOptions.cs @@ -0,0 +1,11 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + public class LoadOptions + { + public XLEventTracking EventTracking { get; set; } = XLEventTracking.Enabled; + public Boolean RecalculateAllFormulas { get; set; } = false; + } +} diff --git a/ClosedXML/Excel/Misc/XLDictionary.cs b/ClosedXML/Excel/Misc/XLDictionary.cs new file mode 100644 index 0000000..b386e89 --- /dev/null +++ b/ClosedXML/Excel/Misc/XLDictionary.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public class XLDictionary: Dictionary + { + public XLDictionary() + { + + } + public XLDictionary(XLDictionary other) + { + other.Values.ForEach(Add); + } + + public void Initialize(T value) + { + if (Count > 0) + Clear(); + + Add(value); + } + + public void Add(T value) + { + Add(Count + 1, value); + } + } +} diff --git a/ClosedXML/Excel/Misc/XLFormula.cs b/ClosedXML/Excel/Misc/XLFormula.cs new file mode 100644 index 0000000..8027667 --- /dev/null +++ b/ClosedXML/Excel/Misc/XLFormula.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public class XLFormula + { + public XLFormula() + {} + + public XLFormula(XLFormula defaultFormula) + { + _value = defaultFormula._value; + IsFormula = defaultFormula.IsFormula; + } + + public XLFormula(String value) + { + Value = value; + } + + public XLFormula(double value) + { + Value = value.ToInvariantString(); + } + + public XLFormula(int value) + { + Value = value.ToInvariantString(); + } + + internal String _value; + public String Value + { + get { return _value; } + set + { + if (value == null) + { + _value = String.Empty; + } + else + { + _value = value.Trim(); + IsFormula = !String.IsNullOrWhiteSpace(_value) && _value.TrimStart()[0] == '=' ; + if (IsFormula) + _value = _value.Substring(1); + } + + + } + } + + public Boolean IsFormula { get; internal set; } + } +} diff --git a/ClosedXML/Excel/Misc/XLIdManager.cs b/ClosedXML/Excel/Misc/XLIdManager.cs new file mode 100644 index 0000000..7dde3e8 --- /dev/null +++ b/ClosedXML/Excel/Misc/XLIdManager.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLIdManager + { + private HashSet _hash = new HashSet(); + + + public Int32 GetNext() + { + if (_hash.Count == 0) + { + _hash.Add(1); + return 1; + } + + Int32 id = 1; + while (true) + { + if (!_hash.Contains(id)) + { + _hash.Add(id); + return id; + } + id++; + } + } + public void Add(Int32 value) + { + _hash.Add(value); + } + public void Add(IEnumerable values) + { + values.ForEach(v => _hash.Add(v)); + } + } +} diff --git a/ClosedXML/Excel/NamedRanges/IXLNamedRange.cs b/ClosedXML/Excel/NamedRanges/IXLNamedRange.cs new file mode 100644 index 0000000..56de925 --- /dev/null +++ b/ClosedXML/Excel/NamedRanges/IXLNamedRange.cs @@ -0,0 +1,123 @@ +using System; + +namespace ClosedXML.Excel +{ + public enum XLNamedRangeScope + { + Worksheet, + Workbook + } + + public interface IXLNamedRange + { + #region Public Properties + + /// + /// Gets or sets the comment for this named range. + /// + /// + /// The comment for this named range. + /// + String Comment { get; set; } + + /// + /// Checks if the named range contains invalid references (#REF!). + /// + bool IsValid { get; } + + /// + /// Gets or sets the name of the range. + /// + /// + /// The name of the range. + /// + String Name { get; set; } + + /// + /// Gets the ranges associated with this named range. + /// Note: A named range can point to multiple ranges. + /// + IXLRanges Ranges { get; } + String RefersTo { get; set; } + + /// + /// Gets the scope of this named range. + /// + XLNamedRangeScope Scope { get; } + + /// + /// Gets or sets the visibility of this named range. + /// + /// + /// true if visible; otherwise, false. + /// + Boolean Visible { get; set; } + + #endregion Public Properties + + #region Public Methods + + /// + /// Adds the specified range to this named range. + /// Note: A named range can point to multiple ranges. + /// + /// Workbook containing the range + /// The range address to add. + IXLRanges Add(XLWorkbook workbook, String rangeAddress); + + /// + /// Adds the specified range to this named range. + /// Note: A named range can point to multiple ranges. + /// + /// The range to add. + IXLRanges Add(IXLRange range); + + /// + /// Adds the specified ranges to this named range. + /// Note: A named range can point to multiple ranges. + /// + /// The ranges to add. + IXLRanges Add(IXLRanges ranges); + + /// + /// Clears the list of ranges associated with this named range. + /// (it does not clear the cells) + /// + void Clear(); + + IXLNamedRange CopyTo(IXLWorksheet targetSheet); + + /// + /// Deletes this named range (not the cells). + /// + void Delete(); + /// + /// Removes the specified range from this named range. + /// Note: A named range can point to multiple ranges. + /// + /// The range address to remove. + void Remove(String rangeAddress); + + /// + /// Removes the specified range from this named range. + /// Note: A named range can point to multiple ranges. + /// + /// The range to remove. + void Remove(IXLRange range); + + /// + /// Removes the specified ranges from this named range. + /// Note: A named range can point to multiple ranges. + /// + /// The ranges to remove. + void Remove(IXLRanges ranges); + + IXLNamedRange SetRefersTo(String range); + + IXLNamedRange SetRefersTo(IXLRangeBase range); + + IXLNamedRange SetRefersTo(IXLRanges ranges); + + #endregion Public Methods + } +} diff --git a/ClosedXML/Excel/NamedRanges/IXLNamedRanges.cs b/ClosedXML/Excel/NamedRanges/IXLNamedRanges.cs new file mode 100644 index 0000000..3d0eb51 --- /dev/null +++ b/ClosedXML/Excel/NamedRanges/IXLNamedRanges.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLNamedRanges: IEnumerable + { + /// + /// Gets the specified named range. + /// + /// Name of the range. + IXLNamedRange NamedRange(String rangeName); + + /// + /// Adds a new named range. + /// + /// Name of the range to add. + /// The range address to add. + /// + IXLNamedRange Add(String rangeName, String rangeAddress); + + /// + /// Adds a new named range. + /// + /// Name of the range to add. + /// The range to add. + /// + IXLNamedRange Add(String rangeName, IXLRange range); + + /// + /// Adds a new named range. + /// + /// Name of the range to add. + /// The ranges to add. + /// + IXLNamedRange Add(String rangeName, IXLRanges ranges); + + /// + /// Adds a new named range. + /// + /// Name of the ranges to add. + /// The range address to add. + /// The comment for the new named range. + IXLNamedRange Add(String rangeName, String rangeAddress, String comment); + + /// + /// Adds a new named range. + /// + /// Name of the ranges to add. + /// The range to add. + /// The comment for the new named range. + IXLNamedRange Add(String rangeName, IXLRange range, String comment); + + /// + /// Adds a new named range. + /// + /// Name of the ranges to add. + /// The ranges to add. + /// The comment for the new named range. + IXLNamedRange Add(String rangeName, IXLRanges ranges, String comment); + + /// + /// Deletes the specified named range (not the cells). + /// + /// Name of the range to delete. + void Delete(String rangeName); + + /// + /// Deletes the specified named range's index (not the cells). + /// + /// Index of the named range to delete. + void Delete(Int32 rangeIndex); + + + /// + /// Deletes all named ranges (not the cells). + /// + void DeleteAll(); + + Boolean TryGetValue(String name, out IXLNamedRange range); + + Boolean Contains(String name); + + /// + /// Returns a subset of named ranges that do not have invalid references. + /// + IEnumerable ValidNamedRanges(); + + /// + /// Returns a subset of named ranges that do have invalid references. + /// + IEnumerable InvalidNamedRanges(); + } +} diff --git a/ClosedXML/Excel/NamedRanges/XLNamedRange.cs b/ClosedXML/Excel/NamedRanges/XLNamedRange.cs new file mode 100644 index 0000000..538fedf --- /dev/null +++ b/ClosedXML/Excel/NamedRanges/XLNamedRange.cs @@ -0,0 +1,241 @@ +using ClosedXML.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLNamedRange : IXLNamedRange + { + private String _name; + private readonly XLNamedRanges _namedRanges; + + internal XLWorkbook Workbook => _namedRanges.Workbook; + + public XLNamedRange(XLNamedRanges namedRanges, String rangeName, String range, String comment = null) + : this(namedRanges, rangeName, validateName: true, range, comment) + { + } + + public XLNamedRange(XLNamedRanges namedRanges, String rangeName, IXLRanges ranges, String comment = null) + : this(namedRanges, rangeName, validateName: true, comment) + { + ranges.ForEach(r => RangeList.Add(r.RangeAddress.ToStringFixed(XLReferenceStyle.A1, true))); + } + + internal XLNamedRange(XLNamedRanges namedRanges, String rangeName, Boolean validateName, String range, String comment) + : this(namedRanges, rangeName, validateName, comment) + { + //TODO range.Split(',') may produce incorrect result if a worksheet name contains comma. Refactoring needed. + range.Split(',').ForEach(r => RangeList.Add(r)); + } + + internal XLNamedRange(XLNamedRanges namedRanges, String rangeName, Boolean validateName, String comment) + { + _namedRanges = namedRanges ?? throw new ArgumentNullException(nameof(namedRanges)); + Visible = true; + + if (validateName) + Name = rangeName; + else + SetNameWithoutValidation(rangeName); + + Comment = comment; + } + + /// + /// Checks if the named range contains invalid references (#REF!). + /// + public bool IsValid + { + get + { + return RangeList.SelectMany(c => c.Split(',')).All(r => + !r.StartsWith("#REF!", StringComparison.OrdinalIgnoreCase) && + !r.EndsWith("#REF!", StringComparison.OrdinalIgnoreCase)); + } + } + + public String Name + { + get { return _name; } + set + { + if (_name == value) return; + + var oldname = _name ?? string.Empty; + + var existingNames = _namedRanges.Select(nr => nr.Name).ToList(); + if (_namedRanges.Scope == XLNamedRangeScope.Workbook) + existingNames.AddRange(_namedRanges.Workbook.NamedRanges.Select(nr => nr.Name)); + + if (_namedRanges.Scope == XLNamedRangeScope.Worksheet) + existingNames.AddRange(_namedRanges.Worksheet.NamedRanges.Select(nr => nr.Name)); + + existingNames = existingNames.Distinct().ToList(); + + if (!XLHelper.ValidateName("named range", value, oldname, existingNames, out String message)) + throw new ArgumentException(message, nameof(value)); + + _name = value; + + if (!String.IsNullOrWhiteSpace(oldname) && !String.Equals(oldname, _name, StringComparison.OrdinalIgnoreCase)) + { + _namedRanges.Delete(oldname); + _namedRanges.Add(_name, this); + } + } + } + + private void SetNameWithoutValidation(string value) + { + _name = value; + } + + public IXLRanges Ranges + { + get + { + var ranges = new XLRanges(); + foreach (var rangeToAdd in + from rangeAddress in RangeList.SelectMany(c => c.Split(',')).Where(s => s[0] != '"') + let match = XLHelper.NamedRangeReferenceRegex.Match(rangeAddress) + select + match.Groups["Sheet"].Success && Workbook.Worksheets.Contains(match.Groups["Sheet"].Value) + ? Workbook.WorksheetsInternal.Worksheet(match.Groups["Sheet"].Value).Range(match.Groups["Range"].Value) as IXLRangeBase + : Workbook.Worksheets.SelectMany(sheet => sheet.Tables).SingleOrDefault(table => table.Name == match.Groups["Table"].Value)? + .DataRange?.Column(match.Groups["Column"].Value)) + { + if (rangeToAdd != null) + ranges.Add(rangeToAdd); + } + return ranges; + } + } + + public String Comment { get; set; } + + public Boolean Visible { get; set; } + + public XLNamedRangeScope Scope { get { return _namedRanges.Scope; } } + + public IXLRanges Add(XLWorkbook workbook, String rangeAddress) + { + var ranges = new XLRanges(); + var byExclamation = rangeAddress.Split('!'); + var wsName = byExclamation[0].Replace("'", ""); + var rng = byExclamation[1]; + var rangeToAdd = workbook.WorksheetsInternal.Worksheet(wsName).Range(rng); + + ranges.Add(rangeToAdd); + return Add(ranges); + } + + public IXLRanges Add(IXLRange range) + { + var ranges = new XLRanges { range }; + return Add(ranges); + } + + public IXLRanges Add(IXLRanges ranges) + { + ranges.ForEach(r => RangeList.Add(r.ToString())); + return ranges; + } + + public void Delete() + { + _namedRanges.Delete(Name); + } + + public void Clear() + { + RangeList.Clear(); + } + + public void Remove(String rangeAddress) + { + RangeList.Remove(rangeAddress); + } + + public void Remove(IXLRange range) + { + RangeList.Remove(range.ToString()); + } + + public void Remove(IXLRanges ranges) + { + ranges.ForEach(r => RangeList.Remove(r.ToString())); + } + + public override string ToString() + { + String retVal = RangeList.Aggregate(String.Empty, (agg, r) => agg + (r + ",")); + if (retVal.Length > 0) retVal = retVal.Substring(0, retVal.Length - 1); + return retVal; + } + + public String RefersTo + { + get { return ToString(); } + set + { + RangeList.Clear(); + RangeList.Add(value); + } + } + + public IXLNamedRange CopyTo(IXLWorksheet targetSheet) + { + if (targetSheet == _namedRanges.Worksheet) + throw new InvalidOperationException("Cannot copy named range to the worksheet it already belongs to."); + + var ranges = new XLRanges(); + foreach (var r in Ranges) + { + if (_namedRanges.Worksheet == r.Worksheet) + // Named ranges on the source worksheet have to point to the new destination sheet + ranges.Add(targetSheet.Range(((XLRangeAddress)r.RangeAddress).WithoutWorksheet())); + else + ranges.Add(r); + } + + return targetSheet.NamedRanges.Add(Name, ranges); + } + + internal IList RangeList { get; set; } = new List(); + + public IXLNamedRange SetRefersTo(String range) + { + RefersTo = range; + return this; + } + + public IXLNamedRange SetRefersTo(IXLRangeBase range) + { + RangeList.Clear(); + RangeList.Add(range.RangeAddress.ToStringFixed(XLReferenceStyle.A1, true)); + return this; + } + + public IXLNamedRange SetRefersTo(IXLRanges ranges) + { + RangeList.Clear(); + ranges.ForEach(r => RangeList.Add(r.RangeAddress.ToStringFixed(XLReferenceStyle.A1, true))); + return this; + } + + internal void OnWorksheetDeleted(string worksheetName) + { + var escapedSheetName = worksheetName.EscapeSheetName(); + RangeList = RangeList + .Select( + rl => string.Join(",", rl + .Split(',') + .Select(r => r.StartsWith(escapedSheetName + "!", StringComparison.OrdinalIgnoreCase) + ? "#REF!" + r.Substring(escapedSheetName.Length + 1) + : r)) + ).ToList(); + } + } +} diff --git a/ClosedXML/Excel/NamedRanges/XLNamedRanges.cs b/ClosedXML/Excel/NamedRanges/XLNamedRanges.cs new file mode 100644 index 0000000..99b88f8 --- /dev/null +++ b/ClosedXML/Excel/NamedRanges/XLNamedRanges.cs @@ -0,0 +1,208 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLNamedRanges : IXLNamedRanges + { + private readonly Dictionary _namedRanges = new Dictionary(StringComparer.OrdinalIgnoreCase); + + internal XLWorkbook Workbook { get; set; } + + internal XLWorksheet Worksheet { get; set; } + + internal XLNamedRangeScope Scope { get; } + + public XLNamedRanges(XLWorksheet worksheet) + : this(worksheet.Workbook) + { + Worksheet = worksheet; + Scope = XLNamedRangeScope.Worksheet; + } + + public XLNamedRanges(XLWorkbook workbook) + { + Workbook = workbook; + Scope = XLNamedRangeScope.Workbook; + } + + #region IXLNamedRanges Members + + public IXLNamedRange NamedRange(String rangeName) + { + if (_namedRanges.TryGetValue(rangeName, out IXLNamedRange range)) + return range; + + return null; + } + + public IXLNamedRange Add(String rangeName, String rangeAddress) + { + return Add(rangeName, rangeAddress, null); + } + + public IXLNamedRange Add(String rangeName, IXLRange range) + { + return Add(rangeName, range, null); + } + + public IXLNamedRange Add(String rangeName, IXLRanges ranges) + { + return Add(rangeName, ranges, null); + } + + public IXLNamedRange Add(String rangeName, String rangeAddress, String comment) + { + return Add(rangeName, rangeAddress, comment, validateName: true, validateRangeAddress: true); + } + + /// + /// Adds the specified range name. + /// + /// Name of the range. + /// The range address. + /// The comment. + /// if set to true validates the name. + /// if set to true range address will be checked for validity. + /// + /// + /// + /// For named ranges in the workbook scope, specify the sheet name in the reference. + /// + internal IXLNamedRange Add(String rangeName, String rangeAddress, String comment, Boolean validateName, Boolean validateRangeAddress) + { + // When loading named ranges from an existing file, we do not validate the range address or name. + if (validateRangeAddress) + { + var match = XLHelper.NamedRangeReferenceRegex.Match(rangeAddress); + + if (!match.Success) + { + if (XLHelper.IsValidRangeAddress(rangeAddress)) + { + IXLRange range = null; + if (Scope == XLNamedRangeScope.Worksheet) + range = Worksheet.Range(rangeAddress); + else if (Scope == XLNamedRangeScope.Workbook) + range = Workbook.Range(rangeAddress); + else + throw new NotSupportedException($"Scope {Scope} is not supported"); + + if (range == null) + throw new ArgumentException(string.Format( + "The range address '{0}' for the named range '{1}' is not a valid range.", rangeAddress, + rangeName)); + + if (Scope == XLNamedRangeScope.Workbook || !XLHelper.NamedRangeReferenceRegex.Match(range.ToString()).Success) + throw new ArgumentException( + "For named ranges in the workbook scope, specify the sheet name in the reference."); + + rangeAddress = Worksheet.Range(rangeAddress).ToString(); + } + } + } + + var namedRange = new XLNamedRange(this, rangeName, validateName, rangeAddress, comment); + _namedRanges.Add(rangeName, namedRange); + return namedRange; + } + + public IXLNamedRange Add(String rangeName, IXLRange range, String comment) + { + var ranges = new XLRanges { range }; + return Add(rangeName, ranges, comment); + } + + public IXLNamedRange Add(String rangeName, IXLRanges ranges, String comment) + { + var namedRange = new XLNamedRange(this, rangeName, ranges, comment); + _namedRanges.Add(rangeName, namedRange); + return namedRange; + } + + public IXLNamedRange Add(String rangeName, IXLNamedRange namedRange) + { + _namedRanges.Add(rangeName, namedRange); + return namedRange; + } + + public void Delete(String rangeName) + { + _namedRanges.Remove(rangeName); + } + + public void Delete(Int32 rangeIndex) + { + _namedRanges.Remove(_namedRanges.ElementAt(rangeIndex).Key); + } + + public void DeleteAll() + { + _namedRanges.Clear(); + } + + /// + /// Returns a subset of named ranges that do not have invalid references. + /// + public IEnumerable ValidNamedRanges() + { + return this.Where(nr => nr.IsValid); + } + + /// + /// Returns a subset of named ranges that do have invalid references. + /// + public IEnumerable InvalidNamedRanges() + { + return this.Where(nr => !nr.IsValid); + } + + #endregion IXLNamedRanges Members + + #region IEnumerable Members + + public IEnumerator GetEnumerator() + { + return _namedRanges.Values.GetEnumerator(); + } + + #endregion IEnumerable Members + + #region IEnumerable Members + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + #endregion IEnumerable Members + + public Boolean TryGetValue(String name, out IXLNamedRange range) + { + if (_namedRanges.TryGetValue(name, out range)) return true; + + if (Scope == XLNamedRangeScope.Workbook) + range = Workbook.NamedRange(name); + + return range != null; + } + + public Boolean Contains(String name) + { + if (_namedRanges.ContainsKey(name)) return true; + + if (Scope == XLNamedRangeScope.Workbook) + return Workbook.NamedRange(name) != null; + else + return false; + } + + internal void OnWorksheetDeleted(string worksheetName) + { + _namedRanges.Values + .Cast() + .ForEach(nr => nr.OnWorksheetDeleted(worksheetName)); + } + } +} diff --git a/ClosedXML/Excel/PageSetup/IXLHFItem.cs b/ClosedXML/Excel/PageSetup/IXLHFItem.cs new file mode 100644 index 0000000..5f7fc0e --- /dev/null +++ b/ClosedXML/Excel/PageSetup/IXLHFItem.cs @@ -0,0 +1,48 @@ +using System; + +namespace ClosedXML.Excel +{ + public enum XLHFPredefinedText + { + PageNumber, NumberOfPages, Date, Time, FullPath, Path, File, SheetName + } + public enum XLHFOccurrence + { + AllPages, OddPages, EvenPages, FirstPage + } + + public interface IXLHFItem: IXLWithRichString + { + /// + /// Gets the text of the specified header/footer occurrence. + /// + /// The occurrence. + String GetText(XLHFOccurrence occurrence); + + /// + /// Adds the given predefined text to this header/footer item. + /// + /// The predefined text to add to this header/footer item. + IXLRichString AddText(XLHFPredefinedText predefinedText); + + /// + /// Adds the given text to this header/footer item. + /// + /// The text to add to this header/footer item. + /// The occurrence for the text. + IXLRichString AddText(String text, XLHFOccurrence occurrence); + + /// + /// Adds the given predefined text to this header/footer item. + /// + /// The predefined text to add to this header/footer item. + /// The occurrence for the predefined text. + IXLRichString AddText(XLHFPredefinedText predefinedText, XLHFOccurrence occurrence); + + /// Clears the text/formats of this header/footer item. + /// The occurrence to clear. + void Clear(XLHFOccurrence occurrence = XLHFOccurrence.AllPages); + + IXLRichString AddImage(String imagePath, XLHFOccurrence occurrence = XLHFOccurrence.AllPages); + } +} diff --git a/ClosedXML/Excel/PageSetup/IXLHeaderFooter.cs b/ClosedXML/Excel/PageSetup/IXLHeaderFooter.cs new file mode 100644 index 0000000..2358754 --- /dev/null +++ b/ClosedXML/Excel/PageSetup/IXLHeaderFooter.cs @@ -0,0 +1,31 @@ +using System; + +namespace ClosedXML.Excel +{ + public enum XLHFMode { OddPagesOnly, OddAndEvenPages, Odd } + public interface IXLHeaderFooter + { + /// + /// Gets the left header/footer item. + /// + IXLHFItem Left { get; } + + /// + /// Gets the middle header/footer item. + /// + IXLHFItem Center { get; } + + /// + /// Gets the right header/footer item. + /// + IXLHFItem Right { get; } + + /// + /// Gets the text of the specified header/footer occurrence. + /// + /// The occurrence. + String GetText(XLHFOccurrence occurrence); + + IXLHeaderFooter Clear(XLHFOccurrence occurrence = XLHFOccurrence.AllPages); + } +} diff --git a/ClosedXML/Excel/PageSetup/IXLMargins.cs b/ClosedXML/Excel/PageSetup/IXLMargins.cs new file mode 100644 index 0000000..148fcfb --- /dev/null +++ b/ClosedXML/Excel/PageSetup/IXLMargins.cs @@ -0,0 +1,39 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLMargins + { + /// Gets or sets the Left margin. + /// The Left margin. + Double Left { get; set; } + + /// Gets or sets the Right margin. + /// The Right margin. + Double Right { get; set; } + + /// Gets or sets the Top margin. + /// The Top margin. + Double Top { get; set; } + + /// Gets or sets the Bottom margin. + /// The Bottom margin. + Double Bottom { get; set; } + + /// Gets or sets the Header margin. + /// The Header margin. + Double Header { get; set; } + + /// Gets or sets the Footer margin. + /// The Footer margin. + Double Footer { get; set; } + + IXLMargins SetLeft(Double value); + IXLMargins SetRight(Double value); + IXLMargins SetTop(Double value); + IXLMargins SetBottom(Double value); + IXLMargins SetHeader(Double value); + IXLMargins SetFooter(Double value); + + } +} diff --git a/ClosedXML/Excel/PageSetup/IXLPageSetup.cs b/ClosedXML/Excel/PageSetup/IXLPageSetup.cs new file mode 100644 index 0000000..d474a70 --- /dev/null +++ b/ClosedXML/Excel/PageSetup/IXLPageSetup.cs @@ -0,0 +1,311 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public enum XLPageOrientation { Default, Portrait, Landscape } + public enum XLPaperSize + { + LetterPaper = 1, + LetterSmallPaper = 2, + TabloidPaper = 3, + LedgerPaper = 4, + LegalPaper = 5, + StatementPaper = 6, + ExecutivePaper = 7, + A3Paper = 8, + A4Paper = 9, + A4SmallPaper = 10, + A5Paper = 11, + B4Paper = 12, + B5Paper = 13, + FolioPaper = 14, + QuartoPaper = 15, + StandardPaper = 16, + StandardPaper1 = 17, + NotePaper = 18, + No9Envelope = 19, + No10Envelope = 20, + No11Envelope = 21, + No12Envelope = 22, + No14Envelope = 23, + CPaper = 24, + DPaper = 25, + EPaper = 26, + DlEnvelope = 27, + C5Envelope = 28, + C3Envelope = 29, + C4Envelope = 30, + C6Envelope = 31, + C65Envelope = 32, + B4Envelope = 33, + B5Envelope = 34, + B6Envelope = 35, + ItalyEnvelope = 36, + MonarchEnvelope = 37, + No634Envelope = 38, + UsStandardFanfold = 39, + GermanStandardFanfold = 40, + GermanLegalFanfold = 41, + IsoB4 = 42, + JapaneseDoublePostcard = 43, + StandardPaper2 = 44, + StandardPaper3 = 45, + StandardPaper4 = 46, + InviteEnvelope = 47, + LetterExtraPaper = 50, + LegalExtraPaper = 51, + TabloidExtraPaper = 52, + A4ExtraPaper = 53, + LetterTransversePaper = 54, + A4TransversePaper = 55, + LetterExtraTransversePaper = 56, + SuperaSuperaA4Paper = 57, + SuperbSuperbA3Paper = 58, + LetterPlusPaper = 59, + A4PlusPaper = 60, + A5TransversePaper = 61, + JisB5TransversePaper = 62, + A3ExtraPaper = 63, + A5ExtraPaper = 64, + IsoB5ExtraPaper = 65, + A2Paper = 66, + A3TransversePaper = 67, + A3ExtraTransversePaper = 68 + } + public enum XLPageOrderValues { DownThenOver, OverThenDown } + public enum XLShowCommentsValues { None, AtEnd, AsDisplayed } + public enum XLPrintErrorValues { Blank, Dash, Displayed, NA } + + public interface IXLPageSetup + { + /// + /// Gets an object to manage the print areas of the worksheet. + /// + IXLPrintAreas PrintAreas { get; } + /// + /// Gets the first row that will repeat on the top of the printed pages. + /// Use SetRowsToRepeatAtTop() to set the rows that will be repeated on the top of the printed pages. + /// + Int32 FirstRowToRepeatAtTop { get; } + /// + /// Gets the last row that will repeat on the top of the printed pages. + /// Use SetRowsToRepeatAtTop() to set the rows that will be repeated on the top of the printed pages. + /// + Int32 LastRowToRepeatAtTop { get; } + /// + /// Sets the rows to repeat on the top of the printed pages. + /// + /// The range of rows to repeat on the top of the printed pages. + void SetRowsToRepeatAtTop(String range); + /// + /// Sets the rows to repeat on the top of the printed pages. + /// + /// The first row to repeat at top. + /// The last row to repeat at top. + void SetRowsToRepeatAtTop(Int32 firstRowToRepeatAtTop, Int32 lastRowToRepeatAtTop); + + /// Gets the first column to repeat on the left of the printed pages. + /// The first column to repeat on the left of the printed pages. + Int32 FirstColumnToRepeatAtLeft { get; } + /// Gets the last column to repeat on the left of the printed pages. + /// The last column to repeat on the left of the printed pages. + Int32 LastColumnToRepeatAtLeft { get; } + /// + /// Sets the rows to repeat on the left of the printed pages. + /// + /// The first column to repeat at left. + /// The last column to repeat at left. + void SetColumnsToRepeatAtLeft(Int32 firstColumnToRepeatAtLeft, Int32 lastColumnToRepeatAtLeft); + /// + /// Sets the rows to repeat on the left of the printed pages. + /// + /// The range of rows to repeat on the left of the printed pages. + void SetColumnsToRepeatAtLeft(String range); + + /// Gets or sets the page orientation for printing. + /// The page orientation. + XLPageOrientation PageOrientation { get; set; } + /// + /// Gets or sets the number of pages wide (horizontal) the worksheet will be printed on. + /// If you don't specify the PagesTall, Excel will adjust that value + /// based on the contents of the worksheet and the PagesWide number. + /// Setting this value will override the Scale value. + /// + Int32 PagesWide { get; set; } + /// + /// Gets or sets the number of pages tall (vertical) the worksheet will be printed on. + /// If you don't specify the PagesWide, Excel will adjust that value + /// based on the contents of the worksheet and the PagesTall number. + /// Setting this value will override the Scale value. + /// + Int32 PagesTall { get; set; } + /// + /// Gets or sets the scale at which the worksheet will be printed. + /// The worksheet will be printed on as many pages as necessary to print at the given scale. + /// Setting this value will override the PagesWide and PagesTall values. + /// + Int32 Scale { get; set; } + /// + /// Gets or sets the horizontal dpi for printing the worksheet. + /// + Int32 HorizontalDpi { get; set; } + /// + /// Gets or sets the vertical dpi for printing the worksheet. + /// + Int32 VerticalDpi { get; set; } + /// + /// Gets or sets the page number that will begin the printout. + /// For example, the first page of your printout could be numbered page 5. + /// + UInt32? FirstPageNumber { get; set; } + /// + /// Gets or sets a value indicating whether the worksheet will be centered on the page horizontally. + /// + /// + /// true if the worksheet will be centered on the page horizontally; otherwise, false. + /// + Boolean CenterHorizontally { get; set; } + /// + /// Gets or sets a value indicating whether the worksheet will be centered on the page vertically. + /// + /// + /// true if the worksheet will be centered on the page vartically; otherwise, false. + /// + Boolean CenterVertically { get; set; } + /// + /// Sets the scale at which the worksheet will be printed. This is equivalent to setting the Scale property. + /// The worksheet will be printed on as many pages as necessary to print at the given scale. + /// Setting this value will override the PagesWide and PagesTall values. + /// + /// The scale at which the worksheet will be printed. + void AdjustTo(Int32 percentageOfNormalSize); + /// + /// Gets or sets the number of pages the worksheet will be printed on. + /// This is equivalent to setting both PagesWide and PagesTall properties. + /// Setting this value will override the Scale value. + /// + /// The pages wide. + /// The pages tall. + void FitToPages(Int32 pagesWide, Int32 pagesTall); + /// + /// Gets or sets the size of the paper to print the worksheet. + /// + XLPaperSize PaperSize { get; set; } + /// + /// Gets an object to work with the page margins. + /// + IXLMargins Margins { get; } + + /// + /// Gets an object to work with the page headers. + /// + IXLHeaderFooter Header { get; } + /// + /// Gets an object to work with the page footers. + /// + IXLHeaderFooter Footer { get; } + /// + /// Gets or sets a value indicating whether Excel will automatically adjust the font size to the scale of the worksheet. + /// + /// + /// true if Excel will automatically adjust the font size to the scale of the worksheet; otherwise, false. + /// + Boolean ScaleHFWithDocument { get; set; } + /// + /// Gets or sets a value indicating whether the header and footer margins are aligned with the left and right margins of the worksheet. + /// + /// + /// true if the header and footer margins are aligned with the left and right margins of the worksheet; otherwise, false. + /// + Boolean AlignHFWithMargins { get; set; } + + /// + /// Gets or sets a value indicating whether the gridlines will be printed. + /// + /// + /// true if the gridlines will be printed; otherwise, false. + /// + Boolean ShowGridlines { get; set; } + /// + /// Gets or sets a value indicating whether to show row numbers and column letters/numbers. + /// + /// + /// true to show row numbers and column letters/numbers; otherwise, false. + /// + Boolean ShowRowAndColumnHeadings { get; set; } + /// + /// Gets or sets a value indicating whether the worksheet will be printed in black and white. + /// + /// + /// true if the worksheet will be printed in black and white; otherwise, false. + /// + Boolean BlackAndWhite { get; set; } + /// + /// Gets or sets a value indicating whether the worksheet will be printed in draft quality. + /// + /// + /// true if the worksheet will be printed in draft quality; otherwise, false. + /// + Boolean DraftQuality { get; set; } + /// + /// Gets or sets the page order for printing. + /// + XLPageOrderValues PageOrder { get; set; } + /// + /// Gets or sets how the comments will be printed. + /// + XLShowCommentsValues ShowComments { get; set; } + + /// + /// Gets a list with the row breaks (for printing). + /// + List RowBreaks { get; } + /// + /// Gets a list with the column breaks (for printing). + /// + List ColumnBreaks { get; } + /// + /// Adds a horizontal page break after the given row. + /// + /// The row to insert the break. + void AddHorizontalPageBreak(Int32 row); + + /// + /// Adds a vertical page break after the given column. + /// + /// The column to insert the break. + void AddVerticalPageBreak(Int32 column); + + /// + /// Gets or sets how error values will be printed. + /// + XLPrintErrorValues PrintErrorValue { get; set; } + + IXLPageSetup SetPageOrientation(XLPageOrientation value); + IXLPageSetup SetPagesWide(Int32 value); + IXLPageSetup SetPagesTall(Int32 value); + IXLPageSetup SetScale(Int32 value); + IXLPageSetup SetHorizontalDpi(Int32 value); + IXLPageSetup SetVerticalDpi(Int32 value); + IXLPageSetup SetFirstPageNumber(UInt32? value); + IXLPageSetup SetCenterHorizontally(); IXLPageSetup SetCenterHorizontally(Boolean value); + IXLPageSetup SetCenterVertically(); IXLPageSetup SetCenterVertically(Boolean value); + IXLPageSetup SetPaperSize(XLPaperSize value); + IXLPageSetup SetScaleHFWithDocument(); IXLPageSetup SetScaleHFWithDocument(Boolean value); + IXLPageSetup SetAlignHFWithMargins(); IXLPageSetup SetAlignHFWithMargins(Boolean value); + IXLPageSetup SetShowGridlines(); IXLPageSetup SetShowGridlines(Boolean value); + IXLPageSetup SetShowRowAndColumnHeadings(); IXLPageSetup SetShowRowAndColumnHeadings(Boolean value); + IXLPageSetup SetBlackAndWhite(); IXLPageSetup SetBlackAndWhite(Boolean value); + IXLPageSetup SetDraftQuality(); IXLPageSetup SetDraftQuality(Boolean value); + IXLPageSetup SetPageOrder(XLPageOrderValues value); + IXLPageSetup SetShowComments(XLShowCommentsValues value); + IXLPageSetup SetPrintErrorValue(XLPrintErrorValues value); + + + Boolean DifferentFirstPageOnHF { get; set; } + IXLPageSetup SetDifferentFirstPageOnHF(); IXLPageSetup SetDifferentFirstPageOnHF(Boolean value); + Boolean DifferentOddEvenPagesOnHF { get; set; } + IXLPageSetup SetDifferentOddEvenPagesOnHF(); IXLPageSetup SetDifferentOddEvenPagesOnHF(Boolean value); + } +} diff --git a/ClosedXML/Excel/PageSetup/IXLPrintAreas.cs b/ClosedXML/Excel/PageSetup/IXLPrintAreas.cs new file mode 100644 index 0000000..8f04642 --- /dev/null +++ b/ClosedXML/Excel/PageSetup/IXLPrintAreas.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLPrintAreas: IEnumerable + { + /// Removes the print areas from the worksheet. + void Clear(); + + /// Adds a range to the print areas. + /// The first cell row. + /// The first cell column. + /// The last cell row. + /// The last cell column. + void Add(Int32 firstCellRow, Int32 firstCellColumn, Int32 lastCellRow, Int32 lastCellColumn); + + /// Adds a range to the print areas. + /// The range address to add. + void Add(String rangeAddress); + + /// Adds a range to the print areas. + /// The first cell address. + /// The last cell address. + void Add(String firstCellAddress, String lastCellAddress); + + /// Adds a range to the print areas. + /// The first cell address. + /// The last cell address. + void Add(IXLAddress firstCellAddress, IXLAddress lastCellAddress); + } +} diff --git a/ClosedXML/Excel/PageSetup/XLHFItem.cs b/ClosedXML/Excel/PageSetup/XLHFItem.cs new file mode 100644 index 0000000..f46500c --- /dev/null +++ b/ClosedXML/Excel/PageSetup/XLHFItem.cs @@ -0,0 +1,118 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLHFItem : IXLHFItem + { + internal readonly XLHeaderFooter HeaderFooter; + public XLHFItem(XLHeaderFooter headerFooter) + { + HeaderFooter = headerFooter; + } + public XLHFItem(XLHFItem defaultHFItem, XLHeaderFooter headerFooter) + :this(headerFooter) + { + defaultHFItem.texts.ForEach(kp => texts.Add(kp.Key, kp.Value)); + } + private readonly Dictionary> texts = new Dictionary>(); + public String GetText(XLHFOccurrence occurrence) + { + var sb = new StringBuilder(); + if(texts.TryGetValue(occurrence, out List hfTexts)) + { + foreach (var hfText in hfTexts) + sb.Append(hfText.GetHFText(sb.ToString())); + } + + return sb.ToString(); + } + + public IXLRichString AddText(String text) + { + return AddText(text, XLHFOccurrence.AllPages); + } + public IXLRichString AddText(XLHFPredefinedText predefinedText) + { + return AddText(predefinedText, XLHFOccurrence.AllPages); + } + + public IXLRichString AddText(String text, XLHFOccurrence occurrence) + { + XLRichString richText = new XLRichString(text, this.HeaderFooter.Worksheet.Style.Font, this); + + var hfText = new XLHFText(richText, this); + if (occurrence == XLHFOccurrence.AllPages) + { + AddTextToOccurrence(hfText, XLHFOccurrence.EvenPages); + AddTextToOccurrence(hfText, XLHFOccurrence.FirstPage); + AddTextToOccurrence(hfText, XLHFOccurrence.OddPages); + } + else + { + AddTextToOccurrence(hfText, occurrence); + } + + return richText; + } + + public IXLRichString AddNewLine() + { + return AddText(Environment.NewLine); + } + + public IXLRichString AddImage(String imagePath, XLHFOccurrence occurrence = XLHFOccurrence.AllPages) + { + throw new NotImplementedException(); + } + + private void AddTextToOccurrence(XLHFText hfText, XLHFOccurrence occurrence) + { + if (texts.TryGetValue(occurrence, out List hfTexts)) + hfTexts.Add(hfText); + else + texts.Add(occurrence, new List { hfText }); + + this.HeaderFooter.Changed = true; + } + + public IXLRichString AddText(XLHFPredefinedText predefinedText, XLHFOccurrence occurrence) + { + String hfText; + switch (predefinedText) + { + case XLHFPredefinedText.PageNumber: hfText = "&P"; break; + case XLHFPredefinedText.NumberOfPages : hfText = "&N"; break; + case XLHFPredefinedText.Date : hfText = "&D"; break; + case XLHFPredefinedText.Time : hfText = "&T"; break; + case XLHFPredefinedText.Path : hfText = "&Z"; break; + case XLHFPredefinedText.File : hfText = "&F"; break; + case XLHFPredefinedText.SheetName : hfText = "&A"; break; + case XLHFPredefinedText.FullPath: hfText = "&Z&F"; break; + default: throw new NotImplementedException(); + } + return AddText(hfText, occurrence); + } + + public void Clear(XLHFOccurrence occurrence = XLHFOccurrence.AllPages) + { + if (occurrence == XLHFOccurrence.AllPages) + { + ClearOccurrence(XLHFOccurrence.EvenPages); + ClearOccurrence(XLHFOccurrence.FirstPage); + ClearOccurrence(XLHFOccurrence.OddPages); + } + else + { + ClearOccurrence(occurrence); + } + } + + private void ClearOccurrence(XLHFOccurrence occurrence) + { + if (texts.ContainsKey(occurrence)) + texts.Remove(occurrence); + } + } +} diff --git a/ClosedXML/Excel/PageSetup/XLHFText.cs b/ClosedXML/Excel/PageSetup/XLHFText.cs new file mode 100644 index 0000000..6659cd6 --- /dev/null +++ b/ClosedXML/Excel/PageSetup/XLHFText.cs @@ -0,0 +1,104 @@ +using System; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLHFText + { + private readonly XLHFItem _hfItem; + + public XLHFText(XLRichString richText, XLHFItem hfItem) + { + RichText = richText; + _hfItem = hfItem; + } + + public XLRichString RichText { get; private set; } + + public String GetHFText(String prevText) + { + var wsFont = _hfItem.HeaderFooter.Worksheet.Style.Font; + + var isRichText = RichText.FontName != null && RichText.FontName != wsFont.FontName + || RichText.Bold != wsFont.Bold + || RichText.Italic != wsFont.Italic + || RichText.Strikethrough != wsFont.Strikethrough + || RichText.FontSize > 0 && Math.Abs(RichText.FontSize - wsFont.FontSize) > XLHelper.Epsilon + || RichText.VerticalAlignment != wsFont.VerticalAlignment + || RichText.Underline != wsFont.Underline + || !RichText.FontColor.Equals(wsFont.FontColor); + + if (!isRichText) + return RichText.Text; + + StringBuilder sb = new StringBuilder(); + + if (RichText.FontName != null && RichText.FontName != wsFont.FontName) + sb.Append("&\"" + RichText.FontName); + else + sb.Append("&\"-"); + + if (RichText.Bold && RichText.Italic) + sb.Append(",Bold Italic\""); + else if (RichText.Bold) + sb.Append(",Bold\""); + else if (RichText.Italic) + sb.Append(",Italic\""); + else + sb.Append(",Regular\""); + + if (RichText.FontSize > 0 && Math.Abs(RichText.FontSize - wsFont.FontSize) > XLHelper.Epsilon) + sb.Append("&" + RichText.FontSize); + + if (RichText.Strikethrough && !wsFont.Strikethrough) + sb.Append("&S"); + + if (RichText.VerticalAlignment != wsFont.VerticalAlignment) + { + if (RichText.VerticalAlignment == XLFontVerticalTextAlignmentValues.Subscript) + sb.Append("&Y"); + else if (RichText.VerticalAlignment == XLFontVerticalTextAlignmentValues.Superscript) + sb.Append("&X"); + } + + if (RichText.Underline != wsFont.Underline) + { + if (RichText.Underline == XLFontUnderlineValues.Single) + sb.Append("&U"); + else if (RichText.Underline == XLFontUnderlineValues.Double) + sb.Append("&E"); + } + + var lastColorPosition = prevText.LastIndexOf("&K"); + + if ( + (lastColorPosition >= 0 && !RichText.FontColor.Equals(XLColor.FromHtml("#" + prevText.Substring(lastColorPosition + 2, 6)))) + || (lastColorPosition == -1 && !RichText.FontColor.Equals(wsFont.FontColor)) + ) + sb.Append("&K" + RichText.FontColor.Color.ToHex().Substring(2)); + + sb.Append(RichText.Text); + + if (RichText.Underline != wsFont.Underline) + { + if (RichText.Underline == XLFontUnderlineValues.Single) + sb.Append("&U"); + else if (RichText.Underline == XLFontUnderlineValues.Double) + sb.Append("&E"); + } + + if (RichText.VerticalAlignment != wsFont.VerticalAlignment) + { + if (RichText.VerticalAlignment == XLFontVerticalTextAlignmentValues.Subscript) + sb.Append("&Y"); + else if (RichText.VerticalAlignment == XLFontVerticalTextAlignmentValues.Superscript) + sb.Append("&X"); + } + + if (RichText.Strikethrough && !wsFont.Strikethrough) + sb.Append("&S"); + + return sb.ToString(); + } + } +} diff --git a/ClosedXML/Excel/PageSetup/XLHeaderFooter.cs b/ClosedXML/Excel/PageSetup/XLHeaderFooter.cs new file mode 100644 index 0000000..2290db0 --- /dev/null +++ b/ClosedXML/Excel/PageSetup/XLHeaderFooter.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + using System.Linq; + + internal class XLHeaderFooter: IXLHeaderFooter + { + + public XLHeaderFooter(XLWorksheet worksheet) + { + this.Worksheet = worksheet; + Left = new XLHFItem(this); + Right = new XLHFItem(this); + Center = new XLHFItem(this); + SetAsInitial(); + } + + public XLHeaderFooter(XLHeaderFooter defaultHF, XLWorksheet worksheet) + { + this.Worksheet = worksheet; + defaultHF.innerTexts.ForEach(kp => innerTexts.Add(kp.Key, kp.Value)); + Left = new XLHFItem(defaultHF.Left as XLHFItem, this); + Center = new XLHFItem(defaultHF.Center as XLHFItem, this); + Right = new XLHFItem(defaultHF.Right as XLHFItem, this); + SetAsInitial(); + } + + internal readonly IXLWorksheet Worksheet; + + public IXLHFItem Left { get; private set; } + public IXLHFItem Center { get; private set; } + public IXLHFItem Right { get; private set; } + + public String GetText(XLHFOccurrence occurrence) + { + //if (innerTexts.ContainsKey(occurrence)) return innerTexts[occurrence]; + + var retVal = String.Empty; + var leftText = Left.GetText(occurrence); + var centerText = Center.GetText(occurrence); + var rightText = Right.GetText(occurrence); + retVal += leftText.Length > 0 ? "&L" + leftText : String.Empty; + retVal += centerText.Length > 0 ? "&C" + centerText : String.Empty; + retVal += rightText.Length > 0 ? "&R" + rightText : String.Empty; + if (retVal.Length > 255) + throw new ArgumentOutOfRangeException("Headers and Footers cannot be longer than 255 characters (including style markups)"); + return retVal; + } + + private Dictionary innerTexts = new Dictionary(); + internal void SetInnerText(XLHFOccurrence occurrence, String text) + { + var parsedElements = ParseFormattedHeaderFooterText(text); + + if (parsedElements.Any(e => e.Position == 'L')) + this.Left.AddText(string.Join("\r\n", parsedElements.Where(e => e.Position == 'L').Select(e => e.Text).ToArray()), occurrence); + + if (parsedElements.Any(e => e.Position == 'C')) + this.Center.AddText(string.Join("\r\n", parsedElements.Where(e => e.Position == 'C').Select(e => e.Text).ToArray()), occurrence); + + if (parsedElements.Any(e => e.Position == 'R')) + this.Right.AddText(string.Join("\r\n", parsedElements.Where(e => e.Position == 'R').Select(e => e.Text).ToArray()), occurrence); + + innerTexts[occurrence] = text; + } + + private struct ParsedHeaderFooterElement + { + public char Position; + public string Text; + } + + private static IEnumerable ParseFormattedHeaderFooterText(string text) + { + Func IsAtPositionIndicator = i => i < text.Length - 1 && text[i] == '&' && (new char[] { 'L', 'C', 'R' }.Contains(text[i + 1])); + + var parsedElements = new List(); + var currentPosition = 'L'; // default is LEFT + var hfElement = ""; + + for (int i = 0; i < text.Length; i++) + { + if (IsAtPositionIndicator(i)) + { + if ("" != hfElement) parsedElements.Add(new ParsedHeaderFooterElement() + { + Position = currentPosition, + Text = hfElement + }); + + currentPosition = text[i + 1]; + i += 2; + hfElement = ""; + } + + if (i < text.Length) + { + if (IsAtPositionIndicator(i)) + i--; + else + hfElement += text[i]; + } + } + + if ("" != hfElement) + parsedElements.Add(new ParsedHeaderFooterElement() + { + Position = currentPosition, + Text = hfElement + }); + return parsedElements; + } + + private Dictionary _initialTexts; + + private Boolean _changed; + internal Boolean Changed + { + get + { + return _changed || _initialTexts.Any(it => GetText(it.Key) != it.Value); + } + set { _changed = value; } + } + + internal void SetAsInitial() + { + _initialTexts = new Dictionary(); + foreach (var o in Enum.GetValues(typeof(XLHFOccurrence)).Cast()) + { + _initialTexts.Add(o, GetText(o)); + } + } + + + public IXLHeaderFooter Clear(XLHFOccurrence occurrence = XLHFOccurrence.AllPages) + { + Left.Clear(occurrence); + Right.Clear(occurrence); + Center.Clear(occurrence); + return this; + } + } +} diff --git a/ClosedXML/Excel/PageSetup/XLMargins.cs b/ClosedXML/Excel/PageSetup/XLMargins.cs new file mode 100644 index 0000000..9643542 --- /dev/null +++ b/ClosedXML/Excel/PageSetup/XLMargins.cs @@ -0,0 +1,22 @@ +using System; + +namespace ClosedXML.Excel +{ + internal class XLMargins: IXLMargins + { + public Double Left { get; set; } + public Double Right { get; set; } + public Double Top { get; set; } + public Double Bottom { get; set; } + public Double Header { get; set; } + public Double Footer { get; set; } + + public IXLMargins SetLeft(Double value) { Left = value; return this; } + public IXLMargins SetRight(Double value) { Right = value; return this; } + public IXLMargins SetTop(Double value) { Top = value; return this; } + public IXLMargins SetBottom(Double value) { Bottom = value; return this; } + public IXLMargins SetHeader(Double value) { Header = value; return this; } + public IXLMargins SetFooter(Double value) { Footer = value; return this; } + + } +} diff --git a/ClosedXML/Excel/PageSetup/XLPageSetup.cs b/ClosedXML/Excel/PageSetup/XLPageSetup.cs new file mode 100644 index 0000000..ecb5430 --- /dev/null +++ b/ClosedXML/Excel/PageSetup/XLPageSetup.cs @@ -0,0 +1,262 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLPageSetup : IXLPageSetup + { + public XLPageSetup(XLPageSetup defaultPageOptions, XLWorksheet worksheet) + { + + if (defaultPageOptions != null) + { + PrintAreas = new XLPrintAreas(defaultPageOptions.PrintAreas as XLPrintAreas, worksheet); + CenterHorizontally = defaultPageOptions.CenterHorizontally; + CenterVertically = defaultPageOptions.CenterVertically; + FirstPageNumber = defaultPageOptions.FirstPageNumber; + HorizontalDpi = defaultPageOptions.HorizontalDpi; + PageOrientation = defaultPageOptions.PageOrientation; + VerticalDpi = defaultPageOptions.VerticalDpi; + FirstRowToRepeatAtTop = defaultPageOptions.FirstRowToRepeatAtTop; + LastRowToRepeatAtTop = defaultPageOptions.LastRowToRepeatAtTop; + FirstColumnToRepeatAtLeft = defaultPageOptions.FirstColumnToRepeatAtLeft; + LastColumnToRepeatAtLeft = defaultPageOptions.LastColumnToRepeatAtLeft; + ShowComments = defaultPageOptions.ShowComments; + + + PaperSize = defaultPageOptions.PaperSize; + _pagesTall = defaultPageOptions.PagesTall; + _pagesWide = defaultPageOptions.PagesWide; + _scale = defaultPageOptions.Scale; + + + if (defaultPageOptions.Margins != null) + { + Margins = new XLMargins + { + Top = defaultPageOptions.Margins.Top, + Bottom = defaultPageOptions.Margins.Bottom, + Left = defaultPageOptions.Margins.Left, + Right = defaultPageOptions.Margins.Right, + Header = defaultPageOptions.Margins.Header, + Footer = defaultPageOptions.Margins.Footer + }; + } + AlignHFWithMargins = defaultPageOptions.AlignHFWithMargins; + ScaleHFWithDocument = defaultPageOptions.ScaleHFWithDocument; + ShowGridlines = defaultPageOptions.ShowGridlines; + ShowRowAndColumnHeadings = defaultPageOptions.ShowRowAndColumnHeadings; + BlackAndWhite = defaultPageOptions.BlackAndWhite; + DraftQuality = defaultPageOptions.DraftQuality; + PageOrder = defaultPageOptions.PageOrder; + + ColumnBreaks = defaultPageOptions.ColumnBreaks.ToList(); + RowBreaks = defaultPageOptions.RowBreaks.ToList(); + Header = new XLHeaderFooter(defaultPageOptions.Header as XLHeaderFooter, worksheet); + Footer = new XLHeaderFooter(defaultPageOptions.Footer as XLHeaderFooter, worksheet); + PrintErrorValue = defaultPageOptions.PrintErrorValue; + } + else + { + PrintAreas = new XLPrintAreas(worksheet); + Header = new XLHeaderFooter(worksheet); + Footer = new XLHeaderFooter(worksheet); + ColumnBreaks = new List(); + RowBreaks = new List(); + } + } + public IXLPrintAreas PrintAreas { get; private set; } + + + public Int32 FirstRowToRepeatAtTop { get; private set; } + public Int32 LastRowToRepeatAtTop { get; private set; } + public void SetRowsToRepeatAtTop(String range) + { + var arrRange = range.Replace("$", "").Split(':'); + SetRowsToRepeatAtTop(Int32.Parse(arrRange[0]), Int32.Parse(arrRange[1])); + } + public void SetRowsToRepeatAtTop(Int32 firstRowToRepeatAtTop, Int32 lastRowToRepeatAtTop) + { + if (firstRowToRepeatAtTop <= 0) throw new ArgumentOutOfRangeException("The first row has to be greater than zero."); + if (firstRowToRepeatAtTop > lastRowToRepeatAtTop) throw new ArgumentOutOfRangeException("The first row has to be less than the second row."); + + FirstRowToRepeatAtTop = firstRowToRepeatAtTop; + LastRowToRepeatAtTop = lastRowToRepeatAtTop; + } + public Int32 FirstColumnToRepeatAtLeft { get; private set; } + public Int32 LastColumnToRepeatAtLeft { get; private set; } + public void SetColumnsToRepeatAtLeft(String range) + { + var arrRange = range.Replace("$", "").Split(':'); + if (Int32.TryParse(arrRange[0], out int iTest)) + SetColumnsToRepeatAtLeft(Int32.Parse(arrRange[0]), Int32.Parse(arrRange[1])); + else + SetColumnsToRepeatAtLeft(arrRange[0], arrRange[1]); + } + public void SetColumnsToRepeatAtLeft(String firstColumnToRepeatAtLeft, String lastColumnToRepeatAtLeft) + { + SetColumnsToRepeatAtLeft(XLHelper.GetColumnNumberFromLetter(firstColumnToRepeatAtLeft), XLHelper.GetColumnNumberFromLetter(lastColumnToRepeatAtLeft)); + } + public void SetColumnsToRepeatAtLeft(Int32 firstColumnToRepeatAtLeft, Int32 lastColumnToRepeatAtLeft) + { + if (firstColumnToRepeatAtLeft <= 0) throw new ArgumentOutOfRangeException("The first column has to be greater than zero."); + if (firstColumnToRepeatAtLeft > lastColumnToRepeatAtLeft) throw new ArgumentOutOfRangeException("The first column has to be less than the second column."); + + FirstColumnToRepeatAtLeft = firstColumnToRepeatAtLeft; + LastColumnToRepeatAtLeft = lastColumnToRepeatAtLeft; + } + + public XLPageOrientation PageOrientation { get; set; } + public XLPaperSize PaperSize { get; set; } + public Int32 HorizontalDpi { get; set; } + public Int32 VerticalDpi { get; set; } + public UInt32? FirstPageNumber { get; set; } + public Boolean CenterHorizontally { get; set; } + public Boolean CenterVertically { get; set; } + public XLPrintErrorValues PrintErrorValue { get; set; } + public IXLMargins Margins { get; set; } + + private Int32 _pagesWide; + public Int32 PagesWide + { + get + { + return _pagesWide; + } + set + { + _pagesWide = value; + if (_pagesWide >0) + _scale = 0; + } + } + + private Int32 _pagesTall; + public Int32 PagesTall + { + get + { + return _pagesTall; + } + set + { + _pagesTall = value; + if (_pagesTall >0) + _scale = 0; + } + } + + private Int32 _scale; + public Int32 Scale + { + get + { + return _scale; + } + set + { + _scale = value; + if (_scale <= 0) return; + _pagesTall = 0; + _pagesWide = 0; + } + } + + public void AdjustTo(Int32 percentageOfNormalSize) + { + Scale = percentageOfNormalSize; + _pagesWide = 0; + _pagesTall = 0; + } + public void FitToPages(Int32 pagesWide, Int32 pagesTall) + { + _pagesWide = pagesWide; + this._pagesTall = pagesTall; + _scale = 0; + } + + + public IXLHeaderFooter Header { get; private set; } + public IXLHeaderFooter Footer { get; private set; } + + public Boolean ScaleHFWithDocument { get; set; } + public Boolean AlignHFWithMargins { get; set; } + + public Boolean ShowGridlines { get; set; } + public Boolean ShowRowAndColumnHeadings { get; set; } + public Boolean BlackAndWhite { get; set; } + public Boolean DraftQuality { get; set; } + + public XLPageOrderValues PageOrder { get; set; } + public XLShowCommentsValues ShowComments { get; set; } + + public List RowBreaks { get; private set; } + public List ColumnBreaks { get; private set; } + public void AddHorizontalPageBreak(Int32 row) + { + if (!RowBreaks.Contains(row)) + RowBreaks.Add(row); + RowBreaks.Sort(); + } + public void AddVerticalPageBreak(Int32 column) + { + if (!ColumnBreaks.Contains(column)) + ColumnBreaks.Add(column); + ColumnBreaks.Sort(); + } + + //public void SetPageBreak(IXLRange range, XLPageBreakLocations breakLocation) + //{ + // switch (breakLocation) + // { + // case XLPageBreakLocations.AboveRange: RowBreaks.Add(range.Internals.Worksheet.Row(range.RowNumber)); break; + // case XLPageBreakLocations.BelowRange: RowBreaks.Add(range.Internals.Worksheet.Row(range.RowCount())); break; + // case XLPageBreakLocations.LeftOfRange: ColumnBreaks.Add(range.Internals.Worksheet.Column(range.ColumnNumber)); break; + // case XLPageBreakLocations.RightOfRange: ColumnBreaks.Add(range.Internals.Worksheet.Column(range.ColumnCount())); break; + // default: throw new NotImplementedException(); + // } + //} + + public IXLPageSetup SetPageOrientation(XLPageOrientation value) { PageOrientation = value; return this; } + public IXLPageSetup SetPagesWide(Int32 value) { PagesWide = value; return this; } + public IXLPageSetup SetPagesTall(Int32 value) { PagesTall = value; return this; } + public IXLPageSetup SetScale(Int32 value) { Scale = value; return this; } + public IXLPageSetup SetHorizontalDpi(Int32 value) { HorizontalDpi = value; return this; } + public IXLPageSetup SetVerticalDpi(Int32 value) { VerticalDpi = value; return this; } + public IXLPageSetup SetFirstPageNumber(UInt32? value) { FirstPageNumber = value; return this; } + public IXLPageSetup SetCenterHorizontally() { CenterHorizontally = true; return this; } public IXLPageSetup SetCenterHorizontally(Boolean value) { CenterHorizontally = value; return this; } + public IXLPageSetup SetCenterVertically() { CenterVertically = true; return this; } public IXLPageSetup SetCenterVertically(Boolean value) { CenterVertically = value; return this; } + public IXLPageSetup SetPaperSize(XLPaperSize value) { PaperSize = value; return this; } + public IXLPageSetup SetScaleHFWithDocument() { ScaleHFWithDocument = true; return this; } public IXLPageSetup SetScaleHFWithDocument(Boolean value) { ScaleHFWithDocument = value; return this; } + public IXLPageSetup SetAlignHFWithMargins() { AlignHFWithMargins = true; return this; } public IXLPageSetup SetAlignHFWithMargins(Boolean value) { AlignHFWithMargins = value; return this; } + public IXLPageSetup SetShowGridlines() { ShowGridlines = true; return this; } public IXLPageSetup SetShowGridlines(Boolean value) { ShowGridlines = value; return this; } + public IXLPageSetup SetShowRowAndColumnHeadings() { ShowRowAndColumnHeadings = true; return this; } public IXLPageSetup SetShowRowAndColumnHeadings(Boolean value) { ShowRowAndColumnHeadings = value; return this; } + public IXLPageSetup SetBlackAndWhite() { BlackAndWhite = true; return this; } public IXLPageSetup SetBlackAndWhite(Boolean value) { BlackAndWhite = value; return this; } + public IXLPageSetup SetDraftQuality() { DraftQuality = true; return this; } public IXLPageSetup SetDraftQuality(Boolean value) { DraftQuality = value; return this; } + public IXLPageSetup SetPageOrder(XLPageOrderValues value) { PageOrder = value; return this; } + public IXLPageSetup SetShowComments(XLShowCommentsValues value) { ShowComments = value; return this; } + public IXLPageSetup SetPrintErrorValue(XLPrintErrorValues value) { PrintErrorValue = value; return this; } + + public Boolean DifferentFirstPageOnHF { get; set; } + public IXLPageSetup SetDifferentFirstPageOnHF() + { + return SetDifferentFirstPageOnHF(true); + } + public IXLPageSetup SetDifferentFirstPageOnHF(Boolean value) + { + DifferentFirstPageOnHF = value; + return this; + } + public Boolean DifferentOddEvenPagesOnHF { get; set; } + public IXLPageSetup SetDifferentOddEvenPagesOnHF() + { + return SetDifferentOddEvenPagesOnHF(true); + } + public IXLPageSetup SetDifferentOddEvenPagesOnHF(Boolean value) + { + DifferentOddEvenPagesOnHF = value; + return this; + } + } +} diff --git a/ClosedXML/Excel/PageSetup/XLPrintAreas.cs b/ClosedXML/Excel/PageSetup/XLPrintAreas.cs new file mode 100644 index 0000000..6aea4b9 --- /dev/null +++ b/ClosedXML/Excel/PageSetup/XLPrintAreas.cs @@ -0,0 +1,56 @@ +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLPrintAreas : IXLPrintAreas + { + List ranges = new List(); + private XLWorksheet worksheet; + public XLPrintAreas(XLWorksheet worksheet) + { + this.worksheet = worksheet; + } + + public XLPrintAreas(XLPrintAreas defaultPrintAreas, XLWorksheet worksheet) + { + ranges = defaultPrintAreas.ranges.ToList(); + this.worksheet = worksheet; + } + + public void Clear() + { + ranges.Clear(); + } + + public void Add(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn) + { + ranges.Add(worksheet.Range(firstCellRow, firstCellColumn, lastCellRow, lastCellColumn)); + } + + public void Add(string rangeAddress) + { + ranges.Add(worksheet.Range(rangeAddress)); + } + + public void Add(string firstCellAddress, string lastCellAddress) + { + ranges.Add(worksheet.Range(firstCellAddress, lastCellAddress)); + } + + public void Add(IXLAddress firstCellAddress, IXLAddress lastCellAddress) + { + ranges.Add(worksheet.Range(firstCellAddress, lastCellAddress)); + } + + public IEnumerator GetEnumerator() + { + return ranges.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/ClosedXML/Excel/Patterns/Quadrant.cs b/ClosedXML/Excel/Patterns/Quadrant.cs new file mode 100644 index 0000000..5591ff5 --- /dev/null +++ b/ClosedXML/Excel/Patterns/Quadrant.cs @@ -0,0 +1,391 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel.Patterns +{ + /// + /// Implementation of QuadTree adapted to Excel worksheet specifics. Differences with the classic implementation + /// are that the topmost level is split to 128 square parts (2 columns of 64 blocks, each 8192*8192 cells) and that splitting + /// the quadrant onto 4 smaller quadrants does not depend on the number of items in this quadrant. When the range is added to the + /// QuadTree it is placed on the bottommost level where it fits to a single quadrant. That means, row-wide and column-wide ranges + /// are always placed at the level 0, and the smaller the range is the deeper it goes down the tree. This approach eliminates + /// the need of transferring ranges between levels. + /// + internal class Quadrant + { + #region Public Properties + + /// + /// Smaller quadrants which the current one is splitted to. Is NULL until ranges are added to child quadrants. + /// + public IEnumerable Children { get; private set; } + + /// + /// The level of current quadrant. Top most has level 0, child quadrants has levels (Level + 1). + /// + public byte Level { get; } + + /// + /// Minimum column included in this quadrant. + /// + public int MinimumColumn { get; } + + /// + /// Minimum row included in this quadrant. + /// + public int MinimumRow { get; } + + /// + /// Maximum column included in this quadrant. + /// + public int MaximumColumn { get; } + + /// + /// Maximum row included in this quadrant. + /// + public int MaximumRow { get; } + + /// + /// Collection of ranges belonging to this quadrant (does not include ranges from child quadrants). + /// + public IEnumerable Ranges + { + get => _ranges?.Values.AsEnumerable(); + } + + /// + /// The number of current quadrant by horizontal axis. + /// + public short X { get; private set; } + + /// + /// The number of current quadrant by vertical axis. + /// + public short Y { get; private set; } + + #endregion Public Properties + + #region Constructors + + public Quadrant() : this(0, 0, 0) + { } + + private Quadrant(byte level, short x, short y) + { + Level = level; + X = x; + Y = y; + + MinimumColumn = (Level == 0) ? 1 : 1 + XLHelper.MaxColumnNumber / (int)Math.Pow(2, Level) * X; + MinimumRow = (Level == 0) ? 1 : 1 + XLHelper.MaxColumnNumber / (int)Math.Pow(2, Level) * Y; //MaxColumnNumber here is not a mistake + MaximumColumn = (Level == 0) + ? XLHelper.MaxColumnNumber + : XLHelper.MaxColumnNumber / (int)Math.Pow(2, Level) * (X + 1); + MaximumRow = (Level == 0) + ? XLHelper.MaxRowNumber + : XLHelper.MaxColumnNumber / (int)Math.Pow(2, Level) * (Y + 1); //MaxColumnNumber here is not a mistake + } + + #endregion Constructors + + #region Public Methods + + /// + /// Add a range to the quadrant or to one of the child quadrants (recursively). + /// + /// True, if range was successfully added, false if it has been added before. + public bool Add(IXLAddressable range) + { + bool res = false; + var children = Children ?? CreateChildren().ToList(); + bool addToChild = false; + foreach (var childQuadrant in children) + { + var rangeAddress = range.RangeAddress; + if (childQuadrant.Covers(in rangeAddress)) + { + res |= childQuadrant.Add(range); + addToChild = true; + break; + } + } + + if (!addToChild) + res = AddInternal(range); + + if (Children == null && addToChild) + Children = children; + + return res; + } + + /// + /// Get all ranges from the quadrant and all child quadrants (recursively). + /// + public IEnumerable GetAll() + { + if (Ranges != null) + { + foreach (var range in Ranges) + yield return range; + } + + if (Children != null) + { + foreach (var childQuadrant in Children) + { + var childRanges = childQuadrant.GetAll(); + foreach (var range in childRanges) + yield return range; + } + } + } + + /// + /// Get all ranges from the quadrant and all child quadrants (recursively) that intersect the specified address. + /// + public IEnumerable GetIntersectedRanges(IXLRangeAddress rangeAddress) + { + if (Ranges != null) + { + foreach (var range in Ranges) + { + if (range.RangeAddress.Intersects(rangeAddress)) + yield return range; + } + } + + if (Children != null) + { + foreach (var childQuadrant in Children) + { + if (childQuadrant.Intersects(in rangeAddress)) + { + var childRanges = childQuadrant.GetIntersectedRanges(rangeAddress); + foreach (var range in childRanges) + yield return range; + } + } + } + } + + /// + /// Get all ranges from the quadrant and all child quadrants (recursively) that cover the specified address. + /// + public IEnumerable GetIntersectedRanges(IXLAddress address) + { + if (Ranges != null) + { + foreach (var range in Ranges) + { + if (range.RangeAddress.Contains(address)) + yield return range; + } + } + + if (Children != null) + { + foreach (var childQuadrant in Children) + { + if (childQuadrant.Covers(in address)) + { + var childRanges = childQuadrant.GetIntersectedRanges(address); + foreach (var range in childRanges) + yield return range; + } + } + } + } + + /// + /// Remove the range from the quadrant or from child quadrants (recursively). + /// + /// True if the range was removed, false if it does not exist in the QuadTree. + public bool Remove(IXLRangeAddress rangeAddress) + { + bool res = false; + + bool coveredByChild = false; + if (Children != null) + { + foreach (var childQuadrant in Children) + { + if (childQuadrant.Covers(rangeAddress)) + { + res |= childQuadrant.Remove(rangeAddress); + coveredByChild = true; + } + } + } + + if (!coveredByChild) + { + if (_ranges?.Remove(rangeAddress) == true) + res = true; + } + + return res; + } + + /// + /// Remove all the ranges matching specified criteria from the quadrant and its child quadrants (recursively). + /// Don't use it for searching intersections as it would be much less efficient than . + /// + public IEnumerable RemoveAll(Predicate predicate) + { + if (_ranges != null) + { + var ranges = _ranges.Values.Where(r => predicate(r)); + var keysToRemove = new List(); + foreach (var range in ranges) + { + keysToRemove.Add(range.RangeAddress); + yield return range; + } + + foreach (var keyToRemove in keysToRemove) + { + _ranges.Remove(keyToRemove); + } + } + + if (Children != null) + { + foreach (var childQuadrant in Children) + foreach (var childRange in childQuadrant.RemoveAll(predicate)) + { + yield return childRange; + } + } + } + + #endregion Public Methods + + #region Private Fields + + /// + /// Maximum depth of the QuadTree. Value 10 corresponds to the smallest quadrants having size 16*16 cells. + /// + private const byte MAX_LEVEL = 10; + + /// + /// Collection of ranges belonging to the current quadrant (that cannot fit into child quadrants). + /// + private Dictionary _ranges; + + #endregion Private Fields + + #region Private Methods + + /// + /// Add a range to the collection of quadrant's own ranges. + /// + /// True if the range was successfully added, false if it had been added before. + private bool AddInternal(IXLAddressable range) + { + if (_ranges == null) + _ranges = new Dictionary(); + + if (_ranges.ContainsKey(range.RangeAddress)) + return false; + + _ranges.Add(range.RangeAddress, range); + return true; + } + + /// + /// Check if the current quadrant fully covers the specified address. + /// + private bool Covers(in IXLRangeAddress rangeAddress) + { + return MinimumColumn <= rangeAddress.FirstAddress.ColumnNumber && + MaximumColumn >= rangeAddress.LastAddress.ColumnNumber && + MinimumRow <= rangeAddress.FirstAddress.RowNumber && + MaximumRow >= rangeAddress.LastAddress.RowNumber; + } + + /// + /// Check if the current quadrant covers the specified address. + /// + private bool Covers(in IXLAddress address) + { + return MinimumColumn <= address.ColumnNumber && + MaximumColumn >= address.ColumnNumber && + MinimumRow <= address.RowNumber && + MaximumRow >= address.RowNumber; + } + + /// + /// Check if the current quadrant intersects the specified address. + /// + private bool Intersects(in IXLRangeAddress rangeAddress) + { + return ((MinimumRow <= rangeAddress.FirstAddress.RowNumber && rangeAddress.FirstAddress.RowNumber <= MaximumRow) || + (rangeAddress.FirstAddress.RowNumber <= MinimumRow && MinimumRow <= rangeAddress.LastAddress.RowNumber)) + && + ((MinimumColumn <= rangeAddress.FirstAddress.ColumnNumber && rangeAddress.FirstAddress.ColumnNumber <= MaximumColumn) || + (rangeAddress.FirstAddress.ColumnNumber <= MinimumColumn && MinimumColumn <= rangeAddress.LastAddress.ColumnNumber)); + } + + /// + /// Create a collection of child quadrants dividing the current one. + /// + private IEnumerable CreateChildren() + { + byte childLevel = (byte)(Level + 1); + if (childLevel > MAX_LEVEL) + yield break; + byte xCount = 2; // Always divide on halves + byte yCount = (byte)((Level == 0) ? (XLHelper.MaxRowNumber / XLHelper.MaxColumnNumber) : 2); // Level 0 divide onto 64 parts, the rest - on halves + + for (byte dy = 0; dy < yCount; dy++) + { + for (byte dx = 0; dx < xCount; dx++) + { + yield return new Quadrant(childLevel, (short)(X * 2 + dx), (short)(Y * 2 + dy)); + } + } + } + + #endregion Private Methods + } + + /// + /// A generic version of + /// + internal class Quadrant : Quadrant + where T:IXLAddressable + { + public new IEnumerable Ranges => base.Ranges.Cast(); + + public bool Add(T range) + { + return base.Add(range); + } + + public new IEnumerable GetAll() + { + return base.GetAll().Cast(); + } + + public new IEnumerable GetIntersectedRanges(IXLRangeAddress rangeAddress) + { + return base.GetIntersectedRanges(rangeAddress).Cast(); + } + + public new IEnumerable GetIntersectedRanges(IXLAddress address) + { + return base.GetIntersectedRanges(address).Cast(); + } + + public bool Remove(T range) + { + return Remove(range.RangeAddress); + } + public IEnumerable RemoveAll(Predicate predicate) + { + return base.RemoveAll(r => predicate((T) r)).Cast(); + } + } +} diff --git a/ClosedXML/Excel/PivotTables/IXLPivotField.cs b/ClosedXML/Excel/PivotTables/IXLPivotField.cs new file mode 100644 index 0000000..ba719e4 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/IXLPivotField.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public enum XLSubtotalFunction + { + Automatic, + None, + Sum, + Count, + Average, + Minimum, + Maximum, + Product, + CountNumbers, + StandardDeviation, + PopulationStandardDeviation, + Variance, + PopulationVariance, + } + + public enum XLPivotLayout { Outline, Tabular, Compact } + + public interface IXLPivotField + { + String SourceName { get; } + String CustomName { get; set; } + String SubtotalCaption { get; set; } + + List Subtotals { get; } + Boolean IncludeNewItemsInFilter { get; set; } + + Boolean Outline { get; set; } + Boolean Compact { get; set; } + Boolean? SubtotalsAtTop { get; set; } + Boolean RepeatItemLabels { get; set; } + Boolean InsertBlankLines { get; set; } + Boolean ShowBlankItems { get; set; } + Boolean InsertPageBreaks { get; set; } + Boolean Collapsed { get; set; } + XLPivotSortType SortType { get; set; } + + IXLPivotField SetCustomName(String value); + + IXLPivotField SetSubtotalCaption(String value); + + IXLPivotField AddSubtotal(XLSubtotalFunction value); + + IXLPivotField SetIncludeNewItemsInFilter(); IXLPivotField SetIncludeNewItemsInFilter(Boolean value); + + IXLPivotField SetLayout(XLPivotLayout value); + + IXLPivotField SetSubtotalsAtTop(); IXLPivotField SetSubtotalsAtTop(Boolean value); + + IXLPivotField SetRepeatItemLabels(); IXLPivotField SetRepeatItemLabels(Boolean value); + + IXLPivotField SetInsertBlankLines(); IXLPivotField SetInsertBlankLines(Boolean value); + + IXLPivotField SetShowBlankItems(); IXLPivotField SetShowBlankItems(Boolean value); + + IXLPivotField SetInsertPageBreaks(); IXLPivotField SetInsertPageBreaks(Boolean value); + + IXLPivotField SetCollapsed(); IXLPivotField SetCollapsed(Boolean value); + + IXLPivotField SetSort(XLPivotSortType value); + + IList SelectedValues { get; } + + IXLPivotField AddSelectedValue(Object value); + + IXLPivotFieldStyleFormats StyleFormats { get; } + + Boolean IsOnRowAxis { get; } + Boolean IsOnColumnAxis { get; } + Boolean IsInFilterList { get; } + + Int32 Offset { get; } + } +} diff --git a/ClosedXML/Excel/PivotTables/IXLPivotFields.cs b/ClosedXML/Excel/PivotTables/IXLPivotFields.cs new file mode 100644 index 0000000..148120d --- /dev/null +++ b/ClosedXML/Excel/PivotTables/IXLPivotFields.cs @@ -0,0 +1,28 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLPivotFields : IEnumerable + { + IXLPivotField Add(String sourceName); + + IXLPivotField Add(String sourceName, String customName); + + void Clear(); + + Boolean Contains(String sourceName); + + Boolean Contains(IXLPivotField pivotField); + + IXLPivotField Get(String sourceName); + + IXLPivotField Get(Int32 index); + + Int32 IndexOf(String sourceName); + Int32 IndexOf(IXLPivotField pf); + + void Remove(String sourceName); + } +} diff --git a/ClosedXML/Excel/PivotTables/IXLPivotTable.cs b/ClosedXML/Excel/PivotTables/IXLPivotTable.cs new file mode 100644 index 0000000..d818d4e --- /dev/null +++ b/ClosedXML/Excel/PivotTables/IXLPivotTable.cs @@ -0,0 +1,274 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public enum XLPivotTableTheme + { + None, + PivotStyleDark1, + PivotStyleDark10, + PivotStyleDark11, + PivotStyleDark12, + PivotStyleDark13, + PivotStyleDark14, + PivotStyleDark15, + PivotStyleDark16, + PivotStyleDark17, + PivotStyleDark18, + PivotStyleDark19, + PivotStyleDark2, + PivotStyleDark20, + PivotStyleDark21, + PivotStyleDark22, + PivotStyleDark23, + PivotStyleDark24, + PivotStyleDark25, + PivotStyleDark26, + PivotStyleDark27, + PivotStyleDark28, + PivotStyleDark3, + PivotStyleDark4, + PivotStyleDark5, + PivotStyleDark6, + PivotStyleDark7, + PivotStyleDark8, + PivotStyleDark9, + PivotStyleLight1, + PivotStyleLight10, + PivotStyleLight11, + PivotStyleLight12, + PivotStyleLight13, + PivotStyleLight14, + PivotStyleLight15, + PivotStyleLight16, + PivotStyleLight17, + PivotStyleLight18, + PivotStyleLight19, + PivotStyleLight2, + PivotStyleLight20, + PivotStyleLight21, + PivotStyleLight22, + PivotStyleLight23, + PivotStyleLight24, + PivotStyleLight25, + PivotStyleLight26, + PivotStyleLight27, + PivotStyleLight28, + PivotStyleLight3, + PivotStyleLight4, + PivotStyleLight5, + PivotStyleLight6, + PivotStyleLight7, + PivotStyleLight8, + PivotStyleLight9, + PivotStyleMedium1, + PivotStyleMedium10, + PivotStyleMedium11, + PivotStyleMedium12, + PivotStyleMedium13, + PivotStyleMedium14, + PivotStyleMedium15, + PivotStyleMedium16, + PivotStyleMedium17, + PivotStyleMedium18, + PivotStyleMedium19, + PivotStyleMedium2, + PivotStyleMedium20, + PivotStyleMedium21, + PivotStyleMedium22, + PivotStyleMedium23, + PivotStyleMedium24, + PivotStyleMedium25, + PivotStyleMedium26, + PivotStyleMedium27, + PivotStyleMedium28, + PivotStyleMedium3, + PivotStyleMedium4, + PivotStyleMedium5, + PivotStyleMedium6, + PivotStyleMedium7, + PivotStyleMedium8, + PivotStyleMedium9 + } + + public enum XLPivotSortType + { + Default = 0, + Ascending = 1, + Descending = 2 + } + + public enum XLPivotSubtotals + { + DoNotShow, + AtTop, + AtBottom + } + + public enum XLFilterAreaOrder { DownThenOver, OverThenDown } + + public enum XLItemsToRetain { Automatic, None, Max } + + public enum XLPivotTableSourceType { Range, Table } + + public interface IXLPivotTable + { + XLPivotTableTheme Theme { get; set; } + + IXLPivotFields Fields { get; } + IXLPivotFields ReportFilters { get; } + IXLPivotFields ColumnLabels { get; } + IXLPivotFields RowLabels { get; } + IXLPivotValues Values { get; } + + String Name { get; set; } + String Title { get; set; } + String Description { get; set; } + + String ColumnHeaderCaption { get; set; } + String RowHeaderCaption { get; set; } + + IXLCell TargetCell { get; set; } + + IXLRange SourceRange { get; set; } + IXLTable SourceTable { get; set; } + XLPivotTableSourceType SourceType { get; } + + IEnumerable SourceRangeFieldsAvailable { get; } + + Boolean MergeAndCenterWithLabels { get; set; } // MergeItem + Int32 RowLabelIndent { get; set; } // Indent + XLFilterAreaOrder FilterAreaOrder { get; set; } // PageOverThenDown + Int32 FilterFieldsPageWrap { get; set; } // PageWrap + String ErrorValueReplacement { get; set; } // ErrorCaption + String EmptyCellReplacement { get; set; } // MissingCaption + Boolean AutofitColumns { get; set; } //UseAutoFormatting + Boolean PreserveCellFormatting { get; set; } // PreserveFormatting + + Boolean ShowGrandTotalsRows { get; set; } // RowGrandTotals + Boolean ShowGrandTotalsColumns { get; set; } // ColumnGrandTotals + Boolean FilteredItemsInSubtotals { get; set; } // Subtotal filtered page items + Boolean AllowMultipleFilters { get; set; } // MultipleFieldFilters + Boolean UseCustomListsForSorting { get; set; } // CustomListSort + + Boolean ShowExpandCollapseButtons { get; set; } + Boolean ShowContextualTooltips { get; set; } + Boolean ShowPropertiesInTooltips { get; set; } + Boolean DisplayCaptionsAndDropdowns { get; set; } + Boolean ClassicPivotTableLayout { get; set; } + Boolean ShowValuesRow { get; set; } + Boolean ShowEmptyItemsOnRows { get; set; } + Boolean ShowEmptyItemsOnColumns { get; set; } + Boolean DisplayItemLabels { get; set; } + Boolean SortFieldsAtoZ { get; set; } + + Boolean PrintExpandCollapsedButtons { get; set; } + Boolean RepeatRowLabels { get; set; } + Boolean PrintTitles { get; set; } + + Boolean SaveSourceData { get; set; } + Boolean EnableShowDetails { get; set; } + Boolean RefreshDataOnOpen { get; set; } + XLItemsToRetain ItemsToRetainPerField { get; set; } + Boolean EnableCellEditing { get; set; } + + IXLPivotTable SetName(String value); + + IXLPivotTable SetTitle(String value); + + IXLPivotTable SetDescription(String value); + + IXLPivotTable SetMergeAndCenterWithLabels(); IXLPivotTable SetMergeAndCenterWithLabels(Boolean value); + + IXLPivotTable SetRowLabelIndent(Int32 value); + + IXLPivotTable SetFilterAreaOrder(XLFilterAreaOrder value); + + IXLPivotTable SetFilterFieldsPageWrap(Int32 value); + + IXLPivotTable SetErrorValueReplacement(String value); + + IXLPivotTable SetEmptyCellReplacement(String value); + + IXLPivotTable SetAutofitColumns(); IXLPivotTable SetAutofitColumns(Boolean value); + + IXLPivotTable SetPreserveCellFormatting(); IXLPivotTable SetPreserveCellFormatting(Boolean value); + + IXLPivotTable SetShowGrandTotalsRows(); IXLPivotTable SetShowGrandTotalsRows(Boolean value); + + IXLPivotTable SetShowGrandTotalsColumns(); IXLPivotTable SetShowGrandTotalsColumns(Boolean value); + + IXLPivotTable SetFilteredItemsInSubtotals(); IXLPivotTable SetFilteredItemsInSubtotals(Boolean value); + + IXLPivotTable SetAllowMultipleFilters(); IXLPivotTable SetAllowMultipleFilters(Boolean value); + + IXLPivotTable SetUseCustomListsForSorting(); IXLPivotTable SetUseCustomListsForSorting(Boolean value); + + IXLPivotTable SetShowExpandCollapseButtons(); IXLPivotTable SetShowExpandCollapseButtons(Boolean value); + + IXLPivotTable SetShowContextualTooltips(); IXLPivotTable SetShowContextualTooltips(Boolean value); + + IXLPivotTable SetShowPropertiesInTooltips(); IXLPivotTable SetShowPropertiesInTooltips(Boolean value); + + IXLPivotTable SetDisplayCaptionsAndDropdowns(); IXLPivotTable SetDisplayCaptionsAndDropdowns(Boolean value); + + IXLPivotTable SetClassicPivotTableLayout(); IXLPivotTable SetClassicPivotTableLayout(Boolean value); + + IXLPivotTable SetShowValuesRow(); IXLPivotTable SetShowValuesRow(Boolean value); + + IXLPivotTable SetShowEmptyItemsOnRows(); IXLPivotTable SetShowEmptyItemsOnRows(Boolean value); + + IXLPivotTable SetShowEmptyItemsOnColumns(); IXLPivotTable SetShowEmptyItemsOnColumns(Boolean value); + + IXLPivotTable SetDisplayItemLabels(); IXLPivotTable SetDisplayItemLabels(Boolean value); + + IXLPivotTable SetSortFieldsAtoZ(); IXLPivotTable SetSortFieldsAtoZ(Boolean value); + + IXLPivotTable SetPrintExpandCollapsedButtons(); IXLPivotTable SetPrintExpandCollapsedButtons(Boolean value); + + IXLPivotTable SetRepeatRowLabels(); IXLPivotTable SetRepeatRowLabels(Boolean value); + + IXLPivotTable SetPrintTitles(); IXLPivotTable SetPrintTitles(Boolean value); + + IXLPivotTable SetSaveSourceData(); IXLPivotTable SetSaveSourceData(Boolean value); + + IXLPivotTable SetEnableShowDetails(); IXLPivotTable SetEnableShowDetails(Boolean value); + + IXLPivotTable SetRefreshDataOnOpen(); IXLPivotTable SetRefreshDataOnOpen(Boolean value); + + IXLPivotTable SetItemsToRetainPerField(XLItemsToRetain value); + + IXLPivotTable SetEnableCellEditing(); IXLPivotTable SetEnableCellEditing(Boolean value); + + IXLPivotTable SetColumnHeaderCaption(String value); + + IXLPivotTable SetRowHeaderCaption(String value); + + Boolean ShowRowHeaders { get; set; } + Boolean ShowColumnHeaders { get; set; } + Boolean ShowRowStripes { get; set; } + Boolean ShowColumnStripes { get; set; } + XLPivotSubtotals Subtotals { get; set; } + XLPivotLayout Layout { set; } + Boolean InsertBlankLines { set; } + + IXLPivotTable SetShowRowHeaders(); IXLPivotTable SetShowRowHeaders(Boolean value); + + IXLPivotTable SetShowColumnHeaders(); IXLPivotTable SetShowColumnHeaders(Boolean value); + + IXLPivotTable SetShowRowStripes(); IXLPivotTable SetShowRowStripes(Boolean value); + + IXLPivotTable SetShowColumnStripes(); IXLPivotTable SetShowColumnStripes(Boolean value); + + IXLPivotTable SetSubtotals(XLPivotSubtotals value); + + IXLPivotTable SetLayout(XLPivotLayout value); + + IXLPivotTable SetInsertBlankLines(); IXLPivotTable SetInsertBlankLines(Boolean value); + + IXLWorksheet Worksheet { get; } + + IXLPivotTableStyleFormats StyleFormats { get; } + } +} diff --git a/ClosedXML/Excel/PivotTables/IXLPivotTables.cs b/ClosedXML/Excel/PivotTables/IXLPivotTables.cs new file mode 100644 index 0000000..45ca935 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/IXLPivotTables.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLPivotTables : IEnumerable + { + IXLPivotTable Add(String name, IXLCell targetCell, IXLRange range); + + IXLPivotTable Add(String name, IXLCell targetCell, IXLTable table); + + [Obsolete("Use Add instead")] + IXLPivotTable AddNew(String name, IXLCell targetCell, IXLRange range); + + [Obsolete("Use Add instead")] + IXLPivotTable AddNew(String name, IXLCell targetCell, IXLTable table); + + Boolean Contains(String name); + + void Delete(String name); + + void DeleteAll(); + + IXLPivotTable PivotTable(String name); + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotStyleFormats/AbstractPivotFieldReference.cs b/ClosedXML/Excel/PivotTables/PivotStyleFormats/AbstractPivotFieldReference.cs new file mode 100644 index 0000000..e22635c --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotStyleFormats/AbstractPivotFieldReference.cs @@ -0,0 +1,19 @@ +using DocumentFormat.OpenXml; +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal abstract class AbstractPivotFieldReference + { + public Boolean DefaultSubtotal { get; set; } + + internal abstract UInt32Value GetFieldOffset(); + + /// + ///

Helper function used during saving to calculate the indices of the filtered values

+ ///
+ /// Indices of the filtered values + internal abstract IEnumerable Match(XLWorkbook.PivotTableInfo pti, IXLPivotTable pt); + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotFieldStyleFormats.cs b/ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotFieldStyleFormats.cs new file mode 100644 index 0000000..31d2454 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotFieldStyleFormats.cs @@ -0,0 +1,11 @@ +// Keep this file CodeMaid organised and cleaned +namespace ClosedXML.Excel +{ + public interface IXLPivotFieldStyleFormats + { + IXLPivotValueStyleFormat DataValuesFormat { get; } + IXLPivotStyleFormat Header { get; } + IXLPivotStyleFormat Label { get; } + IXLPivotStyleFormat Subtotal { get; } + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotStyleFormat.cs b/ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotStyleFormat.cs new file mode 100644 index 0000000..848ea04 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotStyleFormat.cs @@ -0,0 +1,10 @@ +// Keep this file CodeMaid organised and cleaned +namespace ClosedXML.Excel +{ + public interface IXLPivotStyleFormat + { + XLPivotStyleFormatElement AppliesTo { get; } + IXLPivotField PivotField { get; } + IXLStyle Style { get; set; } + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotStyleFormats.cs b/ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotStyleFormats.cs new file mode 100644 index 0000000..4f2b843 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotStyleFormats.cs @@ -0,0 +1,10 @@ +// Keep this file CodeMaid organised and cleaned +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLPivotStyleFormats : IEnumerable + { + IXLPivotStyleFormat ForElement(XLPivotStyleFormatElement element); + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotTableStyleFormats.cs b/ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotTableStyleFormats.cs new file mode 100644 index 0000000..a1f0456 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotTableStyleFormats.cs @@ -0,0 +1,9 @@ +// Keep this file CodeMaid organised and cleaned +namespace ClosedXML.Excel +{ + public interface IXLPivotTableStyleFormats + { + IXLPivotStyleFormats ColumnGrandTotalFormats { get; } + IXLPivotStyleFormats RowGrandTotalFormats { get; } + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotValueStyleFormat.cs b/ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotValueStyleFormat.cs new file mode 100644 index 0000000..c12c719 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotStyleFormats/IXLPivotValueStyleFormat.cs @@ -0,0 +1,14 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + public interface IXLPivotValueStyleFormat : IXLPivotStyleFormat + { + IXLPivotValueStyleFormat AndWith(IXLPivotField field); + + IXLPivotValueStyleFormat AndWith(IXLPivotField field, Predicate predicate); + + IXLPivotValueStyleFormat ForValueField(IXLPivotValue valueField); + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotStyleFormats/PivotLabelFieldReference.cs b/ClosedXML/Excel/PivotTables/PivotStyleFormats/PivotLabelFieldReference.cs new file mode 100644 index 0000000..09570fd --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotStyleFormats/PivotLabelFieldReference.cs @@ -0,0 +1,42 @@ +using DocumentFormat.OpenXml; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class PivotLabelFieldReference : AbstractPivotFieldReference + { + private readonly Predicate predicate; + + public PivotLabelFieldReference(IXLPivotField pivotField) + : this(pivotField, null) + { } + + public PivotLabelFieldReference(IXLPivotField pivotField, Predicate predicate) + { + this.PivotField = pivotField ?? throw new ArgumentNullException(nameof(pivotField)); + this.predicate = predicate; + } + + public IXLPivotField PivotField { get; set; } + + internal override UInt32Value GetFieldOffset() + { + return UInt32Value.FromUInt32((uint)PivotField.Offset); + } + + internal override IEnumerable Match(XLWorkbook.PivotTableInfo pti, IXLPivotTable pt) + { + var values = pti.Fields[PivotField.SourceName].DistinctValues.ToList(); + + if (predicate == null) + return new Int32[] { }; + + return values.Select((Value, Index) => new { Value, Index }) + .Where(v => predicate.Invoke(v.Value)) + .Select(v => v.Index) + .ToList(); + } + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotStyleFormats/PivotValueFieldReference.cs b/ClosedXML/Excel/PivotTables/PivotStyleFormats/PivotValueFieldReference.cs new file mode 100644 index 0000000..3629446 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotStyleFormats/PivotValueFieldReference.cs @@ -0,0 +1,29 @@ +using DocumentFormat.OpenXml; +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class PivotValueFieldReference : AbstractPivotFieldReference + { + public PivotValueFieldReference(String value) + { + this.Value = value; + } + + public String Value { get; } + + internal override UInt32Value GetFieldOffset() + { + return UInt32Value.FromUInt32(unchecked((uint)-2)); + } + + internal override IEnumerable Match(XLWorkbook.PivotTableInfo pti, IXLPivotTable pt) + { + return new Int32[] + { + pt.Values.IndexOf(Value.ToString()) + }; + } + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotFieldStyleFormats.cs b/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotFieldStyleFormats.cs new file mode 100644 index 0000000..4e2840d --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotFieldStyleFormats.cs @@ -0,0 +1,82 @@ +// Keep this file CodeMaid organised and cleaned + +namespace ClosedXML.Excel +{ + internal class XLPivotFieldStyleFormats : IXLPivotFieldStyleFormats + { + private IXLPivotValueStyleFormat dataValuesFormat; + private IXLPivotStyleFormat headerFormat; + private IXLPivotStyleFormat labelFormat; + private IXLPivotStyleFormat subtotalFormat; + + public XLPivotFieldStyleFormats(IXLPivotField field) + { + this.PivotField = field; + } + + public IXLPivotField PivotField { get; } + + #region IXLPivotFieldStyleFormats + + public IXLPivotValueStyleFormat DataValuesFormat + { + get + { + if (dataValuesFormat == null) + { + dataValuesFormat = new XLPivotValueStyleFormat(PivotField) + { + AppliesTo = XLPivotStyleFormatElement.Data + }; + } + return dataValuesFormat; + } + set { dataValuesFormat = value; } + } + + public IXLPivotStyleFormat Header + { + get + { + if (headerFormat == null) + { + headerFormat = new XLPivotStyleFormat(PivotField); + } + return headerFormat; + } + set { headerFormat = value; } + } + + public IXLPivotStyleFormat Label + { + get + { + if (labelFormat == null) + { + labelFormat = new XLPivotStyleFormat(PivotField) + { + AppliesTo = XLPivotStyleFormatElement.Label + }; + } + return labelFormat; + } + set { labelFormat = value; } + } + + public IXLPivotStyleFormat Subtotal + { + get + { + if (subtotalFormat == null) + { + subtotalFormat = new XLPivotStyleFormat(PivotField); + } + + return subtotalFormat; + } + set { subtotalFormat = value; } + } + + #endregion IXLPivotFieldStyleFormats + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotStyleFormat.cs b/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotStyleFormat.cs new file mode 100644 index 0000000..7d05cfb --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotStyleFormat.cs @@ -0,0 +1,27 @@ +// Keep this file CodeMaid organised and cleaned +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLPivotStyleFormat : IXLPivotStyleFormat + { + public XLPivotStyleFormat(IXLPivotField field = null, IXLStyle style = null) + { + PivotField = field; + Style = style ?? XLStyle.Default; + } + + #region IXLPivotStyleFormat members + + public XLPivotStyleFormatElement AppliesTo { get; set; } = XLPivotStyleFormatElement.Data; + public IXLPivotField PivotField { get; set; } + public IXLStyle Style { get; set; } + + #endregion IXLPivotStyleFormat members + + internal XLPivotAreaValues AreaType { get; set; } = XLPivotAreaValues.Normal; + internal bool CollapsedLevelsAreSubtotals { get; set; } = false; + internal IList FieldReferences { get; } = new List(); + internal bool Outline { get; set; } = true; + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotStyleFormatEnums.cs b/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotStyleFormatEnums.cs new file mode 100644 index 0000000..20a9a40 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotStyleFormatEnums.cs @@ -0,0 +1,24 @@ +using System; + +namespace ClosedXML.Excel +{ + [Flags] + public enum XLPivotStyleFormatElement + { + None = 0, + Label = 1 << 1, + Data = 1 << 2, + + All = Label | Data + } + + internal enum XLPivotStyleFormatTarget + { + PivotTable, + GrandTotal, + Subtotal, + Header, + Label, + Data + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotStyleFormats.cs b/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotStyleFormats.cs new file mode 100644 index 0000000..3f559fa --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotStyleFormats.cs @@ -0,0 +1,61 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLPivotStyleFormats : IXLPivotStyleFormats + { + private readonly IXLPivotField _pivotField; + private readonly Dictionary _styleFormats = new Dictionary(); + + public XLPivotStyleFormats() + : this(null) + { } + + public XLPivotStyleFormats(IXLPivotField pivotField) + { + this._pivotField = pivotField; + } + + #region IXLPivotStyleFormats members + + public IXLPivotStyleFormat ForElement(XLPivotStyleFormatElement element) + { + if (element == XLPivotStyleFormatElement.None) + throw new ArgumentException("Choose an enum value that represents an element", nameof(element)); + + if (!_styleFormats.TryGetValue(element, out IXLPivotStyleFormat pivotStyleFormat)) + { + pivotStyleFormat = new XLPivotStyleFormat(_pivotField) { AppliesTo = element }; + _styleFormats.Add(element, pivotStyleFormat); + } + + return pivotStyleFormat; + } + + public IEnumerator GetEnumerator() + { + return _styleFormats.Values.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + #endregion IXLPivotStyleFormats members + + public void Add(IXLPivotStyleFormat styleFormat) + { + _styleFormats.Add(styleFormat.AppliesTo, styleFormat); + } + + public void AddRange(IEnumerable styleFormats) + { + foreach (var styleFormat in styleFormats) + Add(styleFormat); + } + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotTableStyleFormats.cs b/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotTableStyleFormats.cs new file mode 100644 index 0000000..718b650 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotTableStyleFormats.cs @@ -0,0 +1,25 @@ +// Keep this file CodeMaid organised and cleaned +namespace ClosedXML.Excel +{ + internal class XLPivotTableStyleFormats : IXLPivotTableStyleFormats + { + private IXLPivotStyleFormats columnGrandTotalFormats; + private IXLPivotStyleFormats rowGrandTotalFormats; + + #region IXLPivotTableStyleFormats members + + public IXLPivotStyleFormats ColumnGrandTotalFormats + { + get { return columnGrandTotalFormats ?? (columnGrandTotalFormats = new XLPivotStyleFormats()); } + set { columnGrandTotalFormats = value; } + } + + public IXLPivotStyleFormats RowGrandTotalFormats + { + get { return rowGrandTotalFormats ?? (rowGrandTotalFormats = new XLPivotStyleFormats()); } + set { rowGrandTotalFormats = value; } + } + + #endregion IXLPivotTableStyleFormats members + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotValueStyleFormat.cs b/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotValueStyleFormat.cs new file mode 100644 index 0000000..05721c3 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotStyleFormats/XLPivotValueStyleFormat.cs @@ -0,0 +1,33 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + internal class XLPivotValueStyleFormat : XLPivotStyleFormat, IXLPivotValueStyleFormat + { + public XLPivotValueStyleFormat(IXLPivotField field = null, IXLStyle style = null) + : base(field, style) + { } + + #region IXLPivotValueStyleFormat members + + public IXLPivotValueStyleFormat AndWith(IXLPivotField field) + { + return AndWith(field, null); + } + + public IXLPivotValueStyleFormat AndWith(IXLPivotField field, Predicate predicate) + { + FieldReferences.Add(new PivotLabelFieldReference(field, predicate)); + return this; + } + + public IXLPivotValueStyleFormat ForValueField(IXLPivotValue valueField) + { + FieldReferences.Add(new PivotValueFieldReference(valueField.SourceName)); + return this; + } + + #endregion IXLPivotValueStyleFormat members + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValue.cs b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValue.cs new file mode 100644 index 0000000..3723e82 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValue.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public enum XLPivotSummary + { + Sum, + Count, + Average, + Minimum, + Maximum, + Product, + CountNumbers, + StandardDeviation, + PopulationStandardDeviation, + Variance, + PopulationVariance, + } + + public enum XLPivotCalculation + { + Normal, + DifferenceFrom, + PercentageOf, + PercentageDifferenceFrom, + RunningTotal, + PercentageOfRow, + PercentageOfColumn, + PercentageOfTotal, + Index + } + public enum XLPivotCalculationItem + { + Value, Previous, Next + } + + public interface IXLPivotValue + { + String SourceName { get; } + String CustomName { get; set; } + + IXLPivotValueFormat NumberFormat { get; } + + XLPivotSummary SummaryFormula { get; set; } + XLPivotCalculation Calculation { get; set; } + String BaseField { get; set; } + String BaseItem { get; set; } + XLPivotCalculationItem CalculationItem { get; set; } + + IXLPivotValue SetSummaryFormula(XLPivotSummary value); + IXLPivotValue SetCalculation(XLPivotCalculation value); + IXLPivotValue SetBaseField(String value); + IXLPivotValue SetBaseItem(String value); + IXLPivotValue SetCalculationItem(XLPivotCalculationItem value); + + + IXLPivotValue ShowAsNormal(); + IXLPivotValueCombination ShowAsDifferenceFrom(String fieldSourceName); + IXLPivotValueCombination ShowAsPercentageFrom(String fieldSourceName); + IXLPivotValueCombination ShowAsPercentageDifferenceFrom(String fieldSourceName); + IXLPivotValue ShowAsRunningTotalIn(String fieldSourceName); + IXLPivotValue ShowAsPercentageOfRow(); + IXLPivotValue ShowAsPercentageOfColumn(); + IXLPivotValue ShowAsPercentageOfTotal(); + IXLPivotValue ShowAsIndex(); + + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueCombination.cs b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueCombination.cs new file mode 100644 index 0000000..a6e3a72 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueCombination.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLPivotValueCombination + { + IXLPivotValue And(String item); + IXLPivotValue AndPrevious(); + IXLPivotValue AndNext(); + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueFormat.cs b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueFormat.cs new file mode 100644 index 0000000..2923cb5 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueFormat.cs @@ -0,0 +1,11 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLPivotValueFormat : IXLNumberFormatBase, IEquatable + { + IXLPivotValue SetNumberFormatId(Int32 value); + + IXLPivotValue SetFormat(String value); + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValues.cs b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValues.cs new file mode 100644 index 0000000..68b9c9f --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValues.cs @@ -0,0 +1,29 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLPivotValues : IEnumerable + { + IXLPivotValue Add(String sourceName); + + IXLPivotValue Add(String sourceName, String customName); + + void Clear(); + + Boolean Contains(String sourceName); + + Boolean Contains(IXLPivotValue pivotValue); + + IXLPivotValue Get(String sourceName); + + IXLPivotValue Get(Int32 index); + + Int32 IndexOf(String sourceName); + + Int32 IndexOf(IXLPivotValue pivotValue); + + void Remove(String sourceName); + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValue.cs b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValue.cs new file mode 100644 index 0000000..baed68c --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValue.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLPivotValue: IXLPivotValue + { + public XLPivotValue(string sourceName) + { + SourceName = sourceName; + NumberFormat = new XLPivotValueFormat(this); + } + + public IXLPivotValueFormat NumberFormat { get; private set; } + public String SourceName { get; private set; } + public String CustomName { get; set; } public IXLPivotValue SetCustomName(String value) { CustomName = value; return this; } + + public XLPivotSummary SummaryFormula { get; set; } public IXLPivotValue SetSummaryFormula(XLPivotSummary value) { SummaryFormula = value; return this; } + public XLPivotCalculation Calculation { get; set; } public IXLPivotValue SetCalculation(XLPivotCalculation value) { Calculation = value; return this; } + public String BaseField { get; set; } public IXLPivotValue SetBaseField(String value) { BaseField = value; return this; } + public String BaseItem { get; set; } public IXLPivotValue SetBaseItem(String value) { BaseItem = value; return this; } + public XLPivotCalculationItem CalculationItem { get; set; } public IXLPivotValue SetCalculationItem(XLPivotCalculationItem value) { CalculationItem = value; return this; } + + + public IXLPivotValue ShowAsNormal() + { + return SetCalculation(XLPivotCalculation.Normal); + } + public IXLPivotValueCombination ShowAsDifferenceFrom(String fieldSourceName) + { + BaseField = fieldSourceName; + SetCalculation(XLPivotCalculation.DifferenceFrom); + return new XLPivotValueCombination(this); + } + public IXLPivotValueCombination ShowAsPercentageFrom(String fieldSourceName) + { + BaseField = fieldSourceName; + SetCalculation(XLPivotCalculation.PercentageOf); + return new XLPivotValueCombination(this); + } + public IXLPivotValueCombination ShowAsPercentageDifferenceFrom(String fieldSourceName) + { + BaseField = fieldSourceName; + SetCalculation(XLPivotCalculation.PercentageDifferenceFrom); + return new XLPivotValueCombination(this); + } + public IXLPivotValue ShowAsRunningTotalIn(String fieldSourceName) + { + BaseField = fieldSourceName; + return SetCalculation(XLPivotCalculation.RunningTotal); + } + public IXLPivotValue ShowAsPercentageOfRow() + { + return SetCalculation(XLPivotCalculation.PercentageOfRow); + } + + public IXLPivotValue ShowAsPercentageOfColumn() + { + return SetCalculation(XLPivotCalculation.PercentageOfColumn); + } + + public IXLPivotValue ShowAsPercentageOfTotal() + { + return SetCalculation(XLPivotCalculation.PercentageOfTotal); + } + + public IXLPivotValue ShowAsIndex() + { + return SetCalculation(XLPivotCalculation.Index); + } + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueCombination.cs b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueCombination.cs new file mode 100644 index 0000000..5d8c124 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueCombination.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLPivotValueCombination: IXLPivotValueCombination + { + private readonly IXLPivotValue _pivotValue; + public XLPivotValueCombination(IXLPivotValue pivotValue) + { + _pivotValue = pivotValue; + } + public IXLPivotValue And(String item) + { + _pivotValue.BaseItem = item; + _pivotValue.CalculationItem = XLPivotCalculationItem.Value; + return _pivotValue; + } + public IXLPivotValue AndPrevious() + { + _pivotValue.CalculationItem = XLPivotCalculationItem.Previous; + return _pivotValue; + } + public IXLPivotValue AndNext() + { + _pivotValue.CalculationItem = XLPivotCalculationItem.Next; + return _pivotValue; + } + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueFormat.cs b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueFormat.cs new file mode 100644 index 0000000..8ab869b --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueFormat.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLPivotValueFormat: IXLPivotValueFormat + { + private readonly XLPivotValue _pivotValue; + public XLPivotValueFormat(XLPivotValue pivotValue) + { + _pivotValue = pivotValue; + _format = "General"; + _numberFormatId = 0; + } + + private Int32 _numberFormatId = -1; + public Int32 NumberFormatId + { + get { return _numberFormatId; } + set + { + _numberFormatId = value; + _format = string.Empty; + } + } + + private String _format = String.Empty; + public String Format + { + get { return _format; } + set + { + _format = value; + _numberFormatId = -1; + } + } + + public IXLPivotValue SetNumberFormatId(Int32 value) + { + NumberFormatId = value; + return _pivotValue; + } + public IXLPivotValue SetFormat(String value) + { + Format = value; + + switch (value) + { + case "General": + _numberFormatId = 0; + break; + case "0": + _numberFormatId = 1; + break; + case "0.00": + _numberFormatId = 2; + break; + case "#,##0": + _numberFormatId = 3; + break; + case "#,##0.00": + _numberFormatId = 4; + break; + case "0%": + _numberFormatId = 9; + break; + case "0.00%": + _numberFormatId = 10; + break; + case "0.00E+00": + _numberFormatId = 11; + break; + } + + + return _pivotValue; + } + + #region Overrides + public bool Equals(IXLNumberFormatBase other) + { + return + _numberFormatId == other.NumberFormatId + && _format == other.Format + ; + } + + public override bool Equals(object obj) + { + return Equals((IXLNumberFormatBase)obj); + } + + public override int GetHashCode() + { + return NumberFormatId + ^ Format.GetHashCode(); + } + + #endregion + + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValues.cs b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValues.cs new file mode 100644 index 0000000..186eb5e --- /dev/null +++ b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValues.cs @@ -0,0 +1,92 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLPivotValues : IXLPivotValues + { + private readonly IXLPivotTable _pivotTable; + private readonly Dictionary _pivotValues = new Dictionary(StringComparer.OrdinalIgnoreCase); + + internal XLPivotValues(IXLPivotTable pivotTable) + { + this._pivotTable = pivotTable; + } + + public IXLPivotValue Add(String sourceName) + { + return Add(sourceName, sourceName); + } + + public IXLPivotValue Add(String sourceName, String customName) + { + if (sourceName != XLConstants.PivotTable.ValuesSentinalLabel && !this._pivotTable.SourceRangeFieldsAvailable.Contains(sourceName)) + throw new ArgumentOutOfRangeException(nameof(sourceName), String.Format("The column '{0}' does not appear in the source range.", sourceName)); + + var pivotValue = new XLPivotValue(sourceName) { CustomName = customName }; + _pivotValues.Add(customName, pivotValue); + + if (_pivotValues.Count > 1 && this._pivotTable.ColumnLabels.All(cl => cl.SourceName != XLConstants.PivotTable.ValuesSentinalLabel) && this._pivotTable.RowLabels.All(rl => rl.SourceName != XLConstants.PivotTable.ValuesSentinalLabel)) + _pivotTable.ColumnLabels.Add(XLConstants.PivotTable.ValuesSentinalLabel); + + return pivotValue; + } + + public void Clear() + { + _pivotValues.Clear(); + } + + public Boolean Contains(String sourceName) + { + return _pivotValues.ContainsKey(sourceName); + } + + public Boolean Contains(IXLPivotValue pivotValue) + { + return _pivotValues.ContainsKey(pivotValue.SourceName); + } + + public IXLPivotValue Get(String sourceName) + { + return _pivotValues[sourceName]; + } + + public IXLPivotValue Get(Int32 index) + { + return _pivotValues.Values.ElementAt(index); + } + + public IEnumerator GetEnumerator() + { + return _pivotValues.Values.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public Int32 IndexOf(String sourceName) + { + var selectedItem = _pivotValues.Select((item, index) => new { Item = item, Position = index }).FirstOrDefault(i => i.Item.Key == sourceName); + if (selectedItem == null) + throw new ArgumentNullException(nameof(sourceName), "Invalid field name."); + + return selectedItem.Position; + } + + public Int32 IndexOf(IXLPivotValue pivotValue) + { + return IndexOf(pivotValue.SourceName); + } + + public void Remove(String sourceName) + { + _pivotValues.Remove(sourceName); + } + } +} diff --git a/ClosedXML/Excel/PivotTables/XLPivotAreaValues.cs b/ClosedXML/Excel/PivotTables/XLPivotAreaValues.cs new file mode 100644 index 0000000..6609b4a --- /dev/null +++ b/ClosedXML/Excel/PivotTables/XLPivotAreaValues.cs @@ -0,0 +1,14 @@ +namespace ClosedXML.Excel +{ + internal enum XLPivotAreaValues + { + None = 0, + Normal = 1, + Data = 2, + All = 3, + Origin = 4, + Button = 5, + TopRight = 6, + TopEnd = 7 + } +} diff --git a/ClosedXML/Excel/PivotTables/XLPivotField.cs b/ClosedXML/Excel/PivotTables/XLPivotField.cs new file mode 100644 index 0000000..71ce833 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/XLPivotField.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace ClosedXML.Excel +{ + [DebuggerDisplay("{SourceName}")] + internal class XLPivotField : IXLPivotField + { + private readonly IXLPivotTable _pivotTable; + public XLPivotField(IXLPivotTable pivotTable, string sourceName) + { + this._pivotTable = pivotTable; + SourceName = sourceName; + Subtotals = new List(); + SelectedValues = new List(); + SortType = XLPivotSortType.Default; + SetExcelDefaults(); + + StyleFormats = new XLPivotFieldStyleFormats(this); + } + + public String SourceName { get; private set; } + public String CustomName { get; set; } + + public IXLPivotField SetCustomName(String value) { CustomName = value; return this; } + + public String SubtotalCaption { get; set; } + + public IXLPivotField SetSubtotalCaption(String value) { SubtotalCaption = value; return this; } + + public List Subtotals { get; private set; } + + public IXLPivotField AddSubtotal(XLSubtotalFunction value) { Subtotals.Add(value); return this; } + + public Boolean IncludeNewItemsInFilter { get; set; } + + public IXLPivotField SetIncludeNewItemsInFilter() { IncludeNewItemsInFilter = true; return this; } + + public IXLPivotField SetIncludeNewItemsInFilter(Boolean value) { IncludeNewItemsInFilter = value; return this; } + + public bool Outline { get; set; } + public bool Compact { get; set; } + + public IXLPivotField SetLayout(XLPivotLayout value) + { + Compact = false; + Outline = false; + switch (value) + { + case XLPivotLayout.Compact: Compact = true; break; + case XLPivotLayout.Outline: Outline = true; break; + } + return this; + } + + public Boolean? SubtotalsAtTop { get; set; } + + public IXLPivotField SetSubtotalsAtTop() { SubtotalsAtTop = true; return this; } + + public IXLPivotField SetSubtotalsAtTop(Boolean value) { SubtotalsAtTop = value; return this; } + + public Boolean RepeatItemLabels { get; set; } + + public IXLPivotField SetRepeatItemLabels() { RepeatItemLabels = true; return this; } + + public IXLPivotField SetRepeatItemLabels(Boolean value) { RepeatItemLabels = value; return this; } + + public Boolean InsertBlankLines { get; set; } + + public IXLPivotField SetInsertBlankLines() { InsertBlankLines = true; return this; } + + public IXLPivotField SetInsertBlankLines(Boolean value) { InsertBlankLines = value; return this; } + + public Boolean ShowBlankItems { get; set; } + + public IXLPivotField SetShowBlankItems() { ShowBlankItems = true; return this; } + + public IXLPivotField SetShowBlankItems(Boolean value) { ShowBlankItems = value; return this; } + + public Boolean InsertPageBreaks { get; set; } + + public IXLPivotField SetInsertPageBreaks() { InsertPageBreaks = true; return this; } + + public IXLPivotField SetInsertPageBreaks(Boolean value) { InsertPageBreaks = value; return this; } + + public Boolean Collapsed { get; set; } + + public IXLPivotField SetCollapsed() { Collapsed = true; return this; } + + public IXLPivotField SetCollapsed(Boolean value) { Collapsed = value; return this; } + + public XLPivotSortType SortType { get; set; } + + public IXLPivotField SetSort(XLPivotSortType value) { SortType = value; return this; } + + public IList SelectedValues { get; private set; } + + public IXLPivotField AddSelectedValue(Object value) + { + SelectedValues.Add(value); + return this; + } + + private void SetExcelDefaults() + { + IncludeNewItemsInFilter = false; + Outline = true; + Compact = true; + InsertBlankLines = false; + ShowBlankItems = false; + InsertPageBreaks = false; + RepeatItemLabels = false; + SubtotalsAtTop = true; + Collapsed = false; + } + + public IXLPivotFieldStyleFormats StyleFormats { get; set; } + + public Boolean IsOnRowAxis => _pivotTable.RowLabels.Contains(this.SourceName); + + public Boolean IsOnColumnAxis => _pivotTable.ColumnLabels.Contains(this.SourceName); + + public Boolean IsInFilterList => _pivotTable.ReportFilters.Contains(this.SourceName); + + public Int32 Offset => _pivotTable.SourceRangeFieldsAvailable.ToList().IndexOf(this.SourceName); + } +} diff --git a/ClosedXML/Excel/PivotTables/XLPivotFields.cs b/ClosedXML/Excel/PivotTables/XLPivotFields.cs new file mode 100644 index 0000000..bc3b07b --- /dev/null +++ b/ClosedXML/Excel/PivotTables/XLPivotFields.cs @@ -0,0 +1,91 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLPivotFields : IXLPivotFields + { + private readonly Dictionary _pivotFields = new Dictionary(StringComparer.OrdinalIgnoreCase); + private readonly IXLPivotTable _pivotTable; + + internal XLPivotFields(IXLPivotTable pivotTable) + { + this._pivotTable = pivotTable; + } + + #region IXLPivotFields members + + public IXLPivotField Add(String sourceName) + { + return Add(sourceName, sourceName); + } + + public IXLPivotField Add(String sourceName, String customName) + { + if (sourceName != XLConstants.PivotTable.ValuesSentinalLabel && !this._pivotTable.SourceRangeFieldsAvailable.Contains(sourceName)) + throw new ArgumentOutOfRangeException(nameof(sourceName), String.Format("The column '{0}' does not appear in the source range.", sourceName)); + + var pivotField = new XLPivotField(_pivotTable, sourceName) { CustomName = customName }; + _pivotFields.Add(sourceName, pivotField); + return pivotField; + } + + public void Clear() + { + _pivotFields.Clear(); + } + + public Boolean Contains(String sourceName) + { + return _pivotFields.ContainsKey(sourceName); + } + + public bool Contains(IXLPivotField pivotField) + { + return _pivotFields.ContainsKey(pivotField.SourceName); + } + + public IXLPivotField Get(String sourceName) + { + return _pivotFields[sourceName]; + } + + public IXLPivotField Get(Int32 index) + { + return _pivotFields.Values.ElementAt(index); + } + + public IEnumerator GetEnumerator() + { + return _pivotFields.Values.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public Int32 IndexOf(String sourceName) + { + var selectedItem = _pivotFields.Select((item, index) => new { Item = item, Position = index }).FirstOrDefault(i => i.Item.Key == sourceName); + if (selectedItem == null) + throw new ArgumentNullException(nameof(sourceName), "Invalid field name."); + + return selectedItem.Position; + } + + public Int32 IndexOf(IXLPivotField pf) + { + return IndexOf(pf.SourceName); + } + + public void Remove(String sourceName) + { + _pivotFields.Remove(sourceName); + } + + #endregion IXLPivotFields members + } +} diff --git a/ClosedXML/Excel/PivotTables/XLPivotTable.cs b/ClosedXML/Excel/PivotTables/XLPivotTable.cs new file mode 100644 index 0000000..7b572ec --- /dev/null +++ b/ClosedXML/Excel/PivotTables/XLPivotTable.cs @@ -0,0 +1,412 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace ClosedXML.Excel +{ + [DebuggerDisplay("{Name}")] + internal class XLPivotTable : IXLPivotTable + { + private String _name; + public Guid Guid { get; private set; } + + public XLPivotTable(IXLWorksheet worksheet) + { + this.Worksheet = worksheet ?? throw new ArgumentNullException(nameof(worksheet)); + this.Guid = Guid.NewGuid(); + + Fields = new XLPivotFields(this); + ReportFilters = new XLPivotFields(this); + ColumnLabels = new XLPivotFields(this); + RowLabels = new XLPivotFields(this); + Values = new XLPivotValues(this); + Theme = XLPivotTableTheme.PivotStyleLight16; + + SetExcelDefaults(); + } + + public IXLCell TargetCell { get; set; } + + private IXLRange sourceRange; + + public IXLRange SourceRange + { + get { return sourceRange; } + set + { + if (value is IXLTable) + SourceType = XLPivotTableSourceType.Table; + else + SourceType = XLPivotTableSourceType.Range; + + sourceRange = value; + } + } + + public IXLTable SourceTable + { + get { return SourceRange as IXLTable; } + set { SourceRange = value; } + } + + public XLPivotTableSourceType SourceType { get; private set; } + + public IEnumerable SourceRangeFieldsAvailable + { + get { return this.SourceRange.FirstRow().Cells().Select(c => c.GetString()); } + } + + public IXLPivotFields Fields { get; private set; } + public IXLPivotFields ReportFilters { get; private set; } + public IXLPivotFields ColumnLabels { get; private set; } + public IXLPivotFields RowLabels { get; private set; } + public IXLPivotValues Values { get; private set; } + + public IEnumerable ImplementedFields + { + get + { + foreach (var pf in ReportFilters) + yield return pf; + + foreach (var pf in RowLabels) + yield return pf; + + foreach (var pf in ColumnLabels) + yield return pf; + } + } + + public XLPivotTableTheme Theme { get; set; } + + public IXLPivotTable SetTheme(XLPivotTableTheme value) { Theme = value; return this; } + + public String Name + { + get { return _name; } + set + { + if (_name == value) return; + + var oldname = _name ?? string.Empty; + + if (!XLHelper.ValidateName("pivot table", value, oldname, Worksheet.PivotTables.Select(pvt => pvt.Name), out String message)) + throw new ArgumentException(message, nameof(value)); + + _name = value; + + if (!String.IsNullOrWhiteSpace(oldname) && !String.Equals(oldname, _name, StringComparison.OrdinalIgnoreCase)) + { + Worksheet.PivotTables.Delete(oldname); + (Worksheet.PivotTables as XLPivotTables).Add(_name, this); + } + } + } + + public IXLPivotTable SetName(String value) { Name = value; return this; } + + public String Title { get; set; } + + public IXLPivotTable SetTitle(String value) { Title = value; return this; } + + public String Description { get; set; } + + public IXLPivotTable SetDescription(String value) { Description = value; return this; } + + public String ColumnHeaderCaption { get; set; } + + public IXLPivotTable SetColumnHeaderCaption(String value) + { + ColumnHeaderCaption = value; + return this; + } + + public String RowHeaderCaption { get; set; } + + public IXLPivotTable SetRowHeaderCaption(String value) + { + RowHeaderCaption = value; + return this; + } + + public Boolean MergeAndCenterWithLabels { get; set; } + + public IXLPivotTable SetMergeAndCenterWithLabels() { MergeAndCenterWithLabels = true; return this; } + + public IXLPivotTable SetMergeAndCenterWithLabels(Boolean value) { MergeAndCenterWithLabels = value; return this; } + + public Int32 RowLabelIndent { get; set; } + + public IXLPivotTable SetRowLabelIndent(Int32 value) { RowLabelIndent = value; return this; } + + public XLFilterAreaOrder FilterAreaOrder { get; set; } + + public IXLPivotTable SetFilterAreaOrder(XLFilterAreaOrder value) { FilterAreaOrder = value; return this; } + + public Int32 FilterFieldsPageWrap { get; set; } + + public IXLPivotTable SetFilterFieldsPageWrap(Int32 value) { FilterFieldsPageWrap = value; return this; } + + public String ErrorValueReplacement { get; set; } + + public IXLPivotTable SetErrorValueReplacement(String value) { ErrorValueReplacement = value; return this; } + + public String EmptyCellReplacement { get; set; } + + public IXLPivotTable SetEmptyCellReplacement(String value) { EmptyCellReplacement = value; return this; } + + public Boolean AutofitColumns { get; set; } + + public IXLPivotTable SetAutofitColumns() { AutofitColumns = true; return this; } + + public IXLPivotTable SetAutofitColumns(Boolean value) { AutofitColumns = value; return this; } + + public Boolean PreserveCellFormatting { get; set; } + + public IXLPivotTable SetPreserveCellFormatting() { PreserveCellFormatting = true; return this; } + + public IXLPivotTable SetPreserveCellFormatting(Boolean value) { PreserveCellFormatting = value; return this; } + + public Boolean ShowGrandTotalsRows { get; set; } + + public IXLPivotTable SetShowGrandTotalsRows() { ShowGrandTotalsRows = true; return this; } + + public IXLPivotTable SetShowGrandTotalsRows(Boolean value) { ShowGrandTotalsRows = value; return this; } + + public Boolean ShowGrandTotalsColumns { get; set; } + + public IXLPivotTable SetShowGrandTotalsColumns() { ShowGrandTotalsColumns = true; return this; } + + public IXLPivotTable SetShowGrandTotalsColumns(Boolean value) { ShowGrandTotalsColumns = value; return this; } + + public Boolean FilteredItemsInSubtotals { get; set; } + + public IXLPivotTable SetFilteredItemsInSubtotals() { FilteredItemsInSubtotals = true; return this; } + + public IXLPivotTable SetFilteredItemsInSubtotals(Boolean value) { FilteredItemsInSubtotals = value; return this; } + + public Boolean AllowMultipleFilters { get; set; } + + public IXLPivotTable SetAllowMultipleFilters() { AllowMultipleFilters = true; return this; } + + public IXLPivotTable SetAllowMultipleFilters(Boolean value) { AllowMultipleFilters = value; return this; } + + public Boolean UseCustomListsForSorting { get; set; } + + public IXLPivotTable SetUseCustomListsForSorting() { UseCustomListsForSorting = true; return this; } + + public IXLPivotTable SetUseCustomListsForSorting(Boolean value) { UseCustomListsForSorting = value; return this; } + + public Boolean ShowExpandCollapseButtons { get; set; } + + public IXLPivotTable SetShowExpandCollapseButtons() { ShowExpandCollapseButtons = true; return this; } + + public IXLPivotTable SetShowExpandCollapseButtons(Boolean value) { ShowExpandCollapseButtons = value; return this; } + + public Boolean ShowContextualTooltips { get; set; } + + public IXLPivotTable SetShowContextualTooltips() { ShowContextualTooltips = true; return this; } + + public IXLPivotTable SetShowContextualTooltips(Boolean value) { ShowContextualTooltips = value; return this; } + + public Boolean ShowPropertiesInTooltips { get; set; } + + public IXLPivotTable SetShowPropertiesInTooltips() { ShowPropertiesInTooltips = true; return this; } + + public IXLPivotTable SetShowPropertiesInTooltips(Boolean value) { ShowPropertiesInTooltips = value; return this; } + + public Boolean DisplayCaptionsAndDropdowns { get; set; } + + public IXLPivotTable SetDisplayCaptionsAndDropdowns() { DisplayCaptionsAndDropdowns = true; return this; } + + public IXLPivotTable SetDisplayCaptionsAndDropdowns(Boolean value) { DisplayCaptionsAndDropdowns = value; return this; } + + public Boolean ClassicPivotTableLayout { get; set; } + + public IXLPivotTable SetClassicPivotTableLayout() { ClassicPivotTableLayout = true; return this; } + + public IXLPivotTable SetClassicPivotTableLayout(Boolean value) { ClassicPivotTableLayout = value; return this; } + + public Boolean ShowValuesRow { get; set; } + + public IXLPivotTable SetShowValuesRow() { ShowValuesRow = true; return this; } + + public IXLPivotTable SetShowValuesRow(Boolean value) { ShowValuesRow = value; return this; } + + public Boolean ShowEmptyItemsOnRows { get; set; } + + public IXLPivotTable SetShowEmptyItemsOnRows() { ShowEmptyItemsOnRows = true; return this; } + + public IXLPivotTable SetShowEmptyItemsOnRows(Boolean value) { ShowEmptyItemsOnRows = value; return this; } + + public Boolean ShowEmptyItemsOnColumns { get; set; } + + public IXLPivotTable SetShowEmptyItemsOnColumns() { ShowEmptyItemsOnColumns = true; return this; } + + public IXLPivotTable SetShowEmptyItemsOnColumns(Boolean value) { ShowEmptyItemsOnColumns = value; return this; } + + public Boolean DisplayItemLabels { get; set; } + + public IXLPivotTable SetDisplayItemLabels() { DisplayItemLabels = true; return this; } + + public IXLPivotTable SetDisplayItemLabels(Boolean value) { DisplayItemLabels = value; return this; } + + public Boolean SortFieldsAtoZ { get; set; } + + public IXLPivotTable SetSortFieldsAtoZ() { SortFieldsAtoZ = true; return this; } + + public IXLPivotTable SetSortFieldsAtoZ(Boolean value) { SortFieldsAtoZ = value; return this; } + + public Boolean PrintExpandCollapsedButtons { get; set; } + + public IXLPivotTable SetPrintExpandCollapsedButtons() { PrintExpandCollapsedButtons = true; return this; } + + public IXLPivotTable SetPrintExpandCollapsedButtons(Boolean value) { PrintExpandCollapsedButtons = value; return this; } + + public Boolean RepeatRowLabels { get; set; } + + public IXLPivotTable SetRepeatRowLabels() { RepeatRowLabels = true; return this; } + + public IXLPivotTable SetRepeatRowLabels(Boolean value) { RepeatRowLabels = value; return this; } + + public Boolean PrintTitles { get; set; } + + public IXLPivotTable SetPrintTitles() { PrintTitles = true; return this; } + + public IXLPivotTable SetPrintTitles(Boolean value) { PrintTitles = value; return this; } + + public Boolean SaveSourceData { get; set; } + + public IXLPivotTable SetSaveSourceData() { SaveSourceData = true; return this; } + + public IXLPivotTable SetSaveSourceData(Boolean value) { SaveSourceData = value; return this; } + + public Boolean EnableShowDetails { get; set; } + + public IXLPivotTable SetEnableShowDetails() { EnableShowDetails = true; return this; } + + public IXLPivotTable SetEnableShowDetails(Boolean value) { EnableShowDetails = value; return this; } + + public Boolean RefreshDataOnOpen { get; set; } + + public IXLPivotTable SetRefreshDataOnOpen() { RefreshDataOnOpen = true; return this; } + + public IXLPivotTable SetRefreshDataOnOpen(Boolean value) { RefreshDataOnOpen = value; return this; } + + public XLItemsToRetain ItemsToRetainPerField { get; set; } + + public IXLPivotTable SetItemsToRetainPerField(XLItemsToRetain value) { ItemsToRetainPerField = value; return this; } + + public Boolean EnableCellEditing { get; set; } + + public IXLPivotTable SetEnableCellEditing() { EnableCellEditing = true; return this; } + + public IXLPivotTable SetEnableCellEditing(Boolean value) { EnableCellEditing = value; return this; } + + public Boolean ShowRowHeaders { get; set; } + + public IXLPivotTable SetShowRowHeaders() { ShowRowHeaders = true; return this; } + + public IXLPivotTable SetShowRowHeaders(Boolean value) { ShowRowHeaders = value; return this; } + + public Boolean ShowColumnHeaders { get; set; } + + public IXLPivotTable SetShowColumnHeaders() { ShowColumnHeaders = true; return this; } + + public IXLPivotTable SetShowColumnHeaders(Boolean value) { ShowColumnHeaders = value; return this; } + + public Boolean ShowRowStripes { get; set; } + + public IXLPivotTable SetShowRowStripes() { ShowRowStripes = true; return this; } + + public IXLPivotTable SetShowRowStripes(Boolean value) { ShowRowStripes = value; return this; } + + public Boolean ShowColumnStripes { get; set; } + + public IXLPivotTable SetShowColumnStripes() { ShowColumnStripes = true; return this; } + + public IXLPivotTable SetShowColumnStripes(Boolean value) { ShowColumnStripes = value; return this; } + + public XLPivotSubtotals Subtotals { get; set; } + + public IXLPivotTable SetSubtotals(XLPivotSubtotals value) { Subtotals = value; return this; } + + public XLPivotLayout Layout + { + set { Fields.ForEach(f => f.SetLayout(value)); } + } + + public IXLPivotTable SetLayout(XLPivotLayout value) { Layout = value; return this; } + + public Boolean InsertBlankLines + { + set { Fields.ForEach(f => f.SetInsertBlankLines(value)); } + } + + public IXLPivotTable SetInsertBlankLines() { InsertBlankLines = true; return this; } + + public IXLPivotTable SetInsertBlankLines(Boolean value) { InsertBlankLines = value; return this; } + + internal String RelId { get; set; } + internal String CacheDefinitionRelId { get; set; } + internal String WorkbookCacheRelId { get; set; } + + private void SetExcelDefaults() + { + EmptyCellReplacement = String.Empty; + SaveSourceData = true; + ShowColumnHeaders = true; + ShowRowHeaders = true; + + // source http://www.datypic.com/sc/ooxml/e-ssml_pivotTableDefinition.html + DisplayItemLabels = true; // Show Item Names + ShowExpandCollapseButtons = true; // Show Expand Collapse + PrintExpandCollapsedButtons = false; // Print Drill Indicators + ShowPropertiesInTooltips = true; // Show Member Property ToolTips + ShowContextualTooltips = true; // Show ToolTips on Data + EnableShowDetails = true; // Enable Drill Down + PreserveCellFormatting = true; // Preserve Formatting + AutofitColumns = false; // Auto Formatting + FilterAreaOrder = XLFilterAreaOrder.DownThenOver; // Page Over Then Down + FilteredItemsInSubtotals = false; // Subtotal Hidden Items + ShowGrandTotalsRows = true; // Row Grand Totals + ShowGrandTotalsColumns = true; // Grand Totals On Columns + PrintTitles = false; // Field Print Titles + RepeatRowLabels = false; // Item Print Titles + MergeAndCenterWithLabels = false; // Merge Titles + RowLabelIndent = 1; // Indentation for Compact Axis + ShowEmptyItemsOnRows = false; // Show Empty Row + ShowEmptyItemsOnColumns = false; // Show Empty Column + DisplayCaptionsAndDropdowns = true; // Show Field Headers + ClassicPivotTableLayout = false; // Enable Drop Zones + AllowMultipleFilters = true; // Multiple Field Filters + SortFieldsAtoZ = false; // Default Sort Order + UseCustomListsForSorting = true; // Custom List AutoSort + } + + public IXLWorksheet Worksheet { get; } + + public IXLPivotTableStyleFormats StyleFormats { get; } = new XLPivotTableStyleFormats(); + + public IEnumerable AllStyleFormats + { + get + { + foreach (var styleFormat in this.StyleFormats.RowGrandTotalFormats) + yield return styleFormat; + + foreach (var styleFormat in this.StyleFormats.ColumnGrandTotalFormats) + yield return styleFormat; + + foreach (var pivotField in ImplementedFields) + { + yield return pivotField.StyleFormats.Subtotal; + yield return pivotField.StyleFormats.Header; + yield return pivotField.StyleFormats.Label; + yield return pivotField.StyleFormats.DataValuesFormat; + } + } + } + } +} diff --git a/ClosedXML/Excel/PivotTables/XLPivotTables.cs b/ClosedXML/Excel/PivotTables/XLPivotTables.cs new file mode 100644 index 0000000..a601d58 --- /dev/null +++ b/ClosedXML/Excel/PivotTables/XLPivotTables.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLPivotTables : IXLPivotTables + { + private readonly Dictionary _pivotTables = new Dictionary(StringComparer.OrdinalIgnoreCase); + + public XLPivotTables(IXLWorksheet worksheet) + { + this.Worksheet = worksheet ?? throw new ArgumentNullException(nameof(worksheet)); + } + + internal void Add(String name, IXLPivotTable pivotTable) + { + _pivotTables.Add(name, (XLPivotTable)pivotTable); + } + + public IXLPivotTable Add(string name, IXLCell targetCell, IXLRange range) + { + var pivotTable = new XLPivotTable(this.Worksheet) + { + Name = name, + TargetCell = targetCell, + SourceRange = range + }; + _pivotTables.Add(name, pivotTable); + return pivotTable; + } + + public IXLPivotTable Add(string name, IXLCell targetCell, IXLTable table) + { + var pivotTable = new XLPivotTable(this.Worksheet) + { + Name = name, + TargetCell = targetCell, + SourceTable = table + }; + _pivotTables.Add(name, pivotTable); + return pivotTable; + } + + public IXLPivotTable AddNew(string name, IXLCell targetCell, IXLRange range) + { + return Add(name, targetCell, range); + } + + public IXLPivotTable AddNew(string name, IXLCell targetCell, IXLTable table) + { + return Add(name, targetCell, table); + } + + public Boolean Contains(String name) + { + return _pivotTables.ContainsKey(name); + } + + public void Delete(String name) + { + _pivotTables.Remove(name); + } + + public void DeleteAll() + { + _pivotTables.Clear(); + } + + public IEnumerator GetEnumerator() + { + return _pivotTables.Values.Cast().GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public XLPivotTable PivotTable(String name) + { + return _pivotTables[name]; + } + + IXLPivotTable IXLPivotTables.PivotTable(String name) + { + return PivotTable(name); + } + + public IXLWorksheet Worksheet { get; private set; } + } +} diff --git a/ClosedXML/Excel/Protection/IXLElementProtection.cs b/ClosedXML/Excel/Protection/IXLElementProtection.cs new file mode 100644 index 0000000..754ffa5 --- /dev/null +++ b/ClosedXML/Excel/Protection/IXLElementProtection.cs @@ -0,0 +1,82 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using static ClosedXML.Excel.XLProtectionAlgorithm; + +namespace ClosedXML.Excel +{ + public interface IXLElementProtection : IXLElementProtection + where T : struct + { + /// Gets or sets the elements that are allowed to be edited by the user, i.e. those that are not protected. + /// The allowed elements. + T AllowedElements { get; set; } + + /// + /// Adds the specified element to the list of allowed elements. + /// Beware that if you pass through "None", this will have no effect. + /// + /// The element to add + /// Set to true to allow the element or false to disallow the element + /// The current protection instance + IXLElementProtection AllowElement(T element, Boolean allowed = true); + + /// Allows all elements to be edited. + /// + IXLElementProtection AllowEverything(); + + /// Allows no elements to be edited. Protects all elements. + /// + IXLElementProtection AllowNone(); + + /// Copies all the protection settings from a different instance. + /// The protectable. + /// + IXLElementProtection CopyFrom(IXLElementProtection protectable); + + /// + /// Removes the element to the list of allowed elements. + /// Beware that if you pass through "None", this will have no effect. + /// + /// The element to remove + /// The current protection instance + IXLElementProtection DisallowElement(T element); + + /// Protects this instance without a password. + /// + IXLElementProtection Protect(); + + /// Protects this instance using the specified password and password hash algorithm. + /// The password. + /// The algorithm. + /// + IXLElementProtection Protect(String password, Algorithm algorithm = DefaultProtectionAlgorithm); + + /// Unprotects this instance without a password. + /// + IXLElementProtection Unprotect(); + + /// Unprotects this instance using the specified password. + /// The password. + /// + IXLElementProtection Unprotect(String password); + } + + public interface IXLElementProtection : ICloneable + { + /// Gets the algorithm used to hash the password. + /// The algorithm. + Algorithm Algorithm { get; } + + /// Gets a value indicating whether this instance is protected with a password. + /// + /// true if this instance is password protected; otherwise, false. + /// + Boolean IsPasswordProtected { get; } + + /// Gets a value indicating whether this instance is protected, either with or without a password. + /// + /// true if this instance is protected; otherwise, false. + /// + Boolean IsProtected { get; } + } +} diff --git a/ClosedXML/Excel/Protection/IXLProtectable.cs b/ClosedXML/Excel/Protection/IXLProtectable.cs new file mode 100644 index 0000000..f253c36 --- /dev/null +++ b/ClosedXML/Excel/Protection/IXLProtectable.cs @@ -0,0 +1,73 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using static ClosedXML.Excel.XLProtectionAlgorithm; + +namespace ClosedXML.Excel +{ + public interface IXLProtectable : IXLProtectable + where TProtection : IXLElementProtection + where TElement : struct + { + TProtection Protection { get; set; } + + /// Protects this instance without a password. + /// + new TProtection Protect(); + + /// Protects this instance using the specified password and password hash algorithm. + /// The password. + /// The algorithm. + /// + new TProtection Protect(String password, Algorithm algorithm = DefaultProtectionAlgorithm); + + /// Protects this instance with the specified password, password hash algorithm and set elements that the user is allowed to change. + /// The password. + /// The algorithm. + /// The allowed elements. + /// + TProtection Protect(String password, Algorithm algorithm, TElement allowedElements); + + /// Unprotects this instance without a password. + /// + new TProtection Unprotect(); + + /// Unprotects this instance using the specified password. + /// The password. + /// + new TProtection Unprotect(String password); + } + + public interface IXLProtectable + { + /// Gets a value indicating whether this instance is protected with a password. + /// + /// true if this instance is password protected; otherwise, false. + /// + Boolean IsPasswordProtected { get; } + + /// Gets a value indicating whether this instance is protected, either with or without a password. + /// + /// true if this instance is protected; otherwise, false. + /// + Boolean IsProtected { get; } + + /// Protects this instance without a password. + /// + IXLElementProtection Protect(); + + /// Protects this instance using the specified password and password hash algorithm. + /// The password. + /// The algorithm. + /// + IXLElementProtection Protect(String password, Algorithm algorithm = DefaultProtectionAlgorithm); + + /// Unprotects this instance without a password. + /// + IXLElementProtection Unprotect(); + + /// Unprotects this instance using the specified password. + /// The password. + /// + IXLElementProtection Unprotect(String password); + } +} diff --git a/ClosedXML/Excel/Protection/IXLSheetProtection.cs b/ClosedXML/Excel/Protection/IXLSheetProtection.cs new file mode 100644 index 0000000..d15ea96 --- /dev/null +++ b/ClosedXML/Excel/Protection/IXLSheetProtection.cs @@ -0,0 +1,6 @@ +namespace ClosedXML.Excel +{ + public interface IXLSheetProtection : IXLElementProtection + { + } +} diff --git a/ClosedXML/Excel/Protection/IXLWorkbookProtection.cs b/ClosedXML/Excel/Protection/IXLWorkbookProtection.cs new file mode 100644 index 0000000..6ef5dad --- /dev/null +++ b/ClosedXML/Excel/Protection/IXLWorkbookProtection.cs @@ -0,0 +1,6 @@ +namespace ClosedXML.Excel +{ + public interface IXLWorkbookProtection : IXLElementProtection + { + } +} diff --git a/ClosedXML/Excel/Protection/XLProtectionAlgorithm.cs b/ClosedXML/Excel/Protection/XLProtectionAlgorithm.cs new file mode 100644 index 0000000..f1aeee8 --- /dev/null +++ b/ClosedXML/Excel/Protection/XLProtectionAlgorithm.cs @@ -0,0 +1,47 @@ +// Keep this file CodeMaid organised and cleaned +using System.ComponentModel; + +namespace ClosedXML.Excel +{ + public static class XLProtectionAlgorithm + { + public const Algorithm DefaultProtectionAlgorithm = Algorithm.SimpleHash; + + public enum Algorithm + { + // The default hashing algorithm as described in http://kohei.us/2008/01/18/excel-sheet-protection-password-hash/ + [Description("SimpleHash")] + SimpleHash, + + //[Description("MD2")] + //MD2, + + //[Description("MD4")] + //MD4, + + //[Description("MD5")] + //MD5, + + //[Description("RIPEMD-128")] + //RIPEMD128, + + //[Description("RIPEMD-160")] + //RIPEMD160, + + //[Description("SHA-1")] + //SHA1, + + //[Description("SHA-256")] + //SHA256, + + //[Description("SHA-384")] + //SHA384, + + [Description("SHA-512")] + SHA512, + + //[Description("WHIRLPOOL")] + //WHIRLPOOL + } + } +} diff --git a/ClosedXML/Excel/Protection/XLSheetProtection.cs b/ClosedXML/Excel/Protection/XLSheetProtection.cs new file mode 100644 index 0000000..e58d6c6 --- /dev/null +++ b/ClosedXML/Excel/Protection/XLSheetProtection.cs @@ -0,0 +1,154 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using static ClosedXML.Excel.XLProtectionAlgorithm; + +namespace ClosedXML.Excel +{ + internal class XLSheetProtection : IXLSheetProtection + { + public XLSheetProtection(Algorithm algorithm) + { + this.Algorithm = algorithm; + AllowedElements = XLSheetProtectionElements.SelectEverything; + } + + public Algorithm Algorithm { get; internal set; } + public XLSheetProtectionElements AllowedElements { get; set; } + + public Boolean IsPasswordProtected => this.IsProtected && !String.IsNullOrEmpty(PasswordHash); + public Boolean IsProtected { get; internal set; } + + internal String Base64EncodedSalt { get; set; } + internal String PasswordHash { get; set; } + internal UInt32 SpinCount { get; set; } = 100000; + + public IXLSheetProtection AllowElement(XLSheetProtectionElements element, Boolean allowed = true) + { + if (!allowed) + return DisallowElement(element); + + AllowedElements |= element; + return this; + } + + public IXLSheetProtection AllowEverything() + { + return AllowElement(XLSheetProtectionElements.Everything); + } + + public IXLSheetProtection AllowNone() + { + AllowedElements = XLSheetProtectionElements.None; + return this; + } + + public object Clone() + { + return new XLSheetProtection(this.Algorithm) + { + IsProtected = this.IsProtected, + PasswordHash = this.PasswordHash, + SpinCount = this.SpinCount, + Base64EncodedSalt = this.Base64EncodedSalt, + AllowedElements = this.AllowedElements + }; + } + + public XLSheetProtection CopyFrom(IXLElementProtection sheetProtection) + { + if (sheetProtection is XLSheetProtection xlSheetProtection) + { + this.IsProtected = xlSheetProtection.IsProtected; + this.Algorithm = xlSheetProtection.Algorithm; + this.PasswordHash = xlSheetProtection.PasswordHash; + this.SpinCount = xlSheetProtection.SpinCount; + this.Base64EncodedSalt = xlSheetProtection.Base64EncodedSalt; + this.AllowedElements = xlSheetProtection.AllowedElements; + } + return this; + } + + public IXLSheetProtection DisallowElement(XLSheetProtectionElements element) + { + AllowedElements &= ~element; + return this; + } + + public IXLSheetProtection Protect() + { + return Protect(String.Empty); + } + + public IXLSheetProtection Protect(String password, Algorithm algorithm = DefaultProtectionAlgorithm, XLSheetProtectionElements allowedElements = XLSheetProtectionElements.SelectEverything) + { + if (IsProtected) + { + throw new InvalidOperationException("The worksheet is already protected"); + } + else + { + IsProtected = true; + + password = password ?? ""; + + this.Algorithm = algorithm; + this.Base64EncodedSalt = Utils.CryptographicAlgorithms.GenerateNewSalt(this.Algorithm); + this.PasswordHash = Utils.CryptographicAlgorithms.GetPasswordHash(this.Algorithm, password, this.Base64EncodedSalt, this.SpinCount); + } + + this.AllowedElements = allowedElements; + + return this; + } + + public IXLSheetProtection Unprotect() + { + return Unprotect(String.Empty); + } + + public IXLSheetProtection Unprotect(String password) + { + if (IsProtected) + { + password = password ?? ""; + + if ("" != PasswordHash && "" == password) + throw new InvalidOperationException("The worksheet is password protected"); + + var hash = Utils.CryptographicAlgorithms.GetPasswordHash(this.Algorithm, password, this.Base64EncodedSalt, this.SpinCount); + if (hash != PasswordHash) + throw new ArgumentException("Invalid password"); + else + { + IsProtected = false; + PasswordHash = String.Empty; + this.Base64EncodedSalt = String.Empty; + } + } + + return this; + } + + #region IXLProtectable interface + + IXLElementProtection IXLElementProtection.AllowElement(XLSheetProtectionElements element, Boolean allowed) => AllowElement(element, allowed); + + IXLElementProtection IXLElementProtection.AllowEverything() => AllowEverything(); + + IXLElementProtection IXLElementProtection.AllowNone() => AllowNone(); + + IXLElementProtection IXLElementProtection.CopyFrom(IXLElementProtection protectable) => CopyFrom(protectable); + + IXLElementProtection IXLElementProtection.DisallowElement(XLSheetProtectionElements element) => DisallowElement(element); + + IXLElementProtection IXLElementProtection.Protect() => Protect(); + + IXLElementProtection IXLElementProtection.Protect(String password, Algorithm algorithm) => Protect(password, algorithm); + + IXLElementProtection IXLElementProtection.Unprotect() => Unprotect(); + + IXLElementProtection IXLElementProtection.Unprotect(String password) => Unprotect(password); + + #endregion IXLProtectable interface + } +} diff --git a/ClosedXML/Excel/Protection/XLSheetProtectionElements.cs b/ClosedXML/Excel/Protection/XLSheetProtectionElements.cs new file mode 100644 index 0000000..afa56db --- /dev/null +++ b/ClosedXML/Excel/Protection/XLSheetProtectionElements.cs @@ -0,0 +1,39 @@ +using System; + +namespace ClosedXML.Excel +{ + [Flags] + public enum XLSheetProtectionElements + { + None = 0, + AutoFilter = 1 << 1, + DeleteColumns = 1 << 2, + DeleteRows = 1 << 3, + EditObjects = 1 << 4, + EditScenarios = 1 << 5, + FormatCells = 1 << 6, + FormatColumns = 1 << 7, + FormatRows = 1 << 8, + InsertColumns = 1 << 9, + InsertHyperlinks = 1 << 10, + InsertRows = 1 << 11, + PivotTables = 1 << 12, + SelectLockedCells = 1 << 13, + SelectUnlockedCells = 1 << 14, + Sort = 1 << 15, + + DeleteEverything = DeleteColumns | DeleteRows, + FormatEverything = FormatCells | FormatColumns | FormatRows, + InsertEverything = InsertColumns | InsertHyperlinks | InsertRows, + SelectEverything = SelectLockedCells | SelectUnlockedCells, + + Everything = AutoFilter + | DeleteColumns | DeleteRows + | EditObjects | EditScenarios + | FormatCells | FormatColumns | FormatRows + | InsertColumns | InsertHyperlinks | InsertRows + | PivotTables + | SelectLockedCells | SelectUnlockedCells + | Sort + } +} diff --git a/ClosedXML/Excel/Protection/XLWorkbookProtection.cs b/ClosedXML/Excel/Protection/XLWorkbookProtection.cs new file mode 100644 index 0000000..886ee1b --- /dev/null +++ b/ClosedXML/Excel/Protection/XLWorkbookProtection.cs @@ -0,0 +1,158 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using static ClosedXML.Excel.XLProtectionAlgorithm; + +namespace ClosedXML.Excel +{ + internal class XLWorkbookProtection : IXLWorkbookProtection + { + public XLWorkbookProtection(Algorithm algorithm) + : this(algorithm, XLWorkbookProtectionElements.Windows) + { + } + + public XLWorkbookProtection(Algorithm algorithm, XLWorkbookProtectionElements allowedElements) + { + this.Algorithm = algorithm; + this.AllowedElements = allowedElements; + } + + public Algorithm Algorithm { get; internal set; } + public XLWorkbookProtectionElements AllowedElements { get; set; } + public bool IsPasswordProtected => this.IsProtected && !String.IsNullOrEmpty(PasswordHash); + public bool IsProtected { get; internal set; } + + internal String Base64EncodedSalt { get; set; } + internal String PasswordHash { get; set; } + internal UInt32 SpinCount { get; set; } = 100000; + + public IXLWorkbookProtection AllowElement(XLWorkbookProtectionElements element, Boolean allowed = true) + { + if (allowed) + AllowedElements |= element; + else + AllowedElements &= ~element; + + return this; + } + + public IXLWorkbookProtection AllowEverything() + { + AllowedElements = XLWorkbookProtectionElements.Everything; + return this; + } + + public IXLWorkbookProtection AllowNone() + { + AllowedElements = XLWorkbookProtectionElements.None; + return this; + } + + public object Clone() + { + return new XLWorkbookProtection(this.Algorithm, this.AllowedElements) + { + IsProtected = this.IsProtected, + PasswordHash = this.PasswordHash, + SpinCount = this.SpinCount, + Base64EncodedSalt = this.Base64EncodedSalt + }; + } + + public IXLWorkbookProtection CopyFrom(IXLElementProtection workbookProtection) + { + if (workbookProtection is XLWorkbookProtection xlWorkbookProtection) + { + this.IsProtected = xlWorkbookProtection.IsProtected; + this.Algorithm = xlWorkbookProtection.Algorithm; + this.PasswordHash = xlWorkbookProtection.PasswordHash; + this.SpinCount = xlWorkbookProtection.SpinCount; + this.Base64EncodedSalt = xlWorkbookProtection.Base64EncodedSalt; + this.AllowedElements = xlWorkbookProtection.AllowedElements; + } + return this; + } + + public IXLWorkbookProtection DisallowElement(XLWorkbookProtectionElements element) + { + return AllowElement(element, allowed: false); + } + + public IXLWorkbookProtection Protect() + { + return Protect(String.Empty); + } + + public IXLWorkbookProtection Protect(String password, Algorithm algorithm = DefaultProtectionAlgorithm, XLWorkbookProtectionElements allowedElements = XLWorkbookProtectionElements.Windows) + { + if (IsProtected) + { + throw new InvalidOperationException("The workbook structure is already protected"); + } + else + { + IsProtected = true; + + password = password ?? ""; + + this.Algorithm = algorithm; + this.Base64EncodedSalt = Utils.CryptographicAlgorithms.GenerateNewSalt(this.Algorithm); + this.PasswordHash = Utils.CryptographicAlgorithms.GetPasswordHash(this.Algorithm, password, this.Base64EncodedSalt, this.SpinCount); + } + + this.AllowedElements = allowedElements; + + return this; + } + + public IXLWorkbookProtection Unprotect() + { + return Unprotect(String.Empty); + } + + public IXLWorkbookProtection Unprotect(String password) + { + if (IsProtected) + { + password = password ?? ""; + + if ("" != PasswordHash && "" == password) + throw new InvalidOperationException("The workbook structure is password protected"); + + var hash = Utils.CryptographicAlgorithms.GetPasswordHash(this.Algorithm, password, this.Base64EncodedSalt, this.SpinCount); + if (hash != PasswordHash) + throw new ArgumentException("Invalid password"); + else + { + IsProtected = false; + PasswordHash = String.Empty; + this.Base64EncodedSalt = String.Empty; + } + } + + return this; + } + + #region IXLProtectable interface + + IXLElementProtection IXLElementProtection.AllowElement(XLWorkbookProtectionElements element, Boolean allowed) => AllowElement(element, allowed); + + IXLElementProtection IXLElementProtection.AllowEverything() => AllowEverything(); + + IXLElementProtection IXLElementProtection.AllowNone() => AllowNone(); + + IXLElementProtection IXLElementProtection.DisallowElement(XLWorkbookProtectionElements element) => DisallowElement(element); + + IXLElementProtection IXLElementProtection.Protect() => Protect(); + + IXLElementProtection IXLElementProtection.Protect(String password, Algorithm algorithm) => Protect(password, algorithm); + + IXLElementProtection IXLElementProtection.Unprotect() => Unprotect(); + + IXLElementProtection IXLElementProtection.Unprotect(String password) => Unprotect(password); + + IXLElementProtection IXLElementProtection.CopyFrom(IXLElementProtection protectable) => CopyFrom(protectable); + + #endregion IXLProtectable interface + } +} diff --git a/ClosedXML/Excel/Protection/XLWorkbookProtectionElements.cs b/ClosedXML/Excel/Protection/XLWorkbookProtectionElements.cs new file mode 100644 index 0000000..7995720 --- /dev/null +++ b/ClosedXML/Excel/Protection/XLWorkbookProtectionElements.cs @@ -0,0 +1,18 @@ +using System; + +namespace ClosedXML.Excel +{ + [Flags] + public enum XLWorkbookProtectionElements + { + None = 0, + Structure = 1 << 0, + + /// + /// The Windows option is available only in Excel 2007, Excel 2010, Excel for Mac 2011, and Excel 2016 for Mac. Select the Windows option if you want to prevent users from moving, resizing, or closing the workbook window, or hide/unhide windows. + /// + Windows = 1 << 1, + + Everything = Structure | Windows + } +} diff --git a/ClosedXML/Excel/Ranges/IXLAddressable.cs b/ClosedXML/Excel/Ranges/IXLAddressable.cs new file mode 100644 index 0000000..b2921b4 --- /dev/null +++ b/ClosedXML/Excel/Ranges/IXLAddressable.cs @@ -0,0 +1,15 @@ +namespace ClosedXML.Excel +{ + /// + /// A very lightweight interface for entities that have an address as + /// a rectangular range. + /// + public interface IXLAddressable + { + /// + /// Gets an object with the boundaries of this range. + /// + + IXLRangeAddress RangeAddress { get; } + } +} diff --git a/ClosedXML/Excel/Ranges/IXLBaseCollection.cs b/ClosedXML/Excel/Ranges/IXLBaseCollection.cs new file mode 100644 index 0000000..d4d6c83 --- /dev/null +++ b/ClosedXML/Excel/Ranges/IXLBaseCollection.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLBaseCollection : IEnumerable + { + Int32 Count { get; } + + IXLStyle Style { get; set; } + + IXLDataValidation SetDataValidation(); + + /// + /// Creates a named range out of these ranges. + /// If the named range exists, it will add these ranges to that named range. + /// The default scope for the named range is Workbook. + /// + /// Name of the range. + TMultiple AddToNamed(String rangeName); + + /// + /// Creates a named range out of these ranges. + /// If the named range exists, it will add these ranges to that named range. + /// Name of the range. + /// The scope for the named range. + /// + TMultiple AddToNamed(String rangeName, XLScope scope); + + /// + /// Creates a named range out of these ranges. + /// If the named range exists, it will add these ranges to that named range. + /// Name of the range. + /// The scope for the named range. + /// The comments for the named range. + /// + TMultiple AddToNamed(String rangeName, XLScope scope, String comment); + + /// + /// Sets the cells' value. + /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from each cell. + /// If the object is a range ClosedXML will copy the range starting from each cell. + /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. + /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. + /// + /// + /// The object containing the value(s) to set. + /// + Object Value { set; } + + TMultiple SetValue(T value); + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + /// + /// Returns the collection of cells that have a value. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + IXLCells CellsUsed(Boolean includeFormats); + + TMultiple SetDataType(XLDataType dataType); + + /// + /// Clears the contents of these ranges. + /// + /// Specify what you want to clear. + TMultiple Clear(XLClearOptions clearOptions = XLClearOptions.All); + } +} diff --git a/ClosedXML/Excel/Ranges/IXLRange.cs b/ClosedXML/Excel/Ranges/IXLRange.cs new file mode 100644 index 0000000..527a8ce --- /dev/null +++ b/ClosedXML/Excel/Ranges/IXLRange.cs @@ -0,0 +1,313 @@ +using System; + +namespace ClosedXML.Excel +{ + public enum XLShiftDeletedCells { ShiftCellsUp, ShiftCellsLeft } + + public enum XLTransposeOptions { MoveCells, ReplaceCells } + + public enum XLSearchContents { Values, Formulas, ValuesAndFormulas } + + public interface IXLRange : IXLRangeBase + { + /// + /// Gets the cell at the specified row and column. + /// The cell address is relative to the parent range. + /// + /// The cell's row. + /// The cell's column. + IXLCell Cell(int row, int column); + + /// Gets the cell at the specified address. + /// The cell address is relative to the parent range. + /// The cell address in the parent range. + IXLCell Cell(string cellAddressInRange); + + /// + /// Gets the cell at the specified row and column. + /// The cell address is relative to the parent range. + /// + /// The cell's row. + /// The cell's column. + IXLCell Cell(int row, string column); + + /// Gets the cell at the specified address. + /// The cell address is relative to the parent range. + /// The cell address in the parent range. + IXLCell Cell(IXLAddress cellAddressInRange); + + /// + /// Gets the specified column of the range. + /// + /// 1-based column number relative to the first column of this range. + /// The relevant column + IXLRangeColumn Column(int columnNumber); + + /// + /// Gets the specified column of the range. + /// + /// Column letter. + IXLRangeColumn Column(string columnLetter); + + /// + /// Gets the first column of the range. + /// + IXLRangeColumn FirstColumn(Func predicate = null); + + /// + /// Gets the first column of the range that contains a cell with a value. + /// + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRangeColumn FirstColumnUsed(Boolean includeFormats, Func predicate = null); + + IXLRangeColumn FirstColumnUsed(XLCellsUsedOptions options, Func predicate = null); + + IXLRangeColumn FirstColumnUsed(Func predicate = null); + + /// + /// Gets the last column of the range. + /// + IXLRangeColumn LastColumn(Func predicate = null); + + /// + /// Gets the last column of the range that contains a cell with a value. + /// + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRangeColumn LastColumnUsed(Boolean includeFormats, Func predicate = null); + + IXLRangeColumn LastColumnUsed(XLCellsUsedOptions options, Func predicate = null); + + IXLRangeColumn LastColumnUsed(Func predicate = null); + + /// + /// Gets a collection of all columns in this range. + /// + IXLRangeColumns Columns(Func predicate = null); + + /// + /// Gets a collection of the specified columns in this range. + /// + /// The first column to return. 1-based column number relative to the first column of this range. + /// The last column to return. 1-based column number relative to the first column of this range. + IXLRangeColumns Columns(int firstColumn, int lastColumn); + + /// + /// Gets a collection of the specified columns in this range. + /// + /// The first column to return. + /// The last column to return. + /// The relevant columns + IXLRangeColumns Columns(string firstColumn, string lastColumn); + + /// + /// Gets a collection of the specified columns in this range, separated by commas. + /// e.g. Columns("G:H"), Columns("10:11,13:14"), Columns("P:Q,S:T"), Columns("V") + /// + /// The columns to return. + IXLRangeColumns Columns(string columns); + + /// + /// Returns the first row that matches the given predicate + /// + IXLRangeColumn FindColumn(Func predicate); + + /// + /// Returns the first row that matches the given predicate + /// + IXLRangeRow FindRow(Func predicate); + + /// + /// Gets the first row of the range. + /// + IXLRangeRow FirstRow(Func predicate = null); + + /// + /// Gets the first row of the range that contains a cell with a value. + /// + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRangeRow FirstRowUsed(Boolean includeFormats, Func predicate = null); + + IXLRangeRow FirstRowUsed(XLCellsUsedOptions options, Func predicate = null); + + IXLRangeRow FirstRowUsed(Func predicate = null); + + /// + /// Gets the last row of the range. + /// + IXLRangeRow LastRow(Func predicate = null); + + /// + /// Gets the last row of the range that contains a cell with a value. + /// + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRangeRow LastRowUsed(Boolean includeFormats, Func predicate = null); + + IXLRangeRow LastRowUsed(XLCellsUsedOptions options, Func predicate = null); + + IXLRangeRow LastRowUsed(Func predicate = null); + + /// + /// Gets the specified row of the range. + /// + /// 1-based row number relative to the first row of this range. + /// The relevant row + IXLRangeRow Row(int row); + + IXLRangeRows Rows(Func predicate = null); + + /// + /// Gets a collection of the specified rows in this range. + /// + /// The first row to return. 1-based row number relative to the first row of this range. + /// The last row to return. 1-based row number relative to the first row of this range. + /// + IXLRangeRows Rows(int firstRow, int lastRow); + + /// + /// Gets a collection of the specified rows in this range, separated by commas. + /// e.g. Rows("4:5"), Rows("7:8,10:11"), Rows("13") + /// + /// The rows to return. + IXLRangeRows Rows(string rows); + + /// + /// Returns the specified range. + /// + /// The range boundaries. + IXLRange Range(IXLRangeAddress rangeAddress); + + /// Returns the specified range. + /// e.g. Range("A1"), Range("A1:C2") + /// The range boundaries. + IXLRange Range(string rangeAddress); + + /// Returns the specified range. + /// The first cell in the range. + /// The last cell in the range. + IXLRange Range(IXLCell firstCell, IXLCell lastCell); + + /// Returns the specified range. + /// The first cell address in the range. + /// The last cell address in the range. + IXLRange Range(string firstCellAddress, string lastCellAddress); + + /// Returns the specified range. + /// The first cell address in the range. + /// The last cell address in the range. + IXLRange Range(IXLAddress firstCellAddress, IXLAddress lastCellAddress); + + /// Returns a collection of ranges, separated by commas. + /// e.g. Ranges("A1"), Ranges("A1:C2"), Ranges("A1:B2,D1:D4") + /// The ranges to return. + IXLRanges Ranges(string ranges); + + /// Returns the specified range. + /// The first cell's row of the range to return. + /// The first cell's column of the range to return. + /// The last cell's row of the range to return. + /// The last cell's column of the range to return. + /// . + IXLRange Range(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn); + + /// Gets the number of rows in this range. + int RowCount(); + + /// Gets the number of columns in this range. + int ColumnCount(); + + /// + /// Inserts X number of columns to the right of this range. + /// All cells to the right of this range will be shifted X number of columns. + /// + /// Number of columns to insert. + IXLRangeColumns InsertColumnsAfter(int numberOfColumns); + + IXLRangeColumns InsertColumnsAfter(int numberOfColumns, Boolean expandRange); + + /// + /// Inserts X number of columns to the left of this range. + /// This range and all cells to the right of this range will be shifted X number of columns. + /// + /// Number of columns to insert. + IXLRangeColumns InsertColumnsBefore(int numberOfColumns); + + IXLRangeColumns InsertColumnsBefore(int numberOfColumns, Boolean expandRange); + + /// + /// Inserts X number of rows on top of this range. + /// This range and all cells below this range will be shifted X number of rows. + /// + /// Number of rows to insert. + IXLRangeRows InsertRowsAbove(int numberOfRows); + + IXLRangeRows InsertRowsAbove(int numberOfRows, Boolean expandRange); + + /// + /// Inserts X number of rows below this range. + /// All cells below this range will be shifted X number of rows. + /// + /// Number of rows to insert. + IXLRangeRows InsertRowsBelow(int numberOfRows); + + IXLRangeRows InsertRowsBelow(int numberOfRows, Boolean expandRange); + + /// + /// Deletes this range and shifts the surrounding cells accordingly. + /// + /// How to shift the surrounding cells. + void Delete(XLShiftDeletedCells shiftDeleteCells); + + /// + /// Transposes the contents and styles of all cells in this range. + /// + /// How to handle the surrounding cells when transposing the range. + void Transpose(XLTransposeOptions transposeOption); + + IXLTable AsTable(); + + IXLTable AsTable(String name); + + IXLTable CreateTable(); + + IXLTable CreateTable(String name); + + IXLRange RangeUsed(); + + IXLRange CopyTo(IXLCell target); + + IXLRange CopyTo(IXLRangeBase target); + + IXLSortElements SortRows { get; } + IXLSortElements SortColumns { get; } + + IXLRange Sort(); + + IXLRange Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + IXLRange Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + IXLRange SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + IXLRange SetDataType(XLDataType dataType); + + /// + /// Clears the contents of this range. + /// + /// Specify what you want to clear. + new IXLRange Clear(XLClearOptions clearOptions = XLClearOptions.All); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRangeRows RowsUsed(Boolean includeFormats, Func predicate = null); + + IXLRangeRows RowsUsed(XLCellsUsedOptions options, Func predicate = null); + + IXLRangeRows RowsUsed(Func predicate = null); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRangeColumns ColumnsUsed(Boolean includeFormats, Func predicate = null); + + IXLRangeColumns ColumnsUsed(XLCellsUsedOptions options, Func predicate = null); + + IXLRangeColumns ColumnsUsed(Func predicate = null); + } +} diff --git a/ClosedXML/Excel/Ranges/IXLRangeAddress.cs b/ClosedXML/Excel/Ranges/IXLRangeAddress.cs new file mode 100644 index 0000000..1dc6d50 --- /dev/null +++ b/ClosedXML/Excel/Ranges/IXLRangeAddress.cs @@ -0,0 +1,110 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + public interface IXLRangeAddress + { + /// + /// Gets the number of columns in the area covered by the range address. + /// + int ColumnSpan { get; } + + /// + /// Gets or sets the first address in the range. + /// + /// + /// The first address. + /// + IXLAddress FirstAddress { get; } + + /// + /// Gets or sets a value indicating whether this range is valid. + /// + /// + /// true if this instance is valid; otherwise, false. + /// + Boolean IsValid { get; } + + /// + /// Gets or sets the last address in the range. + /// + /// + /// The last address. + /// + IXLAddress LastAddress { get; } + + /// + /// Gets the number of cells in the area covered by the range address. + /// + int NumberOfCells { get; } + + /// + /// Gets the number of rows in the area covered by the range address. + /// + int RowSpan { get; } + + IXLWorksheet Worksheet { get; } + + /// Allocates the current range address in the internal range repository and returns it + IXLRange AsRange(); + + Boolean Contains(IXLAddress address); + + /// + /// Returns the intersection of this range address with another range address on the same worksheet. + /// + /// The other range address. + /// The intersection's range address + IXLRangeAddress Intersection(IXLRangeAddress otherRangeAddress); + + Boolean Intersects(IXLRangeAddress otherAddress); + + /// + /// Determines whether range address spans the entire column. + /// + /// + /// true if is entire column; otherwise, false. + /// + Boolean IsEntireColumn(); + + /// + /// Determines whether range address spans the entire row. + /// + /// + /// true if is entire row; otherwise, false. + /// + Boolean IsEntireRow(); + + /// + /// Determines whether the range address spans the entire worksheet. + /// + /// + /// true if is entire sheet; otherwise, false. + /// + Boolean IsEntireSheet(); + + /// + /// Returns a range address so that its offset from the target base address is equal to the offset of the current range address to the source base address. + /// For example, if the current range address is D4:E4, the source base address is A1:C3, then the relative address to the target base address B10:D13 is E14:F14 + /// + /// The source base range address. + /// The target base range address. + /// The relative range + IXLRangeAddress Relative(IXLRangeAddress sourceRangeAddress, IXLRangeAddress targetRangeAddress); + + String ToString(XLReferenceStyle referenceStyle); + + String ToString(XLReferenceStyle referenceStyle, Boolean includeSheet); + + String ToStringFixed(); + + String ToStringFixed(XLReferenceStyle referenceStyle); + + String ToStringFixed(XLReferenceStyle referenceStyle, Boolean includeSheet); + + String ToStringRelative(); + + String ToStringRelative(Boolean includeSheet); + } +} diff --git a/ClosedXML/Excel/Ranges/IXLRangeBase.cs b/ClosedXML/Excel/Ranges/IXLRangeBase.cs new file mode 100644 index 0000000..3af95e5 --- /dev/null +++ b/ClosedXML/Excel/Ranges/IXLRangeBase.cs @@ -0,0 +1,379 @@ +using System; +using System.Globalization; + +namespace ClosedXML.Excel +{ + public enum XLScope + { + Workbook, + Worksheet + } + + public interface IXLRangeBase : IXLAddressable + { + IXLWorksheet Worksheet { get; } + + /// + /// Sets a value to every cell in this range. + /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from each cell. + /// If the object is a range ClosedXML will copy the range starting from each cell. + /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. + /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. + /// + /// + /// The object containing the value(s) to set. + /// + Object Value { set; } + + /// + /// Sets the type of the cells' data. + /// Changing the data type will cause ClosedXML to covert the current value to the new data type. + /// An exception will be thrown if the current value cannot be converted to the new data type. + /// + /// + /// The type of the cell's data. + /// + /// + XLDataType DataType { set; } + + /// + /// Sets the cells' formula with A1 references. + /// + /// The formula with A1 references. + String FormulaA1 { set; } + + /// + /// Sets the cells' formula with R1C1 references. + /// + /// The formula with R1C1 references. + String FormulaR1C1 { set; } + + IXLStyle Style { get; set; } + + /// + /// Gets or sets a value indicating whether this cell's text should be shared or not. + /// + /// + /// If false the cell's text will not be shared and stored as an inline value. + /// + Boolean ShareString { set; } + + IXLHyperlinks Hyperlinks { get; } + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + IXLCells Cells(Boolean usedCellsOnly); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCells Cells(Boolean usedCellsOnly, Boolean includeFormats); + + IXLCells Cells(Boolean usedCellsOnly, XLCellsUsedOptions options); + + IXLCells Cells(String cells); + + IXLCells Cells(Func predicate); + + /// + /// Returns the collection of cells that have a value. Formats are ignored. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCells CellsUsed(Boolean includeFormats); + + IXLCells CellsUsed(XLCellsUsedOptions options); + + IXLCells CellsUsed(Func predicate); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCells CellsUsed(Boolean includeFormats, Func predicate); + + IXLCells CellsUsed(XLCellsUsedOptions options, Func predicate); + + /// + /// Searches the cells' contents for a given piece of text + /// + /// The search text. + /// The compare options. + /// if set to true search formulae instead of cell values. + /// + IXLCells Search(String searchText, CompareOptions compareOptions = CompareOptions.Ordinal, Boolean searchFormulae = false); + + /// + /// Returns the first cell of this range. + /// + IXLCell FirstCell(); + + /// + /// Returns the first cell with a value of this range. Formats are ignored. + /// The cell's address is going to be ([First Row with a value], [First Column with a value]) + /// + IXLCell FirstCellUsed(); + + /// + /// Returns the first cell with a value of this range. + /// + /// The cell's address is going to be ([First Row with a value], [First Column with a value]) + /// if set to true will return all cells with a value or a style different than the default. + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCell FirstCellUsed(Boolean includeFormats); + + IXLCell FirstCellUsed(XLCellsUsedOptions options); + + IXLCell FirstCellUsed(Func predicate); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCell FirstCellUsed(Boolean includeFormats, Func predicate); + + IXLCell FirstCellUsed(XLCellsUsedOptions options, Func predicate); + + /// + /// Returns the last cell of this range. + /// + IXLCell LastCell(); + + /// + /// Returns the last cell with a value of this range. Formats are ignored. + /// The cell's address is going to be ([Last Row with a value], [Last Column with a value]) + /// + IXLCell LastCellUsed(); + + /// + /// Returns the last cell with a value of this range. + /// + /// The cell's address is going to be ([Last Row with a value], [Last Column with a value]) + /// if set to true will return all cells with a value or a style different than the default. + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCell LastCellUsed(Boolean includeFormats); + + IXLCell LastCellUsed(XLCellsUsedOptions options); + + IXLCell LastCellUsed(Func predicate); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCell LastCellUsed(Boolean includeFormats, Func predicate); + + IXLCell LastCellUsed(XLCellsUsedOptions options, Func predicate); + + /// + /// Determines whether this range contains the specified range (completely). + /// For partial matches use the range.Intersects method. + /// + /// The range address. + /// + /// true if this range contains the specified range; otherwise, false. + /// + Boolean Contains(String rangeAddress); + + /// + /// Determines whether this range contains the specified range (completely). + /// For partial matches use the range.Intersects method. + /// + /// The range to match. + /// + /// true if this range contains the specified range; otherwise, false. + /// + Boolean Contains(IXLRangeBase range); + + Boolean Contains(IXLCell cell); + + /// + /// Determines whether this range intersects the specified range. + /// For whole matches use the range.Contains method. + /// + /// The range address. + /// + /// true if this range intersects the specified range; otherwise, false. + /// + Boolean Intersects(String rangeAddress); + + /// + /// Determines whether this range contains the specified range. + /// For whole matches use the range.Contains method. + /// + /// The range to match. + /// + /// true if this range intersects the specified range; otherwise, false. + /// + Boolean Intersects(IXLRangeBase range); + + /// + /// Unmerges this range. + /// + IXLRange Unmerge(); + + /// + /// Merges this range. + /// The contents and style of the merged cells will be equal to the first cell. + /// + IXLRange Merge(); + + IXLRange Merge(Boolean checkIntersect); + + /// + /// Creates a named range out of this range. + /// If the named range exists, it will add this range to that named range. + /// The default scope for the named range is Workbook. + /// + /// Name of the range. + IXLRange AddToNamed(String rangeName); + + /// + /// Creates a named range out of this range. + /// If the named range exists, it will add this range to that named range. + /// Name of the range. + /// The scope for the named range. + /// + IXLRange AddToNamed(String rangeName, XLScope scope); + + /// + /// Creates a named range out of this range. + /// If the named range exists, it will add this range to that named range. + /// Name of the range. + /// The scope for the named range. + /// The comments for the named range. + /// + IXLRange AddToNamed(String rangeName, XLScope scope, String comment); + + /// + /// Clears the contents of this range. + /// + /// Specify what you want to clear. + IXLRangeBase Clear(XLClearOptions clearOptions = XLClearOptions.All); + + /// + /// Deletes the cell comments from this range. + /// + void DeleteComments(); + + IXLRangeBase SetValue(T value); + + /// + /// Converts this object to a range. + /// + IXLRange AsRange(); + + Boolean IsMerged(); + + Boolean IsEmpty(); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + Boolean IsEmpty(Boolean includeFormats); + + Boolean IsEmpty(XLCellsUsedOptions options); + + /// + /// Determines whether range address spans the entire column. + /// + /// + /// true if is entire column; otherwise, false. + /// + Boolean IsEntireColumn(); + + /// + /// Determines whether range address spans the entire row. + /// + /// + /// true if is entire row; otherwise, false. + /// + + Boolean IsEntireRow(); + + /// + /// Determines whether the range address spans the entire worksheet. + /// + /// + /// true if is entire sheet; otherwise, false. + /// + Boolean IsEntireSheet(); + + IXLPivotTable CreatePivotTable(IXLCell targetCell, String name); + + //IXLChart CreateChart(Int32 firstRow, Int32 firstColumn, Int32 lastRow, Int32 lastColumn); + + IXLAutoFilter SetAutoFilter(); + + IXLAutoFilter SetAutoFilter(Boolean value); + + IXLDataValidation SetDataValidation(); + + IXLConditionalFormat AddConditionalFormat(); + + void Select(); + + /// + /// Grows this the current range by one cell to each side + /// + IXLRangeBase Grow(); + + /// + /// Grows this the current range by the specified number of cells to each side. + /// + /// The grow count. + /// + IXLRangeBase Grow(Int32 growCount); + + /// + /// Shrinks this current range by one cell. + /// + IXLRangeBase Shrink(); + + /// + /// Shrinks the current range by the specified number of cells from each side. + /// + /// The shrink count. + /// + IXLRangeBase Shrink(Int32 shrinkCount); + + /// + /// Returns the intersection of this range with another range on the same worksheet. + /// + /// The other range. + /// Predicate applied to this range's cells. + /// Predicate applied to the other range's cells. + /// The range address of the intersection + IXLRangeAddress Intersection(IXLRangeBase otherRange, Func thisRangePredicate = null, Func otherRangePredicate = null); + + /// + /// Returns the set of cells surrounding the current range. + /// + /// The predicate to apply on the resulting set of cells. + IXLCells SurroundingCells(Func predicate = null); + + /// + /// Calculates the union of two ranges on the same worksheet. + /// + /// The other range. + /// Predicate applied to this range's cells. + /// Predicate applied to the other range's cells. + /// + /// The union + /// + IXLCells Union(IXLRangeBase otherRange, Func thisRangePredicate = null, Func otherRangePredicate = null); + + /// + /// Returns all cells in the current range that are not in the other range. + /// + /// The other range. + /// Predicate applied to this range's cells. + /// Predicate applied to the other range's cells. + /// + IXLCells Difference(IXLRangeBase otherRange, Func thisRangePredicate = null, Func otherRangePredicate = null); + + /// + /// Returns a range so that its offset from the target base range is equal to the offset of the current range to the source base range. + /// For example, if the current range is D4:E4, the source base range is A1:C3, then the relative range to the target base range B10:D13 is E14:F14 + /// + /// The source base range. + /// The target base range. + /// The relative range + IXLRangeBase Relative(IXLRangeBase sourceBaseRange, IXLRangeBase targetBaseRange); + } +} diff --git a/ClosedXML/Excel/Ranges/IXLRangeColumn.cs b/ClosedXML/Excel/Ranges/IXLRangeColumn.cs new file mode 100644 index 0000000..48094b3 --- /dev/null +++ b/ClosedXML/Excel/Ranges/IXLRangeColumn.cs @@ -0,0 +1,129 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLRangeColumn : IXLRangeBase + { + /// + /// Gets the cell in the specified row. + /// + /// The cell's row. + IXLCell Cell(Int32 rowNumber); + + /// + /// Returns the specified group of cells, separated by commas. + /// e.g. Cells("1"), Cells("1:5"), Cells("1:2,4:5") + /// + /// The column cells to return. + new IXLCells Cells(String cellsInColumn); + + /// + /// Returns the specified group of cells. + /// + /// The first row in the group of cells to return. + /// The last row in the group of cells to return. + IXLCells Cells(Int32 firstRow, Int32 lastRow); + + /// + /// Inserts X number of columns to the right of this range. + /// All cells to the right of this range will be shifted X number of columns. + /// + /// Number of columns to insert. + IXLRangeColumns InsertColumnsAfter(int numberOfColumns); + + IXLRangeColumns InsertColumnsAfter(int numberOfColumns, Boolean expandRange); + + /// + /// Inserts X number of columns to the left of this range. + /// This range and all cells to the right of this range will be shifted X number of columns. + /// + /// Number of columns to insert. + IXLRangeColumns InsertColumnsBefore(int numberOfColumns); + + IXLRangeColumns InsertColumnsBefore(int numberOfColumns, Boolean expandRange); + + /// + /// Inserts X number of cells on top of this column. + /// This column and all cells below it will be shifted X number of rows. + /// + /// Number of cells to insert. + IXLCells InsertCellsAbove(int numberOfRows); + + IXLCells InsertCellsAbove(int numberOfRows, Boolean expandRange); + + /// + /// Inserts X number of cells below this range. + /// All cells below this column will be shifted X number of rows. + /// + /// Number of cells to insert. + IXLCells InsertCellsBelow(int numberOfRows); + + IXLCells InsertCellsBelow(int numberOfRows, Boolean expandRange); + + /// + /// Deletes this range and shifts the cells at the right. + /// + void Delete(); + + /// + /// Deletes this range and shifts the surrounding cells accordingly. + /// + /// How to shift the surrounding cells. + void Delete(XLShiftDeletedCells shiftDeleteCells); + + /// + /// Gets this column's number in the range + /// + Int32 ColumnNumber(); + + /// + /// Gets this column's letter in the range + /// + String ColumnLetter(); + + Int32 CellCount(); + + IXLRangeColumn CopyTo(IXLCell target); + + IXLRangeColumn CopyTo(IXLRangeBase target); + + IXLRangeColumn Sort(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + IXLRangeColumn Column(Int32 start, Int32 end); + + IXLRangeColumn Column(IXLCell start, IXLCell end); + + IXLRangeColumns Columns(String columns); + + IXLRangeColumn SetDataType(XLDataType dataType); + + IXLRangeColumn ColumnLeft(); + + IXLRangeColumn ColumnLeft(Int32 step); + + IXLRangeColumn ColumnRight(); + + IXLRangeColumn ColumnRight(Int32 step); + + IXLColumn WorksheetColumn(); + + IXLTable AsTable(); + + IXLTable AsTable(String name); + + IXLTable CreateTable(); + + IXLTable CreateTable(String name); + + /// + /// Clears the contents of this column. + /// + /// Specify what you want to clear. + new IXLRangeColumn Clear(XLClearOptions clearOptions = XLClearOptions.All); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRangeColumn ColumnUsed(Boolean includeFormats); + + IXLRangeColumn ColumnUsed(XLCellsUsedOptions options = XLCellsUsedOptions.AllContents); + } +} diff --git a/ClosedXML/Excel/Ranges/IXLRangeColumns.cs b/ClosedXML/Excel/Ranges/IXLRangeColumns.cs new file mode 100644 index 0000000..ad97118 --- /dev/null +++ b/ClosedXML/Excel/Ranges/IXLRangeColumns.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLRangeColumns : IEnumerable + { + /// + /// Adds a column range to this group. + /// + /// The column range to add. + void Add(IXLRangeColumn columRange); + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + /// + /// Returns the collection of cells that have a value. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCells CellsUsed(Boolean includeFormats); + + IXLCells CellsUsed(XLCellsUsedOptions options); + + /// + /// Deletes all columns and shifts the columns at the right of them accordingly. + /// + void Delete(); + + IXLStyle Style { get; set; } + + IXLRangeColumns SetDataType(XLDataType dataType); + + /// + /// Clears the contents of these columns. + /// + /// Specify what you want to clear. + IXLRangeColumns Clear(XLClearOptions clearOptions = XLClearOptions.All); + + void Select(); + } +} diff --git a/ClosedXML/Excel/Ranges/IXLRangeRow.cs b/ClosedXML/Excel/Ranges/IXLRangeRow.cs new file mode 100644 index 0000000..d709a88 --- /dev/null +++ b/ClosedXML/Excel/Ranges/IXLRangeRow.cs @@ -0,0 +1,131 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLRangeRow : IXLRangeBase + { + /// + /// Gets the cell in the specified column. + /// + /// The cell's column. + IXLCell Cell(Int32 columnNumber); + + /// + /// Gets the cell in the specified column. + /// + /// The cell's column. + IXLCell Cell(String columnLetter); + + /// + /// Returns the specified group of cells, separated by commas. + /// e.g. Cells("1"), Cells("1:5"), Cells("1:2,4:5") + /// + /// The row's cells to return. + new IXLCells Cells(String cellsInRow); + + /// + /// Returns the specified group of cells. + /// + /// The first column in the group of cells to return. + /// The last column in the group of cells to return. + IXLCells Cells(Int32 firstColumn, Int32 lastColumn); + + /// + /// Returns the specified group of cells. + /// + /// The first column in the group of cells to return. + /// The last column in the group of cells to return. + IXLCells Cells(String firstColumn, String lastColumn); + + /// + /// Inserts X number of cells to the right of this row. + /// All cells to the right of this row will be shifted X number of columns. + /// + /// Number of cells to insert. + IXLCells InsertCellsAfter(int numberOfColumns); + + IXLCells InsertCellsAfter(int numberOfColumns, Boolean expandRange); + + /// + /// Inserts X number of cells to the left of this row. + /// This row and all cells to the right of it will be shifted X number of columns. + /// + /// Number of cells to insert. + IXLCells InsertCellsBefore(int numberOfColumns); + + IXLCells InsertCellsBefore(int numberOfColumns, Boolean expandRange); + + /// + /// Inserts X number of rows on top of this row. + /// This row and all cells below it will be shifted X number of rows. + /// + /// Number of rows to insert. + IXLRangeRows InsertRowsAbove(int numberOfRows); + + IXLRangeRows InsertRowsAbove(int numberOfRows, Boolean expandRange); + + /// + /// Inserts X number of rows below this row. + /// All cells below this row will be shifted X number of rows. + /// + /// Number of rows to insert. + IXLRangeRows InsertRowsBelow(int numberOfRows); + + IXLRangeRows InsertRowsBelow(int numberOfRows, Boolean expandRange); + + /// + /// Deletes this range and shifts the cells below. + /// + void Delete(); + + /// + /// Deletes this range and shifts the surrounding cells accordingly. + /// + /// How to shift the surrounding cells. + void Delete(XLShiftDeletedCells shiftDeleteCells); + + /// + /// Gets this row's number in the range + /// + Int32 RowNumber(); + + Int32 CellCount(); + + IXLRangeRow CopyTo(IXLCell target); + + IXLRangeRow CopyTo(IXLRangeBase target); + + IXLRangeRow Sort(); + + IXLRangeRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + IXLRangeRow Row(Int32 start, Int32 end); + + IXLRangeRow Row(IXLCell start, IXLCell end); + + IXLRangeRows Rows(String rows); + + IXLRangeRow SetDataType(XLDataType dataType); + + IXLRangeRow RowAbove(); + + IXLRangeRow RowAbove(Int32 step); + + IXLRangeRow RowBelow(); + + IXLRangeRow RowBelow(Int32 step); + + IXLRow WorksheetRow(); + + /// + /// Clears the contents of this row. + /// + /// Specify what you want to clear. + new IXLRangeRow Clear(XLClearOptions clearOptions = XLClearOptions.All); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRangeRow RowUsed(Boolean includeFormats); + + IXLRangeRow RowUsed(XLCellsUsedOptions options = XLCellsUsedOptions.AllContents); + } +} diff --git a/ClosedXML/Excel/Ranges/IXLRangeRows.cs b/ClosedXML/Excel/Ranges/IXLRangeRows.cs new file mode 100644 index 0000000..280fc8d --- /dev/null +++ b/ClosedXML/Excel/Ranges/IXLRangeRows.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLRangeRows : IEnumerable + { + /// + /// Adds a row range to this group. + /// + /// The row range to add. + void Add(IXLRangeRow rowRange); + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + /// + /// Returns the collection of cells that have a value. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCells CellsUsed(Boolean includeFormats); + + IXLCells CellsUsed(XLCellsUsedOptions options); + + /// + /// Deletes all rows and shifts the rows below them accordingly. + /// + void Delete(); + + IXLStyle Style { get; set; } + + IXLRangeRows SetDataType(XLDataType dataType); + + /// + /// Clears the contents of these rows. + /// + /// Specify what you want to clear. + IXLRangeRows Clear(XLClearOptions clearOptions = XLClearOptions.All); + + void Select(); + } +} diff --git a/ClosedXML/Excel/Ranges/IXLRanges.cs b/ClosedXML/Excel/Ranges/IXLRanges.cs new file mode 100644 index 0000000..16dfa72 --- /dev/null +++ b/ClosedXML/Excel/Ranges/IXLRanges.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLRanges : IEnumerable + { + /// + /// Adds the specified range to this group. + /// + /// The range to add to this group. + void Add(IXLRangeBase range); + + void Add(IXLCell range); + + /// + /// Removes the specified range from this group. + /// + /// The range to remove from this group. + bool Remove(IXLRange range); + + /// + /// Removes ranges matching the criteria from the collection, optionally releasing their event handlers. + /// + /// Criteria to filter ranges. Only those ranges that satisfy the criteria will be removed. + /// Null means the entire collection should be cleared. + /// Specify whether or not should removed ranges be unsubscribed from + /// row/column shifting events. Until ranges are unsubscribed they cannot be collected by GC. + void RemoveAll(Predicate match = null, bool releaseEventHandlers = true); + + Int32 Count { get; } + + Boolean Contains(IXLRange range); + + /// + /// Filter ranges from a collection that intersect the specified address. Is much more efficient + /// that using Linq expression .Where(). + /// + IEnumerable GetIntersectedRanges(IXLRangeAddress rangeAddress); + + /// + /// Filter ranges from a collection that intersect the specified address. Is much more efficient + /// that using Linq expression .Where(). + /// + IEnumerable GetIntersectedRanges(IXLAddress address); + + /// + /// Filter ranges from a collection that intersect the specified cell. Is much more efficient + /// that using Linq expression .Where(). + /// + IEnumerable GetIntersectedRanges(IXLCell cell); + + + IXLStyle Style { get; set; } + + IXLDataValidation SetDataValidation(); + + /// + /// Creates a named range out of these ranges. + /// If the named range exists, it will add these ranges to that named range. + /// The default scope for the named range is Workbook. + /// + /// Name of the range. + IXLRanges AddToNamed(String rangeName); + + /// + /// Creates a named range out of these ranges. + /// If the named range exists, it will add these ranges to that named range. + /// Name of the range. + /// The scope for the named range. + /// + IXLRanges AddToNamed(String rangeName, XLScope scope); + + /// + /// Creates a named range out of these ranges. + /// If the named range exists, it will add these ranges to that named range. + /// Name of the range. + /// The scope for the named range. + /// The comments for the named range. + /// + IXLRanges AddToNamed(String rangeName, XLScope scope, String comment); + + /// + /// Sets the cells' value. + /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from each cell. + /// If the object is a range ClosedXML will copy the range starting from each cell. + /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. + /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. + /// + /// + /// The object containing the value(s) to set. + /// + Object Value { set; } + + IXLRanges SetValue(T value); + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + /// + /// Returns the collection of cells that have a value. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCells CellsUsed(Boolean includeFormats); + + IXLCells CellsUsed(XLCellsUsedOptions options); + + IXLRanges SetDataType(XLDataType dataType); + + /// + /// Clears the contents of these ranges. + /// + /// Specify what you want to clear. + IXLRanges Clear(XLClearOptions clearOptions = XLClearOptions.All); + + /// + /// Create a new collection of ranges which are consolidated version of source ranges. + /// + IXLRanges Consolidate(); + + void Select(); + } +} diff --git a/ClosedXML/Excel/Ranges/Index/IXLRangeIndex.cs b/ClosedXML/Excel/Ranges/Index/IXLRangeIndex.cs new file mode 100644 index 0000000..ecc0e88 --- /dev/null +++ b/ClosedXML/Excel/Ranges/Index/IXLRangeIndex.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel.Ranges.Index +{ + /// + /// Interface for the engine aimed to speed-up the search for the range intersections. + /// + internal interface IXLRangeIndex + { + bool Add(IXLAddressable range); + + bool Remove(IXLRangeAddress rangeAddress); + + int RemoveAll(Predicate predicate = null); + + IEnumerable GetIntersectedRanges(XLRangeAddress rangeAddress); + + IEnumerable GetIntersectedRanges(XLAddress address); + + IEnumerable GetAll(); + + bool Intersects(in XLRangeAddress rangeAddress); + + bool Contains(in XLAddress address); + + bool MatchesType(XLRangeType rangeType); + } + + internal interface IXLRangeIndex : IXLRangeIndex + where T : IXLAddressable + { + bool Add(T range); + + int RemoveAll(Predicate predicate = null); + + new IEnumerable GetIntersectedRanges(XLRangeAddress rangeAddress); + + new IEnumerable GetIntersectedRanges(XLAddress address); + + new IEnumerable GetAll(); + } +} diff --git a/ClosedXML/Excel/Ranges/Index/XLRangeIndex.cs b/ClosedXML/Excel/Ranges/Index/XLRangeIndex.cs new file mode 100644 index 0000000..fd92068 --- /dev/null +++ b/ClosedXML/Excel/Ranges/Index/XLRangeIndex.cs @@ -0,0 +1,271 @@ +using ClosedXML.Excel.Patterns; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel.Ranges.Index +{ + /// + /// Implementation of internally using QuadTree. + /// + internal abstract class XLRangeIndex : IXLRangeIndex + { + #region Public Constructors + + public XLRangeIndex(IXLWorksheet worksheet) + { + _worksheet = worksheet; + _rangeList = new List(); + (_worksheet as XLWorksheet).RegisterRangeIndex(this); + } + + #endregion Public Constructors + + #region Public Methods + + public abstract bool MatchesType(XLRangeType rangeType); + + public bool Add(IXLAddressable range) + { + if (range == null) + throw new ArgumentNullException(nameof(range)); + + if (!range.RangeAddress.IsValid) + throw new ArgumentException("Range is invalid"); + + CheckWorksheet(range.RangeAddress.Worksheet); + + _count++; + if (_count < MinimumCountForIndexing) + { + if (_rangeList.Any(r => r == range)) + return false; + + _rangeList.Add(range); + return true; + } + + if (_quadTree == null) + InitializeTree(); + + return _quadTree.Add(range); + } + + public bool Contains(in XLAddress address) + { + CheckWorksheet(address.Worksheet); + + if (_quadTree == null) + { + var addr = address; + return _rangeList.Any(r => r.RangeAddress.Contains(addr)); + } + + return _quadTree.GetIntersectedRanges(address).Any(); + } + + public IEnumerable GetAll() + { + if (_quadTree == null) + { + return _rangeList.AsEnumerable(); + } + + return _quadTree.GetAll(); + } + + public IEnumerable GetIntersectedRanges(XLRangeAddress rangeAddress) + { + CheckWorksheet(rangeAddress.Worksheet); + + if (_quadTree == null) + { + return _rangeList.Where(r => r.RangeAddress.Intersects(rangeAddress)); + } + + return _quadTree.GetIntersectedRanges(rangeAddress); + } + + public IEnumerable GetIntersectedRanges(XLAddress address) + { + CheckWorksheet(address.Worksheet); + + if (_quadTree == null) + { + return _rangeList.Where(r => r.RangeAddress.Contains(address)); + } + + return _quadTree.GetIntersectedRanges(address); + } + + public bool Intersects(in XLRangeAddress rangeAddress) + { + CheckWorksheet(rangeAddress.Worksheet); + + if (_quadTree == null) + { + var addr = rangeAddress; + return _rangeList.Any(r => r.RangeAddress.Intersects(addr)); + } + + return _quadTree.GetIntersectedRanges(rangeAddress).Any(); + } + + public bool Remove(IXLRangeAddress rangeAddress) + { + if (rangeAddress == null) + throw new ArgumentNullException(nameof(rangeAddress)); + + CheckWorksheet(rangeAddress.Worksheet); + + if (_quadTree == null) + { + return _rangeList.RemoveAll(r => Equals(r.RangeAddress, rangeAddress)) > 0; + } + + return _quadTree.Remove(rangeAddress); + } + + public int RemoveAll(Predicate predicate = null) + { + predicate = predicate ?? (_ => true); + + if (_quadTree == null) + { + return _rangeList.RemoveAll(predicate); + } + + return _quadTree.RemoveAll(predicate).Count(); + } + + #endregion Public Methods + + #region Private Fields + + /// + /// The minimum number of ranges to be included into a QuadTree. Until it is reached the ranges + /// are added into a simple list to minimize the overhead of searching intersections on small collections. + /// + private const int MinimumCountForIndexing = 20; + + /// + /// A collection of ranges used before the QuadTree is initialized (until + /// is reached. + /// + protected readonly List _rangeList; + + private readonly IXLWorksheet _worksheet; + private int _count = 0; + protected Quadrant _quadTree; + + #endregion Private Fields + + #region Private Methods + + private void CheckWorksheet(IXLWorksheet worksheet) + { + if (worksheet != _worksheet) + throw new ArgumentException("Range belongs to a different worksheet"); + } + + private void InitializeTree() + { + _quadTree = CreateQuadTree(); + _rangeList.ForEach(r => _quadTree.Add(r)); + _rangeList.Clear(); + } + + protected virtual Quadrant CreateQuadTree() + { + return new Quadrant(); + } + + #endregion Private Methods + } + + /// + /// Generic version of . + /// + internal class XLRangeIndex : XLRangeIndex, IXLRangeIndex + where T : IXLAddressable + { + public XLRangeIndex(IXLWorksheet worksheet) : base(worksheet) + { + } + + public bool Add(T range) + { + return base.Add(range); + } + + public int RemoveAll(Predicate predicate) + { + predicate = predicate ?? (_ => true); + + return base.RemoveAll(r => predicate((T)r)); + } + + public new IEnumerable GetIntersectedRanges(XLRangeAddress rangeAddress) + { + return base.GetIntersectedRanges(rangeAddress).Cast(); + } + + public new IEnumerable GetIntersectedRanges(XLAddress address) + { + return base.GetIntersectedRanges(address).Cast(); + } + + public override bool MatchesType(XLRangeType rangeType) + { + var innerType = typeof(T); + + if (innerType == typeof(IXLRangeBase) || + innerType == typeof(XLRangeBase)) + return true; + + switch (rangeType) + { + case XLRangeType.Range: + return innerType == typeof(IXLRange) || + innerType == typeof(XLRange); + + case XLRangeType.Column: + return innerType == typeof(IXLColumn) || + innerType == typeof(XLColumn); + + case XLRangeType.Row: + return innerType == typeof(IXLRow) || + innerType == typeof(XLRow); + + case XLRangeType.RangeColumn: + return innerType == typeof(IXLRangeColumn) || + innerType == typeof(XLRangeColumn); + + case XLRangeType.RangeRow: + return innerType == typeof(IXLRangeRow) || + innerType == typeof(XLRangeRow); + + case XLRangeType.Table: + return innerType == typeof(IXLTable) || + innerType == typeof(XLTable); + + case XLRangeType.Worksheet: + return innerType == typeof(IXLWorksheet) || + innerType == typeof(XLWorksheet); + + default: + throw new NotImplementedException(nameof(rangeType)); + } + } + + public new IEnumerable GetAll() + { + return base.GetAll().Cast(); + } + + protected override Quadrant CreateQuadTree() + { + return new Quadrant(); + } + } +} diff --git a/ClosedXML/Excel/Ranges/Sort/IXLSortElement.cs b/ClosedXML/Excel/Ranges/Sort/IXLSortElement.cs new file mode 100644 index 0000000..e7ec5d9 --- /dev/null +++ b/ClosedXML/Excel/Ranges/Sort/IXLSortElement.cs @@ -0,0 +1,14 @@ +using System; + +namespace ClosedXML.Excel +{ + public enum XLSortOrder { Ascending, Descending } + public enum XLSortOrientation { TopToBottom, LeftToRight } + public interface IXLSortElement + { + Int32 ElementNumber { get; set; } + XLSortOrder SortOrder { get; set; } + Boolean IgnoreBlanks { get; set; } + Boolean MatchCase { get; set; } + } +} diff --git a/ClosedXML/Excel/Ranges/Sort/IXLSortElements.cs b/ClosedXML/Excel/Ranges/Sort/IXLSortElements.cs new file mode 100644 index 0000000..24f2fc9 --- /dev/null +++ b/ClosedXML/Excel/Ranges/Sort/IXLSortElements.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLSortElements: IEnumerable + { + void Add(Int32 elementNumber); + void Add(Int32 elementNumber, XLSortOrder sortOrder); + void Add(Int32 elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks); + void Add(Int32 elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks, Boolean matchCase); + + void Add(String elementNumber); + void Add(String elementNumber, XLSortOrder sortOrder); + void Add(String elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks); + void Add(String elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks, Boolean matchCase); + + void Clear(); + + void Remove(Int32 elementNumber); + } +} diff --git a/ClosedXML/Excel/Ranges/Sort/XLSortElement.cs b/ClosedXML/Excel/Ranges/Sort/XLSortElement.cs new file mode 100644 index 0000000..bb801d7 --- /dev/null +++ b/ClosedXML/Excel/Ranges/Sort/XLSortElement.cs @@ -0,0 +1,12 @@ +using System; + +namespace ClosedXML.Excel +{ + internal class XLSortElement: IXLSortElement + { + public Int32 ElementNumber { get; set; } + public XLSortOrder SortOrder { get; set; } + public Boolean IgnoreBlanks { get; set; } + public Boolean MatchCase { get; set; } + } +} diff --git a/ClosedXML/Excel/Ranges/Sort/XLSortElements.cs b/ClosedXML/Excel/Ranges/Sort/XLSortElements.cs new file mode 100644 index 0000000..7aa7c8b --- /dev/null +++ b/ClosedXML/Excel/Ranges/Sort/XLSortElements.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLSortElements: IXLSortElements + { + List elements = new List(); + public void Add(Int32 elementNumber) + { + Add(elementNumber, XLSortOrder.Ascending); + } + public void Add(Int32 elementNumber, XLSortOrder sortOrder) + { + Add(elementNumber, sortOrder, true); + } + public void Add(Int32 elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks) + { + Add(elementNumber, sortOrder, ignoreBlanks, false); + } + public void Add(Int32 elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks, Boolean matchCase) + { + elements.Add(new XLSortElement() + { + ElementNumber = elementNumber, + SortOrder = sortOrder, + IgnoreBlanks = ignoreBlanks, + MatchCase = matchCase + }); + } + + public void Add(String elementNumber) + { + Add(elementNumber, XLSortOrder.Ascending); + } + public void Add(String elementNumber, XLSortOrder sortOrder) + { + Add(elementNumber, sortOrder, true); + } + public void Add(String elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks) + { + Add(elementNumber, sortOrder, ignoreBlanks, false); + } + public void Add(String elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks, Boolean matchCase) + { + elements.Add(new XLSortElement() + { + ElementNumber = XLHelper.GetColumnNumberFromLetter(elementNumber), + SortOrder = sortOrder, + IgnoreBlanks = ignoreBlanks, + MatchCase = matchCase + }); + } + + public IEnumerator GetEnumerator() + { + return elements.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Clear() + { + elements.Clear(); + } + + public void Remove(Int32 elementNumber) + { + elements.RemoveAt(elementNumber - 1); + } + } +} diff --git a/ClosedXML/Excel/Ranges/XLRange.cs b/ClosedXML/Excel/Ranges/XLRange.cs new file mode 100644 index 0000000..57236ba --- /dev/null +++ b/ClosedXML/Excel/Ranges/XLRange.cs @@ -0,0 +1,958 @@ +using ClosedXML.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLRange : XLRangeBase, IXLRange + { + #region Constructor + + public XLRange(XLRangeParameters xlRangeParameters) + : base(xlRangeParameters.RangeAddress, (xlRangeParameters.DefaultStyle as XLStyle).Value) + { + } + + #endregion Constructor + + public override XLRangeType RangeType + { + get { return XLRangeType.Range; } + } + + #region IXLRange Members + + IXLRangeRow IXLRange.Row(Int32 row) + { + return Row(row); + } + + IXLRangeColumn IXLRange.Column(Int32 columnNumber) + { + return Column(columnNumber); + } + + IXLRangeColumn IXLRange.Column(String columnLetter) + { + return Column(columnLetter); + } + + public virtual IXLRangeColumns Columns(Func predicate = null) + { + var retVal = new XLRangeColumns(); + Int32 columnCount = ColumnCount(); + for (Int32 c = 1; c <= columnCount; c++) + { + var column = Column(c); + if (predicate == null || predicate(column)) + retVal.Add(column); + } + return retVal; + } + + public virtual IXLRangeColumns Columns(Int32 firstColumn, Int32 lastColumn) + { + var retVal = new XLRangeColumns(); + + for (int co = firstColumn; co <= lastColumn; co++) + retVal.Add(Column(co)); + return retVal; + } + + public virtual IXLRangeColumns Columns(String firstColumn, String lastColumn) + { + return Columns(XLHelper.GetColumnNumberFromLetter(firstColumn), + XLHelper.GetColumnNumberFromLetter(lastColumn)); + } + + public virtual IXLRangeColumns Columns(String columns) + { + var retVal = new XLRangeColumns(); + var columnPairs = columns.Split(','); + foreach (string tPair in columnPairs.Select(pair => pair.Trim())) + { + String firstColumn; + String lastColumn; + if (tPair.Contains(':') || tPair.Contains('-')) + { + string[] columnRange = XLHelper.SplitRange(tPair); + + firstColumn = columnRange[0]; + lastColumn = columnRange[1]; + } + else + { + firstColumn = tPair; + lastColumn = tPair; + } + + if (Int32.TryParse(firstColumn, out Int32 tmp)) + { + foreach (IXLRangeColumn col in Columns(Int32.Parse(firstColumn), Int32.Parse(lastColumn))) + retVal.Add(col); + } + else + { + foreach (IXLRangeColumn col in Columns(firstColumn, lastColumn)) + retVal.Add(col); + } + } + return retVal; + } + + IXLCell IXLRange.Cell(int row, int column) + { + return Cell(row, column); + } + + IXLCell IXLRange.Cell(string cellAddressInRange) + { + return Cell(cellAddressInRange); + } + + IXLCell IXLRange.Cell(int row, string column) + { + return Cell(row, column); + } + + IXLCell IXLRange.Cell(IXLAddress cellAddressInRange) + { + return Cell(cellAddressInRange); + } + + IXLRange IXLRange.Range(IXLRangeAddress rangeAddress) + { + return Range(rangeAddress); + } + + IXLRange IXLRange.Range(string rangeAddress) + { + return Range(rangeAddress); + } + + IXLRange IXLRange.Range(IXLCell firstCell, IXLCell lastCell) + { + return Range(firstCell, lastCell); + } + + IXLRange IXLRange.Range(string firstCellAddress, string lastCellAddress) + { + return Range(firstCellAddress, lastCellAddress); + } + + IXLRange IXLRange.Range(IXLAddress firstCellAddress, IXLAddress lastCellAddress) + { + return Range(firstCellAddress, lastCellAddress); + } + + IXLRange IXLRange.Range(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn) + { + return Range(firstCellRow, firstCellColumn, lastCellRow, lastCellColumn); + } + + public IXLRangeRows Rows(Func predicate = null) + { + var retVal = new XLRangeRows(); + Int32 rowCount = RowCount(); + for (Int32 r = 1; r <= rowCount; r++) + { + var row = Row(r); + if (predicate == null || predicate(row)) + retVal.Add(Row(r)); + } + return retVal; + } + + public IXLRangeRows Rows(Int32 firstRow, Int32 lastRow) + { + var retVal = new XLRangeRows(); + + for (int ro = firstRow; ro <= lastRow; ro++) + retVal.Add(Row(ro)); + return retVal; + } + + public IXLRangeRows Rows(String rows) + { + var retVal = new XLRangeRows(); + var rowPairs = rows.Split(','); + foreach (string tPair in rowPairs.Select(pair => pair.Trim())) + { + String firstRow; + String lastRow; + if (tPair.Contains(':') || tPair.Contains('-')) + { + string[] rowRange = XLHelper.SplitRange(tPair); + + firstRow = rowRange[0]; + lastRow = rowRange[1]; + } + else + { + firstRow = tPair; + lastRow = tPair; + } + foreach (IXLRangeRow row in Rows(Int32.Parse(firstRow), Int32.Parse(lastRow))) + retVal.Add(row); + } + return retVal; + } + + public void Transpose(XLTransposeOptions transposeOption) + { + int rowCount = RowCount(); + int columnCount = ColumnCount(); + int squareSide = rowCount > columnCount ? rowCount : columnCount; + + var firstCell = FirstCell(); + + MoveOrClearForTranspose(transposeOption, rowCount, columnCount); + TransposeMerged(squareSide); + TransposeRange(squareSide); + RangeAddress = new XLRangeAddress( + RangeAddress.FirstAddress, + new XLAddress(Worksheet, + firstCell.Address.RowNumber + columnCount - 1, + firstCell.Address.ColumnNumber + rowCount - 1, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn)); + + if (rowCount > columnCount) + { + var rng = Worksheet.Range( + RangeAddress.LastAddress.RowNumber + 1, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber + (rowCount - columnCount), + RangeAddress.LastAddress.ColumnNumber); + rng.Delete(XLShiftDeletedCells.ShiftCellsUp); + } + else if (columnCount > rowCount) + { + var rng = Worksheet.Range( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber + 1, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber + (columnCount - rowCount)); + rng.Delete(XLShiftDeletedCells.ShiftCellsLeft); + } + + foreach (IXLCell c in Range(1, 1, columnCount, rowCount).Cells()) + { + var border = (c.Style as XLStyle).Value.Border; + c.Style.Border.TopBorder = border.LeftBorder; + c.Style.Border.TopBorderColor = border.LeftBorderColor; + c.Style.Border.LeftBorder = border.TopBorder; + c.Style.Border.LeftBorderColor = border.TopBorderColor; + c.Style.Border.RightBorder = border.BottomBorder; + c.Style.Border.RightBorderColor = border.BottomBorderColor; + c.Style.Border.BottomBorder = border.RightBorder; + c.Style.Border.BottomBorderColor = border.RightBorderColor; + } + } + + public IXLTable AsTable() + { + return Worksheet.Table(this, false); + } + + public IXLTable AsTable(String name) + { + return Worksheet.Table(this, name, false); + } + + IXLTable IXLRange.CreateTable() + { + return CreateTable(); + } + + public XLTable CreateTable() + { + return (XLTable)Worksheet.Table(this, true, true); + } + + IXLTable IXLRange.CreateTable(String name) + { + return CreateTable(name); + } + + public XLTable CreateTable(String name) + { + return (XLTable)Worksheet.Table(this, name, true, true); + } + + public IXLTable CreateTable(String name, Boolean setAutofilter) + { + return Worksheet.Table(this, name, true, setAutofilter); + } + + public new IXLRange CopyTo(IXLCell target) + { + base.CopyTo(target); + + Int32 lastRowNumber = target.Address.RowNumber + RowCount() - 1; + if (lastRowNumber > XLHelper.MaxRowNumber) + lastRowNumber = XLHelper.MaxRowNumber; + Int32 lastColumnNumber = target.Address.ColumnNumber + ColumnCount() - 1; + if (lastColumnNumber > XLHelper.MaxColumnNumber) + lastColumnNumber = XLHelper.MaxColumnNumber; + + return target.Worksheet.Range(target.Address.RowNumber, + target.Address.ColumnNumber, + lastRowNumber, + lastColumnNumber); + } + + public new IXLRange CopyTo(IXLRangeBase target) + { + base.CopyTo(target); + + Int32 lastRowNumber = target.RangeAddress.FirstAddress.RowNumber + RowCount() - 1; + if (lastRowNumber > XLHelper.MaxRowNumber) + lastRowNumber = XLHelper.MaxRowNumber; + Int32 lastColumnNumber = target.RangeAddress.FirstAddress.ColumnNumber + ColumnCount() - 1; + if (lastColumnNumber > XLHelper.MaxColumnNumber) + lastColumnNumber = XLHelper.MaxColumnNumber; + + return target.Worksheet.Range(target.RangeAddress.FirstAddress.RowNumber, + target.RangeAddress.FirstAddress.ColumnNumber, + lastRowNumber, + lastColumnNumber); + } + + public IXLRange SetDataType(XLDataType dataType) + { + DataType = dataType; + return this; + } + + public new IXLRange Sort() + { + return base.Sort().AsRange(); + } + + public new IXLRange Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + return base.Sort(columnsToSortBy, sortOrder, matchCase, ignoreBlanks).AsRange(); + } + + public new IXLRange Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + return base.Sort(columnToSortBy, sortOrder, matchCase, ignoreBlanks).AsRange(); + } + + public new IXLRange SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + return base.SortLeftToRight(sortOrder, matchCase, ignoreBlanks).AsRange(); + } + + #endregion IXLRange Members + + internal override void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted) + { + RangeAddress = (XLRangeAddress)ShiftColumns(RangeAddress, range, columnsShifted); + } + + internal override void WorksheetRangeShiftedRows(XLRange range, int rowsShifted) + { + RangeAddress = (XLRangeAddress)ShiftRows(RangeAddress, range, rowsShifted); + } + + IXLRangeColumn IXLRange.FirstColumn(Func predicate) + { + return FirstColumn(predicate); + } + + internal XLRangeColumn FirstColumn(Func predicate = null) + { + if (predicate == null) + return Column(1); + + Int32 columnCount = ColumnCount(); + for (Int32 c = 1; c <= columnCount; c++) + { + var column = Column(c); + if (predicate(column)) return column; + } + + return null; + } + + IXLRangeColumn IXLRange.LastColumn(Func predicate) + { + return LastColumn(predicate); + } + + internal XLRangeColumn LastColumn(Func predicate = null) + { + Int32 columnCount = ColumnCount(); + if (predicate == null) + return Column(columnCount); + + for (Int32 c = columnCount; c >= 1; c--) + { + var column = Column(c); + if (predicate(column)) return column; + } + + return null; + } + + IXLRangeColumn IXLRange.FirstColumnUsed(Func predicate) + { + return FirstColumnUsed(XLCellsUsedOptions.AllContents, predicate); + } + + internal XLRangeColumn FirstColumnUsed(Func predicate = null) + { + return FirstColumnUsed(XLCellsUsedOptions.AllContents, predicate); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRangeColumn IXLRange.FirstColumnUsed(Boolean includeFormats, Func predicate) + { + return FirstColumnUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents, + predicate); + } + + IXLRangeColumn IXLRange.FirstColumnUsed(XLCellsUsedOptions options, Func predicate) + { + return FirstColumnUsed(options, predicate); + } + + internal XLRangeColumn FirstColumnUsed(XLCellsUsedOptions options, Func predicate = null) + { + if (predicate == null) + { + Int32 firstColumnUsed = Worksheet.Internals.CellsCollection.FirstColumnUsed( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber, + options); + + return firstColumnUsed == 0 ? null : Column(firstColumnUsed - RangeAddress.FirstAddress.ColumnNumber + 1); + } + + Int32 columnCount = ColumnCount(); + for (Int32 co = 1; co <= columnCount; co++) + { + var column = Column(co); + + if (!column.IsEmpty(options) && predicate(column)) + return column; + } + return null; + } + + IXLRangeColumn IXLRange.LastColumnUsed(Func predicate) + { + return LastColumnUsed(XLCellsUsedOptions.AllContents, predicate); + } + + internal XLRangeColumn LastColumnUsed(Func predicate = null) + { + return LastColumnUsed(XLCellsUsedOptions.AllContents, predicate); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRangeColumn IXLRange.LastColumnUsed(Boolean includeFormats, Func predicate) + { + return LastColumnUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents, + predicate); + } + + IXLRangeColumn IXLRange.LastColumnUsed(XLCellsUsedOptions options, Func predicate) + { + return LastColumnUsed(options, predicate); + } + + internal XLRangeColumn LastColumnUsed(XLCellsUsedOptions options, Func predicate = null) + { + if (predicate == null) + { + Int32 lastColumnUsed = Worksheet.Internals.CellsCollection.LastColumnUsed( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber, + options); + + return lastColumnUsed == 0 ? null : Column(lastColumnUsed - RangeAddress.FirstAddress.ColumnNumber + 1); + } + + Int32 columnCount = ColumnCount(); + for (Int32 co = columnCount; co >= 1; co--) + { + var column = Column(co); + + if (!column.IsEmpty(options) && predicate(column)) + return column; + } + return null; + } + + IXLRangeRow IXLRange.FirstRow(Func predicate) + { + return FirstRow(predicate); + } + + public XLRangeRow FirstRow(Func predicate = null) + { + if (predicate == null) + return Row(1); + + Int32 rowCount = RowCount(); + for (Int32 ro = 1; ro <= rowCount; ro++) + { + var row = Row(ro); + if (predicate(row)) return row; + } + + return null; + } + + IXLRangeRow IXLRange.LastRow(Func predicate) + { + return LastRow(predicate); + } + + public XLRangeRow LastRow(Func predicate = null) + { + Int32 rowCount = RowCount(); + if (predicate == null) + return Row(rowCount); + + for (Int32 ro = rowCount; ro >= 1; ro--) + { + var row = Row(ro); + if (predicate(row)) return row; + } + + return null; + } + + IXLRangeRow IXLRange.FirstRowUsed(Func predicate) + { + return FirstRowUsed(XLCellsUsedOptions.AllContents, predicate); + } + + internal XLRangeRow FirstRowUsed(Func predicate = null) + { + return FirstRowUsed(XLCellsUsedOptions.AllContents, predicate); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRangeRow IXLRange.FirstRowUsed(Boolean includeFormats, Func predicate) + { + return FirstRowUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents, predicate); + } + + IXLRangeRow IXLRange.FirstRowUsed(XLCellsUsedOptions options, Func predicate) + { + return FirstRowUsed(options, predicate); + } + + internal XLRangeRow FirstRowUsed(XLCellsUsedOptions options, Func predicate = null) + { + if (predicate == null) + { + Int32 rowFromCells = Worksheet.Internals.CellsCollection.FirstRowUsed( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber, + options); + + //Int32 rowFromRows = Worksheet.Internals.RowsCollection.FirstRowUsed(includeFormats); + + return rowFromCells == 0 ? null : Row(rowFromCells - RangeAddress.FirstAddress.RowNumber + 1); + } + + Int32 rowCount = RowCount(); + for (Int32 ro = 1; ro <= rowCount; ro++) + { + var row = Row(ro); + + if (!row.IsEmpty(options) && predicate(row)) + return row; + } + return null; + } + + IXLRangeRow IXLRange.LastRowUsed(Func predicate) + { + return LastRowUsed(XLCellsUsedOptions.AllContents, predicate); + } + + internal XLRangeRow LastRowUsed(Func predicate = null) + { + return LastRowUsed(XLCellsUsedOptions.AllContents, predicate); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRangeRow IXLRange.LastRowUsed(Boolean includeFormats, Func predicate) + { + return LastRowUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents, predicate); + } + + IXLRangeRow IXLRange.LastRowUsed(XLCellsUsedOptions options, Func predicate) + { + return LastRowUsed(options, predicate); + } + + internal XLRangeRow LastRowUsed(XLCellsUsedOptions options, Func predicate = null) + { + if (predicate == null) + { + Int32 lastRowUsed = Worksheet.Internals.CellsCollection.LastRowUsed( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber, + options); + + return lastRowUsed == 0 ? null : Row(lastRowUsed - RangeAddress.FirstAddress.RowNumber + 1); + } + + Int32 rowCount = RowCount(); + for (Int32 ro = rowCount; ro >= 1; ro--) + { + var row = Row(ro); + + if (!row.IsEmpty(options) && predicate(row)) + return row; + } + return null; + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRangeRows IXLRange.RowsUsed(Boolean includeFormats, Func predicate) + { + return RowsUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents, predicate); + } + + IXLRangeRows IXLRange.RowsUsed(XLCellsUsedOptions options, Func predicate) + { + return RowsUsed(options, predicate); + } + + internal XLRangeRows RowsUsed(XLCellsUsedOptions options, Func predicate = null) + { + XLRangeRows rows = new XLRangeRows(); + Int32 rowCount = RowCount(); + for (Int32 ro = 1; ro <= rowCount; ro++) + { + var row = Row(ro); + + if (!row.IsEmpty(options) && (predicate == null || predicate(row))) + rows.Add(row); + } + return rows; + } + + IXLRangeRows IXLRange.RowsUsed(Func predicate) + { + return RowsUsed(predicate); + } + + internal XLRangeRows RowsUsed(Func predicate = null) + { + return RowsUsed(XLCellsUsedOptions.AllContents, predicate); + } + + IXLRangeColumns IXLRange.ColumnsUsed(Boolean includeFormats, Func predicate) + { + return ColumnsUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents, predicate); + } + + IXLRangeColumns IXLRange.ColumnsUsed(XLCellsUsedOptions options, Func predicate) + { + return ColumnsUsed(options, predicate); + } + + internal virtual XLRangeColumns ColumnsUsed(XLCellsUsedOptions options, Func predicate = null) + { + XLRangeColumns columns = new XLRangeColumns(); + Int32 columnCount = ColumnCount(); + for (Int32 co = 1; co <= columnCount; co++) + { + var column = Column(co); + + if (!column.IsEmpty(options) && (predicate == null || predicate(column))) + columns.Add(column); + } + return columns; + } + + IXLRangeColumns IXLRange.ColumnsUsed(Func predicate) + { + return ColumnsUsed(predicate); + } + + internal virtual XLRangeColumns ColumnsUsed(Func predicate = null) + { + return ColumnsUsed(XLCellsUsedOptions.AllContents, predicate); + } + + public XLRangeRow Row(Int32 row) + { + if (row <= 0 || row > XLHelper.MaxRowNumber + RangeAddress.FirstAddress.RowNumber - 1) + throw new ArgumentOutOfRangeException(nameof(row), String.Format("Row number must be between 1 and {0}", XLHelper.MaxRowNumber + RangeAddress.FirstAddress.RowNumber - 1)); + + var firstCellAddress = new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber + row - 1, + RangeAddress.FirstAddress.ColumnNumber, + false, + false); + + var lastCellAddress = new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber + row - 1, + RangeAddress.LastAddress.ColumnNumber, + false, + false); + return Worksheet.RangeRow(new XLRangeAddress(firstCellAddress, lastCellAddress)); + } + + public virtual XLRangeColumn Column(Int32 columnNumber) + { + if (columnNumber <= 0 || columnNumber > XLHelper.MaxColumnNumber + RangeAddress.FirstAddress.ColumnNumber - 1) + throw new ArgumentOutOfRangeException(nameof(columnNumber), String.Format("Column number must be between 1 and {0}", XLHelper.MaxColumnNumber + RangeAddress.FirstAddress.ColumnNumber - 1)); + + var firstCellAddress = new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber + columnNumber - 1, + false, + false); + var lastCellAddress = new XLAddress(Worksheet, + RangeAddress.LastAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber + columnNumber - 1, + false, + false); + return Worksheet.RangeColumn(new XLRangeAddress(firstCellAddress, lastCellAddress)); + } + + public virtual XLRangeColumn Column(String columnLetter) + { + return Column(XLHelper.GetColumnNumberFromLetter(columnLetter)); + } + + internal IEnumerable Split(IXLRangeAddress anotherRange, bool includeIntersection) + { + if (!RangeAddress.Intersects(anotherRange)) + { + yield return this; + yield break; + } + + var thisRow1 = RangeAddress.FirstAddress.RowNumber; + var thisRow2 = RangeAddress.LastAddress.RowNumber; + var thisColumn1 = RangeAddress.FirstAddress.ColumnNumber; + var thisColumn2 = RangeAddress.LastAddress.ColumnNumber; + + var otherRow1 = Math.Min(Math.Max(thisRow1, anotherRange.FirstAddress.RowNumber), thisRow2 + 1); + var otherRow2 = Math.Max(Math.Min(thisRow2, anotherRange.LastAddress.RowNumber), thisRow1 - 1); + var otherColumn1 = Math.Min(Math.Max(thisColumn1, anotherRange.FirstAddress.ColumnNumber), thisColumn2 + 1); + var otherColumn2 = Math.Max(Math.Min(thisColumn2, anotherRange.LastAddress.ColumnNumber), thisColumn1 - 1); + + var candidates = new[] + { + // to the top of the intersection + new XLRangeAddress( + new XLAddress(thisRow1,thisColumn1, false, false), + new XLAddress(otherRow1 - 1, thisColumn2, false, false)), + + // to the left of the intersection + new XLRangeAddress( + new XLAddress(otherRow1,thisColumn1, false, false), + new XLAddress(otherRow2, otherColumn1 - 1, false, false)), + + includeIntersection + ? new XLRangeAddress( + new XLAddress(otherRow1, otherColumn1, false, false), + new XLAddress(otherRow2, otherColumn2, false, false)) + : XLRangeAddress.Invalid, + + // to the right of the intersection + new XLRangeAddress( + new XLAddress(otherRow1,otherColumn2 + 1, false, false), + new XLAddress(otherRow2, thisColumn2, false, false)), + + // to the bottom of the intersection + new XLRangeAddress( + new XLAddress(otherRow2 + 1,thisColumn1, false, false), + new XLAddress(thisRow2, thisColumn2, false, false)), + }; + + foreach (var rangeAddress in candidates.Where(c => c.IsValid && c.IsNormalized)) + { + yield return Worksheet.Range(rangeAddress); + } + } + + private void TransposeRange(int squareSide) + { + var cellsToInsert = new Dictionary(); + var cellsToDelete = new List(); + var rngToTranspose = Worksheet.Range( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.FirstAddress.RowNumber + squareSide - 1, + RangeAddress.FirstAddress.ColumnNumber + squareSide - 1); + + Int32 roCount = rngToTranspose.RowCount(); + Int32 coCount = rngToTranspose.ColumnCount(); + for (Int32 ro = 1; ro <= roCount; ro++) + { + for (Int32 co = 1; co <= coCount; co++) + { + var oldCell = rngToTranspose.Cell(ro, co); + var newKey = rngToTranspose.Cell(co, ro).Address; + // new XLAddress(Worksheet, c.Address.ColumnNumber, c.Address.RowNumber); + var newCell = new XLCell(Worksheet, newKey, oldCell.StyleValue); + newCell.CopyFrom(oldCell, XLCellCopyOptions.All); + cellsToInsert.Add(new XLSheetPoint(newKey.RowNumber, newKey.ColumnNumber), newCell); + cellsToDelete.Add(new XLSheetPoint(oldCell.Address.RowNumber, oldCell.Address.ColumnNumber)); + } + } + + cellsToDelete.ForEach(c => Worksheet.Internals.CellsCollection.Remove(c)); + cellsToInsert.ForEach(c => Worksheet.Internals.CellsCollection.Add(c.Key, c.Value)); + } + + private void TransposeMerged(Int32 squareSide) + { + var rngToTranspose = Worksheet.Range( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.FirstAddress.RowNumber + squareSide - 1, + RangeAddress.FirstAddress.ColumnNumber + squareSide - 1); + + foreach (var merge in Worksheet.Internals.MergedRanges.Where(Contains).Cast()) + { + merge.RangeAddress = new XLRangeAddress( + merge.RangeAddress.FirstAddress, + rngToTranspose.Cell(merge.ColumnCount(), merge.RowCount()).Address); + } + } + + private void MoveOrClearForTranspose(XLTransposeOptions transposeOption, int rowCount, int columnCount) + { + if (transposeOption == XLTransposeOptions.MoveCells) + { + if (rowCount > columnCount) + InsertColumnsAfter(false, rowCount - columnCount, false); + else if (columnCount > rowCount) + InsertRowsBelow(false, columnCount - rowCount, false); + } + else + { + if (rowCount > columnCount) + { + int toMove = rowCount - columnCount; + var rngToClear = Worksheet.Range( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber + 1, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber + toMove); + rngToClear.Clear(); + } + else if (columnCount > rowCount) + { + int toMove = columnCount - rowCount; + var rngToClear = Worksheet.Range( + RangeAddress.LastAddress.RowNumber + 1, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber + toMove, + RangeAddress.LastAddress.ColumnNumber); + rngToClear.Clear(); + } + } + } + + public override bool Equals(object obj) + { + var other = obj as XLRange; + if (other == null) + return false; + return RangeAddress.Equals(other.RangeAddress) + && Worksheet.Equals(other.Worksheet); + } + + public override int GetHashCode() + { + return RangeAddress.GetHashCode() + ^ Worksheet.GetHashCode(); + } + + public new IXLRange Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + base.Clear(clearOptions); + return this; + } + + public IXLRangeColumn FindColumn(Func predicate) + { + Int32 columnCount = ColumnCount(); + for (Int32 c = 1; c <= columnCount; c++) + { + var column = Column(c); + if (predicate == null || predicate(column)) + return column; + } + return null; + } + + public IXLRangeRow FindRow(Func predicate) + { + Int32 rowCount = RowCount(); + for (Int32 r = 1; r <= rowCount; r++) + { + var row = Row(r); + if (predicate(row)) + return row; + } + return null; + } + + public override string ToString() + { + if (IsEntireSheet()) + { + return Worksheet.Name; + } + else if (IsEntireRow()) + { + return String.Concat( + Worksheet.Name.EscapeSheetName(), + '!', + RangeAddress.FirstAddress.RowNumber, + ':', + RangeAddress.LastAddress.RowNumber); + } + else if (IsEntireColumn()) + { + return String.Concat( + Worksheet.Name.EscapeSheetName(), + '!', + RangeAddress.FirstAddress.ColumnLetter, + ':', + RangeAddress.LastAddress.ColumnLetter); + } + else + return base.ToString(); + } + } +} diff --git a/ClosedXML/Excel/Ranges/XLRangeAddress.cs b/ClosedXML/Excel/Ranges/XLRangeAddress.cs new file mode 100644 index 0000000..a6a6acd --- /dev/null +++ b/ClosedXML/Excel/Ranges/XLRangeAddress.cs @@ -0,0 +1,491 @@ +using ClosedXML.Extensions; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal struct XLRangeAddress : IXLRangeAddress, IEquatable + { + #region Static members + + public static XLRangeAddress EntireColumn(XLWorksheet worksheet, int column) + { + return new XLRangeAddress( + new XLAddress(worksheet, 1, column, false, false), + new XLAddress(worksheet, XLHelper.MaxRowNumber, column, false, false)); + } + + public static XLRangeAddress EntireRow(XLWorksheet worksheet, int row) + { + return new XLRangeAddress( + new XLAddress(worksheet, row, 1, false, false), + new XLAddress(worksheet, row, XLHelper.MaxColumnNumber, false, false)); + } + + public static readonly XLRangeAddress Invalid = new XLRangeAddress( + new XLAddress(-1, -1, fixedRow: true, fixedColumn: true), + new XLAddress(-1, -1, fixedRow: true, fixedColumn: true) + ); + + #endregion Static members + + #region Constructor + + public XLRangeAddress(XLAddress firstAddress, XLAddress lastAddress) : this() + { + Worksheet = firstAddress.Worksheet; + FirstAddress = firstAddress; + LastAddress = lastAddress; + } + + public XLRangeAddress(XLWorksheet worksheet, String rangeAddress) : this() + { + string addressToUse = rangeAddress.Contains("!") + ? rangeAddress.Substring(rangeAddress.IndexOf("!") + 1) + : rangeAddress; + + string firstPart; + string secondPart; + if (addressToUse.Contains(':')) + { + var arrRange = addressToUse.Split(':'); + firstPart = arrRange[0]; + secondPart = arrRange[1]; + } + else + { + firstPart = addressToUse; + secondPart = addressToUse; + } + + if (XLHelper.IsValidA1Address(firstPart)) + { + FirstAddress = XLAddress.Create(worksheet, firstPart); + LastAddress = XLAddress.Create(worksheet, secondPart); + } + else + { + firstPart = firstPart.Replace("$", String.Empty); + secondPart = secondPart.Replace("$", String.Empty); + if (char.IsDigit(firstPart[0])) + { + FirstAddress = XLAddress.Create(worksheet, "A" + firstPart); + LastAddress = XLAddress.Create(worksheet, XLHelper.MaxColumnLetter + secondPart); + } + else + { + FirstAddress = XLAddress.Create(worksheet, firstPart + "1"); + LastAddress = XLAddress.Create(worksheet, secondPart + XLHelper.MaxRowNumber.ToInvariantString()); + } + } + + Worksheet = worksheet; + } + + #endregion Constructor + + #region Public properties + + public XLWorksheet Worksheet { get; } + + public XLAddress FirstAddress { get; } + + public XLAddress LastAddress { get; } + + IXLWorksheet IXLRangeAddress.Worksheet + { + get { return Worksheet; } + } + + IXLAddress IXLRangeAddress.FirstAddress + { + [DebuggerStepThrough] + get { return FirstAddress; } + } + + IXLAddress IXLRangeAddress.LastAddress + { + [DebuggerStepThrough] + get { return LastAddress; } + } + + public bool IsValid => FirstAddress.IsValid && LastAddress.IsValid; + + public int ColumnSpan + { + get + { + if (!IsValid) + throw new InvalidOperationException("Range address is invalid."); + + return Math.Abs(LastAddress.ColumnNumber - FirstAddress.ColumnNumber) + 1; + } + } + + public int NumberOfCells => ColumnSpan * RowSpan; + + public int RowSpan + { + get + { + if (!IsValid) + throw new InvalidOperationException("Range address is invalid."); + + return Math.Abs(LastAddress.RowNumber - FirstAddress.RowNumber) + 1; + } + } + + private bool WorksheetIsDeleted => Worksheet?.IsDeleted == true; + + #endregion Public properties + + #region Public methods + + public Boolean IsNormalized => LastAddress.RowNumber >= FirstAddress.RowNumber + && LastAddress.ColumnNumber >= FirstAddress.ColumnNumber; + + /// + /// Lead a range address to a normal form - when points to the top-left address and + /// points to the bottom-right address. + /// + /// + public XLRangeAddress Normalize() + { + if (FirstAddress.RowNumber <= LastAddress.RowNumber && + FirstAddress.ColumnNumber <= LastAddress.ColumnNumber) + return this; + + int firstRow, firstColumn, lastRow, lastColumn; + bool firstRowFixed, firstColumnFixed, lastRowFixed, lastColumnFixed; + + if (FirstAddress.RowNumber <= LastAddress.RowNumber) + { + firstRow = FirstAddress.RowNumber; + firstRowFixed = FirstAddress.FixedRow; + lastRow = LastAddress.RowNumber; + lastRowFixed = LastAddress.FixedRow; + } + else + { + firstRow = LastAddress.RowNumber; + firstRowFixed = LastAddress.FixedRow; + lastRow = FirstAddress.RowNumber; + lastRowFixed = FirstAddress.FixedRow; + } + + if (FirstAddress.ColumnNumber <= LastAddress.ColumnNumber) + { + firstColumn = FirstAddress.ColumnNumber; + firstColumnFixed = FirstAddress.FixedColumn; + lastColumn = LastAddress.ColumnNumber; + lastColumnFixed = LastAddress.FixedColumn; + } + else + { + firstColumn = LastAddress.ColumnNumber; + firstColumnFixed = LastAddress.FixedColumn; + lastColumn = FirstAddress.ColumnNumber; + lastColumnFixed = FirstAddress.FixedColumn; + } + + return new XLRangeAddress( + new XLAddress(FirstAddress.Worksheet, firstRow, firstColumn, firstRowFixed, firstColumnFixed), + new XLAddress(LastAddress.Worksheet, lastRow, lastColumn, lastRowFixed, lastColumnFixed)); + } + + public bool Intersects(IXLRangeAddress otherAddress) + { + var xlOtherAddress = (XLRangeAddress)otherAddress; + return Intersects(in xlOtherAddress); + } + + internal bool Intersects(in XLRangeAddress otherAddress) + { + return !( // See if the two ranges intersect... + otherAddress.FirstAddress.ColumnNumber > LastAddress.ColumnNumber + || otherAddress.LastAddress.ColumnNumber < FirstAddress.ColumnNumber + || otherAddress.FirstAddress.RowNumber > LastAddress.RowNumber + || otherAddress.LastAddress.RowNumber < FirstAddress.RowNumber + ); + } + + public bool Contains(IXLAddress address) + { + var xlAddress = (XLAddress)address; + return Contains(in xlAddress); + } + + internal IXLRangeAddress WithoutWorksheet() + { + return new XLRangeAddress( + FirstAddress.WithoutWorksheet(), + LastAddress.WithoutWorksheet()); + } + + internal bool Contains(in XLAddress address) + { + return FirstAddress.RowNumber <= address.RowNumber && + address.RowNumber <= LastAddress.RowNumber && + FirstAddress.ColumnNumber <= address.ColumnNumber && + address.ColumnNumber <= LastAddress.ColumnNumber; + } + + public String ToStringRelative() + { + return ToStringRelative(false); + } + + public String ToStringFixed() + { + return ToStringFixed(XLReferenceStyle.A1); + } + + public String ToStringRelative(Boolean includeSheet) + { + string address; + if (!IsValid) + address = "#REF!"; + else + { + if (IsEntireSheet()) + address = $"1:{XLHelper.MaxRowNumber}"; + else if (IsEntireRow()) + address = String.Concat(FirstAddress.RowNumber.ToString(), ":", LastAddress.RowNumber.ToString()); + else if (IsEntireColumn()) + address = String.Concat(FirstAddress.ColumnLetter, ":", LastAddress.ColumnLetter); + else + address = String.Concat(FirstAddress.ToStringRelative(), ":", LastAddress.ToStringRelative()); + } + + if (includeSheet || WorksheetIsDeleted) + return String.Concat( + WorksheetIsDeleted ? "#REF" : Worksheet.Name.EscapeSheetName(), + "!", address); + + return address; + } + + public String ToStringFixed(XLReferenceStyle referenceStyle) + { + return ToStringFixed(referenceStyle, false); + } + + public String ToStringFixed(XLReferenceStyle referenceStyle, Boolean includeSheet) + { + string address; + if (!IsValid) + address = "#REF!"; + else + { + if (IsEntireSheet()) + address = $"$1:${XLHelper.MaxRowNumber}"; + else if (IsEntireRow()) + address = String.Concat("$", FirstAddress.RowNumber.ToString(), ":$", LastAddress.RowNumber.ToString()); + else if (IsEntireColumn()) + address = String.Concat("$", FirstAddress.ColumnLetter, ":$", LastAddress.ColumnLetter); + else + address = String.Concat(FirstAddress.ToStringFixed(referenceStyle), ":", LastAddress.ToStringFixed(referenceStyle)); + } + + if (includeSheet || WorksheetIsDeleted) + return String.Concat( + WorksheetIsDeleted ? "#REF" : Worksheet.Name.EscapeSheetName(), + "!", address); + + return address; + } + + public override string ToString() + { + if (!IsValid || WorksheetIsDeleted) + { + var worksheet = WorksheetIsDeleted ? "#REF!" : ""; + + var address = (!FirstAddress.IsValid || !LastAddress.IsValid) ? "#REF!" : String.Concat(FirstAddress.ToString(), ":", LastAddress.ToString()); + return String.Concat(worksheet, address); + } + + if (IsEntireSheet()) + { + var worksheet = WorksheetIsDeleted ? "#REF!" : ""; + var address = $"1:{XLHelper.MaxRowNumber}"; + return String.Concat(worksheet, address); + } + else if (IsEntireRow()) + { + var worksheet = WorksheetIsDeleted ? "#REF!" : ""; + var firstAddress = FirstAddress.IsValid ? FirstAddress.RowNumber.ToString() : "#REF!"; + var lastAddress = LastAddress.IsValid ? LastAddress.RowNumber.ToString() : "#REF!"; + + return String.Concat(worksheet, firstAddress, ':', lastAddress); + } + else if (IsEntireColumn()) + { + var worksheet = WorksheetIsDeleted ? "#REF!" : ""; + var firstAddress = FirstAddress.IsValid ? FirstAddress.ColumnLetter : "#REF!"; + var lastAddress = LastAddress.IsValid ? LastAddress.ColumnLetter : "#REF!"; + + return String.Concat(worksheet, firstAddress, ':', lastAddress); + } + else + { + return String.Concat(FirstAddress.ToString(), ":", LastAddress.ToString()); + } + } + + public string ToString(XLReferenceStyle referenceStyle) + { + return ToString(referenceStyle, false); + } + + public string ToString(XLReferenceStyle referenceStyle, bool includeSheet) + { + if (referenceStyle == XLReferenceStyle.R1C1) + return ToStringFixed(referenceStyle, true); + else + return ToStringRelative(includeSheet); + } + + public override bool Equals(object obj) + { + if (!(obj is XLRangeAddress)) + { + return false; + } + + var address = (XLRangeAddress)obj; + return FirstAddress.Equals(address.FirstAddress) && + LastAddress.Equals(address.LastAddress) && + EqualityComparer.Default.Equals(Worksheet, address.Worksheet); + } + + public override int GetHashCode() + { + var hashCode = -778064135; + hashCode = hashCode * -1521134295 + FirstAddress.GetHashCode(); + hashCode = hashCode * -1521134295 + LastAddress.GetHashCode(); + hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(Worksheet); + return hashCode; + } + + public bool Equals(XLRangeAddress other) + { + return ReferenceEquals(Worksheet, other.Worksheet) && + FirstAddress == other.FirstAddress && + LastAddress == other.LastAddress; + } + + public bool IsEntireColumn() + { + return IsValid + && FirstAddress.RowNumber == 1 + && LastAddress.RowNumber == XLHelper.MaxRowNumber; + } + + public bool IsEntireRow() + { + return IsValid + && FirstAddress.ColumnNumber == 1 + && LastAddress.ColumnNumber == XLHelper.MaxColumnNumber; + } + + public bool IsEntireSheet() + { + return IsValid && IsEntireColumn() && IsEntireRow(); + } + + public IXLRangeAddress Relative(IXLRangeAddress sourceRangeAddress, IXLRangeAddress targetRangeAddress) + { + var xlSourceRangeAddress = (XLRangeAddress)sourceRangeAddress; + var xlTargetRangeAddress = (XLRangeAddress)targetRangeAddress; + + return Relative(in xlSourceRangeAddress, in xlTargetRangeAddress); + } + + internal XLRangeAddress Relative(in XLRangeAddress sourceRangeAddress, in XLRangeAddress targetRangeAddress) + { + var sheet = targetRangeAddress.Worksheet; + + return new XLRangeAddress + ( + new XLAddress + ( + sheet, + this.FirstAddress.RowNumber - sourceRangeAddress.FirstAddress.RowNumber + targetRangeAddress.FirstAddress.RowNumber, + this.FirstAddress.ColumnNumber - sourceRangeAddress.FirstAddress.ColumnNumber + targetRangeAddress.FirstAddress.ColumnNumber, + fixedRow: false, + fixedColumn: false + ), + new XLAddress + ( + sheet, + this.LastAddress.RowNumber - sourceRangeAddress.FirstAddress.RowNumber + targetRangeAddress.FirstAddress.RowNumber, + this.LastAddress.ColumnNumber - sourceRangeAddress.FirstAddress.ColumnNumber + targetRangeAddress.FirstAddress.ColumnNumber, + fixedRow: false, + fixedColumn: false + ) + ); + } + + public IXLRangeAddress Intersection(IXLRangeAddress otherRangeAddress) + { + if (otherRangeAddress == null) + throw new ArgumentNullException(nameof(otherRangeAddress)); + + var xlOtherRangeAddress = (XLRangeAddress)otherRangeAddress; + return Intersection(in xlOtherRangeAddress); + } + + internal XLRangeAddress Intersection(in XLRangeAddress otherRangeAddress) + { + if (!this.Worksheet.Equals(otherRangeAddress.Worksheet)) + throw new ArgumentOutOfRangeException(nameof(otherRangeAddress), "The other range address is on a different worksheet"); + + var thisRangeAddressNormalized = this.Normalize(); + var otherRangeAddressNormalized = otherRangeAddress.Normalize(); + + var firstRow = Math.Max(thisRangeAddressNormalized.FirstAddress.RowNumber, otherRangeAddressNormalized.FirstAddress.RowNumber); + var firstColumn = Math.Max(thisRangeAddressNormalized.FirstAddress.ColumnNumber, otherRangeAddressNormalized.FirstAddress.ColumnNumber); + var lastRow = Math.Min(thisRangeAddressNormalized.LastAddress.RowNumber, otherRangeAddressNormalized.LastAddress.RowNumber); + var lastColumn = Math.Min(thisRangeAddressNormalized.LastAddress.ColumnNumber, otherRangeAddressNormalized.LastAddress.ColumnNumber); + + if (lastRow < firstRow || lastColumn < firstColumn) + return XLRangeAddress.Invalid; + + return new XLRangeAddress + ( + new XLAddress(this.Worksheet, firstRow, firstColumn, fixedRow: false, fixedColumn: false), + new XLAddress(this.Worksheet, lastRow, lastColumn, fixedRow: false, fixedColumn: false) + ); + } + + public IXLRange AsRange() + { + if (this.Worksheet == null) + throw new InvalidOperationException("The worksheet of the current range address has not been set."); + + if (!this.IsValid) + return null; + + return this.Worksheet.Range(this); + } + + #endregion Public methods + + #region Operators + + public static bool operator ==(XLRangeAddress left, XLRangeAddress right) + { + return left.Equals(right); + } + + public static bool operator !=(XLRangeAddress left, XLRangeAddress right) + { + return !(left == right); + } + + #endregion Operators + } +} diff --git a/ClosedXML/Excel/Ranges/XLRangeBase.cs b/ClosedXML/Excel/Ranges/XLRangeBase.cs new file mode 100644 index 0000000..47a03c4 --- /dev/null +++ b/ClosedXML/Excel/Ranges/XLRangeBase.cs @@ -0,0 +1,2300 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal abstract class XLRangeBase : XLStylizedBase, IXLRangeBase, IXLStylized + { + #region Fields + + private XLSortElements _sortRows; + private XLSortElements _sortColumns; + + #endregion Fields + + protected IXLStyle GetStyle() + { + return Style; + } + + #region Constructor + + private static Int32 IdCounter = 0; + private readonly Int32 Id; + + protected XLRangeBase(XLRangeAddress rangeAddress, XLStyleValue styleValue) + : base(styleValue) + { + Id = ++IdCounter; + + _rangeAddress = rangeAddress; + } + + #endregion Constructor + + protected virtual void OnRangeAddressChanged(XLRangeAddress oldAddress, XLRangeAddress newAddress) + { + Worksheet.RellocateRange(RangeType, oldAddress, newAddress); + } + + #region Public properties + + private XLRangeAddress _rangeAddress; + + public XLRangeAddress RangeAddress + { + get { return _rangeAddress; } + protected set + { + if (_rangeAddress != value) + { + var oldAddress = _rangeAddress; + _rangeAddress = value; + OnRangeAddressChanged(oldAddress, _rangeAddress); + } + } + } + + public XLWorksheet Worksheet + { + get { return RangeAddress.Worksheet; } + } + + public IXLDataValidation NewDataValidation + { + get + { + var newRange = AsRange(); + var dataValidation = new XLDataValidation(newRange); + Worksheet.DataValidations.Add(dataValidation); + return dataValidation; + } + } + + /// + /// Get the data validation rule containing current range or create a new one if no rule was defined for range. + /// + public IXLDataValidation DataValidation + { + get + { + return SetDataValidation(); + } + } + + private IXLDataValidation GetDataValidation() + { + Worksheet.DataValidations.TryGet(RangeAddress, out var existingDataValidation); + return existingDataValidation; + } + + #region IXLRangeBase Members + + IXLRangeAddress IXLAddressable.RangeAddress + { + get { return RangeAddress; } + } + + IXLWorksheet IXLRangeBase.Worksheet + { + get { return RangeAddress.Worksheet; } + } + + public String FormulaA1 + { + set + { + Cells().ForEach(c => + { + c.FormulaA1 = value; + c.FormulaReference = RangeAddress; + }); + } + } + + public String FormulaR1C1 + { + set + { + Cells().ForEach(c => + { + c.FormulaR1C1 = value; + c.FormulaReference = RangeAddress; + }); + } + } + + public Boolean ShareString + { + set { Cells().ForEach(c => c.ShareString = value); } + } + + public IXLHyperlinks Hyperlinks + { + get + { + var hyperlinks = new XLHyperlinks(); + var hls = from hl in Worksheet.Hyperlinks + where Contains(hl.Cell.AsRange()) + select hl; + hls.ForEach(hyperlinks.Add); + return hyperlinks; + } + } + + public Object Value + { + set { Cells().ForEach(c => c.Value = value); } + } + + public XLDataType DataType + { + set { Cells().ForEach(c => c.DataType = value); } + } + + #endregion IXLRangeBase Members + + #region IXLStylized Members + + public override IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges { AsRange() }; + return retVal; + } + } + + protected override IEnumerable Children + { + get + { + foreach (var cell in Cells().OfType()) + yield return cell; + } + } + + public override IEnumerable Styles + { + get + { + foreach (IXLCell cell in Cells()) + yield return cell.Style; + } + } + + #endregion IXLStylized Members + + #endregion Public properties + + #region IXLRangeBase Members + + IXLCell IXLRangeBase.FirstCell() + { + return FirstCell(); + } + + IXLCell IXLRangeBase.LastCell() + { + return LastCell(); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCell IXLRangeBase.FirstCellUsed() + { + return FirstCellUsed(false); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCell IXLRangeBase.FirstCellUsed(bool includeFormats) + { + return FirstCellUsed(includeFormats); + } + + IXLCell IXLRangeBase.FirstCellUsed(XLCellsUsedOptions options) + { + return FirstCellUsed(options, null); + } + + IXLCell IXLRangeBase.FirstCellUsed(Func predicate) + { + return FirstCellUsed(predicate); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCell IXLRangeBase.FirstCellUsed(Boolean includeFormats, Func predicate) + { + return FirstCellUsed(includeFormats, predicate); + } + + IXLCell IXLRangeBase.FirstCellUsed(XLCellsUsedOptions options, Func predicate) + { + return FirstCellUsed(options, predicate); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCell IXLRangeBase.LastCellUsed() + { + return LastCellUsed(false); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCell IXLRangeBase.LastCellUsed(bool includeFormats) + { + return LastCellUsed(includeFormats); + } + + IXLCell IXLRangeBase.LastCellUsed(XLCellsUsedOptions options) + { + return LastCellUsed(options, null); + } + + IXLCell IXLRangeBase.LastCellUsed(Func predicate) + { + return LastCellUsed(predicate); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCell IXLRangeBase.LastCellUsed(Boolean includeFormats, Func predicate) + { + return LastCellUsed(includeFormats, predicate); + } + + IXLCell IXLRangeBase.LastCellUsed(XLCellsUsedOptions options, Func predicate) + { + return LastCellUsed(options, predicate); + } + + public virtual IXLCells Cells() + { + return Cells(false); + } + + public virtual IXLCells Cells(Boolean usedCellsOnly) + { + return Cells(usedCellsOnly, XLCellsUsedOptions.AllContents); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public IXLCells Cells(Boolean usedCellsOnly, Boolean includeFormats) + { + return Cells(usedCellsOnly, includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents + ); + } + + public IXLCells Cells(Boolean usedCellsOnly, XLCellsUsedOptions options) + { + var cells = new XLCells(usedCellsOnly, options) { RangeAddress }; + return cells; + } + + public virtual IXLCells Cells(String cells) + { + return Ranges(cells).Cells(); + } + + public IXLCells Cells(Func predicate) + { + var cells = new XLCells(false, XLCellsUsedOptions.AllContents, predicate) { RangeAddress }; + return cells; + } + + public IXLCells CellsUsed() + { + return Cells(true); + } + + /// + /// Return the collection of cell values not initializing empty cells. + /// + public IEnumerable CellValues() + { + for (int ro = RangeAddress.FirstAddress.RowNumber; ro <= RangeAddress.LastAddress.RowNumber; ro++) + { + for (int co = RangeAddress.FirstAddress.ColumnNumber; co <= RangeAddress.LastAddress.ColumnNumber; co++) + { + yield return Worksheet.GetCellValue(ro, co); + } + } + } + + public IXLRange Merge() + { + return Merge(true); + } + + public IXLRange Merge(Boolean checkIntersect) + { + if (RangeAddress.FirstAddress.Equals(RangeAddress.LastAddress)) + return Worksheet.Range(RangeAddress); + + var asRange = AsRange(); + + if (checkIntersect) + { + var intersectedMergedRanges = + Worksheet.Internals.MergedRanges.GetIntersectedRanges(RangeAddress).ToList(); + foreach (var intersectedMergedRange in intersectedMergedRanges) + { + Worksheet.Internals.MergedRanges.Remove(intersectedMergedRange); + } + + var firstCell = FirstCell(); + var firstCellStyleKey = (firstCell.Style as XLStyle).Key; + var firstCellStyle = firstCell.Style; + var defaultStyleKey = XLStyle.Default.Key; + var cellsUsed = + CellsUsed(XLCellsUsedOptions.All & ~XLCellsUsedOptions.MergedRanges, c => c != firstCell).ToList(); + cellsUsed.ForEach(c => c.Clear(XLClearOptions.All + & ~XLClearOptions.MergedRanges + & ~XLClearOptions.NormalFormats)); + + if (firstCellStyleKey.Alignment != defaultStyleKey.Alignment) + asRange.Style.Alignment = firstCellStyle.Alignment; + else + cellsUsed.ForEach(c => c.Style.Alignment = firstCellStyle.Alignment); + + if (firstCellStyleKey.Fill != defaultStyleKey.Fill) + asRange.Style.Fill = firstCellStyle.Fill; + else + cellsUsed.ForEach(c => c.Style.Fill = firstCellStyle.Fill); + + if (firstCellStyleKey.Font != defaultStyleKey.Font) + asRange.Style.Font = firstCellStyle.Font; + else + cellsUsed.ForEach(c => c.Style.Font = firstCellStyle.Font); + + if (firstCellStyleKey.IncludeQuotePrefix != defaultStyleKey.IncludeQuotePrefix) + asRange.Style.IncludeQuotePrefix = firstCellStyle.IncludeQuotePrefix; + else + cellsUsed.ForEach(c => c.Style.IncludeQuotePrefix = firstCellStyle.IncludeQuotePrefix); + + if (firstCellStyleKey.NumberFormat != defaultStyleKey.NumberFormat) + asRange.Style.NumberFormat = firstCellStyle.NumberFormat; + else + cellsUsed.ForEach(c => c.Style.NumberFormat = firstCellStyle.NumberFormat); + + if (firstCellStyleKey.Protection != defaultStyleKey.Protection) + asRange.Style.Protection = firstCellStyle.Protection; + else + cellsUsed.ForEach(c => c.Style.Protection = firstCellStyle.Protection); + + if (cellsUsed.Any(c => (c.Style as XLStyle).Key.Border != defaultStyleKey.Border)) + asRange.Style.Border.SetInsideBorder(XLBorderStyleValues.None); + } + + Worksheet.Internals.MergedRanges.Add(asRange); + return asRange; + } + + public IXLRange Unmerge() + { + string tAddress = RangeAddress.ToString(); + var asRange = AsRange(); + if (Worksheet.Internals.MergedRanges.Select(m => m.RangeAddress.ToString()).Any(mAddress => mAddress == tAddress)) + Worksheet.Internals.MergedRanges.Remove(asRange); + + return asRange; + } + + public IXLRangeBase Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + var cellClearOptions = clearOptions + & ~XLClearOptions.ConditionalFormats + & ~XLClearOptions.DataValidation + & ~XLClearOptions.MergedRanges; + var cellUsedOptions = cellClearOptions.ToCellsUsedOptions(); + foreach (var cell in CellsUsed(cellUsedOptions)) + { + // We'll clear the conditional formatting, data validations + // and merged ranges later down. + (cell as XLCell).Clear(cellClearOptions, true); + } + + if (clearOptions.HasFlag(XLClearOptions.ConditionalFormats)) + RemoveConditionalFormatting(); + + if (clearOptions.HasFlag(XLClearOptions.DataValidation)) + { + var validation = NewDataValidation; + Worksheet.DataValidations.Delete(validation); + } + + if (clearOptions.HasFlag(XLClearOptions.MergedRanges)) + ClearMerged(); + + if (clearOptions.HasFlag(XLClearOptions.Sparklines)) + RemoveSparklines(); + + if (clearOptions == XLClearOptions.All) + { + Worksheet.Internals.CellsCollection.RemoveAll( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber + ); + } + return this; + } + + public IXLRangeBase Relative(IXLRangeBase sourceBaseRange, IXLRangeBase targetBaseRange) + { + var xlSourceBaseRangeAddress = (XLRangeAddress)sourceBaseRange.RangeAddress; + var xlTargetBaseRangeAddress = (XLRangeAddress)targetBaseRange.RangeAddress; + var xlRangeAddress = this.RangeAddress.Relative(in xlSourceBaseRangeAddress, in xlTargetBaseRangeAddress); + + return ((XLRangeBase)targetBaseRange).Range(in xlRangeAddress); + } + + internal void RemoveConditionalFormatting() + { + var mf = RangeAddress.FirstAddress; + var ml = RangeAddress.LastAddress; + foreach (var format in Worksheet.ConditionalFormats.Where(x => x.Ranges.GetIntersectedRanges(RangeAddress).Any()).ToList()) + { + var cfRanges = format.Ranges.ToList(); + format.Ranges.RemoveAll(); + + foreach (var cfRange in cfRanges) + { + if (!cfRange.Intersects(this)) + { + format.Ranges.Add(cfRange); + continue; + } + + var f = cfRange.RangeAddress.FirstAddress; + var l = cfRange.RangeAddress.LastAddress; + bool byWidth = false, byHeight = false; + XLRange rng1 = null, rng2 = null; + if (mf.ColumnNumber <= f.ColumnNumber && ml.ColumnNumber >= l.ColumnNumber) + { + if (mf.RowNumber.Between(f.RowNumber, l.RowNumber) || ml.RowNumber.Between(f.RowNumber, l.RowNumber)) + { + if (mf.RowNumber > f.RowNumber) + rng1 = Worksheet.Range(f.RowNumber, f.ColumnNumber, mf.RowNumber - 1, l.ColumnNumber); + if (ml.RowNumber < l.RowNumber) + rng2 = Worksheet.Range(ml.RowNumber + 1, f.ColumnNumber, l.RowNumber, l.ColumnNumber); + } + byWidth = true; + } + + if (mf.RowNumber <= f.RowNumber && ml.RowNumber >= l.RowNumber) + { + if (mf.ColumnNumber.Between(f.ColumnNumber, l.ColumnNumber) || ml.ColumnNumber.Between(f.ColumnNumber, l.ColumnNumber)) + { + if (mf.ColumnNumber > f.ColumnNumber) + rng1 = Worksheet.Range(f.RowNumber, f.ColumnNumber, l.RowNumber, mf.ColumnNumber - 1); + if (ml.ColumnNumber < l.ColumnNumber) + rng2 = Worksheet.Range(f.RowNumber, ml.ColumnNumber + 1, l.RowNumber, l.ColumnNumber); + } + byHeight = true; + } + + if (rng1 != null) + { + format.Ranges.Add(rng1); + } + if (rng2 != null) + { + //TODO: reflect the formula for a new range + format.Ranges.Add(rng2); + } + + if (!byWidth && !byHeight) + format.Ranges.Add(cfRange); // Not split, preserve original + } + if (!format.Ranges.Any()) + Worksheet.ConditionalFormats.Remove(x => x == format); + } + } + + internal void RemoveSparklines() + { + Worksheet.SparklineGroups.GetSparklines(this).ToList() + .ForEach(sl => Worksheet.SparklineGroups.Remove(sl.Location)); + } + + public void DeleteComments() + { + Cells().DeleteComments(); + } + + public bool Contains(String rangeAddress) + { + string addressToUse = rangeAddress.Contains("!") + ? rangeAddress.Substring(rangeAddress.IndexOf("!") + 1) + : rangeAddress; + + XLAddress firstAddress; + XLAddress lastAddress; + if (addressToUse.Contains(':')) + { + var arrRange = addressToUse.Split(':'); + firstAddress = XLAddress.Create(Worksheet, arrRange[0]); + lastAddress = XLAddress.Create(Worksheet, arrRange[1]); + } + else + { + firstAddress = XLAddress.Create(Worksheet, addressToUse); + lastAddress = XLAddress.Create(Worksheet, addressToUse); + } + return Contains(firstAddress, lastAddress); + } + + public bool Contains(IXLRangeBase range) + { + return Contains((XLAddress)range.RangeAddress.FirstAddress, (XLAddress)range.RangeAddress.LastAddress); + } + + public bool Intersects(string rangeAddress) + { + return Intersects(Worksheet.Range(rangeAddress)); + } + + public bool Intersects(IXLRangeBase range) + { + if (!range.RangeAddress.IsValid || !RangeAddress.IsValid) + return false; + var ma = range.RangeAddress; + var ra = RangeAddress; + return ra.Intersects(ma); + } + + IXLRange IXLRangeBase.AsRange() + { + return AsRange(); + } + + public virtual XLRange AsRange() + { + return Worksheet.Range(RangeAddress); + } + + public IXLRange AddToNamed(String rangeName) + { + return AddToNamed(rangeName, XLScope.Workbook); + } + + public IXLRange AddToNamed(String rangeName, XLScope scope) + { + return AddToNamed(rangeName, scope, null); + } + + public IXLRange AddToNamed(String rangeName, XLScope scope, String comment) + { + var namedRanges = scope == XLScope.Workbook + ? Worksheet.Workbook.NamedRanges + : Worksheet.NamedRanges; + + if (namedRanges.TryGetValue(rangeName, out IXLNamedRange namedRange)) + namedRange.Add(Worksheet.Workbook, RangeAddress.ToStringFixed(XLReferenceStyle.A1, true)); + else + namedRanges.Add(rangeName, RangeAddress.ToStringFixed(XLReferenceStyle.A1, true), comment); + + return AsRange(); + } + + public IXLRangeBase SetValue(T value) + { + Cells().ForEach(c => c.SetValue(value)); + return this; + } + + public Boolean IsMerged() + { + return Cells().Any(c => c.IsMerged()); + } + + public virtual Boolean IsEmpty() + { + return !CellsUsed().Any() || CellsUsed().Any(c => c.IsEmpty()); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public virtual Boolean IsEmpty(Boolean includeFormats) + { + return IsEmpty(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + public virtual Boolean IsEmpty(XLCellsUsedOptions options) + { + return CellsUsed(options).Cast().All(c => c.IsEmpty(options)); + } + + public virtual Boolean IsEntireRow() + { + return RangeAddress.IsEntireRow(); + } + + public virtual Boolean IsEntireColumn() + { + return RangeAddress.IsEntireColumn(); + } + + public Boolean IsEntireSheet() + { + return RangeAddress.IsEntireSheet(); + } + + #endregion IXLRangeBase Members + + public IXLCells Search(String searchText, CompareOptions compareOptions = CompareOptions.Ordinal, Boolean searchFormulae = false) + { + var culture = CultureInfo.CurrentCulture; + return CellsUsed(XLCellsUsedOptions.AllContents, c => + { + try + { + if (searchFormulae) + return c.HasFormula + && culture.CompareInfo.IndexOf(c.FormulaA1, searchText, compareOptions) >= 0 + || culture.CompareInfo.IndexOf(c.Value.ToString(), searchText, compareOptions) >= 0; + else + return culture.CompareInfo.IndexOf(c.GetFormattedString(), searchText, compareOptions) >= 0; + } + catch + { + return false; + } + }); + } + + internal XLCell FirstCell() + { + return Cell(1, 1); + } + + internal XLCell LastCell() + { + return Cell(RowCount(), ColumnCount()); + } + + internal XLCell FirstCellUsed() + { + return FirstCellUsed(XLCellsUsedOptions.AllContents, predicate: null); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + internal XLCell FirstCellUsed(Boolean includeFormats) + { + return FirstCellUsed(includeFormats, null); + } + + internal XLCell FirstCellUsed(Func predicate) + { + return FirstCellUsed(XLCellsUsedOptions.AllContents, predicate); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + internal XLCell FirstCellUsed(Boolean includeFormats, Func predicate) + { + return FirstCellUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents, + predicate); + } + + internal XLCell FirstCellUsed(XLCellsUsedOptions options, Func predicate) + { + predicate = predicate ?? (t => true); + + //To avoid unnecessary initialization of thousands cells + var opt = options + & ~XLCellsUsedOptions.ConditionalFormats + & ~XLCellsUsedOptions.DataValidation + & ~XLCellsUsedOptions.MergedRanges; + + IEnumerable cellsUsed = CellsUsed(opt, predicate); + + if (options.HasFlag(XLCellsUsedOptions.ConditionalFormats)) + { + cellsUsed = cellsUsed.Union( + Worksheet.ConditionalFormats + .SelectMany(cf => cf.Ranges.GetIntersectedRanges(RangeAddress)) + .Select(r => r.FirstCell()) + .Where(predicate) + ); + } + if (options.HasFlag(XLCellsUsedOptions.DataValidation)) + { + cellsUsed = cellsUsed.Union( + Worksheet.DataValidations + .GetAllInRange(RangeAddress) + .SelectMany(dv => dv.Ranges) + .Select(r => r.FirstCell()) + .Where(predicate) + ); + } + if (options.HasFlag(XLCellsUsedOptions.MergedRanges)) + { + cellsUsed = cellsUsed.Union( + Worksheet.MergedRanges.GetIntersectedRanges(RangeAddress) + .Select(r => r.FirstCell()) + .Where(predicate) + ); + } + + cellsUsed = cellsUsed.ToList(); + + if (!cellsUsed.Any()) + return null; + + var firstRow = cellsUsed.Min(c => c.Address.RowNumber); + var firstColumn = cellsUsed.Min(c => c.Address.ColumnNumber); + + if (firstRow < RangeAddress.FirstAddress.RowNumber) + firstRow = RangeAddress.FirstAddress.RowNumber; + + if (firstColumn < RangeAddress.FirstAddress.ColumnNumber) + firstColumn = RangeAddress.FirstAddress.ColumnNumber; + + return Worksheet.Cell(firstRow, firstColumn); + } + + internal XLCell LastCellUsed() + { + return LastCellUsed(XLCellsUsedOptions.AllContents, predicate: null); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + internal XLCell LastCellUsed(Boolean includeFormats) + { + return LastCellUsed(includeFormats, null); + } + + internal XLCell LastCellUsed(Func predicate) + { + return LastCellUsed(XLCellsUsedOptions.AllContents, predicate); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + internal XLCell LastCellUsed(Boolean includeFormats, Func predicate) + { + return LastCellUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents, + predicate); + } + + internal XLCell LastCellUsed(XLCellsUsedOptions options, Func predicate) + { + predicate = predicate ?? (t => true); + + //To avoid unnecessary initialization of thousands cells + var opt = options + & ~XLCellsUsedOptions.ConditionalFormats + & ~XLCellsUsedOptions.DataValidation + & ~XLCellsUsedOptions.MergedRanges; + + IEnumerable cellsUsed = CellsUsed(opt, predicate); + + if (options.HasFlag(XLCellsUsedOptions.ConditionalFormats)) + { + cellsUsed = cellsUsed.Union( + Worksheet.ConditionalFormats + .SelectMany(cf => cf.Ranges.GetIntersectedRanges(RangeAddress)) + .Select(r => r.LastCell()) + .Where(predicate) + ); + } + if (options.HasFlag(XLCellsUsedOptions.DataValidation)) + { + cellsUsed = cellsUsed.Union( + Worksheet.DataValidations + .GetAllInRange(RangeAddress) + .SelectMany(dv => dv.Ranges) + .Select(r => r.LastCell()) + .Where(predicate) + ); + } + if (options.HasFlag(XLCellsUsedOptions.MergedRanges)) + { + cellsUsed = cellsUsed.Union( + Worksheet.MergedRanges.GetIntersectedRanges(RangeAddress) + .Select(r => r.LastCell()) + .Where(predicate) + ); + } + + cellsUsed = cellsUsed.ToList(); + + if (!cellsUsed.Any()) + return null; + + var lastRow = cellsUsed.Max(c => c.Address.RowNumber); + var lastColumn = cellsUsed.Max(c => c.Address.ColumnNumber); + + if (lastRow > RangeAddress.LastAddress.RowNumber) + lastRow = RangeAddress.LastAddress.RowNumber; + + if (lastColumn > RangeAddress.LastAddress.ColumnNumber) + lastColumn = RangeAddress.LastAddress.ColumnNumber; + + return Worksheet.Cell(lastRow, lastColumn); + } + + public XLCell Cell(Int32 row, Int32 column) + { + return Cell(new XLAddress(Worksheet, row, column, false, false)); + } + + public virtual XLCell Cell(String cellAddressInRange) + { + if (XLHelper.IsValidA1Address(cellAddressInRange)) + return Cell(XLAddress.Create(Worksheet, cellAddressInRange)); + + if (Worksheet.NamedRanges.TryGetValue(cellAddressInRange, out IXLNamedRange namedRange)) + return namedRange.Ranges.First().FirstCell().CastTo(); + + return null; + } + + public XLCell Cell(Int32 row, String column) + { + return Cell(new XLAddress(Worksheet, row, column, false, false)); + } + + public XLCell Cell(IXLAddress cellAddressInRange) + { + return Cell(cellAddressInRange.RowNumber, cellAddressInRange.ColumnNumber); + } + + public XLCell Cell(in XLAddress cellAddressInRange) + { + Int32 absRow = cellAddressInRange.RowNumber + RangeAddress.FirstAddress.RowNumber - 1; + Int32 absColumn = cellAddressInRange.ColumnNumber + RangeAddress.FirstAddress.ColumnNumber - 1; + + if (absRow <= 0 || absRow > XLHelper.MaxRowNumber) + { + throw new ArgumentOutOfRangeException( + nameof(cellAddressInRange), + String.Format("Row number must be between 1 and {0}", XLHelper.MaxRowNumber) + ); + } + + if (absColumn <= 0 || absColumn > XLHelper.MaxColumnNumber) + { + throw new ArgumentOutOfRangeException( + nameof(cellAddressInRange), + String.Format("Column number must be between 1 and {0}", XLHelper.MaxColumnNumber) + ); + } + + var cell = Worksheet.Internals.CellsCollection.GetCell(absRow, + absColumn); + + if (cell != null) + return cell; + + var styleValue = this.StyleValue; + + if (styleValue == Worksheet.StyleValue) + { + if (Worksheet.Internals.RowsCollection.TryGetValue(absRow, out XLRow row) + && row.StyleValue != Worksheet.StyleValue) + styleValue = row.StyleValue; + else if (Worksheet.Internals.ColumnsCollection.TryGetValue(absColumn, out XLColumn column) + && column.StyleValue != Worksheet.StyleValue) + styleValue = column.StyleValue; + } + var absoluteAddress = new XLAddress(this.Worksheet, + absRow, + absColumn, + cellAddressInRange.FixedRow, + cellAddressInRange.FixedColumn); + + // If the default style for this range base is empty, but the worksheet + // has a default style, use the worksheet's default style + XLCell newCell = new XLCell(Worksheet, absoluteAddress, styleValue); + + Worksheet.Internals.CellsCollection.Add(absRow, absColumn, newCell); + return newCell; + } + + public Int32 RowCount() + { + return RangeAddress.LastAddress.RowNumber - RangeAddress.FirstAddress.RowNumber + 1; + } + + public Int32 RowNumber() + { + return RangeAddress.FirstAddress.RowNumber; + } + + public Int32 ColumnCount() + { + return RangeAddress.LastAddress.ColumnNumber - RangeAddress.FirstAddress.ColumnNumber + 1; + } + + public Int32 ColumnNumber() + { + return RangeAddress.FirstAddress.ColumnNumber; + } + + public String ColumnLetter() + { + return RangeAddress.FirstAddress.ColumnLetter; + } + + public virtual XLRange Range(String rangeAddressStr) + { + var rangeAddress = new XLRangeAddress(Worksheet, rangeAddressStr); + return Range(rangeAddress); + } + + internal abstract void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted); + + internal abstract void WorksheetRangeShiftedRows(XLRange range, int rowsShifted); + + public abstract XLRangeType RangeType { get; } + + public XLRange Range(IXLCell firstCell, IXLCell lastCell) + { + var newFirstCellAddress = (XLAddress)firstCell.Address; + var newLastCellAddress = (XLAddress)lastCell.Address; + + return GetRange(newFirstCellAddress, newLastCellAddress); + } + + private XLRange GetRange(XLAddress newFirstCellAddress, XLAddress newLastCellAddress) + { + if (!this.Worksheet.Equals(newFirstCellAddress.Worksheet)) + throw new ArgumentException("The address refers to a different worksheet.", nameof(newFirstCellAddress)); + + if (!this.Worksheet.Equals(newLastCellAddress.Worksheet)) + throw new ArgumentException("The address refers to a different worksheet.", nameof(newLastCellAddress)); + + var newRangeAddress = new XLRangeAddress(newFirstCellAddress, newLastCellAddress); + var xlRangeParameters = new XLRangeParameters(newRangeAddress, Style); + if ( + newFirstCellAddress.RowNumber < RangeAddress.FirstAddress.RowNumber + || newFirstCellAddress.RowNumber > RangeAddress.LastAddress.RowNumber + || newLastCellAddress.RowNumber > RangeAddress.LastAddress.RowNumber + || newFirstCellAddress.ColumnNumber < RangeAddress.FirstAddress.ColumnNumber + || newFirstCellAddress.ColumnNumber > RangeAddress.LastAddress.ColumnNumber + || newLastCellAddress.ColumnNumber > RangeAddress.LastAddress.ColumnNumber + ) + { + throw new ArgumentOutOfRangeException(String.Format( + "The cells {0} and {1} are outside the range '{2}'.", + newFirstCellAddress, + newLastCellAddress, + ToString())); + } + + if (newFirstCellAddress.Worksheet != null) + return newFirstCellAddress.Worksheet.GetOrCreateRange(xlRangeParameters); + else if (Worksheet != null) + return Worksheet.GetOrCreateRange(xlRangeParameters); + else + return new XLRange(xlRangeParameters); + } + + public XLRange Range(String firstCellAddress, String lastCellAddress) + { + var rangeAddress = new XLRangeAddress(XLAddress.Create(Worksheet, firstCellAddress), + XLAddress.Create(Worksheet, lastCellAddress)); + return Range(rangeAddress); + } + + public XLRange Range(Int32 firstCellRow, Int32 firstCellColumn, Int32 lastCellRow, Int32 lastCellColumn) + { + var rangeAddress = new XLRangeAddress + ( + new XLAddress + ( + Worksheet, + firstCellRow + RangeAddress.FirstAddress.RowNumber - 1, + firstCellColumn + RangeAddress.FirstAddress.ColumnNumber - 1, + fixedRow: false, + fixedColumn: false + ), + new XLAddress + ( + Worksheet, + lastCellRow + RangeAddress.FirstAddress.RowNumber - 1, + lastCellColumn + RangeAddress.FirstAddress.ColumnNumber - 1, + fixedRow: false, + fixedColumn: false + ) + ); + return Range(rangeAddress); + } + + public XLRange Range(IXLAddress firstCellAddress, IXLAddress lastCellAddress) + { + var rangeAddress = new XLRangeAddress((XLAddress)firstCellAddress, (XLAddress)lastCellAddress); + return Range(rangeAddress); + } + + public XLRange Range(IXLRangeAddress rangeAddress) + { + var xlRangeAddress = (XLRangeAddress)rangeAddress; + return Range(in xlRangeAddress); + } + + internal XLRange Range(in XLRangeAddress rangeAddress) + { + var ws = rangeAddress.FirstAddress.Worksheet ?? + rangeAddress.LastAddress.Worksheet ?? + Worksheet; + + var newFirstCellAddress = new XLAddress(ws, + rangeAddress.FirstAddress.RowNumber, + rangeAddress.FirstAddress.ColumnNumber, + rangeAddress.FirstAddress.FixedRow, + rangeAddress.FirstAddress.FixedColumn); + + var newLastCellAddress = new XLAddress(ws, + rangeAddress.LastAddress.RowNumber, + rangeAddress.LastAddress.ColumnNumber, + rangeAddress.LastAddress.FixedRow, + rangeAddress.LastAddress.FixedColumn); + + return GetRange(newFirstCellAddress, newLastCellAddress); + } + + public virtual IXLRanges Ranges(String ranges) + { + var retVal = new XLRanges(); + var rangePairs = ranges.Split(','); + foreach (string pair in rangePairs) + retVal.Add(Range(pair.Trim())); + return retVal; + } + + public IXLRanges Ranges(params String[] ranges) + { + var retVal = new XLRanges(); + foreach (string pair in ranges) + retVal.Add(Range(pair)); + return retVal; + } + + protected String FixColumnAddress(String address) + { + if (Int32.TryParse(address, out Int32 rowNumber)) + return RangeAddress.FirstAddress.ColumnLetter + (rowNumber + RangeAddress.FirstAddress.RowNumber - 1).ToInvariantString(); + return address; + } + + protected String FixRowAddress(String address) + { + if (Int32.TryParse(address, out Int32 columnNumber)) + return XLHelper.GetColumnLetterFromNumber(columnNumber + RangeAddress.FirstAddress.ColumnNumber - 1) + RangeAddress.FirstAddress.RowNumber.ToInvariantString(); + return address; + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public IXLCells CellsUsed(bool includeFormats) + { + return CellsUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + public IXLCells CellsUsed(XLCellsUsedOptions options) + { + var cells = new XLCells(true, options) { RangeAddress }; + return cells; + } + + public IXLCells CellsUsed(Func predicate) + { + var cells = new XLCells(true, XLCellsUsedOptions.AllContents, predicate) { RangeAddress }; + return cells; + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public IXLCells CellsUsed(Boolean includeFormats, Func predicate) + { + return CellsUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents, + predicate); + } + + public IXLCells CellsUsed(XLCellsUsedOptions options, Func predicate) + { + var cells = new XLCells(true, options, predicate) { RangeAddress }; + return cells; + } + + public IXLRangeColumns InsertColumnsAfter(Int32 numberOfColumns) + { + return InsertColumnsAfter(numberOfColumns, true); + } + + public IXLRangeColumns InsertColumnsAfter(Int32 numberOfColumns, Boolean expandRange) + { + var retVal = InsertColumnsAfter(false, numberOfColumns); + // Adjust the range + if (expandRange) + { + RangeAddress = new XLRangeAddress( + new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn), + new XLAddress(Worksheet, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber + numberOfColumns, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn)); + } + return retVal; + } + + public IXLRangeColumns InsertColumnsAfter(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true) + { + return InsertColumnsAfterInternal(onlyUsedCells, numberOfColumns, formatFromLeft); + } + + public void InsertColumnsAfterVoid(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true) + { + InsertColumnsAfterInternal(onlyUsedCells, numberOfColumns, formatFromLeft, nullReturn: true); + } + + private IXLRangeColumns InsertColumnsAfterInternal(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true, Boolean nullReturn = false) + { + int columnCount = ColumnCount(); + int firstColumn = RangeAddress.FirstAddress.ColumnNumber + columnCount; + if (firstColumn > XLHelper.MaxColumnNumber) + firstColumn = XLHelper.MaxColumnNumber; + int lastColumn = firstColumn + ColumnCount() - 1; + if (lastColumn > XLHelper.MaxColumnNumber) + lastColumn = XLHelper.MaxColumnNumber; + + int firstRow = RangeAddress.FirstAddress.RowNumber; + int lastRow = firstRow + RowCount() - 1; + if (lastRow > XLHelper.MaxRowNumber) + lastRow = XLHelper.MaxRowNumber; + + var newRange = Worksheet.Range(firstRow, firstColumn, lastRow, lastColumn); + return newRange.InsertColumnsBeforeInternal(onlyUsedCells, numberOfColumns, formatFromLeft, nullReturn); + } + + public IXLRangeColumns InsertColumnsBefore(Int32 numberOfColumns) + { + return InsertColumnsBefore(numberOfColumns, false); + } + + public IXLRangeColumns InsertColumnsBefore(Int32 numberOfColumns, Boolean expandRange) + { + var retVal = InsertColumnsBefore(false, numberOfColumns); + // Adjust the range + if (expandRange) + { + RangeAddress = new XLRangeAddress( + new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber - numberOfColumns, + RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn), + new XLAddress(Worksheet, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn)); + } + return retVal; + } + + public IXLRangeColumns InsertColumnsBefore(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true) + { + return InsertColumnsBeforeInternal(onlyUsedCells, numberOfColumns, formatFromLeft); + } + + public void InsertColumnsBeforeVoid(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true) + { + InsertColumnsBeforeInternal(onlyUsedCells, numberOfColumns, formatFromLeft, nullReturn: true); + } + + private IXLRangeColumns InsertColumnsBeforeInternal(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true, Boolean nullReturn = false) + { + if (numberOfColumns <= 0 || numberOfColumns > XLHelper.MaxColumnNumber) + throw new ArgumentOutOfRangeException(nameof(numberOfColumns), + $"Number of columns to insert must be a positive number no more than {XLHelper.MaxColumnNumber}"); + + foreach (XLWorksheet ws in Worksheet.Workbook.WorksheetsInternal) + { + foreach (XLCell cell in ws.Internals.CellsCollection.GetCells(c => !String.IsNullOrWhiteSpace(c.FormulaA1))) + cell.ShiftFormulaColumns(AsRange(), numberOfColumns); + } + + var cellsToInsert = new Dictionary(); + var cellsToDelete = new List(); + int firstColumn = RangeAddress.FirstAddress.ColumnNumber; + int firstRow = RangeAddress.FirstAddress.RowNumber; + int lastRow = RangeAddress.FirstAddress.RowNumber + RowCount() - 1; + + if (!onlyUsedCells) + { + int lastColumn = Worksheet.Internals.CellsCollection.MaxColumnUsed; + if (lastColumn > 0) + { + for (int co = lastColumn; co >= firstColumn; co--) + { + int newColumn = co + numberOfColumns; + for (int ro = lastRow; ro >= firstRow; ro--) + { + var oldCell = Worksheet.Internals.CellsCollection.GetCell(ro, co); + if (oldCell == null) + continue; + + var oldKey = new XLAddress(Worksheet, ro, co, false, false); + var newKey = new XLAddress(Worksheet, ro, newColumn, false, false); + + oldCell.Address = newKey; + if (newKey.IsValid) + cellsToInsert.Add(newKey, oldCell); + cellsToDelete.Add(oldKey); + } + + if (this.IsEntireColumn()) + { + Worksheet.Column(newColumn).Width = Worksheet.Column(co).Width; + } + } + } + } + else + { + foreach ( + XLCell c in + Worksheet.Internals.CellsCollection.GetCells(firstRow, firstColumn, lastRow, + Worksheet.Internals.CellsCollection.MaxColumnUsed)) + { + int newColumn = c.Address.ColumnNumber + numberOfColumns; + var newKey = new XLAddress(Worksheet, c.Address.RowNumber, newColumn, false, false); + + cellsToDelete.Add(c.Address); + c.Address = newKey; + if (newKey.IsValid) + cellsToInsert.Add(newKey, c); + } + } + + cellsToDelete.ForEach(c => Worksheet.Internals.CellsCollection.Remove(c.RowNumber, c.ColumnNumber)); + cellsToInsert.ForEach( + c => Worksheet.Internals.CellsCollection.Add(c.Key.RowNumber, c.Key.ColumnNumber, c.Value)); + + Int32 firstRowReturn = RangeAddress.FirstAddress.RowNumber; + Int32 lastRowReturn = RangeAddress.LastAddress.RowNumber; + Int32 firstColumnReturn = RangeAddress.FirstAddress.ColumnNumber; + Int32 lastColumnReturn = RangeAddress.FirstAddress.ColumnNumber + numberOfColumns - 1; + + Worksheet.NotifyRangeShiftedColumns(AsRange(), numberOfColumns); + + var rangeToReturn = Worksheet.Range(firstRowReturn, firstColumnReturn, lastRowReturn, lastColumnReturn); + + // We deliberately ignore conditional formats and data validation here. Their shifting is handled elsewhere + var contentFlags = XLCellsUsedOptions.All + & ~XLCellsUsedOptions.ConditionalFormats + & ~XLCellsUsedOptions.DataValidation; + + if (formatFromLeft && rangeToReturn.RangeAddress.FirstAddress.ColumnNumber > 1) + { + var firstColumnUsed = rangeToReturn.FirstColumn(); + var model = firstColumnUsed.ColumnLeft(); + var modelFirstRow = (model as IXLRangeBase).FirstCellUsed(contentFlags); + var modelLastRow = (model as IXLRangeBase).LastCellUsed(contentFlags); + if (modelLastRow != null) + { + Int32 firstRoReturned = modelFirstRow.Address.RowNumber + - model.RangeAddress.FirstAddress.RowNumber + 1; + Int32 lastRoReturned = modelLastRow.Address.RowNumber + - model.RangeAddress.FirstAddress.RowNumber + 1; + for (Int32 ro = firstRoReturned; ro <= lastRoReturned; ro++) + { + rangeToReturn.Row(ro).Style = model.Cell(ro).Style; + } + } + } + else + { + var lastRoUsed = rangeToReturn.LastRowUsed(contentFlags); + if (lastRoUsed != null) + { + Int32 lastRoReturned = lastRoUsed.RowNumber(); + for (Int32 ro = 1; ro <= lastRoReturned; ro++) + { + var styleToUse = + Worksheet.Internals.RowsCollection.TryGetValue(ro, out XLRow row) + ? row.Style + : Worksheet.Style; + + rangeToReturn.Row(ro).Style = styleToUse; + } + } + } + + if (nullReturn) + return null; + + return rangeToReturn.Columns(); + } + + public IXLRangeRows InsertRowsBelow(Int32 numberOfRows) + { + return InsertRowsBelow(numberOfRows, true); + } + + public IXLRangeRows InsertRowsBelow(Int32 numberOfRows, Boolean expandRange) + { + var retVal = InsertRowsBelow(false, numberOfRows); + // Adjust the range + if (expandRange) + { + RangeAddress = new XLRangeAddress( + new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn), + new XLAddress(Worksheet, + RangeAddress.LastAddress.RowNumber + numberOfRows, + RangeAddress.LastAddress.ColumnNumber, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn)); + } + return retVal; + } + + public IXLRangeRows InsertRowsBelow(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove = true) + { + return InsertRowsBelowInternal(onlyUsedCells, numberOfRows, formatFromAbove, nullReturn: false); + } + + public void InsertRowsBelowVoid(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove = true) + { + InsertRowsBelowInternal(onlyUsedCells, numberOfRows, formatFromAbove, nullReturn: true); + } + + private IXLRangeRows InsertRowsBelowInternal(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove, Boolean nullReturn) + { + int rowCount = RowCount(); + int firstRow = RangeAddress.FirstAddress.RowNumber + rowCount; + if (firstRow > XLHelper.MaxRowNumber) + firstRow = XLHelper.MaxRowNumber; + int lastRow = firstRow + RowCount() - 1; + if (lastRow > XLHelper.MaxRowNumber) + lastRow = XLHelper.MaxRowNumber; + + int firstColumn = RangeAddress.FirstAddress.ColumnNumber; + int lastColumn = firstColumn + ColumnCount() - 1; + if (lastColumn > XLHelper.MaxColumnNumber) + lastColumn = XLHelper.MaxColumnNumber; + + var newRange = Worksheet.Range(firstRow, firstColumn, lastRow, lastColumn); + return newRange.InsertRowsAboveInternal(onlyUsedCells, numberOfRows, formatFromAbove, nullReturn); + } + + public IXLRangeRows InsertRowsAbove(Int32 numberOfRows) + { + return InsertRowsAbove(numberOfRows, false); + } + + public IXLRangeRows InsertRowsAbove(Int32 numberOfRows, Boolean expandRange) + { + var retVal = InsertRowsAbove(false, numberOfRows); + // Adjust the range + if (expandRange) + { + RangeAddress = new XLRangeAddress( + new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber - numberOfRows, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn), + new XLAddress(Worksheet, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn)); + } + return retVal; + } + + public void InsertRowsAboveVoid(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove = true) + { + InsertRowsAboveInternal(onlyUsedCells, numberOfRows, formatFromAbove, nullReturn: true); + } + + public IXLRangeRows InsertRowsAbove(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove = true) + { + return InsertRowsAboveInternal(onlyUsedCells, numberOfRows, formatFromAbove, nullReturn: false); + } + + private IXLRangeRows InsertRowsAboveInternal(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove, Boolean nullReturn) + { + if (numberOfRows <= 0 || numberOfRows > XLHelper.MaxRowNumber) + throw new ArgumentOutOfRangeException(nameof(numberOfRows), + $"Number of rows to insert must be a positive number no more than {XLHelper.MaxRowNumber}"); + + var asRange = AsRange(); + foreach (XLWorksheet ws in Worksheet.Workbook.WorksheetsInternal) + { + foreach (XLCell cell in ws.Internals.CellsCollection.GetCells(c => !String.IsNullOrWhiteSpace(c.FormulaA1))) + cell.ShiftFormulaRows(asRange, numberOfRows); + } + + var cellsToInsert = new Dictionary(); + var cellsToDelete = new List(); + int firstRow = RangeAddress.FirstAddress.RowNumber; + int firstColumn = RangeAddress.FirstAddress.ColumnNumber; + int lastColumn = Math.Min( + RangeAddress.FirstAddress.ColumnNumber + ColumnCount() - 1, + Worksheet.Internals.CellsCollection.MaxColumnUsed); + + if (!onlyUsedCells) + { + int lastRow = Worksheet.Internals.CellsCollection.MaxRowUsed; + if (lastRow > 0) + { + for (int ro = lastRow; ro >= firstRow; ro--) + { + int newRow = ro + numberOfRows; + + for (int co = lastColumn; co >= firstColumn; co--) + { + var oldCell = Worksheet.Internals.CellsCollection.GetCell(ro, co); + if (oldCell == null) + continue; + + var oldKey = new XLAddress(Worksheet, ro, co, false, false); + var newKey = new XLAddress(Worksheet, newRow, co, false, false); + + oldCell.Address = newKey; + if (newKey.IsValid) + cellsToInsert.Add(newKey, oldCell); + cellsToDelete.Add(oldKey); + } + if (this.IsEntireRow()) + { + Worksheet.Row(newRow).Height = Worksheet.Row(ro).Height; + } + } + } + } + else + { + foreach ( + XLCell c in + Worksheet.Internals.CellsCollection.GetCells(firstRow, firstColumn, + Worksheet.Internals.CellsCollection.MaxRowUsed, + lastColumn)) + { + int newRow = c.Address.RowNumber + numberOfRows; + var newKey = new XLAddress(Worksheet, newRow, c.Address.ColumnNumber, false, false); + cellsToDelete.Add(c.Address); + c.Address = newKey; + if (newKey.IsValid) + cellsToInsert.Add(newKey, c); + } + } + + cellsToDelete.ForEach(c => Worksheet.Internals.CellsCollection.Remove(c.RowNumber, c.ColumnNumber)); + cellsToInsert.ForEach(c => Worksheet.Internals.CellsCollection.Add(c.Key.RowNumber, c.Key.ColumnNumber, c.Value)); + + Int32 firstRowReturn = RangeAddress.FirstAddress.RowNumber; + Int32 lastRowReturn = RangeAddress.FirstAddress.RowNumber + numberOfRows - 1; + Int32 firstColumnReturn = RangeAddress.FirstAddress.ColumnNumber; + Int32 lastColumnReturn = RangeAddress.LastAddress.ColumnNumber; + + Worksheet.NotifyRangeShiftedRows(AsRange(), numberOfRows); + + var rangeToReturn = Worksheet.Range(firstRowReturn, firstColumnReturn, lastRowReturn, lastColumnReturn); + + // We deliberately ignore conditional formats and data validation here. Their shifting is handled elsewhere + var contentFlags = XLCellsUsedOptions.All + & ~XLCellsUsedOptions.ConditionalFormats + & ~XLCellsUsedOptions.DataValidation; + + if (formatFromAbove && rangeToReturn.RangeAddress.FirstAddress.RowNumber > 1) + { + var fr = rangeToReturn.FirstRow(); + var model = fr.RowAbove(); + var modelFirstColumn = (model as IXLRangeBase).FirstCellUsed(contentFlags); + var modelLastColumn = (model as IXLRangeBase).LastCellUsed(contentFlags); + if (modelFirstColumn != null && modelLastColumn != null) + { + Int32 firstCoReturned = modelFirstColumn.Address.ColumnNumber + - model.RangeAddress.FirstAddress.ColumnNumber + 1; + Int32 lastCoReturned = modelLastColumn.Address.ColumnNumber + - model.RangeAddress.FirstAddress.ColumnNumber + 1; + for (Int32 co = firstCoReturned; co <= lastCoReturned; co++) + { + rangeToReturn.Column(co).Style = model.Cell(co).Style; + } + } + } + else + { + var lastCoUsed = rangeToReturn.LastColumnUsed(contentFlags); + if (lastCoUsed != null) + { + Int32 lastCoReturned = lastCoUsed.ColumnNumber(); + for (Int32 co = 1; co <= lastCoReturned; co++) + { + var styleToUse = + Worksheet.Internals.ColumnsCollection.TryGetValue(co, out XLColumn column) + ? column.Style + : Worksheet.Style; + + rangeToReturn.Style = styleToUse; + } + } + } + + // Skip calling .Rows() for performance reasons if required. + if (nullReturn) + return null; + + return rangeToReturn.Rows(); + } + + private void ClearMerged() + { + var mergeToDelete = Worksheet.Internals.MergedRanges.GetIntersectedRanges(RangeAddress).ToList(); + mergeToDelete.ForEach(m => Worksheet.Internals.MergedRanges.Remove(m)); + } + + public Boolean Contains(IXLCell cell) + { + return Contains((XLAddress)cell.Address); + } + + public bool Contains(XLAddress first, XLAddress last) + { + return Contains(first) && Contains(last); + } + + public bool Contains(XLAddress address) + { + return RangeAddress.Contains(in address); + } + + public void Delete(XLShiftDeletedCells shiftDeleteCells) + { + int numberOfRows = RowCount(); + int numberOfColumns = ColumnCount(); + + if (!RangeAddress.IsValid) return; + + Worksheet.SparklineGroups.Remove(this); + + IXLRange shiftedRangeFormula = Worksheet.Range( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber); + + // Shift formulas first + foreach (var cell in Worksheet + .Workbook + .Worksheets + .Cast() + .SelectMany(ws => ws + .Internals + .CellsCollection + .GetCells(c => c.HasFormula))) + { + if (shiftDeleteCells == XLShiftDeletedCells.ShiftCellsUp) + cell.ShiftFormulaRows((XLRange)shiftedRangeFormula, numberOfRows * -1); + else + cell.ShiftFormulaColumns((XLRange)shiftedRangeFormula, numberOfColumns * -1); + } + + // Range to shift... + var cellsToInsert = new Dictionary(); + var cellsToDelete = new List(); + + Int32 columnModifier = 0; + Int32 rowModifier = 0; + IEnumerable cellsQuery; + switch (shiftDeleteCells) + { + case XLShiftDeletedCells.ShiftCellsLeft: + cellsQuery = Worksheet.Internals.CellsCollection.GetCells( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + Worksheet.Internals.CellsCollection.MaxColumnUsed); + + columnModifier = ColumnCount(); + + break; + + case XLShiftDeletedCells.ShiftCellsUp: + cellsQuery = Worksheet.Internals.CellsCollection.GetCells( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + Worksheet.Internals.CellsCollection.MaxRowUsed, + RangeAddress.LastAddress.ColumnNumber); + + rowModifier = RowCount(); + + break; + + default: + cellsQuery = new XLCell[] { }; + break; + } + + foreach (var c in cellsQuery) + { + // Schedule for removal from CellsCollection + cellsToDelete.Add(c.Address); + + // Generate new cell to insert into CellsCollection + var newCellAddress = new XLAddress(Worksheet, c.Address.RowNumber - rowModifier, + c.Address.ColumnNumber - columnModifier, + fixedRow: false, + fixedColumn: false); + + if (newCellAddress.IsValid) + { + bool canInsert = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsLeft + ? c.Address.ColumnNumber > RangeAddress.LastAddress.ColumnNumber + : c.Address.RowNumber > RangeAddress.LastAddress.RowNumber; + + c.Address = newCellAddress; + + if (canInsert) + cellsToInsert.Add(newCellAddress, c); + } + } + + cellsToDelete.ForEach(c => Worksheet.Internals.CellsCollection.Remove(c.RowNumber, c.ColumnNumber)); + cellsToInsert.ForEach( + c => Worksheet.Internals.CellsCollection.Add(c.Key.RowNumber, c.Key.ColumnNumber, c.Value)); + + var mergesToRemove = Worksheet.Internals.MergedRanges.Where(Contains).ToList(); + mergesToRemove.ForEach(r => Worksheet.Internals.MergedRanges.Remove(r)); + + var hyperlinksToRemove = Worksheet.Hyperlinks.Where(hl => Contains(hl.Cell.AsRange())).ToList(); + hyperlinksToRemove.ForEach(hl => Worksheet.Hyperlinks.Delete(hl)); + + var shiftedRange = AsRange(); + if (shiftDeleteCells == XLShiftDeletedCells.ShiftCellsUp) + Worksheet.NotifyRangeShiftedRows(shiftedRange, rowModifier * -1); + else + Worksheet.NotifyRangeShiftedColumns(shiftedRange, columnModifier * -1); + + Worksheet.DeleteRange(RangeAddress); + } + + public override string ToString() + { + return String.Concat( + Worksheet.Name.EscapeSheetName(), + '!', + RangeAddress.FirstAddress, + ':', + RangeAddress.LastAddress); + } + + protected IXLRangeAddress ShiftColumns(IXLRangeAddress thisRangeAddress, XLRange shiftedRange, int columnsShifted) + { + if (!thisRangeAddress.IsValid || !shiftedRange.RangeAddress.IsValid) return thisRangeAddress; + + bool allRowsAreCovered = thisRangeAddress.FirstAddress.RowNumber >= shiftedRange.RangeAddress.FirstAddress.RowNumber && + thisRangeAddress.LastAddress.RowNumber <= shiftedRange.RangeAddress.LastAddress.RowNumber; + + if (!allRowsAreCovered) + return thisRangeAddress; + + bool shiftLeftBoundary = (columnsShifted > 0 && thisRangeAddress.FirstAddress.ColumnNumber >= shiftedRange.RangeAddress.FirstAddress.ColumnNumber) || + (columnsShifted < 0 && thisRangeAddress.FirstAddress.ColumnNumber > shiftedRange.RangeAddress.FirstAddress.ColumnNumber); + + bool shiftRightBoundary = thisRangeAddress.LastAddress.ColumnNumber >= shiftedRange.RangeAddress.FirstAddress.ColumnNumber; + + int newLeftBoundary = thisRangeAddress.FirstAddress.ColumnNumber; + if (shiftLeftBoundary) + { + if (newLeftBoundary + columnsShifted > shiftedRange.RangeAddress.FirstAddress.ColumnNumber) + newLeftBoundary = newLeftBoundary + columnsShifted; + else + newLeftBoundary = shiftedRange.RangeAddress.FirstAddress.ColumnNumber; + } + + int newRightBoundary = thisRangeAddress.LastAddress.ColumnNumber; + if (shiftRightBoundary) + newRightBoundary += columnsShifted; + + bool destroyedByShift = newRightBoundary < newLeftBoundary; + + var firstAddress = (XLAddress)thisRangeAddress.FirstAddress; + var lastAddress = (XLAddress)thisRangeAddress.LastAddress; + + if (destroyedByShift) + { + firstAddress = Worksheet.InvalidAddress; + lastAddress = Worksheet.InvalidAddress; + Worksheet.DeleteRange(RangeAddress); + } + + if (shiftLeftBoundary) + firstAddress = new XLAddress(Worksheet, + thisRangeAddress.FirstAddress.RowNumber, + newLeftBoundary, + thisRangeAddress.FirstAddress.FixedRow, + thisRangeAddress.FirstAddress.FixedColumn); + + if (shiftRightBoundary) + lastAddress = new XLAddress(Worksheet, + thisRangeAddress.LastAddress.RowNumber, + newRightBoundary, + thisRangeAddress.LastAddress.FixedRow, + thisRangeAddress.LastAddress.FixedColumn); + + return new XLRangeAddress(firstAddress, lastAddress); + } + + protected IXLRangeAddress ShiftRows(IXLRangeAddress thisRangeAddress, XLRange shiftedRange, int rowsShifted) + { + if (!thisRangeAddress.IsValid || !shiftedRange.RangeAddress.IsValid) return thisRangeAddress; + + bool allColumnsAreCovered = thisRangeAddress.FirstAddress.ColumnNumber >= shiftedRange.RangeAddress.FirstAddress.ColumnNumber && + thisRangeAddress.LastAddress.ColumnNumber <= shiftedRange.RangeAddress.LastAddress.ColumnNumber; + + if (!allColumnsAreCovered) + return thisRangeAddress; + + bool shiftTopBoundary = (rowsShifted > 0 && thisRangeAddress.FirstAddress.RowNumber >= shiftedRange.RangeAddress.FirstAddress.RowNumber) || + (rowsShifted < 0 && thisRangeAddress.FirstAddress.RowNumber > shiftedRange.RangeAddress.FirstAddress.RowNumber); + + bool shiftBottomBoundary = thisRangeAddress.LastAddress.RowNumber >= shiftedRange.RangeAddress.FirstAddress.RowNumber; + + int newTopBoundary = thisRangeAddress.FirstAddress.RowNumber; + if (shiftTopBoundary) + { + if (newTopBoundary + rowsShifted > shiftedRange.RangeAddress.FirstAddress.RowNumber) + newTopBoundary = newTopBoundary + rowsShifted; + else + newTopBoundary = shiftedRange.RangeAddress.FirstAddress.RowNumber; + } + + int newBottomBoundary = thisRangeAddress.LastAddress.RowNumber; + if (shiftBottomBoundary) + newBottomBoundary += rowsShifted; + + bool destroyedByShift = newBottomBoundary < newTopBoundary; + + var firstAddress = (XLAddress)thisRangeAddress.FirstAddress; + var lastAddress = (XLAddress)thisRangeAddress.LastAddress; + + if (destroyedByShift) + { + firstAddress = Worksheet.InvalidAddress; + lastAddress = Worksheet.InvalidAddress; + Worksheet.DeleteRange(RangeAddress); + } + + if (shiftTopBoundary) + firstAddress = new XLAddress(Worksheet, + newTopBoundary, + thisRangeAddress.FirstAddress.ColumnNumber, + thisRangeAddress.FirstAddress.FixedRow, + thisRangeAddress.FirstAddress.FixedColumn); + + if (shiftBottomBoundary) + lastAddress = new XLAddress(Worksheet, + newBottomBoundary, + thisRangeAddress.LastAddress.ColumnNumber, + thisRangeAddress.LastAddress.FixedRow, + thisRangeAddress.LastAddress.FixedColumn); + + return new XLRangeAddress(firstAddress, lastAddress); + } + + public IXLRange RangeUsed() + { + return RangeUsed(XLCellsUsedOptions.AllContents); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public IXLRange RangeUsed(bool includeFormats) + { + return RangeUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + public IXLRange RangeUsed(XLCellsUsedOptions options) + { + var firstCell = (this as IXLRangeBase).FirstCellUsed(options); + if (firstCell == null) + return null; + var lastCell = (this as IXLRangeBase).LastCellUsed(options); + return Worksheet.Range(firstCell, lastCell); + } + + public virtual void CopyTo(IXLRangeBase target) + { + CopyTo(target.FirstCell()); + } + + public virtual void CopyTo(IXLCell target) + { + target.Value = this; + } + + //public IXLChart CreateChart(Int32 firstRow, Int32 firstColumn, Int32 lastRow, Int32 lastColumn) + //{ + // IXLChart chart = new XLChartWorksheet; + // chart.FirstRow = firstRow; + // chart.LastRow = lastRow; + // chart.LastColumn = lastColumn; + // chart.FirstColumn = firstColumn; + // Worksheet.Charts.Add(chart); + // return chart; + //} + + IXLPivotTable IXLRangeBase.CreatePivotTable(IXLCell targetCell, String name) + { + return CreatePivotTable(targetCell, name); + } + + public XLPivotTable CreatePivotTable(IXLCell targetCell, String name) + { + return (XLPivotTable)targetCell.Worksheet.PivotTables.Add(name, targetCell, AsRange()); + } + + public virtual IXLAutoFilter SetAutoFilter() + { + return SetAutoFilter(true); + } + + public IXLAutoFilter SetAutoFilter(Boolean value) + { + if (value) + return Worksheet.AutoFilter.Set(this); + else + return Worksheet.AutoFilter.Clear(); + } + + #region Sort + + public IXLSortElements SortRows + { + get { return _sortRows ?? (_sortRows = new XLSortElements()); } + } + + public IXLSortElements SortColumns + { + get { return _sortColumns ?? (_sortColumns = new XLSortElements()); } + } + + private String DefaultSortString() + { + var sb = new StringBuilder(); + Int32 maxColumn = ColumnCount(); + if (maxColumn == XLHelper.MaxColumnNumber) + maxColumn = (this as IXLRangeBase).LastCellUsed(XLCellsUsedOptions.All).Address.ColumnNumber; + for (int i = 1; i <= maxColumn; i++) + { + if (sb.Length > 0) + sb.Append(','); + + sb.Append(i); + } + + return sb.ToString(); + } + + public IXLRangeBase Sort() + { + if (!SortColumns.Any()) + { + return Sort(DefaultSortString()); + } + + SortRangeRows(); + return this; + } + + public IXLRangeBase Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + SortColumns.Clear(); + if (String.IsNullOrWhiteSpace(columnsToSortBy)) + { + columnsToSortBy = DefaultSortString(); + } + + foreach (string coPairTrimmed in columnsToSortBy.Split(',').Select(coPair => coPair.Trim())) + { + String coString; + String order; + if (coPairTrimmed.Contains(' ')) + { + var pair = coPairTrimmed.Split(' '); + coString = pair[0]; + order = pair[1]; + } + else + { + coString = coPairTrimmed; + order = sortOrder == XLSortOrder.Ascending ? "ASC" : "DESC"; + } + + if (!Int32.TryParse(coString, out Int32 co)) + co = XLHelper.GetColumnNumberFromLetter(coString); + + SortColumns.Add(co, String.Compare(order, "ASC", true) == 0 ? XLSortOrder.Ascending : XLSortOrder.Descending, ignoreBlanks, matchCase); + } + + SortRangeRows(); + return this; + } + + public IXLRangeBase Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + return Sort(columnToSortBy.ToString(), sortOrder, matchCase, ignoreBlanks); + } + + public IXLRangeBase SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + SortRows.Clear(); + Int32 maxColumn = ColumnCount(); + if (maxColumn == XLHelper.MaxColumnNumber) + maxColumn = (this as IXLRangeBase).LastCellUsed(XLCellsUsedOptions.All).Address.ColumnNumber; + + for (int i = 1; i <= maxColumn; i++) + { + SortRows.Add(i, sortOrder, ignoreBlanks, matchCase); + } + + SortRangeColumns(); + return this; + } + + #region Sort Rows + + private void SortRangeRows() + { + Int32 maxRow = RowCount(); + if (maxRow == XLHelper.MaxRowNumber) + maxRow = (this as IXLRangeBase).LastCellUsed(XLCellsUsedOptions.All).Address.RowNumber; + + SortingRangeRows(1, maxRow); + } + + private void SwapRows(Int32 row1, Int32 row2) + { + int row1InWs = RangeAddress.FirstAddress.RowNumber + row1 - 1; + int row2InWs = RangeAddress.FirstAddress.RowNumber + row2 - 1; + + Int32 firstColumn = RangeAddress.FirstAddress.ColumnNumber; + Int32 lastColumn = RangeAddress.LastAddress.ColumnNumber; + + var range1Sp1 = new XLSheetPoint(row1InWs, firstColumn); + var range1Sp2 = new XLSheetPoint(row1InWs, lastColumn); + var range2Sp1 = new XLSheetPoint(row2InWs, firstColumn); + var range2Sp2 = new XLSheetPoint(row2InWs, lastColumn); + + Worksheet.Internals.CellsCollection.SwapRanges(new XLSheetRange(range1Sp1, range1Sp2), + new XLSheetRange(range2Sp1, range2Sp2), Worksheet); + } + + private int SortRangeRows(int begPoint, int endPoint) + { + int pivot = begPoint; + int m = begPoint + 1; + int n = endPoint; + while ((m < endPoint) && RowQuick(pivot).CompareTo(RowQuick(m), SortColumns) >= 0) + m++; + + while (n > begPoint && RowQuick(pivot).CompareTo(RowQuick(n), SortColumns) <= 0) + n--; + + while (m < n) + { + SwapRows(m, n); + + while (m < endPoint && RowQuick(pivot).CompareTo(RowQuick(m), SortColumns) >= 0) + m++; + + while (n > begPoint && RowQuick(pivot).CompareTo(RowQuick(n), SortColumns) <= 0) + n--; + } + + if (pivot != n) + SwapRows(n, pivot); + + return n; + } + + private void SortingRangeRows(int beg, int end) + { + if (beg == end) + return; + int pivot = SortRangeRows(beg, end); + if (pivot > beg) + SortingRangeRows(beg, pivot - 1); + if (pivot < end) + SortingRangeRows(pivot + 1, end); + } + + #endregion Sort Rows + + #region Sort Columns + + private void SortRangeColumns() + { + Int32 maxColumn = ColumnCount(); + if (maxColumn == XLHelper.MaxColumnNumber) + maxColumn = (this as IXLRangeBase).LastCellUsed(XLCellsUsedOptions.All).Address.ColumnNumber; + SortingRangeColumns(1, maxColumn); + } + + private void SwapColumns(Int32 column1, Int32 column2) + { + int col1InWs = RangeAddress.FirstAddress.ColumnNumber + column1 - 1; + int col2InWs = RangeAddress.FirstAddress.ColumnNumber + column2 - 1; + + Int32 firstRow = RangeAddress.FirstAddress.RowNumber; + Int32 lastRow = RangeAddress.LastAddress.RowNumber; + + var range1Sp1 = new XLSheetPoint(firstRow, col1InWs); + var range1Sp2 = new XLSheetPoint(lastRow, col1InWs); + var range2Sp1 = new XLSheetPoint(firstRow, col2InWs); + var range2Sp2 = new XLSheetPoint(lastRow, col2InWs); + + Worksheet.Internals.CellsCollection.SwapRanges(new XLSheetRange(range1Sp1, range1Sp2), + new XLSheetRange(range2Sp1, range2Sp2), Worksheet); + } + + private int SortRangeColumns(int begPoint, int endPoint) + { + int pivot = begPoint; + int m = begPoint + 1; + int n = endPoint; + while ((m < endPoint) && ColumnQuick(pivot).CompareTo((ColumnQuick(m)), SortRows) >= 0) + m++; + + while ((n > begPoint) && ((ColumnQuick(pivot)).CompareTo((ColumnQuick(n)), SortRows) <= 0)) + n--; + while (m < n) + { + SwapColumns(m, n); + + while ((m < endPoint) && (ColumnQuick(pivot)).CompareTo((ColumnQuick(m)), SortRows) >= 0) + m++; + + while ((n > begPoint) && (ColumnQuick(pivot)).CompareTo((ColumnQuick(n)), SortRows) <= 0) + n--; + } + if (pivot != n) + SwapColumns(n, pivot); + return n; + } + + private void SortingRangeColumns(int beg, int end) + { + if (end == beg) + return; + int pivot = SortRangeColumns(beg, end); + if (pivot > beg) + SortingRangeColumns(beg, pivot - 1); + if (pivot < end) + SortingRangeColumns(pivot + 1, end); + } + + #endregion Sort Columns + + #endregion Sort + + public XLRangeColumn ColumnQuick(Int32 column) + { + var firstCellAddress = new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber + column - 1, + false, + false); + var lastCellAddress = new XLAddress(Worksheet, + RangeAddress.LastAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber + column - 1, + false, + false); + return Worksheet.RangeColumn(new XLRangeAddress(firstCellAddress, lastCellAddress)); + } + + public XLRangeRow RowQuick(Int32 row) + { + var firstCellAddress = new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber + row - 1, + RangeAddress.FirstAddress.ColumnNumber, + false, + false); + var lastCellAddress = new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber + row - 1, + RangeAddress.LastAddress.ColumnNumber, + false, + false); + + return Worksheet.RangeRow(new XLRangeAddress(firstCellAddress, lastCellAddress)); + } + + public IXLDataValidation SetDataValidation() + { + var existingValidation = GetDataValidation(); + if (existingValidation != null && existingValidation.Ranges.Any(r => r == this)) + return existingValidation; + + IXLDataValidation dataValidationToCopy = Worksheet.DataValidations.GetAllInRange(RangeAddress) + .FirstOrDefault(); + + var newRange = AsRange(); + var dataValidation = new XLDataValidation(newRange); + if (dataValidationToCopy != null) + dataValidation.CopyFrom(dataValidationToCopy); + + Worksheet.DataValidations.Add(dataValidation); + return dataValidation; + } + + public IXLConditionalFormat AddConditionalFormat() + { + var cf = new XLConditionalFormat(AsRange()); + Worksheet.ConditionalFormats.Add(cf); + return cf; + } + + internal IXLConditionalFormat AddConditionalFormat(IXLConditionalFormat source) + { + var cf = new XLConditionalFormat(AsRange()); + cf.CopyFrom(source); + Worksheet.ConditionalFormats.Add(cf); + return cf; + } + + public void Select() + { + Worksheet.SelectedRanges.Add(AsRange()); + } + + public IXLRangeBase Grow() + { + return Grow(1); + } + + public IXLRangeBase Grow(int growCount) + { + var firstRow = Math.Max(1, this.RangeAddress.FirstAddress.RowNumber - growCount); + var firstColumn = Math.Max(1, this.RangeAddress.FirstAddress.ColumnNumber - growCount); + + var lastRow = Math.Min(XLHelper.MaxRowNumber, this.RangeAddress.LastAddress.RowNumber + growCount); + var lastColumn = Math.Min(XLHelper.MaxColumnNumber, this.RangeAddress.LastAddress.ColumnNumber + growCount); + + return this.Worksheet.Range(firstRow, firstColumn, lastRow, lastColumn); + } + + public IXLRangeBase Shrink() + { + return Shrink(1); + } + + public IXLRangeBase Shrink(int shrinkCount) + { + var firstRow = this.RangeAddress.FirstAddress.RowNumber + shrinkCount; + var firstColumn = this.RangeAddress.FirstAddress.ColumnNumber + shrinkCount; + + var lastRow = this.RangeAddress.LastAddress.RowNumber - shrinkCount; + var lastColumn = this.RangeAddress.LastAddress.ColumnNumber - shrinkCount; + + if (firstRow > lastRow || firstColumn > lastColumn) + return null; + + return this.Worksheet.Range(firstRow, firstColumn, lastRow, lastColumn); + } + + public IXLRangeAddress Intersection(IXLRangeBase otherRange, Func thisRangePredicate = null, Func otherRangePredicate = null) + { + if (otherRange == null) + return null; + + if (!this.Worksheet.Equals(otherRange.Worksheet)) + return null; + + if (thisRangePredicate == null && otherRangePredicate == null) + { + // Special case, no predicates. We can optimise this a bit then. + return this.RangeAddress.Intersection(otherRange.RangeAddress); + } + else + { + thisRangePredicate = thisRangePredicate ?? (c => true); + otherRangePredicate = otherRangePredicate ?? (c => true); + + var intersectionCells = this.Cells(c => thisRangePredicate(c) && otherRange.Cells(otherRangePredicate).Contains(c)); + + if (!intersectionCells.Any()) + return null; + + var firstRow = intersectionCells.Min(c => c.Address.RowNumber); + var firstColumn = intersectionCells.Min(c => c.Address.ColumnNumber); + + var lastRow = intersectionCells.Max(c => c.Address.RowNumber); + var lastColumn = intersectionCells.Max(c => c.Address.ColumnNumber); + + return new XLRangeAddress + ( + new XLAddress(this.Worksheet, firstRow, firstColumn, fixedRow: false, fixedColumn: false), + new XLAddress(this.Worksheet, lastRow, lastColumn, fixedRow: false, fixedColumn: false) + ); + } + } + + public IXLCells SurroundingCells(Func predicate = null) + { + var cells = new XLCells(false, XLCellsUsedOptions.AllContents, predicate); + this.Grow().Cells(c => !this.Contains(c)).ForEach(c => cells.Add(c as XLCell)); + return cells; + } + + public IXLCells Union(IXLRangeBase otherRange, Func thisRangePredicate = null, Func otherRangePredicate = null) + { + if (otherRange == null) + return this.Cells(thisRangePredicate); + + var cells = new XLCells(false, XLCellsUsedOptions.AllContents); + if (!this.Worksheet.Equals(otherRange.Worksheet)) + return cells; + + if (thisRangePredicate == null) thisRangePredicate = c => true; + if (otherRangePredicate == null) otherRangePredicate = c => true; + + this.Cells(thisRangePredicate).Concat(otherRange.Cells(otherRangePredicate)).Distinct().ForEach(c => cells.Add(c as XLCell)); + return cells; + } + + public IXLCells Difference(IXLRangeBase otherRange, Func thisRangePredicate = null, Func otherRangePredicate = null) + { + if (otherRange == null) + return this.Cells(thisRangePredicate); + + var cells = new XLCells(false, XLCellsUsedOptions.AllContents); + if (!this.Worksheet.Equals(otherRange.Worksheet)) + return cells; + + if (thisRangePredicate == null) thisRangePredicate = c => true; + if (otherRangePredicate == null) otherRangePredicate = c => true; + + this.Cells(c => thisRangePredicate(c) && !otherRange.Cells(otherRangePredicate).Contains(c)).ForEach(c => cells.Add(c as XLCell)); + return cells; + } + } +} diff --git a/ClosedXML/Excel/Ranges/XLRangeColumn.cs b/ClosedXML/Excel/Ranges/XLRangeColumn.cs new file mode 100644 index 0000000..97ee3dd --- /dev/null +++ b/ClosedXML/Excel/Ranges/XLRangeColumn.cs @@ -0,0 +1,392 @@ +using System; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLRangeColumn : XLRangeBase, IXLRangeColumn + { + #region Constructor + + /// + /// The direct contructor should only be used in . + /// + public XLRangeColumn(XLRangeParameters rangeParameters) + : base(rangeParameters.RangeAddress, (rangeParameters.DefaultStyle as XLStyle).Value) + { + } + + #endregion Constructor + + #region IXLRangeColumn Members + + IXLCell IXLRangeColumn.Cell(int rowNumber) + { + return Cell(rowNumber); + } + + public override IXLCells Cells(string cellsInColumn) + { + var retVal = new XLCells(false, XLCellsUsedOptions.AllContents); + var rangePairs = cellsInColumn.Split(','); + foreach (string pair in rangePairs) + retVal.Add(Range(pair.Trim()).RangeAddress); + return retVal; + } + + public IXLCells Cells(int firstRow, int lastRow) + { + return Cells(firstRow + ":" + lastRow); + } + + public void Delete() + { + Delete(true); + } + + internal void Delete(Boolean deleteTableField) + { + if (deleteTableField && IsTableColumn()) + { + var table = Table as XLTable; + var firstCellValue = Cell(1).Value.ToString(); + if (!table.FieldNames.ContainsKey(firstCellValue)) + throw new ArgumentException(string.Format("Field {0} not found.", firstCellValue)); + + var field = table.Fields.Cast().Single(f => f.Name == firstCellValue); + field.Delete(false); + } + + Delete(XLShiftDeletedCells.ShiftCellsLeft); + } + + public IXLCells InsertCellsAbove(int numberOfRows) + { + return InsertCellsAbove(numberOfRows, false); + } + + public IXLCells InsertCellsAbove(int numberOfRows, bool expandRange) + { + return InsertRowsAbove(numberOfRows, expandRange).Cells(); + } + + public IXLCells InsertCellsBelow(int numberOfRows) + { + return InsertCellsBelow(numberOfRows, true); + } + + public IXLCells InsertCellsBelow(int numberOfRows, bool expandRange) + { + return InsertRowsBelow(numberOfRows, expandRange).Cells(); + } + + public int CellCount() + { + return RangeAddress.LastAddress.RowNumber - RangeAddress.FirstAddress.RowNumber + 1; + } + + public IXLRangeColumn Sort(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + base.Sort(1, sortOrder, matchCase, ignoreBlanks); + return this; + } + + public new IXLRangeColumn CopyTo(IXLCell target) + { + base.CopyTo(target); + + int lastRowNumber = target.Address.RowNumber + RowCount() - 1; + if (lastRowNumber > XLHelper.MaxRowNumber) + lastRowNumber = XLHelper.MaxRowNumber; + int lastColumnNumber = target.Address.ColumnNumber + ColumnCount() - 1; + if (lastColumnNumber > XLHelper.MaxColumnNumber) + lastColumnNumber = XLHelper.MaxColumnNumber; + + return target.Worksheet.Range( + target.Address.RowNumber, + target.Address.ColumnNumber, + lastRowNumber, + lastColumnNumber) + .Column(1); + } + + public new IXLRangeColumn CopyTo(IXLRangeBase target) + { + base.CopyTo(target); + + int lastRowNumber = target.RangeAddress.FirstAddress.RowNumber + RowCount() - 1; + if (lastRowNumber > XLHelper.MaxRowNumber) + lastRowNumber = XLHelper.MaxRowNumber; + int lastColumnNumber = target.RangeAddress.FirstAddress.ColumnNumber + ColumnCount() - 1; + if (lastColumnNumber > XLHelper.MaxColumnNumber) + lastColumnNumber = XLHelper.MaxColumnNumber; + + return target.Worksheet.Range( + target.RangeAddress.FirstAddress.RowNumber, + target.RangeAddress.FirstAddress.ColumnNumber, + lastRowNumber, + lastColumnNumber) + .Column(1); + } + + public IXLRangeColumn Column(int start, int end) + { + return Range(start, end).FirstColumn(); + } + + public IXLRangeColumn Column(IXLCell start, IXLCell end) + { + return Column(start.Address.RowNumber, end.Address.RowNumber); + } + + public IXLRangeColumns Columns(string columns) + { + var retVal = new XLRangeColumns(); + var rowPairs = columns.Split(','); + foreach (string trimmedPair in rowPairs.Select(pair => pair.Trim())) + { + string firstRow; + string lastRow; + if (trimmedPair.Contains(':') || trimmedPair.Contains('-')) + { + var rowRange = trimmedPair.Split(':', '-'); + + firstRow = rowRange[0]; + lastRow = rowRange[1]; + } + else + { + firstRow = trimmedPair; + lastRow = trimmedPair; + } + + retVal.Add(Range(firstRow, lastRow).FirstColumn()); + } + + return retVal; + } + + public IXLRangeColumn SetDataType(XLDataType dataType) + { + DataType = dataType; + return this; + } + + public IXLColumn WorksheetColumn() + { + return Worksheet.Column(RangeAddress.FirstAddress.ColumnNumber); + } + + #endregion IXLRangeColumn Members + + public override XLRangeType RangeType + { + get { return XLRangeType.RangeColumn; } + } + + public XLCell Cell(int row) + { + return Cell(row, 1); + } + + internal override void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted) + { + RangeAddress = (XLRangeAddress)ShiftColumns(RangeAddress, range, columnsShifted); + } + + internal override void WorksheetRangeShiftedRows(XLRange range, int rowsShifted) + { + RangeAddress = (XLRangeAddress)ShiftRows(RangeAddress, range, rowsShifted); + } + + public XLRange Range(int firstRow, int lastRow) + { + return Range(firstRow, 1, lastRow, 1); + } + + public override XLRange Range(string rangeAddressStr) + { + string rangeAddressToUse; + if (rangeAddressStr.Contains(':') || rangeAddressStr.Contains('-')) + { + if (rangeAddressStr.Contains('-')) + rangeAddressStr = rangeAddressStr.Replace('-', ':'); + + var arrRange = rangeAddressStr.Split(':'); + string firstPart = arrRange[0]; + string secondPart = arrRange[1]; + rangeAddressToUse = FixColumnAddress(firstPart) + ":" + FixColumnAddress(secondPart); + } + else + rangeAddressToUse = FixColumnAddress(rangeAddressStr); + + var rangeAddress = new XLRangeAddress(Worksheet, rangeAddressToUse); + return Range(rangeAddress); + } + + public int CompareTo(XLRangeColumn otherColumn, IXLSortElements rowsToSort) + { + foreach (IXLSortElement e in rowsToSort) + { + var thisCell = Cell(e.ElementNumber); + var otherCell = otherColumn.Cell(e.ElementNumber); + int comparison; + bool thisCellIsBlank = thisCell.IsEmpty(); + bool otherCellIsBlank = otherCell.IsEmpty(); + if (e.IgnoreBlanks && (thisCellIsBlank || otherCellIsBlank)) + { + if (thisCellIsBlank && otherCellIsBlank) + comparison = 0; + else + { + if (thisCellIsBlank) + comparison = e.SortOrder == XLSortOrder.Ascending ? 1 : -1; + else + comparison = e.SortOrder == XLSortOrder.Ascending ? -1 : 1; + } + } + else + { + if (thisCell.DataType == otherCell.DataType) + { + if (thisCell.DataType == XLDataType.Text) + { + comparison = e.MatchCase + ? thisCell.InnerText.CompareTo(otherCell.InnerText) + : String.Compare(thisCell.InnerText, otherCell.InnerText, true); + } + else if (thisCell.DataType == XLDataType.TimeSpan) + comparison = thisCell.GetTimeSpan().CompareTo(otherCell.GetTimeSpan()); + else + comparison = Double.Parse(thisCell.InnerText, XLHelper.NumberStyle, XLHelper.ParseCulture).CompareTo(Double.Parse(otherCell.InnerText, XLHelper.NumberStyle, XLHelper.ParseCulture)); + } + else if (e.MatchCase) + comparison = String.Compare(thisCell.GetString(), otherCell.GetString(), true); + else + comparison = thisCell.GetString().CompareTo(otherCell.GetString()); + } + + if (comparison != 0) + return e.SortOrder == XLSortOrder.Ascending ? comparison : comparison * -1; + } + + return 0; + } + + private XLRangeColumn ColumnShift(Int32 columnsToShift) + { + Int32 columnNumber = ColumnNumber() + columnsToShift; + return Worksheet.Range( + RangeAddress.FirstAddress.RowNumber, + columnNumber, + RangeAddress.LastAddress.RowNumber, + columnNumber).FirstColumn(); + } + + #region XLRangeColumn Left + + IXLRangeColumn IXLRangeColumn.ColumnLeft() + { + return ColumnLeft(); + } + + IXLRangeColumn IXLRangeColumn.ColumnLeft(Int32 step) + { + return ColumnLeft(step); + } + + public XLRangeColumn ColumnLeft() + { + return ColumnLeft(1); + } + + public XLRangeColumn ColumnLeft(Int32 step) + { + return ColumnShift(step * -1); + } + + #endregion XLRangeColumn Left + + #region XLRangeColumn Right + + IXLRangeColumn IXLRangeColumn.ColumnRight() + { + return ColumnRight(); + } + + IXLRangeColumn IXLRangeColumn.ColumnRight(Int32 step) + { + return ColumnRight(step); + } + + public XLRangeColumn ColumnRight() + { + return ColumnRight(1); + } + + public XLRangeColumn ColumnRight(Int32 step) + { + return ColumnShift(step); + } + + #endregion XLRangeColumn Right + + public IXLTable AsTable() + { + if (IsTableColumn()) + throw new InvalidOperationException("This column is already part of a table."); + + return AsRange().AsTable(); + } + + public IXLTable AsTable(string name) + { + if (IsTableColumn()) + throw new InvalidOperationException("This column is already part of a table."); + + return AsRange().AsTable(name); + } + + public IXLTable CreateTable() + { + if (IsTableColumn()) + throw new InvalidOperationException("This column is already part of a table."); + + return AsRange().CreateTable(); + } + + public IXLTable CreateTable(string name) + { + if (IsTableColumn()) + throw new InvalidOperationException("This column is already part of a table."); + + return AsRange().CreateTable(name); + } + + public new IXLRangeColumn Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + base.Clear(clearOptions); + return this; + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public IXLRangeColumn ColumnUsed(Boolean includeFormats) + { + return ColumnUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + public IXLRangeColumn ColumnUsed(XLCellsUsedOptions options = XLCellsUsedOptions.AllContents) + { + return Column((this as IXLRangeBase).FirstCellUsed(options), + (this as IXLRangeBase).LastCellUsed(options)); + } + + internal IXLTable Table { get; set; } + + public Boolean IsTableColumn() + { + return Table != null; + } + } +} diff --git a/ClosedXML/Excel/Ranges/XLRangeColumns.cs b/ClosedXML/Excel/Ranges/XLRangeColumns.cs new file mode 100644 index 0000000..cedf4a1 --- /dev/null +++ b/ClosedXML/Excel/Ranges/XLRangeColumns.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections; + + internal class XLRangeColumns : XLStylizedBase, IXLRangeColumns, IXLStylized + { + private readonly List _ranges = new List(); + + public XLRangeColumns() : base(XLWorkbook.DefaultStyleValue) + { + } + + #region IXLRangeColumns Members + + public IXLRangeColumns Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + _ranges.ForEach(c => c.Clear(clearOptions)); + return this; + } + + public void Delete() + { + _ranges.OrderByDescending(c => c.ColumnNumber()).ForEach(r => r.Delete()); + _ranges.Clear(); + } + + public void Add(IXLRangeColumn range) + { + _ranges.Add((XLRangeColumn)range); + } + + public IEnumerator GetEnumerator() + { + return _ranges.Cast() + .OrderBy(r => r.Worksheet.Position) + .ThenBy(r => r.ColumnNumber()) + .GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLCells Cells() + { + var cells = new XLCells(usedCellsOnly: false, options: XLCellsUsedOptions.AllContents); + foreach (XLRangeColumn container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed() + { + var cells = new XLCells(usedCellsOnly: true, options: XLCellsUsedOptions.AllContents); + foreach (XLRangeColumn container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public IXLCells CellsUsed(Boolean includeFormats) + { + return CellsUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents + ); + } + + public IXLCells CellsUsed(XLCellsUsedOptions options) + { + var cells = new XLCells(usedCellsOnly: true, options: options); + foreach (XLRangeColumn container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLRangeColumns SetDataType(XLDataType dataType) + { + _ranges.ForEach(c => c.DataType = dataType); + return this; + } + + #endregion IXLRangeColumns Members + + #region IXLStylized Members + + public override IEnumerable Styles + { + get + { + yield return Style; + foreach (XLRangeColumn rng in _ranges) + { + yield return rng.Style; + foreach (XLCell r in rng.Worksheet.Internals.CellsCollection.GetCells( + rng.RangeAddress.FirstAddress.RowNumber, + rng.RangeAddress.FirstAddress.ColumnNumber, + rng.RangeAddress.LastAddress.RowNumber, + rng.RangeAddress.LastAddress.ColumnNumber)) + yield return r.Style; + } + } + } + + protected override IEnumerable Children + { + get + { + foreach (var range in _ranges) + yield return range; + } + } + + public override IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges(); + this.ForEach(c => retVal.Add(c.AsRange())); + return retVal; + } + } + + #endregion IXLStylized Members + + public void Select() + { + foreach (var range in this) + range.Select(); + } + } +} diff --git a/ClosedXML/Excel/Ranges/XLRangeConsolidationEngine.cs b/ClosedXML/Excel/Ranges/XLRangeConsolidationEngine.cs new file mode 100644 index 0000000..8eb04a0 --- /dev/null +++ b/ClosedXML/Excel/Ranges/XLRangeConsolidationEngine.cs @@ -0,0 +1,217 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + /// + /// Engine for ranges consolidation. Supports IXLRanges including ranges from either one or multiple worksheets. + /// + internal class XLRangeConsolidationEngine + { + #region Public Constructors + + public XLRangeConsolidationEngine(IXLRanges ranges) + { + if (ranges == null) + throw new ArgumentNullException(nameof(ranges)); + _allRanges = ranges; + } + + #endregion Public Constructors + + #region Public Methods + + public IXLRanges Consolidate() + { + if (!_allRanges.Any()) + return _allRanges; + + var worksheets = _allRanges.Select(r => r.Worksheet).Distinct().OrderBy(ws => ws.Position); + + IXLRanges retVal = new XLRanges(); + foreach (var ws in worksheets) + { + var matrix = new XLRangeConsolidationMatrix(ws, _allRanges.Where(r => r.Worksheet == ws)); + var consRanges = matrix.GetConsolidatedRanges(); + foreach (var consRange in consRanges) + { + retVal.Add(consRange); + } + } + + return retVal; + } + + #endregion Public Methods + + #region Private Fields + + private readonly IXLRanges _allRanges; + + #endregion Private Fields + + #region Private Classes + + /// + /// Class representing the area covering ranges to be consolidated as a set of bit matrices. Does all the dirty job + /// of ranges consolidation. + /// + private class XLRangeConsolidationMatrix + { + #region Public Constructors + + /// + /// Constructor. + /// + /// Current worksheet. + /// Ranges to be consolidated. They are expected to belong to the current worksheet, no check is performed. + public XLRangeConsolidationMatrix(IXLWorksheet worksheet, IEnumerable ranges) + { + _worksheet = worksheet; + PrepareBitMatrix(ranges); + FillBitMatrix(ranges); + } + + #endregion Public Constructors + + #region Public Methods + + /// + /// Get consolidated ranges equivalent to the input ones. + /// + public IEnumerable GetConsolidatedRanges() + { + var rowNumbers = _bitMatrix.Keys.OrderBy(k => k).ToArray(); + for (int i = 0; i < rowNumbers.Length; i++) + { + var startRow = rowNumbers[i]; + var startings = GetRangesBoundariesStartingByRow(_bitMatrix[startRow]); + + foreach (var starting in startings) + { + int j = i + 1; + while (j < rowNumbers.Length && RowIncludesRange(_bitMatrix[rowNumbers[j]], starting)) j++; + + var endRow = rowNumbers[j - 1]; + var startColumn = starting.Item1 + _minColumn - 1; + var endColumn = starting.Item2 + _minColumn - 1; + + yield return _worksheet.Range(startRow, startColumn, endRow, endColumn); + + while (j > i) + { + ClearRangeInRow(_bitMatrix[rowNumbers[j - 1]], starting); + j--; + } + } + } + } + + #endregion Public Methods + + #region Private Fields + + private readonly IXLWorksheet _worksheet; + private Dictionary _bitMatrix; + private int _maxColumn = 0; + private int _minColumn = XLHelper.MaxColumnNumber + 1; + + #endregion Private Fields + + #region Private Methods + + private void AddToBitMatrix(IXLRangeAddress rangeAddress) + { + var rows = _bitMatrix.Keys + .Where(k => k >= rangeAddress.FirstAddress.RowNumber && + k <= rangeAddress.LastAddress.RowNumber); + + var minIndex = rangeAddress.FirstAddress.ColumnNumber - _minColumn + 1; + var maxIndex = rangeAddress.LastAddress.ColumnNumber - _minColumn + 1; + + foreach (var rowNum in rows) + { + for (int i = minIndex; i <= maxIndex; i++) + { + _bitMatrix[rowNum][i] = true; + } + } + } + + private void ClearRangeInRow(BitArray rowArray, Tuple rangeBoundaries) + { + for (int i = rangeBoundaries.Item1; i <= rangeBoundaries.Item2; i++) + { + rowArray[i] = false; + } + } + + private void FillBitMatrix(IEnumerable ranges) + { + foreach (var range in ranges) + { + AddToBitMatrix(range.RangeAddress); + } + + System.Diagnostics.Debug.Assert( + _bitMatrix.Values.All(r => r[0] == false && r[r.Length - 1] == false)); + } + + private IEnumerable> GetRangesBoundariesStartingByRow(BitArray rowArray) + { + int startIdx = 0; + for (int i = 1; i < rowArray.Length - 1; i++) + { + if (!rowArray[i - 1] && rowArray[i]) + startIdx = i; + if (rowArray[i] && !rowArray[i + 1]) + yield return new Tuple(startIdx, i); + } + } + + private void PrepareBitMatrix(IEnumerable ranges) + { + _bitMatrix = new Dictionary(); + foreach (var range in ranges) + { + var address = range.RangeAddress; + _minColumn = (_minColumn <= address.FirstAddress.ColumnNumber) + ? _minColumn + : address.FirstAddress.ColumnNumber; + _maxColumn = (_maxColumn >= address.LastAddress.ColumnNumber) + ? _maxColumn + : address.LastAddress.ColumnNumber; + + if (!_bitMatrix.ContainsKey(address.FirstAddress.RowNumber)) + _bitMatrix.Add(address.FirstAddress.RowNumber, null); + if (!_bitMatrix.ContainsKey(address.LastAddress.RowNumber)) + _bitMatrix.Add(address.LastAddress.RowNumber, null); + if (!_bitMatrix.ContainsKey(address.LastAddress.RowNumber + 1)) + _bitMatrix.Add(address.LastAddress.RowNumber + 1, null); + } + + var keys = _bitMatrix.Keys.ToList(); + foreach (var rowNum in keys) + { + _bitMatrix[rowNum] = new BitArray(_maxColumn - _minColumn + 3, false); + } + } + private bool RowIncludesRange(BitArray rowArray, Tuple rangeBoundaries) + { + for (int i = rangeBoundaries.Item1; i <= rangeBoundaries.Item2; i++) + { + if (!rowArray[i]) + return false; + } + + return true; + } + + #endregion Private Methods + } + + #endregion Private Classes + } +} diff --git a/ClosedXML/Excel/Ranges/XLRangeFactory.cs b/ClosedXML/Excel/Ranges/XLRangeFactory.cs new file mode 100644 index 0000000..b3ded64 --- /dev/null +++ b/ClosedXML/Excel/Ranges/XLRangeFactory.cs @@ -0,0 +1,89 @@ +using System; + +namespace ClosedXML.Excel +{ + internal class XLRangeFactory + { + #region Properties + + public XLWorksheet Worksheet { get; private set; } + + #endregion Properties + + #region Constructors + + public XLRangeFactory(XLWorksheet worksheet) + { + if (worksheet == null) + throw new ArgumentNullException(nameof(worksheet)); + Worksheet = worksheet; + } + + #endregion Constructors + + #region Methods + + public XLRangeBase Create(XLRangeKey key) + { + switch (key.RangeType) + { + case XLRangeType.Range: + return CreateRange(key.RangeAddress); + + case XLRangeType.Column: + return CreateColumn(key.RangeAddress.FirstAddress.ColumnNumber); + + case XLRangeType.Row: + return CreateColumn(key.RangeAddress.FirstAddress.RowNumber); + + case XLRangeType.RangeColumn: + return CreateRangeColumn(key.RangeAddress); + + case XLRangeType.RangeRow: + return CreateRangeRow(key.RangeAddress); + + case XLRangeType.Table: + return CreateTable(key.RangeAddress); + + case XLRangeType.Worksheet: + default: + throw new NotImplementedException(key.RangeType.ToString()); + } + } + + public XLRange CreateRange(XLRangeAddress rangeAddress) + { + var xlRangeParameters = new XLRangeParameters(rangeAddress, Worksheet.Style); + return new XLRange(xlRangeParameters); + } + + public XLColumn CreateColumn(int columnNumber) + { + return new XLColumn(Worksheet, columnNumber); + } + + public XLRow CreateRow(int rowNumber) + { + return new XLRow(Worksheet, rowNumber); + } + + public XLRangeColumn CreateRangeColumn(XLRangeAddress rangeAddress) + { + var xlRangeParameters = new XLRangeParameters(rangeAddress, Worksheet.Style); + return new XLRangeColumn(xlRangeParameters); + } + + public XLRangeRow CreateRangeRow(XLRangeAddress rangeAddress) + { + var xlRangeParameters = new XLRangeParameters(rangeAddress, Worksheet.Style); + return new XLRangeRow(xlRangeParameters); + } + + public XLTable CreateTable(XLRangeAddress rangeAddress) + { + return new XLTable(new XLRangeParameters(rangeAddress, Worksheet.Style)); + } + + #endregion Methods + } +} diff --git a/ClosedXML/Excel/Ranges/XLRangeKey.cs b/ClosedXML/Excel/Ranges/XLRangeKey.cs new file mode 100644 index 0000000..8fb4842 --- /dev/null +++ b/ClosedXML/Excel/Ranges/XLRangeKey.cs @@ -0,0 +1,60 @@ +using System; + +namespace ClosedXML.Excel +{ + [System.Diagnostics.DebuggerDisplay("{RangeType} {RangeAddress}")] + internal struct XLRangeKey : IEquatable + { + public XLRangeType RangeType { get; private set; } + + public XLRangeAddress RangeAddress { get; private set; } + + public XLRangeKey(XLRangeType rangeType, XLRangeAddress address) + { + RangeType = rangeType; + RangeAddress = address; + } + + #region Overrides + + /// Indicates whether the current object is equal to another object of the same type. + /// true if the current object is equal to the parameter; otherwise, false. + /// An object to compare with this object. + public bool Equals(XLRangeKey other) + { + return RangeType == other.RangeType && + RangeAddress.Equals(other.RangeAddress); + } + + /// Indicates whether this instance and a specified object are equal. + /// true if and this instance are the same type and represent the same value; otherwise, false. + /// Another object to compare to. + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + return obj is XLRangeKey && Equals((XLRangeKey)obj); + } + + /// Returns the hash code for this instance. + /// A 32-bit signed integer that is the hash code for this instance. + public override int GetHashCode() + { + unchecked + { + return ((int)RangeType * 397) ^ RangeAddress.GetHashCode(); + } + } + + public static bool operator ==(XLRangeKey left, XLRangeKey right) + { + return left.Equals(right); + } + + public static bool operator !=(XLRangeKey left, XLRangeKey right) + { + return !(left == right); + } + + #endregion Overrides + } +} diff --git a/ClosedXML/Excel/Ranges/XLRangeParameters.cs b/ClosedXML/Excel/Ranges/XLRangeParameters.cs new file mode 100644 index 0000000..2c93bab --- /dev/null +++ b/ClosedXML/Excel/Ranges/XLRangeParameters.cs @@ -0,0 +1,22 @@ +namespace ClosedXML.Excel +{ + internal class XLRangeParameters + { + #region Constructor + + public XLRangeParameters(XLRangeAddress rangeAddress, IXLStyle defaultStyle) + { + RangeAddress = rangeAddress; + DefaultStyle = defaultStyle; + } + + #endregion + + #region Properties + + public XLRangeAddress RangeAddress { get; private set; } + + public IXLStyle DefaultStyle { get; private set; } + #endregion + } +} diff --git a/ClosedXML/Excel/Ranges/XLRangeRow.cs b/ClosedXML/Excel/Ranges/XLRangeRow.cs new file mode 100644 index 0000000..f8d0de9 --- /dev/null +++ b/ClosedXML/Excel/Ranges/XLRangeRow.cs @@ -0,0 +1,372 @@ +namespace ClosedXML.Excel +{ + using System; + using System.Linq; + + internal class XLRangeRow : XLRangeBase, IXLRangeRow + { + #region Constructor + + /// + /// The direct contructor should only be used in . + /// + public XLRangeRow(XLRangeParameters rangeParameters) + : base(rangeParameters.RangeAddress, (rangeParameters.DefaultStyle as XLStyle).Value) + { + } + + #endregion Constructor + + #region IXLRangeRow Members + + public IXLCell Cell(int column) + { + return Cell(1, column); + } + + public override XLCell Cell(string columnLetter) + { + return Cell(1, columnLetter); + } + + IXLCell IXLRangeRow.Cell(string columnLetter) + { + return Cell(columnLetter); + } + + public void Delete() + { + Delete(XLShiftDeletedCells.ShiftCellsUp); + } + + public IXLCells InsertCellsAfter(int numberOfColumns) + { + return InsertCellsAfter(numberOfColumns, true); + } + + public IXLCells InsertCellsAfter(int numberOfColumns, bool expandRange) + { + return InsertColumnsAfter(numberOfColumns, expandRange).Cells(); + } + + public IXLCells InsertCellsBefore(int numberOfColumns) + { + return InsertCellsBefore(numberOfColumns, false); + } + + public IXLCells InsertCellsBefore(int numberOfColumns, bool expandRange) + { + return InsertColumnsBefore(numberOfColumns, expandRange).Cells(); + } + + public override IXLCells Cells(string cellsInRow) + { + var retVal = new XLCells(false, XLCellsUsedOptions.AllContents); + var rangePairs = cellsInRow.Split(','); + foreach (string pair in rangePairs) + retVal.Add(Range(pair.Trim()).RangeAddress); + return retVal; + } + + public IXLCells Cells(int firstColumn, int lastColumn) + { + return Cells(firstColumn + ":" + lastColumn); + } + + public IXLCells Cells(string firstColumn, string lastColumn) + { + return Cells(XLHelper.GetColumnNumberFromLetter(firstColumn) + ":" + + XLHelper.GetColumnNumberFromLetter(lastColumn)); + } + + public int CellCount() + { + return RangeAddress.LastAddress.ColumnNumber - RangeAddress.FirstAddress.ColumnNumber + 1; + } + + public new IXLRangeRow Sort() + { + return SortLeftToRight(); + } + + public new IXLRangeRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + base.SortLeftToRight(sortOrder, matchCase, ignoreBlanks); + return this; + } + + public new IXLRangeRow CopyTo(IXLCell target) + { + base.CopyTo(target); + + int lastRowNumber = target.Address.RowNumber + RowCount() - 1; + if (lastRowNumber > XLHelper.MaxRowNumber) + lastRowNumber = XLHelper.MaxRowNumber; + int lastColumnNumber = target.Address.ColumnNumber + ColumnCount() - 1; + if (lastColumnNumber > XLHelper.MaxColumnNumber) + lastColumnNumber = XLHelper.MaxColumnNumber; + + return target.Worksheet.Range( + target.Address.RowNumber, + target.Address.ColumnNumber, + lastRowNumber, + lastColumnNumber) + .Row(1); + } + + public new IXLRangeRow CopyTo(IXLRangeBase target) + { + base.CopyTo(target); + int lastRowNumber = target.RangeAddress.FirstAddress.RowNumber + RowCount() - 1; + if (lastRowNumber > XLHelper.MaxRowNumber) + lastRowNumber = XLHelper.MaxRowNumber; + int lastColumnNumber = target.RangeAddress.LastAddress.ColumnNumber + ColumnCount() - 1; + if (lastColumnNumber > XLHelper.MaxColumnNumber) + lastColumnNumber = XLHelper.MaxColumnNumber; + + return target.Worksheet.Range( + target.RangeAddress.FirstAddress.RowNumber, + target.RangeAddress.LastAddress.ColumnNumber, + lastRowNumber, + lastColumnNumber) + .Row(1); + } + + public IXLRangeRow Row(int start, int end) + { + return Range(1, start, 1, end).Row(1); + } + + public IXLRangeRow Row(IXLCell start, IXLCell end) + { + return Row(start.Address.ColumnNumber, end.Address.ColumnNumber); + } + + public IXLRangeRows Rows(string rows) + { + var retVal = new XLRangeRows(); + var columnPairs = rows.Split(','); + foreach (string trimmedPair in columnPairs.Select(pair => pair.Trim())) + { + string firstColumn; + string lastColumn; + if (trimmedPair.Contains(':') || trimmedPair.Contains('-')) + { + var columnRange = trimmedPair.Contains('-') + ? trimmedPair.Replace('-', ':').Split(':') + : trimmedPair.Split(':'); + firstColumn = columnRange[0]; + lastColumn = columnRange[1]; + } + else + { + firstColumn = trimmedPair; + lastColumn = trimmedPair; + } + + retVal.Add(Range(firstColumn, lastColumn).FirstRow()); + } + + return retVal; + } + + public IXLRangeRow SetDataType(XLDataType dataType) + { + DataType = dataType; + return this; + } + + public IXLRow WorksheetRow() + { + return Worksheet.Row(RangeAddress.FirstAddress.RowNumber); + } + + #endregion IXLRangeRow Members + public override XLRangeType RangeType + { + get { return XLRangeType.RangeRow; } + } + + internal override void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted) + { + RangeAddress = (XLRangeAddress)ShiftColumns(RangeAddress, range, columnsShifted); + } + + internal override void WorksheetRangeShiftedRows(XLRange range, int rowsShifted) + { + RangeAddress = (XLRangeAddress)ShiftRows(RangeAddress, range, rowsShifted); + } + + public IXLRange Range(int firstColumn, int lastColumn) + { + return Range(1, firstColumn, 1, lastColumn); + } + + public override XLRange Range(string rangeAddressStr) + { + string rangeAddressToUse; + if (rangeAddressStr.Contains(':') || rangeAddressStr.Contains('-')) + { + if (rangeAddressStr.Contains('-')) + rangeAddressStr = rangeAddressStr.Replace('-', ':'); + + var arrRange = rangeAddressStr.Split(':'); + string firstPart = arrRange[0]; + string secondPart = arrRange[1]; + rangeAddressToUse = FixRowAddress(firstPart) + ":" + FixRowAddress(secondPart); + } + else + rangeAddressToUse = FixRowAddress(rangeAddressStr); + + var rangeAddress = new XLRangeAddress(Worksheet, rangeAddressToUse); + return Range(rangeAddress); + } + + public int CompareTo(XLRangeRow otherRow, IXLSortElements columnsToSort) + { + foreach (IXLSortElement e in columnsToSort) + { + var thisCell = (XLCell)Cell(e.ElementNumber); + var otherCell = (XLCell)otherRow.Cell(e.ElementNumber); + int comparison; + bool thisCellIsBlank = thisCell.IsEmpty(); + bool otherCellIsBlank = otherCell.IsEmpty(); + if (e.IgnoreBlanks && (thisCellIsBlank || otherCellIsBlank)) + { + if (thisCellIsBlank && otherCellIsBlank) + comparison = 0; + else + { + if (thisCellIsBlank) + comparison = e.SortOrder == XLSortOrder.Ascending ? 1 : -1; + else + comparison = e.SortOrder == XLSortOrder.Ascending ? -1 : 1; + } + } + else + { + if (thisCell.DataType == otherCell.DataType) + { + switch (thisCell.DataType) + { + case XLDataType.Text: + comparison = e.MatchCase + ? thisCell.InnerText.CompareTo(otherCell.InnerText) + : String.Compare(thisCell.InnerText, otherCell.InnerText, true); + break; + + case XLDataType.TimeSpan: + comparison = thisCell.GetTimeSpan().CompareTo(otherCell.GetTimeSpan()); + break; + + case XLDataType.DateTime: + comparison = thisCell.GetDateTime().CompareTo(otherCell.GetDateTime()); + break; + + case XLDataType.Number: + comparison = thisCell.GetDouble().CompareTo(otherCell.GetDouble()); + break; + + case XLDataType.Boolean: + comparison = thisCell.GetBoolean().CompareTo(otherCell.GetBoolean()); + break; + + default: + throw new NotImplementedException(); + } + } + else if (e.MatchCase) + comparison = String.Compare(thisCell.GetString(), otherCell.GetString(), true); + else + comparison = thisCell.GetString().CompareTo(otherCell.GetString()); + } + + if (comparison != 0) + return e.SortOrder == XLSortOrder.Ascending ? comparison : -comparison; + } + + return 0; + } + + private XLRangeRow RowShift(Int32 rowsToShift) + { + Int32 rowNum = RowNumber() + rowsToShift; + + var range = Worksheet.Range( + rowNum, + RangeAddress.FirstAddress.ColumnNumber, + rowNum, + RangeAddress.LastAddress.ColumnNumber); + + return range.FirstRow(); + } + + #region XLRangeRow Above + + IXLRangeRow IXLRangeRow.RowAbove() + { + return RowAbove(); + } + + IXLRangeRow IXLRangeRow.RowAbove(Int32 step) + { + return RowAbove(step); + } + + public XLRangeRow RowAbove() + { + return RowAbove(1); + } + + public XLRangeRow RowAbove(Int32 step) + { + return RowShift(step * -1); + } + + #endregion XLRangeRow Above + + #region XLRangeRow Below + + IXLRangeRow IXLRangeRow.RowBelow() + { + return RowBelow(); + } + + IXLRangeRow IXLRangeRow.RowBelow(Int32 step) + { + return RowBelow(step); + } + + public XLRangeRow RowBelow() + { + return RowBelow(1); + } + + public XLRangeRow RowBelow(Int32 step) + { + return RowShift(step); + } + + #endregion XLRangeRow Below + + public new IXLRangeRow Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + base.Clear(clearOptions); + return this; + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public IXLRangeRow RowUsed(Boolean includeFormats) + { + return RowUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + public IXLRangeRow RowUsed(XLCellsUsedOptions options = XLCellsUsedOptions.AllContents) + { + return Row((this as IXLRangeBase).FirstCellUsed(options), + (this as IXLRangeBase).LastCellUsed(options)); + } + } +} diff --git a/ClosedXML/Excel/Ranges/XLRangeRows.cs b/ClosedXML/Excel/Ranges/XLRangeRows.cs new file mode 100644 index 0000000..ba1e5ed --- /dev/null +++ b/ClosedXML/Excel/Ranges/XLRangeRows.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections; + + internal class XLRangeRows : XLStylizedBase, IXLRangeRows, IXLStylized + { + private readonly List _ranges = new List(); + + public XLRangeRows() : base(XLStyle.Default.Value) + { + } + + #region IXLRangeRows Members + + public IXLRangeRows Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + _ranges.ForEach(c => c.Clear(clearOptions)); + return this; + } + + public void Delete() + { + _ranges.OrderByDescending(r => r.RowNumber()).ForEach(r => r.Delete()); + _ranges.Clear(); + } + + public void Add(IXLRangeRow range) + { + _ranges.Add((XLRangeRow)range); + } + + public IEnumerator GetEnumerator() + { + return _ranges.Cast() + .OrderBy(r => r.Worksheet.Position) + .ThenBy(r => r.RowNumber()) + .GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLCells Cells() + { + var cells = new XLCells(false, XLCellsUsedOptions.AllContents); + foreach (XLRangeRow container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed() + { + var cells = new XLCells(true, XLCellsUsedOptions.AllContents); + foreach (XLRangeRow container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public IXLCells CellsUsed(Boolean includeFormats) + { + return CellsUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + public IXLCells CellsUsed(XLCellsUsedOptions options) + { + var cells = new XLCells(true, options); + foreach (XLRangeRow container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLRangeRows SetDataType(XLDataType dataType) + { + _ranges.ForEach(c => c.DataType = dataType); + return this; + } + + #endregion IXLRangeRows Members + + #region IXLStylized Members + + public override IEnumerable Styles + { + get + { + yield return Style; + foreach (XLRangeRow rng in _ranges) + { + yield return rng.Style; + foreach (XLCell r in rng.Worksheet.Internals.CellsCollection.GetCells( + rng.RangeAddress.FirstAddress.RowNumber, + rng.RangeAddress.FirstAddress.ColumnNumber, + rng.RangeAddress.LastAddress.RowNumber, + rng.RangeAddress.LastAddress.ColumnNumber)) + yield return r.Style; + } + } + } + + protected override IEnumerable Children + { + get + { + foreach (var range in _ranges) + yield return range; + } + } + + + public override IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges(); + this.ForEach(c => retVal.Add(c.AsRange())); + return retVal; + } + } + + #endregion IXLStylized Members + + public void Select() + { + foreach (var range in this) + range.Select(); + } + } +} diff --git a/ClosedXML/Excel/Ranges/XLRangeType.cs b/ClosedXML/Excel/Ranges/XLRangeType.cs new file mode 100644 index 0000000..1042d86 --- /dev/null +++ b/ClosedXML/Excel/Ranges/XLRangeType.cs @@ -0,0 +1,13 @@ +namespace ClosedXML.Excel +{ + internal enum XLRangeType : byte + { + Range = 0, + Column = 1, + Row = 2, + RangeColumn = 3, + RangeRow = 4, + Table = 5, + Worksheet = 6 + } +} diff --git a/ClosedXML/Excel/Ranges/XLRanges.cs b/ClosedXML/Excel/Ranges/XLRanges.cs new file mode 100644 index 0000000..ea2f98b --- /dev/null +++ b/ClosedXML/Excel/Ranges/XLRanges.cs @@ -0,0 +1,319 @@ +using ClosedXML.Excel.Ranges.Index; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections; + + internal class XLRanges : XLStylizedBase, IXLRanges, IXLStylized + { + /// + /// Normally, XLRanges collection includes ranges from a single worksheet, but not necessarily. + /// + private readonly Dictionary> _indexes; + private IEnumerable Ranges => _indexes.Values.SelectMany(index => index.GetAll()); + private bool _styleInitialized = false; + + private IXLRangeIndex GetRangeIndex(IXLWorksheet worksheet) + { + if (!_indexes.TryGetValue(worksheet, out IXLRangeIndex rangeIndex)) + { + rangeIndex = new XLRangeIndex(worksheet); + _indexes.Add(worksheet, rangeIndex); + } + + return rangeIndex; + } + + public XLRanges() : base(XLWorkbook.DefaultStyleValue) + { + _indexes = new Dictionary>(); + } + + #region IXLRanges Members + + public IXLRanges Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + Ranges.ForEach(c => c.Clear(clearOptions)); + return this; + } + + public void Add(XLRange range) + { + if (GetRangeIndex(range.Worksheet).Add(range)) + Count++; + + if (_styleInitialized) + return; + + var worksheetStyle = range?.Worksheet?.Style; + if (worksheetStyle == null) + return; + + InnerStyle = worksheetStyle; + _styleInitialized = true; + } + + public void Add(IXLRangeBase range) + { + Add(range.AsRange() as XLRange); + } + + public void Add(IXLCell cell) + { + Add(cell.AsRange()); + } + + public bool Remove(IXLRange range) + { + if (GetRangeIndex(range.Worksheet).Remove(range.RangeAddress)) + { + Count--; + return true; + } + + return false; + } + + /// + /// Removes ranges matching the criteria from the collection, optionally releasing their event handlers. + /// + /// Criteria to filter ranges. Only those ranges that satisfy the criteria will be removed. + /// Null means the entire collection should be cleared. + /// Specify whether or not should removed ranges be unsubscribed from + /// row/column shifting events. Until ranges are unsubscribed they cannot be collected by GC. + public void RemoveAll(Predicate match = null, bool releaseEventHandlers = true) + { + foreach (var index in _indexes.Values) + { + Count -= index.RemoveAll(match ?? (_ => true)); + } + } + + public int Count { get; private set; } + + public IEnumerator GetEnumerator() + { + return Ranges + .OrderBy(r => r.Worksheet.Position) + .ThenBy(r => r.RangeAddress.FirstAddress.RowNumber) + .ThenBy(r => r.RangeAddress.FirstAddress.ColumnNumber) + .Cast() + .GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public Boolean Contains(IXLCell cell) + { + return GetIntersectedRanges((XLAddress)cell.Address).Any(); + } + + public Boolean Contains(IXLRange range) + { + return GetIntersectedRanges((XLRangeAddress)range.RangeAddress) + .Any(r => r.Contains(range)); + } + + /// + /// Filter ranges from a collection that intersect the specified address. Is much more efficient + /// that using Linq expression .Where(). + /// + public IEnumerable GetIntersectedRanges(IXLRangeAddress rangeAddress) + { + var xlRangeAddress = (XLRangeAddress)rangeAddress; + return GetIntersectedRanges(in xlRangeAddress); + } + + internal IEnumerable GetIntersectedRanges(in XLRangeAddress rangeAddress) + { + return GetRangeIndex(rangeAddress.Worksheet) + .GetIntersectedRanges(rangeAddress); + } + + /// + /// Filter ranges from a collection that intersect the specified address. Is much more efficient + /// that using Linq expression .Where(). + /// + public IEnumerable GetIntersectedRanges(IXLAddress address) + { + var xlAddress = (XLAddress)address; + return GetIntersectedRanges(in xlAddress); + } + + internal IEnumerable GetIntersectedRanges(in XLAddress address) + { + return GetRangeIndex(address.Worksheet) + .GetIntersectedRanges(address); + } + + public IEnumerable GetIntersectedRanges(IXLCell cell) + { + return GetIntersectedRanges(cell.Address); + } + + public IEnumerable DataValidation + { + get { return Ranges.Select(range => range.DataValidation).Where(dv => dv != null); } + } + + public IXLRanges AddToNamed(String rangeName) + { + return AddToNamed(rangeName, XLScope.Workbook); + } + + public IXLRanges AddToNamed(String rangeName, XLScope scope) + { + return AddToNamed(rangeName, XLScope.Workbook, null); + } + + public IXLRanges AddToNamed(String rangeName, XLScope scope, String comment) + { + Ranges.ForEach(r => r.AddToNamed(rangeName, scope, comment)); + return this; + } + + public Object Value + { + set { Ranges.ForEach(r => r.Value = value); } + } + + public IXLRanges SetValue(T value) + { + Ranges.ForEach(r => r.SetValue(value)); + return this; + } + + public IXLCells Cells() + { + var cells = new XLCells(false, XLCellsUsedOptions.AllContents); + foreach (XLRange container in Ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed() + { + var cells = new XLCells(true, XLCellsUsedOptions.AllContents); + foreach (XLRange container in Ranges) + cells.Add(container.RangeAddress); + return cells; + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public IXLCells CellsUsed(Boolean includeFormats) + { + return CellsUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + public IXLCells CellsUsed(XLCellsUsedOptions options) + { + var cells = new XLCells(true, options); + foreach (XLRange container in Ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLRanges SetDataType(XLDataType dataType) + { + Ranges.ForEach(c => c.DataType = dataType); + return this; + } + + #endregion IXLRanges Members + + #region IXLStylized Members + + public override IEnumerable Styles + { + get + { + yield return Style; + foreach (XLRange rng in Ranges) + { + yield return rng.Style; + foreach (XLCell r in rng.Worksheet.Internals.CellsCollection.GetCells( + rng.RangeAddress.FirstAddress.RowNumber, + rng.RangeAddress.FirstAddress.ColumnNumber, + rng.RangeAddress.LastAddress.RowNumber, + rng.RangeAddress.LastAddress.ColumnNumber)) + yield return r.Style; + } + } + } + + protected override IEnumerable Children + { + get + { + foreach (XLRange rng in Ranges) + yield return rng; + } + } + + public override IXLRanges RangesUsed + { + get { return this; } + } + + #endregion IXLStylized Members + + public override string ToString() + { + String retVal = Ranges.Aggregate(String.Empty, (agg, r) => agg + (r.ToString() + ",")); + if (retVal.Length > 0) retVal = retVal.Substring(0, retVal.Length - 1); + return retVal; + } + + public override bool Equals(object obj) + { + return Equals(obj as XLRanges); + } + + public bool Equals(XLRanges other) + { + if (other == null) + return false; + + return Ranges.Count() == other.Ranges.Count() && + Ranges.Select(thisRange => Enumerable.Contains(other.Ranges, thisRange)).All(foundOne => foundOne); + } + + public override int GetHashCode() + { + return Ranges.Aggregate(0, (current, r) => current ^ r.GetHashCode()); + } + + public IXLDataValidation SetDataValidation() + { + var firstRange = Ranges.First(); + var dataValidation = new XLDataValidation(firstRange); + foreach (var range in Ranges.Skip(1)) + { + dataValidation.AddRange(range); + } + + firstRange.Worksheet.DataValidations.Add(dataValidation); + return dataValidation; + } + + public void Select() + { + foreach (var range in this) + range.Select(); + } + + public IXLRanges Consolidate() + { + var engine = new XLRangeConsolidationEngine(this); + return engine.Consolidate(); + } + } +} diff --git a/ClosedXML/Excel/RichText/IXLFormattedText.cs b/ClosedXML/Excel/RichText/IXLFormattedText.cs new file mode 100644 index 0000000..3180bee --- /dev/null +++ b/ClosedXML/Excel/RichText/IXLFormattedText.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLFormattedText : IEnumerable, IEquatable>, IXLWithRichString + { + Boolean Bold { set; } + Boolean Italic { set; } + XLFontUnderlineValues Underline { set; } + Boolean Strikethrough { set; } + XLFontVerticalTextAlignmentValues VerticalAlignment { set; } + Boolean Shadow { set; } + Double FontSize { set; } + XLColor FontColor { set; } + String FontName { set; } + XLFontFamilyNumberingValues FontFamilyNumbering { set; } + + IXLFormattedText SetBold(); IXLFormattedText SetBold(Boolean value); + IXLFormattedText SetItalic(); IXLFormattedText SetItalic(Boolean value); + IXLFormattedText SetUnderline(); IXLFormattedText SetUnderline(XLFontUnderlineValues value); + IXLFormattedText SetStrikethrough(); IXLFormattedText SetStrikethrough(Boolean value); + IXLFormattedText SetVerticalAlignment(XLFontVerticalTextAlignmentValues value); + IXLFormattedText SetShadow(); IXLFormattedText SetShadow(Boolean value); + IXLFormattedText SetFontSize(Double value); + IXLFormattedText SetFontColor(XLColor value); + IXLFormattedText SetFontName(String value); + IXLFormattedText SetFontFamilyNumbering(XLFontFamilyNumberingValues value); + + IXLRichString AddText(String text, IXLFontBase font); + IXLFormattedText ClearText(); + IXLFormattedText ClearFont(); + IXLFormattedText Substring(Int32 index); + IXLFormattedText Substring(Int32 index, Int32 length); + Int32 Count { get; } + Int32 Length { get; } + + String Text { get; } + IXLPhonetics Phonetics { get; } + Boolean HasPhonetics { get; } + } +} diff --git a/ClosedXML/Excel/RichText/IXLPhonetic.cs b/ClosedXML/Excel/RichText/IXLPhonetic.cs new file mode 100644 index 0000000..56e20f9 --- /dev/null +++ b/ClosedXML/Excel/RichText/IXLPhonetic.cs @@ -0,0 +1,11 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLPhonetic: IEquatable + { + String Text { get; set; } + Int32 Start { get; set; } + Int32 End { get; set; } + } +} diff --git a/ClosedXML/Excel/RichText/IXLPhonetics.cs b/ClosedXML/Excel/RichText/IXLPhonetics.cs new file mode 100644 index 0000000..67cd96d --- /dev/null +++ b/ClosedXML/Excel/RichText/IXLPhonetics.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public enum XLPhoneticAlignment { Center, Distributed, Left, NoControl } + public enum XLPhoneticType { FullWidthKatakana, HalfWidthKatakana, Hiragana, NoConversion } + public interface IXLPhonetics : IXLFontBase, IEnumerable, IEquatable + { + IXLPhonetics SetBold(); IXLPhonetics SetBold(Boolean value); + IXLPhonetics SetItalic(); IXLPhonetics SetItalic(Boolean value); + IXLPhonetics SetUnderline(); IXLPhonetics SetUnderline(XLFontUnderlineValues value); + IXLPhonetics SetStrikethrough(); IXLPhonetics SetStrikethrough(Boolean value); + IXLPhonetics SetVerticalAlignment(XLFontVerticalTextAlignmentValues value); + IXLPhonetics SetShadow(); IXLPhonetics SetShadow(Boolean value); + IXLPhonetics SetFontSize(Double value); + IXLPhonetics SetFontColor(XLColor value); + IXLPhonetics SetFontName(String value); + IXLPhonetics SetFontFamilyNumbering(XLFontFamilyNumberingValues value); + IXLPhonetics SetFontCharSet(XLFontCharSet value); + + IXLPhonetics Add(String text, Int32 start, Int32 end); + IXLPhonetics ClearText(); + IXLPhonetics ClearFont(); + Int32 Count { get; } + + XLPhoneticAlignment Alignment { get; set; } + XLPhoneticType Type { get; set; } + + IXLPhonetics SetAlignment(XLPhoneticAlignment phoneticAlignment); + IXLPhonetics SetType(XLPhoneticType phoneticType); + } +} diff --git a/ClosedXML/Excel/RichText/IXLRichString.cs b/ClosedXML/Excel/RichText/IXLRichString.cs new file mode 100644 index 0000000..a090460 --- /dev/null +++ b/ClosedXML/Excel/RichText/IXLRichString.cs @@ -0,0 +1,27 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLWithRichString + { + IXLRichString AddText(String text); + IXLRichString AddNewLine(); + } + public interface IXLRichString: IXLFontBase, IEquatable, IXLWithRichString + { + String Text { get; set; } + + + IXLRichString SetBold(); IXLRichString SetBold(Boolean value); + IXLRichString SetItalic(); IXLRichString SetItalic(Boolean value); + IXLRichString SetUnderline(); IXLRichString SetUnderline(XLFontUnderlineValues value); + IXLRichString SetStrikethrough(); IXLRichString SetStrikethrough(Boolean value); + IXLRichString SetVerticalAlignment(XLFontVerticalTextAlignmentValues value); + IXLRichString SetShadow(); IXLRichString SetShadow(Boolean value); + IXLRichString SetFontSize(Double value); + IXLRichString SetFontColor(XLColor value); + IXLRichString SetFontName(String value); + IXLRichString SetFontFamilyNumbering(XLFontFamilyNumberingValues value); + IXLRichString SetFontCharSet(XLFontCharSet value); + } +} diff --git a/ClosedXML/Excel/RichText/IXLRichText.cs b/ClosedXML/Excel/RichText/IXLRichText.cs new file mode 100644 index 0000000..46efd41 --- /dev/null +++ b/ClosedXML/Excel/RichText/IXLRichText.cs @@ -0,0 +1,9 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLRichText : IXLFormattedText + { + } +} diff --git a/ClosedXML/Excel/RichText/XLFormattedText.cs b/ClosedXML/Excel/RichText/XLFormattedText.cs new file mode 100644 index 0000000..3748478 --- /dev/null +++ b/ClosedXML/Excel/RichText/XLFormattedText.cs @@ -0,0 +1,189 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLFormattedText: IXLFormattedText + { + List _richTexts = new List(); + + protected T Container; + readonly IXLFontBase _defaultFont; + public XLFormattedText(IXLFontBase defaultFont) + { + Length = 0; + _defaultFont = defaultFont; + } + + public XLFormattedText(IXLFormattedText defaultRichText, IXLFontBase defaultFont) + : this(defaultFont) + { + foreach (var rt in defaultRichText) + AddText(rt.Text, rt); + if (defaultRichText.HasPhonetics) + { + _phonetics = new XLPhonetics(defaultRichText.Phonetics, defaultFont); + } + } + + public XLFormattedText(String text, IXLFontBase defaultFont) + :this(defaultFont) + { + AddText(text); + } + + public Int32 Count { get { return _richTexts.Count; } } + public int Length { get; private set; } + + public IXLRichString AddText(String text) + { + return AddText(text, _defaultFont); + } + public IXLRichString AddText(String text, IXLFontBase font) + { + var richText = new XLRichString(text, font, this); + return AddText(richText); + } + + public IXLRichString AddText(IXLRichString richText) + { + _richTexts.Add(richText); + Length += richText.Text.Length; + return richText; + } + + public IXLRichString AddNewLine() + { + return AddText(Environment.NewLine); + } + + public IXLFormattedText ClearText() + { + _richTexts.Clear(); + Length = 0; + return this; + } + public IXLFormattedText ClearFont() + { + String text = Text; + ClearText(); + AddText(text); + return this; + } + + public override string ToString() + { + var sb = new StringBuilder(_richTexts.Count); + _richTexts.ForEach(rt => sb.Append(rt.Text)); + return sb.ToString(); + } + + public IXLFormattedText Substring(Int32 index) + { + return Substring(index, Length - index); + } + public IXLFormattedText Substring(Int32 index, Int32 length) + { + if (index + 1 > Length || (Length - index + 1) < length || length <= 0) + throw new IndexOutOfRangeException("Index and length must refer to a location within the string."); + + List newRichTexts = new List(); + var retVal = new XLFormattedText(_defaultFont); + + Int32 lastPosition = 0; + foreach (var rt in _richTexts) + { + if (lastPosition >= index + 1 + length) // We already have what we need + { + newRichTexts.Add(rt); + } + else if (lastPosition + rt.Text.Length >= index + 1) // Eureka! + { + Int32 startIndex = index - lastPosition; + + if (startIndex > 0) + newRichTexts.Add(new XLRichString(rt.Text.Substring(0, startIndex), rt, this)); + else if (startIndex < 0) + startIndex = 0; + + Int32 leftToTake = length - retVal.Length; + if (leftToTake > rt.Text.Length - startIndex) + leftToTake = rt.Text.Length - startIndex; + + XLRichString newRt = new XLRichString(rt.Text.Substring(startIndex, leftToTake), rt, this); + newRichTexts.Add(newRt); + retVal.AddText(newRt); + + if (startIndex + leftToTake < rt.Text.Length) + newRichTexts.Add(new XLRichString(rt.Text.Substring(startIndex + leftToTake), rt, this)); + } + else // We haven't reached the desired position yet + { + newRichTexts.Add(rt); + } + lastPosition += rt.Text.Length; + } + _richTexts = newRichTexts; + return retVal; + } + + public IEnumerator GetEnumerator() + { + return _richTexts.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public Boolean Bold { set { _richTexts.ForEach(rt => rt.Bold = value); } } + public Boolean Italic { set { _richTexts.ForEach(rt => rt.Italic = value); } } + public XLFontUnderlineValues Underline { set { _richTexts.ForEach(rt => rt.Underline = value); } } + public Boolean Strikethrough { set { _richTexts.ForEach(rt => rt.Strikethrough = value); } } + public XLFontVerticalTextAlignmentValues VerticalAlignment { set { _richTexts.ForEach(rt => rt.VerticalAlignment = value); } } + public Boolean Shadow { set { _richTexts.ForEach(rt => rt.Shadow = value); } } + public Double FontSize { set { _richTexts.ForEach(rt => rt.FontSize = value); } } + public XLColor FontColor { set { _richTexts.ForEach(rt => rt.FontColor = value); } } + public String FontName { set { _richTexts.ForEach(rt => rt.FontName = value); } } + public XLFontFamilyNumberingValues FontFamilyNumbering { set { _richTexts.ForEach(rt => rt.FontFamilyNumbering = value); } } + + public IXLFormattedText SetBold() { Bold = true; return this; } public IXLFormattedText SetBold(Boolean value) { Bold = value; return this; } + public IXLFormattedText SetItalic() { Italic = true; return this; } public IXLFormattedText SetItalic(Boolean value) { Italic = value; return this; } + public IXLFormattedText SetUnderline() { Underline = XLFontUnderlineValues.Single; return this; } public IXLFormattedText SetUnderline(XLFontUnderlineValues value) { Underline = value; return this; } + public IXLFormattedText SetStrikethrough() { Strikethrough = true; return this; } public IXLFormattedText SetStrikethrough(Boolean value) { Strikethrough = value; return this; } + public IXLFormattedText SetVerticalAlignment(XLFontVerticalTextAlignmentValues value) { VerticalAlignment = value; return this; } + public IXLFormattedText SetShadow() { Shadow = true; return this; } public IXLFormattedText SetShadow(Boolean value) { Shadow = value; return this; } + public IXLFormattedText SetFontSize(Double value) { FontSize = value; return this; } + public IXLFormattedText SetFontColor(XLColor value) { FontColor = value; return this; } + public IXLFormattedText SetFontName(String value) { FontName = value; return this; } + public IXLFormattedText SetFontFamilyNumbering(XLFontFamilyNumberingValues value) { FontFamilyNumbering = value; return this; } + + public bool Equals(IXLFormattedText other) + { + Int32 count = Count; + if (count != other.Count) + return false; + + for (Int32 i = 0; i < count; i++) + { + if (_richTexts.ElementAt(i) != other.ElementAt(i)) + return false; + } + + return _phonetics == null || Phonetics.Equals(other.Phonetics); + } + + public String Text { get { return ToString(); } } + + private IXLPhonetics _phonetics; + public IXLPhonetics Phonetics + { + get { return _phonetics ?? (_phonetics = new XLPhonetics(_defaultFont)); } + } + + public Boolean HasPhonetics { get { return _phonetics != null; } } + } +} diff --git a/ClosedXML/Excel/RichText/XLPhonetic.cs b/ClosedXML/Excel/RichText/XLPhonetic.cs new file mode 100644 index 0000000..253a24f --- /dev/null +++ b/ClosedXML/Excel/RichText/XLPhonetic.cs @@ -0,0 +1,25 @@ +using System; + +namespace ClosedXML.Excel +{ + internal class XLPhonetic: IXLPhonetic + { + public XLPhonetic(String text, Int32 start, Int32 end) + { + Text = text; + Start = start; + End = end; + } + public String Text { get; set; } + public Int32 Start { get; set; } + public Int32 End { get; set; } + + public bool Equals(IXLPhonetic other) + { + if (other == null) + return false; + + return Text == other.Text && Start == other.Start && End == other.End; + } + } +} diff --git a/ClosedXML/Excel/RichText/XLPhonetics.cs b/ClosedXML/Excel/RichText/XLPhonetics.cs new file mode 100644 index 0000000..b048267 --- /dev/null +++ b/ClosedXML/Excel/RichText/XLPhonetics.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLPhonetics : IXLPhonetics + { + private readonly List _phonetics = new List(); + + private readonly IXLFontBase _defaultFont; + + public XLPhonetics(IXLFontBase defaultFont) + { + _defaultFont = defaultFont; + Type = XLPhoneticType.FullWidthKatakana; + Alignment = XLPhoneticAlignment.Left; + this.CopyFont(_defaultFont); + } + + public XLPhonetics(IXLPhonetics defaultPhonetics, IXLFontBase defaultFont) + { + _defaultFont = defaultFont; + Type = defaultPhonetics.Type; + Alignment = defaultPhonetics.Alignment; + + this.CopyFont(defaultPhonetics); + } + + public Boolean Bold { get; set; } + public Boolean Italic { get; set; } + public XLFontUnderlineValues Underline { get; set; } + public Boolean Strikethrough { get; set; } + public XLFontVerticalTextAlignmentValues VerticalAlignment { get; set; } + public Boolean Shadow { get; set; } + public Double FontSize { get; set; } + public XLColor FontColor { get; set; } + public String FontName { get; set; } + public XLFontFamilyNumberingValues FontFamilyNumbering { get; set; } + public XLFontCharSet FontCharSet { get; set; } + + public IXLPhonetics SetBold() { Bold = true; return this; } + + public IXLPhonetics SetBold(Boolean value) { Bold = value; return this; } + + public IXLPhonetics SetItalic() { Italic = true; return this; } + + public IXLPhonetics SetItalic(Boolean value) { Italic = value; return this; } + + public IXLPhonetics SetUnderline() { Underline = XLFontUnderlineValues.Single; return this; } + + public IXLPhonetics SetUnderline(XLFontUnderlineValues value) { Underline = value; return this; } + + public IXLPhonetics SetStrikethrough() { Strikethrough = true; return this; } + + public IXLPhonetics SetStrikethrough(Boolean value) { Strikethrough = value; return this; } + + public IXLPhonetics SetVerticalAlignment(XLFontVerticalTextAlignmentValues value) { VerticalAlignment = value; return this; } + + public IXLPhonetics SetShadow() { Shadow = true; return this; } + + public IXLPhonetics SetShadow(Boolean value) { Shadow = value; return this; } + + public IXLPhonetics SetFontSize(Double value) { FontSize = value; return this; } + + public IXLPhonetics SetFontColor(XLColor value) { FontColor = value; return this; } + + public IXLPhonetics SetFontName(String value) { FontName = value; return this; } + + public IXLPhonetics SetFontFamilyNumbering(XLFontFamilyNumberingValues value) { FontFamilyNumbering = value; return this; } + + public IXLPhonetics SetFontCharSet(XLFontCharSet value) { FontCharSet = value; return this; } + + public IXLPhonetics Add(String text, Int32 start, Int32 end) + { + _phonetics.Add(new XLPhonetic(text, start, end)); + return this; + } + + public IXLPhonetics ClearText() + { + _phonetics.Clear(); + return this; + } + + public IXLPhonetics ClearFont() + { + this.CopyFont(_defaultFont); + return this; + } + + public Int32 Count { get { return _phonetics.Count; } } + + public XLPhoneticAlignment Alignment { get; set; } + public XLPhoneticType Type { get; set; } + + public IXLPhonetics SetAlignment(XLPhoneticAlignment phoneticAlignment) { Alignment = phoneticAlignment; return this; } + + public IXLPhonetics SetType(XLPhoneticType phoneticType) { Type = phoneticType; return this; } + + public IEnumerator GetEnumerator() + { + return _phonetics.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public bool Equals(IXLPhonetics other) + { + if (other == null) + return false; + + Int32 phoneticsCount = _phonetics.Count; + for (Int32 i = 0; i < phoneticsCount; i++) + { + if (!_phonetics[i].Equals(other.ElementAt(i))) + return false; + } + + return + Bold == other.Bold + && Italic == other.Italic + && Underline == other.Underline + && Strikethrough == other.Strikethrough + && VerticalAlignment == other.VerticalAlignment + && Shadow == other.Shadow + && FontSize == other.FontSize + && FontColor.Equals(other.FontColor) + && FontName == other.FontName + && FontFamilyNumbering == other.FontFamilyNumbering; + } + } +} diff --git a/ClosedXML/Excel/RichText/XLRichString.cs b/ClosedXML/Excel/RichText/XLRichString.cs new file mode 100644 index 0000000..5a82aab --- /dev/null +++ b/ClosedXML/Excel/RichText/XLRichString.cs @@ -0,0 +1,159 @@ +using System; +using System.Diagnostics; + +namespace ClosedXML.Excel +{ + [DebuggerDisplay("{Text}")] + internal class XLRichString : IXLRichString + { + private IXLWithRichString _withRichString; + + public XLRichString(String text, IXLFontBase font, IXLWithRichString withRichString) + { + Text = text; + this.CopyFont(font); + _withRichString = withRichString; + } + + public String Text { get; set; } + + public IXLRichString AddText(String text) + { + return _withRichString.AddText(text); + } + + public IXLRichString AddNewLine() + { + return AddText(Environment.NewLine); + } + + public Boolean Bold { get; set; } + public Boolean Italic { get; set; } + public XLFontUnderlineValues Underline { get; set; } + public Boolean Strikethrough { get; set; } + public XLFontVerticalTextAlignmentValues VerticalAlignment { get; set; } + public Boolean Shadow { get; set; } + public Double FontSize { get; set; } + public XLColor FontColor { get; set; } + public String FontName { get; set; } + public XLFontFamilyNumberingValues FontFamilyNumbering { get; set; } + public XLFontCharSet FontCharSet { get; set; } + + public IXLRichString SetBold() + { + Bold = true; return this; + } + + public IXLRichString SetBold(Boolean value) + { + Bold = value; return this; + } + + public IXLRichString SetItalic() + { + Italic = true; return this; + } + + public IXLRichString SetItalic(Boolean value) + { + Italic = value; return this; + } + + public IXLRichString SetUnderline() + { + Underline = XLFontUnderlineValues.Single; return this; + } + + public IXLRichString SetUnderline(XLFontUnderlineValues value) + { + Underline = value; return this; + } + + public IXLRichString SetStrikethrough() + { + Strikethrough = true; return this; + } + + public IXLRichString SetStrikethrough(Boolean value) + { + Strikethrough = value; return this; + } + + public IXLRichString SetVerticalAlignment(XLFontVerticalTextAlignmentValues value) + { + VerticalAlignment = value; return this; + } + + public IXLRichString SetShadow() + { + Shadow = true; return this; + } + + public IXLRichString SetShadow(Boolean value) + { + Shadow = value; return this; + } + + public IXLRichString SetFontSize(Double value) + { + FontSize = value; return this; + } + + public IXLRichString SetFontColor(XLColor value) + { + FontColor = value; return this; + } + + public IXLRichString SetFontName(String value) + { + FontName = value; return this; + } + + public IXLRichString SetFontFamilyNumbering(XLFontFamilyNumberingValues value) + { + FontFamilyNumbering = value; return this; + } + + public IXLRichString SetFontCharSet(XLFontCharSet value) + { + FontCharSet = value; return this; + } + + public Boolean Equals(IXLRichString other) + { + return + Text == other.Text + && Bold.Equals(other.Bold) + && Italic.Equals(other.Italic) + && Underline.Equals(other.Underline) + && Strikethrough.Equals(other.Strikethrough) + && VerticalAlignment.Equals(other.VerticalAlignment) + && Shadow.Equals(other.Shadow) + && FontSize.Equals(other.FontSize) + && FontColor.Equals(other.FontColor) + && FontName.Equals(other.FontName) + && FontFamilyNumbering.Equals(other.FontFamilyNumbering) + ; + } + + public override bool Equals(object obj) + { + return Equals((XLRichString)obj); + } + + public override int GetHashCode() + { + return Text.GetHashCode() + ^ Bold.GetHashCode() + ^ Italic.GetHashCode() + ^ (Int32)Underline + ^ Strikethrough.GetHashCode() + ^ (Int32)VerticalAlignment + ^ Shadow.GetHashCode() + ^ FontSize.GetHashCode() + ^ FontColor.GetHashCode() + ^ FontName.GetHashCode() + ^ (Int32)FontFamilyNumbering; + } + } +} diff --git a/ClosedXML/Excel/RichText/XLRichText.cs b/ClosedXML/Excel/RichText/XLRichText.cs new file mode 100644 index 0000000..aaad29a --- /dev/null +++ b/ClosedXML/Excel/RichText/XLRichText.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLRichText: XLFormattedText, IXLRichText + { + + public XLRichText(IXLFontBase defaultFont) + :base(defaultFont) + { + Container = this; + } + + public XLRichText(XLFormattedText defaultRichText, IXLFontBase defaultFont) + :base(defaultRichText, defaultFont) + { + Container = this; + } + + public XLRichText(String text, IXLFontBase defaultFont) + :base(text, defaultFont) + { + Container = this; + } + + } +} diff --git a/ClosedXML/Excel/Rows/IXLRow.cs b/ClosedXML/Excel/Rows/IXLRow.cs new file mode 100644 index 0000000..045ab5b --- /dev/null +++ b/ClosedXML/Excel/Rows/IXLRow.cs @@ -0,0 +1,207 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLRow : IXLRangeBase + { + /// + /// Gets or sets the height of this row. + /// + /// + /// The width of this row. + /// + Double Height { get; set; } + + /// + /// Clears the height for the row and defaults it to the spreadsheet row height. + /// + void ClearHeight(); + + /// + /// Deletes this row and shifts the rows below this one accordingly. + /// + void Delete(); + + /// + /// Gets this row's number + /// + Int32 RowNumber(); + + /// + /// Inserts X number of rows below this one. + /// All rows below will be shifted accordingly. + /// + /// The number of rows to insert. + IXLRows InsertRowsBelow(Int32 numberOfRows); + + /// + /// Inserts X number of rows above this one. + /// This row and all below will be shifted accordingly. + /// + /// The number of rows to insert. + IXLRows InsertRowsAbove(Int32 numberOfRows); + + IXLRow AdjustToContents(); + + /// + /// Adjusts the height of the row based on its contents, starting from the startColumn. + /// + /// The column to start calculating the row height. + IXLRow AdjustToContents(Int32 startColumn); + + /// + /// Adjusts the height of the row based on its contents, starting from the startColumn and ending at endColumn. + /// + /// The column to start calculating the row height. + /// The column to end calculating the row height. + IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn); + + IXLRow AdjustToContents(Double minHeight, Double maxHeight); + + IXLRow AdjustToContents(Int32 startColumn, Double minHeight, Double maxHeight); + + IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight); + + /// Hides this row. + IXLRow Hide(); + + /// Unhides this row. + IXLRow Unhide(); + + /// + /// Gets a value indicating whether this row is hidden or not. + /// + /// + /// true if this row is hidden; otherwise, false. + /// + Boolean IsHidden { get; } + + /// + /// Gets or sets the outline level of this row. + /// + /// + /// The outline level of this row. + /// + Int32 OutlineLevel { get; set; } + + /// + /// Adds this row to the next outline level (Increments the outline level for this row by 1). + /// + IXLRow Group(); + + /// + /// Adds this row to the next outline level (Increments the outline level for this row by 1). + /// + /// If set to true the row will be shown collapsed. + IXLRow Group(Boolean collapse); + + /// + /// Sets outline level for this row. + /// + /// The outline level. + IXLRow Group(Int32 outlineLevel); + + /// + /// Sets outline level for this row. + /// + /// The outline level. + /// If set to true the row will be shown collapsed. + IXLRow Group(Int32 outlineLevel, Boolean collapse); + + /// + /// Adds this row to the previous outline level (decrements the outline level for this row by 1). + /// + IXLRow Ungroup(); + + /// + /// Adds this row to the previous outline level (decrements the outline level for this row by 1). + /// + /// If set to true it will remove this row from all outline levels. + IXLRow Ungroup(Boolean fromAll); + + /// + /// Show this row as collapsed. + /// + IXLRow Collapse(); + + /// + /// Gets the cell in the specified column. + /// + /// The cell's column. + IXLCell Cell(Int32 columnNumber); + + /// + /// Gets the cell in the specified column. + /// + /// The cell's column. + IXLCell Cell(String columnLetter); + + /// + /// Returns the specified group of cells, separated by commas. + /// e.g. Cells("1"), Cells("1:5"), Cells("1,3:5") + /// + /// The row's cells to return. + new IXLCells Cells(String cellsInRow); + + /// + /// Returns the specified group of cells. + /// + /// The first column in the group of cells to return. + /// The last column in the group of cells to return. + IXLCells Cells(Int32 firstColumn, Int32 lastColumn); + + /// + /// Returns the specified group of cells. + /// + /// The first column in the group of cells to return. + /// The last column in the group of cells to return. + IXLCells Cells(String firstColumn, String lastColumn); + + /// Expands this row (if it's collapsed). + IXLRow Expand(); + + Int32 CellCount(); + + IXLRangeRow CopyTo(IXLCell cell); + + IXLRangeRow CopyTo(IXLRangeBase range); + + IXLRow CopyTo(IXLRow row); + + IXLRow Sort(); + + IXLRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + IXLRangeRow Row(Int32 start, Int32 end); + + IXLRangeRow Row(IXLCell start, IXLCell end); + + IXLRangeRows Rows(String columns); + + /// + /// Adds a horizontal page break after this row. + /// + IXLRow AddHorizontalPageBreak(); + + IXLRow SetDataType(XLDataType dataType); + + IXLRow RowAbove(); + + IXLRow RowAbove(Int32 step); + + IXLRow RowBelow(); + + IXLRow RowBelow(Int32 step); + + /// + /// Clears the contents of this row. + /// + /// Specify what you want to clear. + new IXLRow Clear(XLClearOptions clearOptions = XLClearOptions.All); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRangeRow RowUsed(Boolean includeFormats); + + IXLRangeRow RowUsed(XLCellsUsedOptions options = XLCellsUsedOptions.AllContents); + } +} diff --git a/ClosedXML/Excel/Rows/IXLRows.cs b/ClosedXML/Excel/Rows/IXLRows.cs new file mode 100644 index 0000000..bf8adf7 --- /dev/null +++ b/ClosedXML/Excel/Rows/IXLRows.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLRows : IEnumerable + { + /// + /// Sets the height of all rows. + /// + /// + /// The height of all rows. + /// + Double Height { set; } + + /// + /// Deletes all rows and shifts the rows below them accordingly. + /// + void Delete(); + + /// + /// Adjusts the height of all rows based on its contents. + /// + IXLRows AdjustToContents(); + + /// + /// Adjusts the height of all rows based on its contents, starting from the startColumn. + /// + /// The column to start calculating the row height. + IXLRows AdjustToContents(Int32 startColumn); + + /// + /// Adjusts the height of all rows based on its contents, starting from the startColumn and ending at endColumn. + /// + /// The column to start calculating the row height. + /// The column to end calculating the row height. + IXLRows AdjustToContents(Int32 startColumn, Int32 endColumn); + + IXLRows AdjustToContents(Double minHeight, Double maxHeight); + + IXLRows AdjustToContents(Int32 startColumn, Double minHeight, Double maxHeight); + + IXLRows AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight); + + /// + /// Hides all rows. + /// + void Hide(); + + /// Unhides all rows. + void Unhide(); + + /// + /// Increments the outline level of all rows by 1. + /// + void Group(); + + /// + /// Increments the outline level of all rows by 1. + /// + /// If set to true the rows will be shown collapsed. + void Group(Boolean collapse); + + /// + /// Sets outline level for all rows. + /// + /// The outline level. + void Group(Int32 outlineLevel); + + /// + /// Sets outline level for all rows. + /// + /// The outline level. + /// If set to true the rows will be shown collapsed. + void Group(Int32 outlineLevel, Boolean collapse); + + /// + /// Decrements the outline level of all rows by 1. + /// + void Ungroup(); + + /// + /// Decrements the outline level of all rows by 1. + /// + /// If set to true it will remove the rows from all outline levels. + void Ungroup(Boolean fromAll); + + /// + /// Show all rows as collapsed. + /// + void Collapse(); + + /// Expands all rows (if they're collapsed). + void Expand(); + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + /// + /// Returns the collection of cells that have a value. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCells CellsUsed(Boolean includeFormats); + + IXLCells CellsUsed(XLCellsUsedOptions options); + + IXLStyle Style { get; set; } + + /// + /// Adds a horizontal page break after these rows. + /// + IXLRows AddHorizontalPageBreaks(); + + IXLRows SetDataType(XLDataType dataType); + + /// + /// Clears the contents of these rows. + /// + /// Specify what you want to clear. + IXLRows Clear(XLClearOptions clearOptions = XLClearOptions.All); + + void Select(); + } +} diff --git a/ClosedXML/Excel/Rows/XLRow.cs b/ClosedXML/Excel/Rows/XLRow.cs new file mode 100644 index 0000000..6f31877 --- /dev/null +++ b/ClosedXML/Excel/Rows/XLRow.cs @@ -0,0 +1,609 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLRow : XLRangeBase, IXLRow + { + #region Private fields + + private Double _height; + private Int32 _outlineLevel; + + #endregion Private fields + + #region Constructor + + /// + /// The direct contructor should only be used in . + /// + public XLRow(XLWorksheet worksheet, Int32 row) + : base(XLRangeAddress.EntireRow(worksheet, row), worksheet.StyleValue) + { + SetRowNumber(row); + + _height = worksheet.RowHeight; + } + + #endregion Constructor + + public override XLRangeType RangeType + { + get { return XLRangeType.Row; } + } + + public override IEnumerable Styles + { + get + { + yield return Style; + + int row = RowNumber(); + + foreach (XLCell cell in Worksheet.Internals.CellsCollection.GetCellsInRow(row)) + yield return cell.Style; + } + } + + protected override IEnumerable Children + { + get + { + int row = RowNumber(); + + foreach (XLCell cell in Worksheet.Internals.CellsCollection.GetCellsInRow(row)) + yield return cell; + } + } + + public Boolean Collapsed { get; set; } + + #region IXLRow Members + + public Boolean Loading { get; set; } + + public Boolean HeightChanged { get; private set; } + + public Double Height + { + get { return _height; } + set + { + if (!Loading) + HeightChanged = true; + + _height = value; + } + } + + public void ClearHeight() + { + Height = Worksheet.RowHeight; + HeightChanged = false; + } + + public void Delete() + { + int rowNumber = RowNumber(); + AsRange().Delete(XLShiftDeletedCells.ShiftCellsUp); + Worksheet.DeleteRow(rowNumber); + } + + public new IXLRows InsertRowsBelow(Int32 numberOfRows) + { + int rowNum = RowNumber(); + Worksheet.Internals.RowsCollection.ShiftRowsDown(rowNum + 1, numberOfRows); + var asRange = Worksheet.Row(rowNum).AsRange(); + asRange.InsertRowsBelowVoid(true, numberOfRows); + + var newRows = Worksheet.Rows(rowNum + 1, rowNum + numberOfRows); + + CopyRows(newRows); + + return newRows; + } + + private void CopyRows(IXLRows newRows) + { + foreach (var newRow in newRows) + { + var internalRow = Worksheet.Internals.RowsCollection[newRow.RowNumber()]; + internalRow._height = Height; + internalRow.InnerStyle = InnerStyle; + internalRow.Collapsed = Collapsed; + internalRow.IsHidden = IsHidden; + internalRow._outlineLevel = OutlineLevel; + } + } + + public new IXLRows InsertRowsAbove(Int32 numberOfRows) + { + int rowNum = RowNumber(); + if (rowNum > 1) + { + return Worksheet.Row(rowNum - 1).InsertRowsBelow(numberOfRows); + } + + Worksheet.Internals.RowsCollection.ShiftRowsDown(rowNum, numberOfRows); + var asRange = Worksheet.Row(rowNum).AsRange(); + asRange.InsertRowsAboveVoid(true, numberOfRows); + + return Worksheet.Rows(rowNum, rowNum + numberOfRows - 1); + } + + public new IXLRow Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + base.Clear(clearOptions); + return this; + } + + public IXLCell Cell(Int32 columnNumber) + { + return Cell(1, columnNumber); + } + + public override XLCell Cell(String columnLetter) + { + return Cell(1, columnLetter); + } + + IXLCell IXLRow.Cell(string columnLetter) + { + return Cell(columnLetter); + } + + public override IXLCells Cells() + { + return Cells(true, XLCellsUsedOptions.All); + } + + public override IXLCells Cells(Boolean usedCellsOnly) + { + if (usedCellsOnly) + return Cells(true, XLCellsUsedOptions.AllContents); + else + return Cells(FirstCellUsed().Address.ColumnNumber, LastCellUsed().Address.ColumnNumber); + } + + public override IXLCells Cells(String cellsInRow) + { + var retVal = new XLCells(false, XLCellsUsedOptions.AllContents); + var rangePairs = cellsInRow.Split(','); + foreach (string pair in rangePairs) + retVal.Add(Range(pair.Trim()).RangeAddress); + return retVal; + } + + public IXLCells Cells(Int32 firstColumn, Int32 lastColumn) + { + return Cells(firstColumn + ":" + lastColumn); + } + + public IXLCells Cells(String firstColumn, String lastColumn) + { + return Cells(XLHelper.GetColumnNumberFromLetter(firstColumn) + ":" + + XLHelper.GetColumnNumberFromLetter(lastColumn)); + } + + public IXLRow AdjustToContents(Int32 startColumn) + { + return AdjustToContents(startColumn, XLHelper.MaxColumnNumber); + } + + public IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn) + { + return AdjustToContents(startColumn, endColumn, 0, Double.MaxValue); + } + + public IXLRow AdjustToContents(Double minHeight, Double maxHeight) + { + return AdjustToContents(1, XLHelper.MaxColumnNumber, minHeight, maxHeight); + } + + public IXLRow AdjustToContents(Int32 startColumn, Double minHeight, Double maxHeight) + { + return AdjustToContents(startColumn, XLHelper.MaxColumnNumber, minHeight, maxHeight); + } + + public IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight) + { + var fontCache = new Dictionary(); + + Double rowMaxHeight = minHeight; + foreach (XLCell c in from XLCell c in Row(startColumn, endColumn).CellsUsed() where !c.IsMerged() select c) + { + Double thisHeight; + Int32 textRotation = c.StyleValue.Alignment.TextRotation; + if (c.HasRichText || textRotation != 0 || c.InnerText.Contains(Environment.NewLine)) + { + var kpList = new List>(); + if (c.HasRichText) + { + foreach (IXLRichString rt in c.RichText) + { + String formattedString = rt.Text; + var arr = formattedString.Split(new[] { Environment.NewLine }, StringSplitOptions.None); + Int32 arrCount = arr.Count(); + for (Int32 i = 0; i < arrCount; i++) + { + String s = arr[i]; + if (i < arrCount - 1) + s += Environment.NewLine; + kpList.Add(new KeyValuePair(rt, s)); + } + } + } + else + { + String formattedString = c.GetFormattedString(); + var arr = formattedString.Split(new[] { Environment.NewLine }, StringSplitOptions.None); + Int32 arrCount = arr.Count(); + for (Int32 i = 0; i < arrCount; i++) + { + String s = arr[i]; + if (i < arrCount - 1) + s += Environment.NewLine; + kpList.Add(new KeyValuePair(c.Style.Font, s)); + } + } + + Double maxLongCol = kpList.Max(kp => kp.Value.Length); + Double maxHeightCol = kpList.Max(kp => kp.Key.GetHeight(fontCache)); + Int32 lineCount = kpList.Count(kp => kp.Value.Contains(Environment.NewLine)) + 1; + if (textRotation == 0) + thisHeight = maxHeightCol * lineCount; + else + { + if (textRotation == 255) + thisHeight = maxLongCol * maxHeightCol; + else + { + Double rotation; + if (textRotation == 90 || textRotation == 180) + rotation = 90; + else + rotation = textRotation % 90; + + thisHeight = (rotation / 90.0) * maxHeightCol * maxLongCol * 0.5; + } + } + } + else + thisHeight = c.Style.Font.GetHeight(fontCache); + + if (thisHeight >= maxHeight) + { + rowMaxHeight = maxHeight; + break; + } + if (thisHeight > rowMaxHeight) + rowMaxHeight = thisHeight; + } + + if (rowMaxHeight <= 0) + rowMaxHeight = Worksheet.RowHeight; + + Height = rowMaxHeight; + + foreach (IDisposable font in fontCache.Values) + { + font.Dispose(); + } + return this; + } + + public IXLRow Hide() + { + IsHidden = true; + return this; + } + + public IXLRow Unhide() + { + IsHidden = false; + return this; + } + + public Boolean IsHidden { get; set; } + + public Int32 OutlineLevel + { + get { return _outlineLevel; } + set + { + if (value < 0 || value > 8) + throw new ArgumentOutOfRangeException("value", "Outline level must be between 0 and 8."); + + Worksheet.IncrementColumnOutline(value); + Worksheet.DecrementColumnOutline(_outlineLevel); + _outlineLevel = value; + } + } + + public IXLRow Group() + { + return Group(false); + } + + public IXLRow Group(Int32 outlineLevel) + { + return Group(outlineLevel, false); + } + + public IXLRow Ungroup() + { + return Ungroup(false); + } + + public IXLRow Group(Boolean collapse) + { + if (OutlineLevel < 8) + OutlineLevel += 1; + + Collapsed = collapse; + return this; + } + + public IXLRow Group(Int32 outlineLevel, Boolean collapse) + { + OutlineLevel = outlineLevel; + Collapsed = collapse; + return this; + } + + public IXLRow Ungroup(Boolean ungroupFromAll) + { + if (ungroupFromAll) + OutlineLevel = 0; + else + { + if (OutlineLevel > 0) + OutlineLevel -= 1; + } + return this; + } + + public IXLRow Collapse() + { + Collapsed = true; + return Hide(); + } + + public IXLRow Expand() + { + Collapsed = false; + return Unhide(); + } + + public Int32 CellCount() + { + return RangeAddress.LastAddress.ColumnNumber - RangeAddress.FirstAddress.ColumnNumber + 1; + } + + public new IXLRow Sort() + { + return SortLeftToRight(); + } + + public new IXLRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, + Boolean ignoreBlanks = true) + { + base.SortLeftToRight(sortOrder, matchCase, ignoreBlanks); + return this; + } + + IXLRangeRow IXLRow.CopyTo(IXLCell target) + { + var copy = AsRange().CopyTo(target); + return copy.Row(1); + } + + IXLRangeRow IXLRow.CopyTo(IXLRangeBase target) + { + var copy = AsRange().CopyTo(target); + return copy.Row(1); + } + + public IXLRow CopyTo(IXLRow row) + { + row.Clear(); + var newRow = (XLRow)row; + newRow._height = _height; + newRow.HeightChanged = HeightChanged; + newRow.InnerStyle = GetStyle(); + newRow.IsHidden = IsHidden; + + AsRange().CopyTo(row); + + return newRow; + } + + public IXLRangeRow Row(Int32 start, Int32 end) + { + return Range(1, start, 1, end).Row(1); + } + + public IXLRangeRow Row(IXLCell start, IXLCell end) + { + return Row(start.Address.ColumnNumber, end.Address.ColumnNumber); + } + + public IXLRangeRows Rows(String rows) + { + var retVal = new XLRangeRows(); + var rowPairs = rows.Split(','); + foreach (string pair in rowPairs) + AsRange().Rows(pair.Trim()).ForEach(retVal.Add); + + return retVal; + } + + public IXLRow AddHorizontalPageBreak() + { + Worksheet.PageSetup.AddHorizontalPageBreak(RowNumber()); + return this; + } + + public IXLRow SetDataType(XLDataType dataType) + { + DataType = dataType; + return this; + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public IXLRangeRow RowUsed(Boolean includeFormats) + { + return RowUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + public IXLRangeRow RowUsed(XLCellsUsedOptions options = XLCellsUsedOptions.AllContents) + { + return Row((this as IXLRangeBase).FirstCellUsed(options), + (this as IXLRangeBase).LastCellUsed(options)); + } + + #endregion IXLRow Members + + public override XLRange AsRange() + { + return Range(1, 1, 1, XLHelper.MaxColumnNumber); + } + + internal override void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted) + { + //do nothing + } + + internal override void WorksheetRangeShiftedRows(XLRange range, int rowsShifted) + { + return; // rows are shifted by XLRowCollection + } + + internal void SetRowNumber(Int32 row) + { + RangeAddress = new XLRangeAddress( + new XLAddress(Worksheet, row, 1, RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn), + new XLAddress(Worksheet, + row, + XLHelper.MaxColumnNumber, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn)); + } + + public override XLRange Range(String rangeAddressStr) + { + String rangeAddressToUse; + if (rangeAddressStr.Contains(':') || rangeAddressStr.Contains('-')) + { + if (rangeAddressStr.Contains('-')) + rangeAddressStr = rangeAddressStr.Replace('-', ':'); + + var arrRange = rangeAddressStr.Split(':'); + string firstPart = arrRange[0]; + string secondPart = arrRange[1]; + rangeAddressToUse = FixRowAddress(firstPart) + ":" + FixRowAddress(secondPart); + } + else + rangeAddressToUse = FixRowAddress(rangeAddressStr); + + var rangeAddress = new XLRangeAddress(Worksheet, rangeAddressToUse); + return Range(rangeAddress); + } + + public IXLRow AdjustToContents() + { + return AdjustToContents(1); + } + + internal void SetStyleNoColumns(IXLStyle value) + { + InnerStyle = value; + + int row = RowNumber(); + foreach (XLCell c in Worksheet.Internals.CellsCollection.GetCellsInRow(row)) + c.InnerStyle = value; + } + + private XLRow RowShift(Int32 rowsToShift) + { + return Worksheet.Row(RowNumber() + rowsToShift); + } + + #region XLRow Above + + IXLRow IXLRow.RowAbove() + { + return RowAbove(); + } + + IXLRow IXLRow.RowAbove(Int32 step) + { + return RowAbove(step); + } + + public XLRow RowAbove() + { + return RowAbove(1); + } + + public XLRow RowAbove(Int32 step) + { + return RowShift(step * -1); + } + + #endregion XLRow Above + + #region XLRow Below + + IXLRow IXLRow.RowBelow() + { + return RowBelow(); + } + + IXLRow IXLRow.RowBelow(Int32 step) + { + return RowBelow(step); + } + + public XLRow RowBelow() + { + return RowBelow(1); + } + + public XLRow RowBelow(Int32 step) + { + return RowShift(step); + } + + #endregion XLRow Below + + public override Boolean IsEmpty() + { + return IsEmpty(XLCellsUsedOptions.AllContents); + } + + public override Boolean IsEmpty(XLCellsUsedOptions options) + { + if (options.HasFlag(XLCellsUsedOptions.NormalFormats) && + !StyleValue.Equals(Worksheet.StyleValue)) + return false; + + return base.IsEmpty(options); + } + + public override Boolean IsEntireRow() + { + return true; + } + + public override Boolean IsEntireColumn() + { + return false; + } + } +} diff --git a/ClosedXML/Excel/Rows/XLRowCollection.cs b/ClosedXML/Excel/Rows/XLRowCollection.cs new file mode 100644 index 0000000..1059b3a --- /dev/null +++ b/ClosedXML/Excel/Rows/XLRowCollection.cs @@ -0,0 +1,143 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections; + + internal class XLRowsCollection : IDictionary + { + private readonly Dictionary _dictionary = new Dictionary(); + + public Dictionary Deleted { get; } = new Dictionary(); + + public Int32 MaxRowUsed; + + #region IDictionary Members + + public void Add(int key, XLRow value) + { + if (key > MaxRowUsed) MaxRowUsed = key; + + if (Deleted.ContainsKey(key)) + Deleted.Remove(key); + + _dictionary.Add(key, value); + } + + public bool ContainsKey(int key) + { + return _dictionary.ContainsKey(key); + } + + public ICollection Keys + { + get { return _dictionary.Keys; } + } + + public bool Remove(int key) + { + if (!Deleted.ContainsKey(key)) + Deleted.Add(key, _dictionary[key]); + + return _dictionary.Remove(key); + } + + public bool TryGetValue(int key, out XLRow value) + { + return _dictionary.TryGetValue(key, out value); + } + + public ICollection Values + { + get { return _dictionary.Values; } + } + + public XLRow this[int key] + { + get { return _dictionary[key]; } + set { _dictionary[key] = value; } + } + + public void Add(KeyValuePair item) + { + if (item.Key > MaxRowUsed) MaxRowUsed = item.Key; + + if (Deleted.ContainsKey(item.Key)) + Deleted.Remove(item.Key); + + _dictionary.Add(item.Key, item.Value); + } + + public void Clear() + { + _dictionary.Clear(); + } + + public bool Contains(KeyValuePair item) + { + return _dictionary.Contains(item); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public int Count + { + get { return _dictionary.Count; } + } + + public bool IsReadOnly + { + get { return false; } + } + + public bool Remove(KeyValuePair item) + { + if (!Deleted.ContainsKey(item.Key)) + Deleted.Add(item.Key, _dictionary[item.Key]); + + return _dictionary.Remove(item.Key); + } + + public IEnumerator> GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + #endregion IDictionary Members + + public void ShiftRowsDown(Int32 startingRow, Int32 rowsToShift) + { + foreach (int ro in _dictionary.Keys.Where(k => k >= startingRow).OrderByDescending(k => k)) + { + var rowToMove = _dictionary[ro]; + _dictionary.Remove(ro); + Int32 newRowNum = ro + rowsToShift; + if (newRowNum <= XLHelper.MaxRowNumber) + { + rowToMove.SetRowNumber(newRowNum); + _dictionary.Add(newRowNum, rowToMove); + } + } + } + + public void RemoveAll(Func predicate) + { + foreach (var row in _dictionary.Values.Where(predicate).Where(row1 => !Deleted.ContainsKey(row1.RowNumber()))) + { + Deleted.Add(row.RowNumber(), row); + } + + _dictionary.RemoveAll(predicate); + } + } +} diff --git a/ClosedXML/Excel/Rows/XLRows.cs b/ClosedXML/Excel/Rows/XLRows.cs new file mode 100644 index 0000000..3259b5a --- /dev/null +++ b/ClosedXML/Excel/Rows/XLRows.cs @@ -0,0 +1,273 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections; + + internal class XLRows : XLStylizedBase, IXLRows, IXLStylized + { + private readonly List _rows = new List(); + private readonly XLWorksheet _worksheet; + + + /// + /// Create a new instance of . + /// + /// If worksheet is specified it means that the created instance represents + /// all rows on a worksheet so changing its height will affect all rows. + /// Default style to use when initializing child entries. + public XLRows(XLWorksheet worksheet, XLStyleValue defaultStyle = null) + : base(defaultStyle) + { + _worksheet = worksheet; + } + + #region IXLRows Members + + public IEnumerator GetEnumerator() + { + return _rows.Cast().OrderBy(r => r.RowNumber()).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public double Height + { + set + { + _rows.ForEach(c => c.Height = value); + if (_worksheet == null) return; + _worksheet.RowHeight = value; + _worksheet.Internals.RowsCollection.ForEach(r => r.Value.Height = value); + } + } + + public void Delete() + { + if (_worksheet != null) + { + _worksheet.Internals.RowsCollection.Clear(); + _worksheet.Internals.CellsCollection.Clear(); + } + else + { + var toDelete = new Dictionary>(); + foreach (XLRow r in _rows) + { + if (!toDelete.TryGetValue(r.Worksheet, out List list)) + { + list = new List(); + toDelete.Add(r.Worksheet, list); + } + + list.Add(r.RowNumber()); + } + + foreach (KeyValuePair> kp in toDelete) + { + foreach (int r in kp.Value.OrderByDescending(r => r)) + kp.Key.Row(r).Delete(); + } + } + } + + public IXLRows AdjustToContents() + { + _rows.ForEach(r => r.AdjustToContents()); + return this; + } + + public IXLRows AdjustToContents(Int32 startColumn) + { + _rows.ForEach(r => r.AdjustToContents(startColumn)); + return this; + } + + public IXLRows AdjustToContents(Int32 startColumn, Int32 endColumn) + { + _rows.ForEach(r => r.AdjustToContents(startColumn, endColumn)); + return this; + } + + public IXLRows AdjustToContents(Double minHeight, Double maxHeight) + { + _rows.ForEach(r => r.AdjustToContents(minHeight, maxHeight)); + return this; + } + + public IXLRows AdjustToContents(Int32 startColumn, Double minHeight, Double maxHeight) + { + _rows.ForEach(r => r.AdjustToContents(startColumn, minHeight, maxHeight)); + return this; + } + + public IXLRows AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight) + { + _rows.ForEach(r => r.AdjustToContents(startColumn, endColumn, minHeight, maxHeight)); + return this; + } + + public void Hide() + { + _rows.ForEach(r => r.Hide()); + } + + public void Unhide() + { + _rows.ForEach(r => r.Unhide()); + } + + public void Group() + { + Group(false); + } + + public void Group(Int32 outlineLevel) + { + Group(outlineLevel, false); + } + + public void Ungroup() + { + Ungroup(false); + } + + public void Group(Boolean collapse) + { + _rows.ForEach(r => r.Group(collapse)); + } + + public void Group(Int32 outlineLevel, Boolean collapse) + { + _rows.ForEach(r => r.Group(outlineLevel, collapse)); + } + + public void Ungroup(Boolean ungroupFromAll) + { + _rows.ForEach(r => r.Ungroup(ungroupFromAll)); + } + + public void Collapse() + { + _rows.ForEach(r => r.Collapse()); + } + + public void Expand() + { + _rows.ForEach(r => r.Expand()); + } + + public IXLCells Cells() + { + var cells = new XLCells(false, XLCellsUsedOptions.AllContents); + foreach (XLRow container in _rows) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed() + { + var cells = new XLCells(true, XLCellsUsedOptions.AllContents); + foreach (XLRow container in _rows) + cells.Add(container.RangeAddress); + return cells; + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public IXLCells CellsUsed(Boolean includeFormats) + { + return CellsUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + public IXLCells CellsUsed(XLCellsUsedOptions options) + { + var cells = new XLCells(true, options); + foreach (XLRow container in _rows) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLRows AddHorizontalPageBreaks() + { + foreach (XLRow row in _rows) + row.Worksheet.PageSetup.AddHorizontalPageBreak(row.RowNumber()); + return this; + } + + public IXLRows SetDataType(XLDataType dataType) + { + _rows.ForEach(c => c.DataType = dataType); + return this; + } + + #endregion IXLRows Members + + #region IXLStylized Members + protected override IEnumerable Children + { + get + { + if (_worksheet != null) + yield return _worksheet; + else + { + foreach (XLRow row in _rows) + yield return row; + } + } + } + + public override IEnumerable Styles + { + get + { + yield return Style; + if (_worksheet != null) + yield return _worksheet.Style; + else + { + foreach (IXLStyle s in _rows.SelectMany(row => row.Styles)) + { + yield return s; + } + } + } + } + + public override IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges(); + this.ForEach(c => retVal.Add(c.AsRange())); + return retVal; + } + } + + #endregion IXLStylized Members + + public void Add(XLRow row) + { + _rows.Add(row); + } + + public IXLRows Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + _rows.ForEach(c => c.Clear(clearOptions)); + return this; + } + + public void Select() + { + foreach (var range in this) + range.Select(); + } + } +} diff --git a/ClosedXML/Excel/SaveOptions.cs b/ClosedXML/Excel/SaveOptions.cs new file mode 100644 index 0000000..83cf982 --- /dev/null +++ b/ClosedXML/Excel/SaveOptions.cs @@ -0,0 +1,29 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + public class SaveOptions + { + public SaveOptions() + { +#if DEBUG + this.ValidatePackage = true; +#else + this.ValidatePackage = false; +#endif + } + + public Boolean ConsolidateConditionalFormatRanges { get; set; } = true; + public Boolean ConsolidateDataValidationRanges { get; set; } = true; + public Boolean EvaluateFormulasBeforeSaving { get; set; } = false; + + /// + /// Gets or sets the filter privacy flag. Set to null to leave the current property in saved workbook unchanged + /// + public Boolean? FilterPrivacy { get; set; } + + public Boolean GenerateCalculationChain { get; set; } = true; + public Boolean ValidatePackage { get; set; } + } +} diff --git a/ClosedXML/Excel/Sparkline/IXLSparkLineGroup.cs b/ClosedXML/Excel/Sparkline/IXLSparkLineGroup.cs new file mode 100644 index 0000000..e3ad631 --- /dev/null +++ b/ClosedXML/Excel/Sparkline/IXLSparkLineGroup.cs @@ -0,0 +1,105 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public enum XLDisplayBlanksAsValues + { + Interpolate = 0, + NotPlotted = 1, + Zero = 2 + } + + public enum XLSparklineAxisMinMax + { + Automatic = 0, + SameForAll = 1, + Custom = 2 + } + + [Flags] + public enum XLSparklineMarkers + { + None = 0, + HighPoint = 1 << 1, + LowPoint = 1 << 2, + FirstPoint = 1 << 3, + LastPoint = 1 << 4, + NegativePoints = 1 << 5, + Markers = 1 << 6, + All = HighPoint | LowPoint | FirstPoint | LastPoint | NegativePoints | Markers + } + + public enum XLSparklineType + { + Line = 0, + Column = 1, + Stacked = 2 + } + + public interface IXLSparklineGroup : IEnumerable + { + #region Public Properties + + IXLRange DateRange { get; set; } + + XLDisplayBlanksAsValues DisplayEmptyCellsAs { get; set; } + + Boolean DisplayHidden { get; set; } + + IXLSparklineHorizontalAxis HorizontalAxis { get; } + + Double LineWeight { get; set; } + + XLSparklineMarkers ShowMarkers { get; set; } + + IXLSparklineStyle Style { get; set; } + + XLSparklineType Type { get; set; } + + IXLSparklineVerticalAxis VerticalAxis { get; } + + IXLWorksheet Worksheet { get; } + + #endregion Public Properties + + #region Public Methods + + IXLSparkline Add(IXLCell location, IXLRange sourceData); + + IEnumerable Add(IXLRange locationRange, IXLRange sourceDataRange); + + IEnumerable Add(string locationRangeAddress, string sourceDataAddress); + + void CopyFrom(IXLSparklineGroup sparklineGroup); + + IXLSparklineGroup CopyTo(IXLWorksheet targetSheet); + + IXLSparkline GetSparkline(IXLCell cell); + + IEnumerable GetSparklines(IXLRangeBase searchRange); + + void Remove(IXLCell cell); + + void Remove(IXLSparkline sparkline); + + void RemoveAll(); + + IXLSparklineGroup SetDateRange(IXLRange value); + + IXLSparklineGroup SetDisplayEmptyCellsAs(XLDisplayBlanksAsValues value); + + IXLSparklineGroup SetDisplayHidden(Boolean value); + + IXLSparklineGroup SetLineWeight(Double value); + + IXLSparklineGroup SetShowMarkers(XLSparklineMarkers value); + + IXLSparklineGroup SetStyle(IXLSparklineStyle value); + + IXLSparklineGroup SetType(XLSparklineType value); + + #endregion Public Methods + } +} diff --git a/ClosedXML/Excel/Sparkline/IXLSparkLineGroups.cs b/ClosedXML/Excel/Sparkline/IXLSparkLineGroups.cs new file mode 100644 index 0000000..ce2c4f2 --- /dev/null +++ b/ClosedXML/Excel/Sparkline/IXLSparkLineGroups.cs @@ -0,0 +1,33 @@ +// Keep this file CodeMaid organised and cleaned +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLSparklineGroups : IEnumerable + { + #region Public Properties + + IXLWorksheet Worksheet { get; } + + #endregion Public Properties + + #region Public Methods + + IXLSparklineGroup Add(IXLSparklineGroup sparklineGroup); + IXLSparklineGroup Add(string locationAddress, string sourceDataAddress); + IXLSparklineGroup Add(IXLCell location, IXLRange sourceData); + IXLSparklineGroup Add(IXLRange locationRange, IXLRange sourceDataRange); + + void CopyTo(IXLWorksheet targetSheet); + + IXLSparkline GetSparkline(IXLCell cell); + IEnumerable GetSparklines(IXLRangeBase rangeBase); + + void Remove(IXLCell cell); + void Remove(IXLRangeBase range); + void Remove(IXLSparklineGroup sparklineGroup); + void RemoveAll(); + + #endregion Public Methods + } +} diff --git a/ClosedXML/Excel/Sparkline/IXLSparkline.cs b/ClosedXML/Excel/Sparkline/IXLSparkline.cs new file mode 100644 index 0000000..679d051 --- /dev/null +++ b/ClosedXML/Excel/Sparkline/IXLSparkline.cs @@ -0,0 +1,26 @@ +// Keep this file CodeMaid organised and cleaned +namespace ClosedXML.Excel +{ + public interface IXLSparkline + { + #region Public Properties + + bool IsValid { get; } + + IXLCell Location { get; set; } + + IXLRange SourceData { get; set; } + + IXLSparklineGroup SparklineGroup { get; } + + #endregion Public Properties + + #region Public Methods + + IXLSparkline SetLocation(IXLCell value); + + IXLSparkline SetSourceData(IXLRange value); + + #endregion Public Methods + } +} diff --git a/ClosedXML/Excel/Sparkline/IXLSparklineHorizontalAxis.cs b/ClosedXML/Excel/Sparkline/IXLSparklineHorizontalAxis.cs new file mode 100644 index 0000000..5d2873d --- /dev/null +++ b/ClosedXML/Excel/Sparkline/IXLSparklineHorizontalAxis.cs @@ -0,0 +1,30 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + public interface IXLSparklineHorizontalAxis + { + #region Public Properties + + XLColor Color { get; set; } + + Boolean DateAxis { get; } + + Boolean IsVisible { get; set; } + + Boolean RightToLeft { get; set; } + + #endregion Public Properties + + #region Public Methods + + IXLSparklineHorizontalAxis SetColor(XLColor value); + + IXLSparklineHorizontalAxis SetRightToLeft(Boolean value); + + IXLSparklineHorizontalAxis SetVisible(Boolean value); + + #endregion Public Methods + } +} diff --git a/ClosedXML/Excel/Sparkline/IXLSparklineStyle.cs b/ClosedXML/Excel/Sparkline/IXLSparklineStyle.cs new file mode 100644 index 0000000..30bc8ff --- /dev/null +++ b/ClosedXML/Excel/Sparkline/IXLSparklineStyle.cs @@ -0,0 +1,43 @@ +// Keep this file CodeMaid organised and cleaned + +namespace ClosedXML.Excel +{ + public interface IXLSparklineStyle + { + #region Public Properties + + XLColor FirstMarkerColor { get; set; } + + XLColor HighMarkerColor { get; set; } + + XLColor LastMarkerColor { get; set; } + + XLColor LowMarkerColor { get; set; } + + XLColor MarkersColor { get; set; } + + XLColor NegativeColor { get; set; } + + XLColor SeriesColor { get; set; } + + #endregion Public Properties + + #region Public Methods + + IXLSparklineStyle SetFirstMarkerColor(XLColor value); + + IXLSparklineStyle SetHighMarkerColor(XLColor value); + + IXLSparklineStyle SetLastMarkerColor(XLColor value); + + IXLSparklineStyle SetLowMarkerColor(XLColor value); + + IXLSparklineStyle SetMarkersColor(XLColor value); + + IXLSparklineStyle SetNegativeColor(XLColor value); + + IXLSparklineStyle SetSeriesColor(XLColor value); + + #endregion Public Methods + } +} diff --git a/ClosedXML/Excel/Sparkline/IXLSparklineVerticalAxis.cs b/ClosedXML/Excel/Sparkline/IXLSparklineVerticalAxis.cs new file mode 100644 index 0000000..17e5d26 --- /dev/null +++ b/ClosedXML/Excel/Sparkline/IXLSparklineVerticalAxis.cs @@ -0,0 +1,32 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + public interface IXLSparklineVerticalAxis + { + #region Public Properties + + Double? ManualMax { get; set; } + + Double? ManualMin { get; set; } + + XLSparklineAxisMinMax MaxAxisType { get; set; } + + XLSparklineAxisMinMax MinAxisType { get; set; } + + #endregion Public Properties + + #region Public Methods + + IXLSparklineVerticalAxis SetManualMax(Double? value); + + IXLSparklineVerticalAxis SetManualMin(Double? value); + + IXLSparklineVerticalAxis SetMaxAxisType(XLSparklineAxisMinMax value); + + IXLSparklineVerticalAxis SetMinAxisType(XLSparklineAxisMinMax value); + + #endregion Public Methods + } +} diff --git a/ClosedXML/Excel/Sparkline/XLSparkLine.cs b/ClosedXML/Excel/Sparkline/XLSparkLine.cs new file mode 100644 index 0000000..e2dbe3a --- /dev/null +++ b/ClosedXML/Excel/Sparkline/XLSparkLine.cs @@ -0,0 +1,91 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + internal class XLSparkline : IXLSparkline + { + #region Private Fields + + private IXLCell _location; + private IXLRange _sourceData; + + #endregion Private Fields + + #region Public Properties + + public bool IsValid => + Location != null && + SourceData != null && + ((XLAddress)Location.Address).IsValid && + ((XLRangeAddress)SourceData.RangeAddress).IsValid; + + public IXLCell Location + { + get => _location; + set => SetLocation(value); + } + + public IXLRange SourceData + { + get => _sourceData; + set => SetSourceData(value); + } + + public IXLSparklineGroup SparklineGroup { get; } + + #endregion Public Properties + + #region Public Constructors + + /// + /// Create a new sparkline + /// + /// The sparkline group to add the sparkline to + /// The cell to place the sparkline in + /// The range the sparkline gets data from + public XLSparkline(IXLSparklineGroup sparklineGroup, IXLCell cell, IXLRange sourceData) + { + if (sparklineGroup == null) + throw new ArgumentNullException(nameof(sparklineGroup)); + + if (cell == null) + throw new ArgumentNullException(nameof(cell)); + + if (sparklineGroup.Worksheet != cell.Worksheet) + throw new InvalidOperationException("Cell must belong to the same worksheet as the sparkline group"); + + SparklineGroup = sparklineGroup; + Location = cell; + SourceData = sourceData; + } + + #endregion Public Constructors + + #region Public Methods + + public IXLSparkline SetLocation(IXLCell cell) + { + if (cell != null && cell.Worksheet != SparklineGroup.Worksheet) + throw new InvalidOperationException("Cannot move the sparkline to a different worksheet"); + + if (_location != null) + SparklineGroup.Remove(_location); + + _location = cell; + (SparklineGroup as XLSparklineGroup).Add(this); + return this; + } + + public IXLSparkline SetSourceData(IXLRange range) + { + if (range != null && range.RowCount() != 1 && range.ColumnCount() != 1) + throw new ArgumentException("SourceData range must have either a single row or a single column"); + + _sourceData = range; + return this; + } + + #endregion Public Methods + } +} diff --git a/ClosedXML/Excel/Sparkline/XLSparkLineGroup.cs b/ClosedXML/Excel/Sparkline/XLSparkLineGroup.cs new file mode 100644 index 0000000..ba5847e --- /dev/null +++ b/ClosedXML/Excel/Sparkline/XLSparkLineGroup.cs @@ -0,0 +1,338 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLSparklineGroup : IXLSparklineGroup + { + #region Public Properties + + public IXLRange DateRange + { + get => _dateRange; + set => SetDateRange(value); + } + + public XLDisplayBlanksAsValues DisplayEmptyCellsAs { get; set; } + + public Boolean DisplayHidden { get; set; } + + public IXLSparklineHorizontalAxis HorizontalAxis { get; } + + public Double LineWeight { get; set; } + + public XLSparklineMarkers ShowMarkers { get; set; } + + private IXLSparklineGroups SparklineGroups => Worksheet.SparklineGroups; + + public IXLSparklineStyle Style + { + get => _style; + set => SetStyle(value); + } + + public XLSparklineType Type { get; set; } + + public IXLSparklineVerticalAxis VerticalAxis { get; } + + /// + /// The worksheet this sparkline group is associated with + /// + public IXLWorksheet Worksheet { get; } + + private IXLRange _dateRange; + private IXLSparklineStyle _style; + + #endregion Public Properties + + #region Public Constructors + + /// + /// Add a new sparkline group copied from an existing sparkline group to the specified worksheet + /// + /// The worksheet the sparkline group is being added to + /// The sparkline group to copy from + /// The new sparkline group added + public XLSparklineGroup(IXLWorksheet targetWorksheet, IXLSparklineGroup copyFrom) + : this(targetWorksheet) + { + CopyFrom(copyFrom); + } + + /// + /// Add a new sparkline group copied from an existing sparkline group to the specified worksheet + /// + /// The new sparkline group added + public XLSparklineGroup(IXLWorksheet targetWorksheet, string locationAddress, string sourceDataAddress) + : this(targetWorksheet) + { + Add(locationAddress, sourceDataAddress); + } + + /// + /// Add a new sparkline group copied from an existing sparkline group to the specified worksheet + /// + /// The new sparkline group added + public XLSparklineGroup(IXLCell location, IXLRange sourceData) + : this(location.Worksheet) + { + Add(location, sourceData); + } + + /// + /// Add a new sparkline group copied from an existing sparkline group to the specified worksheet + /// + /// The new sparkline group added + public XLSparklineGroup(IXLRange locationRange, IXLRange sourceDataRange) + : this(locationRange.Worksheet) + { + Add(locationRange, sourceDataRange); + } + + #endregion Public Constructors + + #region Public Methods + + public IEnumerable Add(IXLRange locationRange, IXLRange sourceDataRange) + { + var singleRow = locationRange.RowCount() == 1; + var singleColumn = locationRange.ColumnCount() == 1; + var newSparklines = new List(); + + if (singleRow && singleColumn) + { + newSparklines.Add(Add(locationRange.FirstCell(), sourceDataRange)); + } + else if (singleRow) + { + if (locationRange.ColumnCount() != sourceDataRange.ColumnCount()) + throw new ArgumentException("locationRange and sourceDataRange must have the same width"); + for (int i = 1; i <= locationRange.ColumnCount(); i++) + { + newSparklines.Add(Add(locationRange.Cell(1, i), sourceDataRange.Column(i).AsRange())); + } + } + else if (singleColumn) + { + if (locationRange.RowCount() != sourceDataRange.RowCount()) + throw new ArgumentException("locationRange and sourceDataRange must have the same height"); + + for (int i = 1; i <= locationRange.RowCount(); i++) + { + newSparklines.Add(Add(locationRange.Cell(i, 1), sourceDataRange.Row(i).AsRange())); + } + } + else + throw new ArgumentException("locationRange must have either a single row or a single column"); + + return newSparklines; + } + + /// + /// Add a sparkline to the group. + /// + /// The cell to add sparklines to. If it already contains a sparkline + /// it will be replaced. + /// The range the sparkline gets data from + /// A newly created sparkline. + public IXLSparkline Add(IXLCell location, IXLRange sourceData) + { + if (location.Worksheet != Worksheet) + throw new ArgumentException("The specified sparkline belongs to the different worksheet"); + + return new XLSparkline(this, location, sourceData); + } + + public IEnumerable Add(string locationRangeAddress, string sourceDataAddress) + { + var sourceDataRange = Worksheet.Workbook.Range(sourceDataAddress) ?? + Worksheet.Range(sourceDataAddress); + return Add(Worksheet.Range(locationRangeAddress), sourceDataRange); + } + + /// + /// Copy the details from a specified sparkline group + /// + /// The sparkline group to copy from + public void CopyFrom(IXLSparklineGroup sparklineGroup) + { + if (sparklineGroup.DateRange != null) + { + DateRange = sparklineGroup.DateRange.Worksheet == sparklineGroup.Worksheet + ? Worksheet.Range(sparklineGroup.DateRange.RangeAddress.ToString()) + : sparklineGroup.DateRange; + } + + DisplayEmptyCellsAs = sparklineGroup.DisplayEmptyCellsAs; + DisplayHidden = sparklineGroup.DisplayHidden; + LineWeight = sparklineGroup.LineWeight; + ShowMarkers = sparklineGroup.ShowMarkers; + Type = sparklineGroup.Type; + + XLSparklineStyle.Copy(sparklineGroup.Style, Style); + XLSparklineHorizontalAxis.Copy(sparklineGroup.HorizontalAxis, HorizontalAxis); + XLSparklineVerticalAxis.Copy(sparklineGroup.VerticalAxis, VerticalAxis); + } + + /// + /// Copy this sparkline group to the specified worksheet + /// + /// The worksheet to copy this sparkline group to + public IXLSparklineGroup CopyTo(IXLWorksheet targetSheet) + { + if (targetSheet == Worksheet) + throw new InvalidOperationException( + "Cannot copy the sparkline group to the same worksheet it belongs to"); + + var copy = targetSheet.SparklineGroups.Add(new XLSparklineGroup(targetSheet, this)); + foreach (var sparkline in _sparklines.Values) + { + var location = targetSheet.Cell(((XLAddress)sparkline.Location.Address).WithoutWorksheet()); + var sourceData = sparkline.SourceData.Worksheet == Worksheet + ? targetSheet.Range(sparkline.SourceData.RangeAddress.ToString()) + : sparkline.SourceData; + + copy.Add(location, sourceData); + } + return copy; + } + + public IEnumerator GetEnumerator() + { + return _sparklines.Values.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLSparkline GetSparkline(IXLCell cell) + { + return _sparklines.TryGetValue(cell, out IXLSparkline sparkline) ? sparkline : null; + } + + public IEnumerable GetSparklines(IXLRangeBase searchRange) + { + foreach (var key in _sparklines.Keys.Where(searchRange.Contains)) + { + yield return GetSparkline(key); + } + } + + /// + /// Remove all sparklines in the specified cell from this group + /// + /// The cell to remove sparklines from + public void Remove(IXLCell cell) + { + if (_sparklines.ContainsKey(cell)) + _sparklines.Remove(cell); + } + + /// + /// Remove the sparkline from this group + /// + /// + public void Remove(IXLSparkline sparkline) + { + Remove(sparkline.Location); + } + + /// + /// Remove all sparklines from this group + /// + public void RemoveAll() + { + _sparklines.Clear(); + } + + public IXLSparklineGroup SetDateRange(IXLRange value) + { + if (value != null) + { + if (value.RowCount() != 1 && value.ColumnCount() != 1) + throw new ArgumentException("The date range must be either one row high or one column wide"); + } + + _dateRange = value; + return this; + } + + public IXLSparklineGroup SetDisplayEmptyCellsAs(XLDisplayBlanksAsValues displayEmptyCellsAs) + { + DisplayEmptyCellsAs = displayEmptyCellsAs; + return this; + } + + public IXLSparklineGroup SetDisplayHidden(Boolean displayHidden) + { + DisplayHidden = displayHidden; + return this; + } + + public IXLSparklineGroup SetLineWeight(Double lineWeight) + { + LineWeight = lineWeight; + return this; + } + + public IXLSparklineGroup SetShowMarkers(XLSparklineMarkers value) + { + ShowMarkers = value; + return this; + } + + public IXLSparklineGroup SetStyle(IXLSparklineStyle value) + { + _style = value ?? throw new ArgumentNullException(nameof(value)); + return this; + } + + public IXLSparklineGroup SetType(XLSparklineType type) + { + Type = type; + return this; + } + + internal IXLSparkline Add(IXLSparkline sparkline) + { + if (sparkline.Location.Worksheet != Worksheet) + throw new ArgumentException("The specified sparkline belongs to the different worksheet"); + + SparklineGroups.Remove(sparkline.Location); + _sparklines[sparkline.Location] = sparkline; + return sparkline; + } + + #endregion Public Methods + + #region Private Fields + + private readonly Dictionary _sparklines = new Dictionary(); + + #endregion Private Fields + + #region Private Constructors + + /// + /// Add a new sparkline group to the specified worksheet + /// + /// The worksheet the sparkline group is being added to + /// The new sparkline group added + internal XLSparklineGroup(IXLWorksheet targetWorksheet) + { + Worksheet = targetWorksheet ?? throw new ArgumentNullException(nameof(targetWorksheet)); + HorizontalAxis = new XLSparklineHorizontalAxis(this); + VerticalAxis = new XLSparklineVerticalAxis(this); + HorizontalAxis.Color = XLColor.Black; + Style = XLSparklineTheme.Default; + LineWeight = 0.75d; + } + + #endregion Private Constructors + } +} diff --git a/ClosedXML/Excel/Sparkline/XLSparkLineGroups.cs b/ClosedXML/Excel/Sparkline/XLSparkLineGroups.cs new file mode 100644 index 0000000..daee483 --- /dev/null +++ b/ClosedXML/Excel/Sparkline/XLSparkLineGroups.cs @@ -0,0 +1,177 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLSparklineGroups : IXLSparklineGroups + { + #region Public Properties + + public IXLWorksheet Worksheet { get; } + + #endregion Public Properties + + #region Public Constructors + + public XLSparklineGroups(IXLWorksheet worksheet) + { + Worksheet = worksheet ?? throw new ArgumentNullException(nameof(worksheet)); + } + + #endregion Public Constructors + + #region Public Methods + + /// + /// Add empty sparkline group. + /// + internal IXLSparklineGroup Add() + { + return Add(new XLSparklineGroup(Worksheet)); + } + + /// + /// Add the sparkline group to the collection. + /// + /// The sparkline group to add to the collection + /// The same sparkline group + public IXLSparklineGroup Add(IXLSparklineGroup sparklineGroup) + { + if (sparklineGroup.Worksheet != Worksheet) + throw new ArgumentException("The specified sparkline group belongs to the different worksheet"); + + _sparklineGroups.Add(sparklineGroup); + return sparklineGroup; + } + + public IXLSparklineGroup Add(string locationAddress, string sourceDataAddress) + { + return Add(new XLSparklineGroup(Worksheet, locationAddress, sourceDataAddress)); + } + + public IXLSparklineGroup Add(IXLCell location, IXLRange sourceData) + { + return Add(new XLSparklineGroup(location, sourceData)); + } + + public IXLSparklineGroup Add(IXLRange locationRange, IXLRange sourceDataRange) + { + return Add(new XLSparklineGroup(locationRange, sourceDataRange)); + } + + /// + /// Add a copy of an existing sparkline group to the specified worksheet + /// + /// The sparkline group to copy + /// The worksheet the sparkline group is being added to + /// The new sparkline group added + public IXLSparklineGroup AddCopy(IXLSparklineGroup sparklineGroupToCopy, IXLWorksheet targetWorksheet) + { + var sparklineGroup = new XLSparklineGroup(targetWorksheet, sparklineGroupToCopy); + _sparklineGroups.Add(sparklineGroup); + return sparklineGroup; + } + + /// + /// Copy this sparkline group to a different worksheet + /// + /// The worksheet to copy the sparkline group to + public void CopyTo(IXLWorksheet targetSheet) + { + foreach (var slg in this) + { + slg.CopyTo(targetSheet); + } + } + + /// + /// Search for the first sparkline that is in the specified cell + /// + /// The cell to find the sparkline for + /// The sparkline in the cell or null if no sparklines are found + public IXLSparkline GetSparkline(IXLCell cell) + { + return _sparklineGroups + .Select(g => g.GetSparkline(cell)) + .FirstOrDefault(s => s != null); + } + + /// + /// Find all sparklines located in a given range + /// + /// The range to search + /// The sparkline in the cell or null if no sparklines are found + public IEnumerable GetSparklines(IXLRangeBase searchRange) + { + return _sparklineGroups + .SelectMany(g => g.GetSparklines(searchRange)); + } + + public IEnumerator GetEnumerator() + { + return _sparklineGroups.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + /// + /// Remove all sparklines in the specified cell + /// + /// The cell to remove sparklines from + public void Remove(IXLCell cell) + { + _sparklineGroups + .AsParallel() + .ForEach(g => g.Remove(cell)); + } + + public void Remove(IXLRangeBase range) + { + var sparklinesToRemove = _sparklineGroups + .SelectMany(g => g) + .Where(sparkline => range.Contains(sparkline.Location)) + .ToList(); + + sparklinesToRemove.ForEach(Remove); + } + + /// + /// Remove the sparkline group from the worksheet + /// + /// The sparkline group to remove + public void Remove(IXLSparklineGroup sparklineGroup) + { + _sparklineGroups.Remove(sparklineGroup); + } + + /// + /// Remove the sparkline from the worksheet + /// + /// The sparkline to remove + private void Remove(IXLSparkline sparkline) + { + sparkline.SparklineGroup.Remove(sparkline); + } + + /// + /// Remove all sparkline groups and their contents from the worksheet. + /// + public void RemoveAll() + { + _sparklineGroups.Clear(); + } + + #endregion Public Methods + + #region Private Fields + + private readonly List _sparklineGroups = new List(); + + #endregion Private Fields + } +} diff --git a/ClosedXML/Excel/Sparkline/XLSparklineHorizontalAxis.cs b/ClosedXML/Excel/Sparkline/XLSparklineHorizontalAxis.cs new file mode 100644 index 0000000..6570865 --- /dev/null +++ b/ClosedXML/Excel/Sparkline/XLSparklineHorizontalAxis.cs @@ -0,0 +1,60 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + internal class XLSparklineHorizontalAxis : IXLSparklineHorizontalAxis + { + #region Public Properties + + public XLColor Color { get; set; } + + public bool DateAxis => SparklineGroup.DateRange != null; + + public bool IsVisible { get; set; } + + public bool RightToLeft { get; set; } + + public IXLSparklineGroup SparklineGroup { get; } + + #endregion Public Properties + + #region Public Constructors + + public XLSparklineHorizontalAxis(IXLSparklineGroup sparklineGroup) + { + SparklineGroup = sparklineGroup ?? throw new ArgumentNullException(nameof(sparklineGroup)); + } + + #endregion Public Constructors + + #region Public Methods + + public IXLSparklineHorizontalAxis SetColor(XLColor value) + { + Color = value ?? throw new ArgumentNullException(nameof(value)); + return this; + } + + public IXLSparklineHorizontalAxis SetRightToLeft(bool value) + { + RightToLeft = value; + return this; + } + + public IXLSparklineHorizontalAxis SetVisible(bool value) + { + IsVisible = value; + return this; + } + + #endregion Public Methods + + public static void Copy(IXLSparklineHorizontalAxis from, IXLSparklineHorizontalAxis to) + { + to.Color = from.Color; + to.IsVisible = from.IsVisible; + to.RightToLeft = from.RightToLeft; + } + } +} diff --git a/ClosedXML/Excel/Sparkline/XLSparklineStyle.cs b/ClosedXML/Excel/Sparkline/XLSparklineStyle.cs new file mode 100644 index 0000000..1cdc30b --- /dev/null +++ b/ClosedXML/Excel/Sparkline/XLSparklineStyle.cs @@ -0,0 +1,149 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + internal class XLSparklineStyle : IXLSparklineStyle, IEquatable + { + #region Public Properties + + public XLColor FirstMarkerColor { get; set; } + + public XLColor HighMarkerColor { get; set; } + + public XLColor LastMarkerColor { get; set; } + + public XLColor LowMarkerColor { get; set; } + + public XLColor MarkersColor { get; set; } + + public XLColor NegativeColor { get; set; } + + public XLColor SeriesColor { get; set; } + + #endregion Public Properties + + #region Public Methods + + public IXLSparklineStyle SetFirstMarkerColor(XLColor value) + { + FirstMarkerColor = value; + return this; + } + + public IXLSparklineStyle SetHighMarkerColor(XLColor value) + { + HighMarkerColor = value; + return this; + } + + public IXLSparklineStyle SetLastMarkerColor(XLColor value) + { + LastMarkerColor = value; + return this; + } + + public IXLSparklineStyle SetLowMarkerColor(XLColor value) + { + LowMarkerColor = value; + return this; + } + + public IXLSparklineStyle SetMarkersColor(XLColor value) + { + MarkersColor = value; + return this; + } + + public IXLSparklineStyle SetNegativeColor(XLColor value) + { + NegativeColor = value; + return this; + } + + public IXLSparklineStyle SetSeriesColor(XLColor value) + { + SeriesColor = value; + return this; + } + + #endregion Public Methods + + public static void Copy(IXLSparklineStyle from, IXLSparklineStyle to) + { + to.FirstMarkerColor = from.FirstMarkerColor; + to.HighMarkerColor = from.HighMarkerColor; + to.LastMarkerColor = from.LastMarkerColor; + to.LowMarkerColor = from.LowMarkerColor; + to.MarkersColor = from.MarkersColor; + to.NegativeColor = from.NegativeColor; + to.SeriesColor = from.SeriesColor; + } + + #region IEquatable implementation + + /// Returns a value that indicates whether two objects have different values. + /// The first value to compare. + /// The second value to compare. + /// true if and are not equal; otherwise, false. + public static bool operator !=(XLSparklineStyle left, XLSparklineStyle right) + { + return !Equals(left, right); + } + + /// Returns a value that indicates whether the values of two objects are equal. + /// The first value to compare. + /// The second value to compare. + /// true if the and parameters have the same value; otherwise, false. + public static bool operator ==(XLSparklineStyle left, XLSparklineStyle right) + { + return Equals(left, right); + } + + /// Indicates whether the current object is equal to another object of the same type. + /// An object to compare with this object. + /// true if the current object is equal to the other parameter; otherwise, false. + public bool Equals(XLSparklineStyle other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return FirstMarkerColor.Equals(other.FirstMarkerColor) + && HighMarkerColor.Equals(other.HighMarkerColor) + && LastMarkerColor.Equals(other.LastMarkerColor) + && LowMarkerColor.Equals(other.LowMarkerColor) + && MarkersColor.Equals(other.MarkersColor) + && NegativeColor.Equals(other.NegativeColor) + && SeriesColor.Equals(other.SeriesColor); + } + + /// Determines whether the specified object is equal to the current object. + /// The object to compare with the current object. + /// true if the specified object is equal to the current object; otherwise, false. + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != typeof(XLSparklineStyle)) return false; + return Equals((XLSparklineStyle)obj); + } + + /// Serves as the default hash function. + /// A hash code for the current object. + public override int GetHashCode() + { + unchecked + { + var hashCode = FirstMarkerColor.GetHashCode(); + hashCode = (hashCode * 397) ^ HighMarkerColor.GetHashCode(); + hashCode = (hashCode * 397) ^ LastMarkerColor.GetHashCode(); + hashCode = (hashCode * 397) ^ LowMarkerColor.GetHashCode(); + hashCode = (hashCode * 397) ^ MarkersColor.GetHashCode(); + hashCode = (hashCode * 397) ^ NegativeColor.GetHashCode(); + hashCode = (hashCode * 397) ^ SeriesColor.GetHashCode(); + return hashCode; + } + } + + #endregion IEquatable implementation + } +} diff --git a/ClosedXML/Excel/Sparkline/XLSparklineTheme.cs b/ClosedXML/Excel/Sparkline/XLSparklineTheme.cs new file mode 100644 index 0000000..8e1dbe7 --- /dev/null +++ b/ClosedXML/Excel/Sparkline/XLSparklineTheme.cs @@ -0,0 +1,432 @@ +// Keep this file CodeMaid organised and cleaned +namespace ClosedXML.Excel +{ + public static class XLSparklineTheme + { + #region Public Properties + + public static IXLSparklineStyle Default => Dark5; + + #region Dark + + public static IXLSparklineStyle Dark1 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Text1, 0.499984740745262), + NegativeColor = XLColor.FromTheme(XLThemeColor.Text1, 0.249977111117893), + MarkersColor = XLColor.FromTheme(XLThemeColor.Text1, 0.249977111117893), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Text1, 0.249977111117893), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Text1, 0.249977111117893), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Text1, 0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Text1, 0.249977111117893) + }; + + public static IXLSparklineStyle Dark2 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Text1, 0.34998626667073579), + NegativeColor = XLColor.FromTheme(XLThemeColor.Background1, -0.249977111117893), + MarkersColor = XLColor.FromTheme(XLThemeColor.Background1, -0.249977111117893), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Background1, -0.249977111117893), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Background1, -0.249977111117893), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Background1, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Background1, -0.249977111117893) + }; + + public static IXLSparklineStyle Dark3 => new XLSparklineStyle + { + SeriesColor = XLColor.FromHtml("FF323232"), + NegativeColor = XLColor.FromHtml("FFD00000"), + MarkersColor = XLColor.FromHtml("FFD00000"), + HighMarkerColor = XLColor.FromHtml("FFD00000"), + LowMarkerColor = XLColor.FromHtml("FFD00000"), + FirstMarkerColor = XLColor.FromHtml("FFD00000"), + LastMarkerColor = XLColor.FromHtml("FFD00000") + }; + + public static IXLSparklineStyle Dark4 => new XLSparklineStyle + { + SeriesColor = XLColor.FromHtml("FF000000"), + NegativeColor = XLColor.FromHtml("FF0070C0"), + MarkersColor = XLColor.FromHtml("FF0070C0"), + HighMarkerColor = XLColor.FromHtml("FF0070C0"), + LowMarkerColor = XLColor.FromHtml("FF0070C0"), + FirstMarkerColor = XLColor.FromHtml("FF0070C0"), + LastMarkerColor = XLColor.FromHtml("FF0070C0") + }; + + public static IXLSparklineStyle Dark5 => new XLSparklineStyle + { + SeriesColor = XLColor.FromHtml("FF376092"), + NegativeColor = XLColor.FromHtml("FFD00000"), + MarkersColor = XLColor.FromHtml("FFD00000"), + HighMarkerColor = XLColor.FromHtml("FFD00000"), + LowMarkerColor = XLColor.FromHtml("FFD00000"), + FirstMarkerColor = XLColor.FromHtml("FFD00000"), + LastMarkerColor = XLColor.FromHtml("FFD00000") + }; + + public static IXLSparklineStyle Dark6 => new XLSparklineStyle + { + SeriesColor = XLColor.FromHtml("FF0070C0"), + NegativeColor = XLColor.Black, + MarkersColor = XLColor.Black, + HighMarkerColor = XLColor.Black, + LowMarkerColor = XLColor.Black, + FirstMarkerColor = XLColor.Black, + LastMarkerColor = XLColor.Black + }; + + #endregion Dark + + #region Colorful + + public static IXLSparklineStyle Colorful1 => new XLSparklineStyle + { + SeriesColor = XLColor.FromHtml("FF5F5F5F"), + NegativeColor = XLColor.FromHtml("FFFFB620"), + MarkersColor = XLColor.FromHtml("FFD70077"), + HighMarkerColor = XLColor.FromHtml("FF56BE79"), + LowMarkerColor = XLColor.FromHtml("FFFF5055"), + FirstMarkerColor = XLColor.FromHtml("FF5687C2"), + LastMarkerColor = XLColor.FromHtml("FF359CEB") + }; + + public static IXLSparklineStyle Colorful2 => new XLSparklineStyle + { + SeriesColor = XLColor.FromHtml("FF5687C2"), + NegativeColor = XLColor.FromHtml("FFFFB620"), + MarkersColor = XLColor.FromHtml("FFD70077"), + HighMarkerColor = XLColor.FromHtml("FF56BE79"), + LowMarkerColor = XLColor.FromHtml("FFFF5055"), + FirstMarkerColor = XLColor.FromHtml("FF777777"), + LastMarkerColor = XLColor.FromHtml("FF359CEB") + }; + + public static IXLSparklineStyle Colorful3 => new XLSparklineStyle + { + SeriesColor = XLColor.FromHtml("FFC6EFCE"), + NegativeColor = XLColor.FromHtml("FFFFC7CE"), + MarkersColor = XLColor.FromHtml("FF8CADD6"), + HighMarkerColor = XLColor.FromHtml("FF60D276"), + LowMarkerColor = XLColor.FromHtml("FFFF5367"), + FirstMarkerColor = XLColor.FromHtml("FFFFDC47"), + LastMarkerColor = XLColor.FromHtml("FFFFEB9C") + }; + + public static IXLSparklineStyle Colorful4 => new XLSparklineStyle + { + SeriesColor = XLColor.FromHtml("FF00B050"), + NegativeColor = XLColor.FromHtml("FFFF0000"), + MarkersColor = XLColor.FromHtml("FF0070C0"), + HighMarkerColor = XLColor.FromHtml("FF00B050"), + LowMarkerColor = XLColor.FromHtml("FFFF0000"), + FirstMarkerColor = XLColor.FromHtml("FFFFC000"), + LastMarkerColor = XLColor.FromHtml("FFFFC000") + }; + + public static IXLSparklineStyle Colorful5 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Text2), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent6), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent5), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2) + }; + + public static IXLSparklineStyle Colorful6 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Text1), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent6), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent5), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2) + }; + + #endregion Colorful + + #region Accent + + public static IXLSparklineStyle Accent1 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent1), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent2), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.249977111117893), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.249977111117893), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.249977111117893), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.249977111117893) + }; + + public static IXLSparklineStyle Accent2 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent2), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent3), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.249977111117893), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.249977111117893), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.249977111117893), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.249977111117893) + }; + + public static IXLSparklineStyle Accent3 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent3), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent4), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.249977111117893), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.249977111117893), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.249977111117893), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.249977111117893) + }; + + public static IXLSparklineStyle Accent4 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent4), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent5), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.249977111117893), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.249977111117893), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.249977111117893), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.249977111117893) + }; + + public static IXLSparklineStyle Accent5 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent5), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent6), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.249977111117893), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.249977111117893), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.249977111117893), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.249977111117893) + }; + + public static IXLSparklineStyle Accent6 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent6), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent1), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.249977111117893), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.249977111117893), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.249977111117893), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.249977111117893) + }; + + #endregion Accent + + #region Accent Darker 25% + + public static IXLSparklineStyle Accent1Darker25 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.249977111117893), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent2), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.249977111117893), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.249977111117893), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.249977111117893), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.249977111117893) + }; + + public static IXLSparklineStyle Accent2Darker25 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.249977111117893), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent3), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.249977111117893), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.249977111117893), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.249977111117893), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.249977111117893) + }; + + public static IXLSparklineStyle Accent3Darker25 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.249977111117893), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent4), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.249977111117893), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.249977111117893), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.249977111117893), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.249977111117893) + }; + + public static IXLSparklineStyle Accent4Darker25 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.249977111117893), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent5), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.249977111117893), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.249977111117893), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.249977111117893), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.249977111117893) + }; + + public static IXLSparklineStyle Accent5Darker25 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.249977111117893), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent6), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.249977111117893), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.249977111117893), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.249977111117893), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.249977111117893) + }; + + public static IXLSparklineStyle Accent6Darker25 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.249977111117893), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent1), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.249977111117893), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.249977111117893), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.249977111117893), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.249977111117893) + }; + + #endregion Accent Darker 25% + + #region Accent Darker 50% + + public static IXLSparklineStyle Accent1Darker50 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.499984740745262), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent2), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.499984740745262), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1, 0.39997558519241921), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1, 0.39997558519241921) + }; + + public static IXLSparklineStyle Accent2Darker50 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.499984740745262), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent3), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.499984740745262), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2, 0.39997558519241921), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2, 0.39997558519241921) + }; + + public static IXLSparklineStyle Accent3Darker50 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.499984740745262), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent4), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.499984740745262), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3, 0.39997558519241921), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3, 0.39997558519241921) + }; + + public static IXLSparklineStyle Accent4Darker50 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.499984740745262), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent5), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.499984740745262), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4, 0.39997558519241921), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4, 0.39997558519241921) + }; + + public static IXLSparklineStyle Accent5Darker50 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.499984740745262), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent6), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.499984740745262), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5, 0.39997558519241921), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5, 0.39997558519241921) + }; + + public static IXLSparklineStyle Accent6Darker50 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.499984740745262), + NegativeColor = XLColor.FromTheme(XLThemeColor.Accent1), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.499984740745262), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6, 0.39997558519241921), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6, 0.39997558519241921) + }; + + #endregion Accent Darker 50% + + #region Accent Lighter 40% + + public static IXLSparklineStyle Accent1Lighter40 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent1, 0.39997558519241921), + NegativeColor = XLColor.FromTheme(XLThemeColor.Background1, -0.499984740745262), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent1, 0.79998168889431442), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.499984740745262), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.499984740745262), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent1, -0.249977111117893) + }; + + public static IXLSparklineStyle Accent2Lighter40 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent2, 0.39997558519241921), + NegativeColor = XLColor.FromTheme(XLThemeColor.Background1, -0.499984740745262), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent2, 0.79998168889431442), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.499984740745262), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.499984740745262), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent2, -0.249977111117893) + }; + + public static IXLSparklineStyle Accent3Lighter40 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent3, 0.39997558519241921), + NegativeColor = XLColor.FromTheme(XLThemeColor.Background1, -0.499984740745262), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent3, 0.79998168889431442), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.499984740745262), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.499984740745262), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent3, -0.249977111117893) + }; + + public static IXLSparklineStyle Accent4Lighter40 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent4, 0.39997558519241921), + NegativeColor = XLColor.FromTheme(XLThemeColor.Background1, -0.499984740745262), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent4, 0.79998168889431442), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.499984740745262), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.499984740745262), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent4, -0.249977111117893) + }; + + public static IXLSparklineStyle Accent5Lighter40 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent5, 0.39997558519241921), + NegativeColor = XLColor.FromTheme(XLThemeColor.Background1, -0.499984740745262), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent5, 0.79998168889431442), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.499984740745262), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.499984740745262), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent5, -0.249977111117893) + }; + + public static IXLSparklineStyle Accent6Lighter40 => new XLSparklineStyle + { + SeriesColor = XLColor.FromTheme(XLThemeColor.Accent6, 0.39997558519241921), + NegativeColor = XLColor.FromTheme(XLThemeColor.Background1, -0.499984740745262), + MarkersColor = XLColor.FromTheme(XLThemeColor.Accent6, 0.79998168889431442), + HighMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.499984740745262), + LowMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.499984740745262), + FirstMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.249977111117893), + LastMarkerColor = XLColor.FromTheme(XLThemeColor.Accent6, -0.249977111117893) + }; + + #endregion Accent Lighter 40% + + #endregion Public Properties + } +} diff --git a/ClosedXML/Excel/Sparkline/XLSparklineVerticalAxis.cs b/ClosedXML/Excel/Sparkline/XLSparklineVerticalAxis.cs new file mode 100644 index 0000000..9831e47 --- /dev/null +++ b/ClosedXML/Excel/Sparkline/XLSparklineVerticalAxis.cs @@ -0,0 +1,100 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + internal class XLSparklineVerticalAxis : IXLSparklineVerticalAxis + { + #region Public Properties + + public Double? ManualMax + { + get => _manualMax; + set => SetManualMax(value); + } + + public Double? ManualMin + { + get => _manualMin; + set => SetManualMin(value); + } + + public XLSparklineAxisMinMax MaxAxisType + { + get => _maxAxisType; + set => SetMaxAxisType(value); + } + + public XLSparklineAxisMinMax MinAxisType + { + get => _minAxisType; + set => SetMinAxisType(value); + } + + #endregion Public Properties + + #region Public Methods + + public IXLSparklineVerticalAxis SetManualMax(Double? manualMax) + { + if (manualMax != null) + MaxAxisType = XLSparklineAxisMinMax.Custom; + + _manualMax = manualMax; + return this; + } + + public IXLSparklineVerticalAxis SetManualMin(Double? manualMin) + { + if (manualMin != null) + MinAxisType = XLSparklineAxisMinMax.Custom; + + _manualMin = manualMin; + return this; + } + + public IXLSparklineVerticalAxis SetMaxAxisType(XLSparklineAxisMinMax maxAxisType) + { + if (maxAxisType != XLSparklineAxisMinMax.Custom) + _manualMax = null; + + _maxAxisType = maxAxisType; + return this; + } + + public IXLSparklineVerticalAxis SetMinAxisType(XLSparklineAxisMinMax minAxisType) + { + if (minAxisType != XLSparklineAxisMinMax.Custom) + _manualMin = null; + + _minAxisType = minAxisType; + return this; + } + + #endregion Public Methods + + #region Private Fields + + private Double? _manualMax; + private Double? _manualMin; + private XLSparklineAxisMinMax _maxAxisType; + private XLSparklineAxisMinMax _minAxisType; + + #endregion Private Fields + + public IXLSparklineGroup SparklineGroup { get; } + + public XLSparklineVerticalAxis(IXLSparklineGroup sparklineGroup) + { + SparklineGroup = sparklineGroup ?? throw new ArgumentNullException(nameof(sparklineGroup)); + } + + public static void Copy(IXLSparklineVerticalAxis from, IXLSparklineVerticalAxis to) + { + to.ManualMax = from.ManualMax; + to.ManualMin = from.ManualMin; + to.MaxAxisType = from.MaxAxisType; + to.MinAxisType = from.MinAxisType; + } + } +} diff --git a/ClosedXML/Excel/Style/Colors/XLColor_Internal.cs b/ClosedXML/Excel/Style/Colors/XLColor_Internal.cs new file mode 100644 index 0000000..3919bf8 --- /dev/null +++ b/ClosedXML/Excel/Style/Colors/XLColor_Internal.cs @@ -0,0 +1,58 @@ +using System; +using System.Drawing; + +namespace ClosedXML.Excel +{ + public partial class XLColor + { + internal XLColorKey Key { get; private set; } + + private XLColor(XLColor defaultColor) : this(defaultColor.Key) + { + } + + private XLColor() : this(new XLColorKey()) + { + HasValue = false; + } + + private XLColor(Color color) : this(new XLColorKey + { + Color = color, + ColorType = XLColorType.Color + }) + { + } + + private XLColor(Int32 index) : this(new XLColorKey + { + Indexed = index, + ColorType = XLColorType.Indexed + }) + { + } + + private XLColor(XLThemeColor themeColor) : this(new XLColorKey + { + ThemeColor = themeColor, + ColorType = XLColorType.Theme + }) + { + } + + private XLColor(XLThemeColor themeColor, Double themeTint) : this(new XLColorKey + { + ThemeColor = themeColor, + ThemeTint = themeTint, + ColorType = XLColorType.Theme + }) + { + } + + internal XLColor(XLColorKey key) + { + Key = key; + HasValue = true; + } + } +} diff --git a/ClosedXML/Excel/Style/Colors/XLColor_Public.cs b/ClosedXML/Excel/Style/Colors/XLColor_Public.cs new file mode 100644 index 0000000..a75edcf --- /dev/null +++ b/ClosedXML/Excel/Style/Colors/XLColor_Public.cs @@ -0,0 +1,154 @@ +using System; +using System.Drawing; + +namespace ClosedXML.Excel +{ + public enum XLColorType + { + Color, + Theme, + Indexed + } + + public enum XLThemeColor + { + Background1, + Text1, + Background2, + Text2, + Accent1, + Accent2, + Accent3, + Accent4, + Accent5, + Accent6, + Hyperlink, + FollowedHyperlink + } + + public partial class XLColor : IEquatable + { + /// + /// Usually indexed colors are limited to max 63 + /// Index 81 is some special case. + /// Some people claim it's the index for tooltip color. + /// We'll return normal black when index 81 is found. + /// + private const Int32 TOOLTIPCOLORINDEX = 81; + + public Boolean HasValue { get; private set; } + + public XLColorType ColorType + { + get { return Key.ColorType; } + } + + public Color Color + { + get + { + if (ColorType == XLColorType.Theme) + throw new InvalidOperationException("Cannot convert theme color to Color."); + + if (ColorType == XLColorType.Indexed) + if (Indexed == TOOLTIPCOLORINDEX) + return Color.FromArgb(255, Color.Black); + else + return IndexedColors[Indexed].Color; + + return Key.Color; + } + } + + public Int32 Indexed + { + get + { + if (ColorType == XLColorType.Theme) + throw new InvalidOperationException("Cannot convert theme color to indexed color."); + + if (ColorType == XLColorType.Indexed) + return Key.Indexed; + + throw new InvalidOperationException("Cannot convert Color to indexed color."); + } + } + + public XLThemeColor ThemeColor + { + get + { + if (ColorType == XLColorType.Theme) + return Key.ThemeColor; + + if (ColorType == XLColorType.Indexed) + throw new InvalidOperationException("Cannot convert indexed color to theme color."); + + throw new InvalidOperationException("Cannot convert Color to theme color."); + } + } + + public Double ThemeTint + { + get + { + if (ColorType == XLColorType.Theme) + return Key.ThemeTint; + + if (ColorType == XLColorType.Indexed) + throw new InvalidOperationException("Cannot extract theme tint from an indexed color."); + + return Color.A / 255.0; + } + } + + #region IEquatable Members + + public bool Equals(XLColor other) + { + return Key == other.Key; + } + + #endregion IEquatable Members + + public override bool Equals(object obj) + { + return Equals((XLColor)obj); + } + + public override int GetHashCode() + { + var hashCode = 229333804; + hashCode = hashCode * -1521134295 + HasValue.GetHashCode(); + hashCode = hashCode * -1521134295 + Key.GetHashCode(); + return hashCode; + } + + public override string ToString() + { + if (ColorType == XLColorType.Color) + return Color.ToHex(); + + if (ColorType == XLColorType.Theme) + return String.Format("Color Theme: {0}, Tint: {1}", ThemeColor.ToString(), ThemeTint.ToString()); + + return "Color Index: " + Indexed; + } + + public static Boolean operator ==(XLColor left, XLColor right) + { + // If both are null, or both are same instance, return true. + if (ReferenceEquals(left, right)) return true; + + // If one is null, but not both, return false. + if ((left as object) == null || (right as Object) == null) return false; + + return left.Equals(right); + } + + public static Boolean operator !=(XLColor left, XLColor right) + { + return !(left == right); + } + } +} diff --git a/ClosedXML/Excel/Style/Colors/XLColor_Static.cs b/ClosedXML/Excel/Style/Colors/XLColor_Static.cs new file mode 100644 index 0000000..9fa5bc5 --- /dev/null +++ b/ClosedXML/Excel/Style/Colors/XLColor_Static.cs @@ -0,0 +1,1659 @@ +using ClosedXML.Excel.Caching; +using ClosedXML.Utils; +using System; +using System.Collections.Generic; +using System.Drawing; + +namespace ClosedXML.Excel +{ + public partial class XLColor + { + private static readonly XLColorRepository Repository = new XLColorRepository(key => new XLColor(key)); + + private static readonly Dictionary ByColor = new Dictionary(); + private static readonly Object ByColorLock = new Object(); + + internal static XLColor FromKey(ref XLColorKey key) + { + return Repository.GetOrCreate(ref key); + } + + public static XLColor FromColor(Color color) + { + var key = new XLColorKey + { + ColorType = XLColorType.Color, + Color = color + }; + return FromKey(ref key); + } + + public static XLColor FromArgb(Int32 argb) + { + return FromColor(Color.FromArgb(argb)); + } + + public static XLColor FromArgb(Int32 r, Int32 g, Int32 b) + { + return FromColor(Color.FromArgb(r, g, b)); + } + + public static XLColor FromArgb(Int32 a, Int32 r, Int32 g, Int32 b) + { + return FromColor(Color.FromArgb(a, r, g, b)); + } + +#if _NETFRAMEWORK_ + public static XLColor FromKnownColor(KnownColor color) + { + return FromColor(Color.FromKnownColor(color)); + } +#endif + + public static XLColor FromName(String name) + { + return FromColor(Color.FromName(name)); + } + + public static XLColor FromHtml(String htmlColor) + { + return FromColor(ColorStringParser.ParseFromHtml(htmlColor)); + } + + public static XLColor FromIndex(Int32 index) + { + var key = new XLColorKey + { + ColorType = XLColorType.Indexed, + Indexed = index + }; + return FromKey(ref key); + } + + public static XLColor FromTheme(XLThemeColor themeColor) + { + var key = new XLColorKey + { + ColorType = XLColorType.Theme, + ThemeColor = themeColor + }; + return FromKey(ref key); + } + + public static XLColor FromTheme(XLThemeColor themeColor, Double themeTint) + { + var key = new XLColorKey + { + ColorType = XLColorType.Theme, + ThemeColor = themeColor, + ThemeTint = themeTint + }; + return FromKey(ref key); + } + + private static Dictionary _indexedColors; + + public static Dictionary IndexedColors + { + get + { + if (_indexedColors == null) + { + var retVal = new Dictionary + { + {0, FromHtml("#FF000000")}, + {1, FromHtml("#FFFFFFFF")}, + {2, FromHtml("#FFFF0000")}, + {3, FromHtml("#FF00FF00")}, + {4, FromHtml("#FF0000FF")}, + {5, FromHtml("#FFFFFF00")}, + {6, FromHtml("#FFFF00FF")}, + {7, FromHtml("#FF00FFFF")}, + {8, FromHtml("#FF000000")}, + {9, FromHtml("#FFFFFFFF")}, + {10, FromHtml("#FFFF0000")}, + {11, FromHtml("#FF00FF00")}, + {12, FromHtml("#FF0000FF")}, + {13, FromHtml("#FFFFFF00")}, + {14, FromHtml("#FFFF00FF")}, + {15, FromHtml("#FF00FFFF")}, + {16, FromHtml("#FF800000")}, + {17, FromHtml("#FF008000")}, + {18, FromHtml("#FF000080")}, + {19, FromHtml("#FF808000")}, + {20, FromHtml("#FF800080")}, + {21, FromHtml("#FF008080")}, + {22, FromHtml("#FFC0C0C0")}, + {23, FromHtml("#FF808080")}, + {24, FromHtml("#FF9999FF")}, + {25, FromHtml("#FF993366")}, + {26, FromHtml("#FFFFFFCC")}, + {27, FromHtml("#FFCCFFFF")}, + {28, FromHtml("#FF660066")}, + {29, FromHtml("#FFFF8080")}, + {30, FromHtml("#FF0066CC")}, + {31, FromHtml("#FFCCCCFF")}, + {32, FromHtml("#FF000080")}, + {33, FromHtml("#FFFF00FF")}, + {34, FromHtml("#FFFFFF00")}, + {35, FromHtml("#FF00FFFF")}, + {36, FromHtml("#FF800080")}, + {37, FromHtml("#FF800000")}, + {38, FromHtml("#FF008080")}, + {39, FromHtml("#FF0000FF")}, + {40, FromHtml("#FF00CCFF")}, + {41, FromHtml("#FFCCFFFF")}, + {42, FromHtml("#FFCCFFCC")}, + {43, FromHtml("#FFFFFF99")}, + {44, FromHtml("#FF99CCFF")}, + {45, FromHtml("#FFFF99CC")}, + {46, FromHtml("#FFCC99FF")}, + {47, FromHtml("#FFFFCC99")}, + {48, FromHtml("#FF3366FF")}, + {49, FromHtml("#FF33CCCC")}, + {50, FromHtml("#FF99CC00")}, + {51, FromHtml("#FFFFCC00")}, + {52, FromHtml("#FFFF9900")}, + {53, FromHtml("#FFFF6600")}, + {54, FromHtml("#FF666699")}, + {55, FromHtml("#FF969696")}, + {56, FromHtml("#FF003366")}, + {57, FromHtml("#FF339966")}, + {58, FromHtml("#FF003300")}, + {59, FromHtml("#FF333300")}, + {60, FromHtml("#FF993300")}, + {61, FromHtml("#FF993366")}, + {62, FromHtml("#FF333399")}, + {63, FromHtml("#FF333333")}, + {64, FromColor(Color.Transparent)} + }; + _indexedColors = retVal; + } + return _indexedColors; + } + } + + internal static bool IsNullOrTransparent(XLColor color) + { + return color == null + || !color.HasValue + || IsTransparent(color.Key); + } + + internal static bool IsTransparent(in XLColorKey colorKey) + { + return colorKey == NoColor.Key + || (colorKey.ColorType == XLColorType.Indexed && colorKey.Indexed == 64); + } + + public static XLColor NoColor { get; } = new XLColor(); + + public static XLColor AliceBlue { get { return FromColor(Color.AliceBlue); } } + + public static XLColor AntiqueWhite { get { return FromColor(Color.AntiqueWhite); } } + + public static XLColor Aqua { get { return FromColor(Color.Aqua); } } + + public static XLColor Aquamarine { get { return FromColor(Color.Aquamarine); } } + + public static XLColor Azure { get { return FromColor(Color.Azure); } } + + public static XLColor Beige { get { return FromColor(Color.Beige); } } + + public static XLColor Bisque { get { return FromColor(Color.Bisque); } } + + public static XLColor Black { get { return FromColor(Color.Black); } } + + public static XLColor BlanchedAlmond { get { return FromColor(Color.BlanchedAlmond); } } + + public static XLColor Blue { get { return FromColor(Color.Blue); } } + + public static XLColor BlueViolet { get { return FromColor(Color.BlueViolet); } } + + public static XLColor Brown { get { return FromColor(Color.Brown); } } + + public static XLColor BurlyWood { get { return FromColor(Color.BurlyWood); } } + + public static XLColor CadetBlue { get { return FromColor(Color.CadetBlue); } } + + public static XLColor Chartreuse { get { return FromColor(Color.Chartreuse); } } + + public static XLColor Chocolate { get { return FromColor(Color.Chocolate); } } + + public static XLColor Coral { get { return FromColor(Color.Coral); } } + + public static XLColor CornflowerBlue { get { return FromColor(Color.CornflowerBlue); } } + + public static XLColor Cornsilk { get { return FromColor(Color.Cornsilk); } } + + public static XLColor Crimson { get { return FromColor(Color.Crimson); } } + + public static XLColor Cyan { get { return FromColor(Color.Cyan); } } + + public static XLColor DarkBlue { get { return FromColor(Color.DarkBlue); } } + + public static XLColor DarkCyan { get { return FromColor(Color.DarkCyan); } } + + public static XLColor DarkGoldenrod { get { return FromColor(Color.DarkGoldenrod); } } + + public static XLColor DarkGray { get { return FromColor(Color.DarkGray); } } + + public static XLColor DarkGreen { get { return FromColor(Color.DarkGreen); } } + + public static XLColor DarkKhaki { get { return FromColor(Color.DarkKhaki); } } + + public static XLColor DarkMagenta { get { return FromColor(Color.DarkMagenta); } } + + public static XLColor DarkOliveGreen { get { return FromColor(Color.DarkOliveGreen); } } + + public static XLColor DarkOrange { get { return FromColor(Color.DarkOrange); } } + + public static XLColor DarkOrchid { get { return FromColor(Color.DarkOrchid); } } + + public static XLColor DarkRed { get { return FromColor(Color.DarkRed); } } + + public static XLColor DarkSalmon { get { return FromColor(Color.DarkSalmon); } } + + public static XLColor DarkSeaGreen { get { return FromColor(Color.DarkSeaGreen); } } + + public static XLColor DarkSlateBlue { get { return FromColor(Color.DarkSlateBlue); } } + + public static XLColor DarkSlateGray { get { return FromColor(Color.DarkSlateGray); } } + + public static XLColor DarkTurquoise { get { return FromColor(Color.DarkTurquoise); } } + + public static XLColor DarkViolet { get { return FromColor(Color.DarkViolet); } } + + public static XLColor DeepPink { get { return FromColor(Color.DeepPink); } } + + public static XLColor DeepSkyBlue { get { return FromColor(Color.DeepSkyBlue); } } + + public static XLColor DimGray { get { return FromColor(Color.DimGray); } } + + public static XLColor DodgerBlue { get { return FromColor(Color.DodgerBlue); } } + + public static XLColor Firebrick { get { return FromColor(Color.Firebrick); } } + + public static XLColor FloralWhite { get { return FromColor(Color.FloralWhite); } } + + public static XLColor ForestGreen { get { return FromColor(Color.ForestGreen); } } + + public static XLColor Fuchsia { get { return FromColor(Color.Fuchsia); } } + + public static XLColor Gainsboro { get { return FromColor(Color.Gainsboro); } } + + public static XLColor GhostWhite { get { return FromColor(Color.GhostWhite); } } + + public static XLColor Gold { get { return FromColor(Color.Gold); } } + + public static XLColor Goldenrod { get { return FromColor(Color.Goldenrod); } } + + public static XLColor Gray { get { return FromColor(Color.Gray); } } + + public static XLColor Green { get { return FromColor(Color.Green); } } + + public static XLColor GreenYellow { get { return FromColor(Color.GreenYellow); } } + + public static XLColor Honeydew { get { return FromColor(Color.Honeydew); } } + + public static XLColor HotPink { get { return FromColor(Color.HotPink); } } + + public static XLColor IndianRed { get { return FromColor(Color.IndianRed); } } + + public static XLColor Indigo { get { return FromColor(Color.Indigo); } } + + public static XLColor Ivory { get { return FromColor(Color.Ivory); } } + + public static XLColor Khaki { get { return FromColor(Color.Khaki); } } + + public static XLColor Lavender { get { return FromColor(Color.Lavender); } } + + public static XLColor LavenderBlush { get { return FromColor(Color.LavenderBlush); } } + + public static XLColor LawnGreen { get { return FromColor(Color.LawnGreen); } } + + public static XLColor LemonChiffon { get { return FromColor(Color.LemonChiffon); } } + + public static XLColor LightBlue { get { return FromColor(Color.LightBlue); } } + + public static XLColor LightCoral { get { return FromColor(Color.LightCoral); } } + + public static XLColor LightCyan { get { return FromColor(Color.LightCyan); } } + + public static XLColor LightGoldenrodYellow { get { return FromColor(Color.LightGoldenrodYellow); } } + + public static XLColor LightGray { get { return FromColor(Color.LightGray); } } + + public static XLColor LightGreen { get { return FromColor(Color.LightGreen); } } + + public static XLColor LightPink { get { return FromColor(Color.LightPink); } } + + public static XLColor LightSalmon { get { return FromColor(Color.LightSalmon); } } + + public static XLColor LightSeaGreen { get { return FromColor(Color.LightSeaGreen); } } + + public static XLColor LightSkyBlue { get { return FromColor(Color.LightSkyBlue); } } + + public static XLColor LightSlateGray { get { return FromColor(Color.LightSlateGray); } } + + public static XLColor LightSteelBlue { get { return FromColor(Color.LightSteelBlue); } } + + public static XLColor LightYellow { get { return FromColor(Color.LightYellow); } } + + public static XLColor Lime { get { return FromColor(Color.Lime); } } + + public static XLColor LimeGreen { get { return FromColor(Color.LimeGreen); } } + + public static XLColor Linen { get { return FromColor(Color.Linen); } } + + public static XLColor Magenta { get { return FromColor(Color.Magenta); } } + + public static XLColor Maroon { get { return FromColor(Color.Maroon); } } + + public static XLColor MediumAquamarine { get { return FromColor(Color.MediumAquamarine); } } + + public static XLColor MediumBlue { get { return FromColor(Color.MediumBlue); } } + + public static XLColor MediumOrchid { get { return FromColor(Color.MediumOrchid); } } + + public static XLColor MediumPurple { get { return FromColor(Color.MediumPurple); } } + + public static XLColor MediumSeaGreen { get { return FromColor(Color.MediumSeaGreen); } } + + public static XLColor MediumSlateBlue { get { return FromColor(Color.MediumSlateBlue); } } + + public static XLColor MediumSpringGreen { get { return FromColor(Color.MediumSpringGreen); } } + + public static XLColor MediumTurquoise { get { return FromColor(Color.MediumTurquoise); } } + + public static XLColor MediumVioletRed { get { return FromColor(Color.MediumVioletRed); } } + + public static XLColor MidnightBlue { get { return FromColor(Color.MidnightBlue); } } + + public static XLColor MintCream { get { return FromColor(Color.MintCream); } } + + public static XLColor MistyRose { get { return FromColor(Color.MistyRose); } } + + public static XLColor Moccasin { get { return FromColor(Color.Moccasin); } } + + public static XLColor NavajoWhite { get { return FromColor(Color.NavajoWhite); } } + + public static XLColor Navy { get { return FromColor(Color.Navy); } } + + public static XLColor OldLace { get { return FromColor(Color.OldLace); } } + + public static XLColor Olive { get { return FromColor(Color.Olive); } } + + public static XLColor OliveDrab { get { return FromColor(Color.OliveDrab); } } + + public static XLColor Orange { get { return FromColor(Color.Orange); } } + + public static XLColor OrangeRed { get { return FromColor(Color.OrangeRed); } } + + public static XLColor Orchid { get { return FromColor(Color.Orchid); } } + + public static XLColor PaleGoldenrod { get { return FromColor(Color.PaleGoldenrod); } } + + public static XLColor PaleGreen { get { return FromColor(Color.PaleGreen); } } + + public static XLColor PaleTurquoise { get { return FromColor(Color.PaleTurquoise); } } + + public static XLColor PaleVioletRed { get { return FromColor(Color.PaleVioletRed); } } + + public static XLColor PapayaWhip { get { return FromColor(Color.PapayaWhip); } } + + public static XLColor PeachPuff { get { return FromColor(Color.PeachPuff); } } + + public static XLColor Peru { get { return FromColor(Color.Peru); } } + + public static XLColor Pink { get { return FromColor(Color.Pink); } } + + public static XLColor Plum { get { return FromColor(Color.Plum); } } + + public static XLColor PowderBlue { get { return FromColor(Color.PowderBlue); } } + + public static XLColor Purple { get { return FromColor(Color.Purple); } } + + public static XLColor Red { get { return FromColor(Color.Red); } } + + public static XLColor RosyBrown { get { return FromColor(Color.RosyBrown); } } + + public static XLColor RoyalBlue { get { return FromColor(Color.RoyalBlue); } } + + public static XLColor SaddleBrown { get { return FromColor(Color.SaddleBrown); } } + + public static XLColor Salmon { get { return FromColor(Color.Salmon); } } + + public static XLColor SandyBrown { get { return FromColor(Color.SandyBrown); } } + + public static XLColor SeaGreen { get { return FromColor(Color.SeaGreen); } } + + public static XLColor SeaShell { get { return FromColor(Color.SeaShell); } } + + public static XLColor Sienna { get { return FromColor(Color.Sienna); } } + + public static XLColor Silver { get { return FromColor(Color.Silver); } } + + public static XLColor SkyBlue { get { return FromColor(Color.SkyBlue); } } + + public static XLColor SlateBlue { get { return FromColor(Color.SlateBlue); } } + + public static XLColor SlateGray { get { return FromColor(Color.SlateGray); } } + + public static XLColor Snow { get { return FromColor(Color.Snow); } } + + public static XLColor SpringGreen { get { return FromColor(Color.SpringGreen); } } + + public static XLColor SteelBlue { get { return FromColor(Color.SteelBlue); } } + + public static XLColor Tan { get { return FromColor(Color.Tan); } } + + public static XLColor Teal { get { return FromColor(Color.Teal); } } + + public static XLColor Thistle { get { return FromColor(Color.Thistle); } } + + public static XLColor Tomato { get { return FromColor(Color.Tomato); } } + + public static XLColor Turquoise { get { return FromColor(Color.Turquoise); } } + + public static XLColor Violet { get { return FromColor(Color.Violet); } } + + public static XLColor Wheat { get { return FromColor(Color.Wheat); } } + + public static XLColor White { get { return FromColor(Color.White); } } + + public static XLColor WhiteSmoke { get { return FromColor(Color.WhiteSmoke); } } + + public static XLColor Yellow { get { return FromColor(Color.Yellow); } } + + public static XLColor YellowGreen { get { return FromColor(Color.YellowGreen); } } + + public static XLColor AirForceBlue { get { return FromHtml("#FF5D8AA8"); } } + + public static XLColor Alizarin { get { return FromHtml("#FFE32636"); } } + + public static XLColor Almond { get { return FromHtml("#FFEFDECD"); } } + + public static XLColor Amaranth { get { return FromHtml("#FFE52B50"); } } + + public static XLColor Amber { get { return FromHtml("#FFFFBF00"); } } + + public static XLColor AmberSaeEce { get { return FromHtml("#FFFF7E00"); } } + + public static XLColor AmericanRose { get { return FromHtml("#FFFF033E"); } } + + public static XLColor Amethyst { get { return FromHtml("#FF9966CC"); } } + + public static XLColor AntiFlashWhite { get { return FromHtml("#FFF2F3F4"); } } + + public static XLColor AntiqueBrass { get { return FromHtml("#FFCD9575"); } } + + public static XLColor AntiqueFuchsia { get { return FromHtml("#FF915C83"); } } + + public static XLColor AppleGreen { get { return FromHtml("#FF8DB600"); } } + + public static XLColor Apricot { get { return FromHtml("#FFFBCEB1"); } } + + public static XLColor Aquamarine1 { get { return FromHtml("#FF7FFFD0"); } } + + public static XLColor ArmyGreen { get { return FromHtml("#FF4B5320"); } } + + public static XLColor Arsenic { get { return FromHtml("#FF3B444B"); } } + + public static XLColor ArylideYellow { get { return FromHtml("#FFE9D66B"); } } + + public static XLColor AshGrey { get { return FromHtml("#FFB2BEB5"); } } + + public static XLColor Asparagus { get { return FromHtml("#FF87A96B"); } } + + public static XLColor AtomicTangerine { get { return FromHtml("#FFFF9966"); } } + + public static XLColor Auburn { get { return FromHtml("#FF6D351A"); } } + + public static XLColor Aureolin { get { return FromHtml("#FFFDEE00"); } } + + public static XLColor Aurometalsaurus { get { return FromHtml("#FF6E7F80"); } } + + public static XLColor Awesome { get { return FromHtml("#FFFF2052"); } } + + public static XLColor AzureColorWheel { get { return FromHtml("#FF007FFF"); } } + + public static XLColor BabyBlue { get { return FromHtml("#FF89CFF0"); } } + + public static XLColor BabyBlueEyes { get { return FromHtml("#FFA1CAF1"); } } + + public static XLColor BabyPink { get { return FromHtml("#FFF4C2C2"); } } + + public static XLColor BallBlue { get { return FromHtml("#FF21ABCD"); } } + + public static XLColor BananaMania { get { return FromHtml("#FFFAE7B5"); } } + + public static XLColor BattleshipGrey { get { return FromHtml("#FF848482"); } } + + public static XLColor Bazaar { get { return FromHtml("#FF98777B"); } } + + public static XLColor BeauBlue { get { return FromHtml("#FFBCD4E6"); } } + + public static XLColor Beaver { get { return FromHtml("#FF9F8170"); } } + + public static XLColor Bistre { get { return FromHtml("#FF3D2B1F"); } } + + public static XLColor Bittersweet { get { return FromHtml("#FFFE6F5E"); } } + + public static XLColor BleuDeFrance { get { return FromHtml("#FF318CE7"); } } + + public static XLColor BlizzardBlue { get { return FromHtml("#FFACE5EE"); } } + + public static XLColor Blond { get { return FromHtml("#FFFAF0BE"); } } + + public static XLColor BlueBell { get { return FromHtml("#FFA2A2D0"); } } + + public static XLColor BlueGray { get { return FromHtml("#FF6699CC"); } } + + public static XLColor BlueGreen { get { return FromHtml("#FF00DDDD"); } } + + public static XLColor BluePigment { get { return FromHtml("#FF333399"); } } + + public static XLColor BlueRyb { get { return FromHtml("#FF0247FE"); } } + + public static XLColor Blush { get { return FromHtml("#FFDE5D83"); } } + + public static XLColor Bole { get { return FromHtml("#FF79443B"); } } + + public static XLColor BondiBlue { get { return FromHtml("#FF0095B6"); } } + + public static XLColor BostonUniversityRed { get { return FromHtml("#FFCC0000"); } } + + public static XLColor BrandeisBlue { get { return FromHtml("#FF0070FF"); } } + + public static XLColor Brass { get { return FromHtml("#FFB5A642"); } } + + public static XLColor BrickRed { get { return FromHtml("#FFCB4154"); } } + + public static XLColor BrightCerulean { get { return FromHtml("#FF1DACD6"); } } + + public static XLColor BrightGreen { get { return FromHtml("#FF66FF00"); } } + + public static XLColor BrightLavender { get { return FromHtml("#FFBF94E4"); } } + + public static XLColor BrightMaroon { get { return FromHtml("#FFC32148"); } } + + public static XLColor BrightPink { get { return FromHtml("#FFFF007F"); } } + + public static XLColor BrightTurquoise { get { return FromHtml("#FF08E8DE"); } } + + public static XLColor BrightUbe { get { return FromHtml("#FFD19FE8"); } } + + public static XLColor BrilliantLavender { get { return FromHtml("#FFF4BBFF"); } } + + public static XLColor BrilliantRose { get { return FromHtml("#FFFF55A3"); } } + + public static XLColor BrinkPink { get { return FromHtml("#FFFB607F"); } } + + public static XLColor BritishRacingGreen { get { return FromHtml("#FF004225"); } } + + public static XLColor Bronze { get { return FromHtml("#FFCD7F32"); } } + + public static XLColor BrownTraditional { get { return FromHtml("#FF964B00"); } } + + public static XLColor BubbleGum { get { return FromHtml("#FFFFC1CC"); } } + + public static XLColor Bubbles { get { return FromHtml("#FFE7FEFF"); } } + + public static XLColor Buff { get { return FromHtml("#FFF0DC82"); } } + + public static XLColor BulgarianRose { get { return FromHtml("#FF480607"); } } + + public static XLColor Burgundy { get { return FromHtml("#FF800020"); } } + + public static XLColor BurntOrange { get { return FromHtml("#FFCC5500"); } } + + public static XLColor BurntSienna { get { return FromHtml("#FFE97451"); } } + + public static XLColor BurntUmber { get { return FromHtml("#FF8A3324"); } } + + public static XLColor Byzantine { get { return FromHtml("#FFBD33A4"); } } + + public static XLColor Byzantium { get { return FromHtml("#FF702963"); } } + + public static XLColor Cadet { get { return FromHtml("#FF536872"); } } + + public static XLColor CadetGrey { get { return FromHtml("#FF91A3B0"); } } + + public static XLColor CadmiumGreen { get { return FromHtml("#FF006B3C"); } } + + public static XLColor CadmiumOrange { get { return FromHtml("#FFED872D"); } } + + public static XLColor CadmiumRed { get { return FromHtml("#FFE30022"); } } + + public static XLColor CadmiumYellow { get { return FromHtml("#FFFFF600"); } } + + public static XLColor CalPolyPomonaGreen { get { return FromHtml("#FF1E4D2B"); } } + + public static XLColor CambridgeBlue { get { return FromHtml("#FFA3C1AD"); } } + + public static XLColor Camel { get { return FromHtml("#FFC19A6B"); } } + + public static XLColor CamouflageGreen { get { return FromHtml("#FF78866B"); } } + + public static XLColor CanaryYellow { get { return FromHtml("#FFFFEF00"); } } + + public static XLColor CandyAppleRed { get { return FromHtml("#FFFF0800"); } } + + public static XLColor CandyPink { get { return FromHtml("#FFE4717A"); } } + + public static XLColor CaputMortuum { get { return FromHtml("#FF592720"); } } + + public static XLColor Cardinal { get { return FromHtml("#FFC41E3A"); } } + + public static XLColor CaribbeanGreen { get { return FromHtml("#FF00CC99"); } } + + public static XLColor Carmine { get { return FromHtml("#FF960018"); } } + + public static XLColor CarminePink { get { return FromHtml("#FFEB4C42"); } } + + public static XLColor CarmineRed { get { return FromHtml("#FFFF0038"); } } + + public static XLColor CarnationPink { get { return FromHtml("#FFFFA6C9"); } } + + public static XLColor Carnelian { get { return FromHtml("#FFB31B1B"); } } + + public static XLColor CarolinaBlue { get { return FromHtml("#FF99BADD"); } } + + public static XLColor CarrotOrange { get { return FromHtml("#FFED9121"); } } + + public static XLColor Ceil { get { return FromHtml("#FF92A1CF"); } } + + public static XLColor Celadon { get { return FromHtml("#FFACE1AF"); } } + + public static XLColor CelestialBlue { get { return FromHtml("#FF4997D0"); } } + + public static XLColor Cerise { get { return FromHtml("#FFDE3163"); } } + + public static XLColor CerisePink { get { return FromHtml("#FFEC3B83"); } } + + public static XLColor Cerulean { get { return FromHtml("#FF007BA7"); } } + + public static XLColor CeruleanBlue { get { return FromHtml("#FF2A52BE"); } } + + public static XLColor Chamoisee { get { return FromHtml("#FFA0785A"); } } + + public static XLColor Champagne { get { return FromHtml("#FFF7E7CE"); } } + + public static XLColor Charcoal { get { return FromHtml("#FF36454F"); } } + + public static XLColor ChartreuseTraditional { get { return FromHtml("#FFDFFF00"); } } + + public static XLColor CherryBlossomPink { get { return FromHtml("#FFFFB7C5"); } } + + public static XLColor Chocolate1 { get { return FromHtml("#FF7B3F00"); } } + + public static XLColor ChromeYellow { get { return FromHtml("#FFFFA700"); } } + + public static XLColor Cinereous { get { return FromHtml("#FF98817B"); } } + + public static XLColor Cinnabar { get { return FromHtml("#FFE34234"); } } + + public static XLColor Citrine { get { return FromHtml("#FFE4D00A"); } } + + public static XLColor ClassicRose { get { return FromHtml("#FFFBCCE7"); } } + + public static XLColor Cobalt { get { return FromHtml("#FF0047AB"); } } + + public static XLColor ColumbiaBlue { get { return FromHtml("#FF9BDDFF"); } } + + public static XLColor CoolBlack { get { return FromHtml("#FF002E63"); } } + + public static XLColor CoolGrey { get { return FromHtml("#FF8C92AC"); } } + + public static XLColor Copper { get { return FromHtml("#FFB87333"); } } + + public static XLColor CopperRose { get { return FromHtml("#FF996666"); } } + + public static XLColor Coquelicot { get { return FromHtml("#FFFF3800"); } } + + public static XLColor CoralPink { get { return FromHtml("#FFF88379"); } } + + public static XLColor CoralRed { get { return FromHtml("#FFFF4040"); } } + + public static XLColor Cordovan { get { return FromHtml("#FF893F45"); } } + + public static XLColor Corn { get { return FromHtml("#FFFBEC5D"); } } + + public static XLColor CornellRed { get { return FromHtml("#FFB31B1B"); } } + + public static XLColor CosmicLatte { get { return FromHtml("#FFFFF8E7"); } } + + public static XLColor CottonCandy { get { return FromHtml("#FFFFBCD9"); } } + + public static XLColor Cream { get { return FromHtml("#FFFFFDD0"); } } + + public static XLColor CrimsonGlory { get { return FromHtml("#FFBE0032"); } } + + public static XLColor CyanProcess { get { return FromHtml("#FF00B7EB"); } } + + public static XLColor Daffodil { get { return FromHtml("#FFFFFF31"); } } + + public static XLColor Dandelion { get { return FromHtml("#FFF0E130"); } } + + public static XLColor DarkBrown { get { return FromHtml("#FF654321"); } } + + public static XLColor DarkByzantium { get { return FromHtml("#FF5D3954"); } } + + public static XLColor DarkCandyAppleRed { get { return FromHtml("#FFA40000"); } } + + public static XLColor DarkCerulean { get { return FromHtml("#FF08457E"); } } + + public static XLColor DarkChampagne { get { return FromHtml("#FFC2B280"); } } + + public static XLColor DarkChestnut { get { return FromHtml("#FF986960"); } } + + public static XLColor DarkCoral { get { return FromHtml("#FFCD5B45"); } } + + public static XLColor DarkElectricBlue { get { return FromHtml("#FF536878"); } } + + public static XLColor DarkGreen1 { get { return FromHtml("#FF013220"); } } + + public static XLColor DarkJungleGreen { get { return FromHtml("#FF1A2421"); } } + + public static XLColor DarkLava { get { return FromHtml("#FF483C32"); } } + + public static XLColor DarkLavender { get { return FromHtml("#FF734F96"); } } + + public static XLColor DarkMidnightBlue { get { return FromHtml("#FF003366"); } } + + public static XLColor DarkPastelBlue { get { return FromHtml("#FF779ECB"); } } + + public static XLColor DarkPastelGreen { get { return FromHtml("#FF03C03C"); } } + + public static XLColor DarkPastelPurple { get { return FromHtml("#FF966FD6"); } } + + public static XLColor DarkPastelRed { get { return FromHtml("#FFC23B22"); } } + + public static XLColor DarkPink { get { return FromHtml("#FFE75480"); } } + + public static XLColor DarkPowderBlue { get { return FromHtml("#FF003399"); } } + + public static XLColor DarkRaspberry { get { return FromHtml("#FF872657"); } } + + public static XLColor DarkScarlet { get { return FromHtml("#FF560319"); } } + + public static XLColor DarkSienna { get { return FromHtml("#FF3C1414"); } } + + public static XLColor DarkSpringGreen { get { return FromHtml("#FF177245"); } } + + public static XLColor DarkTan { get { return FromHtml("#FF918151"); } } + + public static XLColor DarkTangerine { get { return FromHtml("#FFFFA812"); } } + + public static XLColor DarkTaupe { get { return FromHtml("#FF483C32"); } } + + public static XLColor DarkTerraCotta { get { return FromHtml("#FFCC4E5C"); } } + + public static XLColor DartmouthGreen { get { return FromHtml("#FF00693E"); } } + + public static XLColor DavysGrey { get { return FromHtml("#FF555555"); } } + + public static XLColor DebianRed { get { return FromHtml("#FFD70A53"); } } + + public static XLColor DeepCarmine { get { return FromHtml("#FFA9203E"); } } + + public static XLColor DeepCarminePink { get { return FromHtml("#FFEF3038"); } } + + public static XLColor DeepCarrotOrange { get { return FromHtml("#FFE9692C"); } } + + public static XLColor DeepCerise { get { return FromHtml("#FFDA3287"); } } + + public static XLColor DeepChampagne { get { return FromHtml("#FFFAD6A5"); } } + + public static XLColor DeepChestnut { get { return FromHtml("#FFB94E48"); } } + + public static XLColor DeepFuchsia { get { return FromHtml("#FFC154C1"); } } + + public static XLColor DeepJungleGreen { get { return FromHtml("#FF004B49"); } } + + public static XLColor DeepLilac { get { return FromHtml("#FF9955BB"); } } + + public static XLColor DeepMagenta { get { return FromHtml("#FFCC00CC"); } } + + public static XLColor DeepPeach { get { return FromHtml("#FFFFCBA4"); } } + + public static XLColor DeepSaffron { get { return FromHtml("#FFFF9933"); } } + + public static XLColor Denim { get { return FromHtml("#FF1560BD"); } } + + public static XLColor Desert { get { return FromHtml("#FFC19A6B"); } } + + public static XLColor DesertSand { get { return FromHtml("#FFEDC9AF"); } } + + public static XLColor DogwoodRose { get { return FromHtml("#FFD71868"); } } + + public static XLColor DollarBill { get { return FromHtml("#FF85BB65"); } } + + public static XLColor Drab { get { return FromHtml("#FF967117"); } } + + public static XLColor DukeBlue { get { return FromHtml("#FF00009C"); } } + + public static XLColor EarthYellow { get { return FromHtml("#FFE1A95F"); } } + + public static XLColor Ecru { get { return FromHtml("#FFC2B280"); } } + + public static XLColor Eggplant { get { return FromHtml("#FF614051"); } } + + public static XLColor Eggshell { get { return FromHtml("#FFF0EAD6"); } } + + public static XLColor EgyptianBlue { get { return FromHtml("#FF1034A6"); } } + + public static XLColor ElectricBlue { get { return FromHtml("#FF7DF9FF"); } } + + public static XLColor ElectricCrimson { get { return FromHtml("#FFFF003F"); } } + + public static XLColor ElectricIndigo { get { return FromHtml("#FF6F00FF"); } } + + public static XLColor ElectricLavender { get { return FromHtml("#FFF4BBFF"); } } + + public static XLColor ElectricLime { get { return FromHtml("#FFCCFF00"); } } + + public static XLColor ElectricPurple { get { return FromHtml("#FFBF00FF"); } } + + public static XLColor ElectricUltramarine { get { return FromHtml("#FF3F00FF"); } } + + public static XLColor ElectricViolet { get { return FromHtml("#FF8F00FF"); } } + + public static XLColor Emerald { get { return FromHtml("#FF50C878"); } } + + public static XLColor EtonBlue { get { return FromHtml("#FF96C8A2"); } } + + public static XLColor Fallow { get { return FromHtml("#FFC19A6B"); } } + + public static XLColor FaluRed { get { return FromHtml("#FF801818"); } } + + public static XLColor Fandango { get { return FromHtml("#FFB53389"); } } + + public static XLColor FashionFuchsia { get { return FromHtml("#FFF400A1"); } } + + public static XLColor Fawn { get { return FromHtml("#FFE5AA70"); } } + + public static XLColor Feldgrau { get { return FromHtml("#FF4D5D53"); } } + + public static XLColor FernGreen { get { return FromHtml("#FF4F7942"); } } + + public static XLColor FerrariRed { get { return FromHtml("#FFFF2800"); } } + + public static XLColor FieldDrab { get { return FromHtml("#FF6C541E"); } } + + public static XLColor FireEngineRed { get { return FromHtml("#FFCE2029"); } } + + public static XLColor Flame { get { return FromHtml("#FFE25822"); } } + + public static XLColor FlamingoPink { get { return FromHtml("#FFFC8EAC"); } } + + public static XLColor Flavescent { get { return FromHtml("#FFF7E98E"); } } + + public static XLColor Flax { get { return FromHtml("#FFEEDC82"); } } + + public static XLColor FluorescentOrange { get { return FromHtml("#FFFFBF00"); } } + + public static XLColor FluorescentYellow { get { return FromHtml("#FFCCFF00"); } } + + public static XLColor Folly { get { return FromHtml("#FFFF004F"); } } + + public static XLColor ForestGreenTraditional { get { return FromHtml("#FF014421"); } } + + public static XLColor FrenchBeige { get { return FromHtml("#FFA67B5B"); } } + + public static XLColor FrenchBlue { get { return FromHtml("#FF0072BB"); } } + + public static XLColor FrenchLilac { get { return FromHtml("#FF86608E"); } } + + public static XLColor FrenchRose { get { return FromHtml("#FFF64A8A"); } } + + public static XLColor FuchsiaPink { get { return FromHtml("#FFFF77FF"); } } + + public static XLColor Fulvous { get { return FromHtml("#FFE48400"); } } + + public static XLColor FuzzyWuzzy { get { return FromHtml("#FFCC6666"); } } + + public static XLColor Gamboge { get { return FromHtml("#FFE49B0F"); } } + + public static XLColor Ginger { get { return FromHtml("#FFF9F9FF"); } } + + public static XLColor Glaucous { get { return FromHtml("#FF6082B6"); } } + + public static XLColor GoldenBrown { get { return FromHtml("#FF996515"); } } + + public static XLColor GoldenPoppy { get { return FromHtml("#FFFCC200"); } } + + public static XLColor GoldenYellow { get { return FromHtml("#FFFFDF00"); } } + + public static XLColor GoldMetallic { get { return FromHtml("#FFD4AF37"); } } + + public static XLColor GrannySmithApple { get { return FromHtml("#FFA8E4A0"); } } + + public static XLColor GrayAsparagus { get { return FromHtml("#FF465945"); } } + + public static XLColor GreenPigment { get { return FromHtml("#FF00A550"); } } + + public static XLColor GreenRyb { get { return FromHtml("#FF66B032"); } } + + public static XLColor Grullo { get { return FromHtml("#FFA99A86"); } } + + public static XLColor HalayaUbe { get { return FromHtml("#FF663854"); } } + + public static XLColor HanBlue { get { return FromHtml("#FF446CCF"); } } + + public static XLColor HanPurple { get { return FromHtml("#FF5218FA"); } } + + public static XLColor HansaYellow { get { return FromHtml("#FFE9D66B"); } } + + public static XLColor Harlequin { get { return FromHtml("#FF3FFF00"); } } + + public static XLColor HarvardCrimson { get { return FromHtml("#FFC90016"); } } + + public static XLColor HarvestGold { get { return FromHtml("#FFDA9100"); } } + + public static XLColor Heliotrope { get { return FromHtml("#FFDF73FF"); } } + + public static XLColor HollywoodCerise { get { return FromHtml("#FFF400A1"); } } + + public static XLColor HookersGreen { get { return FromHtml("#FF007000"); } } + + public static XLColor HotMagenta { get { return FromHtml("#FFFF1DCE"); } } + + public static XLColor HunterGreen { get { return FromHtml("#FF355E3B"); } } + + public static XLColor Iceberg { get { return FromHtml("#FF71A6D2"); } } + + public static XLColor Icterine { get { return FromHtml("#FFFCF75E"); } } + + public static XLColor Inchworm { get { return FromHtml("#FFB2EC5D"); } } + + public static XLColor IndiaGreen { get { return FromHtml("#FF138808"); } } + + public static XLColor IndianYellow { get { return FromHtml("#FFE3A857"); } } + + public static XLColor IndigoDye { get { return FromHtml("#FF00416A"); } } + + public static XLColor InternationalKleinBlue { get { return FromHtml("#FF002FA7"); } } + + public static XLColor InternationalOrange { get { return FromHtml("#FFFF4F00"); } } + + public static XLColor Iris { get { return FromHtml("#FF5A4FCF"); } } + + public static XLColor Isabelline { get { return FromHtml("#FFF4F0EC"); } } + + public static XLColor IslamicGreen { get { return FromHtml("#FF009000"); } } + + public static XLColor Jade { get { return FromHtml("#FF00A86B"); } } + + public static XLColor Jasper { get { return FromHtml("#FFD73B3E"); } } + + public static XLColor JazzberryJam { get { return FromHtml("#FFA50B5E"); } } + + public static XLColor Jonquil { get { return FromHtml("#FFFADA5E"); } } + + public static XLColor JuneBud { get { return FromHtml("#FFBDDA57"); } } + + public static XLColor JungleGreen { get { return FromHtml("#FF29AB87"); } } + + public static XLColor KellyGreen { get { return FromHtml("#FF4CBB17"); } } + + public static XLColor KhakiHtmlCssKhaki { get { return FromHtml("#FFC3B091"); } } + + public static XLColor LanguidLavender { get { return FromHtml("#FFD6CADD"); } } + + public static XLColor LapisLazuli { get { return FromHtml("#FF26619C"); } } + + public static XLColor LaSalleGreen { get { return FromHtml("#FF087830"); } } + + public static XLColor LaserLemon { get { return FromHtml("#FFFEFE22"); } } + + public static XLColor Lava { get { return FromHtml("#FFCF1020"); } } + + public static XLColor LavenderBlue { get { return FromHtml("#FFCCCCFF"); } } + + public static XLColor LavenderFloral { get { return FromHtml("#FFB57EDC"); } } + + public static XLColor LavenderGray { get { return FromHtml("#FFC4C3D0"); } } + + public static XLColor LavenderIndigo { get { return FromHtml("#FF9457EB"); } } + + public static XLColor LavenderPink { get { return FromHtml("#FFFBAED2"); } } + + public static XLColor LavenderPurple { get { return FromHtml("#FF967BB6"); } } + + public static XLColor LavenderRose { get { return FromHtml("#FFFBA0E3"); } } + + public static XLColor Lemon { get { return FromHtml("#FFFFF700"); } } + + public static XLColor LightApricot { get { return FromHtml("#FFFDD5B1"); } } + + public static XLColor LightBrown { get { return FromHtml("#FFB5651D"); } } + + public static XLColor LightCarminePink { get { return FromHtml("#FFE66771"); } } + + public static XLColor LightCornflowerBlue { get { return FromHtml("#FF93CCEA"); } } + + public static XLColor LightFuchsiaPink { get { return FromHtml("#FFF984EF"); } } + + public static XLColor LightMauve { get { return FromHtml("#FFDCD0FF"); } } + + public static XLColor LightPastelPurple { get { return FromHtml("#FFB19CD9"); } } + + public static XLColor LightSalmonPink { get { return FromHtml("#FFFF9999"); } } + + public static XLColor LightTaupe { get { return FromHtml("#FFB38B6D"); } } + + public static XLColor LightThulianPink { get { return FromHtml("#FFE68FAC"); } } + + public static XLColor LightYellow1 { get { return FromHtml("#FFFFFFED"); } } + + public static XLColor Lilac { get { return FromHtml("#FFC8A2C8"); } } + + public static XLColor LimeColorWheel { get { return FromHtml("#FFBFFF00"); } } + + public static XLColor LincolnGreen { get { return FromHtml("#FF195905"); } } + + public static XLColor Liver { get { return FromHtml("#FF534B4F"); } } + + public static XLColor Lust { get { return FromHtml("#FFE62020"); } } + + public static XLColor MacaroniAndCheese { get { return FromHtml("#FFFFBD88"); } } + + public static XLColor MagentaDye { get { return FromHtml("#FFCA1F7B"); } } + + public static XLColor MagentaProcess { get { return FromHtml("#FFFF0090"); } } + + public static XLColor MagicMint { get { return FromHtml("#FFAAF0D1"); } } + + public static XLColor Magnolia { get { return FromHtml("#FFF8F4FF"); } } + + public static XLColor Mahogany { get { return FromHtml("#FFC04000"); } } + + public static XLColor Maize { get { return FromHtml("#FFFBEC5D"); } } + + public static XLColor MajorelleBlue { get { return FromHtml("#FF6050DC"); } } + + public static XLColor Malachite { get { return FromHtml("#FF0BDA51"); } } + + public static XLColor Manatee { get { return FromHtml("#FF979AAA"); } } + + public static XLColor MangoTango { get { return FromHtml("#FFFF8243"); } } + + public static XLColor MaroonX11 { get { return FromHtml("#FFB03060"); } } + + public static XLColor Mauve { get { return FromHtml("#FFE0B0FF"); } } + + public static XLColor Mauvelous { get { return FromHtml("#FFEF98AA"); } } + + public static XLColor MauveTaupe { get { return FromHtml("#FF915F6D"); } } + + public static XLColor MayaBlue { get { return FromHtml("#FF73C2FB"); } } + + public static XLColor MeatBrown { get { return FromHtml("#FFE5B73B"); } } + + public static XLColor MediumAquamarine1 { get { return FromHtml("#FF66DDAA"); } } + + public static XLColor MediumCandyAppleRed { get { return FromHtml("#FFE2062C"); } } + + public static XLColor MediumCarmine { get { return FromHtml("#FFAF4035"); } } + + public static XLColor MediumChampagne { get { return FromHtml("#FFF3E5AB"); } } + + public static XLColor MediumElectricBlue { get { return FromHtml("#FF035096"); } } + + public static XLColor MediumJungleGreen { get { return FromHtml("#FF1C352D"); } } + + public static XLColor MediumPersianBlue { get { return FromHtml("#FF0067A5"); } } + + public static XLColor MediumRedViolet { get { return FromHtml("#FFBB3385"); } } + + public static XLColor MediumSpringBud { get { return FromHtml("#FFC9DC87"); } } + + public static XLColor MediumTaupe { get { return FromHtml("#FF674C47"); } } + + public static XLColor Melon { get { return FromHtml("#FFFDBCB4"); } } + + public static XLColor MidnightGreenEagleGreen { get { return FromHtml("#FF004953"); } } + + public static XLColor MikadoYellow { get { return FromHtml("#FFFFC40C"); } } + + public static XLColor Mint { get { return FromHtml("#FF3EB489"); } } + + public static XLColor MintGreen { get { return FromHtml("#FF98FF98"); } } + + public static XLColor ModeBeige { get { return FromHtml("#FF967117"); } } + + public static XLColor MoonstoneBlue { get { return FromHtml("#FF73A9C2"); } } + + public static XLColor MordantRed19 { get { return FromHtml("#FFAE0C00"); } } + + public static XLColor MossGreen { get { return FromHtml("#FFADDFAD"); } } + + public static XLColor MountainMeadow { get { return FromHtml("#FF30BA8F"); } } + + public static XLColor MountbattenPink { get { return FromHtml("#FF997A8D"); } } + + public static XLColor MsuGreen { get { return FromHtml("#FF18453B"); } } + + public static XLColor Mulberry { get { return FromHtml("#FFC54B8C"); } } + + public static XLColor Mustard { get { return FromHtml("#FFFFDB58"); } } + + public static XLColor Myrtle { get { return FromHtml("#FF21421E"); } } + + public static XLColor NadeshikoPink { get { return FromHtml("#FFF6ADC6"); } } + + public static XLColor NapierGreen { get { return FromHtml("#FF2A8000"); } } + + public static XLColor NaplesYellow { get { return FromHtml("#FFFADA5E"); } } + + public static XLColor NeonCarrot { get { return FromHtml("#FFFFA343"); } } + + public static XLColor NeonFuchsia { get { return FromHtml("#FFFE59C2"); } } + + public static XLColor NeonGreen { get { return FromHtml("#FF39FF14"); } } + + public static XLColor NonPhotoBlue { get { return FromHtml("#FFA4DDED"); } } + + public static XLColor OceanBoatBlue { get { return FromHtml("#FFCC7422"); } } + + public static XLColor Ochre { get { return FromHtml("#FFCC7722"); } } + + public static XLColor OldGold { get { return FromHtml("#FFCFB53B"); } } + + public static XLColor OldLavender { get { return FromHtml("#FF796878"); } } + + public static XLColor OldMauve { get { return FromHtml("#FF673147"); } } + + public static XLColor OldRose { get { return FromHtml("#FFC08081"); } } + + public static XLColor OliveDrab7 { get { return FromHtml("#FF3C341F"); } } + + public static XLColor Olivine { get { return FromHtml("#FF9AB973"); } } + + public static XLColor Onyx { get { return FromHtml("#FF0F0F0F"); } } + + public static XLColor OperaMauve { get { return FromHtml("#FFB784A7"); } } + + public static XLColor OrangeColorWheel { get { return FromHtml("#FFFF7F00"); } } + + public static XLColor OrangePeel { get { return FromHtml("#FFFF9F00"); } } + + public static XLColor OrangeRyb { get { return FromHtml("#FFFB9902"); } } + + public static XLColor OtterBrown { get { return FromHtml("#FF654321"); } } + + public static XLColor OuCrimsonRed { get { return FromHtml("#FF990000"); } } + + public static XLColor OuterSpace { get { return FromHtml("#FF414A4C"); } } + + public static XLColor OutrageousOrange { get { return FromHtml("#FFFF6E4A"); } } + + public static XLColor OxfordBlue { get { return FromHtml("#FF002147"); } } + + public static XLColor PakistanGreen { get { return FromHtml("#FF00421B"); } } + + public static XLColor PalatinateBlue { get { return FromHtml("#FF273BE2"); } } + + public static XLColor PalatinatePurple { get { return FromHtml("#FF682860"); } } + + public static XLColor PaleAqua { get { return FromHtml("#FFBCD4E6"); } } + + public static XLColor PaleBrown { get { return FromHtml("#FF987654"); } } + + public static XLColor PaleCarmine { get { return FromHtml("#FFAF4035"); } } + + public static XLColor PaleCerulean { get { return FromHtml("#FF9BC4E2"); } } + + public static XLColor PaleChestnut { get { return FromHtml("#FFDDADAF"); } } + + public static XLColor PaleCopper { get { return FromHtml("#FFDA8A67"); } } + + public static XLColor PaleCornflowerBlue { get { return FromHtml("#FFABCDEF"); } } + + public static XLColor PaleGold { get { return FromHtml("#FFE6BE8A"); } } + + public static XLColor PaleMagenta { get { return FromHtml("#FFF984E5"); } } + + public static XLColor PalePink { get { return FromHtml("#FFFADADD"); } } + + public static XLColor PaleRobinEggBlue { get { return FromHtml("#FF96DED1"); } } + + public static XLColor PaleSilver { get { return FromHtml("#FFC9C0BB"); } } + + public static XLColor PaleSpringBud { get { return FromHtml("#FFECEBBD"); } } + + public static XLColor PaleTaupe { get { return FromHtml("#FFBC987E"); } } + + public static XLColor PansyPurple { get { return FromHtml("#FF78184A"); } } + + public static XLColor ParisGreen { get { return FromHtml("#FF50C878"); } } + + public static XLColor PastelBlue { get { return FromHtml("#FFAEC6CF"); } } + + public static XLColor PastelBrown { get { return FromHtml("#FF836953"); } } + + public static XLColor PastelGray { get { return FromHtml("#FFCFCFC4"); } } + + public static XLColor PastelGreen { get { return FromHtml("#FF77DD77"); } } + + public static XLColor PastelMagenta { get { return FromHtml("#FFF49AC2"); } } + + public static XLColor PastelOrange { get { return FromHtml("#FFFFB347"); } } + + public static XLColor PastelPink { get { return FromHtml("#FFFFD1DC"); } } + + public static XLColor PastelPurple { get { return FromHtml("#FFB39EB5"); } } + + public static XLColor PastelRed { get { return FromHtml("#FFFF6961"); } } + + public static XLColor PastelViolet { get { return FromHtml("#FFCB99C9"); } } + + public static XLColor PastelYellow { get { return FromHtml("#FFFDFD96"); } } + + public static XLColor PaynesGrey { get { return FromHtml("#FF40404F"); } } + + public static XLColor Peach { get { return FromHtml("#FFFFE5B4"); } } + + public static XLColor PeachOrange { get { return FromHtml("#FFFFCC99"); } } + + public static XLColor PeachYellow { get { return FromHtml("#FFFADFAD"); } } + + public static XLColor Pear { get { return FromHtml("#FFD1E231"); } } + + public static XLColor Pearl { get { return FromHtml("#FFF0EAD6"); } } + + public static XLColor Peridot { get { return FromHtml("#FFE6E200"); } } + + public static XLColor Periwinkle { get { return FromHtml("#FFCCCCFF"); } } + + public static XLColor PersianBlue { get { return FromHtml("#FF1C39BB"); } } + + public static XLColor PersianGreen { get { return FromHtml("#FF00A693"); } } + + public static XLColor PersianIndigo { get { return FromHtml("#FF32127A"); } } + + public static XLColor PersianOrange { get { return FromHtml("#FFD99058"); } } + + public static XLColor PersianPink { get { return FromHtml("#FFF77FBE"); } } + + public static XLColor PersianPlum { get { return FromHtml("#FF701C1C"); } } + + public static XLColor PersianRed { get { return FromHtml("#FFCC3333"); } } + + public static XLColor PersianRose { get { return FromHtml("#FFFE28A2"); } } + + public static XLColor Persimmon { get { return FromHtml("#FFEC5800"); } } + + public static XLColor Phlox { get { return FromHtml("#FFDF00FF"); } } + + public static XLColor PhthaloBlue { get { return FromHtml("#FF000F89"); } } + + public static XLColor PhthaloGreen { get { return FromHtml("#FF123524"); } } + + public static XLColor PiggyPink { get { return FromHtml("#FFFDDDE6"); } } + + public static XLColor PineGreen { get { return FromHtml("#FF01796F"); } } + + public static XLColor PinkOrange { get { return FromHtml("#FFFF9966"); } } + + public static XLColor PinkPearl { get { return FromHtml("#FFE7ACCF"); } } + + public static XLColor PinkSherbet { get { return FromHtml("#FFF78FA7"); } } + + public static XLColor Pistachio { get { return FromHtml("#FF93C572"); } } + + public static XLColor Platinum { get { return FromHtml("#FFE5E4E2"); } } + + public static XLColor PlumTraditional { get { return FromHtml("#FF8E4585"); } } + + public static XLColor PortlandOrange { get { return FromHtml("#FFFF5A36"); } } + + public static XLColor PrincetonOrange { get { return FromHtml("#FFFF8F00"); } } + + public static XLColor Prune { get { return FromHtml("#FF701C1C"); } } + + public static XLColor PrussianBlue { get { return FromHtml("#FF003153"); } } + + public static XLColor PsychedelicPurple { get { return FromHtml("#FFDF00FF"); } } + + public static XLColor Puce { get { return FromHtml("#FFCC8899"); } } + + public static XLColor Pumpkin { get { return FromHtml("#FFFF7518"); } } + + public static XLColor PurpleHeart { get { return FromHtml("#FF69359C"); } } + + public static XLColor PurpleMountainMajesty { get { return FromHtml("#FF9678B6"); } } + + public static XLColor PurpleMunsell { get { return FromHtml("#FF9F00C5"); } } + + public static XLColor PurplePizzazz { get { return FromHtml("#FFFE4EDA"); } } + + public static XLColor PurpleTaupe { get { return FromHtml("#FF50404D"); } } + + public static XLColor PurpleX11 { get { return FromHtml("#FFA020F0"); } } + + public static XLColor RadicalRed { get { return FromHtml("#FFFF355E"); } } + + public static XLColor Raspberry { get { return FromHtml("#FFE30B5D"); } } + + public static XLColor RaspberryGlace { get { return FromHtml("#FF915F6D"); } } + + public static XLColor RaspberryPink { get { return FromHtml("#FFE25098"); } } + + public static XLColor RaspberryRose { get { return FromHtml("#FFB3446C"); } } + + public static XLColor RawUmber { get { return FromHtml("#FF826644"); } } + + public static XLColor RazzleDazzleRose { get { return FromHtml("#FFFF33CC"); } } + + public static XLColor Razzmatazz { get { return FromHtml("#FFE3256B"); } } + + public static XLColor RedMunsell { get { return FromHtml("#FFF2003C"); } } + + public static XLColor RedNcs { get { return FromHtml("#FFC40233"); } } + + public static XLColor RedPigment { get { return FromHtml("#FFED1C24"); } } + + public static XLColor RedRyb { get { return FromHtml("#FFFE2712"); } } + + public static XLColor Redwood { get { return FromHtml("#FFAB4E52"); } } + + public static XLColor Regalia { get { return FromHtml("#FF522D80"); } } + + public static XLColor RichBlack { get { return FromHtml("#FF004040"); } } + + public static XLColor RichBrilliantLavender { get { return FromHtml("#FFF1A7FE"); } } + + public static XLColor RichCarmine { get { return FromHtml("#FFD70040"); } } + + public static XLColor RichElectricBlue { get { return FromHtml("#FF0892D0"); } } + + public static XLColor RichLavender { get { return FromHtml("#FFA76BCF"); } } + + public static XLColor RichLilac { get { return FromHtml("#FFB666D2"); } } + + public static XLColor RichMaroon { get { return FromHtml("#FFB03060"); } } + + public static XLColor RifleGreen { get { return FromHtml("#FF414833"); } } + + public static XLColor RobinEggBlue { get { return FromHtml("#FF00CCCC"); } } + + public static XLColor Rose { get { return FromHtml("#FFFF007F"); } } + + public static XLColor RoseBonbon { get { return FromHtml("#FFF9429E"); } } + + public static XLColor RoseEbony { get { return FromHtml("#FF674846"); } } + + public static XLColor RoseGold { get { return FromHtml("#FFB76E79"); } } + + public static XLColor RoseMadder { get { return FromHtml("#FFE32636"); } } + + public static XLColor RosePink { get { return FromHtml("#FFFF66CC"); } } + + public static XLColor RoseQuartz { get { return FromHtml("#FFAA98A9"); } } + + public static XLColor RoseTaupe { get { return FromHtml("#FF905D5D"); } } + + public static XLColor RoseVale { get { return FromHtml("#FFAB4E52"); } } + + public static XLColor Rosewood { get { return FromHtml("#FF65000B"); } } + + public static XLColor RossoCorsa { get { return FromHtml("#FFD40000"); } } + + public static XLColor RoyalAzure { get { return FromHtml("#FF0038A8"); } } + + public static XLColor RoyalBlueTraditional { get { return FromHtml("#FF002366"); } } + + public static XLColor RoyalFuchsia { get { return FromHtml("#FFCA2C92"); } } + + public static XLColor RoyalPurple { get { return FromHtml("#FF7851A9"); } } + + public static XLColor Ruby { get { return FromHtml("#FFE0115F"); } } + + public static XLColor Ruddy { get { return FromHtml("#FFFF0028"); } } + + public static XLColor RuddyBrown { get { return FromHtml("#FFBB6528"); } } + + public static XLColor RuddyPink { get { return FromHtml("#FFE18E96"); } } + + public static XLColor Rufous { get { return FromHtml("#FFA81C07"); } } + + public static XLColor Russet { get { return FromHtml("#FF80461B"); } } + + public static XLColor Rust { get { return FromHtml("#FFB7410E"); } } + + public static XLColor SacramentoStateGreen { get { return FromHtml("#FF00563F"); } } + + public static XLColor SafetyOrangeBlazeOrange { get { return FromHtml("#FFFF6700"); } } + + public static XLColor Saffron { get { return FromHtml("#FFF4C430"); } } + + public static XLColor Salmon1 { get { return FromHtml("#FFFF8C69"); } } + + public static XLColor SalmonPink { get { return FromHtml("#FFFF91A4"); } } + + public static XLColor Sand { get { return FromHtml("#FFC2B280"); } } + + public static XLColor SandDune { get { return FromHtml("#FF967117"); } } + + public static XLColor Sandstorm { get { return FromHtml("#FFECD540"); } } + + public static XLColor SandyTaupe { get { return FromHtml("#FF967117"); } } + + public static XLColor Sangria { get { return FromHtml("#FF92000A"); } } + + public static XLColor SapGreen { get { return FromHtml("#FF507D2A"); } } + + public static XLColor Sapphire { get { return FromHtml("#FF082567"); } } + + public static XLColor SatinSheenGold { get { return FromHtml("#FFCBA135"); } } + + public static XLColor Scarlet { get { return FromHtml("#FFFF2000"); } } + + public static XLColor SchoolBusYellow { get { return FromHtml("#FFFFD800"); } } + + public static XLColor ScreaminGreen { get { return FromHtml("#FF76FF7A"); } } + + public static XLColor SealBrown { get { return FromHtml("#FF321414"); } } + + public static XLColor SelectiveYellow { get { return FromHtml("#FFFFBA00"); } } + + public static XLColor Sepia { get { return FromHtml("#FF704214"); } } + + public static XLColor Shadow { get { return FromHtml("#FF8A795D"); } } + + public static XLColor ShamrockGreen { get { return FromHtml("#FF009E60"); } } + + public static XLColor ShockingPink { get { return FromHtml("#FFFC0FC0"); } } + + public static XLColor Sienna1 { get { return FromHtml("#FF882D17"); } } + + public static XLColor Sinopia { get { return FromHtml("#FFCB410B"); } } + + public static XLColor Skobeloff { get { return FromHtml("#FF007474"); } } + + public static XLColor SkyMagenta { get { return FromHtml("#FFCF71AF"); } } + + public static XLColor SmaltDarkPowderBlue { get { return FromHtml("#FF003399"); } } + + public static XLColor SmokeyTopaz { get { return FromHtml("#FF933D41"); } } + + public static XLColor SmokyBlack { get { return FromHtml("#FF100C08"); } } + + public static XLColor SpiroDiscoBall { get { return FromHtml("#FF0FC0FC"); } } + + public static XLColor SplashedWhite { get { return FromHtml("#FFFEFDFF"); } } + + public static XLColor SpringBud { get { return FromHtml("#FFA7FC00"); } } + + public static XLColor StPatricksBlue { get { return FromHtml("#FF23297A"); } } + + public static XLColor StilDeGrainYellow { get { return FromHtml("#FFFADA5E"); } } + + public static XLColor Straw { get { return FromHtml("#FFE4D96F"); } } + + public static XLColor Sunglow { get { return FromHtml("#FFFFCC33"); } } + + public static XLColor Sunset { get { return FromHtml("#FFFAD6A5"); } } + + public static XLColor Tangelo { get { return FromHtml("#FFF94D00"); } } + + public static XLColor Tangerine { get { return FromHtml("#FFF28500"); } } + + public static XLColor TangerineYellow { get { return FromHtml("#FFFFCC00"); } } + + public static XLColor Taupe { get { return FromHtml("#FF483C32"); } } + + public static XLColor TaupeGray { get { return FromHtml("#FF8B8589"); } } + + public static XLColor TeaGreen { get { return FromHtml("#FFD0F0C0"); } } + + public static XLColor TealBlue { get { return FromHtml("#FF367588"); } } + + public static XLColor TealGreen { get { return FromHtml("#FF006D5B"); } } + + public static XLColor TeaRoseOrange { get { return FromHtml("#FFF88379"); } } + + public static XLColor TeaRoseRose { get { return FromHtml("#FFF4C2C2"); } } + + public static XLColor TennéTawny { get { return FromHtml("#FFCD5700"); } } + + public static XLColor TerraCotta { get { return FromHtml("#FFE2725B"); } } + + public static XLColor ThulianPink { get { return FromHtml("#FFDE6FA1"); } } + + public static XLColor TickleMePink { get { return FromHtml("#FFFC89AC"); } } + + public static XLColor TiffanyBlue { get { return FromHtml("#FF0ABAB5"); } } + + public static XLColor TigersEye { get { return FromHtml("#FFE08D3C"); } } + + public static XLColor Timberwolf { get { return FromHtml("#FFDBD7D2"); } } + + public static XLColor TitaniumYellow { get { return FromHtml("#FFEEE600"); } } + + public static XLColor Toolbox { get { return FromHtml("#FF746CC0"); } } + + public static XLColor TractorRed { get { return FromHtml("#FFFD0E35"); } } + + public static XLColor TropicalRainForest { get { return FromHtml("#FF00755E"); } } + + public static XLColor TuftsBlue { get { return FromHtml("#FF417DC1"); } } + + public static XLColor Tumbleweed { get { return FromHtml("#FFDEAA88"); } } + + public static XLColor TurkishRose { get { return FromHtml("#FFB57281"); } } + + public static XLColor Turquoise1 { get { return FromHtml("#FF30D5C8"); } } + + public static XLColor TurquoiseBlue { get { return FromHtml("#FF00FFEF"); } } + + public static XLColor TurquoiseGreen { get { return FromHtml("#FFA0D6B4"); } } + + public static XLColor TuscanRed { get { return FromHtml("#FF823535"); } } + + public static XLColor TwilightLavender { get { return FromHtml("#FF8A496B"); } } + + public static XLColor TyrianPurple { get { return FromHtml("#FF66023C"); } } + + public static XLColor UaBlue { get { return FromHtml("#FF0033AA"); } } + + public static XLColor UaRed { get { return FromHtml("#FFD9004C"); } } + + public static XLColor Ube { get { return FromHtml("#FF8878C3"); } } + + public static XLColor UclaBlue { get { return FromHtml("#FF536895"); } } + + public static XLColor UclaGold { get { return FromHtml("#FFFFB300"); } } + + public static XLColor UfoGreen { get { return FromHtml("#FF3CD070"); } } + + public static XLColor Ultramarine { get { return FromHtml("#FF120A8F"); } } + + public static XLColor UltramarineBlue { get { return FromHtml("#FF4166F5"); } } + + public static XLColor UltraPink { get { return FromHtml("#FFFF6FFF"); } } + + public static XLColor Umber { get { return FromHtml("#FF635147"); } } + + public static XLColor UnitedNationsBlue { get { return FromHtml("#FF5B92E5"); } } + + public static XLColor UnmellowYellow { get { return FromHtml("#FFFFFF66"); } } + + public static XLColor UpForestGreen { get { return FromHtml("#FF014421"); } } + + public static XLColor UpMaroon { get { return FromHtml("#FF7B1113"); } } + + public static XLColor UpsdellRed { get { return FromHtml("#FFAE2029"); } } + + public static XLColor Urobilin { get { return FromHtml("#FFE1AD21"); } } + + public static XLColor UscCardinal { get { return FromHtml("#FF990000"); } } + + public static XLColor UscGold { get { return FromHtml("#FFFFCC00"); } } + + public static XLColor UtahCrimson { get { return FromHtml("#FFD3003F"); } } + + public static XLColor Vanilla { get { return FromHtml("#FFF3E5AB"); } } + + public static XLColor VegasGold { get { return FromHtml("#FFC5B358"); } } + + public static XLColor VenetianRed { get { return FromHtml("#FFC80815"); } } + + public static XLColor Verdigris { get { return FromHtml("#FF43B3AE"); } } + + public static XLColor Vermilion { get { return FromHtml("#FFE34234"); } } + + public static XLColor Veronica { get { return FromHtml("#FFA020F0"); } } + + public static XLColor Violet1 { get { return FromHtml("#FF8F00FF"); } } + + public static XLColor VioletColorWheel { get { return FromHtml("#FF7F00FF"); } } + + public static XLColor VioletRyb { get { return FromHtml("#FF8601AF"); } } + + public static XLColor Viridian { get { return FromHtml("#FF40826D"); } } + + public static XLColor VividAuburn { get { return FromHtml("#FF922724"); } } + + public static XLColor VividBurgundy { get { return FromHtml("#FF9F1D35"); } } + + public static XLColor VividCerise { get { return FromHtml("#FFDA1D81"); } } + + public static XLColor VividTangerine { get { return FromHtml("#FFFFA089"); } } + + public static XLColor VividViolet { get { return FromHtml("#FF9F00FF"); } } + + public static XLColor WarmBlack { get { return FromHtml("#FF004242"); } } + + public static XLColor Wenge { get { return FromHtml("#FF645452"); } } + + public static XLColor WildBlueYonder { get { return FromHtml("#FFA2ADD0"); } } + + public static XLColor WildStrawberry { get { return FromHtml("#FFFF43A4"); } } + + public static XLColor WildWatermelon { get { return FromHtml("#FFFC6C85"); } } + + public static XLColor Wisteria { get { return FromHtml("#FFC9A0DC"); } } + + public static XLColor Xanadu { get { return FromHtml("#FF738678"); } } + + public static XLColor YaleBlue { get { return FromHtml("#FF0F4D92"); } } + + public static XLColor YellowMunsell { get { return FromHtml("#FFEFCC00"); } } + + public static XLColor YellowNcs { get { return FromHtml("#FFFFD300"); } } + + public static XLColor YellowProcess { get { return FromHtml("#FFFFEF00"); } } + + public static XLColor YellowRyb { get { return FromHtml("#FFFEFE33"); } } + + public static XLColor Zaffre { get { return FromHtml("#FF0014A8"); } } + + public static XLColor ZinnwalditeBrown { get { return FromHtml("#FF2C1608"); } } + + public static XLColor Transparent { get { return FromColor(Color.Transparent); } } + } +} diff --git a/ClosedXML/Excel/Style/IXLAlignment.cs b/ClosedXML/Excel/Style/IXLAlignment.cs new file mode 100644 index 0000000..61a3301 --- /dev/null +++ b/ClosedXML/Excel/Style/IXLAlignment.cs @@ -0,0 +1,106 @@ +using System; + +namespace ClosedXML.Excel +{ + public enum XLAlignmentReadingOrderValues + { + ContextDependent, + LeftToRight, + RightToLeft + } + + public enum XLAlignmentHorizontalValues + { + Center, + CenterContinuous, + Distributed, + Fill, + General, + Justify, + Left, + Right + } + + public enum XLAlignmentVerticalValues + { + Bottom, + Center, + Distributed, + Justify, + Top + } + + public interface IXLAlignment : IEquatable + { + /// + /// Gets or sets the cell's horizontal alignment. + /// + XLAlignmentHorizontalValues Horizontal { get; set; } + + /// + /// Gets or sets the cell's vertical alignment. + /// + XLAlignmentVerticalValues Vertical { get; set; } + + /// + /// Gets or sets the cell's text indentation. + /// + Int32 Indent { get; set; } + + /// + /// Gets or sets whether the cell's last line is justified or not. + /// + Boolean JustifyLastLine { get; set; } + + /// + /// Gets or sets the cell's reading order. + /// + XLAlignmentReadingOrderValues ReadingOrder { get; set; } + + /// + /// Gets or sets the cell's relative indent. + /// + Int32 RelativeIndent { get; set; } + + /// + /// Gets or sets whether the cell's font size should decrease to fit the contents. + /// + Boolean ShrinkToFit { get; set; } + + /// + /// Gets or sets the cell's text rotation. + /// + Int32 TextRotation { get; set; } + + /// + /// Gets or sets whether the cell's text should wrap if it doesn't fit. + /// + Boolean WrapText { get; set; } + + /// + /// Gets or sets wheter the cell's text should be displayed from to to bottom + /// (as opposed to the normal left to right). + /// + Boolean TopToBottom { get; set; } + + IXLStyle SetHorizontal(XLAlignmentHorizontalValues value); + + IXLStyle SetVertical(XLAlignmentVerticalValues value); + + IXLStyle SetIndent(Int32 value); + + IXLStyle SetJustifyLastLine(); IXLStyle SetJustifyLastLine(Boolean value); + + IXLStyle SetReadingOrder(XLAlignmentReadingOrderValues value); + + IXLStyle SetRelativeIndent(Int32 value); + + IXLStyle SetShrinkToFit(); IXLStyle SetShrinkToFit(Boolean value); + + IXLStyle SetTextRotation(Int32 value); + + IXLStyle SetWrapText(); IXLStyle SetWrapText(Boolean value); + + IXLStyle SetTopToBottom(); IXLStyle SetTopToBottom(Boolean value); + } +} diff --git a/ClosedXML/Excel/Style/IXLBorder.cs b/ClosedXML/Excel/Style/IXLBorder.cs new file mode 100644 index 0000000..5c49df4 --- /dev/null +++ b/ClosedXML/Excel/Style/IXLBorder.cs @@ -0,0 +1,89 @@ +using System; + +namespace ClosedXML.Excel +{ + public enum XLBorderStyleValues + { + DashDot, + DashDotDot, + Dashed, + Dotted, + Double, + Hair, + Medium, + MediumDashDot, + MediumDashDotDot, + MediumDashed, + None, + SlantDashDot, + Thick, + Thin + } + + public interface IXLBorder : IEquatable + { + XLBorderStyleValues OutsideBorder { set; } + + XLColor OutsideBorderColor { set; } + + XLBorderStyleValues InsideBorder { set; } + + XLColor InsideBorderColor { set; } + + XLBorderStyleValues LeftBorder { get; set; } + + XLColor LeftBorderColor { get; set; } + + XLBorderStyleValues RightBorder { get; set; } + + XLColor RightBorderColor { get; set; } + + XLBorderStyleValues TopBorder { get; set; } + + XLColor TopBorderColor { get; set; } + + XLBorderStyleValues BottomBorder { get; set; } + + XLColor BottomBorderColor { get; set; } + + Boolean DiagonalUp { get; set; } + + Boolean DiagonalDown { get; set; } + + XLBorderStyleValues DiagonalBorder { get; set; } + + XLColor DiagonalBorderColor { get; set; } + + IXLStyle SetOutsideBorder(XLBorderStyleValues value); + + IXLStyle SetOutsideBorderColor(XLColor value); + + IXLStyle SetInsideBorder(XLBorderStyleValues value); + + IXLStyle SetInsideBorderColor(XLColor value); + + IXLStyle SetLeftBorder(XLBorderStyleValues value); + + IXLStyle SetLeftBorderColor(XLColor value); + + IXLStyle SetRightBorder(XLBorderStyleValues value); + + IXLStyle SetRightBorderColor(XLColor value); + + IXLStyle SetTopBorder(XLBorderStyleValues value); + + IXLStyle SetTopBorderColor(XLColor value); + + IXLStyle SetBottomBorder(XLBorderStyleValues value); + + IXLStyle SetBottomBorderColor(XLColor value); + + IXLStyle SetDiagonalUp(); IXLStyle SetDiagonalUp(Boolean value); + + IXLStyle SetDiagonalDown(); IXLStyle SetDiagonalDown(Boolean value); + + IXLStyle SetDiagonalBorder(XLBorderStyleValues value); + + IXLStyle SetDiagonalBorderColor(XLColor value); + } +} diff --git a/ClosedXML/Excel/Style/IXLFill.cs b/ClosedXML/Excel/Style/IXLFill.cs new file mode 100644 index 0000000..69ac75f --- /dev/null +++ b/ClosedXML/Excel/Style/IXLFill.cs @@ -0,0 +1,42 @@ +using System; + +namespace ClosedXML.Excel +{ + public enum XLFillPatternValues + { + DarkDown, + DarkGray, + DarkGrid, + DarkHorizontal, + DarkTrellis, + DarkUp, + DarkVertical, + Gray0625, + Gray125, + LightDown, + LightGray, + LightGrid, + LightHorizontal, + LightTrellis, + LightUp, + LightVertical, + MediumGray, + None, + Solid + } + + public interface IXLFill : IEquatable + { + XLColor BackgroundColor { get; set; } + + XLColor PatternColor { get; set; } + + XLFillPatternValues PatternType { get; set; } + + IXLStyle SetBackgroundColor(XLColor value); + + IXLStyle SetPatternColor(XLColor value); + + IXLStyle SetPatternType(XLFillPatternValues value); + } +} diff --git a/ClosedXML/Excel/Style/IXLFont.cs b/ClosedXML/Excel/Style/IXLFont.cs new file mode 100644 index 0000000..a996b62 --- /dev/null +++ b/ClosedXML/Excel/Style/IXLFont.cs @@ -0,0 +1,158 @@ +using System; + +namespace ClosedXML.Excel +{ + public enum XLFontUnderlineValues + { + Double, + DoubleAccounting, + None, + Single, + SingleAccounting + } + + public enum XLFontVerticalTextAlignmentValues + { + Baseline, + Subscript, + Superscript + } + + public enum XLFontFamilyNumberingValues + { + NotApplicable = 0, + Roman = 1, + Swiss = 2, + Modern = 3, + Script = 4, + Decorative = 5 + } + + public enum XLFontCharSet + { + /// + /// ASCII character set. + /// + Ansi = 0, + + /// + /// System default character set. + /// + Default = 1, + + /// + /// Symbol character set. + /// + Symbol = 2, + + /// + /// Characters used by Macintosh. + /// + Mac = 77, + + /// + /// Japanese character set. + /// + ShiftJIS = 128, + + /// + /// Korean character set. + /// + Hangul = 129, + + /// + /// Another common spelling of the Korean character set. + /// + Hangeul = 129, + + /// + /// Korean character set. + /// + Johab = 130, + + /// + /// Chinese character set used in mainland China. + /// + GB2312 = 134, + + /// + /// Chinese character set used mostly in Hong Kong SAR and Taiwan. + /// + ChineseBig5 = 136, + + /// + /// Greek character set. + /// + Greek = 161, + + /// + /// Turkish character set. + /// + Turkish = 162, + + /// + /// Vietnamese character set. + /// + Vietnamese = 163, + + /// + /// Hebrew character set. + /// + Hebrew = 177, + + /// + /// Arabic character set. + /// + Arabic = 178, + + /// + /// Baltic character set. + /// + Baltic = 186, + + /// + /// Russian character set. + /// + Russian = 204, + + /// + /// Thai character set. + /// + Thai = 222, + + /// + /// Eastern European character set. + /// + EastEurope = 238, + + /// + /// Extended ASCII character set used with disk operating system (DOS) and some Microsoft Windows fonts. + /// + Oem = 255 + } + + public interface IXLFont : IXLFontBase, IEquatable + { + IXLStyle SetBold(); IXLStyle SetBold(Boolean value); + + IXLStyle SetItalic(); IXLStyle SetItalic(Boolean value); + + IXLStyle SetUnderline(); IXLStyle SetUnderline(XLFontUnderlineValues value); + + IXLStyle SetStrikethrough(); IXLStyle SetStrikethrough(Boolean value); + + IXLStyle SetVerticalAlignment(XLFontVerticalTextAlignmentValues value); + + IXLStyle SetShadow(); IXLStyle SetShadow(Boolean value); + + IXLStyle SetFontSize(Double value); + + IXLStyle SetFontColor(XLColor value); + + IXLStyle SetFontName(String value); + + IXLStyle SetFontFamilyNumbering(XLFontFamilyNumberingValues value); + + IXLStyle SetFontCharSet(XLFontCharSet value); + } +} diff --git a/ClosedXML/Excel/Style/IXLFontBase.cs b/ClosedXML/Excel/Style/IXLFontBase.cs new file mode 100644 index 0000000..21b8288 --- /dev/null +++ b/ClosedXML/Excel/Style/IXLFontBase.cs @@ -0,0 +1,29 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLFontBase + { + Boolean Bold { get; set; } + + Boolean Italic { get; set; } + + XLFontUnderlineValues Underline { get; set; } + + Boolean Strikethrough { get; set; } + + XLFontVerticalTextAlignmentValues VerticalAlignment { get; set; } + + Boolean Shadow { get; set; } + + Double FontSize { get; set; } + + XLColor FontColor { get; set; } + + String FontName { get; set; } + + XLFontFamilyNumberingValues FontFamilyNumbering { get; set; } + + XLFontCharSet FontCharSet { get; set; } + } +} diff --git a/ClosedXML/Excel/Style/IXLNumberFormat.cs b/ClosedXML/Excel/Style/IXLNumberFormat.cs new file mode 100644 index 0000000..cb55e51 --- /dev/null +++ b/ClosedXML/Excel/Style/IXLNumberFormat.cs @@ -0,0 +1,11 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLNumberFormat : IXLNumberFormatBase, IEquatable + { + IXLStyle SetNumberFormatId(Int32 value); + + IXLStyle SetFormat(String value); + } +} diff --git a/ClosedXML/Excel/Style/IXLNumberFormatBase.cs b/ClosedXML/Excel/Style/IXLNumberFormatBase.cs new file mode 100644 index 0000000..d334a93 --- /dev/null +++ b/ClosedXML/Excel/Style/IXLNumberFormatBase.cs @@ -0,0 +1,11 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLNumberFormatBase + { + Int32 NumberFormatId { get; set; } + + String Format { get; set; } + } +} diff --git a/ClosedXML/Excel/Style/IXLProtection.cs b/ClosedXML/Excel/Style/IXLProtection.cs new file mode 100644 index 0000000..94d9153 --- /dev/null +++ b/ClosedXML/Excel/Style/IXLProtection.cs @@ -0,0 +1,15 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLProtection : IEquatable + { + Boolean Locked { get; set; } + + Boolean Hidden { get; set; } + + IXLStyle SetLocked(); IXLStyle SetLocked(Boolean value); + + IXLStyle SetHidden(); IXLStyle SetHidden(Boolean value); + } +} diff --git a/ClosedXML/Excel/Style/IXLStyle.cs b/ClosedXML/Excel/Style/IXLStyle.cs new file mode 100644 index 0000000..7634e61 --- /dev/null +++ b/ClosedXML/Excel/Style/IXLStyle.cs @@ -0,0 +1,26 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + public interface IXLStyle : IEquatable + { + IXLAlignment Alignment { get; set; } + + IXLBorder Border { get; set; } + + IXLNumberFormat DateFormat { get; } + + IXLFill Fill { get; set; } + + IXLFont Font { get; set; } + + Boolean IncludeQuotePrefix { get; set; } + + IXLNumberFormat NumberFormat { get; set; } + + IXLProtection Protection { get; set; } + + IXLStyle SetIncludeQuotePrefix(Boolean includeQuotePrefix = true); + } +} diff --git a/ClosedXML/Excel/Style/IXLStylized.cs b/ClosedXML/Excel/Style/IXLStylized.cs new file mode 100644 index 0000000..c056e04 --- /dev/null +++ b/ClosedXML/Excel/Style/IXLStylized.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal interface IXLStylized + { + IXLStyle Style { get; set; } + + IEnumerable Styles { get; } + + IXLStyle InnerStyle { get; set; } + + IXLRanges RangesUsed { get; } + + /// + /// Immutable style + /// + XLStyleValue StyleValue { get; } + + void ModifyStyle(Func modification); + } +} diff --git a/ClosedXML/Excel/Style/XLAlignment.cs b/ClosedXML/Excel/Style/XLAlignment.cs new file mode 100644 index 0000000..3605776 --- /dev/null +++ b/ClosedXML/Excel/Style/XLAlignment.cs @@ -0,0 +1,327 @@ +#region + +using System; +using System.Text; + +#endregion + +namespace ClosedXML.Excel +{ + internal class XLAlignment : IXLAlignment + { + #region Static members + + internal static XLAlignmentKey GenerateKey(IXLAlignment d) + { + XLAlignmentKey key; + if (d == null) + { + key = XLAlignmentValue.Default.Key; + } + else if (d is XLAlignment) + { + key = (d as XLAlignment).Key; + } + else + { + key = new XLAlignmentKey + { + Horizontal = d.Horizontal, + Vertical = d.Vertical, + Indent = d.Indent, + JustifyLastLine = d.JustifyLastLine, + ReadingOrder = d.ReadingOrder, + RelativeIndent = d.RelativeIndent, + ShrinkToFit = d.ShrinkToFit, + TextRotation = d.TextRotation, + WrapText = d.WrapText + }; + } + return key; + } + + #endregion Static members + + #region Properties + private readonly XLStyle _style; + + private XLAlignmentValue _value; + + internal XLAlignmentKey Key + { + get { return _value.Key; } + private set { _value = XLAlignmentValue.FromKey(ref value); } + } + + #endregion Properties + + #region Constructors + + /// + /// Create an instance of XLAlignment initializing it with the specified value. + /// + /// Style to attach the new instance to. + /// Style value to use. + public XLAlignment(XLStyle style, XLAlignmentValue value) + { + _style = style ?? XLStyle.CreateEmptyStyle(); + _value = value; + } + + public XLAlignment(XLStyle style, XLAlignmentKey key) : this(style, XLAlignmentValue.FromKey(ref key)) + { + } + + public XLAlignment(XLStyle style = null, IXLAlignment d = null) : this(style, GenerateKey(d)) + { + } + + #endregion Constructors + + #region IXLAlignment Members + + public XLAlignmentHorizontalValues Horizontal + { + get { return Key.Horizontal; } + set + { + Boolean updateIndent = !( + value == XLAlignmentHorizontalValues.Left + || value == XLAlignmentHorizontalValues.Right + || value == XLAlignmentHorizontalValues.Distributed + ); + + Modify(k => { k.Horizontal = value; return k; }); + if (updateIndent) + Indent = 0; + } + } + + public XLAlignmentVerticalValues Vertical + { + get { return Key.Vertical; } + set { Modify(k => { k.Vertical = value; return k; }); } + } + + public Int32 Indent + { + get { return Key.Indent; } + set + { + if (Indent != value) + { + if (Horizontal == XLAlignmentHorizontalValues.General) + Horizontal = XLAlignmentHorizontalValues.Left; + + if (value > 0 && !( + Horizontal == XLAlignmentHorizontalValues.Left + || Horizontal == XLAlignmentHorizontalValues.Right + || Horizontal == XLAlignmentHorizontalValues.Distributed + )) + { + throw new ArgumentException( + "For indents, only left, right, and distributed horizontal alignments are supported."); + } + } + Modify(k => { k.Indent = value; return k; }); + } + } + + public Boolean JustifyLastLine + { + get { return Key.JustifyLastLine; } + set { Modify(k => { k.JustifyLastLine = value; return k; }); } + } + + public XLAlignmentReadingOrderValues ReadingOrder + { + get { return Key.ReadingOrder; } + set { Modify(k => { k.ReadingOrder = value; return k; }); } + } + + public Int32 RelativeIndent + { + get { return Key.RelativeIndent; } + set { Modify(k => { k.RelativeIndent = value; return k; }); } + } + + public Boolean ShrinkToFit + { + get { return Key.ShrinkToFit; } + set { Modify(k => { k.ShrinkToFit = value; return k; }); } + } + + public Int32 TextRotation + { + get { return Key.TextRotation; } + set + { + Int32 rotation = value; + + if (rotation != 255 && (rotation < -90 || rotation > 180)) + throw new ArgumentException("TextRotation must be between -90 and 180 degrees, or 255."); + + Modify(k => { k.TextRotation = rotation; return k; }); + } + } + + public Boolean WrapText + { + get { return Key.WrapText; } + set { Modify(k => { k.WrapText = value; return k; }); } + } + + public Boolean TopToBottom + { + get { return TextRotation == 255; } + set { TextRotation = value ? 255 : 0; } + } + + public IXLStyle SetHorizontal(XLAlignmentHorizontalValues value) + { + Horizontal = value; + return _style; + } + + public IXLStyle SetVertical(XLAlignmentVerticalValues value) + { + Vertical = value; + return _style; + } + + public IXLStyle SetIndent(Int32 value) + { + Indent = value; + return _style; + } + + public IXLStyle SetJustifyLastLine() + { + JustifyLastLine = true; + return _style; + } + + public IXLStyle SetJustifyLastLine(Boolean value) + { + JustifyLastLine = value; + return _style; + } + + public IXLStyle SetReadingOrder(XLAlignmentReadingOrderValues value) + { + ReadingOrder = value; + return _style; + } + + public IXLStyle SetRelativeIndent(Int32 value) + { + RelativeIndent = value; + return _style; + } + + public IXLStyle SetShrinkToFit() + { + ShrinkToFit = true; + return _style; + } + + public IXLStyle SetShrinkToFit(Boolean value) + { + ShrinkToFit = value; + return _style; + } + + public IXLStyle SetTextRotation(Int32 value) + { + TextRotation = value; + return _style; + } + + public IXLStyle SetWrapText() + { + WrapText = true; + return _style; + } + + public IXLStyle SetWrapText(Boolean value) + { + WrapText = value; + return _style; + } + + public IXLStyle SetTopToBottom() + { + TopToBottom = true; + return _style; + } + + public IXLStyle SetTopToBottom(Boolean value) + { + TopToBottom = value; + return _style; + } + + #endregion + + private void Modify(Func modification) + { + Key = modification(Key); + + _style.Modify(styleKey => + { + var align = styleKey.Alignment; + styleKey.Alignment = modification(align); + return styleKey; + }); + } + + #region Overridden + + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append(Horizontal); + sb.Append("-"); + sb.Append(Vertical); + sb.Append("-"); + sb.Append(Indent); + sb.Append("-"); + sb.Append(JustifyLastLine); + sb.Append("-"); + sb.Append(ReadingOrder); + sb.Append("-"); + sb.Append(RelativeIndent); + sb.Append("-"); + sb.Append(ShrinkToFit); + sb.Append("-"); + sb.Append(TextRotation); + sb.Append("-"); + sb.Append(WrapText); + sb.Append("-"); + return sb.ToString(); + } + + public override bool Equals(object obj) + { + return Equals(obj as XLAlignment); + } + + public bool Equals(IXLAlignment other) + { + var otherA = other as XLAlignment; + if (otherA == null) + return false; + + return Key == otherA.Key; + } + + public override int GetHashCode() + { + var hashCode = 1214962009; + hashCode = hashCode * -1521134295 + Key.GetHashCode(); + return hashCode; + } + + #endregion Overridden + } +} diff --git a/ClosedXML/Excel/Style/XLAlignmentKey.cs b/ClosedXML/Excel/Style/XLAlignmentKey.cs new file mode 100644 index 0000000..c167224 --- /dev/null +++ b/ClosedXML/Excel/Style/XLAlignmentKey.cs @@ -0,0 +1,78 @@ +using System; + +namespace ClosedXML.Excel +{ + public struct XLAlignmentKey : IEquatable + { + public XLAlignmentHorizontalValues Horizontal { get; set; } + + public XLAlignmentVerticalValues Vertical { get; set; } + + public int Indent { get; set; } + + public bool JustifyLastLine { get; set; } + + public XLAlignmentReadingOrderValues ReadingOrder { get; set; } + + public int RelativeIndent { get; set; } + + public bool ShrinkToFit { get; set; } + + public int TextRotation { get; set; } + + public bool WrapText { get; set; } + + public bool TopToBottom { get; set; } + + public bool Equals(XLAlignmentKey other) + { + return + Horizontal == other.Horizontal + && Vertical == other.Vertical + && Indent == other.Indent + && JustifyLastLine == other.JustifyLastLine + && ReadingOrder == other.ReadingOrder + && RelativeIndent == other.RelativeIndent + && ShrinkToFit == other.ShrinkToFit + && TextRotation == other.TextRotation + && WrapText == other.WrapText + && TopToBottom == other.TopToBottom; + } + + public override bool Equals(object obj) + { + if (obj is XLAlignment) + return Equals((XLAlignment)obj); + return base.Equals(obj); + } + + public override int GetHashCode() + { + var hashCode = -596887160; + hashCode = hashCode * -1521134295 + (int)Horizontal; + hashCode = hashCode * -1521134295 + (int)Vertical; + hashCode = hashCode * -1521134295 + Indent; + hashCode = hashCode * -1521134295 + JustifyLastLine.GetHashCode(); + hashCode = hashCode * -1521134295 + (int)ReadingOrder; + hashCode = hashCode * -1521134295 + RelativeIndent; + hashCode = hashCode * -1521134295 + ShrinkToFit.GetHashCode(); + hashCode = hashCode * -1521134295 + TextRotation; + hashCode = hashCode * -1521134295 + WrapText.GetHashCode(); + hashCode = hashCode * -1521134295 + TopToBottom.GetHashCode(); + return hashCode; + } + + public override string ToString() + { + return + $"{Horizontal} {Vertical} {ReadingOrder} Indent: {Indent} RelativeIndent: {RelativeIndent} TextRotation: {TextRotation} " + + (WrapText ? "WrapText" : "") + + (JustifyLastLine ? "JustifyLastLine" : "") + + (TopToBottom ? "TopToBottom" : ""); + } + + public static bool operator ==(XLAlignmentKey left, XLAlignmentKey right) => left.Equals(right); + + public static bool operator !=(XLAlignmentKey left, XLAlignmentKey right) => !(left.Equals(right)); + } +} diff --git a/ClosedXML/Excel/Style/XLAlignmentValue.cs b/ClosedXML/Excel/Style/XLAlignmentValue.cs new file mode 100644 index 0000000..758f0ac --- /dev/null +++ b/ClosedXML/Excel/Style/XLAlignmentValue.cs @@ -0,0 +1,68 @@ +using ClosedXML.Excel.Caching; + +namespace ClosedXML.Excel +{ + public class XLAlignmentValue + { + private static readonly XLAlignmentRepository Repository = new XLAlignmentRepository(key => new XLAlignmentValue(key)); + + public static XLAlignmentValue FromKey(ref XLAlignmentKey key) + { + return Repository.GetOrCreate(ref key); + } + + private static readonly XLAlignmentKey DefaultKey = new XLAlignmentKey + { + Indent = 0, + Horizontal = XLAlignmentHorizontalValues.General, + JustifyLastLine = false, + ReadingOrder = XLAlignmentReadingOrderValues.ContextDependent, + RelativeIndent = 0, + ShrinkToFit = false, + TextRotation = 0, + Vertical = XLAlignmentVerticalValues.Bottom, + WrapText = false + }; + + internal static readonly XLAlignmentValue Default = FromKey(ref DefaultKey); + + public XLAlignmentKey Key { get; private set; } + + public XLAlignmentHorizontalValues Horizontal { get { return Key.Horizontal; } } + + public XLAlignmentVerticalValues Vertical { get { return Key.Vertical; } } + + public int Indent { get { return Key.Indent; } } + + public bool JustifyLastLine { get { return Key.JustifyLastLine; } } + + public XLAlignmentReadingOrderValues ReadingOrder { get { return Key.ReadingOrder; } } + + public int RelativeIndent { get { return Key.RelativeIndent; } } + + public bool ShrinkToFit { get { return Key.ShrinkToFit; } } + + public int TextRotation { get { return Key.TextRotation; } } + + public bool WrapText { get { return Key.WrapText; } } + + public bool TopToBottom { get { return Key.TopToBottom; } } + + private XLAlignmentValue(XLAlignmentKey key) + { + Key = key; + } + + public override bool Equals(object obj) + { + var cached = obj as XLAlignmentValue; + return cached != null && + Key.Equals(cached.Key); + } + + public override int GetHashCode() + { + return 990326508 + Key.GetHashCode(); + } + } +} diff --git a/ClosedXML/Excel/Style/XLBorder.cs b/ClosedXML/Excel/Style/XLBorder.cs new file mode 100644 index 0000000..a856027 --- /dev/null +++ b/ClosedXML/Excel/Style/XLBorder.cs @@ -0,0 +1,611 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLBorder : IXLBorder + { + #region Static members + + internal static XLBorderKey GenerateKey(IXLBorder defaultBorder) + { + XLBorderKey key; + if (defaultBorder == null) + { + key = XLBorderValue.Default.Key; + } + else if (defaultBorder is XLBorder) + { + key = (defaultBorder as XLBorder).Key; + } + else + { + key = new XLBorderKey + { + LeftBorder = defaultBorder.LeftBorder, + LeftBorderColor = defaultBorder.LeftBorderColor.Key, + RightBorder = defaultBorder.RightBorder, + RightBorderColor = defaultBorder.RightBorderColor.Key, + TopBorder = defaultBorder.TopBorder, + TopBorderColor = defaultBorder.TopBorderColor.Key, + BottomBorder = defaultBorder.BottomBorder, + BottomBorderColor = defaultBorder.BottomBorderColor.Key, + DiagonalBorder = defaultBorder.DiagonalBorder, + DiagonalBorderColor = defaultBorder.DiagonalBorderColor.Key, + DiagonalUp = defaultBorder.DiagonalUp, + DiagonalDown = defaultBorder.DiagonalDown, + }; + } + return key; + } + + #endregion Static members + + private readonly XLStyle _style; + + private readonly IXLStylized _container; + + private XLBorderValue _value; + + internal XLBorderKey Key + { + get { return _value.Key; } + private set { _value = XLBorderValue.FromKey(ref value); } + } + + #region Constructors + + /// + /// Create an instance of XLBorder initializing it with the specified value. + /// + /// Container the border is applied to. + /// Style to attach the new instance to. + /// Style value to use. + public XLBorder(IXLStylized container, XLStyle style, XLBorderValue value) + { + _container = container; + _style = style ?? _container.Style as XLStyle ?? XLStyle.CreateEmptyStyle(); + _value = value; + } + + public XLBorder(IXLStylized container, XLStyle style, XLBorderKey key) : this(container, style, XLBorderValue.FromKey(ref key)) + { + } + + public XLBorder(IXLStylized container, XLStyle style = null, IXLBorder d = null) : this(container, style, GenerateKey(d)) + { + } + + #endregion Constructors + + #region IXLBorder Members + + public XLBorderStyleValues OutsideBorder + { + set + { + if (_container == null) return; + + if (_container is XLWorksheet || _container is XLConditionalFormat) + { + Modify(k => + { + k.TopBorder = + k.BottomBorder = + k.LeftBorder = + k.RightBorder = value; + return k; + }); + } + else + { + foreach (IXLRange r in _container.RangesUsed) + { + r.FirstColumn().Style.Border.LeftBorder = value; + r.LastColumn().Style.Border.RightBorder = value; + r.FirstRow().Style.Border.TopBorder = value; + r.LastRow().Style.Border.BottomBorder = value; + } + } + } + } + + public XLColor OutsideBorderColor + { + set + { + if (_container == null) return; + + if (_container is XLWorksheet || _container is XLConditionalFormat) + { + Modify(k => + { + k.TopBorderColor = + k.BottomBorderColor = + k.LeftBorderColor = + k.RightBorderColor = value.Key; + return k; + }); + } + else + { + foreach (IXLRange r in _container.RangesUsed) + { + r.FirstColumn().Style.Border.LeftBorderColor = value; + r.LastColumn().Style.Border.RightBorderColor = value; + r.FirstRow().Style.Border.TopBorderColor = value; + r.LastRow().Style.Border.BottomBorderColor = value; + } + } + } + } + + public XLBorderStyleValues InsideBorder + { + set + { + if (_container == null) return; + + var wsContainer = _container as XLWorksheet; + if (wsContainer != null) + { + Modify(k => + { + k.TopBorder = + k.BottomBorder = + k.LeftBorder = + k.RightBorder = value; + return k; + }); + } + else + { + foreach (IXLRange r in _container.RangesUsed) + { + using (new RestoreOutsideBorder(r)) + { + foreach (var cell in r.Cells()) + { + (cell.Style.Border as XLBorder) + .Modify(k => + { + k.TopBorder = + k.BottomBorder = + k.LeftBorder = + k.RightBorder = value; + return k; + }); + } + } + } + } + } + } + + public XLColor InsideBorderColor + { + set + { + if (_container == null) return; + + var wsContainer = _container as XLWorksheet; + if (wsContainer != null) + { + Modify(k => + { + k.TopBorderColor = + k.BottomBorderColor = + k.LeftBorderColor = + k.RightBorderColor = value.Key; + return k; + }); + } + else + { + foreach (IXLRange r in _container.RangesUsed) + { + using (new RestoreOutsideBorder(r)) + { + foreach (var cell in r.Cells()) + { + (cell.Style.Border as XLBorder) + .Modify(k => + { + k.TopBorderColor = + k.BottomBorderColor = + k.LeftBorderColor = + k.RightBorderColor = value.Key; + return k; + }); + } + } + } + } + } + } + + public XLBorderStyleValues LeftBorder + { + get { return Key.LeftBorder; } + set { Modify(k => { k.LeftBorder = value; return k; }); } + } + + public XLColor LeftBorderColor + { + get + { + var colorKey = Key.LeftBorderColor; + return XLColor.FromKey(ref colorKey); + } + set + { + if (value == null) + throw new ArgumentNullException(nameof(value), "Color cannot be null"); + + Modify(k => { k.LeftBorderColor = value.Key; return k; }); + } + } + + public XLBorderStyleValues RightBorder + { + get { return Key.RightBorder; } + set { Modify(k => { k.RightBorder = value; return k; }); } + } + + public XLColor RightBorderColor + { + get + { + var colorKey = Key.RightBorderColor; + return XLColor.FromKey(ref colorKey); + } + set + { + if (value == null) + throw new ArgumentNullException(nameof(value), "Color cannot be null"); + + Modify(k => { k.RightBorderColor = value.Key; return k; }); + } + } + + public XLBorderStyleValues TopBorder + { + get { return Key.TopBorder; } + set { Modify(k => { k.TopBorder = value; return k; }); } + } + + public XLColor TopBorderColor + { + get + { + var colorKey = Key.TopBorderColor; + return XLColor.FromKey(ref colorKey); + } + set + { + if (value == null) + throw new ArgumentNullException(nameof(value), "Color cannot be null"); + + Modify(k => { k.TopBorderColor = value.Key; return k; }); + } + } + + public XLBorderStyleValues BottomBorder + { + get { return Key.BottomBorder; } + set { Modify(k => { k.BottomBorder = value; return k; }); } + } + + public XLColor BottomBorderColor + { + get + { + var colorKey = Key.BottomBorderColor; + return XLColor.FromKey(ref colorKey); + } + set + { + if (value == null) + throw new ArgumentNullException(nameof(value), "Color cannot be null"); + + Modify(k => { k.BottomBorderColor = value.Key; return k; }); + } + } + + public XLBorderStyleValues DiagonalBorder + { + get { return Key.DiagonalBorder; } + set { Modify(k => { k.DiagonalBorder = value; return k; }); } + } + + public XLColor DiagonalBorderColor + { + get + { + var colorKey = Key.DiagonalBorderColor; + return XLColor.FromKey(ref colorKey); + } + set + { + if (value == null) + throw new ArgumentNullException(nameof(value), "Color cannot be null"); + + Modify(k => { k.DiagonalBorderColor = value.Key; return k; }); + } + } + + public Boolean DiagonalUp + { + get { return Key.DiagonalUp; } + set { Modify(k => { k.DiagonalUp = value; return k; }); } + } + + public Boolean DiagonalDown + { + get { return Key.DiagonalDown; } + set { Modify(k => { k.DiagonalDown = value; return k; }); } + } + + public IXLStyle SetOutsideBorder(XLBorderStyleValues value) + { + OutsideBorder = value; + return _container.Style; + } + + public IXLStyle SetOutsideBorderColor(XLColor value) + { + OutsideBorderColor = value; + return _container.Style; + } + + public IXLStyle SetInsideBorder(XLBorderStyleValues value) + { + InsideBorder = value; + return _container.Style; + } + + public IXLStyle SetInsideBorderColor(XLColor value) + { + InsideBorderColor = value; + return _container.Style; + } + + public IXLStyle SetLeftBorder(XLBorderStyleValues value) + { + LeftBorder = value; + return _container.Style; + } + + public IXLStyle SetLeftBorderColor(XLColor value) + { + LeftBorderColor = value; + return _container.Style; + } + + public IXLStyle SetRightBorder(XLBorderStyleValues value) + { + RightBorder = value; + return _container.Style; + } + + public IXLStyle SetRightBorderColor(XLColor value) + { + RightBorderColor = value; + return _container.Style; + } + + public IXLStyle SetTopBorder(XLBorderStyleValues value) + { + TopBorder = value; + return _container.Style; + } + + public IXLStyle SetTopBorderColor(XLColor value) + { + TopBorderColor = value; + return _container.Style; + } + + public IXLStyle SetBottomBorder(XLBorderStyleValues value) + { + BottomBorder = value; + return _container.Style; + } + + public IXLStyle SetBottomBorderColor(XLColor value) + { + BottomBorderColor = value; + return _container.Style; + } + + public IXLStyle SetDiagonalUp() + { + DiagonalUp = true; + return _container.Style; + } + + public IXLStyle SetDiagonalUp(Boolean value) + { + DiagonalUp = value; + return _container.Style; + } + + public IXLStyle SetDiagonalDown() + { + DiagonalDown = true; + return _container.Style; + } + + public IXLStyle SetDiagonalDown(Boolean value) + { + DiagonalDown = value; + return _container.Style; + } + + public IXLStyle SetDiagonalBorder(XLBorderStyleValues value) + { + DiagonalBorder = value; + return _container.Style; + } + + public IXLStyle SetDiagonalBorderColor(XLColor value) + { + DiagonalBorderColor = value; + return _container.Style; + } + + #endregion IXLBorder Members + + private void Modify(Func modification) + { + Key = modification(Key); + + _style.Modify(styleKey => + { + var border = styleKey.Border; + styleKey.Border = modification(border); + return styleKey; + }); + } + + #region Overridden + + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append(LeftBorder.ToString()); + sb.Append("-"); + sb.Append(LeftBorderColor); + sb.Append("-"); + sb.Append(RightBorder.ToString()); + sb.Append("-"); + sb.Append(RightBorderColor); + sb.Append("-"); + sb.Append(TopBorder.ToString()); + sb.Append("-"); + sb.Append(TopBorderColor); + sb.Append("-"); + sb.Append(BottomBorder.ToString()); + sb.Append("-"); + sb.Append(BottomBorderColor); + sb.Append("-"); + sb.Append(DiagonalBorder.ToString()); + sb.Append("-"); + sb.Append(DiagonalBorderColor); + sb.Append("-"); + sb.Append(DiagonalUp.ToString()); + sb.Append("-"); + sb.Append(DiagonalDown.ToString()); + return sb.ToString(); + } + + public override bool Equals(object obj) + { + return Equals(obj as XLBorder); + } + + public bool Equals(IXLBorder other) + { + var otherB = other as XLBorder; + if (otherB == null) + return false; + + return Key == otherB.Key; + } + + public override int GetHashCode() + { + var hashCode = 416600561; + hashCode = hashCode * -1521134295 + Key.GetHashCode(); + return hashCode; + } + + #endregion Overridden + + /// + /// Helper class that remembers outside border state before editing (in constructor) and restore afterwards (on disposing). + /// It presumes that size of the range does not change during the editing, else it will fail. + /// + private class RestoreOutsideBorder : IDisposable + { + private readonly IXLRange _range; + private readonly Dictionary _topBorders; + private readonly Dictionary _bottomBorders; + private readonly Dictionary _leftBorders; + private readonly Dictionary _rightBorders; + + public RestoreOutsideBorder(IXLRange range) + { + _range = range ?? throw new ArgumentNullException(nameof(range)); + + _topBorders = range.FirstRow().Cells().ToDictionary( + c => c.Address.ColumnNumber - range.RangeAddress.FirstAddress.ColumnNumber + 1, + c => (c.Style as XLStyle).Key.Border); + + _bottomBorders = range.LastRow().Cells().ToDictionary( + c => c.Address.ColumnNumber - range.RangeAddress.FirstAddress.ColumnNumber + 1, + c => (c.Style as XLStyle).Key.Border); + + _leftBorders = range.FirstColumn().Cells().ToDictionary( + c => c.Address.RowNumber - range.RangeAddress.FirstAddress.RowNumber + 1, + c => (c.Style as XLStyle).Key.Border); + + _rightBorders = range.LastColumn().Cells().ToDictionary( + c => c.Address.RowNumber - range.RangeAddress.FirstAddress.RowNumber + 1, + c => (c.Style as XLStyle).Key.Border); + } + + // Used by Janitor.Fody + private void DisposeManaged() + { + _topBorders.ForEach(kp => (_range.FirstRow().Cell(kp.Key).Style + .Border as XLBorder).Modify(k => + { + k.TopBorder = kp.Value.TopBorder; + k.TopBorderColor = kp.Value.TopBorderColor; + return k; + })); + _bottomBorders.ForEach(kp => (_range.LastRow().Cell(kp.Key).Style + .Border as XLBorder).Modify(k => + { + k.BottomBorder = kp.Value.BottomBorder; + k.BottomBorderColor = kp.Value.BottomBorderColor; + return k; + })); + _leftBorders.ForEach(kp => (_range.FirstColumn().Cell(kp.Key).Style + .Border as XLBorder).Modify(k => + { + k.LeftBorder = kp.Value.LeftBorder; + k.LeftBorderColor = kp.Value.LeftBorderColor; + return k; + })); + _rightBorders.ForEach(kp => (_range.LastColumn().Cell(kp.Key).Style + .Border as XLBorder).Modify(k => + { + k.RightBorder = kp.Value.RightBorder; + k.RightBorderColor = kp.Value.RightBorderColor; + return k; + })); + } + +#if _NET40_ + + public void Dispose() + { + // net40 doesn't support Janitor.Fody, so let's dispose manually + DisposeManaged(); + } + +#else + + public void Dispose() + { + // Leave this empty (for non net40 targets) so that Janitor.Fody can do its work + } + +#endif + } + } +} diff --git a/ClosedXML/Excel/Style/XLBorderKey.cs b/ClosedXML/Excel/Style/XLBorderKey.cs new file mode 100644 index 0000000..facb097 --- /dev/null +++ b/ClosedXML/Excel/Style/XLBorderKey.cs @@ -0,0 +1,97 @@ +using System; + +namespace ClosedXML.Excel +{ + internal struct XLBorderKey : IEquatable + { + public XLBorderStyleValues LeftBorder { get; set; } + + public XLColorKey LeftBorderColor { get; set; } + + public XLBorderStyleValues RightBorder { get; set; } + + public XLColorKey RightBorderColor { get; set; } + + public XLBorderStyleValues TopBorder { get; set; } + + public XLColorKey TopBorderColor { get; set; } + + public XLBorderStyleValues BottomBorder { get; set; } + + public XLColorKey BottomBorderColor { get; set; } + + public XLBorderStyleValues DiagonalBorder { get; set; } + + public XLColorKey DiagonalBorderColor { get; set; } + + public bool DiagonalUp { get; set; } + + public bool DiagonalDown { get; set; } + + public override int GetHashCode() + { + var hashCode = -198124310; + hashCode = hashCode * -1521134295 + (int)LeftBorder; + hashCode = hashCode * -1521134295 + (int)RightBorder; + hashCode = hashCode * -1521134295 + (int)TopBorder; + hashCode = hashCode * -1521134295 + (int)BottomBorder; + hashCode = hashCode * -1521134295 + (int)DiagonalBorder; + hashCode = hashCode * -1521134295 + DiagonalUp.GetHashCode(); + hashCode = hashCode * -1521134295 + DiagonalDown.GetHashCode(); + + if (LeftBorder != XLBorderStyleValues.None) + hashCode = hashCode * -1521134295 + LeftBorderColor.GetHashCode(); + if (RightBorder != XLBorderStyleValues.None) + hashCode = hashCode * -1521134295 + RightBorderColor.GetHashCode(); + if (TopBorder != XLBorderStyleValues.None) + hashCode = hashCode * -1521134295 + TopBorderColor.GetHashCode(); + if (BottomBorder != XLBorderStyleValues.None) + hashCode = hashCode * -1521134295 + BottomBorderColor.GetHashCode(); + if (DiagonalBorder != XLBorderStyleValues.None) + hashCode = hashCode * -1521134295 + DiagonalBorderColor.GetHashCode(); + + return hashCode; + } + + public bool Equals(XLBorderKey other) + { + return + AreEquivalent(LeftBorder, LeftBorderColor, other.LeftBorder, other.LeftBorderColor) + && AreEquivalent(RightBorder, RightBorderColor, other.RightBorder, other.RightBorderColor) + && AreEquivalent(TopBorder, TopBorderColor, other.TopBorder, other.TopBorderColor) + && AreEquivalent(BottomBorder, BottomBorderColor, other.BottomBorder, other.BottomBorderColor) + && AreEquivalent(DiagonalBorder, DiagonalBorderColor, other.DiagonalBorder, other.DiagonalBorderColor) + && DiagonalUp == other.DiagonalUp + && DiagonalDown == other.DiagonalDown; + } + + private bool AreEquivalent( + XLBorderStyleValues borderStyle1, XLColorKey color1, + XLBorderStyleValues borderStyle2, XLColorKey color2) + { + return (borderStyle1 == XLBorderStyleValues.None && + borderStyle2 == XLBorderStyleValues.None) || + borderStyle1 == borderStyle2 && + color1 == color2; + } + + public override bool Equals(object obj) + { + if (obj is XLBorderKey) + return Equals((XLBorderKey)obj); + return base.Equals(obj); + } + + public override string ToString() + { + return $"{LeftBorder} {LeftBorderColor} {RightBorder} {RightBorderColor} {TopBorder} {TopBorderColor} " + + $"{BottomBorder} {BottomBorderColor} {DiagonalBorder} {DiagonalBorderColor} " + + (DiagonalUp ? "DiagonalUp" : "") + + (DiagonalDown ? "DiagonalDown" : ""); + } + + public static bool operator ==(XLBorderKey left, XLBorderKey right) => left.Equals(right); + + public static bool operator !=(XLBorderKey left, XLBorderKey right) => !(left.Equals(right)); + } +} diff --git a/ClosedXML/Excel/Style/XLBorderValue.cs b/ClosedXML/Excel/Style/XLBorderValue.cs new file mode 100644 index 0000000..f5cfd6c --- /dev/null +++ b/ClosedXML/Excel/Style/XLBorderValue.cs @@ -0,0 +1,85 @@ +using ClosedXML.Excel.Caching; + +namespace ClosedXML.Excel +{ + internal class XLBorderValue + { + private static readonly XLBorderRepository Repository = new XLBorderRepository(key => new XLBorderValue(key)); + + public static XLBorderValue FromKey(ref XLBorderKey key) + { + return Repository.GetOrCreate(ref key); + } + + private static readonly XLBorderKey DefaultKey = new XLBorderKey + { + BottomBorder = XLBorderStyleValues.None, + DiagonalBorder = XLBorderStyleValues.None, + DiagonalDown = false, + DiagonalUp = false, + LeftBorder = XLBorderStyleValues.None, + RightBorder = XLBorderStyleValues.None, + TopBorder = XLBorderStyleValues.None, + BottomBorderColor = XLColor.Black.Key, + DiagonalBorderColor = XLColor.Black.Key, + LeftBorderColor = XLColor.Black.Key, + RightBorderColor = XLColor.Black.Key, + TopBorderColor = XLColor.Black.Key + }; + + internal static readonly XLBorderValue Default = FromKey(ref DefaultKey); + + public XLBorderKey Key { get; private set; } + + public XLBorderStyleValues LeftBorder { get { return Key.LeftBorder; } } + + public XLColor LeftBorderColor { get; private set; } + + public XLBorderStyleValues RightBorder { get { return Key.RightBorder; } } + + public XLColor RightBorderColor { get; private set; } + + public XLBorderStyleValues TopBorder { get { return Key.TopBorder; } } + + public XLColor TopBorderColor { get; private set; } + + public XLBorderStyleValues BottomBorder { get { return Key.BottomBorder; } } + + public XLColor BottomBorderColor { get; private set; } + + public XLBorderStyleValues DiagonalBorder { get { return Key.DiagonalBorder; } } + + public XLColor DiagonalBorderColor { get; private set; } + + public bool DiagonalUp { get { return Key.DiagonalUp; } } + + public bool DiagonalDown { get { return Key.DiagonalDown; } } + + private XLBorderValue(XLBorderKey key) + { + Key = key; + var leftBorderColor = Key.LeftBorderColor; + var rightBorderColor = Key.RightBorderColor; + var topBorderColor = Key.TopBorderColor; + var bottomBorderColor = Key.BottomBorderColor; + var diagonalBorderColor = Key.DiagonalBorderColor; + LeftBorderColor = XLColor.FromKey(ref leftBorderColor); + RightBorderColor = XLColor.FromKey(ref rightBorderColor); + TopBorderColor = XLColor.FromKey(ref topBorderColor); + BottomBorderColor = XLColor.FromKey(ref bottomBorderColor); + DiagonalBorderColor = XLColor.FromKey(ref diagonalBorderColor); + } + + public override bool Equals(object obj) + { + var cached = obj as XLBorderValue; + return cached != null && + Key.Equals(cached.Key); + } + + public override int GetHashCode() + { + return -280332839 + Key.GetHashCode(); + } + } +} diff --git a/ClosedXML/Excel/Style/XLColorKey.cs b/ClosedXML/Excel/Style/XLColorKey.cs new file mode 100644 index 0000000..a30822b --- /dev/null +++ b/ClosedXML/Excel/Style/XLColorKey.cs @@ -0,0 +1,76 @@ +using System; + +namespace ClosedXML.Excel +{ + internal struct XLColorKey : IEquatable + { + public XLColorType ColorType { get; set; } + + public System.Drawing.Color Color { get; set; } + + public int Indexed { get; set; } + + public XLThemeColor ThemeColor { get; set; } + + public double ThemeTint { get; set; } + + public override int GetHashCode() + { + var hashCode = -331517974; + hashCode = hashCode * -1521134295 + (int)ColorType; + hashCode = hashCode * -1521134295 + (ColorType == XLColorType.Indexed ? Indexed : 0); + hashCode = hashCode * -1521134295 + (ColorType == XLColorType.Theme ? (int)ThemeColor : 0); + hashCode = hashCode * -1521134295 + (ColorType == XLColorType.Theme ? ThemeTint.GetHashCode() : 0); + hashCode = hashCode * -1521134295 + (ColorType == XLColorType.Color ? Color.ToArgb() : 0); + return hashCode; + } + + public bool Equals(XLColorKey other) + { + if (ColorType == other.ColorType) + { + if (ColorType == XLColorType.Color) + { + // .NET Color.Equals() will return false for Color.FromArgb(255, 255, 255, 255) == Color.White + // Therefore we compare the ToArgb() values + return Color.ToArgb() == other.Color.ToArgb(); + } + if (ColorType == XLColorType.Theme) + { + return + ThemeColor == other.ThemeColor + && Math.Abs(ThemeTint - other.ThemeTint) < XLHelper.Epsilon; + } + return Indexed == other.Indexed; + } + + return false; + } + + public override bool Equals(object obj) + { + if (obj is XLColorKey) + return Equals((XLColorKey)obj); + return base.Equals(obj); + } + + public override string ToString() + { + switch (ColorType) + { + case XLColorType.Color: + return Color.ToString(); + case XLColorType.Theme: + return $"{ThemeColor} ({ThemeTint})"; + case XLColorType.Indexed: + return $"Indexed: {Indexed}"; + default: + return base.ToString(); + } + } + + public static bool operator ==(XLColorKey left, XLColorKey right) => left.Equals(right); + + public static bool operator !=(XLColorKey left, XLColorKey right) => !(left.Equals(right)); + } +} diff --git a/ClosedXML/Excel/Style/XLFill.cs b/ClosedXML/Excel/Style/XLFill.cs new file mode 100644 index 0000000..0835fe5 --- /dev/null +++ b/ClosedXML/Excel/Style/XLFill.cs @@ -0,0 +1,213 @@ +using System; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLFill : IXLFill + { + #region static members + + internal static XLFillKey GenerateKey(IXLFill defaultFill) + { + XLFillKey key; + if (defaultFill == null) + { + key = XLFillValue.Default.Key; + } + else if (defaultFill is XLFill) + { + key = (defaultFill as XLFill).Key; + } + else + { + key = new XLFillKey + { + PatternType = defaultFill.PatternType, + BackgroundColor = defaultFill.BackgroundColor.Key, + PatternColor = defaultFill.PatternColor.Key + }; + } + return key; + } + + #endregion static members + + #region Properties + + private readonly XLStyle _style; + + private XLFillValue _value; + + internal XLFillKey Key + { + get { return _value.Key; } + private set { _value = XLFillValue.FromKey(ref value); } + } + + #endregion Properties + + #region Constructors + + /// + /// Create an instance of XLFill initializing it with the specified value. + /// + /// Style to attach the new instance to. + /// Style value to use. + public XLFill(XLStyle style, XLFillValue value) + { + _style = style ?? XLStyle.CreateEmptyStyle(); + _value = value; + } + + public XLFill(XLStyle style, XLFillKey key) : this(style, XLFillValue.FromKey(ref key)) + { + } + + public XLFill(XLStyle style = null, IXLFill d = null) : this(style, GenerateKey(d)) + { + } + + #endregion Constructors + + private void Modify(Func modification) + { + Key = modification(Key); + + _style.Modify(styleKey => + { + var fill = styleKey.Fill; + styleKey.Fill = modification(fill); + return styleKey; + }); + } + + #region IXLFill Members + + public XLColor BackgroundColor + { + get + { + var backgroundColorKey = Key.BackgroundColor; + return XLColor.FromKey(ref backgroundColorKey); + } + set + { + if (value == null) + throw new ArgumentNullException(nameof(value), "Color cannot be null"); + + if ((PatternType == XLFillPatternValues.None || + PatternType == XLFillPatternValues.Solid) + && XLColor.IsNullOrTransparent(BackgroundColor)) + { + var patternType = value.HasValue ? XLFillPatternValues.Solid : XLFillPatternValues.None; + Modify(k => + { + k.BackgroundColor = value.Key; + k.PatternType = patternType; + return k; + }); + } + else + Modify(k => { k.BackgroundColor = value.Key; return k; }); + } + } + + public XLColor PatternColor + { + get + { + var patternColorKey = Key.PatternColor; + return XLColor.FromKey(ref patternColorKey); + } + set + { + if (value == null) + throw new ArgumentNullException(nameof(value), "Color cannot be null"); + + Modify(k => { k.PatternColor = value.Key; return k; }); + } + } + + public XLFillPatternValues PatternType + { + get { return Key.PatternType; } + set + { + if (PatternType == XLFillPatternValues.None && + value != XLFillPatternValues.None) + { + // If fill was empty and the pattern changes to non-empty we have to specify a background color too. + // Otherwise the fill will be considered empty and pattern won't update (the cached empty fill will be used). + Modify(k => + { + k.BackgroundColor = XLColor.FromTheme(XLThemeColor.Text1).Key; + k.PatternType = value; + return k; + }); + } + else + Modify(k => { k.PatternType = value; return k; }); + } + } + + public IXLStyle SetBackgroundColor(XLColor value) + { + BackgroundColor = value; + return _style; + } + + public IXLStyle SetPatternColor(XLColor value) + { + PatternColor = value; + return _style; + } + + public IXLStyle SetPatternType(XLFillPatternValues value) + { + PatternType = value; + return _style; + } + + #endregion IXLFill Members + + #region Overridden + + public override bool Equals(object obj) + { + return Equals(obj as XLFill); + } + + public bool Equals(IXLFill other) + { + var otherF = other as XLFill; + if (otherF == null) + return false; + + return Key == otherF.Key; + } + + public override string ToString() + { + switch (PatternType) + { + case XLFillPatternValues.None: + return "None"; + + case XLFillPatternValues.Solid: + return string.Concat("Solid ", BackgroundColor.ToString()); + + default: + return string.Concat(PatternType.ToString(), " pattern: ", PatternColor.ToString(), " on ", BackgroundColor.ToString()); + } + } + + public override int GetHashCode() + { + var hashCode = -1938644919; + hashCode = hashCode * -1521134295 + Key.GetHashCode(); + return hashCode; + } + + #endregion Overridden + } +} diff --git a/ClosedXML/Excel/Style/XLFillKey.cs b/ClosedXML/Excel/Style/XLFillKey.cs new file mode 100644 index 0000000..de1a2cf --- /dev/null +++ b/ClosedXML/Excel/Style/XLFillKey.cs @@ -0,0 +1,68 @@ +using System; + +namespace ClosedXML.Excel +{ + internal struct XLFillKey : IEquatable + { + public XLColorKey BackgroundColor { get; set; } + + public XLColorKey PatternColor { get; set; } + + public XLFillPatternValues PatternType { get; set; } + + public override int GetHashCode() + { + var hashCode = 2043579837; + + if (HasNoFill()) return hashCode; + + hashCode = hashCode * -1521134295 + (int)PatternType; + hashCode = hashCode * -1521134295 + BackgroundColor.GetHashCode(); + + if (HasNoForeground()) return hashCode; + + hashCode = hashCode * -1521134295 + PatternColor.GetHashCode(); + + return hashCode; + } + + public bool Equals(XLFillKey other) + { + if (HasNoFill() && other.HasNoFill()) + return true; + + return BackgroundColor == other.BackgroundColor + && PatternType == other.PatternType + && (HasNoForeground() && other.HasNoForeground() || + PatternColor == other.PatternColor); + } + + private bool HasNoFill() + { + return PatternType == XLFillPatternValues.None + || (PatternType == XLFillPatternValues.Solid && XLColor.IsTransparent(BackgroundColor)); + } + + private bool HasNoForeground() + { + return PatternType == XLFillPatternValues.Solid || + PatternType == XLFillPatternValues.None; + } + + public override bool Equals(object obj) + { + if (obj is XLFillKey) + return Equals((XLFillKey)obj); + return base.Equals(obj); + } + + public override string ToString() + { + return $"{PatternType} {BackgroundColor}/{PatternColor}"; + } + + public static bool operator ==(XLFillKey left, XLFillKey right) => left.Equals(right); + + public static bool operator !=(XLFillKey left, XLFillKey right) => !(left.Equals(right)); + } +} diff --git a/ClosedXML/Excel/Style/XLFillValue.cs b/ClosedXML/Excel/Style/XLFillValue.cs new file mode 100644 index 0000000..f7c2eb0 --- /dev/null +++ b/ClosedXML/Excel/Style/XLFillValue.cs @@ -0,0 +1,52 @@ +using ClosedXML.Excel.Caching; + +namespace ClosedXML.Excel +{ + internal sealed class XLFillValue + { + private static readonly XLFillRepository Repository = new XLFillRepository(key => new XLFillValue(key)); + + public static XLFillValue FromKey(ref XLFillKey key) + { + return Repository.GetOrCreate(ref key); + } + + private static readonly XLFillKey DefaultKey = new XLFillKey + { + BackgroundColor = XLColor.FromIndex(64).Key, + PatternType = XLFillPatternValues.None, + PatternColor = XLColor.FromIndex(64).Key + }; + + internal static readonly XLFillValue Default = FromKey(ref DefaultKey); + + public XLFillKey Key { get; private set; } + + public XLColor BackgroundColor { get; private set; } + + public XLColor PatternColor { get; private set; } + + public XLFillPatternValues PatternType { get { return Key.PatternType; } } + + private XLFillValue(XLFillKey key) + { + Key = key; + var backgroundColorKey = Key.BackgroundColor; + var patternColorKey = Key.PatternColor; + BackgroundColor = XLColor.FromKey(ref backgroundColorKey); + PatternColor = XLColor.FromKey(ref patternColorKey); + } + + public override bool Equals(object obj) + { + var cached = obj as XLFillValue; + return cached != null && + Key.Equals(cached.Key); + } + + public override int GetHashCode() + { + return -280332839 + Key.GetHashCode(); + } + } +} diff --git a/ClosedXML/Excel/Style/XLFont.cs b/ClosedXML/Excel/Style/XLFont.cs new file mode 100644 index 0000000..22a45d8 --- /dev/null +++ b/ClosedXML/Excel/Style/XLFont.cs @@ -0,0 +1,357 @@ +using System; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLFont : IXLFont + { + #region Static members + + public static IXLFontBase DefaultCommentFont + { + get + { + // MS Excel uses Tahoma 9 Swiss no matter what current style font + var defaultCommentFont = new XLFont + { + FontName = "Tahoma", + FontSize = 9, + FontFamilyNumbering = XLFontFamilyNumberingValues.Swiss + }; + + return defaultCommentFont; + } + } + + internal static XLFontKey GenerateKey(IXLFontBase defaultFont) + { + if (defaultFont == null) + { + return XLFontValue.Default.Key; + } + else if (defaultFont is XLFont) + { + return (defaultFont as XLFont).Key; + } + else + { + return new XLFontKey + { + Bold = defaultFont.Bold, + Italic = defaultFont.Italic, + Underline = defaultFont.Underline, + Strikethrough = defaultFont.Strikethrough, + VerticalAlignment = defaultFont.VerticalAlignment, + Shadow = defaultFont.Shadow, + FontSize = defaultFont.FontSize, + FontColor = defaultFont.FontColor.Key, + FontName = defaultFont.FontName, + FontFamilyNumbering = defaultFont.FontFamilyNumbering, + FontCharSet = defaultFont.FontCharSet + }; + } + } + + #endregion Static members + + private readonly XLStyle _style; + + private XLFontValue _value; + + internal XLFontKey Key + { + get { return _value.Key; } + private set { _value = XLFontValue.FromKey(ref value); } + } + + #region Constructors + + /// + /// Create an instance of XLFont initializing it with the specified value. + /// + /// Style to attach the new instance to. + /// Style value to use. + public XLFont(XLStyle style, XLFontValue value) + { + _style = style ?? XLStyle.CreateEmptyStyle(); + _value = value; + } + + public XLFont(XLStyle style, XLFontKey key) : this(style, XLFontValue.FromKey(ref key)) + { + } + + public XLFont(XLStyle style = null, IXLFont d = null) : this(style, GenerateKey(d)) + { + } + + #endregion Constructors + + private void Modify(Func modification) + { + Key = modification(Key); + + _style.Modify(styleKey => + { + var font = styleKey.Font; + styleKey.Font = modification(font); + return styleKey; + }); + } + + #region IXLFont Members + + public Boolean Bold + { + get { return Key.Bold; } + set + { + Modify(k => { k.Bold = value; return k; }); + } + } + + public Boolean Italic + { + get { return Key.Italic; } + set + { + Modify(k => { k.Italic = value; return k; }); + } + } + + public XLFontUnderlineValues Underline + { + get { return Key.Underline; } + set + { + Modify(k => { k.Underline = value; return k; }); + } + } + + public Boolean Strikethrough + { + get { return Key.Strikethrough; } + set + { + Modify(k => { k.Strikethrough = value; return k; }); + } + } + + public XLFontVerticalTextAlignmentValues VerticalAlignment + { + get { return Key.VerticalAlignment; } + set + { + Modify(k => { k.VerticalAlignment = value; return k; }); + } + } + + public Boolean Shadow + { + get { return Key.Shadow; } + set + { + Modify(k => { k.Shadow = value; return k; }); + } + } + + public Double FontSize + { + get { return Key.FontSize; } + set + { + Modify(k => { k.FontSize = value; return k; }); + } + } + + public XLColor FontColor + { + get + { + var fontColorKey = Key.FontColor; + return XLColor.FromKey(ref fontColorKey); + } + set + { + if (value == null) + throw new ArgumentNullException(nameof(value), "Color cannot be null"); + Modify(k => { k.FontColor = value.Key; return k; }); + } + } + + public String FontName + { + get { return Key.FontName; } + set + { + Modify(k => { k.FontName = value; return k; }); + } + } + + public XLFontFamilyNumberingValues FontFamilyNumbering + { + get { return Key.FontFamilyNumbering; } + set + { + Modify(k => { k.FontFamilyNumbering = value; return k; }); + } + } + + public XLFontCharSet FontCharSet + { + get { return Key.FontCharSet; } + set + { + Modify(k => { k.FontCharSet = value; return k; }); + } + } + + public IXLStyle SetBold() + { + Bold = true; + return _style; + } + + public IXLStyle SetBold(Boolean value) + { + Bold = value; + return _style; + } + + public IXLStyle SetItalic() + { + Italic = true; + return _style; + } + + public IXLStyle SetItalic(Boolean value) + { + Italic = value; + return _style; + } + + public IXLStyle SetUnderline() + { + Underline = XLFontUnderlineValues.Single; + return _style; + } + + public IXLStyle SetUnderline(XLFontUnderlineValues value) + { + Underline = value; + return _style; + } + + public IXLStyle SetStrikethrough() + { + Strikethrough = true; + return _style; + } + + public IXLStyle SetStrikethrough(Boolean value) + { + Strikethrough = value; + return _style; + } + + public IXLStyle SetVerticalAlignment(XLFontVerticalTextAlignmentValues value) + { + VerticalAlignment = value; + return _style; + } + + public IXLStyle SetShadow() + { + Shadow = true; + return _style; + } + + public IXLStyle SetShadow(Boolean value) + { + Shadow = value; + return _style; + } + + public IXLStyle SetFontSize(Double value) + { + FontSize = value; + return _style; + } + + public IXLStyle SetFontColor(XLColor value) + { + FontColor = value; + return _style; + } + + public IXLStyle SetFontName(String value) + { + FontName = value; + return _style; + } + + public IXLStyle SetFontFamilyNumbering(XLFontFamilyNumberingValues value) + { + FontFamilyNumbering = value; + return _style; + } + + public IXLStyle SetFontCharSet(XLFontCharSet value) + { + FontCharSet = value; + return _style; + } + + #endregion IXLFont Members + + #region Overridden + + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append(Bold.ToString()); + sb.Append("-"); + sb.Append(Italic.ToString()); + sb.Append("-"); + sb.Append(Underline.ToString()); + sb.Append("-"); + sb.Append(Strikethrough.ToString()); + sb.Append("-"); + sb.Append(VerticalAlignment.ToString()); + sb.Append("-"); + sb.Append(Shadow.ToString()); + sb.Append("-"); + sb.Append(FontSize.ToString()); + sb.Append("-"); + sb.Append(FontColor); + sb.Append("-"); + sb.Append(FontName); + sb.Append("-"); + sb.Append(FontFamilyNumbering.ToString()); + return sb.ToString(); + } + + public override bool Equals(object obj) + { + return Equals(obj as XLFont); + } + + public Boolean Equals(IXLFont other) + { + var otherF = other as XLFont; + if (otherF == null) + return false; + + return Key == otherF.Key; + } + + public override int GetHashCode() + { + var hashCode = 416600561; + hashCode = hashCode * -1521134295 + Key.GetHashCode(); + return hashCode; + } + + #endregion Overridden + } +} diff --git a/ClosedXML/Excel/Style/XLFontKey.cs b/ClosedXML/Excel/Style/XLFontKey.cs new file mode 100644 index 0000000..1afbbf1 --- /dev/null +++ b/ClosedXML/Excel/Style/XLFontKey.cs @@ -0,0 +1,81 @@ +using System; + +namespace ClosedXML.Excel +{ + internal struct XLFontKey : IEquatable + { + public bool Bold { get; set; } + + public bool Italic { get; set; } + + public XLFontUnderlineValues Underline { get; set; } + + public bool Strikethrough { get; set; } + + public XLFontVerticalTextAlignmentValues VerticalAlignment { get; set; } + + public bool Shadow { get; set; } + + public double FontSize { get; set; } + + public XLColorKey FontColor { get; set; } + + public string FontName { get; set; } + + public XLFontFamilyNumberingValues FontFamilyNumbering { get; set; } + + public XLFontCharSet FontCharSet { get; set; } + + public bool Equals(XLFontKey other) + { + return + Bold == other.Bold + && Italic == other.Italic + && Underline == other.Underline + && Strikethrough == other.Strikethrough + && VerticalAlignment == other.VerticalAlignment + && Shadow == other.Shadow + && FontSize == other.FontSize + && FontColor == other.FontColor + && FontFamilyNumbering == other.FontFamilyNumbering + && FontCharSet == other.FontCharSet + && string.Equals(FontName, other.FontName, StringComparison.InvariantCultureIgnoreCase); + } + + public override bool Equals(object obj) + { + if (obj is XLFontKey) + return Equals((XLFontKey)obj); + return base.Equals(obj); + } + + public override int GetHashCode() + { + var hashCode = 1158783753; + hashCode = hashCode * -1521134295 + Bold.GetHashCode(); + hashCode = hashCode * -1521134295 + Italic.GetHashCode(); + hashCode = hashCode * -1521134295 + (int)Underline; + hashCode = hashCode * -1521134295 + Strikethrough.GetHashCode(); + hashCode = hashCode * -1521134295 + (int)VerticalAlignment; + hashCode = hashCode * -1521134295 + Shadow.GetHashCode(); + hashCode = hashCode * -1521134295 + FontSize.GetHashCode(); + hashCode = hashCode * -1521134295 + FontColor.GetHashCode(); + hashCode = hashCode * -1521134295 + StringComparer.InvariantCultureIgnoreCase.GetHashCode(FontName); + hashCode = hashCode * -1521134295 + (int)FontFamilyNumbering; + hashCode = hashCode * -1521134295 + (int)FontCharSet; + return hashCode; + } + + public override string ToString() + { + return $"{FontName} {FontSize}pt {FontColor} " + + (Bold ? "Bold" : "") + (Italic ? "Italic" : "") + (Strikethrough ? "Strikethrough" : "") + + (Underline == XLFontUnderlineValues.None ? "" : Underline.ToString()) + + $"{FontFamilyNumbering} {FontCharSet}"; + } + + public static bool operator ==(XLFontKey left, XLFontKey right) => left.Equals(right); + + public static bool operator !=(XLFontKey left, XLFontKey right) => !(left.Equals(right)); + } +} diff --git a/ClosedXML/Excel/Style/XLFontValue.cs b/ClosedXML/Excel/Style/XLFontValue.cs new file mode 100644 index 0000000..37b4d74 --- /dev/null +++ b/ClosedXML/Excel/Style/XLFontValue.cs @@ -0,0 +1,73 @@ +using ClosedXML.Excel.Caching; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal sealed class XLFontValue + { + private static readonly XLFontRepository Repository = new XLFontRepository(key => new XLFontValue(key)); + + public static XLFontValue FromKey(ref XLFontKey key) + { + return Repository.GetOrCreate(ref key); + } + + private static readonly XLFontKey DefaultKey = new XLFontKey + { + Bold = false, + Italic = false, + Underline = XLFontUnderlineValues.None, + Strikethrough = false, + VerticalAlignment = XLFontVerticalTextAlignmentValues.Baseline, + FontSize = 11, + FontColor = XLColor.FromArgb(0, 0, 0).Key, + FontName = "Calibri", + FontFamilyNumbering = XLFontFamilyNumberingValues.Swiss, + FontCharSet = XLFontCharSet.Default + }; + internal static readonly XLFontValue Default = FromKey(ref DefaultKey); + + public XLFontKey Key { get; private set; } + + public bool Bold { get { return Key.Bold; } } + + public bool Italic { get { return Key.Italic; } } + + public XLFontUnderlineValues Underline { get { return Key.Underline; } } + + public bool Strikethrough { get { return Key.Strikethrough; } } + + public XLFontVerticalTextAlignmentValues VerticalAlignment { get { return Key.VerticalAlignment; } } + + public bool Shadow { get { return Key.Shadow; } } + + public double FontSize { get { return Key.FontSize; } } + + public XLColor FontColor { get; private set; } + + public string FontName { get { return Key.FontName; } } + + public XLFontFamilyNumberingValues FontFamilyNumbering { get { return Key.FontFamilyNumbering; } } + + public XLFontCharSet FontCharSet { get { return Key.FontCharSet; } } + + private XLFontValue(XLFontKey key) + { + Key = key; + var fontColorKey = Key.FontColor; + FontColor = XLColor.FromKey(ref fontColorKey); + } + + public override bool Equals(object obj) + { + var cached = obj as XLFontValue; + return cached != null && + Key.Equals(cached.Key); + } + + public override int GetHashCode() + { + return -280332839 + EqualityComparer.Default.GetHashCode(Key); + } + } +} diff --git a/ClosedXML/Excel/Style/XLNumberFormat.cs b/ClosedXML/Excel/Style/XLNumberFormat.cs new file mode 100644 index 0000000..54ffb77 --- /dev/null +++ b/ClosedXML/Excel/Style/XLNumberFormat.cs @@ -0,0 +1,152 @@ +using System; + +namespace ClosedXML.Excel +{ + internal class XLNumberFormat : IXLNumberFormat + { + #region Static members + + internal static XLNumberFormatKey GenerateKey(IXLNumberFormat defaultNumberFormat) + { + if (defaultNumberFormat == null) + return XLNumberFormatValue.Default.Key; + + if (defaultNumberFormat is XLNumberFormat) + return (defaultNumberFormat as XLNumberFormat).Key; + + return new XLNumberFormatKey + { + NumberFormatId = defaultNumberFormat.NumberFormatId, + Format = defaultNumberFormat.Format + }; + } + + #endregion Static members + + #region Properties + + private readonly XLStyle _style; + + private XLNumberFormatValue _value; + + internal XLNumberFormatKey Key + { + get { return _value.Key; } + private set { _value = XLNumberFormatValue.FromKey(ref value); } + } + + #endregion Properties + + #region Constructors + + /// + /// Create an instance of XLNumberFormat initializing it with the specified value. + /// + /// Style to attach the new instance to. + /// Style value to use. + public XLNumberFormat(XLStyle style, XLNumberFormatValue value) + { + _style = style ?? XLStyle.CreateEmptyStyle(); + _value = value; + } + + public XLNumberFormat(XLStyle style, XLNumberFormatKey key) : this(style, XLNumberFormatValue.FromKey(ref key)) + { + } + + public XLNumberFormat(XLStyle style = null, IXLNumberFormat d = null) : this(style, GenerateKey(d)) + { + } + + #endregion Constructors + + #region IXLNumberFormat Members + + public Int32 NumberFormatId + { + get { return Key.NumberFormatId; } + set + { + Modify(k => + { + k.Format = XLNumberFormatValue.Default.Format; + k.NumberFormatId = value; + return k; + }); + } + } + + public String Format + { + get { return Key.Format; } + set + { + Modify(k => + { + k.Format = value; + if (string.IsNullOrWhiteSpace(k.Format)) + k.NumberFormatId = XLNumberFormatValue.Default.NumberFormatId; + else + k.NumberFormatId = -1; + return k; + }); + } + } + + public IXLStyle SetNumberFormatId(Int32 value) + { + NumberFormatId = value; + return _style; + } + + public IXLStyle SetFormat(String value) + { + Format = value; + return _style; + } + + #endregion IXLNumberFormat Members + + private void Modify(Func modification) + { + Key = modification(Key); + + _style.Modify(styleKey => + { + var numberFormat = styleKey.NumberFormat; + styleKey.NumberFormat = modification(numberFormat); + return styleKey; + }); + } + + #region Overridden + + public override string ToString() + { + return NumberFormatId + "-" + Format; + } + + public override bool Equals(object obj) + { + return Equals(obj as IXLNumberFormatBase); + } + + public bool Equals(IXLNumberFormatBase other) + { + var otherN = other as XLNumberFormat; + if (otherN == null) + return false; + + return Key == otherN.Key; + } + + public override int GetHashCode() + { + var hashCode = 416600561; + hashCode = hashCode * -1521134295 + Key.GetHashCode(); + return hashCode; + } + + #endregion Overridden + } +} diff --git a/ClosedXML/Excel/Style/XLNumberFormatKey.cs b/ClosedXML/Excel/Style/XLNumberFormatKey.cs new file mode 100644 index 0000000..7e979a9 --- /dev/null +++ b/ClosedXML/Excel/Style/XLNumberFormatKey.cs @@ -0,0 +1,42 @@ +using System; + +namespace ClosedXML.Excel +{ + internal struct XLNumberFormatKey : IEquatable + { + public int NumberFormatId { get; set; } + + public string Format { get; set; } + + public override int GetHashCode() + { + var hashCode = -759193072; + hashCode = hashCode * -1521134295 + NumberFormatId; + hashCode = hashCode * -1521134295 + (Format == null ? 0 : Format.GetHashCode()); + return hashCode; + } + + public bool Equals(XLNumberFormatKey other) + { + return + NumberFormatId == other.NumberFormatId + && string.Equals(Format, other.Format); + } + + public override bool Equals(object obj) + { + if (obj is XLNumberFormatKey) + return Equals((XLNumberFormatKey)obj); + return base.Equals(obj); + } + + public override string ToString() + { + return $"{Format}/{NumberFormatId}"; + } + + public static bool operator ==(XLNumberFormatKey left, XLNumberFormatKey right) => left.Equals(right); + + public static bool operator !=(XLNumberFormatKey left, XLNumberFormatKey right) => !(left.Equals(right)); + } +} diff --git a/ClosedXML/Excel/Style/XLNumberFormatValue.cs b/ClosedXML/Excel/Style/XLNumberFormatValue.cs new file mode 100644 index 0000000..360ae8c --- /dev/null +++ b/ClosedXML/Excel/Style/XLNumberFormatValue.cs @@ -0,0 +1,45 @@ +using ClosedXML.Excel.Caching; + +namespace ClosedXML.Excel +{ + internal sealed class XLNumberFormatValue + { + private static readonly XLNumberFormatRepository Repository = new XLNumberFormatRepository(key => new XLNumberFormatValue(key)); + + public static XLNumberFormatValue FromKey(ref XLNumberFormatKey key) + { + return Repository.GetOrCreate(ref key); + } + + private static readonly XLNumberFormatKey DefaultKey = new XLNumberFormatKey + { + NumberFormatId = 0, + Format = string.Empty + }; + + internal static readonly XLNumberFormatValue Default = FromKey(ref DefaultKey); + + public XLNumberFormatKey Key { get; private set; } + + public int NumberFormatId { get { return Key.NumberFormatId; } } + + public string Format { get { return Key.Format; } } + + private XLNumberFormatValue(XLNumberFormatKey key) + { + Key = key; + } + + public override bool Equals(object obj) + { + var cached = obj as XLNumberFormatValue; + return cached != null && + Key.Equals(cached.Key); + } + + public override int GetHashCode() + { + return 1507230172 + Key.GetHashCode(); + } + } +} diff --git a/ClosedXML/Excel/Style/XLPredefinedFormat.cs b/ClosedXML/Excel/Style/XLPredefinedFormat.cs new file mode 100644 index 0000000..e256a30 --- /dev/null +++ b/ClosedXML/Excel/Style/XLPredefinedFormat.cs @@ -0,0 +1,219 @@ +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + /// + /// Reference point of date/number formats available. + /// See more at: https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.numberingformat.aspx + /// + public static class XLPredefinedFormat + { + /// + /// General + /// + public static int General { get { return 0; } } + + public enum Number + { + /// + /// General + /// + General = 0, + + /// + /// 0 + /// + Integer = 1, + + /// + /// 0.00 + /// + Precision2 = 2, + + /// + /// #,##0 + /// + IntegerWithSeparator = 3, + + /// + /// #,##0.00 + /// + Precision2WithSeparator = 4, + + /// + /// 0% + /// + PercentInteger = 9, + + /// + /// 0.00% + /// + PercentPrecision2 = 10, + + /// + /// 0.00E+00 + /// + ScientificPrecision2 = 11, + + /// + /// # ?/? + /// + FractionPrecision1 = 12, + + /// + /// # ??/?? + /// + FractionPrecision2 = 13, + + /// + /// #,##0 ,(#,##0) + /// + IntegerWithSeparatorAndParens = 37, + + /// + /// #,##0 ,[Red](#,##0) + /// + IntegerWithSeparatorAndParensRed = 38, + + /// + /// #,##0.00,(#,##0.00) + /// + Precision2WithSeparatorAndParens = 39, + + /// + /// #,##0.00,[Red](#,##0.00) + /// + Precision2WithSeparatorAndParensRed = 40, + + /// + /// ##0.0E+0 + /// + ScientificUpToHundredsAndPrecision1 = 48, + + /// + /// @ + /// + Text = 49 + } + + public enum DateTime + { + /// + /// General + /// + General = 0, + + /// + /// d/m/yyyy + /// + DayMonthYear4WithSlashes = 14, + + /// + /// d-mmm-yy + /// + DayMonthAbbrYear2WithDashes = 15, + + /// + /// d-mmm + /// + DayMonthAbbrWithDash = 16, + + /// + /// mmm-yy + /// + MonthAbbrYear2WithDash = 17, + + /// + /// h:mm tt + /// + Hour12MinutesAmPm = 18, + + /// + /// h:mm:ss tt + /// + Hour12MinutesSecondsAmPm = 19, + + /// + /// H:mm + /// + Hour24Minutes = 20, + + /// + /// H:mm:ss + /// + Hour24MinutesSeconds = 21, + + /// + /// m/d/yyyy H:mm + /// + MonthDayYear4WithDashesHour24Minutes = 22, + + /// + /// mm:ss + /// + MinutesSeconds = 45, + + /// + /// [h]:mm:ss + /// + Hour12MinutesSeconds = 46, + + /// + /// mmss.0 + /// + MinutesSecondsMillis1 = 47, + + /// + /// @ + /// + Text = 49 + } + + private static IDictionary _formatCodes; + + internal static IDictionary FormatCodes + { + get + { + if (_formatCodes == null) + { + var fCodes = new Dictionary + { + {0, string.Empty}, + {1, "0"}, + {2, "0.00"}, + {3, "#,##0"}, + {4, "#,##0.00"}, + {7, "$#,##0.00_);($#,##0.00)"}, + {9, "0%"}, + {10, "0.00%"}, + {11, "0.00E+00"}, + {12, "# ?/?"}, + {13, "# ??/??"}, + {14, "M/d/yyyy"}, + {15, "d-MMM-yy"}, + {16, "d-MMM"}, + {17, "MMM-yy"}, + {18, "h:mm tt"}, + {19, "h:mm:ss tt"}, + {20, "H:mm"}, + {21, "H:mm:ss"}, + {22, "M/d/yyyy H:mm"}, + {37, "#,##0 ;(#,##0)"}, + {38, "#,##0 ;[Red](#,##0)"}, + {39, "#,##0.00;(#,##0.00)"}, + {40, "#,##0.00;[Red](#,##0.00)"}, + {45, "mm:ss"}, + {46, "[h]:mm:ss"}, + {47, "mmss.0"}, + {48, "##0.0E+0"}, + {49, "@"} + }; + _formatCodes = fCodes; + } + + return _formatCodes; + } + } + } +} diff --git a/ClosedXML/Excel/Style/XLProtection.cs b/ClosedXML/Excel/Style/XLProtection.cs new file mode 100644 index 0000000..81045c4 --- /dev/null +++ b/ClosedXML/Excel/Style/XLProtection.cs @@ -0,0 +1,153 @@ +using System; + +namespace ClosedXML.Excel +{ + internal class XLProtection : IXLProtection + { + #region Static members + + internal static XLProtectionKey GenerateKey(IXLProtection defaultProtection) + { + if (defaultProtection == null) + return XLProtectionValue.Default.Key; + if (defaultProtection is XLProtection) + return (defaultProtection as XLProtection).Key; + + return new XLProtectionKey + { + Locked = defaultProtection.Locked, + Hidden = defaultProtection.Hidden + }; + } + + #endregion Static members + + #region Properties + + private readonly XLStyle _style; + + private XLProtectionValue _value; + + internal XLProtectionKey Key + { + get { return _value.Key; } + private set { _value = XLProtectionValue.FromKey(ref value); } + } + + #endregion Properties + + #region Constructors + + /// + /// Create an instance of XLProtection initializing it with the specified value. + /// + /// Style to attach the new instance to. + /// Style value to use. + public XLProtection(XLStyle style, XLProtectionValue value) + { + _style = style ?? XLStyle.CreateEmptyStyle(); + _value = value; + } + + public XLProtection(XLStyle style, XLProtectionKey key) : this(style, XLProtectionValue.FromKey(ref key)) + { + } + + public XLProtection(XLStyle style = null, IXLProtection d = null) : this(style, GenerateKey(d)) + { + } + + #endregion Constructors + + #region IXLProtection Members + + public Boolean Locked + { + get { return Key.Locked; } + set + { + Modify(k => { k.Locked = value; return k; }); + } + } + + public Boolean Hidden + { + get { return Key.Hidden; } + set + { + Modify(k => { k.Hidden = value; return k; }); + } + } + + public IXLStyle SetLocked() + { + Locked = true; + return _style; + } + + public IXLStyle SetLocked(Boolean value) + { + Locked = value; + return _style; + } + + public IXLStyle SetHidden() + { + Hidden = true; + return _style; + } + + public IXLStyle SetHidden(Boolean value) + { + Hidden = value; + return _style; + } + + #endregion IXLProtection Members + + private void Modify(Func modification) + { + Key = modification(Key); + + _style.Modify(styleKey => + { + var protection = styleKey.Protection; + styleKey.Protection = modification(protection); + return styleKey; + }); + } + + #region Overridden + + public override bool Equals(object obj) + { + return Equals((IXLProtection)obj); + } + + public bool Equals(IXLProtection other) + { + var otherP = other as XLProtection; + if (otherP == null) + return false; + + return Key == otherP.Key; + } + + public override string ToString() + { + if (Locked) + return Hidden ? "Locked-Hidden" : "Locked"; + + return Hidden ? "Hidden" : "None"; + } + + public override int GetHashCode() + { + var hashCode = 416600561; + hashCode = hashCode * -1521134295 + Key.GetHashCode(); + return hashCode; + } + + #endregion Overridden + } +} diff --git a/ClosedXML/Excel/Style/XLProtectionKey.cs b/ClosedXML/Excel/Style/XLProtectionKey.cs new file mode 100644 index 0000000..ba4f013 --- /dev/null +++ b/ClosedXML/Excel/Style/XLProtectionKey.cs @@ -0,0 +1,42 @@ +using System; + +namespace ClosedXML.Excel +{ + internal struct XLProtectionKey : IEquatable + { + public bool Locked { get; set; } + + public bool Hidden { get; set; } + + public override int GetHashCode() + { + var hashCode = -1357408252; + hashCode = hashCode * -1521134295 + Locked.GetHashCode(); + hashCode = hashCode * -1521134295 + Hidden.GetHashCode(); + return hashCode; + } + + public bool Equals(XLProtectionKey other) + { + return + Locked == other.Locked + && Hidden == other.Hidden; + } + + public override bool Equals(object obj) + { + if (obj is XLProtectionKey) + return Equals((XLProtectionKey)obj); + return base.Equals(obj); + } + + public override string ToString() + { + return (Locked ? "Locked" : "") + (Hidden ? "Hidden" : ""); + } + + public static bool operator ==(XLProtectionKey left, XLProtectionKey right) => left.Equals(right); + + public static bool operator !=(XLProtectionKey left, XLProtectionKey right) => !(left.Equals(right)); + } +} diff --git a/ClosedXML/Excel/Style/XLProtectionValue.cs b/ClosedXML/Excel/Style/XLProtectionValue.cs new file mode 100644 index 0000000..fba99e2 --- /dev/null +++ b/ClosedXML/Excel/Style/XLProtectionValue.cs @@ -0,0 +1,45 @@ +using ClosedXML.Excel.Caching; + +namespace ClosedXML.Excel +{ + internal sealed class XLProtectionValue + { + private static readonly XLProtectionRepository Repository = new XLProtectionRepository(key => new XLProtectionValue(key)); + + public static XLProtectionValue FromKey(ref XLProtectionKey key) + { + return Repository.GetOrCreate(ref key); + } + + private static readonly XLProtectionKey DefaultKey = new XLProtectionKey + { + Locked = true, + Hidden = false + }; + + internal static readonly XLProtectionValue Default = FromKey(ref DefaultKey); + + public XLProtectionKey Key { get; private set; } + + public bool Locked { get { return Key.Locked; } } + + public bool Hidden { get { return Key.Hidden; } } + + private XLProtectionValue(XLProtectionKey key) + { + Key = key; + } + + public override bool Equals(object obj) + { + var cached = obj as XLProtectionValue; + return cached != null && + Key.Equals(cached.Key); + } + + public override int GetHashCode() + { + return 909014992 + Key.GetHashCode(); + } + } +} diff --git a/ClosedXML/Excel/Style/XLStyle.cs b/ClosedXML/Excel/Style/XLStyle.cs new file mode 100644 index 0000000..a09864d --- /dev/null +++ b/ClosedXML/Excel/Style/XLStyle.cs @@ -0,0 +1,214 @@ +using System; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLStyle : IXLStyle + { + #region Static members + + public static XLStyle Default { get { return new XLStyle(XLStyleValue.Default); } } + + internal static XLStyleKey GenerateKey(IXLStyle initialStyle) + { + if (initialStyle == null) + return Default.Key; + if (initialStyle is XLStyle) + return (initialStyle as XLStyle).Key; + + return new XLStyleKey + { + Font = XLFont.GenerateKey(initialStyle.Font), + Alignment = XLAlignment.GenerateKey(initialStyle.Alignment), + Border = XLBorder.GenerateKey(initialStyle.Border), + Fill = XLFill.GenerateKey(initialStyle.Fill), + NumberFormat = XLNumberFormat.GenerateKey(initialStyle.NumberFormat), + Protection = XLProtection.GenerateKey(initialStyle.Protection) + }; + } + + internal static XLStyle CreateEmptyStyle() + { + return new XLStyle(new XLStylizedEmpty(null)); + } + + #endregion Static members + + #region properties + + private readonly IXLStylized _container; + + internal XLStyleValue Value { get; private set; } + + internal XLStyleKey Key + { + get { return Value.Key; } + private set + { + Value = XLStyleValue.FromKey(ref value); + } + } + + #endregion properties + + #region constructors + + public XLStyle(IXLStylized container, IXLStyle initialStyle = null, Boolean useDefaultModify = true) : this(container, GenerateKey(initialStyle)) + { + } + + public XLStyle(IXLStylized container, XLStyleKey key) : this(container, XLStyleValue.FromKey(ref key)) + { + } + + internal XLStyle(IXLStylized container, XLStyleValue value) + { + _container = container ?? new XLStylizedEmpty(XLStyle.Default); + Value = value; + } + + /// + /// To initialize XLStyle.Default only + /// + private XLStyle(XLStyleValue value) + { + _container = null; + Value = value; + } + + #endregion constructors + + internal void Modify(Func modification) + { + Key = modification(Key); + + if (_container != null) + { + _container.ModifyStyle(modification); + } + } + + #region IXLStyle members + + public IXLFont Font + { + get { return new XLFont(this, Value.Font); } + set + { + Modify(k => { k.Font = XLFont.GenerateKey(value); return k; }); + } + } + + public IXLAlignment Alignment + { + get { return new XLAlignment(this, Value.Alignment); } + set + { + Modify(k => { k.Alignment = XLAlignment.GenerateKey(value); return k; }); + } + } + + public IXLBorder Border + { + get { return new XLBorder(_container, this, Value.Border); } + set + { + Modify(k => { k.Border = XLBorder.GenerateKey(value); return k; }); + } + } + + public IXLFill Fill + { + get { return new XLFill(this, Value.Fill); } + set + { + Modify(k => { k.Fill = XLFill.GenerateKey(value); return k; }); + } + } + + public Boolean IncludeQuotePrefix + { + get { return Value.IncludeQuotePrefix; } + set + { + Modify(k => { k.IncludeQuotePrefix = value; return k; }); + } + } + + public IXLStyle SetIncludeQuotePrefix(Boolean includeQuotePrefix = true) + { + IncludeQuotePrefix = includeQuotePrefix; + return this; + } + + public IXLNumberFormat NumberFormat + { + get { return new XLNumberFormat(this, Value.NumberFormat); } + set + { + Modify(k => { k.NumberFormat = XLNumberFormat.GenerateKey(value); return k; }); + } + } + + public IXLProtection Protection + { + get { return new XLProtection(this, Value.Protection); } + set + { + Modify(k => { k.Protection = XLProtection.GenerateKey(value); return k; }); + } + } + + public IXLNumberFormat DateFormat + { + get { return NumberFormat; } + } + + #endregion IXLStyle members + + #region Overridden + + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append("Font:"); + sb.Append(Font); + sb.Append(" Fill:"); + sb.Append(Fill); + sb.Append(" Border:"); + sb.Append(Border); + sb.Append(" NumberFormat: "); + sb.Append(NumberFormat); + sb.Append(" Alignment: "); + sb.Append(Alignment); + sb.Append(" Protection: "); + sb.Append(Protection); + return sb.ToString(); + } + + public bool Equals(IXLStyle other) + { + var otherS = other as XLStyle; + + if (otherS == null) + return false; + + return Key == otherS.Key && + _container == otherS._container; + } + + public override bool Equals(object obj) + { + return Equals(obj as XLStyle); + } + + public override int GetHashCode() + { + var hashCode = 416600561; + hashCode = hashCode * -1521134295 + Key.GetHashCode(); + return hashCode; + } + + #endregion Overridden + } +} diff --git a/ClosedXML/Excel/Style/XLStyleKey.cs b/ClosedXML/Excel/Style/XLStyleKey.cs new file mode 100644 index 0000000..93fc2b7 --- /dev/null +++ b/ClosedXML/Excel/Style/XLStyleKey.cs @@ -0,0 +1,88 @@ +using System; + +namespace ClosedXML.Excel +{ + internal struct XLStyleKey : IEquatable + { + public XLAlignmentKey Alignment { get; set; } + + public XLBorderKey Border { get; set; } + + public XLFillKey Fill { get; set; } + + public XLFontKey Font { get; set; } + + public Boolean IncludeQuotePrefix { get; set; } + + public XLNumberFormatKey NumberFormat { get; set; } + + public XLProtectionKey Protection { get; set; } + + public override int GetHashCode() + { + var hashCode = -476701294; + hashCode = hashCode * -1521134295 + Alignment.GetHashCode(); + hashCode = hashCode * -1521134295 + Border.GetHashCode(); + hashCode = hashCode * -1521134295 + Fill.GetHashCode(); + hashCode = hashCode * -1521134295 + Font.GetHashCode(); + hashCode = hashCode * -1521134295 + IncludeQuotePrefix.GetHashCode(); + hashCode = hashCode * -1521134295 + NumberFormat.GetHashCode(); + hashCode = hashCode * -1521134295 + Protection.GetHashCode(); + return hashCode; + } + + public bool Equals(XLStyleKey other) + { + return Alignment == other.Alignment && + Border == other.Border && + Fill == other.Fill && + Font == other.Font && + IncludeQuotePrefix == other.IncludeQuotePrefix && + NumberFormat == other.NumberFormat && + Protection == other.Protection; + } + + public override string ToString() + { + return + this == XLStyle.Default.Key ? "Default" : + string.Format("Alignment: {0} Border: {1} Fill: {2} Font: {3} IncludeQuotePrefix: {4} NumberFormat: {5} Protection: {6}", + Alignment == XLStyle.Default.Key.Alignment ? "Default" : Alignment.ToString(), + Border == XLStyle.Default.Key.Border ? "Default" : Border.ToString(), + Fill == XLStyle.Default.Key.Fill ? "Default" : Fill.ToString(), + Font == XLStyle.Default.Key.Font ? "Default" : Font.ToString(), + IncludeQuotePrefix == XLStyle.Default.Key.IncludeQuotePrefix ? "Default" : IncludeQuotePrefix.ToString(), + NumberFormat == XLStyle.Default.Key.NumberFormat ? "Default" : NumberFormat.ToString(), + Protection == XLStyle.Default.Key.Protection ? "Default" : Protection.ToString()); + } + + public override bool Equals(object obj) + { + if (obj is XLStyleKey) + return Equals((XLStyleKey)obj); + return base.Equals(obj); + } + + public static bool operator ==(XLStyleKey left, XLStyleKey right) => left.Equals(right); + + public static bool operator !=(XLStyleKey left, XLStyleKey right) => !(left.Equals(right)); + + public void Deconstruct( + out XLAlignmentKey alignment, + out XLBorderKey border, + out XLFillKey fill, + out XLFontKey font, + out Boolean includeQuotePrefix, + out XLNumberFormatKey numberFormat, + out XLProtectionKey protection) + { + alignment = Alignment; + border = Border; + fill = Fill; + font = Font; + includeQuotePrefix = IncludeQuotePrefix; + numberFormat = NumberFormat; + protection = Protection; + } + } +} diff --git a/ClosedXML/Excel/Style/XLStyleValue.cs b/ClosedXML/Excel/Style/XLStyleValue.cs new file mode 100644 index 0000000..a196519 --- /dev/null +++ b/ClosedXML/Excel/Style/XLStyleValue.cs @@ -0,0 +1,97 @@ +using ClosedXML.Excel.Caching; +using System; + +namespace ClosedXML.Excel +{ + internal class XLStyleValue + { + private static readonly XLStyleRepository Repository = new XLStyleRepository(key => new XLStyleValue(key)); + + public static XLStyleValue FromKey(ref XLStyleKey key) + { + return Repository.GetOrCreate(ref key); + } + + private static readonly XLStyleKey DefaultKey = new XLStyleKey + { + Alignment = XLAlignmentValue.Default.Key, + Border = XLBorderValue.Default.Key, + Fill = XLFillValue.Default.Key, + Font = XLFontValue.Default.Key, + IncludeQuotePrefix = false, + NumberFormat = XLNumberFormatValue.Default.Key, + Protection = XLProtectionValue.Default.Key + }; + + internal static readonly XLStyleValue Default = FromKey(ref DefaultKey); + + public XLStyleKey Key { get; private set; } + + public XLAlignmentValue Alignment { get; private set; } + + public XLBorderValue Border { get; private set; } + + public XLFillValue Fill { get; private set; } + + public XLFontValue Font { get; private set; } + + public Boolean IncludeQuotePrefix { get; private set; } + + public XLNumberFormatValue NumberFormat { get; private set; } + + public XLProtectionValue Protection { get; private set; } + + internal XLStyleValue(XLStyleKey key) + { + Key = key; + var (alignment, border, fill, font, _, numberFormat, protection) = Key; + Alignment = XLAlignmentValue.FromKey(ref alignment); + Border = XLBorderValue.FromKey(ref border); + Fill = XLFillValue.FromKey(ref fill); + Font = XLFontValue.FromKey(ref font); + IncludeQuotePrefix = key.IncludeQuotePrefix; + NumberFormat = XLNumberFormatValue.FromKey(ref numberFormat); + Protection = XLProtectionValue.FromKey(ref protection); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(this, obj)) + return true; + + var cached = obj as XLStyleValue; + return cached != null && + Key.Equals(cached.Key); + } + + public override int GetHashCode() + { + if (_hashCode.HasValue) + return _hashCode.Value; + + _hashCode = -280332839 + Key.GetHashCode(); + return _hashCode.Value; + } + + public static bool operator ==(XLStyleValue left, XLStyleValue right) + { + if (ReferenceEquals(left, right)) + return true; + if (ReferenceEquals(left, null) && ReferenceEquals(right, null)) + return true; + if (ReferenceEquals(left, null) || ReferenceEquals(right, null)) + return false; + if (left._hashCode.HasValue && right._hashCode.HasValue && + left._hashCode != right._hashCode) + return false; + return left.Key.Equals(right.Key); + } + + public static bool operator !=(XLStyleValue left, XLStyleValue right) + { + return !(left == right); + } + + private int? _hashCode; + } +} diff --git a/ClosedXML/Excel/Style/XLStylizedBase.cs b/ClosedXML/Excel/Style/XLStylizedBase.cs new file mode 100644 index 0000000..325dd58 --- /dev/null +++ b/ClosedXML/Excel/Style/XLStylizedBase.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; + +namespace ClosedXML.Excel +{ + /// + /// Base class for any workbook element that has or may have a style. + /// + internal abstract class XLStylizedBase : IXLStylized + { + #region Properties + + /// + /// Read-only style property. + /// + internal XLStyleValue StyleValue { get; private protected set; } + XLStyleValue IXLStylized.StyleValue + { + get { return StyleValue; } + } + + /// + /// Editable style of the workbook element. Modification of this property DOES affect styles of child objects as well - they will + /// be changed accordingly. Accessing this property causes a new instance generated so use this property + /// with caution. If you need only _read_ the style consider using property instead. + /// + public IXLStyle Style + { + get { return InnerStyle; } + set { SetStyle(value, true); } + } + + /// + /// Editable style of the workbook element. Modification of this property DOES NOT affect styles of child objects. + /// Accessing this property causes a new instance generated so use this property with caution. If you need + /// only _read_ the style consider using property instead. + /// + public IXLStyle InnerStyle + { + get { return new XLStyle(this, StyleValue.Key); } + set { SetStyle(value, false); } + } + + /// + /// Get a collection of stylized entities which current entity's style changes should be propagated to. + /// + protected abstract IEnumerable Children { get; } + + public abstract IXLRanges RangesUsed { get; } + + public abstract IEnumerable Styles { get; } + + #endregion Properties + + protected XLStylizedBase(XLStyleValue styleValue = null) + { + StyleValue = styleValue ?? XLWorkbook.DefaultStyleValue; + } + + #region Private methods + + private void SetStyle(IXLStyle style, bool propagate = false) + { + if (style is XLStyle xlStyle) + SetStyle(xlStyle.Value, propagate); + else + { + var styleKey = XLStyle.GenerateKey(style); + SetStyle(XLStyleValue.FromKey(ref styleKey), propagate); + } + } + + /// + /// Apply specified style to the container. + /// + /// Style to apply. + /// Whether or not propagate the style to inner ranges. + private void SetStyle(XLStyleValue value, bool propagate = false) + { + StyleValue = value; + if (propagate) + { + Children.ForEach(child => child.SetStyle(StyleValue, true)); + } + } + + private static ReferenceEqualityComparer _comparer = new ReferenceEqualityComparer(); + + void IXLStylized.ModifyStyle(Func modification) + { + var children = GetChildrenRecursively(this) + .GroupBy(child => child.StyleValue, _comparer); + + foreach (var group in children) + { + var styleKey = modification(group.Key.Key); + var styleValue = XLStyleValue.FromKey(ref styleKey); + foreach (var child in group) + { + child.StyleValue = styleValue; + } + } + } + + private IEnumerable GetChildrenRecursively(XLStylizedBase parent) + { + return new List { parent } + .Union(parent.Children.Where(child => child != parent).SelectMany(child => GetChildrenRecursively(child))); + } + + #endregion Private methods + + #region Nested classes + + public sealed class ReferenceEqualityComparer : IEqualityComparer where T : class + { + public bool Equals(T x, T y) => ReferenceEquals(x, y); + + public int GetHashCode(T obj) => RuntimeHelpers.GetHashCode(obj); + } + + #endregion Nested classes + } +} diff --git a/ClosedXML/Excel/Style/XLStylizedEmpty.cs b/ClosedXML/Excel/Style/XLStylizedEmpty.cs new file mode 100644 index 0000000..9f45588 --- /dev/null +++ b/ClosedXML/Excel/Style/XLStylizedEmpty.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLStylizedEmpty : XLStylizedBase, IXLStylized + { + public XLStylizedEmpty(IXLStyle defaultStyle) + : base((defaultStyle as XLStyle)?.Value) + { + } + + public override IEnumerable Styles + { + get + { + yield return Style; + } + } + + public override IXLRanges RangesUsed + { + get { return new XLRanges(); } + } + + protected override IEnumerable Children + { + get { yield break; } + } + } +} diff --git a/ClosedXML/Excel/Tables/IXLTable.cs b/ClosedXML/Excel/Tables/IXLTable.cs new file mode 100644 index 0000000..e6c2912 --- /dev/null +++ b/ClosedXML/Excel/Tables/IXLTable.cs @@ -0,0 +1,220 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; + +namespace ClosedXML.Excel +{ + public interface IXLTable : IXLRange + { + IXLAutoFilter AutoFilter { get; } + IXLTableRange DataRange { get; } + Boolean EmphasizeFirstColumn { get; set; } + Boolean EmphasizeLastColumn { get; set; } + IEnumerable Fields { get; } + string Name { get; set; } + Boolean ShowAutoFilter { get; set; } + Boolean ShowColumnStripes { get; set; } + Boolean ShowHeaderRow { get; set; } + Boolean ShowRowStripes { get; set; } + Boolean ShowTotalsRow { get; set; } + XLTableTheme Theme { get; set; } + + /// + /// Clears the contents of this table. + /// + /// Specify what you want to clear. + new IXLTable Clear(XLClearOptions clearOptions = XLClearOptions.All); + + IXLTableField Field(string fieldName); + + IXLTableField Field(int fieldIndex); + + IXLRangeRow HeadersRow(); + + /// + /// Appends the IEnumerable data elements and returns the range of the new rows. + /// + /// The IEnumerable data. + /// if set to true propagate extra columns' values and formulas. + /// + /// The range of the new rows. + /// + IXLRange AppendData(IEnumerable data, Boolean propagateExtraColumns = false); + + /// + /// Appends the IEnumerable data elements and returns the range of the new rows. + /// + /// The IEnumerable data. + /// if set to true the data will be transposed before inserting. + /// if set to true propagate extra columns' values and formulas. + /// + /// The range of the new rows. + /// + IXLRange AppendData(IEnumerable data, Boolean transpose, Boolean propagateExtraColumns = false); + + /// + /// Appends the data of a data table and returns the range of the new rows. + /// + /// The data table. + /// if set to true propagate extra columns' values and formulas. + /// + /// The range of the new rows. + /// + IXLRange AppendData(DataTable dataTable, Boolean propagateExtraColumns = false); + + /// + /// Appends the IEnumerable data elements and returns the range of the new rows. + /// + /// + /// The table data. + /// if set to true propagate extra columns' values and formulas. + /// + /// The range of the new rows. + /// + IXLRange AppendData(IEnumerable data, Boolean propagateExtraColumns = false); + + /// + /// Replaces the IEnumerable data elements and returns the table's data range. + /// + /// The IEnumerable data. + /// if set to true propagate extra columns' values and formulas. + /// + /// The table's data range. + /// + IXLRange ReplaceData(IEnumerable data, Boolean propagateExtraColumns = false); + + /// + /// Replaces the IEnumerable data elements and returns the table's data range. + /// + /// The IEnumerable data. + /// if set to true the data will be transposed before inserting. + /// if set to true propagate extra columns' values and formulas. + /// + /// The table's data range. + /// + IXLRange ReplaceData(IEnumerable data, Boolean transpose, Boolean propagateExtraColumns = false); + + /// + /// Replaces the data from the records of a data table and returns the table's data range. + /// + /// The data table. + /// if set to true propagate extra columns' values and formulas. + /// + /// The table's data range. + /// + IXLRange ReplaceData(DataTable dataTable, Boolean propagateExtraColumns = false); + + /// + /// Replaces the IEnumerable data elements as a table and the table's data range. + /// + /// + /// The table data. + /// if set to true propagate extra columns' values and formulas. + /// + /// The table's data range. + /// + IXLRange ReplaceData(IEnumerable data, Boolean propagateExtraColumns = false); + + /// + /// Resizes the table to the specified range address. + /// + /// The new table range. + /// + IXLTable Resize(IXLRange range); + + /// + /// Resizes the table to the specified range address. + /// + /// The range boundaries. + /// + IXLTable Resize(IXLRangeAddress rangeAddress); + + /// + /// Resizes the table to the specified range address. + /// + /// The range boundaries. + /// + IXLTable Resize(string rangeAddress); + + /// + /// Resizes the table to the specified range. + /// + /// The first cell in the range. + /// The last cell in the range. + /// + IXLTable Resize(IXLCell firstCell, IXLCell lastCell); + + /// + /// Resizes the table to the specified range. + /// + /// The first cell address in the worksheet. + /// The last cell address in the worksheet. + /// + IXLTable Resize(string firstCellAddress, string lastCellAddress); + + /// + /// Resizes the table to the specified range. + /// + /// The first cell address in the worksheet. + /// The last cell address in the worksheet. + /// + IXLTable Resize(IXLAddress firstCellAddress, IXLAddress lastCellAddress); + + /// + /// Resizes the table to the specified range. + /// + /// The first cell's row of the range to return. + /// The first cell's column of the range to return. + /// The last cell's row of the range to return. + /// The last cell's column of the range to return. + /// + IXLTable Resize(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn); + + new IXLAutoFilter SetAutoFilter(); + + IXLTable SetEmphasizeFirstColumn(); + + IXLTable SetEmphasizeFirstColumn(Boolean value); + + IXLTable SetEmphasizeLastColumn(); + + IXLTable SetEmphasizeLastColumn(Boolean value); + + IXLTable SetShowAutoFilter(); + + IXLTable SetShowAutoFilter(Boolean value); + + IXLTable SetShowColumnStripes(); + + IXLTable SetShowColumnStripes(Boolean value); + + IXLTable SetShowHeaderRow(); + + IXLTable SetShowHeaderRow(Boolean value); + + IXLTable SetShowRowStripes(); + + IXLTable SetShowRowStripes(Boolean value); + + IXLTable SetShowTotalsRow(); + + IXLTable SetShowTotalsRow(Boolean value); + + IXLRangeRow TotalsRow(); + + /// + /// Converts the table to an enumerable of dynamic objects + /// + /// + IEnumerable AsDynamicEnumerable(); + + /// + /// Converts the table to a standard .NET System.Data.DataTable + /// + /// + DataTable AsNativeDataTable(); + + IXLTable CopyTo(IXLWorksheet targetSheet); + } +} diff --git a/ClosedXML/Excel/Tables/IXLTableField.cs b/ClosedXML/Excel/Tables/IXLTableField.cs new file mode 100644 index 0000000..c1e9107 --- /dev/null +++ b/ClosedXML/Excel/Tables/IXLTableField.cs @@ -0,0 +1,129 @@ +using System; + +namespace ClosedXML.Excel +{ + public enum XLTotalsRowFunction + { + None, + Sum, + Minimum, + Maximum, + Average, + Count, + CountNumbers, + StandardDeviation, + Variance, + Custom + } + + public interface IXLTableField + { + /// + /// Gets the corresponding column for this table field. + /// Includes the header and footer cells + /// + /// + /// The column. + /// + IXLRangeColumn Column { get; } + + /// + /// Gets the collection of data cells for this field + /// Excludes the header and footer cells + /// + /// + /// The data cells + /// + IXLCells DataCells { get; } + + /// + /// Gets the footer cell for the table field. + /// + /// + /// The footer cell. + /// + IXLCell TotalsCell { get; } + + /// + /// Gets the header cell for the table field. + /// + /// + /// The header cell. + /// + IXLCell HeaderCell { get; } + + /// + /// Gets the index of the column (0-based). + /// + /// + /// The index. + /// + Int32 Index { get; } + + /// + /// Gets or sets the name/header of this table field. + /// The corresponding header cell's value will change if you set this. + /// + /// + /// The name. + /// + String Name { get; set; } + + /// + /// Gets the underlying table for this table field. + /// + IXLTable Table { get; } + + /// + /// Gets or sets the totals row formula in A1 format. + /// + /// + /// The totals row formula a1. + /// + String TotalsRowFormulaA1 { get; set; } + + /// + /// Gets or sets the totals row formula in R1C1 format. + /// + /// + /// The totals row formula r1 c1. + /// + String TotalsRowFormulaR1C1 { get; set; } + + /// + /// Gets or sets the totals row function. + /// + /// + /// The totals row function. + /// + XLTotalsRowFunction TotalsRowFunction { get; set; } + + /// + /// Gets or sets the totals row label. + /// + /// + /// The totals row label. + /// + String TotalsRowLabel { get; set; } + + /// + /// Deletes this table field from the table. + /// + void Delete(); + + /// + /// Determines whether all cells this table field have a consistent data type. + /// + Boolean IsConsistentDataType(); + + /// + /// Determines whether all cells this table field have a consistent formula. + /// + Boolean IsConsistentFormula(); + + /// + /// Determines whether all cells this table field have a consistent style. + /// + Boolean IsConsistentStyle(); + } +} diff --git a/ClosedXML/Excel/Tables/IXLTableRange.cs b/ClosedXML/Excel/Tables/IXLTableRange.cs new file mode 100644 index 0000000..aeac6b8 --- /dev/null +++ b/ClosedXML/Excel/Tables/IXLTableRange.cs @@ -0,0 +1,58 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + public interface IXLTableRange : IXLRange + { + IXLTable Table { get; } + + IXLTableRow FirstRow(Func predicate = null); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLTableRow FirstRowUsed(Boolean includeFormats, Func predicate = null); + + IXLTableRow FirstRowUsed(XLCellsUsedOptions options, Func predicate = null); + + IXLTableRow FirstRowUsed(Func predicate = null); + + new IXLTableRows InsertRowsAbove(int numberOfRows); + + new IXLTableRows InsertRowsBelow(int numberOfRows); + + IXLTableRow LastRow(Func predicate = null); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLTableRow LastRowUsed(Boolean includeFormats, Func predicate = null); + + IXLTableRow LastRowUsed(XLCellsUsedOptions options, Func predicate = null); + + IXLTableRow LastRowUsed(Func predicate = null); + + /// + /// Rows the specified row. + /// + /// 1-based row number relative to the first row of this range. + /// + new IXLTableRow Row(int row); + + IXLTableRows Rows(Func predicate = null); + + /// + /// Returns a subset of the rows + /// + /// The first row to return. 1-based row number relative to the first row of this range. + /// The last row to return. 1-based row number relative to the first row of this range. + /// + new IXLTableRows Rows(int firstRow, int lastRow); + + new IXLTableRows Rows(string rows); + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLTableRows RowsUsed(Boolean includeFormats, Func predicate = null); + + IXLTableRows RowsUsed(XLCellsUsedOptions options, Func predicate = null); + + IXLTableRows RowsUsed(Func predicate = null); + } +} diff --git a/ClosedXML/Excel/Tables/IXLTableRow.cs b/ClosedXML/Excel/Tables/IXLTableRow.cs new file mode 100644 index 0000000..5722624 --- /dev/null +++ b/ClosedXML/Excel/Tables/IXLTableRow.cs @@ -0,0 +1,33 @@ +using System; + +namespace ClosedXML.Excel +{ + public interface IXLTableRow : IXLRangeRow + { + IXLCell Field(Int32 index); + + IXLCell Field(String name); + + new IXLTableRow Sort(); + + new IXLTableRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + new IXLTableRow RowAbove(); + + new IXLTableRow RowAbove(Int32 step); + + new IXLTableRow RowBelow(); + + new IXLTableRow RowBelow(Int32 step); + + /// + /// Clears the contents of this row. + /// + /// Specify what you want to clear. + new IXLTableRow Clear(XLClearOptions clearOptions = XLClearOptions.All); + + new IXLTableRows InsertRowsAbove(int numberOfRows); + + new IXLTableRows InsertRowsBelow(int numberOfRows); + } +} diff --git a/ClosedXML/Excel/Tables/IXLTableRows.cs b/ClosedXML/Excel/Tables/IXLTableRows.cs new file mode 100644 index 0000000..9573684 --- /dev/null +++ b/ClosedXML/Excel/Tables/IXLTableRows.cs @@ -0,0 +1,46 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLTableRows : IEnumerable + { + IXLStyle Style { get; set; } + + /// + /// Adds a table row to this group. + /// + /// The row table to add. + void Add(IXLTableRow tableRow); + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + /// + /// Returns the collection of cells that have a value. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLCells CellsUsed(Boolean includeFormats); + + IXLCells CellsUsed(XLCellsUsedOptions options); + + /// + /// Clears the contents of these rows. + /// + /// Specify what you want to clear. + IXLTableRows Clear(XLClearOptions clearOptions = XLClearOptions.All); + + void Delete(); + + void Select(); + } +} diff --git a/ClosedXML/Excel/Tables/IXLTables.cs b/ClosedXML/Excel/Tables/IXLTables.cs new file mode 100644 index 0000000..a9ec662 --- /dev/null +++ b/ClosedXML/Excel/Tables/IXLTables.cs @@ -0,0 +1,29 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLTables : IEnumerable + { + void Add(IXLTable table); + + /// + /// Clears the contents of these tables. + /// + /// Specify what you want to clear. + IXLTables Clear(XLClearOptions clearOptions = XLClearOptions.All); + + Boolean Contains(String name); + + void Remove(Int32 index); + + void Remove(String name); + + IXLTable Table(Int32 index); + + IXLTable Table(String name); + + Boolean TryGetTable(String tableName, out IXLTable table); + } +} diff --git a/ClosedXML/Excel/Tables/XLTable.cs b/ClosedXML/Excel/Tables/XLTable.cs new file mode 100644 index 0000000..2741ab6 --- /dev/null +++ b/ClosedXML/Excel/Tables/XLTable.cs @@ -0,0 +1,1039 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Dynamic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + [DebuggerDisplay("{Name}")] + internal class XLTable : XLRange, IXLTable + { + #region Private fields + + private string _name; + internal bool _showTotalsRow; + internal HashSet _uniqueNames; + + #endregion Private fields + + #region Constructor + + /// + /// The direct contructor should only be used in . + /// + public XLTable(XLRangeParameters xlRangeParameters) + : base(xlRangeParameters) + { + InitializeValues(false); + } + + #endregion Constructor + + public override XLRangeType RangeType + { + get { return XLRangeType.Table; } + } + + private IXLRangeAddress _lastRangeAddress; + private Dictionary _fieldNames = null; + + public Dictionary FieldNames + { + get + { + if (_fieldNames != null && _lastRangeAddress != null && _lastRangeAddress.Equals(RangeAddress)) + return _fieldNames; + + if (_fieldNames == null) + { + _fieldNames = new Dictionary(StringComparer.OrdinalIgnoreCase); + _lastRangeAddress = RangeAddress; + HeadersRow(); + } + else + { + HeadersRow(false); + } + + RescanFieldNames(); + + _lastRangeAddress = RangeAddress; + + return _fieldNames; + } + } + + private void RescanFieldNames() + { + if (ShowHeaderRow) + { + var detectedFieldNames = new Dictionary(); + var headersRow = HeadersRow(false); + Int32 cellPos = 0; + foreach (var cell in headersRow.Cells()) + { + var name = cell.GetString(); + if (_fieldNames.TryGetValue(name, out IXLTableField tableField) && tableField.Column.ColumnNumber() == cell.Address.ColumnNumber) + { + (tableField as XLTableField).Index = cellPos; + detectedFieldNames.Add(name, _fieldNames[name]); + cellPos++; + continue; + } + + // Be careful here. Fields names may actually be whitespace, but not empty + if (String.IsNullOrEmpty(name)) + { + name = GetUniqueName("Column", cellPos + 1, true); + cell.SetValue(name); + cell.DataType = XLDataType.Text; + } + if (_fieldNames.ContainsKey(name)) + throw new ArgumentException("The header row contains more than one field name '" + name + "'."); + + _fieldNames.Add(name, new XLTableField(this, name) { Index = cellPos++ }); + detectedFieldNames.Add(name, _fieldNames[name]); + } + + _fieldNames.Keys + .Where(key => !detectedFieldNames.ContainsKey(key)) + .ToArray() + .ForEach(key => _fieldNames.Remove(key)); + } + else + { + Int32 colCount = ColumnCount(); + for (Int32 i = 1; i <= colCount; i++) + { + if (_fieldNames.Values.All(f => f.Index != i - 1)) + { + var name = "Column" + i; + + _fieldNames.Add(name, new XLTableField(this, name) { Index = i - 1 }); + } + } + } + } + + internal void AddFields(IEnumerable fieldNames) + { + _fieldNames = new Dictionary(); + + Int32 cellPos = 0; + foreach (var name in fieldNames) + { + _fieldNames.Add(name, new XLTableField(this, name) { Index = cellPos++ }); + } + } + + internal void RenameField(String oldName, String newName) + { + if (!_fieldNames.TryGetValue(oldName, out IXLTableField field)) + throw new ArgumentException("The field does not exist in this table", "oldName"); + + _fieldNames.Remove(oldName); + _fieldNames.Add(newName, field); + } + + internal String RelId { get; set; } + + public IXLTableRange DataRange + { + get + { + XLRange range; + + var firstDataRowNumber = 1; + var lastDataRowNumber = RowCount(); + + if (_showHeaderRow) + firstDataRowNumber++; + + if (_showTotalsRow) + lastDataRowNumber--; + + if (firstDataRowNumber > lastDataRowNumber) + return null; + + range = Range(firstDataRowNumber, 1, lastDataRowNumber, ColumnCount()); + + return new XLTableRange(range, this); + } + } + + private XLAutoFilter _autoFilter; + + public XLAutoFilter AutoFilter + { + get + { + if (_autoFilter == null) + _autoFilter = new XLAutoFilter(); + + _autoFilter.Range = ShowTotalsRow ? Range(1, 1, RowCount() - 1, ColumnCount()) : AsRange(); + return _autoFilter; + } + } + + public override IXLAutoFilter SetAutoFilter() + { + return AutoFilter; + } + + protected override void OnRangeAddressChanged(XLRangeAddress oldAddress, XLRangeAddress newAddress) + { + //Do nothing for table + } + + #region IXLTable Members + + public Boolean EmphasizeFirstColumn { get; set; } + public Boolean EmphasizeLastColumn { get; set; } + public Boolean ShowRowStripes { get; set; } + public Boolean ShowColumnStripes { get; set; } + + private Boolean _showAutoFilter; + + public Boolean ShowAutoFilter + { + get { return _showHeaderRow && _showAutoFilter; } + set { _showAutoFilter = value; } + } + + public XLTableTheme Theme { get; set; } + + public String Name + { + get { return _name; } + set + { + if (_name == value) return; + + // Validation rules for table names + var oldname = _name ?? string.Empty; + + if (!XLHelper.ValidateName("table", value, oldname, Worksheet.Tables.Select(t => t.Name), out String message)) + throw new ArgumentException(message, nameof(value)); + + _name = value; + + // Some totals row formula depend on the table name. Update them. + if (_fieldNames?.Any() ?? false) + this.Fields.ForEach(f => (f as XLTableField).UpdateTableFieldTotalsRowFormula()); + + if (!String.IsNullOrWhiteSpace(oldname) && !String.Equals(oldname, _name, StringComparison.OrdinalIgnoreCase)) + { + Worksheet.Tables.Add(this); + if (Worksheet.Tables.Contains(oldname)) + Worksheet.Tables.Remove(oldname); + } + } + } + + public Boolean ShowTotalsRow + { + get { return _showTotalsRow; } + set + { + if (value && !_showTotalsRow) + InsertRowsBelow(1); + else if (!value && _showTotalsRow) + TotalsRow().Delete(); + + _showTotalsRow = value; + + // Invalidate fields' columns + this.Fields.Cast().ForEach(f => f.Column = null); + + if (_showTotalsRow) + { + AutoFilter.Range = Worksheet.Range( + RangeAddress.FirstAddress.RowNumber, RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber - 1, RangeAddress.LastAddress.ColumnNumber); + } + else + AutoFilter.Range = Worksheet.Range(RangeAddress); + } + } + + public IXLRangeRow HeadersRow() + { + return HeadersRow(true); + } + + internal IXLRangeRow HeadersRow(Boolean scanForNewFieldsNames) + { + if (!ShowHeaderRow) return null; + + if (scanForNewFieldsNames) + { + var tempResult = FieldNames; + } + + return FirstRow(); + } + + public IXLRangeRow TotalsRow() + { + return ShowTotalsRow ? LastRow() : null; + } + + public IXLTableField Field(String fieldName) + { + return Field(GetFieldIndex(fieldName)); + } + + public IXLTableField Field(Int32 fieldIndex) + { + return FieldNames.Values.First(f => f.Index == fieldIndex); + } + + public IEnumerable Fields + { + get + { + Int32 columnCount = ColumnCount(); + for (int co = 0; co < columnCount; co++) + yield return Field(co); + } + } + + public IXLTable Resize(IXLRangeAddress rangeAddress) + { + return Resize(Worksheet.Range(RangeAddress)); + } + + public IXLTable Resize(string rangeAddress) + { + return Resize(Worksheet.Range(RangeAddress)); + } + + public IXLTable Resize(IXLCell firstCell, IXLCell lastCell) + { + return Resize(Worksheet.Range(firstCell, lastCell)); + } + + public IXLTable Resize(string firstCellAddress, string lastCellAddress) + { + return Resize(Worksheet.Range(firstCellAddress, lastCellAddress)); + } + + public IXLTable Resize(IXLAddress firstCellAddress, IXLAddress lastCellAddress) + { + return Resize(Worksheet.Range(firstCellAddress, lastCellAddress)); + } + + public IXLTable Resize(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn) + { + return Resize(Worksheet.Range(firstCellRow, firstCellColumn, lastCellRow, lastCellColumn)); + } + + public IXLTable Resize(IXLRange range) + { + if (!this.ShowHeaderRow) + throw new NotImplementedException("Resizing of tables with no headers not supported yet."); + + if (this.Worksheet != range.Worksheet) + throw new InvalidOperationException("You cannot resize a table to a range on a different sheet."); + + var totalsRowChanged = this.ShowTotalsRow ? range.LastRow().RowNumber() - this.TotalsRow().RowNumber() : 0; + var oldTotalsRowNumber = this.ShowTotalsRow ? this.TotalsRow().RowNumber() : -1; + + var existingHeaders = this.FieldNames.Keys; + var newHeaders = new HashSet(); + + // Force evaluation of f.Column field + var tempArray = this.Fields.Select(f => f.Column).ToArray(); + + var firstRow = range.Row(1); + if (!firstRow.FirstCell().Address.Equals(this.HeadersRow().FirstCell().Address) + || !firstRow.LastCell().Address.Equals(this.HeadersRow().LastCell().Address)) + { + _uniqueNames.Clear(); + var co = 1; + foreach (var c in firstRow.Cells()) + { + if (String.IsNullOrWhiteSpace(((XLCell)c).InnerText)) + c.Value = GetUniqueName("Column", co, true); + + var header = c.GetString(); + _uniqueNames.Add(header); + + if (!existingHeaders.Contains(header)) + newHeaders.Add(header); + + co++; + } + } + + if (totalsRowChanged < 0) + { + range.Rows(r => r.RowNumber().Equals(this.TotalsRow().RowNumber() + totalsRowChanged)).Single().InsertRowsAbove(1); + range = Worksheet.Range(range.FirstCell(), range.LastCell().CellAbove()); + oldTotalsRowNumber++; + } + else if (totalsRowChanged > 0) + { + this.TotalsRow().RowBelow(totalsRowChanged + 1).InsertRowsAbove(1); + this.TotalsRow().AsRange().Delete(XLShiftDeletedCells.ShiftCellsUp); + } + + this.RangeAddress = (XLRangeAddress)range.RangeAddress; + RescanFieldNames(); + + if (this.ShowTotalsRow) + { + foreach (var f in this._fieldNames.Values) + { + var c = this.TotalsRow().Cell(f.Index + 1); + if (!c.IsEmpty() && newHeaders.Contains(f.Name)) + { + f.TotalsRowLabel = c.GetFormattedString(); + c.DataType = XLDataType.Text; + } + } + + if (totalsRowChanged != 0) + { + foreach (var f in this._fieldNames.Values.Cast()) + { + f.UpdateTableFieldTotalsRowFormula(); + var c = this.TotalsRow().Cell(f.Index + 1); + if (!String.IsNullOrWhiteSpace(f.TotalsRowLabel)) + { + c.DataType = XLDataType.Text; + + //Remove previous row's label + var oldTotalsCell = this.Worksheet.Cell(oldTotalsRowNumber, f.Column.ColumnNumber()); + if (oldTotalsCell.Value.ToString() == f.TotalsRowLabel) + oldTotalsCell.Value = null; + } + + if (f.TotalsRowFunction != XLTotalsRowFunction.None) + c.DataType = XLDataType.Number; + } + } + } + + return this; + } + + public IXLTable SetEmphasizeFirstColumn() + { + EmphasizeFirstColumn = true; + return this; + } + + public IXLTable SetEmphasizeFirstColumn(Boolean value) + { + EmphasizeFirstColumn = value; + return this; + } + + public IXLTable SetEmphasizeLastColumn() + { + EmphasizeLastColumn = true; + return this; + } + + public IXLTable SetEmphasizeLastColumn(Boolean value) + { + EmphasizeLastColumn = value; + return this; + } + + public IXLTable SetShowRowStripes() + { + ShowRowStripes = true; + return this; + } + + public IXLTable SetShowRowStripes(Boolean value) + { + ShowRowStripes = value; + return this; + } + + public IXLTable SetShowColumnStripes() + { + ShowColumnStripes = true; + return this; + } + + public IXLTable SetShowColumnStripes(Boolean value) + { + ShowColumnStripes = value; + return this; + } + + public IXLTable SetShowTotalsRow() + { + ShowTotalsRow = true; + return this; + } + + public IXLTable SetShowTotalsRow(Boolean value) + { + ShowTotalsRow = value; + return this; + } + + public IXLTable SetShowAutoFilter() + { + ShowAutoFilter = true; + return this; + } + + public IXLTable SetShowAutoFilter(Boolean value) + { + ShowAutoFilter = value; + return this; + } + + public new IXLRange Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, + Boolean matchCase = false, Boolean ignoreBlanks = true) + { + var toSortBy = new StringBuilder(); + foreach (string coPairTrimmed in columnsToSortBy.Split(',').Select(coPair => coPair.Trim())) + { + String coString; + String order; + if (coPairTrimmed.Contains(' ')) + { + var pair = coPairTrimmed.Split(' '); + coString = pair[0]; + order = pair[1]; + } + else + { + coString = coPairTrimmed; + order = sortOrder == XLSortOrder.Ascending ? "ASC" : "DESC"; + } + + if (!Int32.TryParse(coString, out Int32 co)) + co = Field(coString).Index + 1; + + if (toSortBy.Length > 0) + toSortBy.Append(','); + + toSortBy.Append(co); + toSortBy.Append(' '); + toSortBy.Append(order); + } + return DataRange.Sort(toSortBy.ToString(), sortOrder, matchCase, ignoreBlanks); + } + + public new IXLTable Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + base.Clear(clearOptions); + return this; + } + + IXLAutoFilter IXLTable.AutoFilter + { + get { return AutoFilter; } + } + + #endregion IXLTable Members + + private void InitializeValues(Boolean setAutofilter) + { + ShowRowStripes = true; + _showHeaderRow = true; + Theme = XLTableTheme.TableStyleMedium2; + if (setAutofilter) + InitializeAutoFilter(); + + AsRange().Row(1).DataType = XLDataType.Text; + + if (RowCount() == 1) + InsertRowsBelow(1); + } + + public void InitializeAutoFilter() + { + ShowAutoFilter = true; + } + + internal void OnAddedToTables() + { + _uniqueNames = new HashSet(); + Int32 co = 1; + foreach (IXLCell c in Row(1).Cells()) + { + // Be careful here. Fields names may actually be whitespace, but not empty + if (String.IsNullOrEmpty(((XLCell)c).InnerText)) + c.Value = GetUniqueName("Column", co, true); + _uniqueNames.Add(c.GetString()); + co++; + } + } + + private String GetUniqueName(String originalName, Int32 initialOffset, Boolean enforceOffset) + { + String name = String.Concat(originalName, enforceOffset ? initialOffset.ToInvariantString() : string.Empty); + if (_uniqueNames?.Contains(name) ?? false) + { + Int32 i = initialOffset; + name = originalName + i.ToInvariantString(); + while (_uniqueNames.Contains(name)) + { + i++; + name = originalName + i.ToInvariantString(); + } + } + + return name; + } + + public Int32 GetFieldIndex(String name) + { + // There is a discrepancy in the way headers with line breaks are stored. + // The entry in the table definition will contain \r\n + // but the shared string value of the actual cell will contain only \n + name = name.Replace("\r\n", "\n"); + if (FieldNames.TryGetValue(name, out IXLTableField tableField)) + return tableField.Index; + + throw new ArgumentOutOfRangeException("The header row doesn't contain field name '" + name + "'."); + } + + internal Boolean _showHeaderRow; + + public Boolean ShowHeaderRow + { + get { return _showHeaderRow; } + set + { + if (_showHeaderRow == value) return; + + if (_showHeaderRow) + { + var headersRow = HeadersRow(); + _uniqueNames = new HashSet(); + Int32 co = 1; + foreach (IXLCell c in headersRow.Cells()) + { + if (String.IsNullOrWhiteSpace(((XLCell)c).InnerText)) + c.Value = GetUniqueName("Column", co, true); + _uniqueNames.Add(c.GetString()); + co++; + } + + headersRow.Clear(); + RangeAddress = new XLRangeAddress( + new XLAddress(Worksheet, RangeAddress.FirstAddress.RowNumber + 1, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn), + RangeAddress.LastAddress); + } + else + { + var asRange = Worksheet.Range( + RangeAddress.FirstAddress.RowNumber - 1, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber); + var firstRow = asRange.FirstRow(); + IXLRangeRow rangeRow; + if (firstRow.IsEmpty(XLCellsUsedOptions.All)) + { + rangeRow = firstRow; + RangeAddress = new XLRangeAddress( + new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber - 1, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn), + RangeAddress.LastAddress); + } + else + { + var fAddress = RangeAddress.FirstAddress; + //var lAddress = RangeAddress.LastAddress; + + rangeRow = firstRow.InsertRowsBelow(1, false).First(); + + RangeAddress = new XLRangeAddress( + fAddress, + RangeAddress.LastAddress); + } + + Int32 co = 1; + foreach (var name in FieldNames.Values.Select(f => f.Name)) + { + rangeRow.Cell(co).SetValue(name); + co++; + } + } + + _showHeaderRow = value; + + // Invalidate fields' columns + this.Fields.Cast().ForEach(f => f.Column = null); + + if (_showHeaderRow) + HeadersRow().DataType = XLDataType.Text; + } + } + + public IXLTable SetShowHeaderRow() + { + return SetShowHeaderRow(true); + } + + public IXLTable SetShowHeaderRow(Boolean value) + { + ShowHeaderRow = value; + return this; + } + + public void ExpandTableRows(Int32 rows) + { + RangeAddress = new XLRangeAddress( + RangeAddress.FirstAddress, + new XLAddress(Worksheet, RangeAddress.LastAddress.RowNumber + rows, + RangeAddress.LastAddress.ColumnNumber, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn)); + } + + public override XLRangeColumn Column(int columnNumber) + { + var column = base.Column(columnNumber); + column.Table = this; + return column; + } + + public override XLRangeColumn Column(string columnName) + { + var column = base.Column(columnName); + column.Table = this; + return column; + } + + public override IXLRangeColumns Columns(int firstColumn, int lastColumn) + { + var columns = base.Columns(firstColumn, lastColumn); + columns.Cast().ForEach(column => column.Table = this); + return columns; + } + + public override IXLRangeColumns Columns(Func predicate = null) + { + var columns = base.Columns(predicate); + columns.Cast().ForEach(column => column.Table = this); + return columns; + } + + public override IXLRangeColumns Columns(string columns) + { + var cols = base.Columns(columns); + cols.Cast().ForEach(column => column.Table = this); + return cols; + } + + public override IXLRangeColumns Columns(string firstColumn, string lastColumn) + { + var columns = base.Columns(firstColumn, lastColumn); + columns.Cast().ForEach(column => column.Table = this); + return columns; + } + + internal override XLRangeColumns ColumnsUsed(XLCellsUsedOptions options, Func predicate = null) + { + var columns = base.ColumnsUsed(options, predicate); + columns.Cast().ForEach(column => column.Table = this); + return columns; + } + + internal override XLRangeColumns ColumnsUsed(Func predicate = null) + { + var columns = base.ColumnsUsed(predicate); + columns.Cast().ForEach(column => column.Table = this); + return columns; + } + + IXLPivotTable IXLRangeBase.CreatePivotTable(IXLCell targetCell, String name) + { + return CreatePivotTable(targetCell, name); + } + + internal new XLPivotTable CreatePivotTable(IXLCell targetCell, String name) + { + return (XLPivotTable)targetCell.Worksheet.PivotTables.Add(name, targetCell, this); + } + + public IEnumerable AsDynamicEnumerable() + { + foreach (var row in this.DataRange.Rows()) + { + dynamic expando = new ExpandoObject(); + foreach (var f in this.Fields) + { + var value = row.Cell(f.Index + 1).Value; + // ExpandoObject supports IDictionary so we can extend it like this + var expandoDict = expando as IDictionary; + expandoDict[f.Name] = value; + } + + yield return expando; + } + } + + public DataTable AsNativeDataTable() + { + var table = new DataTable(this.Name); + + foreach (var f in Fields.Cast()) + { + Type type = typeof(object); + if (f.IsConsistentDataType()) + { + var c = f.Column.Cells().Skip(this.ShowHeaderRow ? 1 : 0).First(); + switch (c.DataType) + { + case XLDataType.Text: + type = typeof(String); + break; + + case XLDataType.Boolean: + type = typeof(Boolean); + break; + + case XLDataType.DateTime: + type = typeof(DateTime); + break; + + case XLDataType.TimeSpan: + type = typeof(TimeSpan); + break; + + case XLDataType.Number: + type = typeof(Double); + break; + } + } + + table.Columns.Add(f.Name, type); + } + + foreach (var row in this.DataRange.Rows()) + { + var dr = table.NewRow(); + + foreach (var f in this.Fields) + { + dr[f.Name] = row.Cell(f.Index + 1).Value; + } + + table.Rows.Add(dr); + } + + return table; + } + + public IXLTable CopyTo(IXLWorksheet targetSheet) + { + return CopyTo((XLWorksheet)targetSheet); + } + + internal IXLTable CopyTo(XLWorksheet targetSheet, bool copyData = true) + { + if (targetSheet == Worksheet) + throw new InvalidOperationException("Cannot copy table to the worksheet it already belongs to."); + + var targetRange = targetSheet.Range(RangeAddress.WithoutWorksheet()); + if (copyData) + RangeUsed().CopyTo(targetRange); + else + HeadersRow().CopyTo(targetRange.FirstRow()); + + String tableName = Name; + var newTable = (XLTable)targetSheet.Table(targetRange, tableName, true); + + newTable.RelId = null; + newTable.EmphasizeFirstColumn = EmphasizeFirstColumn; + newTable.EmphasizeLastColumn = EmphasizeLastColumn; + newTable.ShowRowStripes = ShowRowStripes; + newTable.ShowColumnStripes = ShowColumnStripes; + newTable.ShowAutoFilter = ShowAutoFilter; + newTable.Theme = Theme; + newTable._showTotalsRow = ShowTotalsRow; + + Int32 fieldCount = ColumnCount(); + for (Int32 f = 0; f < fieldCount; f++) + { + var tableField = newTable.Field(f) as XLTableField; + var tField = Field(f) as XLTableField; + tableField.Index = tField.Index; + tableField.Name = tField.Name; + tableField.totalsRowLabel = tField.totalsRowLabel; + tableField.totalsRowFunction = tField.totalsRowFunction; + } + return newTable; + } + + #region Append and replace data + + public IXLRange AppendData(IEnumerable data, Boolean propagateExtraColumns = false) + { + return AppendData(data, transpose: false, propagateExtraColumns: propagateExtraColumns); + } + + public IXLRange AppendData(IEnumerable data, bool transpose, Boolean propagateExtraColumns = false) + { + var castedData = data?.Cast(); + if (!(castedData?.Any() ?? false) || data is String) + return null; + + var numberOfNewRows = castedData.Count(); + + var lastRowOfOldRange = this.DataRange.LastRow(); + lastRowOfOldRange.InsertRowsBelow(numberOfNewRows); + this.Fields.Cast().ForEach(f => f.Column = null); + + var insertedRange = lastRowOfOldRange.RowBelow().FirstCell().InsertData(castedData, transpose); + + PropagateExtraColumns(insertedRange.ColumnCount(), lastRowOfOldRange.RowNumber()); + + return insertedRange; + } + + public IXLRange AppendData(DataTable dataTable, Boolean propagateExtraColumns = false) + { + return AppendData(dataTable.Rows.Cast(), propagateExtraColumns: propagateExtraColumns); + } + + public IXLRange AppendData(IEnumerable data, Boolean propagateExtraColumns = false) + { + if (!(data?.Any() ?? false) || data is String) + return null; + + var numberOfNewRows = data.Count(); + + if (numberOfNewRows == 0) + return null; + + var lastRowOfOldRange = this.DataRange.LastRow(); + lastRowOfOldRange.InsertRowsBelow(numberOfNewRows); + this.Fields.Cast().ForEach(f => f.Column = null); + + var insertedRange = lastRowOfOldRange.RowBelow().FirstCell().InsertData(data); + + PropagateExtraColumns(insertedRange.ColumnCount(), lastRowOfOldRange.RowNumber()); + + return insertedRange; + } + + public IXLRange ReplaceData(IEnumerable data, Boolean propagateExtraColumns = false) + { + return ReplaceData(data, transpose: false, propagateExtraColumns: propagateExtraColumns); + } + + public IXLRange ReplaceData(IEnumerable data, bool transpose, Boolean propagateExtraColumns = false) + { + var castedData = data?.Cast(); + if (!(castedData?.Any() ?? false) || data is String) + throw new InvalidOperationException("Cannot replace table data with empty enumerable."); + + var firstDataRowNumber = this.DataRange.FirstRow().RowNumber(); + var lastDataRowNumber = this.DataRange.LastRow().RowNumber(); + + // Resize table + var sizeDifference = castedData.Count() - this.DataRange.RowCount(); + if (sizeDifference > 0) + this.DataRange.LastRow().InsertRowsBelow(sizeDifference); + else if (sizeDifference < 0) + { + this.DataRange.Rows + ( + lastDataRowNumber + sizeDifference + 1 - firstDataRowNumber + 1, + lastDataRowNumber - firstDataRowNumber + 1 + ) + .Delete(); + + // No propagation needed when reducing the number of rows + propagateExtraColumns = false; + } + + if (sizeDifference != 0) + // Invalidate table fields' columns + this.Fields.Cast().ForEach(f => f.Column = null); + + var replacedRange = this.DataRange.FirstCell().InsertData(castedData, transpose); + + if (propagateExtraColumns) + PropagateExtraColumns(replacedRange.ColumnCount(), lastDataRowNumber); + + return replacedRange; + } + + public IXLRange ReplaceData(DataTable dataTable, Boolean propagateExtraColumns = false) + { + return ReplaceData(dataTable.Rows.Cast(), propagateExtraColumns: propagateExtraColumns); + } + + public IXLRange ReplaceData(IEnumerable data, Boolean propagateExtraColumns = false) + { + if (!(data?.Any() ?? false) || data is String) + throw new InvalidOperationException("Cannot replace table data with empty enumerable."); + + var firstDataRowNumber = this.DataRange.FirstRow().RowNumber(); + var lastDataRowNumber = this.DataRange.LastRow().RowNumber(); + + // Resize table + var sizeDifference = data.Count() - this.DataRange.RowCount(); + if (sizeDifference > 0) + this.DataRange.LastRow().InsertRowsBelow(sizeDifference); + else if (sizeDifference < 0) + { + this.DataRange.Rows + ( + lastDataRowNumber + sizeDifference + 1 - firstDataRowNumber + 1, + lastDataRowNumber - firstDataRowNumber + 1 + ) + .Delete(); + + // No propagation needed when reducing the number of rows + propagateExtraColumns = false; + } + + if (sizeDifference != 0) + // Invalidate table fields' columns + this.Fields.Cast().ForEach(f => f.Column = null); + + var replacedRange = this.DataRange.FirstCell().InsertData(data); + + if (propagateExtraColumns) + PropagateExtraColumns(replacedRange.ColumnCount(), lastDataRowNumber); + + return replacedRange; + } + + private void PropagateExtraColumns(int numberOfNonExtraColumns, int previousLastDataRow) + { + for (var i = numberOfNonExtraColumns; i < this.Fields.Count(); i++) + { + var field = this.Field(i); + + var cell = this.Worksheet.Cell(previousLastDataRow, field.Column.ColumnNumber()); + field.Column.Cells(c => c.Address.RowNumber > previousLastDataRow) + .ForEach(c => + { + if (cell.HasFormula) + c.FormulaR1C1 = cell.FormulaR1C1; + else + c.Value = cell.Value; + }); + } + } + + #endregion Append and replace data + } +} diff --git a/ClosedXML/Excel/Tables/XLTableField.cs b/ClosedXML/Excel/Tables/XLTableField.cs new file mode 100644 index 0000000..c074518 --- /dev/null +++ b/ClosedXML/Excel/Tables/XLTableField.cs @@ -0,0 +1,259 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace ClosedXML.Excel +{ + [DebuggerDisplay("{Name}")] + internal class XLTableField : IXLTableField + { + internal XLTotalsRowFunction totalsRowFunction; + internal String totalsRowLabel; + private readonly XLTable table; + + private IXLRangeColumn _column; + private Int32 index; + private String name; + + public XLTableField(XLTable table, String name) + { + this.table = table; + this.name = name; + } + + public IXLRangeColumn Column + { + get + { + if (_column == null) + { + _column = table.AsRange().Column(this.Index + 1); + } + return _column; + } + internal set + { + _column = value; + } + } + + public IXLCells DataCells + { + get + { + return Column.Cells(c => + { + if (table.ShowHeaderRow && c == HeaderCell) + return false; + if (table.ShowTotalsRow && c == TotalsCell) + return false; + return true; + }); + } + } + + public IXLCell HeaderCell + { + get + { + if (!table.ShowHeaderRow) + return null; + + return Column.FirstCell(); + } + } + + public Int32 Index + { + get { return index; } + internal set + { + if (index == value) return; + index = value; + _column = null; + } + } + + public String Name + { + get + { + return name; + } + set + { + if (name == value) return; + + if (table.ShowHeaderRow) + (table.HeadersRow(false).Cell(Index + 1) as XLCell).SetValue(value, false); + + table.RenameField(name, value); + name = value; + } + } + + public IXLTable Table { get { return table; } } + + public IXLCell TotalsCell + { + get + { + if (!table.ShowTotalsRow) + return null; + + return Column.LastCell(); + } + } + + public String TotalsRowFormulaA1 + { + get { return table.TotalsRow().Cell(Index + 1).FormulaA1; } + set + { + totalsRowFunction = XLTotalsRowFunction.Custom; + table.TotalsRow().Cell(Index + 1).FormulaA1 = value; + } + } + + public String TotalsRowFormulaR1C1 + { + get { return table.TotalsRow().Cell(Index + 1).FormulaR1C1; } + set + { + totalsRowFunction = XLTotalsRowFunction.Custom; + table.TotalsRow().Cell(Index + 1).FormulaR1C1 = value; + } + } + + public XLTotalsRowFunction TotalsRowFunction + { + get { return totalsRowFunction; } + set + { + totalsRowFunction = value; + UpdateTableFieldTotalsRowFormula(); + } + } + + public String TotalsRowLabel + { + get { return totalsRowLabel; } + set + { + totalsRowFunction = XLTotalsRowFunction.None; + (table.TotalsRow().Cell(Index + 1) as XLCell).SetValue(value, false); + totalsRowLabel = value; + } + } + + public void Delete() + { + Delete(true); + } + + internal void Delete(Boolean deleteUnderlyingRangeColumn) + { + var fields = table.Fields.Cast().ToArray(); + + if (deleteUnderlyingRangeColumn) + { + table.AsRange().ColumnQuick(this.Index + 1).Delete(); + } + + fields.Where(f => f.Index > this.Index).ForEach(f => f.Index--); + table.FieldNames.Remove(this.Name); + } + + public bool IsConsistentDataType() + { + var dataTypes = this.Column + .Cells() + .Skip(this.table.ShowHeaderRow ? 1 : 0) + .Select(c => c.DataType); + + if (this.table.ShowTotalsRow) + dataTypes = dataTypes.Take(dataTypes.Count() - 1); + + var distinctDataTypes = dataTypes + .GroupBy(dt => dt) + .Select(g => new { Key = g.Key, Count = g.Count() }); + + return distinctDataTypes.Count() == 1; + } + + public Boolean IsConsistentFormula() + { + var formulas = this.Column + .Cells() + .Skip(this.table.ShowHeaderRow ? 1 : 0) + .Select(c => c.FormulaR1C1); + + if (this.table.ShowTotalsRow) + formulas = formulas.Take(formulas.Count() - 1); + + var distinctFormulas = formulas + .GroupBy(f => f) + .Select(g => new { Key = g.Key, Count = g.Count() }); + + return distinctFormulas.Count() == 1; + } + + public bool IsConsistentStyle() + { + var styles = this.Column + .Cells() + .Skip(this.table.ShowHeaderRow ? 1 : 0) + .OfType() + .Select(c => c.StyleValue); + + if (this.table.ShowTotalsRow) + styles = styles.Take(styles.Count() - 1); + + var distinctStyles = styles + .Distinct(); + + return distinctStyles.Count() == 1; + } + + private static IEnumerable QuotedTableFieldCharacters = new[] { "'", "#" }; + + internal void UpdateTableFieldTotalsRowFormula() + { + if (TotalsRowFunction != XLTotalsRowFunction.None && TotalsRowFunction != XLTotalsRowFunction.Custom) + { + var cell = table.TotalsRow().Cell(Index + 1); + var formulaCode = String.Empty; + switch (TotalsRowFunction) + { + case XLTotalsRowFunction.Sum: formulaCode = "109"; break; + case XLTotalsRowFunction.Minimum: formulaCode = "105"; break; + case XLTotalsRowFunction.Maximum: formulaCode = "104"; break; + case XLTotalsRowFunction.Average: formulaCode = "101"; break; + case XLTotalsRowFunction.Count: formulaCode = "103"; break; + case XLTotalsRowFunction.CountNumbers: formulaCode = "102"; break; + case XLTotalsRowFunction.StandardDeviation: formulaCode = "107"; break; + case XLTotalsRowFunction.Variance: formulaCode = "110"; break; + } + + var modifiedName = Name; + QuotedTableFieldCharacters.ForEach(c => modifiedName = modifiedName.Replace(c, "'" + c)); + + if (modifiedName.StartsWith(" ") || modifiedName.EndsWith(" ")) + { + modifiedName = "[" + modifiedName + "]"; + } + + var prependTableName = modifiedName.Contains(" "); + + cell.FormulaA1 = $"SUBTOTAL({formulaCode},{(prependTableName ? table.Name : string.Empty)}[{modifiedName}])"; + var lastCell = table.LastRow().Cell(Index + 1); + if (lastCell.DataType != XLDataType.Text) + { + cell.DataType = lastCell.DataType; + cell.Style.NumberFormat = lastCell.Style.NumberFormat; + } + } + } + } +} diff --git a/ClosedXML/Excel/Tables/XLTableRange.cs b/ClosedXML/Excel/Tables/XLTableRange.cs new file mode 100644 index 0000000..717f149 --- /dev/null +++ b/ClosedXML/Excel/Tables/XLTableRange.cs @@ -0,0 +1,270 @@ +using System; + +namespace ClosedXML.Excel +{ + using System.Linq; + + internal class XLTableRange : XLRange, IXLTableRange + { + private readonly XLTable _table; + private readonly XLRange _range; + public XLTableRange(XLRange range, XLTable table) + : base(new XLRangeParameters(range.RangeAddress, range.Style)) + { + _table = table; + _range = range; + } + + IXLTableRow IXLTableRange.FirstRow(Func predicate) + { + return FirstRow(predicate); + } + public XLTableRow FirstRow(Func predicate = null) + { + if (predicate == null) + return new XLTableRow(this, (_range.FirstRow())); + + Int32 rowCount = _range.RowCount(); + + for (Int32 ro = 1; ro <= rowCount; ro++) + { + var row = new XLTableRow(this, (_range.Row(ro))); + if (predicate(row)) return row; + } + + return null; + } + + IXLTableRow IXLTableRange.FirstRowUsed(Func predicate) + { + return FirstRowUsed(XLCellsUsedOptions.AllContents, predicate); + } + public XLTableRow FirstRowUsed(Func predicate = null) + { + return FirstRowUsed(XLCellsUsedOptions.AllContents, predicate); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLTableRow IXLTableRange.FirstRowUsed(Boolean includeFormats, Func predicate) + { + return FirstRowUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents, + predicate); + } + + IXLTableRow IXLTableRange.FirstRowUsed(XLCellsUsedOptions options, Func predicate) + { + return FirstRowUsed(options, predicate); + } + + internal XLTableRow FirstRowUsed(XLCellsUsedOptions options, Func predicate = null) + { + if (predicate == null) + return new XLTableRow(this, (_range.FirstRowUsed(options))); + + Int32 rowCount = _range.RowCount(); + + for (Int32 ro = 1; ro <= rowCount; ro++) + { + var row = new XLTableRow(this, (_range.Row(ro))); + + if (!row.IsEmpty(options) && predicate(row)) + return row; + } + + return null; + } + + + IXLTableRow IXLTableRange.LastRow(Func predicate) + { + return LastRow(predicate); + } + public XLTableRow LastRow(Func predicate = null) + { + if (predicate == null) + return new XLTableRow(this, (_range.LastRow())); + + Int32 rowCount = _range.RowCount(); + + for (Int32 ro = rowCount; ro >= 1; ro--) + { + var row = new XLTableRow(this, (_range.Row(ro))); + if (predicate(row)) return row; + } + return null; + } + + IXLTableRow IXLTableRange.LastRowUsed(Func predicate) + { + return LastRowUsed(XLCellsUsedOptions.AllContents, predicate); + } + public XLTableRow LastRowUsed(Func predicate = null) + { + return LastRowUsed(XLCellsUsedOptions.AllContents, predicate); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLTableRow IXLTableRange.LastRowUsed(Boolean includeFormats, Func predicate) + { + return LastRowUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents, + predicate); + } + + IXLTableRow IXLTableRange.LastRowUsed(XLCellsUsedOptions options, Func predicate) + { + return LastRowUsed(options, predicate); + } + + + internal XLTableRow LastRowUsed(XLCellsUsedOptions options, Func predicate = null) + { + if (predicate == null) + return new XLTableRow(this, (_range.LastRowUsed(options))); + + Int32 rowCount = _range.RowCount(); + + for (Int32 ro = rowCount; ro >= 1; ro--) + { + var row = new XLTableRow(this, (_range.Row(ro))); + + if (!row.IsEmpty(options) && predicate(row)) + return row; + } + + return null; + } + + IXLTableRow IXLTableRange.Row(int row) + { + return Row(row); + } + public new XLTableRow Row(int row) + { + if (row <= 0 || row > XLHelper.MaxRowNumber + RangeAddress.FirstAddress.RowNumber - 1) + { + throw new ArgumentOutOfRangeException( + nameof(row), + String.Format("Row number must be between 1 and {0}", XLHelper.MaxRowNumber + RangeAddress.FirstAddress.RowNumber - 1) + ); + } + + return new XLTableRow(this, base.Row(row)); + } + + public IXLTableRows Rows(Func predicate = null) + { + var retVal = new XLTableRows(Worksheet.Style); + Int32 rowCount = _range.RowCount(); + + for (int r = 1; r <= rowCount; r++) + { + var row = Row(r); + if (predicate == null || predicate(row)) + retVal.Add(row); + } + return retVal; + } + + public new IXLTableRows Rows(int firstRow, int lastRow) + { + var retVal = new XLTableRows(Worksheet.Style); + + for (int rowNumber = firstRow; rowNumber <= lastRow; rowNumber++) + retVal.Add(Row(rowNumber)); + + return retVal; + } + + public new IXLTableRows Rows(string rows) + { + var retVal = new XLTableRows(Worksheet.Style); + var rowPairs = rows.Split(','); + foreach (string tPair in rowPairs.Select(pair => pair.Trim())) + { + String firstRow; + String lastRow; + if (tPair.Contains(':') || tPair.Contains('-')) + { + var rowRange = XLHelper.SplitRange(tPair); + + firstRow = rowRange[0]; + lastRow = rowRange[1]; + } + else + { + firstRow = tPair; + lastRow = tPair; + } + foreach (IXLTableRow row in Rows(Int32.Parse(firstRow), Int32.Parse(lastRow))) + retVal.Add(row); + } + return retVal; + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public IXLTableRows RowsUsed(Boolean includeFormats, Func predicate = null) + { + return RowsUsed(includeFormats + ? XLCellsUsedOptions.AllContents + : XLCellsUsedOptions.All, + predicate); + } + + IXLTableRows IXLTableRange.RowsUsed(XLCellsUsedOptions options, Func predicate) + { + return RowsUsed(options, predicate); + } + + internal XLTableRows RowsUsed(XLCellsUsedOptions options, Func predicate = null) + { + var rows = new XLTableRows(Worksheet.Style); + Int32 rowCount = RowCount(); + + for (Int32 ro = 1; ro <= rowCount; ro++) + { + var row = Row(ro); + + if (!row.IsEmpty(options) && (predicate == null || predicate(row))) + rows.Add(row); + } + return rows; + } + + IXLTableRows IXLTableRange.RowsUsed(Func predicate) + { + return RowsUsed(predicate); + } + public IXLTableRows RowsUsed(Func predicate = null) + { + return RowsUsed(XLCellsUsedOptions.AllContents, predicate); + } + + IXLTable IXLTableRange.Table { get { return _table; } } + public XLTable Table { get { return _table; } } + + public new IXLTableRows InsertRowsAbove(int numberOfRows) + { + return XLHelper.InsertRowsWithoutEvents(base.InsertRowsAbove, this, numberOfRows, !Table.ShowTotalsRow ); + } + public new IXLTableRows InsertRowsBelow(int numberOfRows) + { + return XLHelper.InsertRowsWithoutEvents(base.InsertRowsBelow, this, numberOfRows, !Table.ShowTotalsRow); + } + + + public new IXLRangeColumn Column(String column) + { + if (XLHelper.IsValidColumn(column)) + { + Int32 coNum = XLHelper.GetColumnNumberFromLetter(column); + return coNum > ColumnCount() ? Column(_table.GetFieldIndex(column) + 1) : Column(coNum); + } + + return Column(_table.GetFieldIndex(column) + 1); + } + } +} diff --git a/ClosedXML/Excel/Tables/XLTableRow.cs b/ClosedXML/Excel/Tables/XLTableRow.cs new file mode 100644 index 0000000..f863b67 --- /dev/null +++ b/ClosedXML/Excel/Tables/XLTableRow.cs @@ -0,0 +1,115 @@ +using System; + +namespace ClosedXML.Excel +{ + internal class XLTableRow : XLRangeRow, IXLTableRow + { + private readonly XLTableRange _tableRange; + + public XLTableRow(XLTableRange tableRange, XLRangeRow rangeRow) + : base(new XLRangeParameters(rangeRow.RangeAddress, rangeRow.Style)) + { + _tableRange = tableRange; + } + + #region IXLTableRow Members + + public IXLCell Field(Int32 index) + { + return Cell(index + 1); + } + + public IXLCell Field(String name) + { + Int32 fieldIndex = _tableRange.Table.GetFieldIndex(name); + return Cell(fieldIndex + 1); + } + + public new IXLTableRow Sort() + { + return SortLeftToRight(); + } + + public new IXLTableRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + base.SortLeftToRight(sortOrder, matchCase, ignoreBlanks); + return this; + } + + #endregion IXLTableRow Members + + private XLTableRow RowShift(Int32 rowsToShift) + { + return _tableRange.Row(RowNumber() - _tableRange.FirstRow().RowNumber() + 1 + rowsToShift); + } + + #region XLTableRow Above + + IXLTableRow IXLTableRow.RowAbove() + { + return RowAbove(); + } + + IXLTableRow IXLTableRow.RowAbove(Int32 step) + { + return RowAbove(step); + } + + public new XLTableRow RowAbove() + { + return RowAbove(1); + } + + public new XLTableRow RowAbove(Int32 step) + { + return RowShift(step * -1); + } + + #endregion XLTableRow Above + + #region XLTableRow Below + + IXLTableRow IXLTableRow.RowBelow() + { + return RowBelow(); + } + + IXLTableRow IXLTableRow.RowBelow(Int32 step) + { + return RowBelow(step); + } + + public new XLTableRow RowBelow() + { + return RowBelow(1); + } + + public new XLTableRow RowBelow(Int32 step) + { + return RowShift(step); + } + + #endregion XLTableRow Below + + public new IXLTableRow Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + base.Clear(clearOptions); + return this; + } + + public new IXLTableRows InsertRowsAbove(int numberOfRows) + { + return XLHelper.InsertRowsWithoutEvents(base.InsertRowsAbove, _tableRange, numberOfRows, !_tableRange.Table.ShowTotalsRow); + } + + public new IXLTableRows InsertRowsBelow(int numberOfRows) + { + return XLHelper.InsertRowsWithoutEvents(base.InsertRowsBelow, _tableRange, numberOfRows, !_tableRange.Table.ShowTotalsRow); + } + + public new void Delete() + { + Delete(XLShiftDeletedCells.ShiftCellsUp); + } + } +} diff --git a/ClosedXML/Excel/Tables/XLTableRows.cs b/ClosedXML/Excel/Tables/XLTableRows.cs new file mode 100644 index 0000000..b3cff49 --- /dev/null +++ b/ClosedXML/Excel/Tables/XLTableRows.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLTableRows : XLStylizedBase, IXLTableRows, IXLStylized + { + private readonly List _ranges = new List(); + + public XLTableRows(IXLStyle defaultStyle) : base((defaultStyle as XLStyle).Value) + { + } + + #region IXLStylized Members + + public override IEnumerable Styles + { + get + { + yield return Style; + foreach (XLTableRow rng in _ranges) + { + yield return rng.Style; + foreach (XLCell r in rng.Worksheet.Internals.CellsCollection.GetCells( + rng.RangeAddress.FirstAddress.RowNumber, + rng.RangeAddress.FirstAddress.ColumnNumber, + rng.RangeAddress.LastAddress.RowNumber, + rng.RangeAddress.LastAddress.ColumnNumber)) + yield return r.Style; + } + } + } + + protected override IEnumerable Children + { + get + { + foreach (var range in _ranges) + { + yield return range; + } + } + } + + public override IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges(); + this.ForEach(c => retVal.Add(c.AsRange())); + return retVal; + } + } + + #endregion IXLStylized Members + + #region IXLTableRows Members + + public IXLTableRows Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + _ranges.ForEach(r => r.Clear(clearOptions)); + return this; + } + + public void Delete() + { + _ranges.OrderByDescending(r => r.RowNumber()).ForEach(r => r.Delete()); + _ranges.Clear(); + } + + public void Add(IXLTableRow tableRow) + { + _ranges.Add((XLTableRow)tableRow); + } + + public IEnumerator GetEnumerator() + { + var retList = new List(); + _ranges.ForEach(retList.Add); + return retList.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLCells Cells() + { + var cells = new XLCells(false, XLCellsUsedOptions.AllContents); + foreach (XLTableRow container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed() + { + var cells = new XLCells(true, XLCellsUsedOptions.AllContents); + foreach (XLTableRow container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed(Boolean includeFormats) + { + return CellsUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + public IXLCells CellsUsed(XLCellsUsedOptions options) + { + var cells = new XLCells(false, options); + foreach (XLTableRow container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + #endregion IXLTableRows Members + + public void Select() + { + foreach (var range in this) + range.Select(); + } + } +} diff --git a/ClosedXML/Excel/Tables/XLTableTheme.cs b/ClosedXML/Excel/Tables/XLTableTheme.cs new file mode 100644 index 0000000..ca70d17 --- /dev/null +++ b/ClosedXML/Excel/Tables/XLTableTheme.cs @@ -0,0 +1,121 @@ +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace ClosedXML.Excel +{ + public sealed class XLTableTheme + { + public static readonly XLTableTheme None = new XLTableTheme("None"); + public static readonly XLTableTheme TableStyleMedium28 = new XLTableTheme("TableStyleMedium28"); + public static readonly XLTableTheme TableStyleMedium27 = new XLTableTheme("TableStyleMedium27"); + public static readonly XLTableTheme TableStyleMedium26 = new XLTableTheme("TableStyleMedium26"); + public static readonly XLTableTheme TableStyleMedium25 = new XLTableTheme("TableStyleMedium25"); + public static readonly XLTableTheme TableStyleMedium24 = new XLTableTheme("TableStyleMedium24"); + public static readonly XLTableTheme TableStyleMedium23 = new XLTableTheme("TableStyleMedium23"); + public static readonly XLTableTheme TableStyleMedium22 = new XLTableTheme("TableStyleMedium22"); + public static readonly XLTableTheme TableStyleMedium21 = new XLTableTheme("TableStyleMedium21"); + public static readonly XLTableTheme TableStyleMedium20 = new XLTableTheme("TableStyleMedium20"); + public static readonly XLTableTheme TableStyleMedium19 = new XLTableTheme("TableStyleMedium19"); + public static readonly XLTableTheme TableStyleMedium18 = new XLTableTheme("TableStyleMedium18"); + public static readonly XLTableTheme TableStyleMedium17 = new XLTableTheme("TableStyleMedium17"); + public static readonly XLTableTheme TableStyleMedium16 = new XLTableTheme("TableStyleMedium16"); + public static readonly XLTableTheme TableStyleMedium15 = new XLTableTheme("TableStyleMedium15"); + public static readonly XLTableTheme TableStyleMedium14 = new XLTableTheme("TableStyleMedium14"); + public static readonly XLTableTheme TableStyleMedium13 = new XLTableTheme("TableStyleMedium13"); + public static readonly XLTableTheme TableStyleMedium12 = new XLTableTheme("TableStyleMedium12"); + public static readonly XLTableTheme TableStyleMedium11 = new XLTableTheme("TableStyleMedium11"); + public static readonly XLTableTheme TableStyleMedium10 = new XLTableTheme("TableStyleMedium10"); + public static readonly XLTableTheme TableStyleMedium9 = new XLTableTheme("TableStyleMedium9"); + public static readonly XLTableTheme TableStyleMedium8 = new XLTableTheme("TableStyleMedium8"); + public static readonly XLTableTheme TableStyleMedium7 = new XLTableTheme("TableStyleMedium7"); + public static readonly XLTableTheme TableStyleMedium6 = new XLTableTheme("TableStyleMedium6"); + public static readonly XLTableTheme TableStyleMedium5 = new XLTableTheme("TableStyleMedium5"); + public static readonly XLTableTheme TableStyleMedium4 = new XLTableTheme("TableStyleMedium4"); + public static readonly XLTableTheme TableStyleMedium3 = new XLTableTheme("TableStyleMedium3"); + public static readonly XLTableTheme TableStyleMedium2 = new XLTableTheme("TableStyleMedium2"); + public static readonly XLTableTheme TableStyleMedium1 = new XLTableTheme("TableStyleMedium1"); + public static readonly XLTableTheme TableStyleLight21 = new XLTableTheme("TableStyleLight21"); + public static readonly XLTableTheme TableStyleLight20 = new XLTableTheme("TableStyleLight20"); + public static readonly XLTableTheme TableStyleLight19 = new XLTableTheme("TableStyleLight19"); + public static readonly XLTableTheme TableStyleLight18 = new XLTableTheme("TableStyleLight18"); + public static readonly XLTableTheme TableStyleLight17 = new XLTableTheme("TableStyleLight17"); + public static readonly XLTableTheme TableStyleLight16 = new XLTableTheme("TableStyleLight16"); + public static readonly XLTableTheme TableStyleLight15 = new XLTableTheme("TableStyleLight15"); + public static readonly XLTableTheme TableStyleLight14 = new XLTableTheme("TableStyleLight14"); + public static readonly XLTableTheme TableStyleLight13 = new XLTableTheme("TableStyleLight13"); + public static readonly XLTableTheme TableStyleLight12 = new XLTableTheme("TableStyleLight12"); + public static readonly XLTableTheme TableStyleLight11 = new XLTableTheme("TableStyleLight11"); + public static readonly XLTableTheme TableStyleLight10 = new XLTableTheme("TableStyleLight10"); + public static readonly XLTableTheme TableStyleLight9 = new XLTableTheme("TableStyleLight9"); + public static readonly XLTableTheme TableStyleLight8 = new XLTableTheme("TableStyleLight8"); + public static readonly XLTableTheme TableStyleLight7 = new XLTableTheme("TableStyleLight7"); + public static readonly XLTableTheme TableStyleLight6 = new XLTableTheme("TableStyleLight6"); + public static readonly XLTableTheme TableStyleLight5 = new XLTableTheme("TableStyleLight5"); + public static readonly XLTableTheme TableStyleLight4 = new XLTableTheme("TableStyleLight4"); + public static readonly XLTableTheme TableStyleLight3 = new XLTableTheme("TableStyleLight3"); + public static readonly XLTableTheme TableStyleLight2 = new XLTableTheme("TableStyleLight2"); + public static readonly XLTableTheme TableStyleLight1 = new XLTableTheme("TableStyleLight1"); + public static readonly XLTableTheme TableStyleDark11 = new XLTableTheme("TableStyleDark11"); + public static readonly XLTableTheme TableStyleDark10 = new XLTableTheme("TableStyleDark10"); + public static readonly XLTableTheme TableStyleDark9 = new XLTableTheme("TableStyleDark9"); + public static readonly XLTableTheme TableStyleDark8 = new XLTableTheme("TableStyleDark8"); + public static readonly XLTableTheme TableStyleDark7 = new XLTableTheme("TableStyleDark7"); + public static readonly XLTableTheme TableStyleDark6 = new XLTableTheme("TableStyleDark6"); + public static readonly XLTableTheme TableStyleDark5 = new XLTableTheme("TableStyleDark5"); + public static readonly XLTableTheme TableStyleDark4 = new XLTableTheme("TableStyleDark4"); + public static readonly XLTableTheme TableStyleDark3 = new XLTableTheme("TableStyleDark3"); + public static readonly XLTableTheme TableStyleDark2 = new XLTableTheme("TableStyleDark2"); + public static readonly XLTableTheme TableStyleDark1 = new XLTableTheme("TableStyleDark1"); + + public string Name { get; private set; } + + public XLTableTheme(string name) + { + this.Name = name; + } + + private static IEnumerable allThemes; + + public static IEnumerable GetAllThemes() + { + return (allThemes ?? (allThemes = typeof(XLTableTheme).GetFields(BindingFlags.Static | BindingFlags.Public) + .Where(fi => fi.FieldType.Equals(typeof(XLTableTheme))) + .Select(fi => (XLTableTheme)fi.GetValue(null)) + .ToArray())); + } + + public static XLTableTheme FromName(string name) + { + return GetAllThemes().FirstOrDefault(s => s.Name == name); + } + + #region Overrides + + public override bool Equals(object obj) + { + if (obj == null) + { + return false; + } + XLTableTheme theme = obj as XLTableTheme; + if (theme == null) + { + return false; + } + return this.Name.Equals(theme.Name); + } + + public override int GetHashCode() + { + return this.Name.GetHashCode(); + } + + public override string ToString() + { + return this.Name; + } + + #endregion Overrides + } +} \ No newline at end of file diff --git a/ClosedXML/Excel/Tables/XLTables.cs b/ClosedXML/Excel/Tables/XLTables.cs new file mode 100644 index 0000000..5d2fed9 --- /dev/null +++ b/ClosedXML/Excel/Tables/XLTables.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections; + + internal class XLTables : IXLTables + { + private readonly Dictionary _tables; + + public XLTables() + { + _tables = new Dictionary(StringComparer.OrdinalIgnoreCase); + Deleted = new HashSet(); + } + + internal ICollection Deleted { get; private set; } + + #region IXLTables Members + + public void Add(IXLTable table) + { + _tables.Add(table.Name, table); + (table as XLTable)?.OnAddedToTables(); + } + + public IXLTables Clear(XLClearOptions clearOptions = XLClearOptions.All) + { + _tables.Values.ForEach(t => t.Clear(clearOptions)); + return this; + } + + public Boolean Contains(String name) + { + return _tables.ContainsKey(name); + } + + public IEnumerator GetEnumerator() + { + return _tables.Values.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Remove(Int32 index) + { + this.Remove(_tables.ElementAt(index).Key); + } + + public void Remove(String name) + { + if (!_tables.TryGetValue(name, out IXLTable table)) + throw new ArgumentOutOfRangeException(nameof(name), $"Unable to delete table because the table name {name} could not be found."); + + _tables.Remove(name); + + var relId = (table as XLTable)?.RelId; + + if (relId != null) + Deleted.Add(relId); + } + + public IXLTable Table(Int32 index) + { + return _tables.ElementAt(index).Value; + } + + public IXLTable Table(String name) + { + if (TryGetTable(name, out IXLTable table)) + return table; + + throw new ArgumentOutOfRangeException(nameof(name), $"Table {name} was not found."); + } + + public bool TryGetTable(string tableName, out IXLTable table) + { + return _tables.TryGetValue(tableName, out table); + } + + #endregion IXLTables Members + } +} diff --git a/ClosedXML/Excel/XLCellsUsedOptions.cs b/ClosedXML/Excel/XLCellsUsedOptions.cs new file mode 100644 index 0000000..6342062 --- /dev/null +++ b/ClosedXML/Excel/XLCellsUsedOptions.cs @@ -0,0 +1,29 @@ +using System; + +namespace ClosedXML.Excel +{ + [Flags] + public enum XLCellsUsedOptions + { + Contents = 1 << 0, + DataType = 1 << 1, + NormalFormats = 1 << 2, + ConditionalFormats = 1 << 3, + Comments = 1 << 4, + DataValidation = 1 << 5, + MergedRanges = 1 << 6, + Sparklines = 1 << 7, + + AllFormats = NormalFormats | ConditionalFormats, + AllContents = Contents | DataType | Comments, + All = Contents | DataType | NormalFormats | ConditionalFormats | Comments | DataValidation | MergedRanges | Sparklines + } + + internal static class XLCellsUsedOptionsExtensions + { + public static XLClearOptions ToClearOptions(this XLCellsUsedOptions options) + { + return (XLClearOptions)options; + } + } +} diff --git a/ClosedXML/Excel/XLClearOptions.cs b/ClosedXML/Excel/XLClearOptions.cs new file mode 100644 index 0000000..c6cbfd2 --- /dev/null +++ b/ClosedXML/Excel/XLClearOptions.cs @@ -0,0 +1,29 @@ +using System; + +namespace ClosedXML.Excel +{ + [Flags] + public enum XLClearOptions + { + Contents = 1 << 0, + DataType = 1 << 1, + NormalFormats = 1 << 2, + ConditionalFormats = 1 << 3, + Comments = 1 << 4, + DataValidation = 1 << 5, + MergedRanges = 1 << 6, + Sparklines = 1 << 7, + + AllFormats = NormalFormats | ConditionalFormats, + AllContents = Contents | DataType | Comments, + All = Contents | DataType | NormalFormats | ConditionalFormats | Comments | DataValidation | MergedRanges | Sparklines + } + + internal static class XLClearOptionsExtensions + { + public static XLCellsUsedOptions ToCellsUsedOptions(this XLClearOptions options) + { + return (XLCellsUsedOptions)options; + } + } +} diff --git a/ClosedXML/Excel/XLConstants.cs b/ClosedXML/Excel/XLConstants.cs new file mode 100644 index 0000000..e016d0d --- /dev/null +++ b/ClosedXML/Excel/XLConstants.cs @@ -0,0 +1,28 @@ +// Keep this file CodeMaid organised and cleaned +namespace ClosedXML.Excel +{ + //Use the class to store magic strings or variables. + public static class XLConstants + { + internal const int NumberOfBuiltInStyles = 164; // But they are stored as 0-based (0 - 163) + + #region Pivot Table constants + + public static class PivotTable + { + internal const byte CreatedVersion = 5; + internal const byte RefreshedVersion = 5; + + //TODO: Needs to be refactored to be more user-friendly. + public const string ValuesSentinalLabel = "{{Values}}"; + } + + #endregion Pivot Table constants + + internal static class Comment + { + internal const string AlternateShapeTypeId = "_xssf_cell_comment"; + internal const string ShapeTypeId = "_x0000_t202"; + } + } +} diff --git a/ClosedXML/Excel/XLFileSharing.cs b/ClosedXML/Excel/XLFileSharing.cs new file mode 100644 index 0000000..8449770 --- /dev/null +++ b/ClosedXML/Excel/XLFileSharing.cs @@ -0,0 +1,10 @@ +// Keep this file CodeMaid organised and cleaned + +namespace ClosedXML.Excel +{ + internal class XLFileSharing : IXLFileSharing + { + public bool ReadOnlyRecommended { get; set; } + public string UserName { get; set; } + } +} diff --git a/ClosedXML/Excel/XLOutline.cs b/ClosedXML/Excel/XLOutline.cs new file mode 100644 index 0000000..1e296b7 --- /dev/null +++ b/ClosedXML/Excel/XLOutline.cs @@ -0,0 +1,17 @@ + +namespace ClosedXML.Excel +{ + internal class XLOutline:IXLOutline + { + public XLOutline(IXLOutline outline) + { + if (outline != null) + { + SummaryHLocation = outline.SummaryHLocation; + SummaryVLocation = outline.SummaryVLocation; + } + } + public XLOutlineSummaryVLocation SummaryVLocation { get; set; } + public XLOutlineSummaryHLocation SummaryHLocation { get; set; } + } +} diff --git a/ClosedXML/Excel/XLSheetView.cs b/ClosedXML/Excel/XLSheetView.cs new file mode 100644 index 0000000..6c6c08c --- /dev/null +++ b/ClosedXML/Excel/XLSheetView.cs @@ -0,0 +1,108 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + internal class XLSheetView : IXLSheetView + { + private XLAddress _topLeftCellAddress; + private int _zoomScale; + + public XLSheetView(XLWorksheet worksheet) + { + Worksheet = worksheet; + View = XLSheetViewOptions.Normal; + + ZoomScale = 100; + ZoomScaleNormal = 100; + ZoomScalePageLayoutView = 100; + ZoomScaleSheetLayoutView = 100; + } + + public XLSheetView(XLWorksheet worksheet, XLSheetView sheetView) + : this(worksheet) + { + this.SplitRow = sheetView.SplitRow; + this.SplitColumn = sheetView.SplitColumn; + this.FreezePanes = sheetView.FreezePanes; + this.TopLeftCellAddress = new XLAddress(this.Worksheet, sheetView.TopLeftCellAddress.RowNumber, sheetView.TopLeftCellAddress.ColumnNumber, sheetView.TopLeftCellAddress.FixedRow, sheetView.TopLeftCellAddress.FixedColumn); + } + + public Boolean FreezePanes { get; set; } + public Int32 SplitColumn { get; set; } + public Int32 SplitRow { get; set; } + + IXLAddress IXLSheetView.TopLeftCellAddress { get => TopLeftCellAddress; set => TopLeftCellAddress = (XLAddress)value; } + + public XLAddress TopLeftCellAddress + { + get => _topLeftCellAddress; + set + { + if (value.HasWorksheet && !value.Worksheet.Equals(this.Worksheet)) + throw new ArgumentException($"The value should be on the same worksheet as the sheet view."); + + _topLeftCellAddress = value; + } + } + + public XLSheetViewOptions View { get; set; } + + IXLWorksheet IXLSheetView.Worksheet { get => Worksheet; } + public XLWorksheet Worksheet { get; internal set; } + + public int ZoomScale + { + get { return _zoomScale; } + set + { + _zoomScale = value; + switch (View) + { + case XLSheetViewOptions.Normal: + ZoomScaleNormal = value; + break; + + case XLSheetViewOptions.PageBreakPreview: + ZoomScalePageLayoutView = value; + break; + + case XLSheetViewOptions.PageLayout: + ZoomScaleSheetLayoutView = value; + break; + } + } + } + + public int ZoomScaleNormal { get; set; } + + public int ZoomScalePageLayoutView { get; set; } + + public int ZoomScaleSheetLayoutView { get; set; } + + public void Freeze(Int32 rows, Int32 columns) + { + SplitRow = rows; + SplitColumn = columns; + FreezePanes = true; + } + + public void FreezeColumns(Int32 columns) + { + SplitColumn = columns; + FreezePanes = true; + } + + public void FreezeRows(Int32 rows) + { + SplitRow = rows; + FreezePanes = true; + } + + public IXLSheetView SetView(XLSheetViewOptions value) + { + View = value; + return this; + } + } +} diff --git a/ClosedXML/Excel/XLTheme.cs b/ClosedXML/Excel/XLTheme.cs new file mode 100644 index 0000000..c8677a2 --- /dev/null +++ b/ClosedXML/Excel/XLTheme.cs @@ -0,0 +1,66 @@ +using System; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLTheme : IXLTheme + { + public XLColor Background1 { get; set; } + public XLColor Text1 { get; set; } + public XLColor Background2 { get; set; } + public XLColor Text2 { get; set; } + public XLColor Accent1 { get; set; } + public XLColor Accent2 { get; set; } + public XLColor Accent3 { get; set; } + public XLColor Accent4 { get; set; } + public XLColor Accent5 { get; set; } + public XLColor Accent6 { get; set; } + public XLColor Hyperlink { get; set; } + public XLColor FollowedHyperlink { get; set; } + + public XLColor ResolveThemeColor(XLThemeColor themeColor) + { + switch (themeColor) + { + case XLThemeColor.Background1: + return Background1; + + case XLThemeColor.Text1: + return Text1; + + case XLThemeColor.Background2: + return Background2; + + case XLThemeColor.Text2: + return Text2; + + case XLThemeColor.Accent1: + return Accent1; + + case XLThemeColor.Accent2: + return Accent2; + + case XLThemeColor.Accent3: + return Accent3; + + case XLThemeColor.Accent4: + return Accent4; + + case XLThemeColor.Accent5: + return Accent5; + + case XLThemeColor.Accent6: + return Accent6; + + case XLThemeColor.Hyperlink: + return Hyperlink; + + case XLThemeColor.FollowedHyperlink: + return FollowedHyperlink; + + default: + return null; + } + } + } +} diff --git a/ClosedXML/Excel/XLWorkbook.cs b/ClosedXML/Excel/XLWorkbook.cs new file mode 100644 index 0000000..488beb3 --- /dev/null +++ b/ClosedXML/Excel/XLWorkbook.cs @@ -0,0 +1,1072 @@ +using ClosedXML.Excel.CalcEngine; +using DocumentFormat.OpenXml; +using System; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.IO; +using System.Linq; +using static ClosedXML.Excel.XLProtectionAlgorithm; + +namespace ClosedXML.Excel +{ + public enum XLEventTracking { Enabled, Disabled } + + public enum XLCalculateMode + { + Auto, + AutoNoTable, + Manual, + Default + }; + + public enum XLReferenceStyle + { + R1C1, + A1, + Default + }; + + public enum XLCellSetValueBehavior + { + /// + /// Analyze input string and convert value. For avoid analyzing use escape symbol ' + /// + Smart = 0, + + /// + /// Direct set value. If value has unsupported type - value will be stored as string returned by + /// + Simple = 1, + } + + public partial class XLWorkbook : IXLWorkbook + { + #region Static + + public static IXLStyle DefaultStyle + { + get + { + return XLStyle.Default; + } + } + + internal static XLStyleValue DefaultStyleValue + { + get + { + return XLStyleValue.Default; + } + } + + public static Double DefaultRowHeight { get; private set; } + public static Double DefaultColumnWidth { get; private set; } + + public static IXLPageSetup DefaultPageOptions + { + get + { + var defaultPageOptions = new XLPageSetup(null, null) + { + PageOrientation = XLPageOrientation.Default, + Scale = 100, + PaperSize = XLPaperSize.LetterPaper, + Margins = new XLMargins + { + Top = 0.75, + Bottom = 0.5, + Left = 0.75, + Right = 0.75, + Header = 0.5, + Footer = 0.75 + }, + ScaleHFWithDocument = true, + AlignHFWithMargins = true, + PrintErrorValue = XLPrintErrorValues.Displayed, + ShowComments = XLShowCommentsValues.None + }; + return defaultPageOptions; + } + } + + public static IXLOutline DefaultOutline + { + get + { + return new XLOutline(null) + { + SummaryHLocation = XLOutlineSummaryHLocation.Right, + SummaryVLocation = XLOutlineSummaryVLocation.Bottom + }; + } + } + + /// + /// Behavior for + /// + public static XLCellSetValueBehavior CellSetValueBehavior { get; set; } + + public static XLWorkbook OpenFromTemplate(String path) + { + return new XLWorkbook(path, asTemplate: true); + } + + #endregion Static + + internal readonly List UnsupportedSheets = + new List(); + + public XLEventTracking EventTracking { get; set; } + + /// + /// Counter increasing at workbook data change. Serves to determine if the cell formula + /// has to be recalculated. + /// + internal long RecalculationCounter { get; private set; } + + /// + /// Notify that workbook data has been changed which means that cached formula values + /// need to be re-evaluated. + /// + internal void InvalidateFormulas() + { + RecalculationCounter++; + } + + #region Nested Type : XLLoadSource + + private enum XLLoadSource + { + New, + File, + Stream + }; + + #endregion Nested Type : XLLoadSource + + internal XLWorksheets WorksheetsInternal { get; private set; } + + /// + /// Gets an object to manipulate the worksheets. + /// + public IXLWorksheets Worksheets + { + get { return WorksheetsInternal; } + } + + /// + /// Gets an object to manipulate this workbook's named ranges. + /// + public IXLNamedRanges NamedRanges { get; private set; } + + /// + /// Gets an object to manipulate this workbook's theme. + /// + public IXLTheme Theme { get; private set; } + + /// + /// Gets or sets the default style for the workbook. + /// All new worksheets will use this style. + /// + public IXLStyle Style { get; set; } + + /// + /// Gets or sets the default row height for the workbook. + /// All new worksheets will use this row height. + /// + public Double RowHeight { get; set; } + + /// + /// Gets or sets the default column width for the workbook. + /// All new worksheets will use this column width. + /// + public Double ColumnWidth { get; set; } + + /// + /// Gets or sets the default page options for the workbook. + /// All new worksheets will use these page options. + /// + public IXLPageSetup PageOptions { get; set; } + + /// + /// Gets or sets the default outline options for the workbook. + /// All new worksheets will use these outline options. + /// + public IXLOutline Outline { get; set; } + + /// + /// Gets or sets the workbook's properties. + /// + public XLWorkbookProperties Properties { get; set; } + + /// + /// Gets or sets the workbook's calculation mode. + /// + public XLCalculateMode CalculateMode { get; set; } + + public Boolean CalculationOnSave { get; set; } + public Boolean ForceFullCalculation { get; set; } + public Boolean FullCalculationOnLoad { get; set; } + public Boolean FullPrecision { get; set; } + + /// + /// Gets or sets the workbook's reference style. + /// + public XLReferenceStyle ReferenceStyle { get; set; } + + public IXLCustomProperties CustomProperties { get; private set; } + + public Boolean ShowFormulas { get; set; } + public Boolean ShowGridLines { get; set; } + public Boolean ShowOutlineSymbols { get; set; } + public Boolean ShowRowColHeaders { get; set; } + public Boolean ShowRuler { get; set; } + public Boolean ShowWhiteSpace { get; set; } + public Boolean ShowZeros { get; set; } + public Boolean RightToLeft { get; set; } + + public Boolean DefaultShowFormulas + { + get { return false; } + } + + public Boolean DefaultShowGridLines + { + get { return true; } + } + + public Boolean DefaultShowOutlineSymbols + { + get { return true; } + } + + public Boolean DefaultShowRowColHeaders + { + get { return true; } + } + + public Boolean DefaultShowRuler + { + get { return true; } + } + + public Boolean DefaultShowWhiteSpace + { + get { return true; } + } + + public Boolean DefaultShowZeros + { + get { return true; } + } + + public IXLFileSharing FileSharing { get; } = new XLFileSharing(); + + public Boolean DefaultRightToLeft + { + get { return false; } + } + + private void InitializeTheme() + { + Theme = new XLTheme + { + Text1 = XLColor.FromHtml("#FF000000"), + Background1 = XLColor.FromHtml("#FFFFFFFF"), + Text2 = XLColor.FromHtml("#FF1F497D"), + Background2 = XLColor.FromHtml("#FFEEECE1"), + Accent1 = XLColor.FromHtml("#FF4F81BD"), + Accent2 = XLColor.FromHtml("#FFC0504D"), + Accent3 = XLColor.FromHtml("#FF9BBB59"), + Accent4 = XLColor.FromHtml("#FF8064A2"), + Accent5 = XLColor.FromHtml("#FF4BACC6"), + Accent6 = XLColor.FromHtml("#FFF79646"), + Hyperlink = XLColor.FromHtml("#FF0000FF"), + FollowedHyperlink = XLColor.FromHtml("#FF800080") + }; + } + + public IXLNamedRange NamedRange(String rangeName) + { + if (rangeName.Contains("!")) + { + var split = rangeName.Split('!'); + var first = split[0]; + var wsName = first.StartsWith("'") ? first.Substring(1, first.Length - 2) : first; + var name = split[1]; + if (TryGetWorksheet(wsName, out IXLWorksheet ws)) + { + var range = ws.NamedRange(name); + return range ?? NamedRange(name); + } + return null; + } + return NamedRanges.NamedRange(rangeName); + } + + public Boolean TryGetWorksheet(String name, out IXLWorksheet worksheet) + { + return Worksheets.TryGetWorksheet(name, out worksheet); + } + + public IXLRange RangeFromFullAddress(String rangeAddress, out IXLWorksheet ws) + { + ws = null; + if (!rangeAddress.Contains('!')) return null; + + var split = rangeAddress.Split('!'); + var wsName = split[0].UnescapeSheetName(); + if (TryGetWorksheet(wsName, out ws)) + { + return ws.Range(split[1]); + } + return null; + } + + public IXLCell CellFromFullAddress(String cellAddress, out IXLWorksheet ws) + { + ws = null; + if (!cellAddress.Contains('!')) return null; + + var split = cellAddress.Split('!'); + var wsName = split[0].UnescapeSheetName(); + if (TryGetWorksheet(wsName, out ws)) + { + return ws.Cell(split[1]); + } + return null; + } + + /// + /// Saves the current workbook. + /// + public void Save() + { +#if DEBUG + Save(true, false); +#else + Save(false, false); +#endif + } + + /// + /// Saves the current workbook and optionally performs validation + /// + public void Save(Boolean validate, Boolean evaluateFormulae = false) + { + Save(new SaveOptions + { + ValidatePackage = validate, + EvaluateFormulasBeforeSaving = evaluateFormulae, + GenerateCalculationChain = true + }); + } + + public void Save(SaveOptions options) + { + checkForWorksheetsPresent(); + if (_loadSource == XLLoadSource.New) + throw new InvalidOperationException("This is a new file. Please use one of the 'SaveAs' methods."); + + if (_loadSource == XLLoadSource.Stream) + { + CreatePackage(_originalStream, false, _spreadsheetDocumentType, options); + } + else + CreatePackage(_originalFile, _spreadsheetDocumentType, options); + } + + /// + /// Saves the current workbook to a file. + /// + public void SaveAs(String file) + { +#if DEBUG + SaveAs(file, true, false); +#else + SaveAs(file, false, false); +#endif + } + + /// + /// Saves the current workbook to a file and optionally validates it. + /// + public void SaveAs(String file, Boolean validate, Boolean evaluateFormulae = false) + { + SaveAs(file, new SaveOptions + { + ValidatePackage = validate, + EvaluateFormulasBeforeSaving = evaluateFormulae, + GenerateCalculationChain = true + }); + } + + public void SaveAs(String file, SaveOptions options) + { + checkForWorksheetsPresent(); + PathHelper.CreateDirectory(Path.GetDirectoryName(file)); + if (_loadSource == XLLoadSource.New) + { + if (File.Exists(file)) + File.Delete(file); + + CreatePackage(file, GetSpreadsheetDocumentType(file), options); + } + else if (_loadSource == XLLoadSource.File) + { + if (String.Compare(_originalFile.Trim(), file.Trim(), true) != 0) + { + File.Copy(_originalFile, file, true); + File.SetAttributes(file, FileAttributes.Normal); + } + + CreatePackage(file, GetSpreadsheetDocumentType(file), options); + } + else if (_loadSource == XLLoadSource.Stream) + { + _originalStream.Position = 0; + + using (var fileStream = File.Create(file)) + { + CopyStream(_originalStream, fileStream); + CreatePackage(fileStream, false, _spreadsheetDocumentType, options); + } + } + + _loadSource = XLLoadSource.File; + _originalFile = file; + _originalStream = null; + } + + private static SpreadsheetDocumentType GetSpreadsheetDocumentType(string filePath) + { + var extension = Path.GetExtension(filePath); + + if (string.IsNullOrEmpty(extension)) throw new ArgumentException("Empty extension is not supported."); + extension = extension.Substring(1).ToLowerInvariant(); + + switch (extension) + { + case "xlsm": + return SpreadsheetDocumentType.MacroEnabledWorkbook; + + case "xltm": + return SpreadsheetDocumentType.MacroEnabledTemplate; + + case "xlsx": + return SpreadsheetDocumentType.Workbook; + + case "xltx": + return SpreadsheetDocumentType.Template; + + default: + throw new ArgumentException(String.Format("Extension '{0}' is not supported. Supported extensions are '.xlsx', '.xlsm', '.xltx' and '.xltm'.", extension)); + } + } + + private void checkForWorksheetsPresent() + { + if (!Worksheets.Any()) + throw new InvalidOperationException("Workbooks need at least one worksheet."); + } + + /// + /// Saves the current workbook to a stream. + /// + public void SaveAs(Stream stream) + { +#if DEBUG + SaveAs(stream, true, false); +#else + SaveAs(stream, false, false); +#endif + } + + /// + /// Saves the current workbook to a stream and optionally validates it. + /// + public void SaveAs(Stream stream, Boolean validate, Boolean evaluateFormulae = false) + { + SaveAs(stream, new SaveOptions + { + ValidatePackage = validate, + EvaluateFormulasBeforeSaving = evaluateFormulae, + GenerateCalculationChain = true + }); + } + + public void SaveAs(Stream stream, SaveOptions options) + { + checkForWorksheetsPresent(); + if (_loadSource == XLLoadSource.New) + { + // dm 20130422, this method or better the method SpreadsheetDocument.Create which is called + // inside of 'CreatePackage' need a stream which CanSeek & CanRead + // and an ordinary Response stream of a webserver can't do this + // so we have to ask and provide a way around this + if (stream.CanRead && stream.CanSeek && stream.CanWrite) + { + // all is fine the package can be created in a direct way + CreatePackage(stream, true, _spreadsheetDocumentType, options); + } + else + { + // the harder way + using (var ms = new MemoryStream()) + { + CreatePackage(ms, true, _spreadsheetDocumentType, options); + // not really nessesary, because I changed CopyStream too. + // but for better understanding and if somebody in the future + // provide an changed version of CopyStream + ms.Position = 0; + CopyStream(ms, stream); + } + } + } + else if (_loadSource == XLLoadSource.File) + { + using (var fileStream = new FileStream(_originalFile, FileMode.Open, FileAccess.Read)) + { + CopyStream(fileStream, stream); + } + CreatePackage(stream, false, _spreadsheetDocumentType, options); + } + else if (_loadSource == XLLoadSource.Stream) + { + _originalStream.Position = 0; + if (_originalStream != stream) + CopyStream(_originalStream, stream); + + CreatePackage(stream, false, _spreadsheetDocumentType, options); + } + + _loadSource = XLLoadSource.Stream; + _originalStream = stream; + _originalFile = null; + } + + internal static void CopyStream(Stream input, Stream output) + { + var buffer = new byte[8 * 1024]; + int len; + // dm 20130422, it is always a good idea to rewind the input stream, or not? + if (input.CanSeek) + input.Seek(0, SeekOrigin.Begin); + while ((len = input.Read(buffer, 0, buffer.Length)) > 0) + output.Write(buffer, 0, len); + // dm 20130422, and flushing the output after write + output.Flush(); + } + + public IXLTable Table(string tableName, StringComparison comparisonType = StringComparison.OrdinalIgnoreCase) + { + var table = this.Worksheets + .SelectMany(ws => ws.Tables) + .FirstOrDefault(t => t.Name.Equals(tableName, comparisonType)); + + if (table == null) + throw new ArgumentOutOfRangeException($"Table {tableName} was not found."); + + return table; + } + + public IXLWorksheet Worksheet(String name) + { + return WorksheetsInternal.Worksheet(name); + } + + public IXLWorksheet Worksheet(Int32 position) + { + return WorksheetsInternal.Worksheet(position); + } + + public IXLCustomProperty CustomProperty(String name) + { + return CustomProperties.CustomProperty(name); + } + + public IXLCells FindCells(Func predicate) + { + var cells = new XLCells(false, XLCellsUsedOptions.AllContents); + foreach (XLWorksheet ws in WorksheetsInternal) + { + foreach (XLCell cell in ws.CellsUsed(XLCellsUsedOptions.All)) + { + if (predicate(cell)) + cells.Add(cell); + } + } + return cells; + } + + public IXLRows FindRows(Func predicate) + { + var rows = new XLRows(worksheet: null); + foreach (XLWorksheet ws in WorksheetsInternal) + { + foreach (IXLRow row in ws.Rows().Where(predicate)) + rows.Add(row as XLRow); + } + return rows; + } + + public IXLColumns FindColumns(Func predicate) + { + var columns = new XLColumns(worksheet: null); + foreach (XLWorksheet ws in WorksheetsInternal) + { + foreach (IXLColumn column in ws.Columns().Where(predicate)) + columns.Add(column as XLColumn); + } + return columns; + } + + /// + /// Searches the cells' contents for a given piece of text + /// + /// The search text. + /// The compare options. + /// if set to true search formulae instead of cell values. + /// + public IEnumerable Search(String searchText, CompareOptions compareOptions = CompareOptions.Ordinal, Boolean searchFormulae = false) + { + foreach (var ws in WorksheetsInternal) + { + foreach (var cell in ws.Search(searchText, compareOptions, searchFormulae)) + yield return cell; + } + } + + #region Fields + + private XLLoadSource _loadSource = XLLoadSource.New; + private String _originalFile; + private Stream _originalStream; + private XLWorkbookProtection _workbookProtection; + + #endregion Fields + + #region Constructor + + /// + /// Creates a new Excel workbook. + /// + public XLWorkbook() + : this(XLEventTracking.Enabled) + { + } + + internal XLWorkbook(String file, Boolean asTemplate) + : this(XLEventTracking.Enabled) + { + LoadSheetsFromTemplate(file); + } + + public XLWorkbook(XLEventTracking eventTracking) + { + EventTracking = eventTracking; + Protection = new XLWorkbookProtection(DefaultProtectionAlgorithm); + DefaultRowHeight = 15; + DefaultColumnWidth = 8.43; + Style = new XLStyle(null, DefaultStyle); + RowHeight = DefaultRowHeight; + ColumnWidth = DefaultColumnWidth; + PageOptions = DefaultPageOptions; + Outline = DefaultOutline; + Properties = new XLWorkbookProperties(); + CalculateMode = XLCalculateMode.Default; + ReferenceStyle = XLReferenceStyle.Default; + InitializeTheme(); + ShowFormulas = DefaultShowFormulas; + ShowGridLines = DefaultShowGridLines; + ShowOutlineSymbols = DefaultShowOutlineSymbols; + ShowRowColHeaders = DefaultShowRowColHeaders; + ShowRuler = DefaultShowRuler; + ShowWhiteSpace = DefaultShowWhiteSpace; + ShowZeros = DefaultShowZeros; + RightToLeft = DefaultRightToLeft; + WorksheetsInternal = new XLWorksheets(this); + NamedRanges = new XLNamedRanges(this); + CustomProperties = new XLCustomProperties(this); + ShapeIdManager = new XLIdManager(); + Author = Environment.UserName; + } + + public XLWorkbook(LoadOptions loadOptions) + : this(loadOptions.EventTracking) + { + } + + /// + /// Opens an existing workbook from a file. + /// + /// The file to open. + public XLWorkbook(String file) + : this(file, XLEventTracking.Enabled) + { + } + + public XLWorkbook(String file, XLEventTracking eventTracking) + : this(eventTracking) + { + _loadSource = XLLoadSource.File; + _originalFile = file; + _spreadsheetDocumentType = GetSpreadsheetDocumentType(_originalFile); + Load(file); + } + + public XLWorkbook(String file, LoadOptions loadOptions) + : this(file, loadOptions.EventTracking) + { + if (loadOptions.RecalculateAllFormulas) + this.RecalculateAllFormulas(); + } + + /// + /// Opens an existing workbook from a stream. + /// + /// The stream to open. + public XLWorkbook(Stream stream) + : this(stream, XLEventTracking.Enabled) + { + } + + public XLWorkbook(Stream stream, XLEventTracking eventTracking) + : this(eventTracking) + { + _loadSource = XLLoadSource.Stream; + _originalStream = stream; + Load(stream); + } + + public XLWorkbook(Stream stream, LoadOptions loadOptions) + : this(stream, loadOptions.EventTracking) + { + if (loadOptions.RecalculateAllFormulas) + this.RecalculateAllFormulas(); + } + + #endregion Constructor + + #region Nested type: UnsupportedSheet + + internal sealed class UnsupportedSheet + { + public Boolean IsActive; + public UInt32 SheetId; + public Int32 Position; + } + + #endregion Nested type: UnsupportedSheet + + public IXLCell Cell(String namedCell) + { + var namedRange = NamedRange(namedCell); + if (namedRange != null) + { + return namedRange.Ranges?.FirstOrDefault()?.FirstCell(); + } + else + return CellFromFullAddress(namedCell, out _); + } + + public IXLCells Cells(String namedCells) + { + return Ranges(namedCells).Cells(); + } + + public IXLRange Range(String range) + { + var namedRange = NamedRange(range); + if (namedRange != null) + return namedRange.Ranges.FirstOrDefault(); + else + return RangeFromFullAddress(range, out _); + } + + public IXLRanges Ranges(String ranges) + { + var retVal = new XLRanges(); + var rangePairs = ranges.Split(','); + foreach (var range in rangePairs.Select(r => Range(r.Trim())).Where(range => range != null)) + { + retVal.Add(range); + } + return retVal; + } + + internal XLIdManager ShapeIdManager { get; private set; } + + // Used by Janitor.Fody + private void DisposeManaged() + { + Worksheets.ForEach(w => (w as XLWorksheet).Cleanup()); + } + +#if _NET40_ + public void Dispose() + { + // net40 doesn't support Janitor.Fody, so let's dispose manually + DisposeManaged(); + } +#else + + public void Dispose() + { + // Leave this empty (for non net40 targets) so that Janitor.Fody can do its work + } + +#endif + + public Boolean Use1904DateSystem { get; set; } + + public XLWorkbook SetUse1904DateSystem() + { + return SetUse1904DateSystem(true); + } + + public XLWorkbook SetUse1904DateSystem(Boolean value) + { + Use1904DateSystem = value; + return this; + } + + public IXLWorksheet AddWorksheet() + { + return Worksheets.Add(); + } + + public IXLWorksheet AddWorksheet(Int32 position) + { + return Worksheets.Add(position); + } + + public IXLWorksheet AddWorksheet(String sheetName) + { + return Worksheets.Add(sheetName); + } + + public IXLWorksheet AddWorksheet(String sheetName, Int32 position) + { + return Worksheets.Add(sheetName, position); + } + + public IXLWorksheet AddWorksheet(DataTable dataTable) + { + return Worksheets.Add(dataTable); + } + + public void AddWorksheet(DataSet dataSet) + { + Worksheets.Add(dataSet); + } + + public void AddWorksheet(IXLWorksheet worksheet) + { + worksheet.CopyTo(this, worksheet.Name); + } + + public IXLWorksheet AddWorksheet(DataTable dataTable, String sheetName) + { + return Worksheets.Add(dataTable, sheetName); + } + + private XLCalcEngine _calcEngine; + + private XLCalcEngine CalcEngine + { + get { return _calcEngine ?? (_calcEngine = new XLCalcEngine(this)); } + } + + public Object Evaluate(String expression) + { + return CalcEngine.Evaluate(expression); + } + + /// + /// Force recalculation of all cell formulas. + /// + public void RecalculateAllFormulas() + { + InvalidateFormulas(); + Worksheets.ForEach(sheet => sheet.RecalculateAllFormulas()); + } + + private static XLCalcEngine _calcEngineExpr; + private SpreadsheetDocumentType _spreadsheetDocumentType; + + private static XLCalcEngine CalcEngineExpr + { + get { return _calcEngineExpr ?? (_calcEngineExpr = new XLCalcEngine()); } + } + + public static Object EvaluateExpr(String expression) + { + return CalcEngineExpr.Evaluate(expression); + } + + public String Author { get; set; } + + public Boolean LockStructure + { + get => Protection.IsProtected && !Protection.AllowedElements.HasFlag(XLWorkbookProtectionElements.Structure); + set + { + if (!Protection.IsProtected) + throw new InvalidOperationException($"Enable workbook protection before setting the {nameof(LockStructure)} property"); + + Protection.AllowElement(XLWorkbookProtectionElements.Structure, value); + } + } + + public XLWorkbook SetLockStructure(Boolean value) + { + LockStructure = value; return this; + } + + public Boolean LockWindows + { + get => Protection.IsProtected && !Protection.AllowedElements.HasFlag(XLWorkbookProtectionElements.Windows); + set + { + if (!Protection.IsProtected) + throw new InvalidOperationException($"Enable workbook protection before setting the {nameof(LockWindows)} property"); + + Protection.AllowElement(XLWorkbookProtectionElements.Windows, value); + } + } + + public XLWorkbook SetLockWindows(Boolean value) + { + LockWindows = value; return this; + } + + public Boolean IsPasswordProtected => Protection.IsPasswordProtected; + public Boolean IsProtected => Protection.IsProtected; + + IXLWorkbookProtection IXLProtectable.Protection + { + get => Protection; + set => Protection = value as XLWorkbookProtection; + } + + internal XLWorkbookProtection Protection + { + get => _workbookProtection; + set + { + _workbookProtection = value.Clone().CastTo(); + } + } + + [Obsolete("Use Protect(String password, Algorithm algorithm, TElement allowedElements)")] + public IXLWorkbookProtection Protect(Boolean lockStructure, Boolean lockWindows, String password) + { + var allowedElements = XLWorkbookProtectionElements.Everything; + + var protection = Protection.Protect(password, DefaultProtectionAlgorithm, allowedElements); + + if (lockStructure) + protection.DisallowElement(XLWorkbookProtectionElements.Structure); + + if (lockWindows) + protection.DisallowElement(XLWorkbookProtectionElements.Windows); + + return protection; + } + + public IXLWorkbookProtection Protect() + { + return Protection.Protect(); + } + + [Obsolete("Use Protect(String password, Algorithm algorithm, TElement allowedElements)")] + public IXLWorkbookProtection Protect(Boolean lockStructure) + { + return Protect(lockStructure, lockWindows: false, password: null); + } + + [Obsolete("Use Protect(String password, Algorithm algorithm, TElement allowedElements)")] + public IXLWorkbookProtection Protect(Boolean lockStructure, Boolean lockWindows) + { + return Protect(lockStructure, lockWindows, null); + } + + public IXLWorkbookProtection Protect(String password, Algorithm algorithm = DefaultProtectionAlgorithm) + + { + return Protect(password, algorithm, XLWorkbookProtectionElements.Windows); + } + + public IXLWorkbookProtection Protect(String password, Algorithm algorithm, XLWorkbookProtectionElements allowedElements) + { + return Protection.Protect(password, algorithm, allowedElements); + } + + IXLElementProtection IXLProtectable.Protect() + { + return Protect(); + } + + IXLElementProtection IXLProtectable.Protect(string password, Algorithm algorithm) + { + return Protect(password, algorithm); + } + + public IXLWorkbookProtection Unprotect() + { + return Protection.Unprotect(); + } + + public IXLWorkbookProtection Unprotect(String password) + { + return Protection.Unprotect(password); + } + + IXLElementProtection IXLProtectable.Unprotect() + { + return Unprotect(); + } + + IXLElementProtection IXLProtectable.Unprotect(String password) + { + return Unprotect(password); + } + + public override string ToString() + { + switch (_loadSource) + { + case XLLoadSource.New: + return "XLWorkbook(new)"; + + case XLLoadSource.File: + return String.Format("XLWorkbook({0})", _originalFile); + + case XLLoadSource.Stream: + return String.Format("XLWorkbook({0})", _originalStream.ToString()); + + default: + throw new NotImplementedException(); + } + } + + public void SuspendEvents() + { + foreach (var ws in WorksheetsInternal) + { + ws.SuspendEvents(); + } + } + + public void ResumeEvents() + { + foreach (var ws in WorksheetsInternal) + { + ws.ResumeEvents(); + } + } + } +} diff --git a/ClosedXML/Excel/XLWorkbookProperties.cs b/ClosedXML/Excel/XLWorkbookProperties.cs new file mode 100644 index 0000000..e9d2bcb --- /dev/null +++ b/ClosedXML/Excel/XLWorkbookProperties.cs @@ -0,0 +1,25 @@ +using System; + +namespace ClosedXML.Excel +{ + public class XLWorkbookProperties + { + public XLWorkbookProperties() + { + Company = null; + Manager = null; + } + public String Author { get; set; } + public String Title { get; set; } + public String Subject { get; set; } + public String Category { get; set; } + public String Keywords { get; set; } + public String Comments { get; set; } + public String Status { get; set; } + public DateTime Created { get; set; } + public DateTime Modified { get; set; } + public String LastModifiedBy { get; set; } + public String Company { get; set; } + public String Manager { get; set; } + } +} diff --git a/ClosedXML/Excel/XLWorkbook_ImageHandling.cs b/ClosedXML/Excel/XLWorkbook_ImageHandling.cs new file mode 100644 index 0000000..8ea8d29 --- /dev/null +++ b/ClosedXML/Excel/XLWorkbook_ImageHandling.cs @@ -0,0 +1,72 @@ +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Drawing.Spreadsheet; +using DocumentFormat.OpenXml.Packaging; +using System; +using System.Linq; + +using Xdr = DocumentFormat.OpenXml.Drawing.Spreadsheet; + +namespace ClosedXML.Excel +{ + public partial class XLWorkbook + { + public static OpenXmlElement GetAnchorFromImageId(WorksheetPart worksheetPart, string relId) + { + var drawingsPart = worksheetPart.DrawingsPart; + var matchingAnchor = drawingsPart.WorksheetDrawing + .Where(wsdr => wsdr.Descendants() + .Any(x => x?.Blip?.Embed?.Value.Equals(relId) ?? false) + ); + + if (!matchingAnchor.Any()) + return null; + else + return matchingAnchor.First(); + } + + public static OpenXmlElement GetAnchorFromImageIndex(WorksheetPart worksheetPart, Int32 index) + { + var drawingsPart = worksheetPart.DrawingsPart; + var matchingAnchor = drawingsPart.WorksheetDrawing + .Where(wsdr => wsdr.Descendants() + .Any(x => x.Id.Value.Equals(Convert.ToUInt32(index + 1))) + ); + + if (!matchingAnchor.Any()) + return null; + else + return matchingAnchor.First(); + } + + public static NonVisualDrawingProperties GetPropertiesFromAnchor(OpenXmlElement anchor) + { + if (!IsAllowedAnchor(anchor)) + return null; + + // Maybe we should not restrict here, and just search for all NonVisualDrawingProperties in an anchor? + var shape = anchor.Descendants().Cast().FirstOrDefault() + ?? anchor.Descendants().Cast().FirstOrDefault(); + + if (shape == null) return null; + + return shape + .Descendants() + .FirstOrDefault(); + } + + public static String GetImageRelIdFromAnchor(OpenXmlElement anchor) + { + if (!IsAllowedAnchor(anchor)) + return null; + + var blipFill = anchor.Descendants().FirstOrDefault(); + return blipFill?.Blip?.Embed?.Value; + } + + private static bool IsAllowedAnchor(OpenXmlElement anchor) + { + var allowedAnchorTypes = new Type[] { typeof(AbsoluteAnchor), typeof(OneCellAnchor), typeof(TwoCellAnchor) }; + return (allowedAnchorTypes.Any(t => t == anchor.GetType())); + } + } +} diff --git a/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/Excel/XLWorkbook_Load.cs new file mode 100644 index 0000000..1c1bac9 --- /dev/null +++ b/ClosedXML/Excel/XLWorkbook_Load.cs @@ -0,0 +1,3269 @@ +using ClosedXML.Extensions; +using ClosedXML.Utils; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Spreadsheet; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml.Linq; +using Ap = DocumentFormat.OpenXml.ExtendedProperties; +using Op = DocumentFormat.OpenXml.CustomProperties; +using X14 = DocumentFormat.OpenXml.Office2010.Excel; +using Xdr = DocumentFormat.OpenXml.Drawing.Spreadsheet; + +namespace ClosedXML.Excel +{ + using Ap; + using Drawings; + using Op; + using System.Drawing; + + public partial class XLWorkbook + { + private readonly Dictionary _colorList = new Dictionary(); + + private void Load(String file) + { + LoadSheets(file); + } + + private void Load(Stream stream) + { + LoadSheets(stream); + } + + private void LoadSheets(String fileName) + { + using (var dSpreadsheet = SpreadsheetDocument.Open(fileName, false)) + LoadSpreadsheetDocument(dSpreadsheet); + } + + private void LoadSheets(Stream stream) + { + using (var dSpreadsheet = SpreadsheetDocument.Open(stream, false)) + LoadSpreadsheetDocument(dSpreadsheet); + } + + private void LoadSheetsFromTemplate(String fileName) + { + using (var dSpreadsheet = SpreadsheetDocument.CreateFromTemplate(fileName)) + LoadSpreadsheetDocument(dSpreadsheet); + + // If we load a workbook as a template, we have to treat it as a "new" workbook. + // The original file will NOT be copied into place before changes are applied + // Hence all loaded RelIds have to be cleared + ResetAllRelIds(); + } + + private void ResetAllRelIds() + { + foreach (var ws in Worksheets.Cast()) + { + ws.SheetId = 0; + ws.RelId = null; + + foreach (var pt in ws.PivotTables.Cast()) + { + pt.WorkbookCacheRelId = null; + pt.CacheDefinitionRelId = null; + pt.RelId = null; + } + + foreach (var picture in ws.Pictures.Cast()) + picture.RelId = null; + + foreach (var table in ws.Tables.Cast()) + table.RelId = null; + } + } + + private void LoadSpreadsheetDocument(SpreadsheetDocument dSpreadsheet) + { + ShapeIdManager = new XLIdManager(); + SetProperties(dSpreadsheet); + + SharedStringItem[] sharedStrings = null; + if (dSpreadsheet.WorkbookPart.GetPartsOfType().Any()) + { + var shareStringPart = dSpreadsheet.WorkbookPart.GetPartsOfType().First(); + sharedStrings = shareStringPart.SharedStringTable.Elements().ToArray(); + } + + if (dSpreadsheet.CustomFilePropertiesPart != null) + { + foreach (var m in dSpreadsheet.CustomFilePropertiesPart.Properties.Elements()) + { + String name = m.Name?.Value; + + if (string.IsNullOrWhiteSpace(name)) + continue; + + if (m.VTLPWSTR != null) + CustomProperties.Add(name, m.VTLPWSTR.Text); + else if (m.VTFileTime != null) + { + CustomProperties.Add(name, + DateTime.ParseExact(m.VTFileTime.Text, "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", + CultureInfo.InvariantCulture)); + } + else if (m.VTDouble != null) + CustomProperties.Add(name, Double.Parse(m.VTDouble.Text, CultureInfo.InvariantCulture)); + else if (m.VTBool != null) + CustomProperties.Add(name, m.VTBool.Text == "true"); + } + } + + var wbProps = dSpreadsheet.WorkbookPart.Workbook.WorkbookProperties; + if (wbProps != null) + Use1904DateSystem = OpenXmlHelper.GetBooleanValueAsBool(wbProps.Date1904, false); + + var wbFilesharing = dSpreadsheet.WorkbookPart.Workbook.FileSharing; + if (wbFilesharing != null) + { + FileSharing.ReadOnlyRecommended = OpenXmlHelper.GetBooleanValueAsBool(wbFilesharing.ReadOnlyRecommended, false); + FileSharing.UserName = wbFilesharing.UserName?.Value; + } + + LoadWorkbookProtection(dSpreadsheet.WorkbookPart.Workbook.WorkbookProtection, this); + + var calculationProperties = dSpreadsheet.WorkbookPart.Workbook.CalculationProperties; + if (calculationProperties != null) + { + var calculateMode = calculationProperties.CalculationMode; + if (calculateMode != null) + CalculateMode = calculateMode.Value.ToClosedXml(); + + var calculationOnSave = calculationProperties.CalculationOnSave; + if (calculationOnSave != null) + CalculationOnSave = calculationOnSave.Value; + + var forceFullCalculation = calculationProperties.ForceFullCalculation; + if (forceFullCalculation != null) + ForceFullCalculation = forceFullCalculation.Value; + + var fullCalculationOnLoad = calculationProperties.FullCalculationOnLoad; + if (fullCalculationOnLoad != null) + FullCalculationOnLoad = fullCalculationOnLoad.Value; + + var fullPrecision = calculationProperties.FullPrecision; + if (fullPrecision != null) + FullPrecision = fullPrecision.Value; + + var referenceMode = calculationProperties.ReferenceMode; + if (referenceMode != null) + ReferenceStyle = referenceMode.Value.ToClosedXml(); + } + + var efp = dSpreadsheet.ExtendedFilePropertiesPart; + if (efp != null && efp.Properties != null) + { + if (efp.Properties.Elements().Any()) + Properties.Company = efp.Properties.GetFirstChild().Text; + + if (efp.Properties.Elements().Any()) + Properties.Manager = efp.Properties.GetFirstChild().Text; + } + + Stylesheet s = null; + if (dSpreadsheet.WorkbookPart.WorkbookStylesPart != null && + dSpreadsheet.WorkbookPart.WorkbookStylesPart.Stylesheet != null) + { + s = dSpreadsheet.WorkbookPart.WorkbookStylesPart.Stylesheet; + } + + NumberingFormats numberingFormats = s == null ? null : s.NumberingFormats; + Fills fills = s == null ? null : s.Fills; + Borders borders = s == null ? null : s.Borders; + Fonts fonts = s == null ? null : s.Fonts; + Int32 dfCount = 0; + Dictionary differentialFormats; + if (s != null && s.DifferentialFormats != null) + differentialFormats = s.DifferentialFormats.Elements().ToDictionary(k => dfCount++); + else + differentialFormats = new Dictionary(); + + var sheets = dSpreadsheet.WorkbookPart.Workbook.Sheets; + Int32 position = 0; + foreach (var dSheet in sheets.OfType()) + { + position++; + var sharedFormulasR1C1 = new Dictionary(); + + var worksheetPart = dSpreadsheet.WorkbookPart.GetPartById(dSheet.Id) as WorksheetPart; + + if (worksheetPart == null) + { + UnsupportedSheets.Add(new UnsupportedSheet { SheetId = dSheet.SheetId.Value, Position = position }); + continue; + } + + var sheetName = dSheet.Name; + + var ws = (XLWorksheet)WorksheetsInternal.Add(sheetName, position); + ws.RelId = dSheet.Id; + ws.SheetId = (Int32)dSheet.SheetId.Value; + + if (dSheet.State != null) + ws.Visibility = dSheet.State.Value.ToClosedXml(); + + ApplyStyle(ws, 0, s, fills, borders, fonts, numberingFormats); + + var styleList = new Dictionary();// {{0, ws.Style}}; + PageSetupProperties pageSetupProperties = null; + + lastRow = 0; + + using (var reader = OpenXmlReader.Create(worksheetPart)) + { + Type[] ignoredElements = new Type[] + { + typeof(CustomSheetViews) // Custom sheet views contain its own auto filter data, and more, which should be ignored for now + }; + + while (reader.Read()) + { + while (ignoredElements.Contains(reader.ElementType)) + reader.ReadNextSibling(); + + if (reader.ElementType == typeof(SheetFormatProperties)) + { + var sheetFormatProperties = (SheetFormatProperties)reader.LoadCurrentElement(); + if (sheetFormatProperties != null) + { + if (sheetFormatProperties.DefaultRowHeight != null) + ws.RowHeight = sheetFormatProperties.DefaultRowHeight; + + ws.RowHeightChanged = (sheetFormatProperties.CustomHeight != null && + sheetFormatProperties.CustomHeight.Value); + + if (sheetFormatProperties.DefaultColumnWidth != null) + { + ws.ColumnWidth = sheetFormatProperties.DefaultColumnWidth; + } + } + } + else if (reader.ElementType == typeof(SheetViews)) + LoadSheetViews((SheetViews)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(MergeCells)) + { + var mergedCells = (MergeCells)reader.LoadCurrentElement(); + if (mergedCells != null) + { + foreach (MergeCell mergeCell in mergedCells.Elements()) + ws.Range(mergeCell.Reference).Merge(false); + } + } + else if (reader.ElementType == typeof(Columns)) + LoadColumns(s, numberingFormats, fills, borders, fonts, ws, + (Columns)reader.LoadCurrentElement()); + else if (reader.ElementType == typeof(Row)) + { + LoadRows(s, numberingFormats, fills, borders, fonts, ws, sharedStrings, sharedFormulasR1C1, + styleList, (Row)reader.LoadCurrentElement()); + } + else if (reader.ElementType == typeof(AutoFilter)) + LoadAutoFilter((AutoFilter)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(SheetProtection)) + LoadSheetProtection((SheetProtection)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(DataValidations)) + LoadDataValidations((DataValidations)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(ConditionalFormatting)) + LoadConditionalFormatting((ConditionalFormatting)reader.LoadCurrentElement(), ws, differentialFormats); + else if (reader.ElementType == typeof(Hyperlinks)) + LoadHyperlinks((Hyperlinks)reader.LoadCurrentElement(), worksheetPart, ws); + else if (reader.ElementType == typeof(PrintOptions)) + LoadPrintOptions((PrintOptions)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(PageMargins)) + LoadPageMargins((PageMargins)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(PageSetup)) + LoadPageSetup((PageSetup)reader.LoadCurrentElement(), ws, pageSetupProperties); + else if (reader.ElementType == typeof(HeaderFooter)) + LoadHeaderFooter((HeaderFooter)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(SheetProperties)) + LoadSheetProperties((SheetProperties)reader.LoadCurrentElement(), ws, out pageSetupProperties); + else if (reader.ElementType == typeof(RowBreaks)) + LoadRowBreaks((RowBreaks)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(ColumnBreaks)) + LoadColumnBreaks((ColumnBreaks)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(WorksheetExtensionList)) + LoadExtensions((WorksheetExtensionList)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(LegacyDrawing)) + ws.LegacyDrawingId = (reader.LoadCurrentElement() as LegacyDrawing).Id.Value; + } + reader.Close(); + } + + (ws.ConditionalFormats as XLConditionalFormats).ReorderAccordingToOriginalPriority(); + + #region LoadTables + + foreach (var tableDefinitionPart in worksheetPart.TableDefinitionParts) + { + var relId = worksheetPart.GetIdOfPart(tableDefinitionPart); + var dTable = tableDefinitionPart.Table; + + String reference = dTable.Reference.Value; + String tableName = dTable.Name ?? dTable.DisplayName ?? string.Empty; + if (String.IsNullOrWhiteSpace(tableName)) + throw new InvalidDataException("The table name is missing."); + + var xlTable = ws.Range(reference).CreateTable(tableName, false) as XLTable; + xlTable.RelId = relId; + + if (dTable.HeaderRowCount != null && dTable.HeaderRowCount == 0) + { + xlTable._showHeaderRow = false; + //foreach (var tableColumn in dTable.TableColumns.Cast()) + xlTable.AddFields(dTable.TableColumns.Cast().Select(t => GetTableColumnName(t.Name.Value))); + } + else + { + xlTable.InitializeAutoFilter(); + } + + if (dTable.TotalsRowCount != null && dTable.TotalsRowCount.Value > 0) + ((XLTable)xlTable)._showTotalsRow = true; + + if (dTable.TableStyleInfo != null) + { + if (dTable.TableStyleInfo.ShowFirstColumn != null) + xlTable.EmphasizeFirstColumn = dTable.TableStyleInfo.ShowFirstColumn.Value; + if (dTable.TableStyleInfo.ShowLastColumn != null) + xlTable.EmphasizeLastColumn = dTable.TableStyleInfo.ShowLastColumn.Value; + if (dTable.TableStyleInfo.ShowRowStripes != null) + xlTable.ShowRowStripes = dTable.TableStyleInfo.ShowRowStripes.Value; + if (dTable.TableStyleInfo.ShowColumnStripes != null) + xlTable.ShowColumnStripes = dTable.TableStyleInfo.ShowColumnStripes.Value; + if (dTable.TableStyleInfo.Name != null) + { + var theme = XLTableTheme.FromName(dTable.TableStyleInfo.Name.Value); + if (theme != null) + xlTable.Theme = theme; + else + xlTable.Theme = new XLTableTheme(dTable.TableStyleInfo.Name.Value); + } + else + xlTable.Theme = XLTableTheme.None; + } + + if (dTable.AutoFilter != null) + { + xlTable.ShowAutoFilter = true; + LoadAutoFilterColumns(dTable.AutoFilter, xlTable.AutoFilter); + } + else + xlTable.ShowAutoFilter = false; + + if (xlTable.ShowTotalsRow) + { + foreach (var tableColumn in dTable.TableColumns.Cast()) + { + var tableColumnName = GetTableColumnName(tableColumn.Name.Value); + if (tableColumn.TotalsRowFunction != null) + xlTable.Field(tableColumnName).TotalsRowFunction = + tableColumn.TotalsRowFunction.Value.ToClosedXml(); + + if (tableColumn.TotalsRowFormula != null) + xlTable.Field(tableColumnName).TotalsRowFormulaA1 = + tableColumn.TotalsRowFormula.Text; + + if (tableColumn.TotalsRowLabel != null) + xlTable.Field(tableColumnName).TotalsRowLabel = tableColumn.TotalsRowLabel.Value; + } + if (xlTable.AutoFilter != null) + xlTable.AutoFilter.Range = xlTable.Worksheet.Range( + xlTable.RangeAddress.FirstAddress.RowNumber, xlTable.RangeAddress.FirstAddress.ColumnNumber, + xlTable.RangeAddress.LastAddress.RowNumber - 1, xlTable.RangeAddress.LastAddress.ColumnNumber); + } + else if (xlTable.AutoFilter != null) + xlTable.AutoFilter.Range = xlTable.Worksheet.Range(xlTable.RangeAddress); + } + + #endregion LoadTables + + LoadDrawings(worksheetPart, ws); + + #region LoadComments + + if (worksheetPart.WorksheetCommentsPart != null) + { + var root = worksheetPart.WorksheetCommentsPart.Comments; + var authors = root.GetFirstChild().ChildElements.OfType().ToList(); + var comments = root.GetFirstChild().ChildElements.OfType().ToList(); + + // **** MAYBE FUTURE SHAPE SIZE SUPPORT + var shapes = GetCommentShapes(worksheetPart); + + for (var i = 0; i < comments.Count; i++) + { + var c = comments[i]; + + XElement shape = null; + if (i < shapes.Count) + shape = shapes[i]; + + // find cell by reference + var cell = ws.Cell(c.Reference); + + var shapeIdString = shape?.Attribute("id")?.Value; + if (shapeIdString?.StartsWith("_x0000_s") ?? false) + shapeIdString = shapeIdString.Substring(8); + + int? shapeId = int.TryParse(shapeIdString, out int sid) ? (int?)sid : null; + var xlComment = cell.CreateComment(shapeId); + + xlComment.Author = authors[(int)c.AuthorId.Value].InnerText; + ShapeIdManager.Add(xlComment.ShapeId); + + var runs = c.GetFirstChild().Elements(); + foreach (var run in runs) + { + var runProperties = run.RunProperties; + String text = run.Text.InnerText.FixNewLines(); + var rt = xlComment.AddText(text); + LoadFont(runProperties, rt); + } + + if (shape != null) + { + LoadShapeProperties(xlComment, shape); + + var clientData = shape.Elements().First(e => e.Name.LocalName == "ClientData"); + LoadClientData(xlComment, clientData); + + var textBox = shape.Elements().First(e => e.Name.LocalName == "textbox"); + LoadTextBox(xlComment, textBox); + + var alt = shape.Attribute("alt"); + if (alt != null) xlComment.Style.Web.SetAlternateText(alt.Value); + + LoadColorsAndLines(xlComment, shape); + + //var insetmode = (string)shape.Attributes().First(a=> a.Name.LocalName == "insetmode"); + //xlComment.Style.Margins.Automatic = insetmode != null && insetmode.Equals("auto"); + } + } + } + + #endregion LoadComments + } + + var workbook = dSpreadsheet.WorkbookPart.Workbook; + + var bookViews = workbook.BookViews; + if (bookViews != null && bookViews.FirstOrDefault() is WorkbookView workbookView) + { + if (workbookView.ActiveTab == null) + { + Worksheets.First().SetTabActive().Unhide(); + } + else + { + UnsupportedSheet unsupportedSheet = + UnsupportedSheets.FirstOrDefault(us => us.Position == (Int32)(workbookView.ActiveTab.Value + 1)); + if (unsupportedSheet != null) + unsupportedSheet.IsActive = true; + else + { + Worksheet((Int32)(workbookView.ActiveTab.Value + 1)).SetTabActive(); + } + } + } + LoadDefinedNames(workbook); + + #region Pivot tables + + // Delay loading of pivot tables until all sheets have been loaded + foreach (var dSheet in sheets.OfType()) + { + var worksheetPart = dSpreadsheet.WorkbookPart.GetPartById(dSheet.Id) as WorksheetPart; + + if (worksheetPart != null) + { + var ws = (XLWorksheet)WorksheetsInternal.Worksheet(dSheet.Name); + + foreach (var pivotTablePart in worksheetPart.PivotTableParts) + { + var pivotTableCacheDefinitionPart = pivotTablePart.PivotTableCacheDefinitionPart; + var pivotTableDefinition = pivotTablePart.PivotTableDefinition; + + var target = ws.FirstCell(); + if (pivotTableDefinition?.Location?.Reference?.HasValue ?? false) + { + ws.Range(pivotTableDefinition.Location.Reference.Value).Clear(XLClearOptions.All); + target = ws.Range(pivotTableDefinition.Location.Reference.Value).FirstCell(); + } + + IXLRange source = null; + XLPivotTableSourceType sourceType = XLPivotTableSourceType.Range; + if (pivotTableCacheDefinitionPart?.PivotCacheDefinition?.CacheSource?.WorksheetSource != null) + { + // TODO: Implement other sources besides worksheetSource + // But for now assume names and references point directly to a range + var wss = pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheSource.WorksheetSource; + + if (!String.IsNullOrEmpty(wss.Id)) + { + var externalRelationship = pivotTableCacheDefinitionPart.ExternalRelationships.FirstOrDefault(er => er.Id.Equals(wss.Id)); + if (externalRelationship?.IsExternal ?? false) + { + // We don't support external sources + continue; + } + } + + if (wss.Name != null) + { + var table = ws + .Workbook + .Worksheets + .SelectMany(ws1 => ws1.Tables) + .FirstOrDefault(t => t.Name.Equals(wss.Name.Value)); + + if (table != null) + { + sourceType = XLPivotTableSourceType.Table; + source = table; + } + else + { + sourceType = XLPivotTableSourceType.Range; + source = this.Range(wss.Name.Value); + } + } + else + { + sourceType = XLPivotTableSourceType.Range; + + IXLWorksheet sourceSheet; + if (wss.Sheet == null) + sourceSheet = ws; + else if (WorksheetsInternal.TryGetWorksheet(wss.Sheet.Value, out sourceSheet)) + source = this.Range(sourceSheet.Range(wss.Reference.Value).RangeAddress.ToStringRelative(includeSheet: true)); + } + + if (source == null) + continue; + } + + if (target != null && source != null) + { + XLPivotTable pt; + switch (sourceType) + { + case XLPivotTableSourceType.Range: + pt = ws.PivotTables.Add(pivotTableDefinition.Name, target, source) as XLPivotTable; + break; + + case XLPivotTableSourceType.Table: + pt = ws.PivotTables.Add(pivotTableDefinition.Name, target, source as XLTable) as XLPivotTable; + break; + + default: + throw new NotSupportedException($"Pivot table source type {sourceType} is not supported."); + } + + if (!String.IsNullOrWhiteSpace(StringValue.ToString(pivotTableDefinition?.ColumnHeaderCaption ?? String.Empty))) + pt.SetColumnHeaderCaption(StringValue.ToString(pivotTableDefinition.ColumnHeaderCaption)); + + if (!String.IsNullOrWhiteSpace(StringValue.ToString(pivotTableDefinition?.RowHeaderCaption ?? String.Empty))) + pt.SetRowHeaderCaption(StringValue.ToString(pivotTableDefinition.RowHeaderCaption)); + + pt.RelId = worksheetPart.GetIdOfPart(pivotTablePart); + pt.CacheDefinitionRelId = pivotTablePart.GetIdOfPart(pivotTableCacheDefinitionPart); + pt.WorkbookCacheRelId = dSpreadsheet.WorkbookPart.GetIdOfPart(pivotTableCacheDefinitionPart); + + if (pivotTableDefinition.MergeItem != null) pt.MergeAndCenterWithLabels = pivotTableDefinition.MergeItem.Value; + if (pivotTableDefinition.Indent != null) pt.RowLabelIndent = (int)pivotTableDefinition.Indent.Value; + if (pivotTableDefinition.PageOverThenDown != null) pt.FilterAreaOrder = pivotTableDefinition.PageOverThenDown.Value ? XLFilterAreaOrder.OverThenDown : XLFilterAreaOrder.DownThenOver; + if (pivotTableDefinition.PageWrap != null) pt.FilterFieldsPageWrap = (int)pivotTableDefinition.PageWrap.Value; + if (pivotTableDefinition.UseAutoFormatting != null) pt.AutofitColumns = pivotTableDefinition.UseAutoFormatting.Value; + if (pivotTableDefinition.PreserveFormatting != null) pt.PreserveCellFormatting = pivotTableDefinition.PreserveFormatting.Value; + if (pivotTableDefinition.RowGrandTotals != null) pt.ShowGrandTotalsRows = pivotTableDefinition.RowGrandTotals.Value; + if (pivotTableDefinition.ColumnGrandTotals != null) pt.ShowGrandTotalsColumns = pivotTableDefinition.ColumnGrandTotals.Value; + if (pivotTableDefinition.SubtotalHiddenItems != null) pt.FilteredItemsInSubtotals = pivotTableDefinition.SubtotalHiddenItems.Value; + if (pivotTableDefinition.MultipleFieldFilters != null) pt.AllowMultipleFilters = pivotTableDefinition.MultipleFieldFilters.Value; + if (pivotTableDefinition.CustomListSort != null) pt.UseCustomListsForSorting = pivotTableDefinition.CustomListSort.Value; + if (pivotTableDefinition.ShowDrill != null) pt.ShowExpandCollapseButtons = pivotTableDefinition.ShowDrill.Value; + if (pivotTableDefinition.ShowDataTips != null) pt.ShowContextualTooltips = pivotTableDefinition.ShowDataTips.Value; + if (pivotTableDefinition.ShowMemberPropertyTips != null) pt.ShowPropertiesInTooltips = pivotTableDefinition.ShowMemberPropertyTips.Value; + if (pivotTableDefinition.ShowHeaders != null) pt.DisplayCaptionsAndDropdowns = pivotTableDefinition.ShowHeaders.Value; + if (pivotTableDefinition.GridDropZones != null) pt.ClassicPivotTableLayout = pivotTableDefinition.GridDropZones.Value; + if (pivotTableDefinition.ShowEmptyRow != null) pt.ShowEmptyItemsOnRows = pivotTableDefinition.ShowEmptyRow.Value; + if (pivotTableDefinition.ShowEmptyColumn != null) pt.ShowEmptyItemsOnColumns = pivotTableDefinition.ShowEmptyColumn.Value; + if (pivotTableDefinition.ShowItems != null) pt.DisplayItemLabels = pivotTableDefinition.ShowItems.Value; + if (pivotTableDefinition.FieldListSortAscending != null) pt.SortFieldsAtoZ = pivotTableDefinition.FieldListSortAscending.Value; + if (pivotTableDefinition.PrintDrill != null) pt.PrintExpandCollapsedButtons = pivotTableDefinition.PrintDrill.Value; + if (pivotTableDefinition.ItemPrintTitles != null) pt.RepeatRowLabels = pivotTableDefinition.ItemPrintTitles.Value; + if (pivotTableDefinition.FieldPrintTitles != null) pt.PrintTitles = pivotTableDefinition.FieldPrintTitles.Value; + if (pivotTableDefinition.EnableDrill != null) pt.EnableShowDetails = pivotTableDefinition.EnableDrill.Value; + if (pivotTableCacheDefinitionPart.PivotCacheDefinition.SaveData != null) pt.SaveSourceData = pivotTableCacheDefinitionPart.PivotCacheDefinition.SaveData.Value; + + if (pivotTableCacheDefinitionPart.PivotCacheDefinition.MissingItemsLimit != null) + { + if (pivotTableCacheDefinitionPart.PivotCacheDefinition.MissingItemsLimit == 0U) + pt.ItemsToRetainPerField = XLItemsToRetain.None; + else if (pivotTableCacheDefinitionPart.PivotCacheDefinition.MissingItemsLimit == XLHelper.MaxRowNumber) + pt.ItemsToRetainPerField = XLItemsToRetain.Max; + } + + if (pivotTableDefinition.ShowMissing != null && pivotTableDefinition.MissingCaption != null) + pt.EmptyCellReplacement = pivotTableDefinition.MissingCaption.Value; + + if (pivotTableDefinition.ShowError != null && pivotTableDefinition.ErrorCaption != null) + pt.ErrorValueReplacement = pivotTableDefinition.ErrorCaption.Value; + + var pivotTableDefinitionExtensionList = pivotTableDefinition.GetFirstChild(); + var pivotTableDefinitionExtension = pivotTableDefinitionExtensionList?.GetFirstChild(); + var pivotTableDefinition2 = pivotTableDefinitionExtension?.GetFirstChild(); + if (pivotTableDefinition2 != null) + { + if (pivotTableDefinition2.EnableEdit != null) pt.EnableCellEditing = pivotTableDefinition2.EnableEdit.Value; + if (pivotTableDefinition2.HideValuesRow != null) pt.ShowValuesRow = !pivotTableDefinition2.HideValuesRow.Value; + } + + var pivotTableStyle = pivotTableDefinition.GetFirstChild(); + if (pivotTableStyle != null) + { + if (pivotTableStyle.Name != null) + pt.Theme = (XLPivotTableTheme)Enum.Parse(typeof(XLPivotTableTheme), pivotTableStyle.Name); + else + pt.Theme = XLPivotTableTheme.None; + + pt.ShowRowHeaders = OpenXmlHelper.GetBooleanValueAsBool(pivotTableStyle.ShowRowHeaders, false); + pt.ShowColumnHeaders = OpenXmlHelper.GetBooleanValueAsBool(pivotTableStyle.ShowColumnHeaders, false); + pt.ShowRowStripes = OpenXmlHelper.GetBooleanValueAsBool(pivotTableStyle.ShowRowStripes, false); + pt.ShowColumnStripes = OpenXmlHelper.GetBooleanValueAsBool(pivotTableStyle.ShowColumnStripes, false); + } + + // Subtotal configuration + if (pivotTableDefinition.PivotFields.Cast().All(pf => (pf.DefaultSubtotal == null || pf.DefaultSubtotal.Value) + && (pf.SubtotalTop == null || pf.SubtotalTop == true))) + pt.SetSubtotals(XLPivotSubtotals.AtTop); + else if (pivotTableDefinition.PivotFields.Cast().All(pf => (pf.DefaultSubtotal == null || pf.DefaultSubtotal.Value) + && (pf.SubtotalTop != null && pf.SubtotalTop.Value == false))) + pt.SetSubtotals(XLPivotSubtotals.AtBottom); + else + pt.SetSubtotals(XLPivotSubtotals.DoNotShow); + + // Row labels + if (pivotTableDefinition.RowFields != null) + { + foreach (var rf in pivotTableDefinition.RowFields.Cast()) + { + if (rf.Index < pivotTableDefinition.PivotFields.Count) + { + IXLPivotField pivotField = null; + if (rf.Index.Value == -2) + pivotField = pt.RowLabels.Add(XLConstants.PivotTable.ValuesSentinalLabel); + else + { + var pf = pivotTableDefinition.PivotFields.ElementAt(rf.Index.Value) as PivotField; + if (pf == null) + continue; + + var cacheField = pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheFields.ElementAt(rf.Index.Value) as CacheField; + if (pt.SourceRangeFieldsAvailable.Contains(cacheField.Name?.Value)) + pivotField = pf.Name != null + ? pt.RowLabels.Add(cacheField.Name, pf.Name.Value) + : pt.RowLabels.Add(cacheField.Name.Value); + else + continue; + + if (pivotField != null) + { + LoadFieldOptions(pf, pivotField); + LoadSubtotals(pf, pivotField); + + if (pf.SortType != null) + { + pivotField.SetSort((XLPivotSortType)pf.SortType.Value); + } + } + } + } + } + } + + // Column labels + if (pivotTableDefinition.ColumnFields != null) + { + foreach (var cf in pivotTableDefinition.ColumnFields.Cast()) + { + IXLPivotField pivotField = null; + if (cf.Index.Value == -2) + pivotField = pt.ColumnLabels.Add(XLConstants.PivotTable.ValuesSentinalLabel); + else if (cf.Index < pivotTableDefinition.PivotFields.Count) + { + var pf = pivotTableDefinition.PivotFields.ElementAt(cf.Index.Value) as PivotField; + if (pf == null) + continue; + + var cacheField = pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheFields.ElementAt(cf.Index.Value) as CacheField; + if (pt.SourceRangeFieldsAvailable.Contains(cacheField.Name?.Value)) + pivotField = pf.Name != null + ? pt.ColumnLabels.Add(cacheField.Name, pf.Name.Value) + : pt.ColumnLabels.Add(cacheField.Name.Value); + else + continue; + + if (pivotField != null) + { + LoadFieldOptions(pf, pivotField); + LoadSubtotals(pf, pivotField); + + if (pf.SortType != null) + { + pivotField.SetSort((XLPivotSortType)pf.SortType.Value); + } + } + } + } + } + + // Values + if (pivotTableDefinition.DataFields != null) + { + foreach (var df in pivotTableDefinition.DataFields.Cast()) + { + IXLPivotValue pivotValue = null; + if ((int)df.Field.Value == -2) + pivotValue = pt.Values.Add(XLConstants.PivotTable.ValuesSentinalLabel); + else if (df.Field.Value < pivotTableDefinition.PivotFields.Count) + { + var pf = pivotTableDefinition.PivotFields.ElementAt((int)df.Field.Value) as PivotField; + if (pf == null) + continue; + + var cacheField = pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheFields.ElementAt((int)df.Field.Value) as CacheField; + + if (pf.Name != null) + pivotValue = pt.Values.Add(pf.Name.Value, df.Name.Value); + else if (cacheField.Name != null && pt.SourceRangeFieldsAvailable.Contains(cacheField.Name)) + pivotValue = pt.Values.Add(cacheField.Name.Value, df.Name.Value); + else + continue; + + if (df.NumberFormatId != null) pivotValue.NumberFormat.SetNumberFormatId((int)df.NumberFormatId.Value); + if (df.Subtotal != null) pivotValue = pivotValue.SetSummaryFormula(df.Subtotal.Value.ToClosedXml()); + if (df.ShowDataAs != null) + { + var calculation = df.ShowDataAs.Value.ToClosedXml(); + pivotValue = pivotValue.SetCalculation(calculation); + } + + if (df.BaseField?.Value != null) + { + var col = pt.SourceRange.Column(df.BaseField.Value + 1); + + var items = col.CellsUsed() + .Select(c => c.Value) + .Skip(1) // Skip header column + .Distinct().ToList(); + + pivotValue.BaseField = col.FirstCell().GetValue(); + + if (df.BaseItem?.Value != null) + { + var bi = (int)df.BaseItem.Value; + if (bi.Between(0, items.Count - 1)) + pivotValue.BaseItem = items[(int)df.BaseItem.Value].ToString(); + } + } + } + } + } + + // Filters + if (pivotTableDefinition.PageFields != null) + { + foreach (var pageField in pivotTableDefinition.PageFields.Cast()) + { + var pf = pivotTableDefinition.PivotFields.ElementAt(pageField.Field.Value) as PivotField; + if (pf == null) + continue; + + var cacheField = pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheFields.ElementAt(pageField.Field.Value) as CacheField; + + if (!pt.SourceRangeFieldsAvailable.Contains(cacheField.Name?.Value)) + continue; + + var filterName = pf.Name?.Value ?? cacheField.Name?.Value; + + IXLPivotField rf; + if (pageField.Name?.Value != null) + rf = pt.ReportFilters.Add(filterName, pageField.Name.Value); + else + rf = pt.ReportFilters.Add(filterName); + + var openXmlItems = new List(); + if ((pageField.Item?.HasValue ?? false) + && pf.Items.Any() && cacheField.SharedItems.Any()) + { + if (!(pf.Items.ElementAt(Convert.ToInt32(pageField.Item.Value)) is Item item)) + continue; + + openXmlItems.Add(item); + } + else if (OpenXmlHelper.GetBooleanValueAsBool(pf.MultipleItemSelectionAllowed, false)) + { + openXmlItems.AddRange(pf.Items.Cast()); + } + + foreach (var item in openXmlItems) + { + if (!OpenXmlHelper.GetBooleanValueAsBool(item.Hidden, false) + && (item.Index?.HasValue ?? false)) + { + var sharedItem = cacheField.SharedItems.ElementAt(Convert.ToInt32((uint)item.Index)); + // https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.shareditems.aspx + switch (sharedItem) + { + case NumberItem numberItem: + rf.AddSelectedValue(Convert.ToDouble(numberItem.Val.Value)); + break; + + case DateTimeItem dateTimeItem: + rf.AddSelectedValue(Convert.ToDateTime(dateTimeItem.Val.Value)); + break; + + case BooleanItem booleanItem: + rf.AddSelectedValue(Convert.ToBoolean(booleanItem.Val.Value)); + break; + + case StringItem stringItem: + rf.AddSelectedValue(stringItem.Val.Value); + break; + + case MissingItem missingItem: + case ErrorItem errorItem: + // Ignore missing and error items + break; + + default: + throw new NotImplementedException(); + } + } + } + } + + pt.TargetCell = pt.TargetCell.CellAbove(pt.ReportFilters.Count() + 1); + } + + LoadPivotStyleFormats(pt, pivotTableDefinition, pivotTableCacheDefinitionPart.PivotCacheDefinition, differentialFormats); + } + } + } + } + + #endregion Pivot tables + } + + private void LoadPivotStyleFormats(XLPivotTable pt, PivotTableDefinition ptd, PivotCacheDefinition pcd, Dictionary differentialFormats) + { + if (ptd.Formats == null) + return; + + foreach (var format in ptd.Formats.OfType()) + { + var pivotArea = format.PivotArea; + if (pivotArea == null) + continue; + + var type = pivotArea.Type ?? PivotAreaValues.Normal; + var dataOnly = OpenXmlHelper.GetBooleanValueAsBool(pivotArea.DataOnly, true); + var labelOnly = OpenXmlHelper.GetBooleanValueAsBool(pivotArea.LabelOnly, false); + + if (dataOnly && labelOnly) + throw new InvalidOperationException("Cannot have dataOnly and labelOnly both set to true."); + + XLPivotStyleFormat styleFormat; + + if (pivotArea.Field == null && !(pivotArea.PivotAreaReferences?.OfType()?.Any() ?? false)) + { + // If the pivot field is null and doesn't have children (references), we assume this format is a grand total + // Example: + // + + var appliesTo = XLPivotStyleFormatElement.All; + if (dataOnly) + appliesTo = XLPivotStyleFormatElement.Data; + else if (labelOnly) + appliesTo = XLPivotStyleFormatElement.Label; + + var isRow = OpenXmlHelper.GetBooleanValueAsBool(pivotArea.GrandRow, false); + var isColumn = OpenXmlHelper.GetBooleanValueAsBool(pivotArea.GrandColumn, false); + + // Either of the two should be true, else this is an unsupported format + if (!isRow && !isColumn) + continue; + //throw new NotImplementedException(); + + if (isRow) + styleFormat = pt.StyleFormats.RowGrandTotalFormats.ForElement(appliesTo) as XLPivotStyleFormat; + else + styleFormat = pt.StyleFormats.ColumnGrandTotalFormats.ForElement(appliesTo) as XLPivotStyleFormat; + } + else + { + Int32 fieldIndex; + Boolean defaultSubtotal = false; + + if (pivotArea.Field != null) + fieldIndex = (Int32)pivotArea.Field; + else if (pivotArea.PivotAreaReferences?.OfType()?.Any() ?? false) + { + // The field we want does NOT have any children + var r = pivotArea.PivotAreaReferences.OfType().FirstOrDefault(r1 => !r1.Any()); + if (r == null) + continue; + + fieldIndex = Convert.ToInt32((UInt32)r.Field); + defaultSubtotal = OpenXmlHelper.GetBooleanValueAsBool(r.DefaultSubtotal, false); + } + else + throw new NotImplementedException(); + + XLPivotField field = null; + if (fieldIndex == -2) + { + var axis = pivotArea.Axis.Value; + if (axis == PivotTableAxisValues.AxisRow) + field = (XLPivotField)pt.RowLabels.Single(f => f.SourceName == "{{Values}}"); + else if (axis == PivotTableAxisValues.AxisColumn) + field = (XLPivotField)pt.ColumnLabels.Single(f => f.SourceName == "{{Values}}"); + else + continue; + } + else + { + var fieldName = pt.SourceRangeFieldsAvailable.ElementAt(fieldIndex); + field = (XLPivotField)pt.ImplementedFields.SingleOrDefault(f => f.SourceName.Equals(fieldName)); + + if (field is null) + continue; + } + + if (defaultSubtotal) + { + // Subtotal format + // Example: + // + // + // + // + // + + styleFormat = field.StyleFormats.Subtotal as XLPivotStyleFormat; + } + else if (type == PivotAreaValues.Button) + { + // Header format + // Example: + // + styleFormat = field.StyleFormats.Header as XLPivotStyleFormat; + } + else if (labelOnly) + { + // Label format + // Example: + // + // + // + // + // + styleFormat = field.StyleFormats.Label as XLPivotStyleFormat; + } + else + { + // Assume DataValues format + // Example: + // + // + // + // + // + // + // + // + // + // + // + styleFormat = field.StyleFormats.DataValuesFormat as XLPivotStyleFormat; + + foreach (var reference in pivotArea.PivotAreaReferences.OfType()) + { + fieldIndex = unchecked((int)reference.Field.Value); + if (field.Offset == fieldIndex) + continue; // already handled + + var fieldItem = reference.OfType().First(); + var fieldItemValue = (int)fieldItem.Val.Value; + + if (fieldIndex == -2) + { + styleFormat = (styleFormat as XLPivotValueStyleFormat) + .ForValueField(pt.Values.ElementAt(fieldItemValue)) + as XLPivotValueStyleFormat; + } + else + { + var additionalFieldName = pt.SourceRangeFieldsAvailable.ElementAt(fieldIndex); + var additionalField = pt.ImplementedFields + .Single(f => f.SourceName == additionalFieldName); + + var cacheField = pcd.CacheFields.OfType() + .FirstOrDefault(cf => cf.Name == additionalFieldName); + + Predicate predicate = null; + if ((cacheField?.SharedItems?.Any() ?? false) + && fieldItemValue < cacheField.SharedItems.Count) + { + var value = cacheField.SharedItems.OfType().ElementAt(fieldItemValue).Val?.Value; + predicate = o => o.ToString() == value; + } + + styleFormat = (styleFormat as XLPivotValueStyleFormat) + .AndWith(additionalField, predicate) + as XLPivotValueStyleFormat; + } + } + } + + styleFormat.AreaType = type.Value.ToClosedXml(); + styleFormat.Outline = OpenXmlHelper.GetBooleanValueAsBool(pivotArea.Outline, true); + styleFormat.CollapsedLevelsAreSubtotals = OpenXmlHelper.GetBooleanValueAsBool(pivotArea.CollapsedLevelsAreSubtotals, false); + } + + IXLStyle style = XLStyle.Default; + if (format.FormatId != null) + { + var df = differentialFormats[(Int32)format.FormatId.Value]; + LoadFont(df.Font, style.Font); + LoadFill(df.Fill, style.Fill, differentialFillFormat: true); + LoadBorder(df.Border, style.Border); + LoadNumberFormat(df.NumberingFormat, style.NumberFormat); + } + + styleFormat.Style = style; + } + } + + private static void LoadFieldOptions(PivotField pf, IXLPivotField pivotField) + { + if (pf.SubtotalCaption != null) pivotField.SubtotalCaption = pf.SubtotalCaption; + if (pf.IncludeNewItemsInFilter != null) pivotField.IncludeNewItemsInFilter = pf.IncludeNewItemsInFilter.Value; + if (pf.Outline != null) pivotField.Outline = pf.Outline.Value; + if (pf.Compact != null) pivotField.Compact = pf.Compact.Value; + if (pf.InsertBlankRow != null) pivotField.InsertBlankLines = pf.InsertBlankRow.Value; + pivotField.ShowBlankItems = OpenXmlHelper.GetBooleanValueAsBool(pf.ShowAll, true); + if (pf.InsertPageBreak != null) pivotField.InsertPageBreaks = pf.InsertPageBreak.Value; + if (pf.SubtotalTop != null) pivotField.SubtotalsAtTop = pf.SubtotalTop.Value; + if (pf.AllDrilled != null) pivotField.Collapsed = !pf.AllDrilled.Value; + + var pivotFieldExtensionList = pf.GetFirstChild(); + var pivotFieldExtension = pivotFieldExtensionList?.GetFirstChild(); + var field2010 = pivotFieldExtension?.GetFirstChild(); + if (field2010?.FillDownLabels != null) pivotField.RepeatItemLabels = field2010.FillDownLabels.Value; + } + + private static void LoadSubtotals(PivotField pf, IXLPivotField pivotField) + { + if (pf.AverageSubTotal != null) + pivotField.AddSubtotal(XLSubtotalFunction.Average); + if (pf.CountASubtotal != null) + pivotField.AddSubtotal(XLSubtotalFunction.Count); + if (pf.CountSubtotal != null) + pivotField.AddSubtotal(XLSubtotalFunction.CountNumbers); + if (pf.MaxSubtotal != null) + pivotField.AddSubtotal(XLSubtotalFunction.Maximum); + if (pf.MinSubtotal != null) + pivotField.AddSubtotal(XLSubtotalFunction.Minimum); + if (pf.ApplyStandardDeviationPInSubtotal != null) + pivotField.AddSubtotal(XLSubtotalFunction.PopulationStandardDeviation); + if (pf.ApplyVariancePInSubtotal != null) + pivotField.AddSubtotal(XLSubtotalFunction.PopulationVariance); + if (pf.ApplyProductInSubtotal != null) + pivotField.AddSubtotal(XLSubtotalFunction.Product); + if (pf.ApplyStandardDeviationInSubtotal != null) + pivotField.AddSubtotal(XLSubtotalFunction.StandardDeviation); + if (pf.SumSubtotal != null) + pivotField.AddSubtotal(XLSubtotalFunction.Sum); + if (pf.ApplyVarianceInSubtotal != null) + pivotField.AddSubtotal(XLSubtotalFunction.Variance); + + if (pf.Items?.Any() ?? false) + { + var items = pf.Items.OfType().Where(i => i.Index != null && i.Index.HasValue); + if (!items.Any(i => i.HideDetails == null || BooleanValue.ToBoolean(i.HideDetails))) + pivotField.SetCollapsed(); + } + } + + private void LoadDrawings(WorksheetPart wsPart, IXLWorksheet ws) + { + if (wsPart.DrawingsPart != null) + { + var drawingsPart = wsPart.DrawingsPart; + + foreach (var anchor in drawingsPart.WorksheetDrawing.ChildElements) + { + var imgId = GetImageRelIdFromAnchor(anchor); + + //If imgId is null, we're probably dealing with a TextBox (or another shape) instead of a picture + if (imgId == null) continue; + + var imagePart = drawingsPart.GetPartById(imgId); + using (var stream = imagePart.GetStream()) + using (var ms = new MemoryStream()) + { + stream.CopyTo(ms); + var vsdp = GetPropertiesFromAnchor(anchor); + + var picture = (ws as XLWorksheet).AddPicture(ms, vsdp.Name, Convert.ToInt32(vsdp.Id.Value)) as XLPicture; + picture.RelId = imgId; + + Xdr.ShapeProperties spPr = anchor.Descendants().First(); + picture.Placement = XLPicturePlacement.FreeFloating; + + if (spPr?.Transform2D?.Extents?.Cx.HasValue ?? false) + picture.Width = ConvertFromEnglishMetricUnits(spPr.Transform2D.Extents.Cx, GraphicsUtils.Graphics.DpiX); + + if (spPr?.Transform2D?.Extents?.Cy.HasValue ?? false) + picture.Height = ConvertFromEnglishMetricUnits(spPr.Transform2D.Extents.Cy, GraphicsUtils.Graphics.DpiY); + + if (anchor is Xdr.AbsoluteAnchor) + { + var absoluteAnchor = anchor as Xdr.AbsoluteAnchor; + picture.MoveTo( + ConvertFromEnglishMetricUnits(absoluteAnchor.Position.X.Value, GraphicsUtils.Graphics.DpiX), + ConvertFromEnglishMetricUnits(absoluteAnchor.Position.Y.Value, GraphicsUtils.Graphics.DpiY) + ); + } + else if (anchor is Xdr.OneCellAnchor) + { + var oneCellAnchor = anchor as Xdr.OneCellAnchor; + var from = LoadMarker(ws, oneCellAnchor.FromMarker); + picture.MoveTo(from.Cell, from.Offset); + } + else if (anchor is Xdr.TwoCellAnchor) + { + var twoCellAnchor = anchor as Xdr.TwoCellAnchor; + var from = LoadMarker(ws, twoCellAnchor.FromMarker); + var to = LoadMarker(ws, twoCellAnchor.ToMarker); + + if (twoCellAnchor.EditAs == null || !twoCellAnchor.EditAs.HasValue || twoCellAnchor.EditAs.Value == Xdr.EditAsValues.TwoCell) + { + picture.MoveTo(from.Cell, from.Offset, to.Cell, to.Offset); + } + else if (twoCellAnchor.EditAs.Value == Xdr.EditAsValues.Absolute) + { + var shapeProperties = twoCellAnchor.Descendants().FirstOrDefault(); + if (shapeProperties != null) + { + picture.MoveTo( + ConvertFromEnglishMetricUnits(spPr.Transform2D.Offset.X, GraphicsUtils.Graphics.DpiX), + ConvertFromEnglishMetricUnits(spPr.Transform2D.Offset.Y, GraphicsUtils.Graphics.DpiY) + ); + } + } + else if (twoCellAnchor.EditAs.Value == Xdr.EditAsValues.OneCell) + { + picture.MoveTo(from.Cell, from.Offset); + } + } + } + } + } + } + + private static Int32 ConvertFromEnglishMetricUnits(long emu, float resolution) + { + return Convert.ToInt32(emu * resolution / 914400); + } + + private static XLMarker LoadMarker(IXLWorksheet ws, Xdr.MarkerType marker) + { + var row = Math.Min(XLHelper.MaxRowNumber, Math.Max(1, Convert.ToInt32(marker.RowId.InnerText) + 1)); + var column = Math.Min(XLHelper.MaxColumnNumber, Math.Max(1, Convert.ToInt32(marker.ColumnId.InnerText) + 1)); + return new XLMarker( + ws.Cell(row, column), + new Point( + ConvertFromEnglishMetricUnits(Convert.ToInt32(marker.ColumnOffset.InnerText), GraphicsUtils.Graphics.DpiX), + ConvertFromEnglishMetricUnits(Convert.ToInt32(marker.RowOffset.InnerText), GraphicsUtils.Graphics.DpiY) + ) + ); + } + + #region Comment Helpers + + private static IList GetCommentShapes(WorksheetPart worksheetPart) + { + // Cannot get this to return Vml.Shape elements + foreach (var vmlPart in worksheetPart.VmlDrawingParts) + { + using (var stream = vmlPart.GetStream(FileMode.Open)) + { + var xdoc = XDocumentExtensions.Load(stream); + if (xdoc == null) + continue; + + var root = xdoc.Root.Element("xml") ?? xdoc.Root; + + if (root == null) + continue; + + var shapes = root + .Elements(XName.Get("shape", "urn:schemas-microsoft-com:vml")) + .Where(e => new[] + { + "#" + XLConstants.Comment.ShapeTypeId , + "#" + XLConstants.Comment.AlternateShapeTypeId + }.Contains(e.Attribute("type")?.Value)) + .ToList(); + + if (shapes != null) + return shapes; + } + } + + throw new ArgumentException("Could not load comments file"); + } + + #endregion Comment Helpers + + private String GetTableColumnName(string name) + { + return name.Replace("_x000a_", Environment.NewLine).Replace("_x005f_x000a_", "_x000a_"); + } + + // This may be part of XLHelper or XLColor + // Leaving it here for now. Can't decide what to call it and where to put it. + private XLColor ExtractColor(String color) + { + if (color.IndexOf("[") >= 0) + { + int start = color.IndexOf("[") + 1; + int end = color.IndexOf("]", start); + return XLColor.FromIndex(Int32.Parse(color.Substring(start, end - start))); + } + else + { + return XLColor.FromHtml(color); + } + } + + private void LoadColorsAndLines(IXLDrawing drawing, XElement shape) + { + var strokeColor = shape.Attribute("strokecolor"); + if (strokeColor != null) drawing.Style.ColorsAndLines.LineColor = ExtractColor(strokeColor.Value); + + var strokeWeight = shape.Attribute("strokeweight"); + if (strokeWeight != null && TryGetPtValue(strokeWeight.Value, out var lineWeight)) + drawing.Style.ColorsAndLines.LineWeight = lineWeight; + + var fillColor = shape.Attribute("fillcolor"); + if (fillColor != null && !fillColor.Value.ToLower().Contains("infobackground")) drawing.Style.ColorsAndLines.FillColor = ExtractColor(fillColor.Value); + + var fill = shape.Elements().FirstOrDefault(e => e.Name.LocalName == "fill"); + if (fill != null) + { + var opacity = fill.Attribute("opacity"); + if (opacity != null) + { + String opacityVal = opacity.Value; + if (opacityVal.EndsWith("f")) + drawing.Style.ColorsAndLines.FillTransparency = + Double.Parse(opacityVal.Substring(0, opacityVal.Length - 1), CultureInfo.InvariantCulture) / 65536.0; + else + drawing.Style.ColorsAndLines.FillTransparency = Double.Parse(opacityVal, CultureInfo.InvariantCulture); + } + } + + var stroke = shape.Elements().FirstOrDefault(e => e.Name.LocalName == "stroke"); + if (stroke != null) + { + var opacity = stroke.Attribute("opacity"); + if (opacity != null) + { + String opacityVal = opacity.Value; + if (opacityVal.EndsWith("f")) + drawing.Style.ColorsAndLines.LineTransparency = + Double.Parse(opacityVal.Substring(0, opacityVal.Length - 1), CultureInfo.InvariantCulture) / 65536.0; + else + drawing.Style.ColorsAndLines.LineTransparency = Double.Parse(opacityVal, CultureInfo.InvariantCulture); + } + + var dashStyle = stroke.Attribute("dashstyle"); + if (dashStyle != null) + { + String dashStyleVal = dashStyle.Value.ToLower(); + if (dashStyleVal == "1 1" || dashStyleVal == "shortdot") + { + var endCap = stroke.Attribute("endcap"); + if (endCap != null && endCap.Value == "round") + drawing.Style.ColorsAndLines.LineDash = XLDashStyle.RoundDot; + else + drawing.Style.ColorsAndLines.LineDash = XLDashStyle.SquareDot; + } + else + { + switch (dashStyleVal) + { + case "dash": drawing.Style.ColorsAndLines.LineDash = XLDashStyle.Dash; break; + case "dashdot": drawing.Style.ColorsAndLines.LineDash = XLDashStyle.DashDot; break; + case "longdash": drawing.Style.ColorsAndLines.LineDash = XLDashStyle.LongDash; break; + case "longdashdot": drawing.Style.ColorsAndLines.LineDash = XLDashStyle.LongDashDot; break; + case "longdashdotdot": drawing.Style.ColorsAndLines.LineDash = XLDashStyle.LongDashDotDot; break; + } + } + } + + var lineStyle = stroke.Attribute("linestyle"); + if (lineStyle != null) + { + String lineStyleVal = lineStyle.Value.ToLower(); + switch (lineStyleVal) + { + case "single": drawing.Style.ColorsAndLines.LineStyle = XLLineStyle.Single; break; + case "thickbetweenthin": drawing.Style.ColorsAndLines.LineStyle = XLLineStyle.ThickBetweenThin; break; + case "thickthin": drawing.Style.ColorsAndLines.LineStyle = XLLineStyle.ThickThin; break; + case "thinthick": drawing.Style.ColorsAndLines.LineStyle = XLLineStyle.ThinThick; break; + case "thinthin": drawing.Style.ColorsAndLines.LineStyle = XLLineStyle.ThinThin; break; + } + } + } + } + + private void LoadTextBox(IXLDrawing xlDrawing, XElement textBox) + { + var attStyle = textBox.Attribute("style"); + if (attStyle != null) LoadTextBoxStyle(xlDrawing, attStyle); + + var attInset = textBox.Attribute("inset"); + if (attInset != null) LoadTextBoxInset(xlDrawing, attInset); + } + + private void LoadTextBoxInset(IXLDrawing xlDrawing, XAttribute attInset) + { + var split = attInset.Value.Split(','); + xlDrawing.Style.Margins.Left = GetInsetValue(split[0]); + xlDrawing.Style.Margins.Top = GetInsetValue(split[1]); + xlDrawing.Style.Margins.Right = GetInsetValue(split[2]); + xlDrawing.Style.Margins.Bottom = GetInsetValue(split[3]); + } + + private double GetInsetValue(string value) + { + String v = value.Trim(); + if (v.EndsWith("pt")) + return Double.Parse(v.Substring(0, v.Length - 2), CultureInfo.InvariantCulture) / 72.0; + else + return Double.Parse(v.Substring(0, v.Length - 2), CultureInfo.InvariantCulture); + } + + private static void LoadTextBoxStyle(IXLDrawing xlDrawing, XAttribute attStyle) + { + var style = attStyle.Value; + var attributes = style.Split(';'); + foreach (String pair in attributes) + { + var split = pair.Split(':'); + if (split.Length != 2) continue; + + var attribute = split[0].Trim().ToLower(); + var value = split[1].Trim(); + Boolean isVertical = false; + switch (attribute) + { + case "mso-fit-shape-to-text": xlDrawing.Style.Size.SetAutomaticSize(value.Equals("t")); break; + case "mso-layout-flow-alt": + if (value.Equals("bottom-to-top")) xlDrawing.Style.Alignment.SetOrientation(XLDrawingTextOrientation.BottomToTop); + else if (value.Equals("top-to-bottom")) xlDrawing.Style.Alignment.SetOrientation(XLDrawingTextOrientation.Vertical); + break; + + case "layout-flow": isVertical = value.Equals("vertical"); break; + case "mso-direction-alt": if (value == "auto") xlDrawing.Style.Alignment.Direction = XLDrawingTextDirection.Context; break; + case "direction": if (value == "RTL") xlDrawing.Style.Alignment.Direction = XLDrawingTextDirection.RightToLeft; break; + } + if (isVertical && xlDrawing.Style.Alignment.Orientation == XLDrawingTextOrientation.LeftToRight) + xlDrawing.Style.Alignment.Orientation = XLDrawingTextOrientation.TopToBottom; + } + } + + private void LoadClientData(IXLDrawing drawing, XElement clientData) + { + var anchor = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "Anchor"); + if (anchor != null) LoadClientDataAnchor(drawing, anchor); + + LoadDrawingPositioning(drawing, clientData); + LoadDrawingProtection(drawing, clientData); + + var visible = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "Visible"); + drawing.Visible = visible != null && + (string.IsNullOrEmpty(visible.Value) || + visible.Value.StartsWith("t", StringComparison.OrdinalIgnoreCase)); + + LoadDrawingHAlignment(drawing, clientData); + LoadDrawingVAlignment(drawing, clientData); + } + + private void LoadDrawingHAlignment(IXLDrawing drawing, XElement clientData) + { + var textHAlign = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "TextHAlign"); + if (textHAlign != null) + drawing.Style.Alignment.Horizontal = (XLDrawingHorizontalAlignment)Enum.Parse(typeof(XLDrawingHorizontalAlignment), textHAlign.Value.ToProper()); + } + + private void LoadDrawingVAlignment(IXLDrawing drawing, XElement clientData) + { + var textVAlign = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "TextVAlign"); + if (textVAlign != null) + drawing.Style.Alignment.Vertical = (XLDrawingVerticalAlignment)Enum.Parse(typeof(XLDrawingVerticalAlignment), textVAlign.Value.ToProper()); + } + + private void LoadDrawingProtection(IXLDrawing drawing, XElement clientData) + { + var lockedElement = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "Locked"); + var lockTextElement = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "LockText"); + Boolean locked = lockedElement != null && lockedElement.Value.ToLower() == "true"; + Boolean lockText = lockTextElement != null && lockTextElement.Value.ToLower() == "true"; + drawing.Style.Protection.Locked = locked; + drawing.Style.Protection.LockText = lockText; + } + + private static void LoadDrawingPositioning(IXLDrawing drawing, XElement clientData) + { + var moveWithCellsElement = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "MoveWithCells"); + var sizeWithCellsElement = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "SizeWithCells"); + Boolean moveWithCells = !(moveWithCellsElement != null && moveWithCellsElement.Value.ToLower() == "true"); + Boolean sizeWithCells = !(sizeWithCellsElement != null && sizeWithCellsElement.Value.ToLower() == "true"); + if (moveWithCells && !sizeWithCells) + drawing.Style.Properties.Positioning = XLDrawingAnchor.MoveWithCells; + else if (moveWithCells && sizeWithCells) + drawing.Style.Properties.Positioning = XLDrawingAnchor.MoveAndSizeWithCells; + else + drawing.Style.Properties.Positioning = XLDrawingAnchor.Absolute; + } + + private static void LoadClientDataAnchor(IXLDrawing drawing, XElement anchor) + { + var location = anchor.Value.Split(','); + drawing.Position.Column = int.Parse(location[0]) + 1; + drawing.Position.ColumnOffset = Double.Parse(location[1], CultureInfo.InvariantCulture) / 7.5; + drawing.Position.Row = int.Parse(location[2]) + 1; + drawing.Position.RowOffset = Double.Parse(location[3], CultureInfo.InvariantCulture); + } + + private void LoadShapeProperties(IXLDrawing xlDrawing, XElement shape) + { + if (shape.Attribute("style") == null) + return; + + foreach (var attributePair in shape.Attribute("style").Value.Split(';')) + { + var split = attributePair.Split(':'); + if (split.Length != 2) continue; + + var attribute = split[0].Trim().ToLower(); + var value = split[1].Trim(); + + switch (attribute) + { + case "visibility": xlDrawing.Visible = string.Equals("visible", value, StringComparison.OrdinalIgnoreCase); break; + case "width": + if (TryGetPtValue(value, out var ptWidth)) + { + xlDrawing.Style.Size.Width = ptWidth / 7.5; + } + break; + + case "height": + if (TryGetPtValue(value, out var ptHeight)) + { + xlDrawing.Style.Size.Height = ptHeight; + } + break; + + case "z-index": + if (Int32.TryParse(value, out var zOrder)) + { + xlDrawing.ZOrder = zOrder; + } + break; + } + } + } + + private readonly Dictionary knownUnits = new Dictionary + { + {"pt", 1.0}, + {"in", 72.0}, + {"mm", 72.0/25.4} + }; + + private bool TryGetPtValue(string value, out double result) + { + var knownUnit = knownUnits.FirstOrDefault(ku => value.Contains(ku.Key)); + + if (knownUnit.Key == null) + return Double.TryParse(value, out result); + + value = value.Replace(knownUnit.Key, String.Empty); + + if (Double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out result)) + { + result *= knownUnit.Value; + return true; + } + + result = 0d; + return false; + } + + private void LoadDefinedNames(Workbook workbook) + { + if (workbook.DefinedNames == null) return; + + foreach (var definedName in workbook.DefinedNames.OfType()) + { + var name = definedName.Name; + var visible = true; + if (definedName.Hidden != null) visible = !BooleanValue.ToBoolean(definedName.Hidden); + + var localSheetId = -1; + if (definedName.LocalSheetId?.HasValue ?? false) localSheetId = Convert.ToInt32(definedName.LocalSheetId.Value); + + if (name == "_xlnm.Print_Area") + { + var fixedNames = validateDefinedNames(definedName.Text.Split(',')); + foreach (string area in fixedNames) + { + if (area.Contains("[")) + { + var ws = Worksheets.FirstOrDefault(w => (w as XLWorksheet).SheetId == (localSheetId + 1)); + if (ws != null) + { + ws.PageSetup.PrintAreas.Add(area); + } + } + else + { + ParseReference(area, out String sheetName, out String sheetArea); + if (!(sheetArea.Equals("#REF") || sheetArea.EndsWith("#REF!") || sheetArea.Length == 0 || sheetName.Length == 0)) + WorksheetsInternal.Worksheet(sheetName).PageSetup.PrintAreas.Add(sheetArea); + } + } + } + else if (name == "_xlnm.Print_Titles") + { + LoadPrintTitles(definedName); + } + else + { + string text = definedName.Text; + + var comment = definedName.Comment; + if (localSheetId == -1) + { + if (NamedRanges.All(nr => nr.Name != name)) + (NamedRanges as XLNamedRanges).Add(name, text, comment, validateName: false, validateRangeAddress: false).Visible = visible; + } + else + { + if (Worksheet(localSheetId + 1).NamedRanges.All(nr => nr.Name != name)) + (Worksheet(localSheetId + 1).NamedRanges as XLNamedRanges).Add(name, text, comment, validateName: false, validateRangeAddress: false).Visible = visible; + } + } + } + } + + private static Regex definedNameRegex = new Regex(@"\A'.*'!.*\z", RegexOptions.Compiled); + + private IEnumerable validateDefinedNames(IEnumerable definedNames) + { + var sb = new StringBuilder(); + foreach (string testName in definedNames) + { + if (sb.Length > 0) + sb.Append(','); + + sb.Append(testName); + + Match matchedValidPattern = definedNameRegex.Match(sb.ToString()); + if (matchedValidPattern.Success) + { + yield return sb.ToString(); + sb = new StringBuilder(); + } + } + + if (sb.Length > 0) + yield return sb.ToString(); + } + + private void LoadPrintTitles(DefinedName definedName) + { + var areas = validateDefinedNames(definedName.Text.Split(',')); + foreach (var item in areas) + { + if (this.Range(item) != null) + SetColumnsOrRowsToRepeat(item); + } + } + + private void SetColumnsOrRowsToRepeat(string area) + { + ParseReference(area, out String sheetName, out String sheetArea); + sheetArea = sheetArea.Replace("$", ""); + + if (sheetArea.Equals("#REF")) return; + if (IsColReference(sheetArea)) + WorksheetsInternal.Worksheet(sheetName).PageSetup.SetColumnsToRepeatAtLeft(sheetArea); + if (IsRowReference(sheetArea)) + WorksheetsInternal.Worksheet(sheetName).PageSetup.SetRowsToRepeatAtTop(sheetArea); + } + + // either $A:$X => true or $1:$99 => false + private static bool IsColReference(string sheetArea) + { + return sheetArea.All(c => c == ':' || char.IsLetter(c)); + } + + private static bool IsRowReference(string sheetArea) + { + return sheetArea.All(c => c == ':' || char.IsNumber(c)); + } + + private static void ParseReference(string item, out string sheetName, out string sheetArea) + { + var sections = item.Trim().Split('!'); + if (sections.Count() == 1) + { + sheetName = string.Empty; + sheetArea = item; + } + else + { + sheetName = sections[0].UnescapeSheetName(); + sheetArea = sections[1]; + } + } + + private Int32 lastColumnNumber; + + private void LoadCells(SharedStringItem[] sharedStrings, Stylesheet s, NumberingFormats numberingFormats, + Fills fills, Borders borders, Fonts fonts, Dictionary sharedFormulasR1C1, + XLWorksheet ws, Dictionary styleList, Cell cell, Int32 rowIndex) + { + Int32 styleIndex = cell.StyleIndex != null ? Int32.Parse(cell.StyleIndex.InnerText) : 0; + + XLAddress cellAddress; + if (cell.CellReference == null) + { + cellAddress = new XLAddress(ws, rowIndex, ++lastColumnNumber, false, false); + } + else + { + cellAddress = XLAddress.Create(ws, cell.CellReference.Value); + lastColumnNumber = cellAddress.ColumnNumber; + } + + var xlCell = ws.Cell(in cellAddress); + + if (styleList.TryGetValue(styleIndex, out IXLStyle style)) + { + xlCell.InnerStyle = style; + } + else + { + ApplyStyle(xlCell, styleIndex, s, fills, borders, fonts, numberingFormats); + } + + if (cell.CellFormula?.SharedIndex != null && cell.CellFormula?.Reference != null) + { + String formula; + if (cell.CellFormula.FormulaType != null && cell.CellFormula.FormulaType == CellFormulaValues.Array) + formula = "{" + cell.CellFormula.Text + "}"; + else + formula = cell.CellFormula.Text; + + // Parent cell of shared formulas + // Child cells will use this shared index to set its R1C1 style formula + xlCell.FormulaReference = ws.Range(cell.CellFormula.Reference.Value).RangeAddress; + + xlCell.FormulaA1 = formula; + sharedFormulasR1C1.Add(cell.CellFormula.SharedIndex.Value, xlCell.FormulaR1C1); + + if (cell.DataType != null) + { + switch (cell.DataType.Value) + { + case CellValues.Boolean: + xlCell.SetDataTypeFast(XLDataType.Boolean); + break; + + case CellValues.Number: + xlCell.SetDataTypeFast(XLDataType.Number); + break; + + case CellValues.Date: + xlCell.SetDataTypeFast(XLDataType.DateTime); + break; + + case CellValues.InlineString: + case CellValues.SharedString: + case CellValues.String: + xlCell.SetDataTypeFast(XLDataType.Text); + break; + } + } + } + else if (cell.CellFormula != null) + { + if (cell.CellFormula.SharedIndex != null) + xlCell.FormulaR1C1 = sharedFormulasR1C1[cell.CellFormula.SharedIndex.Value]; + else if (!String.IsNullOrWhiteSpace(cell.CellFormula.Text)) + { + String formula; + if (cell.CellFormula.FormulaType != null && cell.CellFormula.FormulaType == CellFormulaValues.Array) + formula = "{" + cell.CellFormula.Text + "}"; + else + formula = cell.CellFormula.Text; + + xlCell.FormulaA1 = formula; + } + + if (cell.CellFormula.Reference != null) + { + foreach (var childCell in ws.Range(cell.CellFormula.Reference.Value).Cells(c => c.FormulaReference == null || !c.HasFormula)) + { + if (childCell.FormulaReference == null) + childCell.FormulaReference = ws.Range(cell.CellFormula.Reference.Value).RangeAddress; + + if (!childCell.HasFormula) + childCell.FormulaA1 = xlCell.FormulaA1; + } + } + + if (cell.DataType != null) + { + switch (cell.DataType.Value) + { + case CellValues.Boolean: + xlCell.SetDataTypeFast(XLDataType.Boolean); + break; + + case CellValues.Number: + xlCell.SetDataTypeFast(XLDataType.Number); + break; + + case CellValues.Date: + xlCell.SetDataTypeFast(XLDataType.DateTime); + break; + + case CellValues.InlineString: + case CellValues.SharedString: + case CellValues.String: + xlCell.SetDataTypeFast(XLDataType.Text); + break; + } + } + } + else if (cell.DataType != null) + { + if (cell.DataType == CellValues.InlineString) + { + xlCell.SetDataTypeFast(XLDataType.Text); + xlCell.ShareString = false; + + if (cell.InlineString != null) + { + if (cell.InlineString.Text != null) + xlCell.SetInternalCellValueString(cell.InlineString.Text.Text.FixNewLines()); + else + ParseCellValue(cell.InlineString, xlCell); + } + else + xlCell.SetInternalCellValueString(String.Empty); + } + else if (cell.DataType == CellValues.SharedString) + { + xlCell.SetDataTypeFast(XLDataType.Text); + + if (cell.CellValue != null + && Int32.TryParse(cell.CellValue.Text, XLHelper.NumberStyle, XLHelper.ParseCulture, out Int32 sharedStringId) + && sharedStringId >= 0 && sharedStringId < sharedStrings.Length) + { + xlCell.SharedStringId = sharedStringId; + var sharedString = sharedStrings[sharedStringId]; + ParseCellValue(sharedString, xlCell); + } + else + xlCell.SetInternalCellValueString(String.Empty); + } + else if (cell.DataType == CellValues.String) + { + xlCell.SetDataTypeFast(XLDataType.Text); + + if (!String.IsNullOrEmpty(cell.CellValue?.Text)) + xlCell.SetInternalCellValueString(cell.CellValue.Text); + else + xlCell.SetInternalCellValueString(String.Empty); + } + else if (cell.DataType == CellValues.Date) + { + xlCell.SetDataTypeFast(XLDataType.DateTime); + + if (cell.CellValue != null && !String.IsNullOrWhiteSpace(cell.CellValue.Text)) + xlCell.SetInternalCellValueString(Double.Parse(cell.CellValue.Text, XLHelper.NumberStyle, XLHelper.ParseCulture).ToInvariantString()); + } + else if (cell.DataType == CellValues.Boolean) + { + xlCell.SetDataTypeFast(XLDataType.Boolean); + if (cell.CellValue != null) + xlCell.SetInternalCellValueString(cell.CellValue.Text); + } + else if (cell.DataType == CellValues.Number) + { + if (s == null) + xlCell.SetDataTypeFast(XLDataType.Number); + else + xlCell.DataType = GetDataTypeFromCell(xlCell.StyleValue.NumberFormat); + + if (cell.CellValue != null && !String.IsNullOrWhiteSpace(cell.CellValue.Text)) + xlCell.SetInternalCellValueString(Double.Parse(cell.CellValue.Text, XLHelper.NumberStyle, XLHelper.ParseCulture).ToInvariantString()); + } + } + else if (cell.CellValue != null) + { + if (s == null) + { + xlCell.SetDataTypeFast(XLDataType.Number); + } + else + { + xlCell.DataType = GetDataTypeFromCell(xlCell.StyleValue.NumberFormat); + + if (!String.IsNullOrWhiteSpace(cell.CellValue.Text)) + xlCell.SetInternalCellValueString(Double.Parse(cell.CellValue.Text, CultureInfo.InvariantCulture).ToInvariantString()); + + var numberFormatId = ((CellFormat)(s.CellFormats).ElementAt(styleIndex)).NumberFormatId; + + if (numberFormatId?.HasValue ?? false) + { + var format = s.NumberingFormats? + .Cast() + .Where(nf => nf.NumberFormatId.Value == numberFormatId) + .Select(nf => nf.FormatCode.Value) + .FirstOrDefault(); + + if (format == null) + xlCell.InnerStyle.NumberFormat.NumberFormatId = Int32.Parse(numberFormatId); + else + xlCell.InnerStyle.NumberFormat.Format = format; + } + } + } + + if (xlCell.HasFormula) + { + if (cell.CellValue != null) + xlCell.SetInternalCellValueString(cell.CellValue.Text); + + xlCell.NeedsRecalculation = (xlCell.CachedValue == null); + } + + if (Use1904DateSystem && xlCell.DataType == XLDataType.DateTime) + { + // Internally ClosedXML stores cells as standard 1900-based style + // so if a workbook is in 1904-format, we do that adjustment here and when saving. + xlCell.SetValue(xlCell.GetDateTime().AddDays(1462)); + } + + if (!styleList.ContainsKey(styleIndex)) + styleList.Add(styleIndex, xlCell.Style); + } + + /// + /// Parses the cell value for normal or rich text + /// Input element should either be a shared string or inline string + /// + /// The element (either a shared string or inline string) + /// The cell. + private void ParseCellValue(RstType element, XLCell xlCell) + { + var runs = element.Elements(); + var phoneticRuns = element.Elements(); + var phoneticProperties = element.Elements(); + Boolean hasRuns = false; + foreach (Run run in runs) + { + var runProperties = run.RunProperties; + String text = run.Text.InnerText.FixNewLines(); + + if (runProperties == null) + xlCell.RichText.AddText(text, xlCell.Style.Font); + else + { + var rt = xlCell.RichText.AddText(text); + LoadFont(runProperties, rt); + } + if (!hasRuns) + hasRuns = true; + } + + if (!hasRuns) + xlCell.SetInternalCellValueString(XmlEncoder.DecodeString(element.Text.InnerText)); + + #region Load PhoneticProperties + + var pp = phoneticProperties.FirstOrDefault(); + if (pp != null) + { + if (pp.Alignment != null) + xlCell.RichText.Phonetics.Alignment = pp.Alignment.Value.ToClosedXml(); + if (pp.Type != null) + xlCell.RichText.Phonetics.Type = pp.Type.Value.ToClosedXml(); + + LoadFont(pp, xlCell.RichText.Phonetics); + } + + #endregion Load PhoneticProperties + + #region Load Phonetic Runs + + foreach (PhoneticRun pr in phoneticRuns) + { + xlCell.RichText.Phonetics.Add(pr.Text.InnerText.FixNewLines(), (Int32)pr.BaseTextStartIndex.Value, + (Int32)pr.EndingBaseIndex.Value); + } + + #endregion Load Phonetic Runs + } + + private void LoadNumberFormat(NumberingFormat nfSource, IXLNumberFormat nf) + { + if (nfSource == null) return; + + if (nfSource.NumberFormatId != null && nfSource.NumberFormatId.Value < XLConstants.NumberOfBuiltInStyles) + nf.NumberFormatId = (Int32)nfSource.NumberFormatId.Value; + else if (nfSource.FormatCode != null) + nf.Format = nfSource.FormatCode.Value; + } + + private void LoadBorder(Border borderSource, IXLBorder border) + { + if (borderSource == null) return; + + LoadBorderValues(borderSource.DiagonalBorder, border.SetDiagonalBorder, border.SetDiagonalBorderColor); + + if (borderSource.DiagonalUp != null) + border.DiagonalUp = borderSource.DiagonalUp.Value; + if (borderSource.DiagonalDown != null) + border.DiagonalDown = borderSource.DiagonalDown.Value; + + LoadBorderValues(borderSource.LeftBorder, border.SetLeftBorder, border.SetLeftBorderColor); + LoadBorderValues(borderSource.RightBorder, border.SetRightBorder, border.SetRightBorderColor); + LoadBorderValues(borderSource.TopBorder, border.SetTopBorder, border.SetTopBorderColor); + LoadBorderValues(borderSource.BottomBorder, border.SetBottomBorder, border.SetBottomBorderColor); + } + + private void LoadBorderValues(BorderPropertiesType source, Func setBorder, Func setColor) + { + if (source != null) + { + if (source.Style != null) + setBorder(source.Style.Value.ToClosedXml()); + if (source.Color != null) + setColor(source.Color.ToClosedXMLColor(_colorList)); + } + } + + // Differential fills store the patterns differently than other fills + // Actually differential fills make more sense. bg is bg and fg is fg + // 'Other' fills store the bg color in the fg field when pattern type is solid + private void LoadFill(Fill openXMLFill, IXLFill closedXMLFill, Boolean differentialFillFormat) + { + if (openXMLFill == null || openXMLFill.PatternFill == null) return; + + if (openXMLFill.PatternFill.PatternType != null) + closedXMLFill.PatternType = openXMLFill.PatternFill.PatternType.Value.ToClosedXml(); + else + closedXMLFill.PatternType = XLFillPatternValues.Solid; + + switch (closedXMLFill.PatternType) + { + case XLFillPatternValues.None: + break; + + case XLFillPatternValues.Solid: + if (differentialFillFormat) + { + if (openXMLFill.PatternFill.BackgroundColor != null) + closedXMLFill.BackgroundColor = openXMLFill.PatternFill.BackgroundColor.ToClosedXMLColor(_colorList); + else + closedXMLFill.BackgroundColor = XLColor.FromIndex(64); + } + else + { + // yes, source is foreground! + if (openXMLFill.PatternFill.ForegroundColor != null) + closedXMLFill.BackgroundColor = openXMLFill.PatternFill.ForegroundColor.ToClosedXMLColor(_colorList); + else + closedXMLFill.BackgroundColor = XLColor.FromIndex(64); + } + break; + + default: + if (openXMLFill.PatternFill.ForegroundColor != null) + closedXMLFill.PatternColor = openXMLFill.PatternFill.ForegroundColor.ToClosedXMLColor(_colorList); + + if (openXMLFill.PatternFill.BackgroundColor != null) + closedXMLFill.BackgroundColor = openXMLFill.PatternFill.BackgroundColor.ToClosedXMLColor(_colorList); + else + closedXMLFill.BackgroundColor = XLColor.FromIndex(64); + break; + } + } + + private void LoadFont(OpenXmlElement fontSource, IXLFontBase fontBase) + { + if (fontSource == null) return; + + fontBase.Bold = GetBoolean(fontSource.Elements().FirstOrDefault()); + var fontColor = fontSource.Elements().FirstOrDefault(); + if (fontColor != null) + fontBase.FontColor = fontColor.ToClosedXMLColor(_colorList); + + var fontFamilyNumbering = + fontSource.Elements().FirstOrDefault(); + if (fontFamilyNumbering != null && fontFamilyNumbering.Val != null) + fontBase.FontFamilyNumbering = + (XLFontFamilyNumberingValues)Int32.Parse(fontFamilyNumbering.Val.ToString()); + var runFont = fontSource.Elements().FirstOrDefault(); + if (runFont != null) + { + if (runFont.Val != null) + fontBase.FontName = runFont.Val; + } + var fontSize = fontSource.Elements().FirstOrDefault(); + if (fontSize != null) + { + if ((fontSize).Val != null) + fontBase.FontSize = (fontSize).Val; + } + + fontBase.Italic = GetBoolean(fontSource.Elements().FirstOrDefault()); + fontBase.Shadow = GetBoolean(fontSource.Elements().FirstOrDefault()); + fontBase.Strikethrough = GetBoolean(fontSource.Elements().FirstOrDefault()); + + var underline = fontSource.Elements().FirstOrDefault(); + if (underline != null) + { + fontBase.Underline = underline.Val != null ? underline.Val.Value.ToClosedXml() : XLFontUnderlineValues.Single; + } + + var verticalTextAlignment = fontSource.Elements().FirstOrDefault(); + + if (verticalTextAlignment == null) return; + + fontBase.VerticalAlignment = verticalTextAlignment.Val != null ? verticalTextAlignment.Val.Value.ToClosedXml() : XLFontVerticalTextAlignmentValues.Baseline; + } + + private Int32 lastRow; + + private void LoadRows(Stylesheet s, NumberingFormats numberingFormats, Fills fills, Borders borders, Fonts fonts, + XLWorksheet ws, SharedStringItem[] sharedStrings, + Dictionary sharedFormulasR1C1, Dictionary styleList, + Row row) + { + Int32 rowIndex = row.RowIndex == null ? ++lastRow : (Int32)row.RowIndex.Value; + var xlRow = ws.Row(rowIndex, false); + + if (row.Height != null) + xlRow.Height = row.Height; + else + { + xlRow.Loading = true; + xlRow.Height = ws.RowHeight; + xlRow.Loading = false; + } + + if (row.Hidden != null && row.Hidden) + xlRow.Hide(); + + if (row.Collapsed != null && row.Collapsed) + xlRow.Collapsed = true; + + if (row.OutlineLevel != null && row.OutlineLevel > 0) + xlRow.OutlineLevel = row.OutlineLevel; + + if (row.CustomFormat != null) + { + Int32 styleIndex = row.StyleIndex != null ? Int32.Parse(row.StyleIndex.InnerText) : -1; + if (styleIndex >= 0) + { + ApplyStyle(xlRow, styleIndex, s, fills, borders, fonts, numberingFormats); + } + else + { + xlRow.Style = ws.Style; + } + } + + lastColumnNumber = 0; + foreach (Cell cell in row.Elements()) + LoadCells(sharedStrings, s, numberingFormats, fills, borders, fonts, sharedFormulasR1C1, ws, styleList, + cell, rowIndex); + } + + private void LoadColumns(Stylesheet s, NumberingFormats numberingFormats, Fills fills, Borders borders, + Fonts fonts, XLWorksheet ws, Columns columns) + { + if (columns == null) return; + + var wsDefaultColumn = + columns.Elements().FirstOrDefault(c => c.Max == XLHelper.MaxColumnNumber); + + if (wsDefaultColumn != null && wsDefaultColumn.Width != null) + ws.ColumnWidth = wsDefaultColumn.Width - ColumnWidthOffset; + + Int32 styleIndexDefault = wsDefaultColumn != null && wsDefaultColumn.Style != null + ? Int32.Parse(wsDefaultColumn.Style.InnerText) + : -1; + if (styleIndexDefault >= 0) + ApplyStyle(ws, styleIndexDefault, s, fills, borders, fonts, numberingFormats); + + foreach (Column col in columns.Elements()) + { + //IXLStylized toApply; + if (col.Max == XLHelper.MaxColumnNumber) continue; + + var xlColumns = (XLColumns)ws.Columns(col.Min, col.Max); + if (col.Width != null) + { + Double width = col.Width - ColumnWidthOffset; + //if (width < 0) width = 0; + xlColumns.Width = width; + } + else + xlColumns.Width = ws.ColumnWidth; + + if (col.Hidden != null && col.Hidden) + xlColumns.Hide(); + + if (col.Collapsed != null && col.Collapsed) + xlColumns.CollapseOnly(); + + if (col.OutlineLevel != null) + { + var outlineLevel = col.OutlineLevel; + xlColumns.ForEach(c => c.OutlineLevel = outlineLevel); + } + + Int32 styleIndex = col.Style != null ? Int32.Parse(col.Style.InnerText) : -1; + if (styleIndex >= 0) + { + ApplyStyle(xlColumns, styleIndex, s, fills, borders, fonts, numberingFormats); + } + else + { + xlColumns.Style = ws.Style; + } + } + } + + private static XLDataType GetDataTypeFromCell(XLNumberFormatValue numberFormat) + { + var numberFormatId = numberFormat.NumberFormatId; + if (numberFormatId == 46U) + return XLDataType.TimeSpan; + else if ((numberFormatId >= 14 && numberFormatId <= 22) || + (numberFormatId >= 45 && numberFormatId <= 47)) + return XLDataType.DateTime; + else if (numberFormatId == 49) + return XLDataType.Text; + else + { + if (!String.IsNullOrWhiteSpace(numberFormat.Format)) + { + var dataType = GetDataTypeFromFormat(numberFormat.Format); + return dataType.HasValue ? dataType.Value : XLDataType.Number; + } + else + return XLDataType.Number; + } + } + + private static XLDataType? GetDataTypeFromFormat(String format) + { + int length = format.Length; + String f = format.ToLower(); + for (Int32 i = 0; i < length; i++) + { + Char c = f[i]; + if (c == '"') + i = f.IndexOf('"', i + 1); + else if (c == '0' || c == '#' || c == '?') + return XLDataType.Number; + else if (c == 'y' || c == 'm' || c == 'd' || c == 'h' || c == 's') + return XLDataType.DateTime; + } + return null; + } + + private static void LoadAutoFilter(AutoFilter af, XLWorksheet ws) + { + if (af != null) + { + ws.Range(af.Reference.Value).SetAutoFilter(); + var autoFilter = ws.AutoFilter; + LoadAutoFilterSort(af, ws, autoFilter); + LoadAutoFilterColumns(af, autoFilter); + } + } + + private static void LoadAutoFilterColumns(AutoFilter af, XLAutoFilter autoFilter) + { + foreach (var filterColumn in af.Elements()) + { + Int32 column = (int)filterColumn.ColumnId.Value + 1; + if (filterColumn.CustomFilters != null) + { + var filterList = new List(); + autoFilter.Column(column).FilterType = XLFilterType.Custom; + autoFilter.Filters.Add(column, filterList); + XLConnector connector = filterColumn.CustomFilters.And != null && filterColumn.CustomFilters.And.Value ? XLConnector.And : XLConnector.Or; + + Boolean isText = false; + foreach (var filter in filterColumn.CustomFilters.OfType()) + { + String val = filter.Val.Value; + if (!Double.TryParse(val, out Double dTest)) + { + isText = true; + break; + } + } + + foreach (var filter in filterColumn.CustomFilters.OfType()) + { + var xlFilter = new XLFilter { Connector = connector }; + if (isText) + { + // TODO: Treat text BETWEEN functions better + if (filter.Val.Value.StartsWith("*") && filter.Val.Value.EndsWith("*")) + { + var value = filter.Val.Value.Substring(1, filter.Val.Value.Length - 2); + xlFilter.Value = filter.Val.Value; + xlFilter.Condition = s => XLFilterColumn.ContainsFunction(value, s); + } + else if (filter.Val.Value.StartsWith("*")) + { + var value = filter.Val.Value.Substring(1); + xlFilter.Value = filter.Val.Value; + xlFilter.Condition = s => XLFilterColumn.EndsWithFunction(value, s); + } + else if (filter.Val.Value.EndsWith("*")) + { + var value = filter.Val.Value.Substring(0, filter.Val.Value.Length - 1); + xlFilter.Value = filter.Val.Value; + xlFilter.Condition = s => XLFilterColumn.BeginsWithFunction(value, s); + } + else + xlFilter.Value = filter.Val.Value; + } + else + xlFilter.Value = Double.Parse(filter.Val.Value, CultureInfo.InvariantCulture); + + if (filter.Operator != null) + xlFilter.Operator = filter.Operator.Value.ToClosedXml(); + else + xlFilter.Operator = XLFilterOperator.Equal; + + // Unhandled instances - we should actually improve this + if (xlFilter.Condition == null) + { + Func condition = null; + switch (xlFilter.Operator) + { + case XLFilterOperator.Equal: + if (isText) + condition = o => o.ToString().Equals(xlFilter.Value.ToString(), StringComparison.OrdinalIgnoreCase); + else + condition = o => (o as IComparable).CompareTo(xlFilter.Value) == 0; + break; + + case XLFilterOperator.EqualOrGreaterThan: condition = o => (o as IComparable).CompareTo(xlFilter.Value) >= 0; break; + case XLFilterOperator.EqualOrLessThan: condition = o => (o as IComparable).CompareTo(xlFilter.Value) <= 0; break; + case XLFilterOperator.GreaterThan: condition = o => (o as IComparable).CompareTo(xlFilter.Value) > 0; break; + case XLFilterOperator.LessThan: condition = o => (o as IComparable).CompareTo(xlFilter.Value) < 0; break; + case XLFilterOperator.NotEqual: + if (isText) + condition = o => !o.ToString().Equals(xlFilter.Value.ToString(), StringComparison.OrdinalIgnoreCase); + else + condition = o => (o as IComparable).CompareTo(xlFilter.Value) != 0; + break; + } + + xlFilter.Condition = condition; + } + + filterList.Add(xlFilter); + } + } + else if (filterColumn.Filters != null) + { + if (filterColumn.Filters.Elements().All(element => element is Filter)) + autoFilter.Column(column).FilterType = XLFilterType.Regular; + else if (filterColumn.Filters.Elements().All(element => element is DateGroupItem)) + autoFilter.Column(column).FilterType = XLFilterType.DateTimeGrouping; + else + throw new NotSupportedException(String.Format("Mixing regular filters and date group filters in a single autofilter column is not supported. Column {0} of {1}", column, autoFilter.Range.ToString())); + + var filterList = new List(); + + autoFilter.Filters.Add((int)filterColumn.ColumnId.Value + 1, filterList); + + Boolean isText = false; + foreach (var filter in filterColumn.Filters.OfType()) + { + String val = filter.Val.Value; + if (!Double.TryParse(val, NumberStyles.Any, null, out Double dTest)) + { + isText = true; + break; + } + } + + foreach (var filter in filterColumn.Filters.OfType()) + { + var xlFilter = new XLFilter { Connector = XLConnector.Or, Operator = XLFilterOperator.Equal }; + + Func condition; + if (isText) + { + xlFilter.Value = filter.Val.Value; + condition = o => o.ToString().Equals(xlFilter.Value.ToString(), StringComparison.OrdinalIgnoreCase); + } + else + { + xlFilter.Value = Double.Parse(filter.Val.Value, NumberStyles.Any); + condition = o => (o as IComparable).CompareTo(xlFilter.Value) == 0; + } + + xlFilter.Condition = condition; + filterList.Add(xlFilter); + } + + foreach (var dateGroupItem in filterColumn.Filters.OfType()) + { + bool valid = true; + + if (!(dateGroupItem.DateTimeGrouping?.HasValue ?? false)) + continue; + + var xlDateGroupFilter = new XLFilter + { + Connector = XLConnector.Or, + Operator = XLFilterOperator.Equal, + DateTimeGrouping = dateGroupItem.DateTimeGrouping?.Value.ToClosedXml() ?? XLDateTimeGrouping.Year + }; + + int year = 1900; + int month = 1; + int day = 1; + int hour = 0; + int minute = 0; + int second = 0; + + if (xlDateGroupFilter.DateTimeGrouping >= XLDateTimeGrouping.Year) + { + if (dateGroupItem?.Year?.HasValue ?? false) + year = (int)dateGroupItem.Year?.Value; + else + valid &= false; + } + + if (xlDateGroupFilter.DateTimeGrouping >= XLDateTimeGrouping.Month) + { + if (dateGroupItem?.Month?.HasValue ?? false) + month = (int)dateGroupItem.Month?.Value; + else + valid &= false; + } + + if (xlDateGroupFilter.DateTimeGrouping >= XLDateTimeGrouping.Day) + { + if (dateGroupItem?.Day?.HasValue ?? false) + day = (int)dateGroupItem.Day?.Value; + else + valid &= false; + } + + if (xlDateGroupFilter.DateTimeGrouping >= XLDateTimeGrouping.Hour) + { + if (dateGroupItem?.Hour?.HasValue ?? false) + hour = (int)dateGroupItem.Hour?.Value; + else + valid &= false; + } + + if (xlDateGroupFilter.DateTimeGrouping >= XLDateTimeGrouping.Minute) + { + if (dateGroupItem?.Minute?.HasValue ?? false) + minute = (int)dateGroupItem.Minute?.Value; + else + valid &= false; + } + + if (xlDateGroupFilter.DateTimeGrouping >= XLDateTimeGrouping.Second) + { + if (dateGroupItem?.Second?.HasValue ?? false) + second = (int)dateGroupItem.Second?.Value; + else + valid &= false; + } + + var date = new DateTime(year, month, day, hour, minute, second); + xlDateGroupFilter.Value = date; + + xlDateGroupFilter.Condition = date2 => XLDateTimeGroupFilteredColumn.IsMatch(date, (DateTime)date2, xlDateGroupFilter.DateTimeGrouping); + + if (valid) + filterList.Add(xlDateGroupFilter); + } + } + else if (filterColumn.Top10 != null) + { + var xlFilterColumn = autoFilter.Column(column); + autoFilter.Filters.Add(column, null); + xlFilterColumn.FilterType = XLFilterType.TopBottom; + if (filterColumn.Top10.Percent != null && filterColumn.Top10.Percent.Value) + xlFilterColumn.TopBottomType = XLTopBottomType.Percent; + else + xlFilterColumn.TopBottomType = XLTopBottomType.Items; + + if (filterColumn.Top10.Top != null && !filterColumn.Top10.Top.Value) + xlFilterColumn.TopBottomPart = XLTopBottomPart.Bottom; + else + xlFilterColumn.TopBottomPart = XLTopBottomPart.Top; + + xlFilterColumn.TopBottomValue = (int)filterColumn.Top10.Val.Value; + } + else if (filterColumn.DynamicFilter != null) + { + autoFilter.Filters.Add(column, null); + var xlFilterColumn = autoFilter.Column(column); + xlFilterColumn.FilterType = XLFilterType.Dynamic; + if (filterColumn.DynamicFilter.Type != null) + xlFilterColumn.DynamicType = filterColumn.DynamicFilter.Type.Value.ToClosedXml(); + else + xlFilterColumn.DynamicType = XLFilterDynamicType.AboveAverage; + + xlFilterColumn.DynamicValue = filterColumn.DynamicFilter.Val.Value; + } + } + } + + private static void LoadAutoFilterSort(AutoFilter af, XLWorksheet ws, IXLAutoFilter autoFilter) + { + var sort = af.Elements().FirstOrDefault(); + if (sort != null) + { + var condition = sort.Elements().FirstOrDefault(); + if (condition != null) + { + Int32 column = ws.Range(condition.Reference.Value).FirstCell().Address.ColumnNumber - autoFilter.Range.FirstCell().Address.ColumnNumber + 1; + autoFilter.SortColumn = column; + autoFilter.Sorted = true; + autoFilter.SortOrder = condition.Descending != null && condition.Descending.Value ? XLSortOrder.Descending : XLSortOrder.Ascending; + } + } + } + + private static void LoadSheetProtection(SheetProtection sp, XLWorksheet ws) + { + if (sp == null) return; + + ws.Protection.IsProtected = OpenXmlHelper.GetBooleanValueAsBool(sp.Sheet, false); + + var algorithmName = sp.AlgorithmName?.Value ?? string.Empty; + if (String.IsNullOrEmpty(algorithmName)) + { + ws.Protection.PasswordHash = sp.Password?.Value ?? string.Empty; + ws.Protection.Base64EncodedSalt = string.Empty; + } + else if (DescribedEnumParser.IsValidDescription(algorithmName)) + { + ws.Protection.Algorithm = DescribedEnumParser.FromDescription(algorithmName); + ws.Protection.PasswordHash = sp.HashValue?.Value ?? string.Empty; + ws.Protection.SpinCount = sp.SpinCount?.Value ?? 0; + ws.Protection.Base64EncodedSalt = sp.SaltValue?.Value ?? string.Empty; + } + + ws.Protection.AllowElement(XLSheetProtectionElements.FormatCells, !OpenXmlHelper.GetBooleanValueAsBool(sp.FormatCells, true)); + ws.Protection.AllowElement(XLSheetProtectionElements.FormatColumns, !OpenXmlHelper.GetBooleanValueAsBool(sp.FormatColumns, true)); + ws.Protection.AllowElement(XLSheetProtectionElements.FormatRows, !OpenXmlHelper.GetBooleanValueAsBool(sp.FormatRows, true)); + ws.Protection.AllowElement(XLSheetProtectionElements.InsertColumns, !OpenXmlHelper.GetBooleanValueAsBool(sp.InsertColumns, true)); + ws.Protection.AllowElement(XLSheetProtectionElements.InsertHyperlinks, !OpenXmlHelper.GetBooleanValueAsBool(sp.InsertHyperlinks, true)); + ws.Protection.AllowElement(XLSheetProtectionElements.InsertRows, !OpenXmlHelper.GetBooleanValueAsBool(sp.InsertRows, true)); + ws.Protection.AllowElement(XLSheetProtectionElements.DeleteColumns, !OpenXmlHelper.GetBooleanValueAsBool(sp.DeleteColumns, true)); + ws.Protection.AllowElement(XLSheetProtectionElements.DeleteRows, !OpenXmlHelper.GetBooleanValueAsBool(sp.DeleteRows, true)); + ws.Protection.AllowElement(XLSheetProtectionElements.AutoFilter, !OpenXmlHelper.GetBooleanValueAsBool(sp.AutoFilter, true)); + ws.Protection.AllowElement(XLSheetProtectionElements.PivotTables, !OpenXmlHelper.GetBooleanValueAsBool(sp.PivotTables, true)); + ws.Protection.AllowElement(XLSheetProtectionElements.Sort, !OpenXmlHelper.GetBooleanValueAsBool(sp.Sort, true)); + ws.Protection.AllowElement(XLSheetProtectionElements.EditScenarios, !OpenXmlHelper.GetBooleanValueAsBool(sp.Scenarios, true)); + + ws.Protection.AllowElement(XLSheetProtectionElements.EditObjects, !OpenXmlHelper.GetBooleanValueAsBool(sp.Objects, false)); + ws.Protection.AllowElement(XLSheetProtectionElements.SelectLockedCells, !OpenXmlHelper.GetBooleanValueAsBool(sp.SelectLockedCells, false)); + ws.Protection.AllowElement(XLSheetProtectionElements.SelectUnlockedCells, !OpenXmlHelper.GetBooleanValueAsBool(sp.SelectUnlockedCells, false)); + } + + private static void LoadDataValidations(DataValidations dataValidations, XLWorksheet ws) + { + if (dataValidations == null) return; + + foreach (DataValidation dvs in dataValidations.Elements()) + { + String txt = dvs.SequenceOfReferences.InnerText; + if (String.IsNullOrWhiteSpace(txt)) continue; + foreach (var rangeAddress in txt.Split(' ')) + { + var dvt = new XLDataValidation(ws.Range(rangeAddress)); + ws.DataValidations.Add(dvt, skipIntersectionsCheck: true); + if (dvs.AllowBlank != null) dvt.IgnoreBlanks = dvs.AllowBlank; + if (dvs.ShowDropDown != null) dvt.InCellDropdown = !dvs.ShowDropDown.Value; + if (dvs.ShowErrorMessage != null) dvt.ShowErrorMessage = dvs.ShowErrorMessage; + if (dvs.ShowInputMessage != null) dvt.ShowInputMessage = dvs.ShowInputMessage; + if (dvs.PromptTitle != null) dvt.InputTitle = dvs.PromptTitle; + if (dvs.Prompt != null) dvt.InputMessage = dvs.Prompt; + if (dvs.ErrorTitle != null) dvt.ErrorTitle = dvs.ErrorTitle; + if (dvs.Error != null) dvt.ErrorMessage = dvs.Error; + if (dvs.ErrorStyle != null) dvt.ErrorStyle = dvs.ErrorStyle.Value.ToClosedXml(); + if (dvs.Type != null) dvt.AllowedValues = dvs.Type.Value.ToClosedXml(); + if (dvs.Operator != null) dvt.Operator = dvs.Operator.Value.ToClosedXml(); + if (dvs.Formula1 != null) dvt.MinValue = dvs.Formula1.Text; + if (dvs.Formula2 != null) dvt.MaxValue = dvs.Formula2.Text; + } + } + } + + /// + /// Loads the conditional formatting. + /// + // https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.conditionalformattingrule%28v=office.15%29.aspx?f=255&MSPPError=-2147217396 + private void LoadConditionalFormatting(ConditionalFormatting conditionalFormatting, XLWorksheet ws, + Dictionary differentialFormats) + { + if (conditionalFormatting == null) return; + + foreach (var fr in conditionalFormatting.Elements()) + { + var ranges = conditionalFormatting.SequenceOfReferences.Items + .Select(sor => ws.Range(sor.Value)); + var conditionalFormat = new XLConditionalFormat(ranges); + + conditionalFormat.StopIfTrue = OpenXmlHelper.GetBooleanValueAsBool(fr.StopIfTrue, false); + + if (fr.FormatId != null) + { + LoadFont(differentialFormats[(Int32)fr.FormatId.Value].Font, conditionalFormat.Style.Font); + LoadFill(differentialFormats[(Int32)fr.FormatId.Value].Fill, conditionalFormat.Style.Fill, + differentialFillFormat: true); + LoadBorder(differentialFormats[(Int32)fr.FormatId.Value].Border, conditionalFormat.Style.Border); + LoadNumberFormat(differentialFormats[(Int32)fr.FormatId.Value].NumberingFormat, + conditionalFormat.Style.NumberFormat); + } + + // The conditional formatting type is compulsory. If it doesn't exist, skip the entire rule. + if (fr.Type == null) continue; + conditionalFormat.ConditionalFormatType = fr.Type.Value.ToClosedXml(); + conditionalFormat.OriginalPriority = fr.Priority?.Value ?? Int32.MaxValue; + + if (conditionalFormat.ConditionalFormatType == XLConditionalFormatType.CellIs && fr.Operator != null) + conditionalFormat.Operator = fr.Operator.Value.ToClosedXml(); + + if (!String.IsNullOrWhiteSpace(fr.Text)) + conditionalFormat.Values.Add(GetFormula(fr.Text.Value)); + + if (conditionalFormat.ConditionalFormatType == XLConditionalFormatType.Top10) + { + if (fr.Percent != null) + conditionalFormat.Percent = fr.Percent.Value; + if (fr.Bottom != null) + conditionalFormat.Bottom = fr.Bottom.Value; + if (fr.Rank != null) + conditionalFormat.Values.Add(GetFormula(fr.Rank.Value.ToString())); + } + else if (conditionalFormat.ConditionalFormatType == XLConditionalFormatType.TimePeriod) + { + if (fr.TimePeriod != null) + conditionalFormat.TimePeriod = fr.TimePeriod.Value.ToClosedXml(); + else + conditionalFormat.TimePeriod = XLTimePeriod.Yesterday; + } + + if (fr.Elements().Any()) + { + var colorScale = fr.Elements().First(); + ExtractConditionalFormatValueObjects(conditionalFormat, colorScale); + } + else if (fr.Elements().Any()) + { + var dataBar = fr.Elements().First(); + if (dataBar.ShowValue != null) + conditionalFormat.ShowBarOnly = !dataBar.ShowValue.Value; + + var id = fr.Descendants().FirstOrDefault(); + if (id != null && id.Text != null && !String.IsNullOrWhiteSpace(id.Text)) + conditionalFormat.Id = new Guid(id.Text.Substring(1, id.Text.Length - 2)); + + ExtractConditionalFormatValueObjects(conditionalFormat, dataBar); + } + else if (fr.Elements().Any()) + { + var iconSet = fr.Elements().First(); + if (iconSet.ShowValue != null) + conditionalFormat.ShowIconOnly = !iconSet.ShowValue.Value; + if (iconSet.Reverse != null) + conditionalFormat.ReverseIconOrder = iconSet.Reverse.Value; + + if (iconSet.IconSetValue != null) + conditionalFormat.IconSetStyle = iconSet.IconSetValue.Value.ToClosedXml(); + else + conditionalFormat.IconSetStyle = XLIconSetStyle.ThreeTrafficLights1; + + ExtractConditionalFormatValueObjects(conditionalFormat, iconSet); + } + else + { + foreach (var formula in fr.Elements()) + { + if (formula.Text != null + && (conditionalFormat.ConditionalFormatType == XLConditionalFormatType.CellIs + || conditionalFormat.ConditionalFormatType == XLConditionalFormatType.Expression)) + { + conditionalFormat.Values.Add(GetFormula(formula.Text)); + } + } + } + + ws.ConditionalFormats.Add(conditionalFormat); + } + } + + private void LoadExtensions(WorksheetExtensionList extensions, XLWorksheet ws) + { + if (extensions == null) + { + return; + } + + foreach (var conditionalFormattingRule in extensions + .Descendants() + .Where(cf => + cf.Type != null + && cf.Type.HasValue + && cf.Type.Value == ConditionalFormatValues.DataBar)) + { + var xlConditionalFormat = ws.ConditionalFormats + .Cast() + .SingleOrDefault(cf => cf.Id.WrapInBraces() == conditionalFormattingRule.Id); + if (xlConditionalFormat != null) + { + var negativeFillColor = conditionalFormattingRule.Descendants().SingleOrDefault(); + xlConditionalFormat.Colors.Add(negativeFillColor.ToClosedXMLColor(_colorList)); + } + } + + foreach (var slg in extensions + .Descendants() + .SelectMany(sparklineGroups => sparklineGroups.Descendants())) + { + var xlSparklineGroup = (ws.SparklineGroups as XLSparklineGroups).Add(); + + if (slg.Formula != null) + xlSparklineGroup.DateRange = Range(slg.Formula.Text); + + var xlSparklineStyle = xlSparklineGroup.Style; + if (slg.FirstMarkerColor != null) xlSparklineStyle.FirstMarkerColor = slg.FirstMarkerColor.ToClosedXMLColor(); + if (slg.LastMarkerColor != null) xlSparklineStyle.LastMarkerColor = slg.LastMarkerColor.ToClosedXMLColor(); + if (slg.HighMarkerColor != null) xlSparklineStyle.HighMarkerColor = slg.HighMarkerColor.ToClosedXMLColor(); + if (slg.LowMarkerColor != null) xlSparklineStyle.LowMarkerColor = slg.LowMarkerColor.ToClosedXMLColor(); + if (slg.SeriesColor != null) xlSparklineStyle.SeriesColor = slg.SeriesColor.ToClosedXMLColor(); + if (slg.NegativeColor != null) xlSparklineStyle.NegativeColor = slg.NegativeColor.ToClosedXMLColor(); + if (slg.MarkersColor != null) xlSparklineStyle.MarkersColor = slg.MarkersColor.ToClosedXMLColor(); + xlSparklineGroup.Style = xlSparklineStyle; + + if (slg.DisplayHidden != null) xlSparklineGroup.DisplayHidden = slg.DisplayHidden; + if (slg.LineWeight != null) xlSparklineGroup.LineWeight = slg.LineWeight; + if (slg.Type != null) xlSparklineGroup.Type = slg.Type.Value.ToClosedXml(); + if (slg.DisplayEmptyCellsAs != null) xlSparklineGroup.DisplayEmptyCellsAs = slg.DisplayEmptyCellsAs.Value.ToClosedXml(); + + xlSparklineGroup.ShowMarkers = XLSparklineMarkers.None; + if (OpenXmlHelper.GetBooleanValueAsBool(slg.Markers, false)) xlSparklineGroup.ShowMarkers |= XLSparklineMarkers.Markers; + if (OpenXmlHelper.GetBooleanValueAsBool(slg.High, false)) xlSparklineGroup.ShowMarkers |= XLSparklineMarkers.HighPoint; + if (OpenXmlHelper.GetBooleanValueAsBool(slg.Low, false)) xlSparklineGroup.ShowMarkers |= XLSparklineMarkers.LowPoint; + if (OpenXmlHelper.GetBooleanValueAsBool(slg.First, false)) xlSparklineGroup.ShowMarkers |= XLSparklineMarkers.FirstPoint; + if (OpenXmlHelper.GetBooleanValueAsBool(slg.Last, false)) xlSparklineGroup.ShowMarkers |= XLSparklineMarkers.LastPoint; + if (OpenXmlHelper.GetBooleanValueAsBool(slg.Negative, false)) xlSparklineGroup.ShowMarkers |= XLSparklineMarkers.NegativePoints; + + if (slg.AxisColor != null) xlSparklineGroup.HorizontalAxis.Color = ExtractColor(slg.AxisColor.Rgb.Value); + if (slg.DisplayXAxis != null) xlSparklineGroup.HorizontalAxis.IsVisible = slg.DisplayXAxis; + if (slg.RightToLeft != null) xlSparklineGroup.HorizontalAxis.RightToLeft = slg.RightToLeft; + + if (slg.ManualMax != null) xlSparklineGroup.VerticalAxis.ManualMax = slg.ManualMax; + if (slg.ManualMin != null) xlSparklineGroup.VerticalAxis.ManualMin = slg.ManualMin; + if (slg.MinAxisType != null) xlSparklineGroup.VerticalAxis.MinAxisType = slg.MinAxisType.Value.ToClosedXml(); + if (slg.MaxAxisType != null) xlSparklineGroup.VerticalAxis.MaxAxisType = slg.MaxAxisType.Value.ToClosedXml(); + + slg.Descendants().SelectMany(sls => sls.Descendants()) + .ForEach(sl => xlSparklineGroup.Add(sl.ReferenceSequence?.Text, sl.Formula?.Text)); + } + } + + private static void LoadWorkbookProtection(WorkbookProtection wp, XLWorkbook wb) + { + if (wp == null) return; + + wb.Protection.IsProtected = true; + + var algorithmName = wp.WorkbookAlgorithmName?.Value ?? string.Empty; + if (String.IsNullOrEmpty(algorithmName)) + { + wb.Protection.PasswordHash = wp.WorkbookPassword?.Value ?? string.Empty; + wb.Protection.Base64EncodedSalt = string.Empty; + } + else if (DescribedEnumParser.IsValidDescription(algorithmName)) + { + wb.Protection.Algorithm = DescribedEnumParser.FromDescription(algorithmName); + wb.Protection.PasswordHash = wp.WorkbookHashValue?.Value ?? string.Empty; + wb.Protection.SpinCount = wp.WorkbookSpinCount?.Value ?? 0; + wb.Protection.Base64EncodedSalt = wp.WorkbookSaltValue?.Value ?? string.Empty; + } + + wb.Protection.AllowElement(XLWorkbookProtectionElements.Structure, !OpenXmlHelper.GetBooleanValueAsBool(wp.LockStructure, false)); + wb.Protection.AllowElement(XLWorkbookProtectionElements.Windows, !OpenXmlHelper.GetBooleanValueAsBool(wp.LockWindows, false)); + } + + private static XLFormula GetFormula(String value) + { + var formula = new XLFormula(); + formula._value = value; + formula.IsFormula = !(value[0] == '"' && value.EndsWith("\"")); + return formula; + } + + private void ExtractConditionalFormatValueObjects(XLConditionalFormat conditionalFormat, OpenXmlElement element) + { + foreach (var c in element.Elements()) + { + if (c.Type != null) + conditionalFormat.ContentTypes.Add(c.Type.Value.ToClosedXml()); + if (c.Val != null) + conditionalFormat.Values.Add(new XLFormula { Value = c.Val.Value }); + else + conditionalFormat.Values.Add(null); + + if (c.GreaterThanOrEqual != null) + conditionalFormat.IconSetOperators.Add(c.GreaterThanOrEqual.Value ? XLCFIconSetOperator.EqualOrGreaterThan : XLCFIconSetOperator.GreaterThan); + else + conditionalFormat.IconSetOperators.Add(XLCFIconSetOperator.EqualOrGreaterThan); + } + foreach (var c in element.Elements()) + { + conditionalFormat.Colors.Add(c.ToClosedXMLColor(_colorList)); + } + } + + private static void LoadHyperlinks(Hyperlinks hyperlinks, WorksheetPart worksheetPart, XLWorksheet ws) + { + var hyperlinkDictionary = new Dictionary(); + if (worksheetPart.HyperlinkRelationships != null) + hyperlinkDictionary = worksheetPart.HyperlinkRelationships.ToDictionary(hr => hr.Id, hr => hr.Uri); + + if (hyperlinks == null) return; + + foreach (Hyperlink hl in hyperlinks.Elements()) + { + if (hl.Reference.Value.Equals("#REF")) continue; + String tooltip = hl.Tooltip != null ? hl.Tooltip.Value : String.Empty; + var xlRange = ws.Range(hl.Reference.Value); + foreach (XLCell xlCell in xlRange.Cells()) + { + xlCell.SettingHyperlink = true; + + if (hl.Id != null) + xlCell.Hyperlink = new XLHyperlink(hyperlinkDictionary[hl.Id], tooltip); + else if (hl.Location != null) + xlCell.Hyperlink = new XLHyperlink(hl.Location.Value, tooltip); + else + xlCell.Hyperlink = new XLHyperlink(hl.Reference.Value, tooltip); + + xlCell.SettingHyperlink = false; + } + } + } + + private static void LoadColumnBreaks(ColumnBreaks columnBreaks, XLWorksheet ws) + { + if (columnBreaks == null) return; + + foreach (Break columnBreak in columnBreaks.Elements().Where(columnBreak => columnBreak.Id != null)) + { + ws.PageSetup.ColumnBreaks.Add(Int32.Parse(columnBreak.Id.InnerText)); + } + } + + private static void LoadRowBreaks(RowBreaks rowBreaks, XLWorksheet ws) + { + if (rowBreaks == null) return; + + foreach (Break rowBreak in rowBreaks.Elements()) + ws.PageSetup.RowBreaks.Add(Int32.Parse(rowBreak.Id.InnerText)); + } + + private void LoadSheetProperties(SheetProperties sheetProperty, XLWorksheet ws, out PageSetupProperties pageSetupProperties) + { + pageSetupProperties = null; + if (sheetProperty == null) return; + + if (sheetProperty.TabColor != null) + ws.TabColor = sheetProperty.TabColor.ToClosedXMLColor(_colorList); + + if (sheetProperty.OutlineProperties != null) + { + if (sheetProperty.OutlineProperties.SummaryBelow != null) + { + ws.Outline.SummaryVLocation = sheetProperty.OutlineProperties.SummaryBelow + ? XLOutlineSummaryVLocation.Bottom + : XLOutlineSummaryVLocation.Top; + } + + if (sheetProperty.OutlineProperties.SummaryRight != null) + { + ws.Outline.SummaryHLocation = sheetProperty.OutlineProperties.SummaryRight + ? XLOutlineSummaryHLocation.Right + : XLOutlineSummaryHLocation.Left; + } + } + + if (sheetProperty.PageSetupProperties != null) + pageSetupProperties = sheetProperty.PageSetupProperties; + } + + private static void LoadHeaderFooter(HeaderFooter headerFooter, XLWorksheet ws) + { + if (headerFooter == null) return; + + if (headerFooter.AlignWithMargins != null) + ws.PageSetup.AlignHFWithMargins = headerFooter.AlignWithMargins; + if (headerFooter.ScaleWithDoc != null) + ws.PageSetup.ScaleHFWithDocument = headerFooter.ScaleWithDoc; + + if (headerFooter.DifferentFirst != null) + ws.PageSetup.DifferentFirstPageOnHF = headerFooter.DifferentFirst; + if (headerFooter.DifferentOddEven != null) + ws.PageSetup.DifferentOddEvenPagesOnHF = headerFooter.DifferentOddEven; + + // Footers + var xlFooter = (XLHeaderFooter)ws.PageSetup.Footer; + var evenFooter = headerFooter.EvenFooter; + if (evenFooter != null) + xlFooter.SetInnerText(XLHFOccurrence.EvenPages, evenFooter.Text); + var oddFooter = headerFooter.OddFooter; + if (oddFooter != null) + xlFooter.SetInnerText(XLHFOccurrence.OddPages, oddFooter.Text); + var firstFooter = headerFooter.FirstFooter; + if (firstFooter != null) + xlFooter.SetInnerText(XLHFOccurrence.FirstPage, firstFooter.Text); + // Headers + var xlHeader = (XLHeaderFooter)ws.PageSetup.Header; + var evenHeader = headerFooter.EvenHeader; + if (evenHeader != null) + xlHeader.SetInnerText(XLHFOccurrence.EvenPages, evenHeader.Text); + var oddHeader = headerFooter.OddHeader; + if (oddHeader != null) + xlHeader.SetInnerText(XLHFOccurrence.OddPages, oddHeader.Text); + var firstHeader = headerFooter.FirstHeader; + if (firstHeader != null) + xlHeader.SetInnerText(XLHFOccurrence.FirstPage, firstHeader.Text); + + ((XLHeaderFooter)ws.PageSetup.Header).SetAsInitial(); + ((XLHeaderFooter)ws.PageSetup.Footer).SetAsInitial(); + } + + private static void LoadPageSetup(PageSetup pageSetup, XLWorksheet ws, PageSetupProperties pageSetupProperties) + { + if (pageSetup == null) return; + + if (pageSetup.PaperSize != null) + ws.PageSetup.PaperSize = (XLPaperSize)Int32.Parse(pageSetup.PaperSize.InnerText); + if (pageSetup.Scale != null) + ws.PageSetup.Scale = Int32.Parse(pageSetup.Scale.InnerText); + if (pageSetupProperties != null && pageSetupProperties.FitToPage != null && pageSetupProperties.FitToPage.Value) + { + if (pageSetup.FitToWidth == null) + ws.PageSetup.PagesWide = 1; + else + ws.PageSetup.PagesWide = Int32.Parse(pageSetup.FitToWidth.InnerText); + + if (pageSetup.FitToHeight == null) + ws.PageSetup.PagesTall = 1; + else + ws.PageSetup.PagesTall = Int32.Parse(pageSetup.FitToHeight.InnerText); + } + if (pageSetup.PageOrder != null) + ws.PageSetup.PageOrder = pageSetup.PageOrder.Value.ToClosedXml(); + if (pageSetup.Orientation != null) + ws.PageSetup.PageOrientation = pageSetup.Orientation.Value.ToClosedXml(); + if (pageSetup.BlackAndWhite != null) + ws.PageSetup.BlackAndWhite = pageSetup.BlackAndWhite; + if (pageSetup.Draft != null) + ws.PageSetup.DraftQuality = pageSetup.Draft; + if (pageSetup.CellComments != null) + ws.PageSetup.ShowComments = pageSetup.CellComments.Value.ToClosedXml(); + if (pageSetup.Errors != null) + ws.PageSetup.PrintErrorValue = pageSetup.Errors.Value.ToClosedXml(); + if (pageSetup.HorizontalDpi != null) ws.PageSetup.HorizontalDpi = (Int32)pageSetup.HorizontalDpi.Value; + if (pageSetup.VerticalDpi != null) ws.PageSetup.VerticalDpi = (Int32)pageSetup.VerticalDpi.Value; + if (pageSetup.FirstPageNumber?.HasValue ?? false) + ws.PageSetup.FirstPageNumber = pageSetup.FirstPageNumber.Value; + } + + private static void LoadPageMargins(PageMargins pageMargins, XLWorksheet ws) + { + if (pageMargins == null) return; + + if (pageMargins.Bottom != null) + ws.PageSetup.Margins.Bottom = pageMargins.Bottom; + if (pageMargins.Footer != null) + ws.PageSetup.Margins.Footer = pageMargins.Footer; + if (pageMargins.Header != null) + ws.PageSetup.Margins.Header = pageMargins.Header; + if (pageMargins.Left != null) + ws.PageSetup.Margins.Left = pageMargins.Left; + if (pageMargins.Right != null) + ws.PageSetup.Margins.Right = pageMargins.Right; + if (pageMargins.Top != null) + ws.PageSetup.Margins.Top = pageMargins.Top; + } + + private static void LoadPrintOptions(PrintOptions printOptions, XLWorksheet ws) + { + if (printOptions == null) return; + + if (printOptions.GridLines != null) + ws.PageSetup.ShowGridlines = printOptions.GridLines; + if (printOptions.HorizontalCentered != null) + ws.PageSetup.CenterHorizontally = printOptions.HorizontalCentered; + if (printOptions.VerticalCentered != null) + ws.PageSetup.CenterVertically = printOptions.VerticalCentered; + if (printOptions.Headings != null) + ws.PageSetup.ShowRowAndColumnHeadings = printOptions.Headings; + } + + private static void LoadSheetViews(SheetViews sheetViews, XLWorksheet ws) + { + if (sheetViews == null) return; + + var sheetView = sheetViews.Elements().FirstOrDefault(); + + if (sheetView == null) return; + + if (sheetView.RightToLeft != null) ws.RightToLeft = sheetView.RightToLeft.Value; + if (sheetView.ShowFormulas != null) ws.ShowFormulas = sheetView.ShowFormulas.Value; + if (sheetView.ShowGridLines != null) ws.ShowGridLines = sheetView.ShowGridLines.Value; + if (sheetView.ShowOutlineSymbols != null) + ws.ShowOutlineSymbols = sheetView.ShowOutlineSymbols.Value; + if (sheetView.ShowRowColHeaders != null) ws.ShowRowColHeaders = sheetView.ShowRowColHeaders.Value; + if (sheetView.ShowRuler != null) ws.ShowRuler = sheetView.ShowRuler.Value; + if (sheetView.ShowWhiteSpace != null) ws.ShowWhiteSpace = sheetView.ShowWhiteSpace.Value; + if (sheetView.ShowZeros != null) ws.ShowZeros = sheetView.ShowZeros.Value; + if (sheetView.TabSelected != null) ws.TabSelected = sheetView.TabSelected.Value; + + var selection = sheetView.Elements().FirstOrDefault(); + if (selection != null) + { + if (selection.SequenceOfReferences != null) + ws.Ranges(selection.SequenceOfReferences.InnerText.Replace(" ", ",")).Select(); + + if (selection.ActiveCell != null) + ws.Cell(selection.ActiveCell).SetActive(); + } + + if (sheetView.ZoomScale != null) + ws.SheetView.ZoomScale = (int)UInt32Value.ToUInt32(sheetView.ZoomScale); + if (sheetView.ZoomScaleNormal != null) + ws.SheetView.ZoomScaleNormal = (int)UInt32Value.ToUInt32(sheetView.ZoomScaleNormal); + if (sheetView.ZoomScalePageLayoutView != null) + ws.SheetView.ZoomScalePageLayoutView = (int)UInt32Value.ToUInt32(sheetView.ZoomScalePageLayoutView); + if (sheetView.ZoomScaleSheetLayoutView != null) + ws.SheetView.ZoomScaleSheetLayoutView = (int)UInt32Value.ToUInt32(sheetView.ZoomScaleSheetLayoutView); + + var pane = sheetView.Elements().FirstOrDefault(); + if (new[] { PaneStateValues.Frozen, PaneStateValues.FrozenSplit }.Contains(pane?.State?.Value ?? PaneStateValues.Split)) + { + if (pane.HorizontalSplit != null) + ws.SheetView.SplitColumn = (Int32)pane.HorizontalSplit.Value; + if (pane.VerticalSplit != null) + ws.SheetView.SplitRow = (Int32)pane.VerticalSplit.Value; + } + + if (XLHelper.IsValidA1Address(sheetView.TopLeftCell)) + ws.SheetView.TopLeftCellAddress = ws.Cell(sheetView.TopLeftCell.Value).Address; + } + + private void SetProperties(SpreadsheetDocument dSpreadsheet) + { + var p = dSpreadsheet.PackageProperties; + Properties.Author = p.Creator; + Properties.Category = p.Category; + Properties.Comments = p.Description; + if (p.Created != null) + Properties.Created = p.Created.Value; + if (p.Modified != null) + Properties.Modified = p.Modified.Value; + Properties.Keywords = p.Keywords; + Properties.LastModifiedBy = p.LastModifiedBy; + Properties.Status = p.ContentStatus; + Properties.Subject = p.Subject; + Properties.Title = p.Title; + } + + private void ApplyStyle(IXLStylized xlStylized, Int32 styleIndex, Stylesheet s, Fills fills, Borders borders, + Fonts fonts, NumberingFormats numberingFormats) + { + if (s == null) return; //No Stylesheet, no Styles + + var cellFormat = (CellFormat)s.CellFormats.ElementAt(styleIndex); + + var xlStyle = XLStyle.Default.Key; + + xlStyle.IncludeQuotePrefix = OpenXmlHelper.GetBooleanValueAsBool(cellFormat.QuotePrefix, false); + + if (cellFormat.ApplyProtection != null) + { + var protection = cellFormat.Protection; + + if (protection == null) + xlStyle.Protection = XLProtectionValue.Default.Key; + else + { + xlStyle.Protection = new XLProtectionKey + { + Hidden = protection.Hidden != null && protection.Hidden.HasValue && + protection.Hidden.Value, + Locked = protection.Locked == null || + (protection.Locked.HasValue && protection.Locked.Value) + }; + } + } + + if (UInt32HasValue(cellFormat.FillId)) + { + var fill = (Fill)fills.ElementAt((Int32)cellFormat.FillId.Value); + if (fill.PatternFill != null) + { + LoadFill(fill, xlStylized.InnerStyle.Fill, differentialFillFormat: false); + } + xlStyle.Fill = (xlStylized.InnerStyle as XLStyle).Value.Key.Fill; + } + + var alignment = cellFormat.Alignment; + if (alignment != null) + { + var xlAlignment = xlStyle.Alignment; + if (alignment.Horizontal != null) + xlAlignment.Horizontal = alignment.Horizontal.Value.ToClosedXml(); + if (alignment.Indent != null && alignment.Indent != 0) + xlAlignment.Indent = Int32.Parse(alignment.Indent.ToString()); + if (alignment.JustifyLastLine != null) + xlAlignment.JustifyLastLine = alignment.JustifyLastLine; + if (alignment.ReadingOrder != null) + { + xlAlignment.ReadingOrder = + (XLAlignmentReadingOrderValues)Int32.Parse(alignment.ReadingOrder.ToString()); + } + if (alignment.RelativeIndent != null) + xlAlignment.RelativeIndent = alignment.RelativeIndent; + if (alignment.ShrinkToFit != null) + xlAlignment.ShrinkToFit = alignment.ShrinkToFit; + if (alignment.TextRotation != null) + xlAlignment.TextRotation = (Int32)alignment.TextRotation.Value; + if (alignment.Vertical != null) + xlAlignment.Vertical = alignment.Vertical.Value.ToClosedXml(); + if (alignment.WrapText != null) + xlAlignment.WrapText = alignment.WrapText; + + xlStyle.Alignment = xlAlignment; + } + + if (UInt32HasValue(cellFormat.BorderId)) + { + uint borderId = cellFormat.BorderId.Value; + var border = (Border)borders.ElementAt((Int32)borderId); + var xlBorder = xlStyle.Border; + if (border != null) + { + var bottomBorder = border.BottomBorder; + if (bottomBorder != null) + { + if (bottomBorder.Style != null) + xlBorder.BottomBorder = bottomBorder.Style.Value.ToClosedXml(); + + if (bottomBorder.Color != null) + xlBorder.BottomBorderColor = bottomBorder.Color.ToClosedXMLColor(_colorList).Key; + } + var topBorder = border.TopBorder; + if (topBorder != null) + { + if (topBorder.Style != null) + xlBorder.TopBorder = topBorder.Style.Value.ToClosedXml(); + if (topBorder.Color != null) + xlBorder.TopBorderColor = topBorder.Color.ToClosedXMLColor(_colorList).Key; + } + var leftBorder = border.LeftBorder; + if (leftBorder != null) + { + if (leftBorder.Style != null) + xlBorder.LeftBorder = leftBorder.Style.Value.ToClosedXml(); + if (leftBorder.Color != null) + xlBorder.LeftBorderColor = leftBorder.Color.ToClosedXMLColor(_colorList).Key; + } + var rightBorder = border.RightBorder; + if (rightBorder != null) + { + if (rightBorder.Style != null) + xlBorder.RightBorder = rightBorder.Style.Value.ToClosedXml(); + if (rightBorder.Color != null) + xlBorder.RightBorderColor = rightBorder.Color.ToClosedXMLColor(_colorList).Key; + } + var diagonalBorder = border.DiagonalBorder; + if (diagonalBorder != null) + { + if (diagonalBorder.Style != null) + xlBorder.DiagonalBorder = diagonalBorder.Style.Value.ToClosedXml(); + if (diagonalBorder.Color != null) + xlBorder.DiagonalBorderColor = diagonalBorder.Color.ToClosedXMLColor(_colorList).Key; + if (border.DiagonalDown != null) + xlBorder.DiagonalDown = border.DiagonalDown; + if (border.DiagonalUp != null) + xlBorder.DiagonalUp = border.DiagonalUp; + } + + xlStyle.Border = xlBorder; + } + } + + if (UInt32HasValue(cellFormat.FontId)) + { + var fontId = cellFormat.FontId; + var font = (DocumentFormat.OpenXml.Spreadsheet.Font)fonts.ElementAt((Int32)fontId.Value); + + var xlFont = xlStyle.Font; + if (font != null) + { + xlFont.Bold = GetBoolean(font.Bold); + + if (font.Color != null) + xlFont.FontColor = font.Color.ToClosedXMLColor(_colorList).Key; + + if (font.FontFamilyNumbering != null && (font.FontFamilyNumbering).Val != null) + { + xlFont.FontFamilyNumbering = + (XLFontFamilyNumberingValues)Int32.Parse((font.FontFamilyNumbering).Val.ToString()); + } + if (font.FontName != null) + { + if ((font.FontName).Val != null) + xlFont.FontName = (font.FontName).Val; + } + if (font.FontSize != null) + { + if ((font.FontSize).Val != null) + xlFont.FontSize = (font.FontSize).Val; + } + + xlFont.Italic = GetBoolean(font.Italic); + xlFont.Shadow = GetBoolean(font.Shadow); + xlFont.Strikethrough = GetBoolean(font.Strike); + + if (font.Underline != null) + { + xlFont.Underline = font.Underline.Val != null + ? (font.Underline).Val.Value.ToClosedXml() + : XLFontUnderlineValues.Single; + } + + if (font.VerticalTextAlignment != null) + { + xlFont.VerticalAlignment = font.VerticalTextAlignment.Val != null + ? (font.VerticalTextAlignment).Val.Value.ToClosedXml() + : XLFontVerticalTextAlignmentValues.Baseline; + } + + xlStyle.Font = xlFont; + } + } + + if (UInt32HasValue(cellFormat.NumberFormatId)) + { + var numberFormatId = cellFormat.NumberFormatId; + + string formatCode = String.Empty; + if (numberingFormats != null) + { + var numberingFormat = + numberingFormats.FirstOrDefault( + nf => + ((NumberingFormat)nf).NumberFormatId != null && + ((NumberingFormat)nf).NumberFormatId.Value == numberFormatId) as NumberingFormat; + + if (numberingFormat != null && numberingFormat.FormatCode != null) + formatCode = numberingFormat.FormatCode.Value; + } + + var xlNumberFormat = xlStyle.NumberFormat; + if (formatCode.Length > 0) + { + xlNumberFormat.Format = formatCode; + xlNumberFormat.NumberFormatId = -1; + } + else + xlNumberFormat.NumberFormatId = (Int32)numberFormatId.Value; + xlStyle.NumberFormat = xlNumberFormat; + } + + //When loading columns we must propagate style to each column but not deeper. In other cases we do not propagate at all. + if (xlStylized is IXLColumns columns) + columns.Cast().ForEach(col => col.InnerStyle = new XLStyle(col, xlStyle)); + else + xlStylized.InnerStyle = new XLStyle(xlStylized, xlStyle); + } + + private static Boolean UInt32HasValue(UInt32Value value) + { + return value != null && value.HasValue; + } + + private static Boolean GetBoolean(BooleanPropertyType property) + { + if (property != null) + { + if (property.Val != null) + return property.Val; + return true; + } + + return false; + } + } +} diff --git a/ClosedXML/Excel/XLWorkbook_Save.NestedTypes.cs b/ClosedXML/Excel/XLWorkbook_Save.NestedTypes.cs new file mode 100644 index 0000000..308ebe7 --- /dev/null +++ b/ClosedXML/Excel/XLWorkbook_Save.NestedTypes.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + public partial class XLWorkbook + { + #region Nested type: SaveContext + + internal sealed class SaveContext + { + public SaveContext() + { + DifferentialFormats = new Dictionary(); + PivotTables = new Dictionary(); + RelIdGenerator = new RelIdGenerator(); + SharedFonts = new Dictionary(); + SharedNumberFormats = new Dictionary(); + SharedStyles = new Dictionary(); + TableId = 0; + TableNames = new HashSet(); + } + + public Dictionary DifferentialFormats { get; private set; } + public IDictionary PivotTables { get; private set; } + public RelIdGenerator RelIdGenerator { get; private set; } + public Dictionary SharedFonts { get; private set; } + public Dictionary SharedNumberFormats { get; private set; } + public Dictionary SharedStyles { get; private set; } + public uint TableId { get; set; } + public HashSet TableNames { get; private set; } + } + + #endregion Nested type: SaveContext + + #region Nested type: RelType + + internal enum RelType + { + Workbook//, Worksheet + } + + #endregion Nested type: RelType + + #region Nested type: RelIdGenerator + + internal sealed class RelIdGenerator + { + private readonly Dictionary> _relIds = new Dictionary>(); + + public void AddValues(IEnumerable values, RelType relType) + { + if (!_relIds.TryGetValue(relType, out List list)) + { + list = new List(); + _relIds.Add(relType, list); + } + list.AddRange(values.Where(v => !list.Contains(v))); + } + + public String GetNext() + { + return GetNext(RelType.Workbook); + } + + public String GetNext(RelType relType) + { + if (!_relIds.TryGetValue(relType, out List list)) + { + list = new List(); + _relIds.Add(relType, list); + } + + Int32 id = list.Count + 1; + while (true) + { + String relId = String.Concat("rId", id); + if (!list.Contains(relId)) + { + list.Add(relId); + return relId; + } + id++; + } + } + + public void Reset(RelType relType) + { + if (_relIds.ContainsKey(relType)) + _relIds.Remove(relType); + } + } + + #endregion Nested type: RelIdGenerator + + #region Nested type: FontInfo + + internal struct FontInfo + { + public XLFontValue Font; + public UInt32 FontId; + }; + + #endregion Nested type: FontInfo + + #region Nested type: FillInfo + + internal struct FillInfo + { + public XLFillValue Fill; + public UInt32 FillId; + } + + #endregion Nested type: FillInfo + + #region Nested type: BorderInfo + + internal struct BorderInfo + { + public XLBorderValue Border; + public UInt32 BorderId; + } + + #endregion Nested type: BorderInfo + + #region Nested type: NumberFormatInfo + + internal struct NumberFormatInfo + { + public XLNumberFormatValue NumberFormat; + public Int32 NumberFormatId; + } + + #endregion Nested type: NumberFormatInfo + + #region Nested type: StyleInfo + + internal struct StyleInfo + { + public UInt32 BorderId; + public UInt32 FillId; + public UInt32 FontId; + public Boolean IncludeQuotePrefix; + public Int32 NumberFormatId; + public XLStyleValue Style; + public UInt32 StyleId; + } + + #endregion Nested type: StyleInfo + + #region Nested type: Pivot tables + + internal struct PivotTableFieldInfo + { + public XLDataType DataType; + public Boolean MixedDataType; + public IEnumerable DistinctValues; + public Boolean IsTotallyBlankField; + } + + internal struct PivotTableInfo + { + public IDictionary Fields; + public Guid Guid; + } + + #endregion Nested type: Pivot tables + } +} diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs new file mode 100644 index 0000000..8efbc8f --- /dev/null +++ b/ClosedXML/Excel/XLWorkbook_Save.cs @@ -0,0 +1,6395 @@ +using ClosedXML.Excel.ContentManagers; +using ClosedXML.Excel.Exceptions; +using ClosedXML.Extensions; +using ClosedXML.Utils; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.CustomProperties; +using DocumentFormat.OpenXml.Drawing; +using DocumentFormat.OpenXml.ExtendedProperties; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Spreadsheet; +using DocumentFormat.OpenXml.Validation; +using DocumentFormat.OpenXml.VariantTypes; +using DocumentFormat.OpenXml.Vml.Office; +using DocumentFormat.OpenXml.Vml.Spreadsheet; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Xml; +using System.Xml.Linq; +using Anchor = DocumentFormat.OpenXml.Vml.Spreadsheet.Anchor; +using BackgroundColor = DocumentFormat.OpenXml.Spreadsheet.BackgroundColor; +using BottomBorder = DocumentFormat.OpenXml.Spreadsheet.BottomBorder; +using Break = DocumentFormat.OpenXml.Spreadsheet.Break; +using Field = DocumentFormat.OpenXml.Spreadsheet.Field; +using Fill = DocumentFormat.OpenXml.Spreadsheet.Fill; +using Fonts = DocumentFormat.OpenXml.Spreadsheet.Fonts; +using FontScheme = DocumentFormat.OpenXml.Drawing.FontScheme; +using ForegroundColor = DocumentFormat.OpenXml.Spreadsheet.ForegroundColor; +using GradientFill = DocumentFormat.OpenXml.Drawing.GradientFill; +using GradientStop = DocumentFormat.OpenXml.Drawing.GradientStop; +using Hyperlink = DocumentFormat.OpenXml.Spreadsheet.Hyperlink; +using LeftBorder = DocumentFormat.OpenXml.Spreadsheet.LeftBorder; +using OfficeExcel = DocumentFormat.OpenXml.Office.Excel; +using Outline = DocumentFormat.OpenXml.Drawing.Outline; +using Path = System.IO.Path; +using PatternFill = DocumentFormat.OpenXml.Spreadsheet.PatternFill; +using Properties = DocumentFormat.OpenXml.ExtendedProperties.Properties; +using RightBorder = DocumentFormat.OpenXml.Spreadsheet.RightBorder; +using Run = DocumentFormat.OpenXml.Spreadsheet.Run; +using RunProperties = DocumentFormat.OpenXml.Spreadsheet.RunProperties; +using Table = DocumentFormat.OpenXml.Spreadsheet.Table; +using Text = DocumentFormat.OpenXml.Spreadsheet.Text; +using TopBorder = DocumentFormat.OpenXml.Spreadsheet.TopBorder; +using Underline = DocumentFormat.OpenXml.Spreadsheet.Underline; +using VerticalTextAlignment = DocumentFormat.OpenXml.Spreadsheet.VerticalTextAlignment; +using Vml = DocumentFormat.OpenXml.Vml; +using X14 = DocumentFormat.OpenXml.Office2010.Excel; +using Xdr = DocumentFormat.OpenXml.Drawing.Spreadsheet; + +namespace ClosedXML.Excel +{ + public partial class XLWorkbook + { + private const Double ColumnWidthOffset = 0.710625; + + //private Dictionary context.SharedStyles; + + private static readonly EnumValue CvSharedString = new EnumValue(CellValues.SharedString); + private static readonly EnumValue CvInlineString = new EnumValue(CellValues.InlineString); + private static readonly EnumValue CvNumber = new EnumValue(CellValues.Number); + private static readonly EnumValue CvDate = new EnumValue(CellValues.Date); + private static readonly EnumValue CvBoolean = new EnumValue(CellValues.Boolean); + + private static EnumValue GetCellValueType(XLCell xlCell) + { + switch (xlCell.DataType) + { + case XLDataType.Text: + return xlCell.ShareString ? CvSharedString : CvInlineString; + + case XLDataType.Number: + return CvNumber; + + case XLDataType.DateTime: + return CvDate; + + case XLDataType.Boolean: + return CvBoolean; + + case XLDataType.TimeSpan: + return CvNumber; + + default: + throw new NotImplementedException(); + } + } + + private Boolean Validate(SpreadsheetDocument package) + { + var backupCulture = Thread.CurrentThread.CurrentCulture; + + IEnumerable errors; + try + { + Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; + var validator = new OpenXmlValidator(); + errors = validator.Validate(package); + } + finally + { + Thread.CurrentThread.CurrentCulture = backupCulture; + } + + if (errors.Any()) + { + var message = string.Join("\r\n", errors.Select(e => string.Format("Part {0}, Path {1}: {2}", e.Part.Uri, e.Path.XPath, e.Description)).ToArray()); + throw new ApplicationException(message); + } + return true; + } + + private void CreatePackage(String filePath, SpreadsheetDocumentType spreadsheetDocumentType, SaveOptions options) + { + PathHelper.CreateDirectory(Path.GetDirectoryName(filePath)); + var package = File.Exists(filePath) + ? SpreadsheetDocument.Open(filePath, true) + : SpreadsheetDocument.Create(filePath, spreadsheetDocumentType); + + using (package) + { + if (package.DocumentType != spreadsheetDocumentType) + { + package.ChangeDocumentType(spreadsheetDocumentType); + } + + CreateParts(package, options); + if (options.ValidatePackage) Validate(package); + } + } + + private void CreatePackage(Stream stream, bool newStream, SpreadsheetDocumentType spreadsheetDocumentType, SaveOptions options) + { + var package = newStream + ? SpreadsheetDocument.Create(stream, spreadsheetDocumentType) + : SpreadsheetDocument.Open(stream, true); + + using (package) + { + CreateParts(package, options); + if (options.ValidatePackage) Validate(package); + } + } + + // http://blogs.msdn.com/b/vsod/archive/2010/02/05/how-to-delete-a-worksheet-from-excel-using-open-xml-sdk-2-0.aspx + private void DeleteSheetAndDependencies(WorkbookPart wbPart, string sheetId) + { + //Get the SheetToDelete from workbook.xml + Sheet worksheet = wbPart.Workbook.Descendants().FirstOrDefault(s => s.Id == sheetId); + if (worksheet == null) + return; + + string sheetName = worksheet.Name; + // Get the pivot Table Parts + var pvtTableCacheParts = wbPart.PivotTableCacheDefinitionParts; + var pvtTableCacheDefinitionPart = new Dictionary(); + foreach (PivotTableCacheDefinitionPart Item in pvtTableCacheParts) + { + PivotCacheDefinition pvtCacheDef = Item.PivotCacheDefinition; + //Check if this CacheSource is linked to SheetToDelete + if (pvtCacheDef.Descendants().Any(cacheSource => cacheSource.WorksheetSource?.Sheet == sheetName)) + { + pvtTableCacheDefinitionPart.Add(Item, Item.ToString()); + } + } + foreach (var Item in pvtTableCacheDefinitionPart) + { + wbPart.DeletePart(Item.Key); + } + + // Remove the sheet reference from the workbook. + WorksheetPart worksheetPart = (WorksheetPart)(wbPart.GetPartById(sheetId)); + worksheet.Remove(); + + // Delete the worksheet part. + wbPart.DeletePart(worksheetPart); + + //Get the DefinedNames + var definedNames = wbPart.Workbook.Descendants().FirstOrDefault(); + if (definedNames != null) + { + List defNamesToDelete = new List(); + + foreach (var Item in definedNames.OfType()) + { + // This condition checks to delete only those names which are part of Sheet in question + if (Item.Text.Contains(worksheet.Name + "!")) + defNamesToDelete.Add(Item); + } + + foreach (DefinedName Item in defNamesToDelete) + { + Item.Remove(); + } + } + // Get the CalculationChainPart + //Note: An instance of this part type contains an ordered set of references to all cells in all worksheets in the + //workbook whose value is calculated from any formula + + CalculationChainPart calChainPart; + calChainPart = wbPart.CalculationChainPart; + if (calChainPart != null) + { + var calChainEntries = calChainPart.CalculationChain.Descendants().Where(c => c.SheetId == sheetId); + List calcsToDelete = new List(); + foreach (CalculationCell Item in calChainEntries) + calcsToDelete.Add(Item); + + foreach (CalculationCell Item in calcsToDelete) + Item.Remove(); + + if (!calChainPart.CalculationChain.Any()) + wbPart.DeletePart(calChainPart); + } + } + + // Adds child parts and generates content of the specified part. + private void CreateParts(SpreadsheetDocument document, SaveOptions options) + { + this.SuspendEvents(); + + var context = new SaveContext(); + + var workbookPart = document.WorkbookPart ?? document.AddWorkbookPart(); + + var worksheets = WorksheetsInternal; + + var partsToRemove = workbookPart.Parts.Where(s => worksheets.Deleted.Contains(s.RelationshipId)).ToList(); + + var pivotCacheDefinitionsToRemove = partsToRemove.SelectMany(s => ((WorksheetPart)s.OpenXmlPart).PivotTableParts.Select(pt => pt.PivotTableCacheDefinitionPart)).Distinct().ToList(); + pivotCacheDefinitionsToRemove.ForEach(c => workbookPart.DeletePart(c)); + + if (workbookPart.Workbook != null && workbookPart.Workbook.PivotCaches != null) + { + var pivotCachesToRemove = workbookPart.Workbook.PivotCaches.Where(pc => pivotCacheDefinitionsToRemove.Select(pcd => workbookPart.GetIdOfPart(pcd)).ToList().Contains(((PivotCache)pc).Id)).Distinct().ToList(); + pivotCachesToRemove.ForEach(c => workbookPart.Workbook.PivotCaches.RemoveChild(c)); + } + + worksheets.Deleted.ToList().ForEach(ws => DeleteSheetAndDependencies(workbookPart, ws)); + + // Ensure all RelId's have been added to the context + context.RelIdGenerator.AddValues(workbookPart.Parts.Select(p => p.RelationshipId), RelType.Workbook); + context.RelIdGenerator.AddValues(WorksheetsInternal.Cast().Where(ws => !String.IsNullOrWhiteSpace(ws.RelId)).Select(ws => ws.RelId), RelType.Workbook); + context.RelIdGenerator.AddValues(WorksheetsInternal.Cast().Where(ws => !String.IsNullOrWhiteSpace(ws.LegacyDrawingId)).Select(ws => ws.LegacyDrawingId), RelType.Workbook); + context.RelIdGenerator.AddValues(WorksheetsInternal + .Cast() + .SelectMany(ws => ws.Tables.Cast()) + .Where(t => !String.IsNullOrWhiteSpace(t.RelId)) + .Select(t => t.RelId), RelType.Workbook); + + var extendedFilePropertiesPart = document.ExtendedFilePropertiesPart ?? + document.AddNewPart( + context.RelIdGenerator.GetNext(RelType.Workbook)); + + GenerateExtendedFilePropertiesPartContent(extendedFilePropertiesPart); + + GenerateWorkbookPartContent(workbookPart, options, context); + + var sharedStringTablePart = workbookPart.SharedStringTablePart ?? + workbookPart.AddNewPart( + context.RelIdGenerator.GetNext(RelType.Workbook)); + + GenerateSharedStringTablePartContent(sharedStringTablePart, context); + + var workbookStylesPart = workbookPart.WorkbookStylesPart ?? + workbookPart.AddNewPart( + context.RelIdGenerator.GetNext(RelType.Workbook)); + + GenerateWorkbookStylesPartContent(workbookStylesPart, context); + + var cacheRelIds = WorksheetsInternal + .Cast() + .SelectMany(s => s.PivotTables.Cast().Select(pt => pt.WorkbookCacheRelId)) + .Where(relId => !string.IsNullOrWhiteSpace(relId)) + .Distinct(); + + foreach (var relId in cacheRelIds) + { + if (workbookPart.GetPartById(relId) is PivotTableCacheDefinitionPart pivotTableCacheDefinitionPart) + pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheFields.RemoveAllChildren(); + } + + foreach (var worksheet in WorksheetsInternal.Cast().OrderBy(w => w.Position)) + { + WorksheetPart worksheetPart; + var wsRelId = worksheet.RelId; + if (workbookPart.Parts.Any(p => p.RelationshipId == wsRelId)) + worksheetPart = (WorksheetPart)workbookPart.GetPartById(wsRelId); + else + worksheetPart = workbookPart.AddNewPart(wsRelId); + + context.RelIdGenerator.AddValues(worksheetPart.HyperlinkRelationships.Select(hr => hr.Id), RelType.Workbook); + context.RelIdGenerator.AddValues(worksheetPart.Parts.Select(p => p.RelationshipId), RelType.Workbook); + if (worksheetPart.DrawingsPart != null) + context.RelIdGenerator.AddValues(worksheetPart.DrawingsPart.Parts.Select(p => p.RelationshipId), RelType.Workbook); + + var worksheetHasComments = worksheet.Internals.CellsCollection.GetCells(c => c.HasComment).Any(); + + var commentsPart = worksheetPart.WorksheetCommentsPart; + var vmlDrawingPart = worksheetPart.VmlDrawingParts.FirstOrDefault(); + var hasAnyVmlElements = DeleteExistingComments(worksheetPart, worksheet, commentsPart, vmlDrawingPart); + + if (worksheetHasComments) + { + if (commentsPart == null) + { + commentsPart = worksheetPart.AddNewPart(context.RelIdGenerator.GetNext(RelType.Workbook)); + commentsPart.Comments = new Comments(); + } + + if (vmlDrawingPart == null) + { + if (String.IsNullOrWhiteSpace(worksheet.LegacyDrawingId)) + { + worksheet.LegacyDrawingId = context.RelIdGenerator.GetNext(RelType.Workbook); + worksheet.LegacyDrawingIsNew = true; + } + + vmlDrawingPart = worksheetPart.AddNewPart(worksheet.LegacyDrawingId); + } + + GenerateWorksheetCommentsPartContent(commentsPart, worksheet); + hasAnyVmlElements = GenerateVmlDrawingPartContent(vmlDrawingPart, worksheet); + } + + // Remove empty parts + if (commentsPart != null && (commentsPart.RootElement?.ChildElements?.Count ?? 0) == 0) + worksheetPart.DeletePart(commentsPart); + + if (!hasAnyVmlElements && vmlDrawingPart != null) + worksheetPart.DeletePart(vmlDrawingPart); + + GenerateWorksheetPartContent(worksheetPart, worksheet, options, context); + + if (worksheet.PivotTables.Any()) + { + GeneratePivotTables(workbookPart, worksheetPart, worksheet, context); + } + + // Remove any orphaned references - maybe more types? + foreach (var orphan in worksheetPart.Worksheet.OfType().Where(lg => worksheetPart.Parts.All(p => p.RelationshipId != lg.Id))) + worksheetPart.Worksheet.RemoveChild(orphan); + + foreach (var orphan in worksheetPart.Worksheet.OfType().Where(d => worksheetPart.Parts.All(p => p.RelationshipId != d.Id))) + worksheetPart.Worksheet.RemoveChild(orphan); + } + + // Remove empty pivot cache part + if (workbookPart.Workbook.PivotCaches != null && !workbookPart.Workbook.PivotCaches.Any()) + workbookPart.Workbook.RemoveChild(workbookPart.Workbook.PivotCaches); + + if (options.GenerateCalculationChain) + GenerateCalculationChainPartContent(workbookPart, context); + else + DeleteCalculationChainPartContent(workbookPart, context); + + if (workbookPart.ThemePart == null) + { + var themePart = workbookPart.AddNewPart(context.RelIdGenerator.GetNext(RelType.Workbook)); + GenerateThemePartContent(themePart); + } + + // Custom properties + if (CustomProperties.Any()) + { + var customFilePropertiesPart = + document.CustomFilePropertiesPart ?? document.AddNewPart(context.RelIdGenerator.GetNext(RelType.Workbook)); + + GenerateCustomFilePropertiesPartContent(customFilePropertiesPart); + } + else + { + if (document.CustomFilePropertiesPart != null) + document.DeletePart(document.CustomFilePropertiesPart); + } + SetPackageProperties(document); + + // Clear list of deleted worksheets to prevent errors on multiple saves + worksheets.Deleted.Clear(); + + this.ResumeEvents(); + } + + private bool DeleteExistingComments(WorksheetPart worksheetPart, XLWorksheet worksheet, WorksheetCommentsPart commentsPart, VmlDrawingPart vmlDrawingPart) + { + // Nuke existing comments + if (commentsPart != null) + { + commentsPart.Comments = new Comments(); + } + + if (vmlDrawingPart == null) + return false; + + // Nuke the VmlDrawingPart elements for comments. + using (var vmlStream = vmlDrawingPart.GetStream(FileMode.Open)) + { + var xdoc = XDocumentExtensions.Load(vmlStream); + if (xdoc == null) + return false; + + // Remove existing shapes for comments + xdoc.Root + .Elements() + .Where(e => e.Name.LocalName == "shapetype" && e.Attribute("id").Value == XLConstants.Comment.ShapeTypeId) + .Remove(); + + xdoc.Root + .Elements() + .Where(e => e.Name.LocalName == "shape" && e.Attribute("type").Value == "#" + XLConstants.Comment.ShapeTypeId) + .Remove(); + + vmlStream.Position = 0; + + using (var writer = new XmlTextWriter(vmlStream, Encoding.UTF8)) + { + var contents = xdoc.ToString(); + writer.WriteRaw(contents); + vmlStream.SetLength(contents.Length); + } + + return xdoc.Root.HasElements; + } + } + + private static void GenerateTables(XLWorksheet worksheet, WorksheetPart worksheetPart, SaveContext context, XLWorksheetContentManager cm) + { + var tables = worksheet.Tables as XLTables; + + var emptyTable = tables.FirstOrDefault(t => t.DataRange == null); + if (emptyTable != null) + throw new EmptyTableException($"Table '{emptyTable.Name}' should have at least 1 row."); + + TableParts tableParts; + if (worksheetPart.Worksheet.Elements().Any()) + { + tableParts = worksheetPart.Worksheet.Elements().First(); + } + else + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.TableParts); + tableParts = new TableParts(); + worksheetPart.Worksheet.InsertAfter(tableParts, previousElement); + } + cm.SetElement(XLWorksheetContents.TableParts, tableParts); + + foreach (var deletedTableRelId in tables.Deleted) + { + if (worksheetPart.TableDefinitionParts != null) + { + var tableDefinitionPart = worksheetPart.GetPartById(deletedTableRelId); + worksheetPart.DeletePart(tableDefinitionPart); + + var tablePartsToRemove = tableParts.OfType().Where(tp => tp.Id?.Value == deletedTableRelId).ToList(); + tablePartsToRemove.ForEach(tp => tableParts.RemoveChild(tp)); + } + } + + tables.Deleted.Clear(); + + foreach (var xlTable in tables.Cast()) + { + if (String.IsNullOrEmpty(xlTable.RelId)) + xlTable.RelId = context.RelIdGenerator.GetNext(RelType.Workbook); + + var relId = xlTable.RelId; + + TableDefinitionPart tableDefinitionPart; + if (worksheetPart.HasPartWithId(relId)) + tableDefinitionPart = worksheetPart.GetPartById(relId) as TableDefinitionPart; + else + tableDefinitionPart = worksheetPart.AddNewPart(relId); + + GenerateTableDefinitionPartContent(tableDefinitionPart, xlTable, context); + + if (!tableParts.OfType().Any(tp => tp.Id == xlTable.RelId)) + { + var tablePart = new TablePart { Id = xlTable.RelId }; + tableParts.AppendChild(tablePart); + } + } + + tableParts.Count = (UInt32)tables.Count(); + } + + private void GenerateExtendedFilePropertiesPartContent(ExtendedFilePropertiesPart extendedFilePropertiesPart) + { + if (extendedFilePropertiesPart.Properties == null) + extendedFilePropertiesPart.Properties = new Properties(); + + var properties = extendedFilePropertiesPart.Properties; + if ( + !properties.NamespaceDeclarations.Contains(new KeyValuePair("vt", + "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"))) + { + properties.AddNamespaceDeclaration("vt", + "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"); + } + + if (properties.Application == null) + properties.AppendChild(new Application { Text = "Microsoft Excel" }); + + if (properties.DocumentSecurity == null) + properties.AppendChild(new DocumentSecurity { Text = "0" }); + + if (properties.ScaleCrop == null) + properties.AppendChild(new ScaleCrop { Text = "false" }); + + if (properties.HeadingPairs == null) + properties.HeadingPairs = new HeadingPairs(); + + if (properties.TitlesOfParts == null) + properties.TitlesOfParts = new TitlesOfParts(); + + properties.HeadingPairs.VTVector = new VTVector { BaseType = VectorBaseValues.Variant }; + + properties.TitlesOfParts.VTVector = new VTVector { BaseType = VectorBaseValues.Lpstr }; + + var vTVectorOne = properties.HeadingPairs.VTVector; + + var vTVectorTwo = properties.TitlesOfParts.VTVector; + + var modifiedWorksheets = + ((IEnumerable)WorksheetsInternal).Select(w => new { w.Name, Order = w.Position }).ToList(); + var modifiedNamedRanges = GetModifiedNamedRanges(); + var modifiedWorksheetsCount = modifiedWorksheets.Count; + var modifiedNamedRangesCount = modifiedNamedRanges.Count; + + InsertOnVtVector(vTVectorOne, "Worksheets", 0, modifiedWorksheetsCount.ToInvariantString()); + InsertOnVtVector(vTVectorOne, "Named Ranges", 2, modifiedNamedRangesCount.ToInvariantString()); + + vTVectorTwo.Size = (UInt32)(modifiedNamedRangesCount + modifiedWorksheetsCount); + + foreach ( + var vTlpstr3 in modifiedWorksheets.OrderBy(w => w.Order).Select(w => new VTLPSTR { Text = w.Name })) + vTVectorTwo.AppendChild(vTlpstr3); + + foreach (var vTlpstr7 in modifiedNamedRanges.Select(nr => new VTLPSTR { Text = nr })) + vTVectorTwo.AppendChild(vTlpstr7); + + if (Properties.Manager != null) + { + if (!String.IsNullOrWhiteSpace(Properties.Manager)) + { + if (properties.Manager == null) + properties.Manager = new Manager(); + + properties.Manager.Text = Properties.Manager; + } + else + properties.Manager = null; + } + + if (Properties.Company == null) return; + + if (!String.IsNullOrWhiteSpace(Properties.Company)) + { + if (properties.Company == null) + properties.Company = new Company(); + + properties.Company.Text = Properties.Company; + } + else + properties.Company = null; + } + + private static void InsertOnVtVector(VTVector vTVector, String property, Int32 index, String text) + { + var m = from e1 in vTVector.Elements() + where e1.Elements().Any(e2 => e2.Text == property) + select e1; + if (!m.Any()) + { + if (vTVector.Size == null) + vTVector.Size = new UInt32Value(0U); + + vTVector.Size += 2U; + var variant1 = new Variant(); + var vTlpstr1 = new VTLPSTR { Text = property }; + variant1.AppendChild(vTlpstr1); + vTVector.InsertAt(variant1, index); + + var variant2 = new Variant(); + var vTInt321 = new VTInt32(); + variant2.AppendChild(vTInt321); + vTVector.InsertAt(variant2, index + 1); + } + + var targetIndex = 0; + foreach (var e in vTVector.Elements()) + { + if (e.Elements().Any(e2 => e2.Text == property)) + { + vTVector.ElementAt(targetIndex + 1).GetFirstChild().Text = text; + break; + } + targetIndex++; + } + } + + private List GetModifiedNamedRanges() + { + var namedRanges = new List(); + foreach (var w in WorksheetsInternal) + { + var wName = w.Name; + namedRanges.AddRange(w.NamedRanges.Select(n => wName + "!" + n.Name)); + namedRanges.Add(w.Name + "!Print_Area"); + namedRanges.Add(w.Name + "!Print_Titles"); + } + namedRanges.AddRange(NamedRanges.Select(n => n.Name)); + return namedRanges; + } + + private void GenerateWorkbookPartContent(WorkbookPart workbookPart, SaveOptions options, SaveContext context) + { + if (workbookPart.Workbook == null) + workbookPart.Workbook = new Workbook(); + + var workbook = workbookPart.Workbook; + if ( + !workbook.NamespaceDeclarations.Contains(new KeyValuePair("r", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships"))) + { + workbook.AddNamespaceDeclaration("r", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + } + + #region WorkbookProperties + + if (workbook.WorkbookProperties == null) + workbook.WorkbookProperties = new WorkbookProperties(); + + if (workbook.WorkbookProperties.CodeName == null) + workbook.WorkbookProperties.CodeName = "ThisWorkbook"; + + workbook.WorkbookProperties.Date1904 = OpenXmlHelper.GetBooleanValue(this.Use1904DateSystem, false); + + if (options.FilterPrivacy.HasValue) + workbook.WorkbookProperties.FilterPrivacy = OpenXmlHelper.GetBooleanValue(options.FilterPrivacy.Value, false); + + #endregion WorkbookProperties + + #region FileSharing + + if (workbook.FileSharing == null) + workbook.FileSharing = new FileSharing(); + + workbook.FileSharing.ReadOnlyRecommended = OpenXmlHelper.GetBooleanValue(this.FileSharing.ReadOnlyRecommended, false); + workbook.FileSharing.UserName = String.IsNullOrWhiteSpace(this.FileSharing.UserName) ? null : StringValue.FromString(this.FileSharing.UserName); + + if (!workbook.FileSharing.HasChildren && !workbook.FileSharing.HasAttributes) + workbook.FileSharing = null; + + #endregion FileSharing + + #region WorkbookProtection + + if (this.Protection.IsProtected) + { + if (workbook.WorkbookProtection == null) + workbook.WorkbookProtection = new WorkbookProtection(); + + var workbookProtection = workbook.WorkbookProtection; + + var protection = this.Protection; + + workbookProtection.WorkbookPassword = null; + workbookProtection.WorkbookAlgorithmName = null; + workbookProtection.WorkbookHashValue = null; + workbookProtection.WorkbookSpinCount = null; + workbookProtection.WorkbookSaltValue = null; + + if (protection.Algorithm == XLProtectionAlgorithm.Algorithm.SimpleHash) + { + if (!String.IsNullOrWhiteSpace(protection.PasswordHash)) + workbookProtection.WorkbookPassword = protection.PasswordHash; + } + else + { + workbookProtection.WorkbookAlgorithmName = DescribedEnumParser.ToDescription(protection.Algorithm); + workbookProtection.WorkbookHashValue = protection.PasswordHash; + workbookProtection.WorkbookSpinCount = protection.SpinCount; + workbookProtection.WorkbookSaltValue = protection.Base64EncodedSalt; + } + + workbookProtection.LockStructure = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLWorkbookProtectionElements.Structure), false); + workbookProtection.LockWindows = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLWorkbookProtectionElements.Windows), false); + } + else + { + workbook.WorkbookProtection = null; + } + + #endregion WorkbookProtection + + if (workbook.BookViews == null) + workbook.BookViews = new BookViews(); + + if (workbook.Sheets == null) + workbook.Sheets = new Sheets(); + + var worksheets = WorksheetsInternal; + workbook.Sheets.Elements().Where(s => worksheets.Deleted.Contains(s.Id)).ToList().ForEach( + s => s.Remove()); + + foreach (var sheet in workbook.Sheets.Elements()) + { + var sheetId = (Int32)sheet.SheetId.Value; + + if (WorksheetsInternal.All(w => w.SheetId != sheetId)) continue; + + var wks = WorksheetsInternal.Single(w => w.SheetId == sheetId); + wks.RelId = sheet.Id; + sheet.Name = wks.Name; + } + + foreach (var xlSheet in WorksheetsInternal.Cast().OrderBy(w => w.Position)) + { + string rId; + if (xlSheet.SheetId == 0 && String.IsNullOrWhiteSpace(xlSheet.RelId)) + { + rId = context.RelIdGenerator.GetNext(RelType.Workbook); + + while (WorksheetsInternal.Cast().Any(w => w.SheetId == Int32.Parse(rId.Substring(3)))) + rId = context.RelIdGenerator.GetNext(RelType.Workbook); + + xlSheet.SheetId = Int32.Parse(rId.Substring(3)); + xlSheet.RelId = rId; + } + else + { + if (String.IsNullOrWhiteSpace(xlSheet.RelId)) + { + rId = String.Concat("rId", xlSheet.SheetId); + context.RelIdGenerator.AddValues(new List { rId }, RelType.Workbook); + } + else + rId = xlSheet.RelId; + } + + if (workbook.Sheets.Cast().All(s => s.Id != rId)) + { + var newSheet = new Sheet + { + Name = xlSheet.Name, + Id = rId, + SheetId = (UInt32)xlSheet.SheetId + }; + + workbook.Sheets.AppendChild(newSheet); + } + } + + var sheetElements = from sheet in workbook.Sheets.Elements() + join worksheet in ((IEnumerable)WorksheetsInternal) on sheet.Id.Value + equals worksheet.RelId + orderby worksheet.Position + select sheet; + + UInt32 firstSheetVisible = 0; + var activeTab = + (from us in UnsupportedSheets where us.IsActive select (UInt32)us.Position - 1).FirstOrDefault(); + var foundVisible = false; + + var totalSheets = sheetElements.Count() + UnsupportedSheets.Count; + for (var p = 1; p <= totalSheets; p++) + { + if (UnsupportedSheets.All(us => us.Position != p)) + { + var sheet = sheetElements.ElementAt(p - UnsupportedSheets.Count(us => us.Position <= p) - 1); + workbook.Sheets.RemoveChild(sheet); + workbook.Sheets.AppendChild(sheet); + var xlSheet = Worksheet(sheet.Name); + if (xlSheet.Visibility != XLWorksheetVisibility.Visible) + sheet.State = xlSheet.Visibility.ToOpenXml(); + else + sheet.State = null; + + if (foundVisible) continue; + + if (sheet.State == null || sheet.State == SheetStateValues.Visible) + foundVisible = true; + else + firstSheetVisible++; + } + else + { + var sheetId = UnsupportedSheets.First(us => us.Position == p).SheetId; + var sheet = workbook.Sheets.Elements().First(s => s.SheetId == sheetId); + workbook.Sheets.RemoveChild(sheet); + workbook.Sheets.AppendChild(sheet); + } + } + + var workbookView = workbook.BookViews.Elements().FirstOrDefault(); + + if (activeTab == 0) + { + UInt32? firstActiveTab = null; + UInt32? firstSelectedTab = null; + foreach (var ws in worksheets) + { + if (ws.TabActive) + { + firstActiveTab = (UInt32)(ws.Position - 1); + break; + } + + if (ws.TabSelected) + { + firstSelectedTab = (UInt32)(ws.Position - 1); + } + } + + activeTab = firstActiveTab + ?? firstSelectedTab + ?? firstSheetVisible; + } + + if (workbookView == null) + { + workbookView = new WorkbookView { ActiveTab = activeTab, FirstSheet = firstSheetVisible }; + workbook.BookViews.AppendChild(workbookView); + } + else + { + workbookView.ActiveTab = activeTab; + workbookView.FirstSheet = firstSheetVisible; + } + + var definedNames = new DefinedNames(); + foreach (var worksheet in WorksheetsInternal) + { + var wsSheetId = (UInt32)worksheet.SheetId; + UInt32 sheetId = 0; + foreach (var s in workbook.Sheets.Elements().TakeWhile(s => s.SheetId != wsSheetId)) + { + sheetId++; + } + + if (worksheet.PageSetup.PrintAreas.Any()) + { + var definedName = new DefinedName { Name = "_xlnm.Print_Area", LocalSheetId = sheetId }; + var worksheetName = worksheet.Name; + var definedNameText = worksheet.PageSetup.PrintAreas.Aggregate(String.Empty, + (current, printArea) => + current + + (worksheetName.EscapeSheetName() + "!" + + printArea.RangeAddress. + FirstAddress.ToStringFixed( + XLReferenceStyle.A1) + + ":" + + printArea.RangeAddress. + LastAddress.ToStringFixed( + XLReferenceStyle.A1) + + ",")); + definedName.Text = definedNameText.Substring(0, definedNameText.Length - 1); + definedNames.AppendChild(definedName); + } + + if (worksheet.AutoFilter.IsEnabled) + { + var definedName = new DefinedName + { + Name = "_xlnm._FilterDatabase", + LocalSheetId = sheetId, + Text = worksheet.Name.EscapeSheetName() + "!" + + worksheet.AutoFilter.Range.RangeAddress.FirstAddress.ToStringFixed( + XLReferenceStyle.A1) + + ":" + + worksheet.AutoFilter.Range.RangeAddress.LastAddress.ToStringFixed( + XLReferenceStyle.A1), + Hidden = BooleanValue.FromBoolean(true) + }; + definedNames.AppendChild(definedName); + } + + foreach (var nr in worksheet.NamedRanges.Where(n => n.Name != "_xlnm._FilterDatabase")) + { + var definedName = new DefinedName + { + Name = nr.Name, + LocalSheetId = sheetId, + Text = nr.ToString() + }; + + if (!nr.Visible) + definedName.Hidden = BooleanValue.FromBoolean(true); + + if (!String.IsNullOrWhiteSpace(nr.Comment)) + definedName.Comment = nr.Comment; + definedNames.AppendChild(definedName); + } + + var definedNameTextRow = String.Empty; + var definedNameTextColumn = String.Empty; + if (worksheet.PageSetup.FirstRowToRepeatAtTop > 0) + { + definedNameTextRow = worksheet.Name.EscapeSheetName() + "!" + worksheet.PageSetup.FirstRowToRepeatAtTop + + ":" + worksheet.PageSetup.LastRowToRepeatAtTop; + } + if (worksheet.PageSetup.FirstColumnToRepeatAtLeft > 0) + { + var minColumn = worksheet.PageSetup.FirstColumnToRepeatAtLeft; + var maxColumn = worksheet.PageSetup.LastColumnToRepeatAtLeft; + definedNameTextColumn = worksheet.Name.EscapeSheetName() + "!" + + XLHelper.GetColumnLetterFromNumber(minColumn) + + ":" + XLHelper.GetColumnLetterFromNumber(maxColumn); + } + + string titles; + if (definedNameTextColumn.Length > 0) + { + titles = definedNameTextColumn; + if (definedNameTextRow.Length > 0) + titles += "," + definedNameTextRow; + } + else + titles = definedNameTextRow; + + if (titles.Length <= 0) continue; + + var definedName2 = new DefinedName + { + Name = "_xlnm.Print_Titles", + LocalSheetId = sheetId, + Text = titles + }; + + definedNames.AppendChild(definedName2); + } + + foreach (var nr in NamedRanges.OfType()) + { + var refersTo = string.Join(",", nr.RangeList + .Select(r => r.StartsWith("#REF!") ? "#REF!" : r)); + + var definedName = new DefinedName + { + Name = nr.Name, + Text = refersTo + }; + + if (!nr.Visible) + definedName.Hidden = BooleanValue.FromBoolean(true); + + if (!String.IsNullOrWhiteSpace(nr.Comment)) + definedName.Comment = nr.Comment; + definedNames.AppendChild(definedName); + } + + workbook.DefinedNames = definedNames; + + if (workbook.CalculationProperties == null) + workbook.CalculationProperties = new CalculationProperties { CalculationId = 125725U }; + + if (CalculateMode == XLCalculateMode.Default) + workbook.CalculationProperties.CalculationMode = null; + else + workbook.CalculationProperties.CalculationMode = CalculateMode.ToOpenXml(); + + if (ReferenceStyle == XLReferenceStyle.Default) + workbook.CalculationProperties.ReferenceMode = null; + else + workbook.CalculationProperties.ReferenceMode = ReferenceStyle.ToOpenXml(); + + if (CalculationOnSave) workbook.CalculationProperties.CalculationOnSave = CalculationOnSave; + if (ForceFullCalculation) workbook.CalculationProperties.ForceFullCalculation = ForceFullCalculation; + if (FullCalculationOnLoad) workbook.CalculationProperties.FullCalculationOnLoad = FullCalculationOnLoad; + if (FullPrecision) workbook.CalculationProperties.FullPrecision = FullPrecision; + } + + private void GenerateSharedStringTablePartContent(SharedStringTablePart sharedStringTablePart, + SaveContext context) + { + // Call all table headers to make sure their names are filled + var x = 0; + Worksheets.ForEach(w => w.Tables.ForEach(t => x = (t as XLTable).FieldNames.Count)); + + sharedStringTablePart.SharedStringTable = new SharedStringTable { Count = 0, UniqueCount = 0 }; + + var stringId = 0; + + var newStrings = new Dictionary(); + var newRichStrings = new Dictionary(); + + bool hasSharedString(IXLCell c) + { + if (c.DataType == XLDataType.Text && c.ShareString) + return (c as XLCell).StyleValue.IncludeQuotePrefix || String.IsNullOrWhiteSpace(c.FormulaA1) && (c as XLCell).InnerText.Length > 0; + else + return false; + } + + foreach (var c in Worksheets.Cast().SelectMany(w => w.Internals.CellsCollection.GetCells(hasSharedString))) + { + c.DataType = XLDataType.Text; + if (c.HasRichText) + { + if (newRichStrings.TryGetValue(c.RichText, out int id)) + c.SharedStringId = id; + else + { + var sharedStringItem = new SharedStringItem(); + PopulatedRichTextElements(sharedStringItem, c, context); + + sharedStringTablePart.SharedStringTable.Append(sharedStringItem); + sharedStringTablePart.SharedStringTable.Count += 1; + sharedStringTablePart.SharedStringTable.UniqueCount += 1; + + newRichStrings.Add(c.RichText, stringId); + c.SharedStringId = stringId; + + stringId++; + } + } + else + { + var value = c.Value.ObjectToInvariantString(); + if (newStrings.TryGetValue(value, out int id)) + c.SharedStringId = id; + else + { + var s = value; + var sharedStringItem = new SharedStringItem(); + var text = new Text { Text = XmlEncoder.EncodeString(s) }; + if (!s.Trim().Equals(s)) + text.Space = SpaceProcessingModeValues.Preserve; + sharedStringItem.Append(text); + sharedStringTablePart.SharedStringTable.Append(sharedStringItem); + sharedStringTablePart.SharedStringTable.Count += 1; + sharedStringTablePart.SharedStringTable.UniqueCount += 1; + + newStrings.Add(value, stringId); + c.SharedStringId = stringId; + + stringId++; + } + } + } + } + + private static void PopulatedRichTextElements(RstType rstType, IXLCell cell, SaveContext context) + { + foreach (var rt in cell.RichText.Where(r => !String.IsNullOrEmpty(r.Text))) + { + rstType.Append(GetRun(rt)); + } + + if (cell.RichText.HasPhonetics) + { + foreach (var p in cell.RichText.Phonetics) + { + var phoneticRun = new PhoneticRun + { + BaseTextStartIndex = (UInt32)p.Start, + EndingBaseIndex = (UInt32)p.End + }; + + var text = new Text { Text = p.Text }; + if (p.Text.PreserveSpaces()) + text.Space = SpaceProcessingModeValues.Preserve; + + phoneticRun.Append(text); + rstType.Append(phoneticRun); + } + + var fontKey = XLFont.GenerateKey(cell.RichText.Phonetics); + var f = XLFontValue.FromKey(ref fontKey); + + if (!context.SharedFonts.TryGetValue(f, out FontInfo fi)) + { + fi = new FontInfo { Font = f }; + context.SharedFonts.Add(f, fi); + } + + var phoneticProperties = new PhoneticProperties + { + FontId = fi.FontId + }; + + if (cell.RichText.Phonetics.Alignment != XLPhoneticAlignment.Left) + phoneticProperties.Alignment = cell.RichText.Phonetics.Alignment.ToOpenXml(); + if (cell.RichText.Phonetics.Type != XLPhoneticType.FullWidthKatakana) + phoneticProperties.Type = cell.RichText.Phonetics.Type.ToOpenXml(); + + rstType.Append(phoneticProperties); + } + } + + private static Run GetRun(IXLRichString rt) + { + var run = new Run(); + + var runProperties = new RunProperties(); + + var bold = rt.Bold ? new Bold() : null; + var italic = rt.Italic ? new Italic() : null; + var underline = rt.Underline != XLFontUnderlineValues.None + ? new Underline { Val = rt.Underline.ToOpenXml() } + : null; + var strike = rt.Strikethrough ? new Strike() : null; + var verticalAlignment = new VerticalTextAlignment + { Val = rt.VerticalAlignment.ToOpenXml() }; + var shadow = rt.Shadow ? new Shadow() : null; + var fontSize = new FontSize { Val = rt.FontSize }; + var color = new Color().FromClosedXMLColor(rt.FontColor); + var fontName = new RunFont { Val = rt.FontName }; + var fontFamilyNumbering = new FontFamily { Val = (Int32)rt.FontFamilyNumbering }; + + if (bold != null) runProperties.Append(bold); + if (italic != null) runProperties.Append(italic); + + if (strike != null) runProperties.Append(strike); + if (shadow != null) runProperties.Append(shadow); + if (underline != null) runProperties.Append(underline); + runProperties.Append(verticalAlignment); + + runProperties.Append(fontSize); + runProperties.Append(color); + runProperties.Append(fontName); + runProperties.Append(fontFamilyNumbering); + + var text = new Text { Text = rt.Text }; + if (rt.Text.PreserveSpaces()) + text.Space = SpaceProcessingModeValues.Preserve; + + run.Append(runProperties); + run.Append(text); + return run; + } + + private void DeleteCalculationChainPartContent(WorkbookPart workbookPart, SaveContext context) + { + if (workbookPart.CalculationChainPart != null) + workbookPart.DeletePart(workbookPart.CalculationChainPart); + } + + private void GenerateCalculationChainPartContent(WorkbookPart workbookPart, SaveContext context) + { + if (workbookPart.CalculationChainPart == null) + workbookPart.AddNewPart(context.RelIdGenerator.GetNext(RelType.Workbook)); + + if (workbookPart.CalculationChainPart.CalculationChain == null) + workbookPart.CalculationChainPart.CalculationChain = new CalculationChain(); + + var calculationChain = workbookPart.CalculationChainPart.CalculationChain; + calculationChain.RemoveAllChildren(); + + foreach (var worksheet in WorksheetsInternal) + { + foreach (var c in worksheet.Internals.CellsCollection.GetCells().Where(c => c.HasFormula)) + { + if (c.HasArrayFormula) + { + if (c.FormulaReference == null) + c.FormulaReference = c.AsRange().RangeAddress; + + if (c.FormulaReference.FirstAddress.Equals(c.Address)) + { + var cc = new CalculationCell + { + CellReference = c.Address.ToString(), + SheetId = worksheet.SheetId + }; + + cc.Array = true; + calculationChain.AppendChild(cc); + + foreach (var childCell in worksheet.Range(c.FormulaReference.ToString()).Cells()) + { + calculationChain.AppendChild( + new CalculationCell + { + CellReference = childCell.Address.ToString(), + SheetId = worksheet.SheetId, + InChildChain = true + } + ); + } + } + } + else + { + calculationChain.AppendChild(new CalculationCell + { + CellReference = c.Address.ToString(), + SheetId = worksheet.SheetId + }); + } + } + } + + if (!calculationChain.Any()) + workbookPart.DeletePart(workbookPart.CalculationChainPart); + } + + private void GenerateThemePartContent(ThemePart themePart) + { + var theme1 = new Theme { Name = "Office Theme" }; + theme1.AddNamespaceDeclaration("a", "http://schemas.openxmlformats.org/drawingml/2006/main"); + + var themeElements1 = new ThemeElements(); + + var colorScheme1 = new ColorScheme { Name = "Office" }; + + var dark1Color1 = new Dark1Color(); + var systemColor1 = new SystemColor + { + Val = SystemColorValues.WindowText, + LastColor = Theme.Text1.Color.ToHex().Substring(2) + }; + + dark1Color1.AppendChild(systemColor1); + + var light1Color1 = new Light1Color(); + var systemColor2 = new SystemColor + { + Val = SystemColorValues.Window, + LastColor = Theme.Background1.Color.ToHex().Substring(2) + }; + + light1Color1.AppendChild(systemColor2); + + var dark2Color1 = new Dark2Color(); + var rgbColorModelHex1 = new RgbColorModelHex { Val = Theme.Text2.Color.ToHex().Substring(2) }; + + dark2Color1.AppendChild(rgbColorModelHex1); + + var light2Color1 = new Light2Color(); + var rgbColorModelHex2 = new RgbColorModelHex { Val = Theme.Background2.Color.ToHex().Substring(2) }; + + light2Color1.AppendChild(rgbColorModelHex2); + + var accent1Color1 = new Accent1Color(); + var rgbColorModelHex3 = new RgbColorModelHex { Val = Theme.Accent1.Color.ToHex().Substring(2) }; + + accent1Color1.AppendChild(rgbColorModelHex3); + + var accent2Color1 = new Accent2Color(); + var rgbColorModelHex4 = new RgbColorModelHex { Val = Theme.Accent2.Color.ToHex().Substring(2) }; + + accent2Color1.AppendChild(rgbColorModelHex4); + + var accent3Color1 = new Accent3Color(); + var rgbColorModelHex5 = new RgbColorModelHex { Val = Theme.Accent3.Color.ToHex().Substring(2) }; + + accent3Color1.AppendChild(rgbColorModelHex5); + + var accent4Color1 = new Accent4Color(); + var rgbColorModelHex6 = new RgbColorModelHex { Val = Theme.Accent4.Color.ToHex().Substring(2) }; + + accent4Color1.AppendChild(rgbColorModelHex6); + + var accent5Color1 = new Accent5Color(); + var rgbColorModelHex7 = new RgbColorModelHex { Val = Theme.Accent5.Color.ToHex().Substring(2) }; + + accent5Color1.AppendChild(rgbColorModelHex7); + + var accent6Color1 = new Accent6Color(); + var rgbColorModelHex8 = new RgbColorModelHex { Val = Theme.Accent6.Color.ToHex().Substring(2) }; + + accent6Color1.AppendChild(rgbColorModelHex8); + + var hyperlink1 = new DocumentFormat.OpenXml.Drawing.Hyperlink(); + var rgbColorModelHex9 = new RgbColorModelHex { Val = Theme.Hyperlink.Color.ToHex().Substring(2) }; + + hyperlink1.AppendChild(rgbColorModelHex9); + + var followedHyperlinkColor1 = new FollowedHyperlinkColor(); + var rgbColorModelHex10 = new RgbColorModelHex { Val = Theme.FollowedHyperlink.Color.ToHex().Substring(2) }; + + followedHyperlinkColor1.AppendChild(rgbColorModelHex10); + + colorScheme1.AppendChild(dark1Color1); + colorScheme1.AppendChild(light1Color1); + colorScheme1.AppendChild(dark2Color1); + colorScheme1.AppendChild(light2Color1); + colorScheme1.AppendChild(accent1Color1); + colorScheme1.AppendChild(accent2Color1); + colorScheme1.AppendChild(accent3Color1); + colorScheme1.AppendChild(accent4Color1); + colorScheme1.AppendChild(accent5Color1); + colorScheme1.AppendChild(accent6Color1); + colorScheme1.AppendChild(hyperlink1); + colorScheme1.AppendChild(followedHyperlinkColor1); + + var fontScheme2 = new FontScheme { Name = "Office" }; + + var majorFont1 = new MajorFont(); + var latinFont1 = new LatinFont { Typeface = "Cambria" }; + var eastAsianFont1 = new EastAsianFont { Typeface = "" }; + var complexScriptFont1 = new ComplexScriptFont { Typeface = "" }; + var supplementalFont1 = new SupplementalFont { Script = "Jpan", Typeface = "ï¼­ï¼³ Pゴシック" }; + var supplementalFont2 = new SupplementalFont { Script = "Hang", Typeface = "ë§‘ì€ ê³ ë”•" }; + var supplementalFont3 = new SupplementalFont { Script = "Hans", Typeface = "宋体" }; + var supplementalFont4 = new SupplementalFont { Script = "Hant", Typeface = "新細明體" }; + var supplementalFont5 = new SupplementalFont { Script = "Arab", Typeface = "Times New Roman" }; + var supplementalFont6 = new SupplementalFont { Script = "Hebr", Typeface = "Times New Roman" }; + var supplementalFont7 = new SupplementalFont { Script = "Thai", Typeface = "Tahoma" }; + var supplementalFont8 = new SupplementalFont { Script = "Ethi", Typeface = "Nyala" }; + var supplementalFont9 = new SupplementalFont { Script = "Beng", Typeface = "Vrinda" }; + var supplementalFont10 = new SupplementalFont { Script = "Gujr", Typeface = "Shruti" }; + var supplementalFont11 = new SupplementalFont { Script = "Khmr", Typeface = "MoolBoran" }; + var supplementalFont12 = new SupplementalFont { Script = "Knda", Typeface = "Tunga" }; + var supplementalFont13 = new SupplementalFont { Script = "Guru", Typeface = "Raavi" }; + var supplementalFont14 = new SupplementalFont { Script = "Cans", Typeface = "Euphemia" }; + var supplementalFont15 = new SupplementalFont { Script = "Cher", Typeface = "Plantagenet Cherokee" }; + var supplementalFont16 = new SupplementalFont { Script = "Yiii", Typeface = "Microsoft Yi Baiti" }; + var supplementalFont17 = new SupplementalFont { Script = "Tibt", Typeface = "Microsoft Himalaya" }; + var supplementalFont18 = new SupplementalFont { Script = "Thaa", Typeface = "MV Boli" }; + var supplementalFont19 = new SupplementalFont { Script = "Deva", Typeface = "Mangal" }; + var supplementalFont20 = new SupplementalFont { Script = "Telu", Typeface = "Gautami" }; + var supplementalFont21 = new SupplementalFont { Script = "Taml", Typeface = "Latha" }; + var supplementalFont22 = new SupplementalFont { Script = "Syrc", Typeface = "Estrangelo Edessa" }; + var supplementalFont23 = new SupplementalFont { Script = "Orya", Typeface = "Kalinga" }; + var supplementalFont24 = new SupplementalFont { Script = "Mlym", Typeface = "Kartika" }; + var supplementalFont25 = new SupplementalFont { Script = "Laoo", Typeface = "DokChampa" }; + var supplementalFont26 = new SupplementalFont { Script = "Sinh", Typeface = "Iskoola Pota" }; + var supplementalFont27 = new SupplementalFont { Script = "Mong", Typeface = "Mongolian Baiti" }; + var supplementalFont28 = new SupplementalFont { Script = "Viet", Typeface = "Times New Roman" }; + var supplementalFont29 = new SupplementalFont { Script = "Uigh", Typeface = "Microsoft Uighur" }; + + majorFont1.AppendChild(latinFont1); + majorFont1.AppendChild(eastAsianFont1); + majorFont1.AppendChild(complexScriptFont1); + majorFont1.AppendChild(supplementalFont1); + majorFont1.AppendChild(supplementalFont2); + majorFont1.AppendChild(supplementalFont3); + majorFont1.AppendChild(supplementalFont4); + majorFont1.AppendChild(supplementalFont5); + majorFont1.AppendChild(supplementalFont6); + majorFont1.AppendChild(supplementalFont7); + majorFont1.AppendChild(supplementalFont8); + majorFont1.AppendChild(supplementalFont9); + majorFont1.AppendChild(supplementalFont10); + majorFont1.AppendChild(supplementalFont11); + majorFont1.AppendChild(supplementalFont12); + majorFont1.AppendChild(supplementalFont13); + majorFont1.AppendChild(supplementalFont14); + majorFont1.AppendChild(supplementalFont15); + majorFont1.AppendChild(supplementalFont16); + majorFont1.AppendChild(supplementalFont17); + majorFont1.AppendChild(supplementalFont18); + majorFont1.AppendChild(supplementalFont19); + majorFont1.AppendChild(supplementalFont20); + majorFont1.AppendChild(supplementalFont21); + majorFont1.AppendChild(supplementalFont22); + majorFont1.AppendChild(supplementalFont23); + majorFont1.AppendChild(supplementalFont24); + majorFont1.AppendChild(supplementalFont25); + majorFont1.AppendChild(supplementalFont26); + majorFont1.AppendChild(supplementalFont27); + majorFont1.AppendChild(supplementalFont28); + majorFont1.AppendChild(supplementalFont29); + + var minorFont1 = new MinorFont(); + var latinFont2 = new LatinFont { Typeface = "Calibri" }; + var eastAsianFont2 = new EastAsianFont { Typeface = "" }; + var complexScriptFont2 = new ComplexScriptFont { Typeface = "" }; + var supplementalFont30 = new SupplementalFont { Script = "Jpan", Typeface = "ï¼­ï¼³ Pゴシック" }; + var supplementalFont31 = new SupplementalFont { Script = "Hang", Typeface = "ë§‘ì€ ê³ ë”•" }; + var supplementalFont32 = new SupplementalFont { Script = "Hans", Typeface = "宋体" }; + var supplementalFont33 = new SupplementalFont { Script = "Hant", Typeface = "新細明體" }; + var supplementalFont34 = new SupplementalFont { Script = "Arab", Typeface = "Arial" }; + var supplementalFont35 = new SupplementalFont { Script = "Hebr", Typeface = "Arial" }; + var supplementalFont36 = new SupplementalFont { Script = "Thai", Typeface = "Tahoma" }; + var supplementalFont37 = new SupplementalFont { Script = "Ethi", Typeface = "Nyala" }; + var supplementalFont38 = new SupplementalFont { Script = "Beng", Typeface = "Vrinda" }; + var supplementalFont39 = new SupplementalFont { Script = "Gujr", Typeface = "Shruti" }; + var supplementalFont40 = new SupplementalFont { Script = "Khmr", Typeface = "DaunPenh" }; + var supplementalFont41 = new SupplementalFont { Script = "Knda", Typeface = "Tunga" }; + var supplementalFont42 = new SupplementalFont { Script = "Guru", Typeface = "Raavi" }; + var supplementalFont43 = new SupplementalFont { Script = "Cans", Typeface = "Euphemia" }; + var supplementalFont44 = new SupplementalFont { Script = "Cher", Typeface = "Plantagenet Cherokee" }; + var supplementalFont45 = new SupplementalFont { Script = "Yiii", Typeface = "Microsoft Yi Baiti" }; + var supplementalFont46 = new SupplementalFont { Script = "Tibt", Typeface = "Microsoft Himalaya" }; + var supplementalFont47 = new SupplementalFont { Script = "Thaa", Typeface = "MV Boli" }; + var supplementalFont48 = new SupplementalFont { Script = "Deva", Typeface = "Mangal" }; + var supplementalFont49 = new SupplementalFont { Script = "Telu", Typeface = "Gautami" }; + var supplementalFont50 = new SupplementalFont { Script = "Taml", Typeface = "Latha" }; + var supplementalFont51 = new SupplementalFont { Script = "Syrc", Typeface = "Estrangelo Edessa" }; + var supplementalFont52 = new SupplementalFont { Script = "Orya", Typeface = "Kalinga" }; + var supplementalFont53 = new SupplementalFont { Script = "Mlym", Typeface = "Kartika" }; + var supplementalFont54 = new SupplementalFont { Script = "Laoo", Typeface = "DokChampa" }; + var supplementalFont55 = new SupplementalFont { Script = "Sinh", Typeface = "Iskoola Pota" }; + var supplementalFont56 = new SupplementalFont { Script = "Mong", Typeface = "Mongolian Baiti" }; + var supplementalFont57 = new SupplementalFont { Script = "Viet", Typeface = "Arial" }; + var supplementalFont58 = new SupplementalFont { Script = "Uigh", Typeface = "Microsoft Uighur" }; + + minorFont1.AppendChild(latinFont2); + minorFont1.AppendChild(eastAsianFont2); + minorFont1.AppendChild(complexScriptFont2); + minorFont1.AppendChild(supplementalFont30); + minorFont1.AppendChild(supplementalFont31); + minorFont1.AppendChild(supplementalFont32); + minorFont1.AppendChild(supplementalFont33); + minorFont1.AppendChild(supplementalFont34); + minorFont1.AppendChild(supplementalFont35); + minorFont1.AppendChild(supplementalFont36); + minorFont1.AppendChild(supplementalFont37); + minorFont1.AppendChild(supplementalFont38); + minorFont1.AppendChild(supplementalFont39); + minorFont1.AppendChild(supplementalFont40); + minorFont1.AppendChild(supplementalFont41); + minorFont1.AppendChild(supplementalFont42); + minorFont1.AppendChild(supplementalFont43); + minorFont1.AppendChild(supplementalFont44); + minorFont1.AppendChild(supplementalFont45); + minorFont1.AppendChild(supplementalFont46); + minorFont1.AppendChild(supplementalFont47); + minorFont1.AppendChild(supplementalFont48); + minorFont1.AppendChild(supplementalFont49); + minorFont1.AppendChild(supplementalFont50); + minorFont1.AppendChild(supplementalFont51); + minorFont1.AppendChild(supplementalFont52); + minorFont1.AppendChild(supplementalFont53); + minorFont1.AppendChild(supplementalFont54); + minorFont1.AppendChild(supplementalFont55); + minorFont1.AppendChild(supplementalFont56); + minorFont1.AppendChild(supplementalFont57); + minorFont1.AppendChild(supplementalFont58); + + fontScheme2.AppendChild(majorFont1); + fontScheme2.AppendChild(minorFont1); + + var formatScheme1 = new FormatScheme { Name = "Office" }; + + var fillStyleList1 = new FillStyleList(); + + var solidFill1 = new SolidFill(); + var schemeColor1 = new SchemeColor { Val = SchemeColorValues.PhColor }; + + solidFill1.AppendChild(schemeColor1); + + var gradientFill1 = new GradientFill { RotateWithShape = true }; + + var gradientStopList1 = new GradientStopList(); + + var gradientStop1 = new GradientStop { Position = 0 }; + + var schemeColor2 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var tint1 = new Tint { Val = 50000 }; + var saturationModulation1 = new SaturationModulation { Val = 300000 }; + + schemeColor2.AppendChild(tint1); + schemeColor2.AppendChild(saturationModulation1); + + gradientStop1.AppendChild(schemeColor2); + + var gradientStop2 = new GradientStop { Position = 35000 }; + + var schemeColor3 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var tint2 = new Tint { Val = 37000 }; + var saturationModulation2 = new SaturationModulation { Val = 300000 }; + + schemeColor3.AppendChild(tint2); + schemeColor3.AppendChild(saturationModulation2); + + gradientStop2.AppendChild(schemeColor3); + + var gradientStop3 = new GradientStop { Position = 100000 }; + + var schemeColor4 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var tint3 = new Tint { Val = 15000 }; + var saturationModulation3 = new SaturationModulation { Val = 350000 }; + + schemeColor4.AppendChild(tint3); + schemeColor4.AppendChild(saturationModulation3); + + gradientStop3.AppendChild(schemeColor4); + + gradientStopList1.AppendChild(gradientStop1); + gradientStopList1.AppendChild(gradientStop2); + gradientStopList1.AppendChild(gradientStop3); + var linearGradientFill1 = new LinearGradientFill { Angle = 16200000, Scaled = true }; + + gradientFill1.AppendChild(gradientStopList1); + gradientFill1.AppendChild(linearGradientFill1); + + var gradientFill2 = new GradientFill { RotateWithShape = true }; + + var gradientStopList2 = new GradientStopList(); + + var gradientStop4 = new GradientStop { Position = 0 }; + + var schemeColor5 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var shade1 = new Shade { Val = 51000 }; + var saturationModulation4 = new SaturationModulation { Val = 130000 }; + + schemeColor5.AppendChild(shade1); + schemeColor5.AppendChild(saturationModulation4); + + gradientStop4.AppendChild(schemeColor5); + + var gradientStop5 = new GradientStop { Position = 80000 }; + + var schemeColor6 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var shade2 = new Shade { Val = 93000 }; + var saturationModulation5 = new SaturationModulation { Val = 130000 }; + + schemeColor6.AppendChild(shade2); + schemeColor6.AppendChild(saturationModulation5); + + gradientStop5.AppendChild(schemeColor6); + + var gradientStop6 = new GradientStop { Position = 100000 }; + + var schemeColor7 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var shade3 = new Shade { Val = 94000 }; + var saturationModulation6 = new SaturationModulation { Val = 135000 }; + + schemeColor7.AppendChild(shade3); + schemeColor7.AppendChild(saturationModulation6); + + gradientStop6.AppendChild(schemeColor7); + + gradientStopList2.AppendChild(gradientStop4); + gradientStopList2.AppendChild(gradientStop5); + gradientStopList2.AppendChild(gradientStop6); + var linearGradientFill2 = new LinearGradientFill { Angle = 16200000, Scaled = false }; + + gradientFill2.AppendChild(gradientStopList2); + gradientFill2.AppendChild(linearGradientFill2); + + fillStyleList1.AppendChild(solidFill1); + fillStyleList1.AppendChild(gradientFill1); + fillStyleList1.AppendChild(gradientFill2); + + var lineStyleList1 = new LineStyleList(); + + var outline1 = new Outline + { + Width = 9525, + CapType = LineCapValues.Flat, + CompoundLineType = CompoundLineValues.Single, + Alignment = PenAlignmentValues.Center + }; + + var solidFill2 = new SolidFill(); + + var schemeColor8 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var shade4 = new Shade { Val = 95000 }; + var saturationModulation7 = new SaturationModulation { Val = 105000 }; + + schemeColor8.AppendChild(shade4); + schemeColor8.AppendChild(saturationModulation7); + + solidFill2.AppendChild(schemeColor8); + var presetDash1 = new PresetDash { Val = PresetLineDashValues.Solid }; + + outline1.AppendChild(solidFill2); + outline1.AppendChild(presetDash1); + + var outline2 = new Outline + { + Width = 25400, + CapType = LineCapValues.Flat, + CompoundLineType = CompoundLineValues.Single, + Alignment = PenAlignmentValues.Center + }; + + var solidFill3 = new SolidFill(); + var schemeColor9 = new SchemeColor { Val = SchemeColorValues.PhColor }; + + solidFill3.AppendChild(schemeColor9); + var presetDash2 = new PresetDash { Val = PresetLineDashValues.Solid }; + + outline2.AppendChild(solidFill3); + outline2.AppendChild(presetDash2); + + var outline3 = new Outline + { + Width = 38100, + CapType = LineCapValues.Flat, + CompoundLineType = CompoundLineValues.Single, + Alignment = PenAlignmentValues.Center + }; + + var solidFill4 = new SolidFill(); + var schemeColor10 = new SchemeColor { Val = SchemeColorValues.PhColor }; + + solidFill4.AppendChild(schemeColor10); + var presetDash3 = new PresetDash { Val = PresetLineDashValues.Solid }; + + outline3.AppendChild(solidFill4); + outline3.AppendChild(presetDash3); + + lineStyleList1.AppendChild(outline1); + lineStyleList1.AppendChild(outline2); + lineStyleList1.AppendChild(outline3); + + var effectStyleList1 = new EffectStyleList(); + + var effectStyle1 = new EffectStyle(); + + var effectList1 = new EffectList(); + + var outerShadow1 = new OuterShadow + { + BlurRadius = 40000L, + Distance = 20000L, + Direction = 5400000, + RotateWithShape = false + }; + + var rgbColorModelHex11 = new RgbColorModelHex { Val = "000000" }; + var alpha1 = new Alpha { Val = 38000 }; + + rgbColorModelHex11.AppendChild(alpha1); + + outerShadow1.AppendChild(rgbColorModelHex11); + + effectList1.AppendChild(outerShadow1); + + effectStyle1.AppendChild(effectList1); + + var effectStyle2 = new EffectStyle(); + + var effectList2 = new EffectList(); + + var outerShadow2 = new OuterShadow + { + BlurRadius = 40000L, + Distance = 23000L, + Direction = 5400000, + RotateWithShape = false + }; + + var rgbColorModelHex12 = new RgbColorModelHex { Val = "000000" }; + var alpha2 = new Alpha { Val = 35000 }; + + rgbColorModelHex12.AppendChild(alpha2); + + outerShadow2.AppendChild(rgbColorModelHex12); + + effectList2.AppendChild(outerShadow2); + + effectStyle2.AppendChild(effectList2); + + var effectStyle3 = new EffectStyle(); + + var effectList3 = new EffectList(); + + var outerShadow3 = new OuterShadow + { + BlurRadius = 40000L, + Distance = 23000L, + Direction = 5400000, + RotateWithShape = false + }; + + var rgbColorModelHex13 = new RgbColorModelHex { Val = "000000" }; + var alpha3 = new Alpha { Val = 35000 }; + + rgbColorModelHex13.AppendChild(alpha3); + + outerShadow3.AppendChild(rgbColorModelHex13); + + effectList3.AppendChild(outerShadow3); + + var scene3DType1 = new Scene3DType(); + + var camera1 = new Camera { Preset = PresetCameraValues.OrthographicFront }; + var rotation1 = new Rotation { Latitude = 0, Longitude = 0, Revolution = 0 }; + + camera1.AppendChild(rotation1); + + var lightRig1 = new LightRig { Rig = LightRigValues.ThreePoints, Direction = LightRigDirectionValues.Top }; + var rotation2 = new Rotation { Latitude = 0, Longitude = 0, Revolution = 1200000 }; + + lightRig1.AppendChild(rotation2); + + scene3DType1.AppendChild(camera1); + scene3DType1.AppendChild(lightRig1); + + var shape3DType1 = new Shape3DType(); + var bevelTop1 = new BevelTop { Width = 63500L, Height = 25400L }; + + shape3DType1.AppendChild(bevelTop1); + + effectStyle3.AppendChild(effectList3); + effectStyle3.AppendChild(scene3DType1); + effectStyle3.AppendChild(shape3DType1); + + effectStyleList1.AppendChild(effectStyle1); + effectStyleList1.AppendChild(effectStyle2); + effectStyleList1.AppendChild(effectStyle3); + + var backgroundFillStyleList1 = new BackgroundFillStyleList(); + + var solidFill5 = new SolidFill(); + var schemeColor11 = new SchemeColor { Val = SchemeColorValues.PhColor }; + + solidFill5.AppendChild(schemeColor11); + + var gradientFill3 = new GradientFill { RotateWithShape = true }; + + var gradientStopList3 = new GradientStopList(); + + var gradientStop7 = new GradientStop { Position = 0 }; + + var schemeColor12 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var tint4 = new Tint { Val = 40000 }; + var saturationModulation8 = new SaturationModulation { Val = 350000 }; + + schemeColor12.AppendChild(tint4); + schemeColor12.AppendChild(saturationModulation8); + + gradientStop7.AppendChild(schemeColor12); + + var gradientStop8 = new GradientStop { Position = 40000 }; + + var schemeColor13 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var tint5 = new Tint { Val = 45000 }; + var shade5 = new Shade { Val = 99000 }; + var saturationModulation9 = new SaturationModulation { Val = 350000 }; + + schemeColor13.AppendChild(tint5); + schemeColor13.AppendChild(shade5); + schemeColor13.AppendChild(saturationModulation9); + + gradientStop8.AppendChild(schemeColor13); + + var gradientStop9 = new GradientStop { Position = 100000 }; + + var schemeColor14 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var shade6 = new Shade { Val = 20000 }; + var saturationModulation10 = new SaturationModulation { Val = 255000 }; + + schemeColor14.AppendChild(shade6); + schemeColor14.AppendChild(saturationModulation10); + + gradientStop9.AppendChild(schemeColor14); + + gradientStopList3.AppendChild(gradientStop7); + gradientStopList3.AppendChild(gradientStop8); + gradientStopList3.AppendChild(gradientStop9); + + var pathGradientFill1 = new PathGradientFill { Path = PathShadeValues.Circle }; + var fillToRectangle1 = new FillToRectangle { Left = 50000, Top = -80000, Right = 50000, Bottom = 180000 }; + + pathGradientFill1.AppendChild(fillToRectangle1); + + gradientFill3.AppendChild(gradientStopList3); + gradientFill3.AppendChild(pathGradientFill1); + + var gradientFill4 = new GradientFill { RotateWithShape = true }; + + var gradientStopList4 = new GradientStopList(); + + var gradientStop10 = new GradientStop { Position = 0 }; + + var schemeColor15 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var tint6 = new Tint { Val = 80000 }; + var saturationModulation11 = new SaturationModulation { Val = 300000 }; + + schemeColor15.AppendChild(tint6); + schemeColor15.AppendChild(saturationModulation11); + + gradientStop10.AppendChild(schemeColor15); + + var gradientStop11 = new GradientStop { Position = 100000 }; + + var schemeColor16 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var shade7 = new Shade { Val = 30000 }; + var saturationModulation12 = new SaturationModulation { Val = 200000 }; + + schemeColor16.AppendChild(shade7); + schemeColor16.AppendChild(saturationModulation12); + + gradientStop11.AppendChild(schemeColor16); + + gradientStopList4.AppendChild(gradientStop10); + gradientStopList4.AppendChild(gradientStop11); + + var pathGradientFill2 = new PathGradientFill { Path = PathShadeValues.Circle }; + var fillToRectangle2 = new FillToRectangle { Left = 50000, Top = 50000, Right = 50000, Bottom = 50000 }; + + pathGradientFill2.AppendChild(fillToRectangle2); + + gradientFill4.AppendChild(gradientStopList4); + gradientFill4.AppendChild(pathGradientFill2); + + backgroundFillStyleList1.AppendChild(solidFill5); + backgroundFillStyleList1.AppendChild(gradientFill3); + backgroundFillStyleList1.AppendChild(gradientFill4); + + formatScheme1.AppendChild(fillStyleList1); + formatScheme1.AppendChild(lineStyleList1); + formatScheme1.AppendChild(effectStyleList1); + formatScheme1.AppendChild(backgroundFillStyleList1); + + themeElements1.AppendChild(colorScheme1); + themeElements1.AppendChild(fontScheme2); + themeElements1.AppendChild(formatScheme1); + var objectDefaults1 = new ObjectDefaults(); + var extraColorSchemeList1 = new ExtraColorSchemeList(); + + theme1.AppendChild(themeElements1); + theme1.AppendChild(objectDefaults1); + theme1.AppendChild(extraColorSchemeList1); + + themePart.Theme = theme1; + } + + private void GenerateCustomFilePropertiesPartContent(CustomFilePropertiesPart customFilePropertiesPart) + { + var properties = new DocumentFormat.OpenXml.CustomProperties.Properties(); + properties.AddNamespaceDeclaration("vt", + "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"); + var propertyId = 1; + foreach (var p in CustomProperties) + { + propertyId++; + var customDocumentProperty = new CustomDocumentProperty + { + FormatId = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}", + PropertyId = propertyId, + Name = p.Name + }; + if (p.Type == XLCustomPropertyType.Text) + { + var vTlpwstr1 = new VTLPWSTR { Text = p.GetValue() }; + customDocumentProperty.AppendChild(vTlpwstr1); + } + else if (p.Type == XLCustomPropertyType.Date) + { + var vTFileTime1 = new VTFileTime + { + Text = + p.GetValue().ToUniversalTime().ToString( + "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'") + }; + customDocumentProperty.AppendChild(vTFileTime1); + } + else if (p.Type == XLCustomPropertyType.Number) + { + var vTDouble1 = new VTDouble + { + Text = p.GetValue().ToInvariantString() + }; + customDocumentProperty.AppendChild(vTDouble1); + } + else + { + var vTBool1 = new VTBool { Text = p.GetValue().ToString().ToLower() }; + customDocumentProperty.AppendChild(vTBool1); + } + properties.AppendChild(customDocumentProperty); + } + + customFilePropertiesPart.Properties = properties; + } + + private void SetPackageProperties(OpenXmlPackage document) + { + var created = Properties.Created == DateTime.MinValue ? DateTime.Now : Properties.Created; + var modified = Properties.Modified == DateTime.MinValue ? DateTime.Now : Properties.Modified; + document.PackageProperties.Created = created; + document.PackageProperties.Modified = modified; + +#if true // Workaround: https://github.com/OfficeDev/Open-XML-SDK/issues/235 + + if (Properties.LastModifiedBy == null) document.PackageProperties.LastModifiedBy = ""; + if (Properties.Author == null) document.PackageProperties.Creator = ""; + if (Properties.Title == null) document.PackageProperties.Title = ""; + if (Properties.Subject == null) document.PackageProperties.Subject = ""; + if (Properties.Category == null) document.PackageProperties.Category = ""; + if (Properties.Keywords == null) document.PackageProperties.Keywords = ""; + if (Properties.Comments == null) document.PackageProperties.Description = ""; + if (Properties.Status == null) document.PackageProperties.ContentStatus = ""; + +#endif + + document.PackageProperties.LastModifiedBy = Properties.LastModifiedBy; + + document.PackageProperties.Creator = Properties.Author; + document.PackageProperties.Title = Properties.Title; + document.PackageProperties.Subject = Properties.Subject; + document.PackageProperties.Category = Properties.Category; + document.PackageProperties.Keywords = Properties.Keywords; + document.PackageProperties.Description = Properties.Comments; + document.PackageProperties.ContentStatus = Properties.Status; + } + + private static string GetTableName(String originalTableName, SaveContext context) + { + var tableName = originalTableName.RemoveSpecialCharacters(); + var name = tableName; + if (context.TableNames.Contains(name)) + { + var i = 1; + name = tableName + i.ToInvariantString(); + while (context.TableNames.Contains(name)) + { + i++; + name = tableName + i.ToInvariantString(); + } + } + + context.TableNames.Add(name); + return name; + } + + private static void GenerateTableDefinitionPartContent(TableDefinitionPart tableDefinitionPart, XLTable xlTable, SaveContext context) + { + context.TableId++; + var reference = xlTable.RangeAddress.FirstAddress + ":" + xlTable.RangeAddress.LastAddress; + var tableName = GetTableName(xlTable.Name, context); + var table = new Table + { + Id = context.TableId, + Name = tableName, + DisplayName = tableName, + Reference = reference + }; + + if (!xlTable.ShowHeaderRow) + table.HeaderRowCount = 0; + + if (xlTable.ShowTotalsRow) + table.TotalsRowCount = 1; + else + table.TotalsRowShown = false; + + var tableColumns = new TableColumns { Count = (UInt32)xlTable.ColumnCount() }; + + UInt32 columnId = 0; + foreach (var xlField in xlTable.Fields) + { + columnId++; + var fieldName = xlField.Name; + var tableColumn = new TableColumn + { + Id = columnId, + Name = fieldName.Replace("_x000a_", "_x005f_x000a_").Replace(Environment.NewLine, "_x000a_") + }; + + // https://github.com/ClosedXML/ClosedXML/issues/513 + if (xlField.IsConsistentStyle()) + { + var style = (xlField.Column.Cells() + .Skip(xlTable.ShowHeaderRow ? 1 : 0) + .First() + .Style as XLStyle).Value; + + if (!DefaultStyleValue.Equals(style) && context.DifferentialFormats.TryGetValue(style, out Int32 id)) + tableColumn.DataFormatId = UInt32Value.FromUInt32(Convert.ToUInt32(id)); + } + else + tableColumn.DataFormatId = null; + + if (xlField.IsConsistentFormula()) + { + string formula = xlField.Column.Cells() + .Skip(xlTable.ShowHeaderRow ? 1 : 0) + .First() + .FormulaA1; + + while (formula.StartsWith("=") && formula.Length > 1) + formula = formula.Substring(1); + + if (!String.IsNullOrWhiteSpace(formula)) + { + tableColumn.CalculatedColumnFormula = new CalculatedColumnFormula + { + Text = formula + }; + } + } + else + tableColumn.CalculatedColumnFormula = null; + + if (xlTable.ShowTotalsRow) + { + if (xlField.TotalsRowFunction != XLTotalsRowFunction.None) + { + tableColumn.TotalsRowFunction = xlField.TotalsRowFunction.ToOpenXml(); + + if (xlField.TotalsRowFunction == XLTotalsRowFunction.Custom) + tableColumn.TotalsRowFormula = new TotalsRowFormula(xlField.TotalsRowFormulaA1); + } + + if (!String.IsNullOrWhiteSpace(xlField.TotalsRowLabel)) + tableColumn.TotalsRowLabel = xlField.TotalsRowLabel; + } + tableColumns.AppendChild(tableColumn); + } + + var tableStyleInfo1 = new TableStyleInfo + { + ShowFirstColumn = xlTable.EmphasizeFirstColumn, + ShowLastColumn = xlTable.EmphasizeLastColumn, + ShowRowStripes = xlTable.ShowRowStripes, + ShowColumnStripes = xlTable.ShowColumnStripes + }; + + if (xlTable.Theme != XLTableTheme.None) + tableStyleInfo1.Name = xlTable.Theme.Name; + + if (xlTable.ShowAutoFilter) + { + var autoFilter1 = new AutoFilter(); + if (xlTable.ShowTotalsRow) + { + xlTable.AutoFilter.Range = xlTable.Worksheet.Range( + xlTable.RangeAddress.FirstAddress.RowNumber, xlTable.RangeAddress.FirstAddress.ColumnNumber, + xlTable.RangeAddress.LastAddress.RowNumber - 1, xlTable.RangeAddress.LastAddress.ColumnNumber); + } + else + xlTable.AutoFilter.Range = xlTable.Worksheet.Range(xlTable.RangeAddress); + + PopulateAutoFilter(xlTable.AutoFilter, autoFilter1); + + table.AppendChild(autoFilter1); + } + + table.AppendChild(tableColumns); + table.AppendChild(tableStyleInfo1); + + tableDefinitionPart.Table = table; + } + + private static void GeneratePivotTables(WorkbookPart workbookPart, WorksheetPart worksheetPart, + XLWorksheet xlWorksheet, + SaveContext context) + { + PivotCaches pivotCaches; + uint cacheId = 0; + if (workbookPart.Workbook.PivotCaches == null) + pivotCaches = workbookPart.Workbook.InsertAfter(new PivotCaches(), workbookPart.Workbook.CalculationProperties); + else + { + pivotCaches = workbookPart.Workbook.PivotCaches; + if (pivotCaches.Any()) + cacheId = pivotCaches.Cast().Max(pc => pc.CacheId.Value) + 1; + } + + foreach (var pt in xlWorksheet.PivotTables.Cast()) + { + context.PivotTables.Clear(); + + // TODO: Avoid duplicate pivot caches of same source range + + PivotCache pivotCache; + PivotTableCacheDefinitionPart pivotTableCacheDefinitionPart; + if (!String.IsNullOrWhiteSpace(pt.WorkbookCacheRelId)) + { + pivotCache = pivotCaches.Cast().Single(pc => pc.Id.Value == pt.WorkbookCacheRelId); + pivotTableCacheDefinitionPart = workbookPart.GetPartById(pt.WorkbookCacheRelId) as PivotTableCacheDefinitionPart; + } + else + { + var workbookCacheRelId = context.RelIdGenerator.GetNext(RelType.Workbook); + pt.WorkbookCacheRelId = workbookCacheRelId; + pivotCache = new PivotCache { CacheId = cacheId++, Id = workbookCacheRelId }; + pivotCaches.AppendChild(pivotCache); + pivotTableCacheDefinitionPart = workbookPart.AddNewPart(workbookCacheRelId); + } + + GeneratePivotTableCacheDefinitionPartContent(pivotTableCacheDefinitionPart, pt, context); + + PivotTablePart pivotTablePart; + var createNewPivotTablePart = String.IsNullOrWhiteSpace(pt.RelId); + if (createNewPivotTablePart) + { + var relId = context.RelIdGenerator.GetNext(RelType.Workbook); + pt.RelId = relId; + pivotTablePart = worksheetPart.AddNewPart(relId); + } + else + pivotTablePart = worksheetPart.GetPartById(pt.RelId) as PivotTablePart; + + GeneratePivotTablePartContent(pivotTablePart, pt, pivotCache.CacheId, context); + + if (createNewPivotTablePart) + pivotTablePart.AddPart(pivotTableCacheDefinitionPart, context.RelIdGenerator.GetNext(RelType.Workbook)); + } + } + + // Generates content of pivotTableCacheDefinitionPart + private static void GeneratePivotTableCacheDefinitionPartContent( + PivotTableCacheDefinitionPart pivotTableCacheDefinitionPart, XLPivotTable pt, + SaveContext context) + { + var pivotCacheDefinition = pivotTableCacheDefinitionPart.PivotCacheDefinition; + if (pivotCacheDefinition == null) + { + pivotCacheDefinition = new PivotCacheDefinition { Id = "rId1" }; + + pivotCacheDefinition.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + pivotTableCacheDefinitionPart.PivotCacheDefinition = pivotCacheDefinition; + } + + #region CreatedVersion + + byte createdVersion = XLConstants.PivotTable.CreatedVersion; + + if (pivotCacheDefinition.CreatedVersion?.HasValue ?? false) + pivotCacheDefinition.CreatedVersion = Math.Max(createdVersion, pivotCacheDefinition.CreatedVersion.Value); + else + pivotCacheDefinition.CreatedVersion = createdVersion; + + #endregion CreatedVersion + + #region RefreshedVersion + + byte refreshedVersion = XLConstants.PivotTable.RefreshedVersion; + if (pivotCacheDefinition.RefreshedVersion?.HasValue ?? false) + pivotCacheDefinition.RefreshedVersion = Math.Max(refreshedVersion, pivotCacheDefinition.RefreshedVersion.Value); + else + pivotCacheDefinition.RefreshedVersion = refreshedVersion; + + #endregion RefreshedVersion + + #region MinRefreshableVersion + + byte minRefreshableVersion = 3; + if (pivotCacheDefinition.MinRefreshableVersion?.HasValue ?? false) + pivotCacheDefinition.MinRefreshableVersion = Math.Max(minRefreshableVersion, pivotCacheDefinition.MinRefreshableVersion.Value); + else + pivotCacheDefinition.MinRefreshableVersion = minRefreshableVersion; + + #endregion MinRefreshableVersion + + pivotCacheDefinition.SaveData = pt.SaveSourceData; + pivotCacheDefinition.RefreshOnLoad = true; //pt.RefreshDataOnOpen + + var pti = new PivotTableInfo + { + Guid = pt.Guid, + Fields = new Dictionary() + }; + + var source = pt.SourceRange; + if (pt.ItemsToRetainPerField == XLItemsToRetain.None) + pivotCacheDefinition.MissingItemsLimit = 0U; + else if (pt.ItemsToRetainPerField == XLItemsToRetain.Max) + pivotCacheDefinition.MissingItemsLimit = XLHelper.MaxRowNumber; + + // Begin CacheSource + var cacheSource = new CacheSource { Type = SourceValues.Worksheet }; + var worksheetSource = new WorksheetSource(); + + switch (pt.SourceType) + { + case XLPivotTableSourceType.Range: + worksheetSource.Name = null; + worksheetSource.Reference = source.RangeAddress.ToStringRelative(includeSheet: false); + + // Do not quote worksheet name with whitespace here - issue #955 + worksheetSource.Sheet = source.RangeAddress.Worksheet.Name; + break; + + case XLPivotTableSourceType.Table: + worksheetSource.Name = pt.SourceTable.Name; + worksheetSource.Reference = null; + worksheetSource.Sheet = null; + break; + + default: + throw new NotSupportedException($"Pivot table source type {pt.SourceType} is not supported."); + } + + cacheSource.AppendChild(worksheetSource); + pivotCacheDefinition.CacheSource = cacheSource; + + // End CacheSource + + // Begin CacheFields + var cacheFields = pivotCacheDefinition.CacheFields; + if (cacheFields == null) + { + cacheFields = new CacheFields(); + pivotCacheDefinition.CacheFields = cacheFields; + } + + foreach (var c in source.Columns()) + { + var columnNumber = c.ColumnNumber(); + var columnName = c.FirstCell().Value.ObjectToInvariantString(); + + CacheField cacheField = null; + + // .CacheFields is cleared when workbook is begin saved + // So if there are any entries, it would be from previous pivot tables + // with an identical source range. + // When pivot sources get its refactoring, this will not be necessary + if (cacheFields != null) + { + cacheField = pivotCacheDefinition + .CacheFields + .Elements() + .FirstOrDefault(f => f.Name == columnName); + } + + if (cacheField == null) + { + cacheField = new CacheField + { + Name = columnName, + SharedItems = new SharedItems() + }; + cacheFields.AppendChild(cacheField); + } + var sharedItems = cacheField.SharedItems; + + XLPivotField xlpf; + if (pt.Fields.Contains(columnName)) + xlpf = pt.Fields.Get(columnName) as XLPivotField; + else + xlpf = pt.Fields.Add(columnName) as XLPivotField; + + var field = pt.RowLabels + .Union(pt.ColumnLabels) + .Union(pt.ReportFilters) + .FirstOrDefault(f => f.SourceName == columnName); + + if (field == null) + { + xlpf.ShowBlankItems = true; + } + else + { + xlpf.CustomName = field.CustomName; + xlpf.SortType = field.SortType; + xlpf.SubtotalCaption = field.SubtotalCaption; + xlpf.IncludeNewItemsInFilter = field.IncludeNewItemsInFilter; + xlpf.Outline = field.Outline; + xlpf.Compact = field.Compact; + xlpf.SubtotalsAtTop = field.SubtotalsAtTop; + xlpf.RepeatItemLabels = field.RepeatItemLabels; + xlpf.InsertBlankLines = field.InsertBlankLines; + xlpf.ShowBlankItems = field.ShowBlankItems; + xlpf.InsertPageBreaks = field.InsertPageBreaks; + xlpf.Collapsed = field.Collapsed; + xlpf.Subtotals.AddRange(field.Subtotals); + } + + var ptfi = new PivotTableFieldInfo + { + IsTotallyBlankField = false + }; + + var sourceHeaderRow = source.FirstRow().RowNumber(); + var fieldValueCells = source.CellsUsed(cell => cell.Address.ColumnNumber == columnNumber + && cell.Address.RowNumber > sourceHeaderRow); + var types = fieldValueCells.Select(cell => cell.DataType).Distinct().ToArray(); + var containsBlank = source.CellsUsed(XLCellsUsedOptions.All, + cell => cell.Address.ColumnNumber == columnNumber + && cell.Address.RowNumber > sourceHeaderRow + && cell.IsEmpty()).Any(); + + // For a totally blank column, we need to check that all cells in column are unused + if (!fieldValueCells.Any()) + { + ptfi.IsTotallyBlankField = true; + containsBlank = true; + } + + if (types.Any()) + { + if (types.Length == 1 && types.Single() == XLDataType.Number) + { + ptfi.DataType = XLDataType.Number; + ptfi.MixedDataType = false; + ptfi.DistinctValues = fieldValueCells + .Where(cell => cell.TryGetValue(out Double _)) + .Select(cell => cell.CachedValue.CastTo()) + .Distinct() + .Cast() + .ToArray(); + + pti.Fields.Add(xlpf.SourceName, ptfi); + } + else if (types.Length == 1 && types.Single() == XLDataType.DateTime) + { + ptfi.DataType = XLDataType.DateTime; + ptfi.MixedDataType = false; + ptfi.DistinctValues = fieldValueCells + .Where(cell => cell.TryGetValue(out DateTime _)) + .Select(cell => cell.CachedValue.CastTo()) + .Distinct() + .Cast() + .ToArray(); + + pti.Fields.Add(xlpf.SourceName, ptfi); + } + else + { + ptfi.DataType = types.First(); + ptfi.MixedDataType = types.Length > 1; + + if (!ptfi.MixedDataType && ptfi.DataType == XLDataType.Text) + ptfi.DistinctValues = fieldValueCells + .Where(cell => cell.TryGetValue(out String _)) + .Select(cell => cell.CachedValue.CastTo()) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToArray(); + else + ptfi.DistinctValues = fieldValueCells + .Where(cell => cell.TryGetValue(out String _)) + .Select(cell => cell.GetString()) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToArray(); + + pti.Fields.Add(xlpf.SourceName, ptfi); + } + + // If this cache field exists and contains shared items, + // then we can assume that this as been populated by a previous pivot table + if (sharedItems.Any()) + continue; + + // Else we have to populate the items + if (types.Length == 1 && types.Single() == XLDataType.Number) + { + sharedItems.ContainsSemiMixedTypes = containsBlank; + sharedItems.ContainsString = false; + sharedItems.ContainsNumber = true; + + var allInteger = ptfi.DistinctValues.All(v => int.TryParse(v.ToString(), out int val)); + if (allInteger) sharedItems.ContainsInteger = true; + + // Output items only for row / column / filter fields + if (pt.RowLabels.Any(p => p.SourceName == xlpf.SourceName) + || pt.ColumnLabels.Any(p => p.SourceName == xlpf.SourceName) + || pt.ReportFilters.Any(p => p.SourceName == xlpf.SourceName)) + { + foreach (var value in ptfi.DistinctValues) + sharedItems.AppendChild(new NumberItem { Val = (double)value }); + + if (containsBlank) sharedItems.AppendChild(new MissingItem()); + } + + sharedItems.MinValue = (double)ptfi.DistinctValues.Min(); + sharedItems.MaxValue = (double)ptfi.DistinctValues.Max(); + } + else if (types.Length == 1 && types.Single() == XLDataType.DateTime) + { + sharedItems.ContainsSemiMixedTypes = containsBlank; + sharedItems.ContainsNonDate = false; + sharedItems.ContainsString = false; + sharedItems.ContainsDate = true; + + // Output items only for row / column / filter fields + if (pt.RowLabels.Any(p => p.SourceName == xlpf.SourceName) + || pt.ColumnLabels.Any(p => p.SourceName == xlpf.SourceName) + || pt.ReportFilters.Any(p => p.SourceName == xlpf.SourceName)) + { + foreach (var value in ptfi.DistinctValues) + sharedItems.AppendChild(new DateTimeItem { Val = (DateTime)value }); + + if (containsBlank) sharedItems.AppendChild(new MissingItem()); + } + + sharedItems.MinDate = (DateTime)ptfi.DistinctValues.Min(); + sharedItems.MaxDate = (DateTime)ptfi.DistinctValues.Max(); + } + else + { + if (ptfi.DistinctValues.Any(v => ((string)v).Length > 255)) + sharedItems.LongText = true; + + foreach (var value in ptfi.DistinctValues) + sharedItems.AppendChild(new StringItem { Val = (string)value }); + + if (containsBlank) sharedItems.AppendChild(new MissingItem()); + } + + sharedItems.Count = Convert.ToUInt32(sharedItems.Elements().Count()); + } + + if (containsBlank) sharedItems.ContainsBlank = true; + + if (ptfi.IsTotallyBlankField) + pti.Fields.Add(xlpf.SourceName, ptfi); + else if (ptfi.DistinctValues?.Any() ?? false) + sharedItems.Count = Convert.ToUInt32(ptfi.DistinctValues.Count()); + } + + // End CacheFields + + var pivotTableCacheRecordsPart = pivotTableCacheDefinitionPart.GetPartsOfType().Any() ? + pivotTableCacheDefinitionPart.GetPartsOfType().First() : + pivotTableCacheDefinitionPart.AddNewPart("rId1"); + + var pivotCacheRecords = new PivotCacheRecords(); + pivotCacheRecords.AddNamespaceDeclaration("r", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + pivotTableCacheRecordsPart.PivotCacheRecords = pivotCacheRecords; + + context.PivotTables.Add(pti.Guid, pti); + } + + // Generates content of pivotTablePart + private static void GeneratePivotTablePartContent( + PivotTablePart pivotTablePart, XLPivotTable pt, + uint cacheId, SaveContext context) + { + var pti = context.PivotTables[(pt as XLPivotTable).Guid]; + + var pivotTableDefinition = new PivotTableDefinition + { + Name = pt.Name, + CacheId = cacheId, + DataCaption = "Values", + MergeItem = OpenXmlHelper.GetBooleanValue(pt.MergeAndCenterWithLabels, false), + Indent = Convert.ToUInt32(pt.RowLabelIndent), + PageOverThenDown = (pt.FilterAreaOrder == XLFilterAreaOrder.OverThenDown), + PageWrap = Convert.ToUInt32(pt.FilterFieldsPageWrap), + ShowError = String.IsNullOrEmpty(pt.ErrorValueReplacement), + UseAutoFormatting = OpenXmlHelper.GetBooleanValue(pt.AutofitColumns, false), + PreserveFormatting = OpenXmlHelper.GetBooleanValue(pt.PreserveCellFormatting, true), + RowGrandTotals = OpenXmlHelper.GetBooleanValue(pt.ShowGrandTotalsRows, true), + ColumnGrandTotals = OpenXmlHelper.GetBooleanValue(pt.ShowGrandTotalsColumns, true), + SubtotalHiddenItems = OpenXmlHelper.GetBooleanValue(pt.FilteredItemsInSubtotals, false), + MultipleFieldFilters = OpenXmlHelper.GetBooleanValue(pt.AllowMultipleFilters, true), + CustomListSort = OpenXmlHelper.GetBooleanValue(pt.UseCustomListsForSorting, true), + ShowDrill = OpenXmlHelper.GetBooleanValue(pt.ShowExpandCollapseButtons, true), + ShowDataTips = OpenXmlHelper.GetBooleanValue(pt.ShowContextualTooltips, true), + ShowMemberPropertyTips = OpenXmlHelper.GetBooleanValue(pt.ShowPropertiesInTooltips, true), + ShowHeaders = OpenXmlHelper.GetBooleanValue(pt.DisplayCaptionsAndDropdowns, true), + GridDropZones = OpenXmlHelper.GetBooleanValue(pt.ClassicPivotTableLayout, false), + ShowEmptyRow = OpenXmlHelper.GetBooleanValue(pt.ShowEmptyItemsOnRows, false), + ShowEmptyColumn = OpenXmlHelper.GetBooleanValue(pt.ShowEmptyItemsOnColumns, false), + ShowItems = OpenXmlHelper.GetBooleanValue(pt.DisplayItemLabels, true), + FieldListSortAscending = OpenXmlHelper.GetBooleanValue(pt.SortFieldsAtoZ, false), + PrintDrill = OpenXmlHelper.GetBooleanValue(pt.PrintExpandCollapsedButtons, false), + ItemPrintTitles = OpenXmlHelper.GetBooleanValue(pt.RepeatRowLabels, false), + FieldPrintTitles = OpenXmlHelper.GetBooleanValue(pt.PrintTitles, false), + EnableDrill = OpenXmlHelper.GetBooleanValue(pt.EnableShowDetails, true) + }; + + if (!String.IsNullOrEmpty(pt.ColumnHeaderCaption)) + pivotTableDefinition.ColumnHeaderCaption = StringValue.FromString(pt.ColumnHeaderCaption); + + if (!String.IsNullOrEmpty(pt.RowHeaderCaption)) + pivotTableDefinition.RowHeaderCaption = StringValue.FromString(pt.RowHeaderCaption); + + if (pt.ClassicPivotTableLayout) + { + pivotTableDefinition.Compact = false; + pivotTableDefinition.CompactData = false; + } + + if (pt.EmptyCellReplacement != null) + { + pivotTableDefinition.ShowMissing = true; + pivotTableDefinition.MissingCaption = pt.EmptyCellReplacement; + } + else + { + pivotTableDefinition.ShowMissing = false; + } + + if (pt.ErrorValueReplacement != null) + { + pivotTableDefinition.ShowError = true; + pivotTableDefinition.ErrorCaption = pt.ErrorValueReplacement; + } + else + { + pivotTableDefinition.ShowError = false; + } + + var location = new Location + { + FirstHeaderRow = 1U, + FirstDataRow = 1U, + FirstDataColumn = 1U + }; + + if (pt.ReportFilters.Any()) + { + // Reference cell is the part BELOW the report filters + location.Reference = pt.TargetCell.CellBelow(pt.ReportFilters.Count() + 1).Address.ToString(); + } + else + location.Reference = pt.TargetCell.Address.ToString(); + + var rowFields = new RowFields(); + var columnFields = new ColumnFields(); + var rowItems = new RowItems(); + var columnItems = new ColumnItems(); + var pageFields = new PageFields { Count = (uint)pt.ReportFilters.Count() }; + var pivotFields = new PivotFields { Count = Convert.ToUInt32(pt.SourceRange.ColumnCount()) }; + + var orderedPageFields = new SortedDictionary(); + var orderedColumnLabels = new SortedDictionary(); + var orderedRowLabels = new SortedDictionary(); + + // Add value fields first + if (pt.Values.Any()) + { + if (pt.RowLabels.Contains(XLConstants.PivotTable.ValuesSentinalLabel)) + { + var f = pt.RowLabels.First(f1 => f1.SourceName == XLConstants.PivotTable.ValuesSentinalLabel); + orderedRowLabels.Add(pt.RowLabels.IndexOf(f), new Field { Index = -2 }); + pivotTableDefinition.DataOnRows = true; + } + else if (pt.ColumnLabels.Contains(XLConstants.PivotTable.ValuesSentinalLabel)) + { + var f = pt.ColumnLabels.First(f1 => f1.SourceName == XLConstants.PivotTable.ValuesSentinalLabel); + orderedColumnLabels.Add(pt.ColumnLabels.IndexOf(f), new Field { Index = -2 }); + } + } + + // TODO: improve performance as per https://github.com/ClosedXML/ClosedXML/pull/984#discussion_r217266491 + foreach (var xlpf in pt.Fields) + { + var ptfi = pti.Fields[xlpf.SourceName]; + + if (pt.RowLabels.Contains(xlpf.SourceName)) + { + var rowLabelIndex = pt.RowLabels.IndexOf(xlpf); + var f = new Field { Index = pt.Fields.IndexOf(xlpf) }; + orderedRowLabels.Add(rowLabelIndex, f); + + if (ptfi.IsTotallyBlankField) + rowItems.AppendChild(new RowItem()); + else + { + for (var i = 0; i < ptfi.DistinctValues.Count(); i++) + { + var rowItem = new RowItem(); + rowItem.AppendChild(new MemberPropertyIndex { Val = i }); + rowItems.AppendChild(rowItem); + } + } + + var rowItemTotal = new RowItem { ItemType = ItemValues.Grand }; + rowItemTotal.AppendChild(new MemberPropertyIndex()); + rowItems.AppendChild(rowItemTotal); + } + else if (pt.ColumnLabels.Contains(xlpf.SourceName)) + { + var columnlabelIndex = pt.ColumnLabels.IndexOf(xlpf); + var f = new Field { Index = pt.Fields.IndexOf(xlpf) }; + orderedColumnLabels.Add(columnlabelIndex, f); + + if (ptfi.IsTotallyBlankField) + columnItems.AppendChild(new RowItem()); + else + { + for (var i = 0; i < ptfi.DistinctValues.Count(); i++) + { + var rowItem = new RowItem(); + rowItem.AppendChild(new MemberPropertyIndex { Val = i }); + columnItems.AppendChild(rowItem); + } + } + + var rowItemTotal = new RowItem { ItemType = ItemValues.Grand }; + rowItemTotal.AppendChild(new MemberPropertyIndex()); + columnItems.AppendChild(rowItemTotal); + } + } + + foreach (var xlpf in pt.Fields) + { + var ptfi = pti.Fields[xlpf.SourceName]; + IXLPivotField labelOrFilterField = null; + var pf = new PivotField + { + Name = xlpf.CustomName, + IncludeNewItemsInFilter = OpenXmlHelper.GetBooleanValue(xlpf.IncludeNewItemsInFilter, false), + InsertBlankRow = OpenXmlHelper.GetBooleanValue(xlpf.InsertBlankLines, false), + ShowAll = OpenXmlHelper.GetBooleanValue(xlpf.ShowBlankItems, true), + InsertPageBreak = OpenXmlHelper.GetBooleanValue(xlpf.InsertPageBreaks, false), + AllDrilled = OpenXmlHelper.GetBooleanValue(xlpf.Collapsed, false), + }; + if (!string.IsNullOrWhiteSpace(xlpf.SubtotalCaption)) + { + pf.SubtotalCaption = xlpf.SubtotalCaption; + } + + if (pt.ClassicPivotTableLayout) + { + pf.Outline = false; + pf.Compact = false; + } + else + { + pf.Outline = OpenXmlHelper.GetBooleanValue(xlpf.Outline, true); + pf.Compact = OpenXmlHelper.GetBooleanValue(xlpf.Compact, true); + } + + if (xlpf.SortType != XLPivotSortType.Default) + { + pf.SortType = new EnumValue((FieldSortValues)xlpf.SortType); + } + + switch (pt.Subtotals) + { + case XLPivotSubtotals.DoNotShow: + pf.DefaultSubtotal = false; + break; + + case XLPivotSubtotals.AtBottom: + pf.SubtotalTop = false; + break; + + case XLPivotSubtotals.AtTop: + // at top is by default + break; + } + + if (xlpf.SubtotalsAtTop.HasValue) + { + pf.SubtotalTop = OpenXmlHelper.GetBooleanValue(xlpf.SubtotalsAtTop.Value, true); + } + + if (pt.RowLabels.Contains(xlpf.SourceName)) + { + labelOrFilterField = pt.RowLabels.Get(xlpf.SourceName); + pf.Axis = PivotTableAxisValues.AxisRow; + } + else if (pt.ColumnLabels.Contains(xlpf.SourceName)) + { + labelOrFilterField = pt.ColumnLabels.Get(xlpf.SourceName); + pf.Axis = PivotTableAxisValues.AxisColumn; + } + else if (pt.ReportFilters.Contains(xlpf.SourceName)) + { + labelOrFilterField = pt.ReportFilters.Get(xlpf.SourceName); + var sortOrderIndex = pt.ReportFilters.IndexOf(labelOrFilterField); + + location.ColumnsPerPage = 1; + location.RowPageCount = 1; + pf.Axis = PivotTableAxisValues.AxisPage; + + var pageField = new PageField + { + Hierarchy = -1, + Field = pt.Fields.IndexOf(xlpf) + }; + + if (labelOrFilterField.SelectedValues.Count == 1) + { + if (ptfi.MixedDataType || ptfi.DataType == XLDataType.Text) + { + var values = ptfi.DistinctValues + .Select(v => v.ObjectToInvariantString().ToLower()) + .ToList(); + var selectedValue = labelOrFilterField.SelectedValues.Single().ObjectToInvariantString().ToLower(); + if (values.Contains(selectedValue)) + pageField.Item = Convert.ToUInt32(values.IndexOf(selectedValue)); + } + else if (ptfi.DataType == XLDataType.DateTime) + { + var values = ptfi.DistinctValues + .Select(v => Convert.ToDateTime(v)) + .ToList(); + var selectedValue = Convert.ToDateTime(labelOrFilterField.SelectedValues.Single()); + if (values.Contains(selectedValue)) + pageField.Item = Convert.ToUInt32(values.IndexOf(selectedValue)); + } + else if (ptfi.DataType == XLDataType.Number) + { + var values = ptfi.DistinctValues + .Select(v => Convert.ToDouble(v)) + .ToList(); + var selectedValue = Convert.ToDouble(labelOrFilterField.SelectedValues.Single()); + if (values.Contains(selectedValue)) + pageField.Item = Convert.ToUInt32(values.IndexOf(selectedValue)); + } + else if (ptfi.DataType == XLDataType.Boolean) + { + var values = ptfi.DistinctValues + .Select(v => Convert.ToBoolean(v)) + .ToList(); + var selectedValue = Convert.ToBoolean(labelOrFilterField.SelectedValues.Single()); + if (values.Contains(selectedValue)) + pageField.Item = Convert.ToUInt32(values.IndexOf(selectedValue)); + } + else if (ptfi.DataType == XLDataType.TimeSpan) + { + var values = ptfi.DistinctValues + .Cast() + .ToList(); + var selectedValue = (TimeSpan)labelOrFilterField.SelectedValues.Single(); + if (values.Contains(selectedValue)) + pageField.Item = Convert.ToUInt32(values.IndexOf(selectedValue)); + } + else + throw new NotImplementedException(); + } + + orderedPageFields.Add(sortOrderIndex, pageField); + } + + if ((labelOrFilterField?.SelectedValues?.Count ?? 0) > 1) + pf.MultipleItemSelectionAllowed = true; + + if (pt.Values.Any(p => p.SourceName == xlpf.SourceName)) + pf.DataField = true; + + var fieldItems = new Items(); + + // Output items only for row / column / filter fields + if (!ptfi.IsTotallyBlankField && + ptfi.DistinctValues.Any() + && (pt.RowLabels.Contains(xlpf.SourceName) + || pt.ColumnLabels.Contains(xlpf.SourceName) + || pt.ReportFilters.Contains(xlpf.SourceName))) + { + uint i = 0; + foreach (var value in ptfi.DistinctValues) + { + var item = new Item { Index = i }; + + if (labelOrFilterField != null && labelOrFilterField.Collapsed) + item.HideDetails = BooleanValue.FromBoolean(false); + + if (labelOrFilterField != null && + labelOrFilterField.SelectedValues.Count > 1 && + !labelOrFilterField.SelectedValues.Contains(value)) + item.Hidden = BooleanValue.FromBoolean(true); + + fieldItems.AppendChild(item); + + i++; + } + } + + if (xlpf.Subtotals.Any()) + { + foreach (var subtotal in xlpf.Subtotals) + { + var itemSubtotal = new Item(); + switch (subtotal) + { + case XLSubtotalFunction.Average: + pf.AverageSubTotal = true; + itemSubtotal.ItemType = ItemValues.Average; + break; + + case XLSubtotalFunction.Count: + pf.CountASubtotal = true; + itemSubtotal.ItemType = ItemValues.CountA; + break; + + case XLSubtotalFunction.CountNumbers: + pf.CountSubtotal = true; + itemSubtotal.ItemType = ItemValues.Count; + break; + + case XLSubtotalFunction.Maximum: + pf.MaxSubtotal = true; + itemSubtotal.ItemType = ItemValues.Maximum; + break; + + case XLSubtotalFunction.Minimum: + pf.MinSubtotal = true; + itemSubtotal.ItemType = ItemValues.Minimum; + break; + + case XLSubtotalFunction.PopulationStandardDeviation: + pf.ApplyStandardDeviationPInSubtotal = true; + itemSubtotal.ItemType = ItemValues.StandardDeviationP; + break; + + case XLSubtotalFunction.PopulationVariance: + pf.ApplyVariancePInSubtotal = true; + itemSubtotal.ItemType = ItemValues.VarianceP; + break; + + case XLSubtotalFunction.Product: + pf.ApplyProductInSubtotal = true; + itemSubtotal.ItemType = ItemValues.Product; + break; + + case XLSubtotalFunction.StandardDeviation: + pf.ApplyStandardDeviationInSubtotal = true; + itemSubtotal.ItemType = ItemValues.StandardDeviation; + break; + + case XLSubtotalFunction.Sum: + pf.SumSubtotal = true; + itemSubtotal.ItemType = ItemValues.Sum; + break; + + case XLSubtotalFunction.Variance: + pf.ApplyVarianceInSubtotal = true; + itemSubtotal.ItemType = ItemValues.Variance; + break; + } + fieldItems.AppendChild(itemSubtotal); + } + } + // If the field itself doesn't have subtotals, but the pivot table is set to show pivot tables, add the default item + else if (pt.Subtotals != XLPivotSubtotals.DoNotShow) + { + fieldItems.AppendChild(new Item { ItemType = ItemValues.Default }); + } + + if (fieldItems.Any()) + { + fieldItems.Count = Convert.ToUInt32(fieldItems.Count()); + pf.AppendChild(fieldItems); + } + + #region Excel 2010 Features + + if (xlpf.RepeatItemLabels) + { + var pivotFieldExtensionList = new PivotFieldExtensionList(); + pivotFieldExtensionList.RemoveNamespaceDeclaration("x"); + var pivotFieldExtension = new PivotFieldExtension { Uri = "{2946ED86-A175-432a-8AC1-64E0C546D7DE}" }; + pivotFieldExtension.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); + + var pivotField2 = new DocumentFormat.OpenXml.Office2010.Excel.PivotField { FillDownLabels = true }; + + pivotFieldExtension.AppendChild(pivotField2); + + pivotFieldExtensionList.AppendChild(pivotFieldExtension); + pf.AppendChild(pivotFieldExtensionList); + } + + #endregion Excel 2010 Features + + pivotFields.AppendChild(pf); + } + + pivotTableDefinition.AppendChild(location); + pivotTableDefinition.AppendChild(pivotFields); + + if (pt.RowLabels.Any()) + { + rowFields.Append(orderedRowLabels.Values); + rowFields.Count = Convert.ToUInt32(rowFields.Count()); + pivotTableDefinition.AppendChild(rowFields); + } + else + { + rowItems.AppendChild(new RowItem()); + } + + if (rowItems.Any()) + { + rowItems.Count = Convert.ToUInt32(rowItems.Count()); + pivotTableDefinition.AppendChild(rowItems); + } + + if (pt.ColumnLabels.All(cl => cl.CustomName == XLConstants.PivotTable.ValuesSentinalLabel)) + { + for (int i = 0; i < pt.Values.Count(); i++) + { + var rowItem = new RowItem(); + rowItem.Index = Convert.ToUInt32(i); + rowItem.AppendChild(new MemberPropertyIndex() { Val = i }); + columnItems.AppendChild(rowItem); + } + } + + if (pt.ColumnLabels.Any()) + { + columnFields.Append(orderedColumnLabels.Values); + columnFields.Count = Convert.ToUInt32(columnFields.Count()); + pivotTableDefinition.AppendChild(columnFields); + } + + if (columnItems.Any()) + { + columnItems.Count = Convert.ToUInt32(columnItems.Count()); + pivotTableDefinition.AppendChild(columnItems); + } + + if (pt.ReportFilters.Any()) + { + pageFields.Append(orderedPageFields.Values); + pageFields.Count = Convert.ToUInt32(pageFields.Count()); + pivotTableDefinition.AppendChild(pageFields); + } + + var dataFields = new DataFields(); + foreach (var value in pt.Values) + { + var sourceColumn = + pt.SourceRange.Columns().FirstOrDefault(c => c.Cell(1).Value.ObjectToInvariantString() == value.SourceName); + if (sourceColumn == null) continue; + + UInt32 numberFormatId = 0; + if (value.NumberFormat.NumberFormatId != -1 || context.SharedNumberFormats.ContainsKey(value.NumberFormat.NumberFormatId)) + numberFormatId = (UInt32)value.NumberFormat.NumberFormatId; + else if (context.SharedNumberFormats.Any(snf => snf.Value.NumberFormat.Format == value.NumberFormat.Format)) + numberFormatId = (UInt32)context.SharedNumberFormats.First(snf => snf.Value.NumberFormat.Format == value.NumberFormat.Format).Key; + + var df = new DataField + { + Name = value.CustomName, + Field = (UInt32)(sourceColumn.ColumnNumber() - pt.SourceRange.RangeAddress.FirstAddress.ColumnNumber), + Subtotal = value.SummaryFormula.ToOpenXml(), + ShowDataAs = value.Calculation.ToOpenXml(), + NumberFormatId = numberFormatId + }; + + if (!String.IsNullOrEmpty(value.BaseField)) + { + var baseField = pt.SourceRange.Columns().FirstOrDefault(c => c.Cell(1).Value.ObjectToInvariantString() == value.BaseField); + if (baseField != null) + { + df.BaseField = baseField.ColumnNumber() - pt.SourceRange.RangeAddress.FirstAddress.ColumnNumber; + + var items = baseField.CellsUsed() + .Select(c => c.Value) + .Skip(1) // Skip header column + .Distinct().ToList(); + + if (items.Any(i => i.Equals(value.BaseItem))) + df.BaseItem = Convert.ToUInt32(items.IndexOf(value.BaseItem)); + } + } + else + { + df.BaseField = 0; + } + + if (value.CalculationItem == XLPivotCalculationItem.Previous) + df.BaseItem = 1048828U; + else if (value.CalculationItem == XLPivotCalculationItem.Next) + df.BaseItem = 1048829U; + else if (df.BaseItem == null || !df.BaseItem.HasValue) + df.BaseItem = 0U; + + dataFields.AppendChild(df); + } + + if (dataFields.Any()) + { + dataFields.Count = Convert.ToUInt32(dataFields.Count()); + pivotTableDefinition.AppendChild(dataFields); + } + + var pts = new PivotTableStyle + { + ShowRowHeaders = pt.ShowRowHeaders, + ShowColumnHeaders = pt.ShowColumnHeaders, + ShowRowStripes = pt.ShowRowStripes, + ShowColumnStripes = pt.ShowColumnStripes + }; + + if (pt.Theme != XLPivotTableTheme.None) + pts.Name = Enum.GetName(typeof(XLPivotTableTheme), pt.Theme); + + pivotTableDefinition.AppendChild(pts); + + // Pivot formats + if (pivotTableDefinition.Formats == null) + pivotTableDefinition.Formats = new Formats(); + else + pivotTableDefinition.Formats.RemoveAllChildren(); + + foreach (var styleFormat in pt.StyleFormats.RowGrandTotalFormats) + GeneratePivotTableFormat(isRow: true, (XLPivotStyleFormat)styleFormat, pivotTableDefinition, context); + + foreach (var styleFormat in pt.StyleFormats.ColumnGrandTotalFormats) + GeneratePivotTableFormat(isRow: false, (XLPivotStyleFormat)styleFormat, pivotTableDefinition, context); + + foreach (var pivotField in pt.ImplementedFields) + { + GeneratePivotFieldFormat(XLPivotStyleFormatTarget.Header, pt, (XLPivotField)pivotField, (XLPivotStyleFormat)pivotField.StyleFormats.Header, pivotTableDefinition, context); + GeneratePivotFieldFormat(XLPivotStyleFormatTarget.Subtotal, pt, (XLPivotField)pivotField, (XLPivotStyleFormat)pivotField.StyleFormats.Subtotal, pivotTableDefinition, context); + GeneratePivotFieldFormat(XLPivotStyleFormatTarget.Label, pt, (XLPivotField)pivotField, (XLPivotStyleFormat)pivotField.StyleFormats.Label, pivotTableDefinition, context); + GeneratePivotFieldFormat(XLPivotStyleFormatTarget.Data, pt, (XLPivotField)pivotField, (XLPivotStyleFormat)pivotField.StyleFormats.DataValuesFormat, pivotTableDefinition, context); + } + + if (pivotTableDefinition.Formats.Any()) + { + pivotTableDefinition.Formats.Count = new UInt32Value((uint)pivotTableDefinition.Formats.Count()); + } + else + pivotTableDefinition.Formats = null; + + #region Excel 2010 Features + + var pivotTableDefinitionExtensionList = new PivotTableDefinitionExtensionList(); + + var pivotTableDefinitionExtension = new PivotTableDefinitionExtension { Uri = "{962EF5D1-5CA2-4c93-8EF4-DBF5C05439D2}" }; + pivotTableDefinitionExtension.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); + + var pivotTableDefinition2 = new DocumentFormat.OpenXml.Office2010.Excel.PivotTableDefinition + { + EnableEdit = pt.EnableCellEditing, + HideValuesRow = !pt.ShowValuesRow + }; + pivotTableDefinition2.AddNamespaceDeclaration("xm", "http://schemas.microsoft.com/office/excel/2006/main"); + + pivotTableDefinitionExtension.AppendChild(pivotTableDefinition2); + + pivotTableDefinitionExtensionList.AppendChild(pivotTableDefinitionExtension); + pivotTableDefinition.AppendChild(pivotTableDefinitionExtensionList); + + #endregion Excel 2010 Features + + pivotTablePart.PivotTableDefinition = pivotTableDefinition; + } + + private static void GeneratePivotTableFormat(Boolean isRow, XLPivotStyleFormat styleFormat, PivotTableDefinition pivotTableDefinition, SaveContext context) + { + if (DefaultStyle.Equals(styleFormat.Style) || !context.DifferentialFormats.ContainsKey(((XLStyle)styleFormat.Style).Value)) + return; + + var format = new Format(); + + format.FormatId = UInt32Value.FromUInt32(Convert.ToUInt32(context.DifferentialFormats[((XLStyle)styleFormat.Style).Value])); + + var pivotArea = GenerateDefaultPivotArea(XLPivotStyleFormatTarget.GrandTotal); + + pivotArea.LabelOnly = OpenXmlHelper.GetBooleanValue(styleFormat.AppliesTo == XLPivotStyleFormatElement.Label, false); + pivotArea.DataOnly = OpenXmlHelper.GetBooleanValue(styleFormat.AppliesTo == XLPivotStyleFormatElement.Data, true); + + pivotArea.GrandColumn = OpenXmlHelper.GetBooleanValue(!isRow, false); + pivotArea.GrandRow = OpenXmlHelper.GetBooleanValue(isRow, false); + pivotArea.Axis = isRow ? PivotTableAxisValues.AxisRow : PivotTableAxisValues.AxisColumn; + + format.PivotArea = pivotArea; + + pivotTableDefinition.Formats.AppendChild(format); + } + + private static void GeneratePivotFieldFormat(XLPivotStyleFormatTarget target, XLPivotTable pt, XLPivotField pivotField, XLPivotStyleFormat styleFormat, PivotTableDefinition pivotTableDefinition, SaveContext context) + { + if (target == XLPivotStyleFormatTarget.GrandTotal) + throw new ArgumentException($"Use {nameof(GeneratePivotTableFormat)} to populate grand total formats."); + + if (DefaultStyle.Equals(styleFormat.Style) || !context.DifferentialFormats.ContainsKey(((XLStyle)styleFormat.Style).Value)) + return; + + var format = new Format(); + + format.FormatId = UInt32Value.FromUInt32(Convert.ToUInt32(context.DifferentialFormats[((XLStyle)styleFormat.Style).Value])); + + var pivotArea = GenerateDefaultPivotArea(target); + + pivotArea.LabelOnly = OpenXmlHelper.GetBooleanValue(styleFormat.AppliesTo == XLPivotStyleFormatElement.Label, false); + pivotArea.DataOnly = OpenXmlHelper.GetBooleanValue(styleFormat.AppliesTo == XLPivotStyleFormatElement.Data, true); + + pivotArea.CollapsedLevelsAreSubtotals = OpenXmlHelper.GetBooleanValue(styleFormat.CollapsedLevelsAreSubtotals, false); + + if (target == XLPivotStyleFormatTarget.Header) + { + pivotArea.Field = pivotField.Offset; + + if (pivotField.IsOnRowAxis) + pivotArea.Axis = PivotTableAxisValues.AxisRow; + else if (pivotField.IsOnColumnAxis) + pivotArea.Axis = PivotTableAxisValues.AxisColumn; + else if (pivotField.IsInFilterList) + pivotArea.Axis = PivotTableAxisValues.AxisPage; + else + throw new NotImplementedException(); + } + + //Ensure referenced pivot field is added to field references + if (new[] + { + XLPivotStyleFormatTarget.Data, XLPivotStyleFormatTarget.Label, XLPivotStyleFormatTarget.Subtotal + }.Contains(target) + && !styleFormat.FieldReferences.OfType().Select(fr => fr.PivotField).Contains(pivotField)) + { + var fr = new PivotLabelFieldReference(pivotField); + fr.DefaultSubtotal = target == XLPivotStyleFormatTarget.Subtotal; + styleFormat.FieldReferences.Insert(0, fr); + } + + if (pivotArea.PivotAreaReferences == null) + pivotArea.PivotAreaReferences = new PivotAreaReferences(); + else + pivotArea.PivotAreaReferences.RemoveAllChildren(); + + foreach (var fr in styleFormat.FieldReferences) + { + GeneratePivotAreaReference(pt, pivotArea.PivotAreaReferences, fr, context); + } + + if (pivotArea.PivotAreaReferences.Any()) + { + pivotArea.PivotAreaReferences.Count = new UInt32Value((uint)pivotArea.PivotAreaReferences.Count()); + } + else + pivotArea.PivotAreaReferences = null; + + format.PivotArea = pivotArea; + pivotTableDefinition.Formats.AppendChild(format); + } + + private static PivotArea GenerateDefaultPivotArea(XLPivotStyleFormatTarget target) + { + switch (target) + { + case XLPivotStyleFormatTarget.Header: + return new PivotArea + { + Type = PivotAreaValues.Button, + FieldPosition = 0, + DataOnly = OpenXmlHelper.GetBooleanValue(false, true), + LabelOnly = OpenXmlHelper.GetBooleanValue(true, false), + Outline = OpenXmlHelper.GetBooleanValue(false, true), + }; + + case XLPivotStyleFormatTarget.Subtotal: + return new PivotArea + { + Type = PivotAreaValues.Normal, + FieldPosition = 0, + }; + + case XLPivotStyleFormatTarget.GrandTotal: + return new PivotArea + { + Type = PivotAreaValues.Normal, + FieldPosition = 0, + DataOnly = OpenXmlHelper.GetBooleanValue(false, true), + LabelOnly = OpenXmlHelper.GetBooleanValue(false, false), + }; + + case XLPivotStyleFormatTarget.Label: + return new PivotArea + { + Type = PivotAreaValues.Normal, + FieldPosition = 0, + DataOnly = OpenXmlHelper.GetBooleanValue(false, true), + LabelOnly = OpenXmlHelper.GetBooleanValue(true, false), + }; + + case XLPivotStyleFormatTarget.Data: + return new PivotArea + { + Type = PivotAreaValues.Normal, + FieldPosition = 0, + }; + + default: + throw new NotImplementedException(); + } + } + + private static void GeneratePivotAreaReference(XLPivotTable pt, PivotAreaReferences pivotAreaReferences, AbstractPivotFieldReference fieldReference, SaveContext context) + { + var pivotAreaReference = new PivotAreaReference(); + + pivotAreaReference.DefaultSubtotal = OpenXmlHelper.GetBooleanValue(fieldReference.DefaultSubtotal, false); + pivotAreaReference.Field = fieldReference.GetFieldOffset(); + + var matchedOffsets = fieldReference.Match(context.PivotTables[pt.Guid], pt); + foreach (var o in matchedOffsets) + { + pivotAreaReference.AppendChild(new FieldItem { Val = UInt32Value.FromUInt32((uint)o) }); + } + + pivotAreaReferences.AppendChild(pivotAreaReference); + } + + private static void GenerateWorksheetCommentsPartContent(WorksheetCommentsPart worksheetCommentsPart, + XLWorksheet xlWorksheet) + { + var commentList = new CommentList(); + var authorsDict = new Dictionary(); + foreach (var c in xlWorksheet.Internals.CellsCollection.GetCells(c => c.HasComment)) + { + var comment = new Comment { Reference = c.Address.ToStringRelative() }; + var authorName = c.Comment.Author; + + if (!authorsDict.TryGetValue(authorName, out int authorId)) + { + authorId = authorsDict.Count; + authorsDict.Add(authorName, authorId); + } + comment.AuthorId = (UInt32)authorId; + + var commentText = new CommentText(); + foreach (var rt in c.Comment) + { + commentText.Append(GetRun(rt)); + } + + comment.Append(commentText); + commentList.Append(comment); + } + + var authors = new Authors(); + foreach (var author in authorsDict.Select(a => new Author { Text = a.Key })) + { + authors.Append(author); + } + + worksheetCommentsPart.Comments.Append(authors); + worksheetCommentsPart.Comments.Append(commentList); + } + + // Generates content of vmlDrawingPart1. + private static bool GenerateVmlDrawingPartContent(VmlDrawingPart vmlDrawingPart, XLWorksheet xlWorksheet) + { + using (var ms = new MemoryStream()) + using (var stream = vmlDrawingPart.GetStream(FileMode.OpenOrCreate)) + { + CopyStream(stream, ms); + stream.Position = 0; + var writer = new XmlTextWriter(stream, Encoding.UTF8); + + writer.WriteStartElement("xml"); + + // https://docs.microsoft.com/en-us/dotnet/api/documentformat.openxml.vml.shapetype?view=openxml-2.8.1#remarks + // This element defines a shape template that can be used to create other shapes. + // Shapetype is identical to the shape element(§14.1.2.19) except it cannot reference another shapetype element. + // The type attribute shall not be used with shapetype. + // Attributes defined in the shape override any that appear in the shapetype positioning attributes + // (such as top, width, z-index, rotation, flip) are not passed to a shape from a shapetype. + // To use this element, create a shapetype with a specific id attribute. + // Then create a shape and reference the shapetype's id using the type attribute. + new Vml.Shapetype( + new Vml.Stroke { JoinStyle = Vml.StrokeJoinStyleValues.Miter }, + new Vml.Path { AllowGradientShape = true, ConnectionPointType = ConnectValues.Rectangle } + ) + { + Id = XLConstants.Comment.ShapeTypeId, + CoordinateSize = "21600,21600", + OptionalNumber = 202, + EdgePath = "m,l,21600r21600,l21600,xe", + } + .WriteTo(writer); + + var cellWithComments = xlWorksheet.Internals.CellsCollection.GetCells(c => c.HasComment); + + var hasAnyVmlElements = false; + + foreach (var c in cellWithComments) + { + GenerateCommentShape(c).WriteTo(writer); + hasAnyVmlElements |= true; + } + + if (ms.Length > 0) + { + ms.Position = 0; + var xdoc = XDocumentExtensions.Load(ms); + xdoc.Root.Elements().ForEach(e => writer.WriteRaw(e.ToString())); + hasAnyVmlElements |= xdoc.Root.HasElements; + } + + writer.WriteEndElement(); + writer.Flush(); + writer.Close(); + + return hasAnyVmlElements; + } + } + + // VML Shape for Comment + private static Vml.Shape GenerateCommentShape(XLCell c) + { + var rowNumber = c.Address.RowNumber; + var columnNumber = c.Address.ColumnNumber; + + var shapeId = String.Concat("_x0000_s", c.Comment.ShapeId); + // Unique per cell (workbook?), e.g.: "_x0000_s1026" + var anchor = GetAnchor(c); + var textBox = GetTextBox(c.Comment.Style); + var fill = new Vml.Fill { Color2 = "#" + c.Comment.Style.ColorsAndLines.FillColor.Color.ToHex().Substring(2) }; + if (c.Comment.Style.ColorsAndLines.FillTransparency < 1) + fill.Opacity = + Math.Round(Convert.ToDouble(c.Comment.Style.ColorsAndLines.FillTransparency), 2).ToInvariantString(); + var stroke = GetStroke(c); + var shape = new Vml.Shape( + fill, + stroke, + new Vml.Shadow { Color = "black", Obscured = true }, + new Vml.Path { ConnectionPointType = ConnectValues.None }, + textBox, + new ClientData( + new MoveWithCells(c.Comment.Style.Properties.Positioning == XLDrawingAnchor.Absolute + ? "True" + : "False"), // Counterintuitive + new ResizeWithCells(c.Comment.Style.Properties.Positioning == XLDrawingAnchor.MoveAndSizeWithCells + ? "False" + : "True"), // Counterintuitive + anchor, + new HorizontalTextAlignment(c.Comment.Style.Alignment.Horizontal.ToString().ToCamel()), + new Vml.Spreadsheet.VerticalTextAlignment(c.Comment.Style.Alignment.Vertical.ToString().ToCamel()), + new AutoFill("False"), + new CommentRowTarget { Text = (rowNumber - 1).ToInvariantString() }, + new CommentColumnTarget { Text = (columnNumber - 1).ToInvariantString() }, + new Locked(c.Comment.Style.Protection.Locked ? "True" : "False"), + new LockText(c.Comment.Style.Protection.LockText ? "True" : "False"), + new Visible(c.Comment.Visible ? "True" : "False") + ) + { ObjectType = ObjectValues.Note } + ) + { + Id = shapeId, + Type = "#" + XLConstants.Comment.ShapeTypeId, + Style = GetCommentStyle(c), + FillColor = "#" + c.Comment.Style.ColorsAndLines.FillColor.Color.ToHex().Substring(2), + StrokeColor = "#" + c.Comment.Style.ColorsAndLines.LineColor.Color.ToHex().Substring(2), + StrokeWeight = String.Concat(c.Comment.Style.ColorsAndLines.LineWeight.ToInvariantString(), "pt"), + InsetMode = c.Comment.Style.Margins.Automatic ? InsetMarginValues.Auto : InsetMarginValues.Custom + }; + if (!String.IsNullOrWhiteSpace(c.Comment.Style.Web.AlternateText)) + shape.Alternate = c.Comment.Style.Web.AlternateText; + + return shape; + } + + private static Vml.Stroke GetStroke(XLCell c) + { + var lineDash = c.Comment.Style.ColorsAndLines.LineDash; + var stroke = new Vml.Stroke + { + LineStyle = c.Comment.Style.ColorsAndLines.LineStyle.ToOpenXml(), + DashStyle = + lineDash == XLDashStyle.RoundDot || lineDash == XLDashStyle.SquareDot + ? "shortDot" + : lineDash.ToString().ToCamel() + }; + if (lineDash == XLDashStyle.RoundDot) + stroke.EndCap = Vml.StrokeEndCapValues.Round; + if (c.Comment.Style.ColorsAndLines.LineTransparency < 1) + stroke.Opacity = + Math.Round(Convert.ToDouble(c.Comment.Style.ColorsAndLines.LineTransparency), 2).ToInvariantString(); + return stroke; + } + + // http://polymathprogrammer.com/2009/10/22/english-metric-units-and-open-xml/ + // http://archive.oreilly.com/pub/post/what_is_an_emu.html + // https://en.wikipedia.org/wiki/Office_Open_XML_file_formats#DrawingML + private static Int64 ConvertToEnglishMetricUnits(Int32 pixels, Double resolution) + { + return Convert.ToInt64(914400L * pixels / resolution); + } + + private static void AddPictureAnchor(WorksheetPart worksheetPart, Drawings.IXLPicture picture, SaveContext context) + { + var pic = picture as Drawings.XLPicture; + var drawingsPart = worksheetPart.DrawingsPart ?? + worksheetPart.AddNewPart(context.RelIdGenerator.GetNext(RelType.Workbook)); + + if (drawingsPart.WorksheetDrawing == null) + drawingsPart.WorksheetDrawing = new Xdr.WorksheetDrawing(); + + var worksheetDrawing = drawingsPart.WorksheetDrawing; + + // Add namespaces + if (!worksheetDrawing.NamespaceDeclarations.Any(nd => nd.Value.Equals("http://schemas.openxmlformats.org/drawingml/2006/main"))) + worksheetDrawing.AddNamespaceDeclaration("a", "http://schemas.openxmlformats.org/drawingml/2006/main"); + + if (!worksheetDrawing.NamespaceDeclarations.Any(nd => nd.Value.Equals("http://schemas.openxmlformats.org/officeDocument/2006/relationships"))) + worksheetDrawing.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + ///////// + + // Overwrite actual image binary data + ImagePart imagePart; + if (drawingsPart.HasPartWithId(pic.RelId)) + imagePart = drawingsPart.GetPartById(pic.RelId) as ImagePart; + else + { + pic.RelId = context.RelIdGenerator.GetNext(RelType.Workbook); + imagePart = drawingsPart.AddImagePart(pic.Format.ToOpenXml(), pic.RelId); + } + + using (var stream = new MemoryStream()) + { + pic.ImageStream.Position = 0; + pic.ImageStream.CopyTo(stream); + stream.Seek(0, SeekOrigin.Begin); + imagePart.FeedData(stream); + } + ///////// + + // Clear current anchors + var existingAnchor = GetAnchorFromImageId(worksheetPart, pic.RelId); + if (existingAnchor != null) + worksheetDrawing.RemoveChild(existingAnchor); + + var extentsCx = ConvertToEnglishMetricUnits(pic.Width, GraphicsUtils.Graphics.DpiX); + var extentsCy = ConvertToEnglishMetricUnits(pic.Height, GraphicsUtils.Graphics.DpiY); + + var nvps = worksheetDrawing.Descendants(); + var nvpId = nvps.Any() ? + (UInt32Value)worksheetDrawing.Descendants().Max(p => p.Id.Value) + 1 : + 1U; + + Xdr.FromMarker fMark; + Xdr.ToMarker tMark; + switch (pic.Placement) + { + case Drawings.XLPicturePlacement.FreeFloating: + var absoluteAnchor = new Xdr.AbsoluteAnchor( + new Xdr.Position + { + X = ConvertToEnglishMetricUnits(pic.Left, GraphicsUtils.Graphics.DpiX), + Y = ConvertToEnglishMetricUnits(pic.Top, GraphicsUtils.Graphics.DpiY) + }, + new Xdr.Extent + { + Cx = extentsCx, + Cy = extentsCy + }, + new Xdr.Picture( + new Xdr.NonVisualPictureProperties( + new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = pic.Name }, + new Xdr.NonVisualPictureDrawingProperties(new PictureLocks { NoChangeAspect = true }) + ), + new Xdr.BlipFill( + new Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = BlipCompressionValues.Print }, + new Stretch(new FillRectangle()) + ), + new Xdr.ShapeProperties( + new Transform2D( + new Offset { X = 0, Y = 0 }, + new Extents { Cx = extentsCx, Cy = extentsCy } + ), + new PresetGeometry { Preset = ShapeTypeValues.Rectangle } + ) + ), + new Xdr.ClientData() + ); + + worksheetDrawing.Append(absoluteAnchor); + break; + + case Drawings.XLPicturePlacement.MoveAndSize: + var moveAndSizeFromMarker = pic.Markers[Drawings.XLMarkerPosition.TopLeft]; + if (moveAndSizeFromMarker == null) moveAndSizeFromMarker = new Drawings.XLMarker(picture.Worksheet.Cell("A1")); + fMark = new Xdr.FromMarker + { + ColumnId = new Xdr.ColumnId((moveAndSizeFromMarker.ColumnNumber - 1).ToInvariantString()), + RowId = new Xdr.RowId((moveAndSizeFromMarker.RowNumber - 1).ToInvariantString()), + ColumnOffset = new Xdr.ColumnOffset(ConvertToEnglishMetricUnits(moveAndSizeFromMarker.Offset.X, GraphicsUtils.Graphics.DpiX).ToInvariantString()), + RowOffset = new Xdr.RowOffset(ConvertToEnglishMetricUnits(moveAndSizeFromMarker.Offset.Y, GraphicsUtils.Graphics.DpiY).ToInvariantString()) + }; + + var moveAndSizeToMarker = pic.Markers[Drawings.XLMarkerPosition.BottomRight]; + if (moveAndSizeToMarker == null) moveAndSizeToMarker = new Drawings.XLMarker(picture.Worksheet.Cell("A1"), new System.Drawing.Point(picture.Width, picture.Height)); + tMark = new Xdr.ToMarker + { + ColumnId = new Xdr.ColumnId((moveAndSizeToMarker.ColumnNumber - 1).ToInvariantString()), + RowId = new Xdr.RowId((moveAndSizeToMarker.RowNumber - 1).ToInvariantString()), + ColumnOffset = new Xdr.ColumnOffset(ConvertToEnglishMetricUnits(moveAndSizeToMarker.Offset.X, GraphicsUtils.Graphics.DpiX).ToInvariantString()), + RowOffset = new Xdr.RowOffset(ConvertToEnglishMetricUnits(moveAndSizeToMarker.Offset.Y, GraphicsUtils.Graphics.DpiY).ToInvariantString()) + }; + + var twoCellAnchor = new Xdr.TwoCellAnchor( + fMark, + tMark, + new Xdr.Picture( + new Xdr.NonVisualPictureProperties( + new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = pic.Name }, + new Xdr.NonVisualPictureDrawingProperties(new PictureLocks { NoChangeAspect = true }) + ), + new Xdr.BlipFill( + new Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = BlipCompressionValues.Print }, + new Stretch(new FillRectangle()) + ), + new Xdr.ShapeProperties( + new Transform2D( + new Offset { X = 0, Y = 0 }, + new Extents { Cx = extentsCx, Cy = extentsCy } + ), + new PresetGeometry { Preset = ShapeTypeValues.Rectangle } + ) + ), + new Xdr.ClientData() + ); + + worksheetDrawing.Append(twoCellAnchor); + break; + + case Drawings.XLPicturePlacement.Move: + var moveFromMarker = pic.Markers[Drawings.XLMarkerPosition.TopLeft]; + if (moveFromMarker == null) moveFromMarker = new Drawings.XLMarker(picture.Worksheet.Cell("A1")); + fMark = new Xdr.FromMarker + { + ColumnId = new Xdr.ColumnId((moveFromMarker.ColumnNumber - 1).ToInvariantString()), + RowId = new Xdr.RowId((moveFromMarker.RowNumber - 1).ToInvariantString()), + ColumnOffset = new Xdr.ColumnOffset(ConvertToEnglishMetricUnits(moveFromMarker.Offset.X, GraphicsUtils.Graphics.DpiX).ToInvariantString()), + RowOffset = new Xdr.RowOffset(ConvertToEnglishMetricUnits(moveFromMarker.Offset.Y, GraphicsUtils.Graphics.DpiY).ToInvariantString()) + }; + + var oneCellAnchor = new Xdr.OneCellAnchor( + fMark, + new Xdr.Extent + { + Cx = extentsCx, + Cy = extentsCy + }, + new Xdr.Picture( + new Xdr.NonVisualPictureProperties( + new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = pic.Name }, + new Xdr.NonVisualPictureDrawingProperties(new PictureLocks { NoChangeAspect = true }) + ), + new Xdr.BlipFill( + new Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = BlipCompressionValues.Print }, + new Stretch(new FillRectangle()) + ), + new Xdr.ShapeProperties( + new Transform2D( + new Offset { X = 0, Y = 0 }, + new Extents { Cx = extentsCx, Cy = extentsCy } + ), + new PresetGeometry { Preset = ShapeTypeValues.Rectangle } + ) + ), + new Xdr.ClientData() + ); + + worksheetDrawing.Append(oneCellAnchor); + break; + } + } + + private static void RebaseNonVisualDrawingPropertiesIds(WorksheetPart worksheetPart) + { + var worksheetDrawing = worksheetPart.DrawingsPart.WorksheetDrawing; + + var toRebase = worksheetDrawing.Descendants() + .ToList(); + + toRebase.ForEach(nvdpr => nvdpr.Id = Convert.ToUInt32(toRebase.IndexOf(nvdpr) + 1)); + } + + private static Vml.TextBox GetTextBox(IXLDrawingStyle ds) + { + var sb = new StringBuilder(); + var a = ds.Alignment; + + if (a.Direction == XLDrawingTextDirection.Context) + sb.Append("mso-direction-alt:auto;"); + else if (a.Direction == XLDrawingTextDirection.RightToLeft) + sb.Append("direction:RTL;"); + + if (a.Orientation != XLDrawingTextOrientation.LeftToRight) + { + sb.Append("layout-flow:vertical;"); + if (a.Orientation == XLDrawingTextOrientation.BottomToTop) + sb.Append("mso-layout-flow-alt:bottom-to-top;"); + else if (a.Orientation == XLDrawingTextOrientation.Vertical) + sb.Append("mso-layout-flow-alt:top-to-bottom;"); + } + if (a.AutomaticSize) + sb.Append("mso-fit-shape-to-text:t;"); + + var tb = new Vml.TextBox(); + + if (sb.Length > 0) + tb.Style = sb.ToString(); + + var dm = ds.Margins; + if (!dm.Automatic) + tb.Inset = String.Concat( + dm.Left.ToInvariantString(), "in,", + dm.Top.ToInvariantString(), "in,", + dm.Right.ToInvariantString(), "in,", + dm.Bottom.ToInvariantString(), "in"); + + return tb; + } + + private static Anchor GetAnchor(XLCell cell) + { + var c = cell.Comment; + var cWidth = c.Style.Size.Width; + var fcNumber = c.Position.Column - 1; + var fcOffset = Convert.ToInt32(c.Position.ColumnOffset * 7.5); + var widthFromColumns = cell.Worksheet.Column(c.Position.Column).Width - c.Position.ColumnOffset; + var lastCell = cell.CellRight(c.Position.Column - cell.Address.ColumnNumber); + while (widthFromColumns <= cWidth) + { + lastCell = lastCell.CellRight(); + widthFromColumns += lastCell.WorksheetColumn().Width; + } + + var lcNumber = lastCell.WorksheetColumn().ColumnNumber() - 1; + var lcOffset = Convert.ToInt32((lastCell.WorksheetColumn().Width - (widthFromColumns - cWidth)) * 7.5); + + var cHeight = c.Style.Size.Height; //c.Style.Size.Height * 72.0; + var frNumber = c.Position.Row - 1; + var frOffset = Convert.ToInt32(c.Position.RowOffset); + var heightFromRows = cell.Worksheet.Row(c.Position.Row).Height - c.Position.RowOffset; + lastCell = cell.CellBelow(c.Position.Row - cell.Address.RowNumber); + while (heightFromRows <= cHeight) + { + lastCell = lastCell.CellBelow(); + heightFromRows += lastCell.WorksheetRow().Height; + } + + var lrNumber = lastCell.WorksheetRow().RowNumber() - 1; + var lrOffset = Convert.ToInt32(lastCell.WorksheetRow().Height - (heightFromRows - cHeight)); + return new Anchor + { + Text = string.Concat( + fcNumber, ", ", fcOffset, ", ", + frNumber, ", ", frOffset, ", ", + lcNumber, ", ", lcOffset, ", ", + lrNumber, ", ", lrOffset + ) + }; + } + + private static StringValue GetCommentStyle(XLCell cell) + { + var c = cell.Comment; + var sb = new StringBuilder("position:absolute; "); + + sb.Append("visibility:"); + sb.Append(c.Visible ? "visible" : "hidden"); + sb.Append(";"); + + sb.Append("width:"); + sb.Append(Math.Round(c.Style.Size.Width * 7.5, 2).ToInvariantString()); + sb.Append("pt;"); + sb.Append("height:"); + sb.Append(Math.Round(c.Style.Size.Height, 2).ToInvariantString()); + sb.Append("pt;"); + + sb.Append("z-index:"); + sb.Append(c.ZOrder.ToInvariantString()); + + return sb.ToString(); + } + + #region GenerateWorkbookStylesPartContent + + private void GenerateWorkbookStylesPartContent(WorkbookStylesPart workbookStylesPart, SaveContext context) + { + var defaultStyle = DefaultStyleValue; + + if (!context.SharedFonts.ContainsKey(defaultStyle.Font)) + context.SharedFonts.Add(defaultStyle.Font, new FontInfo { FontId = 0, Font = defaultStyle.Font }); + + if (workbookStylesPart.Stylesheet == null) + workbookStylesPart.Stylesheet = new Stylesheet(); + + // Cell styles = Named styles + if (workbookStylesPart.Stylesheet.CellStyles == null) + workbookStylesPart.Stylesheet.CellStyles = new CellStyles(); + + // To determine the default workbook style, we look for the style with builtInId = 0 (I hope that is the correct approach) + UInt32 defaultFormatId; + if (workbookStylesPart.Stylesheet.CellStyles.Elements().Any(c => c.BuiltinId != null && c.BuiltinId.HasValue && c.BuiltinId.Value == 0)) + { + // Possible to have duplicate default cell styles - occurs when file gets saved under different cultures. + // We prefer the style that is named Normal + var normalCellStyles = workbookStylesPart.Stylesheet.CellStyles.Elements() + .Where(c => c.BuiltinId != null && c.BuiltinId.HasValue && c.BuiltinId.Value == 0) + .OrderBy(c => c.Name != null && c.Name.HasValue && c.Name.Value == "Normal"); + + defaultFormatId = normalCellStyles.Last().FormatId.Value; + } + else if (workbookStylesPart.Stylesheet.CellStyles.Elements().Any()) + defaultFormatId = workbookStylesPart.Stylesheet.CellStyles.Elements().Max(c => c.FormatId.Value) + 1; + else + defaultFormatId = 0; + + context.SharedStyles.Add(defaultStyle, + new StyleInfo + { + StyleId = defaultFormatId, + Style = defaultStyle, + FontId = 0, + FillId = 0, + BorderId = 0, + IncludeQuotePrefix = false, + NumberFormatId = 0 + //AlignmentId = 0 + }); + + UInt32 styleCount = 1; + UInt32 fontCount = 1; + UInt32 fillCount = 3; + UInt32 borderCount = 1; + var numberFormatCount = 0; // 0-based + var pivotTableNumberFormats = new HashSet(); + var xlStyles = new HashSet(); + + foreach (var worksheet in WorksheetsInternal) + { + xlStyles.Add(worksheet.StyleValue); + foreach (var s in worksheet.Internals.ColumnsCollection.Select(c => c.Value.StyleValue)) + { + xlStyles.Add(s); + } + foreach (var s in worksheet.Internals.RowsCollection.Select(r => r.Value.StyleValue)) + { + xlStyles.Add(s); + } + + foreach (var s in worksheet.Internals.CellsCollection.GetCells().Select(c => c.StyleValue)) + { + xlStyles.Add(s); + } + + foreach (var ptnf in worksheet.PivotTables.SelectMany(pt => pt.Values.Select(ptv => ptv.NumberFormat)).Distinct().Where(nf => !pivotTableNumberFormats.Contains(nf))) + pivotTableNumberFormats.Add(ptnf); + } + + var alignments = xlStyles.Select(s => s.Alignment).Distinct().ToList(); + var borders = xlStyles.Select(s => s.Border).Distinct().ToList(); + var fonts = xlStyles.Select(s => s.Font).Distinct().ToList(); + var fills = xlStyles.Select(s => s.Fill).Distinct().ToList(); + var numberFormats = xlStyles.Select(s => s.NumberFormat).Distinct().ToList(); + var protections = xlStyles.Select(s => s.Protection).Distinct().ToList(); + + for (int i = 0; i < fonts.Count; i++) + { + if (!context.SharedFonts.ContainsKey(fonts[i])) + { + context.SharedFonts.Add(fonts[i], new FontInfo { FontId = (uint)fontCount++, Font = fonts[i] }); + } + } + + var sharedFills = fills.ToDictionary( + f => f, f => new FillInfo { FillId = fillCount++, Fill = f }); + + var sharedBorders = borders.ToDictionary( + b => b, b => new BorderInfo { BorderId = borderCount++, Border = b }); + + var sharedNumberFormats = numberFormats + .Where(nf => nf.NumberFormatId == -1) + .ToDictionary(nf => nf, nf => new NumberFormatInfo + { + NumberFormatId = XLConstants.NumberOfBuiltInStyles + numberFormatCount++, + NumberFormat = nf + }); + + foreach (var pivotNumberFormat in pivotTableNumberFormats.Where(nf => nf.NumberFormatId == -1)) + { + var numberFormatKey = new XLNumberFormatKey + { + NumberFormatId = -1, + Format = pivotNumberFormat.Format + }; + var numberFormat = XLNumberFormatValue.FromKey(ref numberFormatKey); + + if (sharedNumberFormats.ContainsKey(numberFormat)) + continue; + + sharedNumberFormats.Add(numberFormat, + new NumberFormatInfo + { + NumberFormatId = XLConstants.NumberOfBuiltInStyles + numberFormatCount++, + NumberFormat = numberFormat + }); + } + + var allSharedNumberFormats = ResolveNumberFormats(workbookStylesPart, sharedNumberFormats, defaultFormatId); + foreach (var nf in allSharedNumberFormats) + { + context.SharedNumberFormats.Add(nf.Value.NumberFormatId, nf.Value); + } + + ResolveFonts(workbookStylesPart, context); + var allSharedFills = ResolveFills(workbookStylesPart, sharedFills); + var allSharedBorders = ResolveBorders(workbookStylesPart, sharedBorders); + + foreach (var xlStyle in xlStyles) + { + var numberFormatId = xlStyle.NumberFormat.NumberFormatId >= 0 + ? xlStyle.NumberFormat.NumberFormatId + : allSharedNumberFormats[xlStyle.NumberFormat].NumberFormatId; + + if (!context.SharedStyles.ContainsKey(xlStyle)) + context.SharedStyles.Add(xlStyle, + new StyleInfo + { + StyleId = styleCount++, + Style = xlStyle, + FontId = context.SharedFonts[xlStyle.Font].FontId, + FillId = allSharedFills[xlStyle.Fill].FillId, + BorderId = allSharedBorders[xlStyle.Border].BorderId, + NumberFormatId = numberFormatId, + IncludeQuotePrefix = xlStyle.IncludeQuotePrefix + }); + } + + ResolveCellStyleFormats(workbookStylesPart, context); + ResolveRest(workbookStylesPart, context); + + if (!workbookStylesPart.Stylesheet.CellStyles.Elements().Any(c => c.BuiltinId != null && c.BuiltinId.HasValue && c.BuiltinId.Value == 0U)) + workbookStylesPart.Stylesheet.CellStyles.AppendChild(new CellStyle { Name = "Normal", FormatId = defaultFormatId, BuiltinId = 0U }); + + workbookStylesPart.Stylesheet.CellStyles.Count = (UInt32)workbookStylesPart.Stylesheet.CellStyles.Count(); + + var newSharedStyles = new Dictionary(); + foreach (var ss in context.SharedStyles) + { + var styleId = -1; + foreach (CellFormat f in workbookStylesPart.Stylesheet.CellFormats) + { + styleId++; + if (CellFormatsAreEqual(f, ss.Value, compareAlignment: true)) + break; + } + if (styleId == -1) + styleId = 0; + var si = ss.Value; + si.StyleId = (UInt32)styleId; + newSharedStyles.Add(ss.Key, si); + } + context.SharedStyles.Clear(); + newSharedStyles.ForEach(kp => context.SharedStyles.Add(kp.Key, kp.Value)); + + AddDifferentialFormats(workbookStylesPart, context); + } + + /// + /// Populates the differential formats that are currently in the file to the SaveContext + /// + /// The workbook styles part. + /// The context. + private void AddDifferentialFormats(WorkbookStylesPart workbookStylesPart, SaveContext context) + { + if (workbookStylesPart.Stylesheet.DifferentialFormats == null) + workbookStylesPart.Stylesheet.DifferentialFormats = new DifferentialFormats(); + + var differentialFormats = workbookStylesPart.Stylesheet.DifferentialFormats; + differentialFormats.RemoveAllChildren(); + FillDifferentialFormatsCollection(differentialFormats, context.DifferentialFormats); + + foreach (var ws in Worksheets) + { + foreach (var cf in ws.ConditionalFormats) + { + var styleValue = (cf.Style as XLStyle).Value; + if (!styleValue.Equals(DefaultStyleValue) && !context.DifferentialFormats.ContainsKey(styleValue)) + AddConditionalDifferentialFormat(workbookStylesPart.Stylesheet.DifferentialFormats, cf, context); + } + + foreach (var tf in ws.Tables.SelectMany(t => t.Fields)) + { + if (tf.IsConsistentStyle()) + { + var style = (tf.Column.Cells() + .Skip(tf.Table.ShowHeaderRow ? 1 : 0) + .First() + .Style as XLStyle).Value; + + if (!style.Equals(DefaultStyleValue) && !context.DifferentialFormats.ContainsKey(style)) + AddStyleAsDifferentialFormat(workbookStylesPart.Stylesheet.DifferentialFormats, style, context); + } + } + + foreach (var pt in ws.PivotTables.Cast()) + { + foreach (var styleFormat in pt.AllStyleFormats) + { + var xlStyle = (XLStyle)styleFormat.Style; + if (!xlStyle.Value.Equals(DefaultStyleValue) && !context.DifferentialFormats.ContainsKey(xlStyle.Value)) + AddStyleAsDifferentialFormat(workbookStylesPart.Stylesheet.DifferentialFormats, xlStyle.Value, context); + } + } + } + + differentialFormats.Count = (UInt32)differentialFormats.Count(); + if (differentialFormats.Count == 0) + workbookStylesPart.Stylesheet.DifferentialFormats = null; + } + + private void FillDifferentialFormatsCollection(DifferentialFormats differentialFormats, + Dictionary dictionary) + { + dictionary.Clear(); + var id = 0; + + foreach (var df in differentialFormats.Elements()) + { + var emptyContainer = new XLStylizedEmpty(DefaultStyle); + + var style = new XLStyle(emptyContainer, DefaultStyle); + LoadFont(df.Font, emptyContainer.Style.Font); + LoadBorder(df.Border, emptyContainer.Style.Border); + LoadNumberFormat(df.NumberingFormat, emptyContainer.Style.NumberFormat); + LoadFill(df.Fill, emptyContainer.Style.Fill, differentialFillFormat: true); + + if (!dictionary.ContainsKey(emptyContainer.StyleValue)) + dictionary.Add(emptyContainer.StyleValue, id++); + } + } + + private static void AddConditionalDifferentialFormat(DifferentialFormats differentialFormats, IXLConditionalFormat cf, + SaveContext context) + { + var differentialFormat = new DifferentialFormat(); + var styleValue = (cf.Style as XLStyle).Value; + + var diffFont = GetNewFont(new FontInfo { Font = styleValue.Font }, false); + if (diffFont?.HasChildren ?? false) + differentialFormat.Append(diffFont); + + if (!String.IsNullOrWhiteSpace(cf.Style.NumberFormat.Format)) + { + var numberFormat = new NumberingFormat + { + NumberFormatId = (UInt32)(XLConstants.NumberOfBuiltInStyles + differentialFormats.Count()), + FormatCode = cf.Style.NumberFormat.Format + }; + differentialFormat.Append(numberFormat); + } + + var diffFill = GetNewFill(new FillInfo { Fill = styleValue.Fill }, differentialFillFormat: true, ignoreMod: false); + if (diffFill?.HasChildren ?? false) + differentialFormat.Append(diffFill); + + var diffBorder = GetNewBorder(new BorderInfo { Border = styleValue.Border }, false); + if (diffBorder?.HasChildren ?? false) + differentialFormat.Append(diffBorder); + + differentialFormats.Append(differentialFormat); + + context.DifferentialFormats.Add(styleValue, differentialFormats.Count() - 1); + } + + private static void AddStyleAsDifferentialFormat(DifferentialFormats differentialFormats, XLStyleValue style, + SaveContext context) + { + var differentialFormat = new DifferentialFormat(); + + var diffFont = GetNewFont(new FontInfo { Font = style.Font }, false); + if (diffFont?.HasChildren ?? false) + differentialFormat.Append(diffFont); + + if (!String.IsNullOrWhiteSpace(style.NumberFormat.Format) || style.NumberFormat.NumberFormatId != 0) + { + var numberFormat = new NumberingFormat(); + + if (style.NumberFormat.NumberFormatId == -1) + { + numberFormat.FormatCode = style.NumberFormat.Format; + numberFormat.NumberFormatId = (UInt32)(XLConstants.NumberOfBuiltInStyles + + differentialFormats + .Descendants() + .Count(df => df.NumberingFormat != null && df.NumberingFormat.NumberFormatId != null && df.NumberingFormat.NumberFormatId.Value >= XLConstants.NumberOfBuiltInStyles)); + } + else + { + numberFormat.NumberFormatId = (UInt32)(style.NumberFormat.NumberFormatId); + if (!string.IsNullOrEmpty(style.NumberFormat.Format)) + numberFormat.FormatCode = style.NumberFormat.Format; + else if (XLPredefinedFormat.FormatCodes.TryGetValue(style.NumberFormat.NumberFormatId, out string formatCode)) + numberFormat.FormatCode = formatCode; + } + + differentialFormat.Append(numberFormat); + } + + var diffFill = GetNewFill(new FillInfo { Fill = style.Fill }, differentialFillFormat: true, ignoreMod: false); + if (diffFill?.HasChildren ?? false) + differentialFormat.Append(diffFill); + + var diffBorder = GetNewBorder(new BorderInfo { Border = style.Border }, false); + if (diffBorder?.HasChildren ?? false) + differentialFormat.Append(diffBorder); + + differentialFormats.Append(differentialFormat); + + context.DifferentialFormats.Add(style, differentialFormats.Count() - 1); + } + + private static void ResolveRest(WorkbookStylesPart workbookStylesPart, SaveContext context) + { + if (workbookStylesPart.Stylesheet.CellFormats == null) + workbookStylesPart.Stylesheet.CellFormats = new CellFormats(); + + foreach (var styleInfo in context.SharedStyles.Values) + { + var info = styleInfo; + var foundOne = + workbookStylesPart.Stylesheet.CellFormats.Cast().Any(f => CellFormatsAreEqual(f, info, compareAlignment: true)); + + if (foundOne) continue; + + var cellFormat = GetCellFormat(styleInfo); + cellFormat.FormatId = 0; + var alignment = new Alignment + { + Horizontal = styleInfo.Style.Alignment.Horizontal.ToOpenXml(), + Vertical = styleInfo.Style.Alignment.Vertical.ToOpenXml(), + Indent = (UInt32)styleInfo.Style.Alignment.Indent, + ReadingOrder = (UInt32)styleInfo.Style.Alignment.ReadingOrder, + WrapText = styleInfo.Style.Alignment.WrapText, + TextRotation = (UInt32)styleInfo.Style.Alignment.TextRotation, + ShrinkToFit = styleInfo.Style.Alignment.ShrinkToFit, + RelativeIndent = styleInfo.Style.Alignment.RelativeIndent, + JustifyLastLine = styleInfo.Style.Alignment.JustifyLastLine + }; + cellFormat.AppendChild(alignment); + + if (cellFormat.ApplyProtection.Value) + cellFormat.AppendChild(GetProtection(styleInfo)); + + workbookStylesPart.Stylesheet.CellFormats.AppendChild(cellFormat); + } + workbookStylesPart.Stylesheet.CellFormats.Count = (UInt32)workbookStylesPart.Stylesheet.CellFormats.Count(); + } + + private static void ResolveCellStyleFormats(WorkbookStylesPart workbookStylesPart, + SaveContext context) + { + if (workbookStylesPart.Stylesheet.CellStyleFormats == null) + workbookStylesPart.Stylesheet.CellStyleFormats = new CellStyleFormats(); + + foreach (var styleInfo in context.SharedStyles.Values) + { + var info = styleInfo; + var foundOne = + workbookStylesPart.Stylesheet.CellStyleFormats.Cast().Any( + f => CellFormatsAreEqual(f, info, compareAlignment: false)); + + if (foundOne) continue; + + var cellStyleFormat = GetCellFormat(styleInfo); + + if (cellStyleFormat.ApplyProtection.Value) + cellStyleFormat.AppendChild(GetProtection(styleInfo)); + + workbookStylesPart.Stylesheet.CellStyleFormats.AppendChild(cellStyleFormat); + } + workbookStylesPart.Stylesheet.CellStyleFormats.Count = + (UInt32)workbookStylesPart.Stylesheet.CellStyleFormats.Count(); + } + + private static bool ApplyFill(StyleInfo styleInfo) + { + return styleInfo.Style.Fill.PatternType.ToOpenXml() == PatternValues.None; + } + + private static bool ApplyBorder(StyleInfo styleInfo) + { + var opBorder = styleInfo.Style.Border; + return (opBorder.BottomBorder.ToOpenXml() != BorderStyleValues.None + || opBorder.DiagonalBorder.ToOpenXml() != BorderStyleValues.None + || opBorder.RightBorder.ToOpenXml() != BorderStyleValues.None + || opBorder.LeftBorder.ToOpenXml() != BorderStyleValues.None + || opBorder.TopBorder.ToOpenXml() != BorderStyleValues.None); + } + + private static bool ApplyProtection(StyleInfo styleInfo) + { + return styleInfo.Style.Protection != null; + } + + private static CellFormat GetCellFormat(StyleInfo styleInfo) + { + var cellFormat = new CellFormat + { + NumberFormatId = (UInt32)styleInfo.NumberFormatId, + FontId = styleInfo.FontId, + FillId = styleInfo.FillId, + BorderId = styleInfo.BorderId, + QuotePrefix = OpenXmlHelper.GetBooleanValue(styleInfo.IncludeQuotePrefix, false), + ApplyNumberFormat = true, + ApplyAlignment = true, + ApplyFill = ApplyFill(styleInfo), + ApplyBorder = ApplyBorder(styleInfo), + ApplyProtection = ApplyProtection(styleInfo) + }; + return cellFormat; + } + + private static Protection GetProtection(StyleInfo styleInfo) + { + return new Protection + { + Locked = styleInfo.Style.Protection.Locked, + Hidden = styleInfo.Style.Protection.Hidden + }; + } + + /// + /// Check if two style are equivalent. + /// + /// Style in the OpenXML format. + /// Style in the ClosedXML format. + /// Flag specifying whether or not compare the alignments of two styles. + /// Styles in x:cellStyleXfs section do not include alignment so we don't have to compare it in this case. + /// Styles in x:cellXfs section, on the opposite, do include alignments, and we must compare them. + /// + /// True if two formats are equivalent, false otherwise. + private static bool CellFormatsAreEqual(CellFormat f, StyleInfo styleInfo, bool compareAlignment) + { + return + f.BorderId != null && styleInfo.BorderId == f.BorderId + && f.FillId != null && styleInfo.FillId == f.FillId + && f.FontId != null && styleInfo.FontId == f.FontId + && f.NumberFormatId != null && styleInfo.NumberFormatId == f.NumberFormatId + && QuotePrefixesAreEqual(f.QuotePrefix, styleInfo.IncludeQuotePrefix) + && (f.ApplyFill == null && styleInfo.Style.Fill == XLFillValue.Default || + f.ApplyFill != null && f.ApplyFill == ApplyFill(styleInfo)) + && (f.ApplyBorder == null && styleInfo.Style.Border == XLBorderValue.Default || + f.ApplyBorder != null && f.ApplyBorder == ApplyBorder(styleInfo)) + && (!compareAlignment || AlignmentsAreEqual(f.Alignment, styleInfo.Style.Alignment)) + && ProtectionsAreEqual(f.Protection, styleInfo.Style.Protection) + ; + } + + private static bool ProtectionsAreEqual(Protection protection, XLProtectionValue xlProtection) + { + var p = XLProtectionValue.Default.Key; + if (protection != null) + { + if (protection.Locked != null) + p.Locked = protection.Locked.Value; + if (protection.Hidden != null) + p.Hidden = protection.Hidden.Value; + } + return p.Equals(xlProtection.Key); + } + + private static bool QuotePrefixesAreEqual(BooleanValue quotePrefix, Boolean includeQuotePrefix) + { + return OpenXmlHelper.GetBooleanValueAsBool(quotePrefix, false) == includeQuotePrefix; + } + + private static bool AlignmentsAreEqual(Alignment alignment, XLAlignmentValue xlAlignment) + { + if (alignment != null) + { + var a = XLAlignmentValue.Default.Key; + if (alignment.Indent != null) + a.Indent = (Int32)alignment.Indent.Value; + + if (alignment.Horizontal != null) + a.Horizontal = alignment.Horizontal.Value.ToClosedXml(); + if (alignment.Vertical != null) + a.Vertical = alignment.Vertical.Value.ToClosedXml(); + + if (alignment.ReadingOrder != null) + a.ReadingOrder = alignment.ReadingOrder.Value.ToClosedXml(); + if (alignment.WrapText != null) + a.WrapText = alignment.WrapText.Value; + if (alignment.TextRotation != null) + a.TextRotation = (Int32)alignment.TextRotation.Value; + if (alignment.ShrinkToFit != null) + a.ShrinkToFit = alignment.ShrinkToFit.Value; + if (alignment.RelativeIndent != null) + a.RelativeIndent = alignment.RelativeIndent.Value; + if (alignment.JustifyLastLine != null) + a.JustifyLastLine = alignment.JustifyLastLine.Value; + return a.Equals(xlAlignment.Key); + } + else + { + return XLStyle.Default.Value.Alignment.Equals(xlAlignment); + } + } + + private Dictionary ResolveBorders(WorkbookStylesPart workbookStylesPart, + Dictionary sharedBorders) + { + if (workbookStylesPart.Stylesheet.Borders == null) + workbookStylesPart.Stylesheet.Borders = new Borders(); + + var allSharedBorders = new Dictionary(); + foreach (var borderInfo in sharedBorders.Values) + { + var borderId = 0; + var foundOne = false; + foreach (Border f in workbookStylesPart.Stylesheet.Borders) + { + if (BordersAreEqual(f, borderInfo.Border)) + { + foundOne = true; + break; + } + borderId++; + } + if (!foundOne) + { + var border = GetNewBorder(borderInfo); + workbookStylesPart.Stylesheet.Borders.AppendChild(border); + } + allSharedBorders.Add(borderInfo.Border, + new BorderInfo { Border = borderInfo.Border, BorderId = (UInt32)borderId }); + } + workbookStylesPart.Stylesheet.Borders.Count = (UInt32)workbookStylesPart.Stylesheet.Borders.Count(); + return allSharedBorders; + } + + private static Border GetNewBorder(BorderInfo borderInfo, Boolean ignoreMod = true) + { + var border = new Border(); + if (borderInfo.Border.DiagonalUp != XLBorderValue.Default.DiagonalUp || ignoreMod) + border.DiagonalUp = borderInfo.Border.DiagonalUp; + + if (borderInfo.Border.DiagonalDown != XLBorderValue.Default.DiagonalDown || ignoreMod) + border.DiagonalDown = borderInfo.Border.DiagonalDown; + + if (borderInfo.Border.LeftBorder != XLBorderValue.Default.LeftBorder || ignoreMod) + { + var leftBorder = new LeftBorder { Style = borderInfo.Border.LeftBorder.ToOpenXml() }; + if (borderInfo.Border.LeftBorderColor != XLBorderValue.Default.LeftBorderColor || ignoreMod) + { + var leftBorderColor = new Color().FromClosedXMLColor(borderInfo.Border.LeftBorderColor); + leftBorder.AppendChild(leftBorderColor); + } + border.AppendChild(leftBorder); + } + + if (borderInfo.Border.RightBorder != XLBorderValue.Default.RightBorder || ignoreMod) + { + var rightBorder = new RightBorder { Style = borderInfo.Border.RightBorder.ToOpenXml() }; + if (borderInfo.Border.RightBorderColor != XLBorderValue.Default.RightBorderColor || ignoreMod) + { + var rightBorderColor = new Color().FromClosedXMLColor(borderInfo.Border.RightBorderColor); + rightBorder.AppendChild(rightBorderColor); + } + border.AppendChild(rightBorder); + } + + if (borderInfo.Border.TopBorder != XLBorderValue.Default.TopBorder || ignoreMod) + { + var topBorder = new TopBorder { Style = borderInfo.Border.TopBorder.ToOpenXml() }; + if (borderInfo.Border.TopBorderColor != XLBorderValue.Default.TopBorderColor || ignoreMod) + { + var topBorderColor = new Color().FromClosedXMLColor(borderInfo.Border.TopBorderColor); + topBorder.AppendChild(topBorderColor); + } + border.AppendChild(topBorder); + } + + if (borderInfo.Border.BottomBorder != XLBorderValue.Default.BottomBorder || ignoreMod) + { + var bottomBorder = new BottomBorder { Style = borderInfo.Border.BottomBorder.ToOpenXml() }; + if (borderInfo.Border.BottomBorderColor != XLBorderValue.Default.BottomBorderColor || ignoreMod) + { + var bottomBorderColor = new Color().FromClosedXMLColor(borderInfo.Border.BottomBorderColor); + bottomBorder.AppendChild(bottomBorderColor); + } + border.AppendChild(bottomBorder); + } + + if (borderInfo.Border.DiagonalBorder != XLBorderValue.Default.DiagonalBorder || ignoreMod) + { + var DiagonalBorder = new DiagonalBorder { Style = borderInfo.Border.DiagonalBorder.ToOpenXml() }; + if (borderInfo.Border.DiagonalBorderColor != XLBorderValue.Default.DiagonalBorderColor || ignoreMod) + if (borderInfo.Border.DiagonalBorderColor != null) + { + var DiagonalBorderColor = new Color().FromClosedXMLColor(borderInfo.Border.DiagonalBorderColor); + DiagonalBorder.AppendChild(DiagonalBorderColor); + } + border.AppendChild(DiagonalBorder); + } + + return border; + } + + private bool BordersAreEqual(Border b, XLBorderValue xlBorder) + { + var nb = XLBorderValue.Default.Key; + if (b.DiagonalUp != null) + nb.DiagonalUp = b.DiagonalUp.Value; + + if (b.DiagonalDown != null) + nb.DiagonalDown = b.DiagonalDown.Value; + + if (b.DiagonalBorder != null) + { + if (b.DiagonalBorder.Style != null) + nb.DiagonalBorder = b.DiagonalBorder.Style.Value.ToClosedXml(); + if (b.DiagonalBorder.Color != null) + nb.DiagonalBorderColor = b.DiagonalBorder.Color.ToClosedXMLColor(_colorList).Key; + } + + if (b.LeftBorder != null) + { + if (b.LeftBorder.Style != null) + nb.LeftBorder = b.LeftBorder.Style.Value.ToClosedXml(); + if (b.LeftBorder.Color != null) + nb.LeftBorderColor = b.LeftBorder.Color.ToClosedXMLColor(_colorList).Key; + } + + if (b.RightBorder != null) + { + if (b.RightBorder.Style != null) + nb.RightBorder = b.RightBorder.Style.Value.ToClosedXml(); + if (b.RightBorder.Color != null) + nb.RightBorderColor = b.RightBorder.Color.ToClosedXMLColor(_colorList).Key; + } + + if (b.TopBorder != null) + { + if (b.TopBorder.Style != null) + nb.TopBorder = b.TopBorder.Style.Value.ToClosedXml(); + if (b.TopBorder.Color != null) + nb.TopBorderColor = b.TopBorder.Color.ToClosedXMLColor(_colorList).Key; + } + + if (b.BottomBorder != null) + { + if (b.BottomBorder.Style != null) + nb.BottomBorder = b.BottomBorder.Style.Value.ToClosedXml(); + if (b.BottomBorder.Color != null) + nb.BottomBorderColor = b.BottomBorder.Color.ToClosedXMLColor(_colorList).Key; + } + + return nb.Equals(xlBorder.Key); + } + + private Dictionary ResolveFills(WorkbookStylesPart workbookStylesPart, + Dictionary sharedFills) + { + if (workbookStylesPart.Stylesheet.Fills == null) + workbookStylesPart.Stylesheet.Fills = new Fills(); + + ResolveFillWithPattern(workbookStylesPart.Stylesheet.Fills, PatternValues.None); + ResolveFillWithPattern(workbookStylesPart.Stylesheet.Fills, PatternValues.Gray125); + + var allSharedFills = new Dictionary(); + foreach (var fillInfo in sharedFills.Values) + { + var fillId = 0; + var foundOne = false; + foreach (Fill f in workbookStylesPart.Stylesheet.Fills) + { + if (FillsAreEqual(f, fillInfo.Fill, fromDifferentialFormat: false)) + { + foundOne = true; + break; + } + fillId++; + } + if (!foundOne) + { + var fill = GetNewFill(fillInfo, differentialFillFormat: false); + workbookStylesPart.Stylesheet.Fills.AppendChild(fill); + } + allSharedFills.Add(fillInfo.Fill, new FillInfo { Fill = fillInfo.Fill, FillId = (UInt32)fillId }); + } + + workbookStylesPart.Stylesheet.Fills.Count = (UInt32)workbookStylesPart.Stylesheet.Fills.Count(); + return allSharedFills; + } + + private static void ResolveFillWithPattern(Fills fills, PatternValues patternValues) + { + if (fills.Elements().Any(f => + f.PatternFill == null + || (f.PatternFill.PatternType == patternValues + && f.PatternFill.ForegroundColor == null + && f.PatternFill.BackgroundColor == null + ))) + return; + + var fill1 = new Fill(); + var patternFill1 = new PatternFill { PatternType = patternValues }; + fill1.AppendChild(patternFill1); + fills.AppendChild(fill1); + } + + private static Fill GetNewFill(FillInfo fillInfo, Boolean differentialFillFormat, Boolean ignoreMod = true) + { + var fill = new Fill(); + + var patternFill = new PatternFill(); + + patternFill.PatternType = fillInfo.Fill.PatternType.ToOpenXml(); + + BackgroundColor backgroundColor; + ForegroundColor foregroundColor; + + switch (fillInfo.Fill.PatternType) + { + case XLFillPatternValues.None: + break; + + case XLFillPatternValues.Solid: + + if (differentialFillFormat) + { + patternFill.AppendChild(new ForegroundColor { Auto = true }); + backgroundColor = new BackgroundColor().FromClosedXMLColor(fillInfo.Fill.BackgroundColor, true); + if (backgroundColor.HasAttributes) + patternFill.AppendChild(backgroundColor); + } + else + { + // ClosedXML Background color to be populated into OpenXML fgColor + foregroundColor = new ForegroundColor().FromClosedXMLColor(fillInfo.Fill.BackgroundColor); + if (foregroundColor.HasAttributes) + patternFill.AppendChild(foregroundColor); + } + break; + + default: + + foregroundColor = new ForegroundColor().FromClosedXMLColor(fillInfo.Fill.PatternColor); + if (foregroundColor.HasAttributes) + patternFill.AppendChild(foregroundColor); + + backgroundColor = new BackgroundColor().FromClosedXMLColor(fillInfo.Fill.BackgroundColor); + if (backgroundColor.HasAttributes) + patternFill.AppendChild(backgroundColor); + + break; + } + + if (patternFill.HasChildren) + fill.AppendChild(patternFill); + + return fill; + } + + private bool FillsAreEqual(Fill f, XLFillValue xlFill, Boolean fromDifferentialFormat) + { + var nF = new XLFill(null); + + LoadFill(f, nF, fromDifferentialFormat); + + return nF.Key.Equals(xlFill.Key); + } + + private void ResolveFonts(WorkbookStylesPart workbookStylesPart, SaveContext context) + { + if (workbookStylesPart.Stylesheet.Fonts == null) + workbookStylesPart.Stylesheet.Fonts = new Fonts(); + + var newFonts = new Dictionary(); + foreach (var fontInfo in context.SharedFonts.Values) + { + var fontId = 0; + var foundOne = false; + foreach (Font f in workbookStylesPart.Stylesheet.Fonts) + { + if (FontsAreEqual(f, fontInfo.Font)) + { + foundOne = true; + break; + } + fontId++; + } + if (!foundOne) + { + var font = GetNewFont(fontInfo); + workbookStylesPart.Stylesheet.Fonts.AppendChild(font); + } + newFonts.Add(fontInfo.Font, new FontInfo { Font = fontInfo.Font, FontId = (UInt32)fontId }); + } + context.SharedFonts.Clear(); + foreach (var kp in newFonts) + context.SharedFonts.Add(kp.Key, kp.Value); + + workbookStylesPart.Stylesheet.Fonts.Count = (UInt32)workbookStylesPart.Stylesheet.Fonts.Count(); + } + + private static Font GetNewFont(FontInfo fontInfo, Boolean ignoreMod = true) + { + var font = new Font(); + var bold = (fontInfo.Font.Bold != XLFontValue.Default.Bold || ignoreMod) && fontInfo.Font.Bold ? new Bold() : null; + var italic = (fontInfo.Font.Italic != XLFontValue.Default.Italic || ignoreMod) && fontInfo.Font.Italic ? new Italic() : null; + var underline = (fontInfo.Font.Underline != XLFontValue.Default.Underline || ignoreMod) && + fontInfo.Font.Underline != XLFontUnderlineValues.None + ? new Underline { Val = fontInfo.Font.Underline.ToOpenXml() } + : null; + var strike = (fontInfo.Font.Strikethrough != XLFontValue.Default.Strikethrough || ignoreMod) && fontInfo.Font.Strikethrough + ? new Strike() + : null; + var verticalAlignment = fontInfo.Font.VerticalAlignment != XLFontValue.Default.VerticalAlignment || ignoreMod + ? new VerticalTextAlignment { Val = fontInfo.Font.VerticalAlignment.ToOpenXml() } + : null; + + var shadow = (fontInfo.Font.Shadow != XLFontValue.Default.Shadow || ignoreMod) && fontInfo.Font.Shadow ? new Shadow() : null; + var fontSize = fontInfo.Font.FontSize != XLFontValue.Default.FontSize || ignoreMod + ? new FontSize { Val = fontInfo.Font.FontSize } + : null; + var color = fontInfo.Font.FontColor != XLFontValue.Default.FontColor || ignoreMod ? new Color().FromClosedXMLColor(fontInfo.Font.FontColor) : null; + + var fontName = fontInfo.Font.FontName != XLFontValue.Default.FontName || ignoreMod + ? new FontName { Val = fontInfo.Font.FontName } + : null; + var fontFamilyNumbering = fontInfo.Font.FontFamilyNumbering != XLFontValue.Default.FontFamilyNumbering || ignoreMod + ? new FontFamilyNumbering { Val = (Int32)fontInfo.Font.FontFamilyNumbering } + : null; + + var fontCharSet = (fontInfo.Font.FontCharSet != XLFontValue.Default.FontCharSet || ignoreMod) && fontInfo.Font.FontCharSet != XLFontCharSet.Default + ? new FontCharSet { Val = (Int32)fontInfo.Font.FontCharSet } + : null; + + if (bold != null) + font.AppendChild(bold); + if (italic != null) + font.AppendChild(italic); + if (underline != null) + font.AppendChild(underline); + if (strike != null) + font.AppendChild(strike); + if (verticalAlignment != null) + font.AppendChild(verticalAlignment); + if (shadow != null) + font.AppendChild(shadow); + if (fontSize != null) + font.AppendChild(fontSize); + if (color != null) + font.AppendChild(color); + if (fontName != null) + font.AppendChild(fontName); + if (fontFamilyNumbering != null) + font.AppendChild(fontFamilyNumbering); + if (fontCharSet != null) + font.AppendChild(fontCharSet); + + return font; + } + + private bool FontsAreEqual(Font f, XLFontValue xlFont) + { + var nf = XLFontValue.Default.Key; + nf.Bold = f.Bold != null; + nf.Italic = f.Italic != null; + + if (f.Underline != null) + { + nf.Underline = f.Underline.Val != null + ? f.Underline.Val.Value.ToClosedXml() + : XLFontUnderlineValues.Single; + } + nf.Strikethrough = f.Strike != null; + if (f.VerticalTextAlignment != null) + { + nf.VerticalAlignment = f.VerticalTextAlignment.Val != null + ? f.VerticalTextAlignment.Val.Value.ToClosedXml() + : XLFontVerticalTextAlignmentValues.Baseline; + } + nf.Shadow = f.Shadow != null; + if (f.FontSize != null) + nf.FontSize = f.FontSize.Val; + if (f.Color != null) + nf.FontColor = f.Color.ToClosedXMLColor(_colorList).Key; + if (f.FontName != null) + nf.FontName = f.FontName.Val; + if (f.FontFamilyNumbering != null) + nf.FontFamilyNumbering = (XLFontFamilyNumberingValues)f.FontFamilyNumbering.Val.Value; + + return nf.Equals(xlFont.Key); + } + + private static Dictionary ResolveNumberFormats( + WorkbookStylesPart workbookStylesPart, + Dictionary sharedNumberFormats, + UInt32 defaultFormatId) + { + if (workbookStylesPart.Stylesheet.NumberingFormats == null) + { + workbookStylesPart.Stylesheet.NumberingFormats = new NumberingFormats(); + workbookStylesPart.Stylesheet.NumberingFormats.AppendChild(new NumberingFormat() + { + NumberFormatId = 0, + FormatCode = "" + }); + } + + var allSharedNumberFormats = new Dictionary(); + foreach (var numberFormatInfo in sharedNumberFormats.Values.Where(nf => nf.NumberFormatId != defaultFormatId)) + { + var numberingFormatId = XLConstants.NumberOfBuiltInStyles; // 0-based + var foundOne = false; + foreach (NumberingFormat nf in workbookStylesPart.Stylesheet.NumberingFormats) + { + if (NumberFormatsAreEqual(nf, numberFormatInfo.NumberFormat)) + { + foundOne = true; + numberingFormatId = (Int32)nf.NumberFormatId.Value; + break; + } + numberingFormatId++; + } + if (!foundOne) + { + var numberingFormat = new NumberingFormat + { + NumberFormatId = (UInt32)numberingFormatId, + FormatCode = numberFormatInfo.NumberFormat.Format + }; + workbookStylesPart.Stylesheet.NumberingFormats.AppendChild(numberingFormat); + } + allSharedNumberFormats.Add(numberFormatInfo.NumberFormat, + new NumberFormatInfo + { + NumberFormat = numberFormatInfo.NumberFormat, + NumberFormatId = numberingFormatId + }); + } + workbookStylesPart.Stylesheet.NumberingFormats.Count = + (UInt32)workbookStylesPart.Stylesheet.NumberingFormats.Count(); + return allSharedNumberFormats; + } + + private static bool NumberFormatsAreEqual(NumberingFormat nf, XLNumberFormatValue xlNumberFormat) + { + if (nf.FormatCode != null && !String.IsNullOrWhiteSpace(nf.FormatCode.Value)) + return string.Equals(xlNumberFormat?.Format, nf.FormatCode.Value); + else if (nf.NumberFormatId != null) + return xlNumberFormat?.NumberFormatId == (Int32)nf.NumberFormatId.Value; + return false; + } + + #endregion GenerateWorkbookStylesPartContent + + #region GenerateWorksheetPartContent + + private static void GenerateWorksheetPartContent( + WorksheetPart worksheetPart, XLWorksheet xlWorksheet, SaveOptions options, SaveContext context) + { + if (options.ConsolidateConditionalFormatRanges) + { + ((XLConditionalFormats)xlWorksheet.ConditionalFormats).Consolidate(); + } + + #region Worksheet + + if (worksheetPart.Worksheet == null) + worksheetPart.Worksheet = new Worksheet(); + + if ( + !worksheetPart.Worksheet.NamespaceDeclarations.Contains(new KeyValuePair("r", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships"))) + { + worksheetPart.Worksheet.AddNamespaceDeclaration("r", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + } + + #endregion Worksheet + + var cm = new XLWorksheetContentManager(worksheetPart.Worksheet); + + #region SheetProperties + + if (worksheetPart.Worksheet.SheetProperties == null) + worksheetPart.Worksheet.SheetProperties = new SheetProperties(); + + worksheetPart.Worksheet.SheetProperties.TabColor = xlWorksheet.TabColor.HasValue + ? new TabColor().FromClosedXMLColor(xlWorksheet.TabColor) + : null; + + cm.SetElement(XLWorksheetContents.SheetProperties, worksheetPart.Worksheet.SheetProperties); + + if (worksheetPart.Worksheet.SheetProperties.OutlineProperties == null) + worksheetPart.Worksheet.SheetProperties.OutlineProperties = new OutlineProperties(); + + worksheetPart.Worksheet.SheetProperties.OutlineProperties.SummaryBelow = + (xlWorksheet.Outline.SummaryVLocation == + XLOutlineSummaryVLocation.Bottom); + worksheetPart.Worksheet.SheetProperties.OutlineProperties.SummaryRight = + (xlWorksheet.Outline.SummaryHLocation == + XLOutlineSummaryHLocation.Right); + + if (worksheetPart.Worksheet.SheetProperties.PageSetupProperties == null + && (xlWorksheet.PageSetup.PagesTall > 0 || xlWorksheet.PageSetup.PagesWide > 0)) + worksheetPart.Worksheet.SheetProperties.PageSetupProperties = new PageSetupProperties { FitToPage = true }; + + #endregion SheetProperties + + var maxColumn = 0; + + var sheetDimensionReference = "A1"; + if (xlWorksheet.Internals.CellsCollection.Count > 0) + { + maxColumn = xlWorksheet.Internals.CellsCollection.MaxColumnUsed; + var maxRow = xlWorksheet.Internals.CellsCollection.MaxRowUsed; + sheetDimensionReference = "A1:" + XLHelper.GetColumnLetterFromNumber(maxColumn) + + maxRow.ToInvariantString(); + } + + if (xlWorksheet.Internals.ColumnsCollection.Count > 0) + { + var maxColCollection = xlWorksheet.Internals.ColumnsCollection.Keys.Max(); + if (maxColCollection > maxColumn) + maxColumn = maxColCollection; + } + + #region SheetViews + + if (worksheetPart.Worksheet.SheetDimension == null) + worksheetPart.Worksheet.SheetDimension = new SheetDimension { Reference = sheetDimensionReference }; + + cm.SetElement(XLWorksheetContents.SheetDimension, worksheetPart.Worksheet.SheetDimension); + + if (worksheetPart.Worksheet.SheetViews == null) + worksheetPart.Worksheet.SheetViews = new SheetViews(); + + cm.SetElement(XLWorksheetContents.SheetViews, worksheetPart.Worksheet.SheetViews); + + var sheetView = (SheetView)worksheetPart.Worksheet.SheetViews.FirstOrDefault(); + if (sheetView == null) + { + sheetView = new SheetView { WorkbookViewId = 0U }; + worksheetPart.Worksheet.SheetViews.AppendChild(sheetView); + } + + var svcm = new XLSheetViewContentManager(sheetView); + + if (xlWorksheet.TabSelected) + sheetView.TabSelected = true; + else + sheetView.TabSelected = null; + + if (xlWorksheet.RightToLeft) + sheetView.RightToLeft = true; + else + sheetView.RightToLeft = null; + + if (xlWorksheet.ShowFormulas) + sheetView.ShowFormulas = true; + else + sheetView.ShowFormulas = null; + + if (xlWorksheet.ShowGridLines) + sheetView.ShowGridLines = null; + else + sheetView.ShowGridLines = false; + + if (xlWorksheet.ShowOutlineSymbols) + sheetView.ShowOutlineSymbols = null; + else + sheetView.ShowOutlineSymbols = false; + + if (xlWorksheet.ShowRowColHeaders) + sheetView.ShowRowColHeaders = null; + else + sheetView.ShowRowColHeaders = false; + + if (xlWorksheet.ShowRuler) + sheetView.ShowRuler = null; + else + sheetView.ShowRuler = false; + + if (xlWorksheet.ShowWhiteSpace) + sheetView.ShowWhiteSpace = null; + else + sheetView.ShowWhiteSpace = false; + + if (xlWorksheet.ShowZeros) + sheetView.ShowZeros = null; + else + sheetView.ShowZeros = false; + + if (xlWorksheet.RightToLeft) + sheetView.RightToLeft = true; + else + sheetView.RightToLeft = null; + + if (xlWorksheet.SheetView.View == XLSheetViewOptions.Normal) + sheetView.View = null; + else + sheetView.View = xlWorksheet.SheetView.View.ToOpenXml(); + + var pane = sheetView.Elements().FirstOrDefault(); + if (pane == null) + { + pane = new Pane(); + sheetView.InsertAt(pane, 0); + } + + svcm.SetElement(XLSheetViewContents.Pane, pane); + + pane.State = PaneStateValues.FrozenSplit; + int hSplit = xlWorksheet.SheetView.SplitColumn; + int ySplit = xlWorksheet.SheetView.SplitRow; + + pane.HorizontalSplit = hSplit; + pane.VerticalSplit = ySplit; + + pane.ActivePane = (ySplit == 0 ? PaneValues.TopRight : 0) + | (hSplit == 0 ? PaneValues.BottomLeft : 0); + + pane.TopLeftCell = XLHelper.GetColumnLetterFromNumber(xlWorksheet.SheetView.SplitColumn + 1) + + (xlWorksheet.SheetView.SplitRow + 1); + + if (hSplit == 0 && ySplit == 0) + { + // We don't have a pane. Just a regular sheet. + pane = null; + sheetView.RemoveAllChildren(); + svcm.SetElement(XLSheetViewContents.Pane, null); + } + + // Do sheet view. Whether it's for a regular sheet or for the bottom-right pane + if (!xlWorksheet.SheetView.TopLeftCellAddress.IsValid + || xlWorksheet.SheetView.TopLeftCellAddress == new XLAddress(1, 1, fixedRow: false, fixedColumn: false)) + sheetView.TopLeftCell = null; + else + sheetView.TopLeftCell = xlWorksheet.SheetView.TopLeftCellAddress.ToString(); + + if (xlWorksheet.SelectedRanges.Any() || xlWorksheet.ActiveCell != null) + { + sheetView.RemoveAllChildren(); + svcm.SetElement(XLSheetViewContents.Selection, null); + + var firstSelection = xlWorksheet.SelectedRanges.FirstOrDefault(); + + Action populateSelection = (Selection selection) => + { + if (xlWorksheet.ActiveCell != null) + selection.ActiveCell = xlWorksheet.ActiveCell.Address.ToStringRelative(false); + else if (firstSelection != null) + selection.ActiveCell = firstSelection.RangeAddress.FirstAddress.ToStringRelative(false); + + var seqRef = new List { selection.ActiveCell.Value }; + seqRef.AddRange(xlWorksheet.SelectedRanges + .Select(range => + { + if (range.RangeAddress.FirstAddress.Equals(range.RangeAddress.LastAddress)) + return range.RangeAddress.FirstAddress.ToStringRelative(false); + else + return range.RangeAddress.ToStringRelative(false); + }) + ); + + selection.SequenceOfReferences = new ListValue { InnerText = String.Join(" ", seqRef.Distinct().ToArray()) }; + + sheetView.InsertAfter(selection, svcm.GetPreviousElementFor(XLSheetViewContents.Selection)); + svcm.SetElement(XLSheetViewContents.Selection, selection); + }; + + // If a pane exists, we need to set the active pane too + // Yes, this might lead to 2 Selection elements! + if (pane != null) + { + populateSelection(new Selection() + { + Pane = pane.ActivePane + }); + } + populateSelection(new Selection()); + } + + if (xlWorksheet.SheetView.ZoomScale == 100) + sheetView.ZoomScale = null; + else + sheetView.ZoomScale = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScale)); + + if (xlWorksheet.SheetView.ZoomScaleNormal == 100) + sheetView.ZoomScaleNormal = null; + else + sheetView.ZoomScaleNormal = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScaleNormal)); + + if (xlWorksheet.SheetView.ZoomScalePageLayoutView == 100) + sheetView.ZoomScalePageLayoutView = null; + else + sheetView.ZoomScalePageLayoutView = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScalePageLayoutView)); + + if (xlWorksheet.SheetView.ZoomScaleSheetLayoutView == 100) + sheetView.ZoomScaleSheetLayoutView = null; + else + sheetView.ZoomScaleSheetLayoutView = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScaleSheetLayoutView)); + + #endregion SheetViews + + var maxOutlineColumn = 0; + if (xlWorksheet.ColumnCount() > 0) + maxOutlineColumn = xlWorksheet.GetMaxColumnOutline(); + + var maxOutlineRow = 0; + if (xlWorksheet.RowCount() > 0) + maxOutlineRow = xlWorksheet.GetMaxRowOutline(); + + #region SheetFormatProperties + + if (worksheetPart.Worksheet.SheetFormatProperties == null) + worksheetPart.Worksheet.SheetFormatProperties = new SheetFormatProperties(); + + cm.SetElement(XLWorksheetContents.SheetFormatProperties, + worksheetPart.Worksheet.SheetFormatProperties); + + worksheetPart.Worksheet.SheetFormatProperties.DefaultRowHeight = xlWorksheet.RowHeight.SaveRound(); + + if (xlWorksheet.RowHeightChanged) + worksheetPart.Worksheet.SheetFormatProperties.CustomHeight = true; + else + worksheetPart.Worksheet.SheetFormatProperties.CustomHeight = null; + + var worksheetColumnWidth = GetColumnWidth(xlWorksheet.ColumnWidth).SaveRound(); + if (xlWorksheet.ColumnWidthChanged) + worksheetPart.Worksheet.SheetFormatProperties.DefaultColumnWidth = worksheetColumnWidth; + else + worksheetPart.Worksheet.SheetFormatProperties.DefaultColumnWidth = null; + + if (maxOutlineColumn > 0) + worksheetPart.Worksheet.SheetFormatProperties.OutlineLevelColumn = (byte)maxOutlineColumn; + else + worksheetPart.Worksheet.SheetFormatProperties.OutlineLevelColumn = null; + + if (maxOutlineRow > 0) + worksheetPart.Worksheet.SheetFormatProperties.OutlineLevelRow = (byte)maxOutlineRow; + else + worksheetPart.Worksheet.SheetFormatProperties.OutlineLevelRow = null; + + #endregion SheetFormatProperties + + #region Columns + + var worksheetStyleId = context.SharedStyles[xlWorksheet.StyleValue].StyleId; + if (xlWorksheet.Internals.CellsCollection.Count == 0 && + xlWorksheet.Internals.ColumnsCollection.Count == 0 + && worksheetStyleId == 0) + worksheetPart.Worksheet.RemoveAllChildren(); + else + { + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.Columns); + worksheetPart.Worksheet.InsertAfter(new Columns(), previousElement); + } + + var columns = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWorksheetContents.Columns, columns); + + var sheetColumnsByMin = columns.Elements().ToDictionary(c => c.Min.Value, c => c); + //Dictionary sheetColumnsByMax = columns.Elements().ToDictionary(c => c.Max.Value, c => c); + + Int32 minInColumnsCollection; + Int32 maxInColumnsCollection; + if (xlWorksheet.Internals.ColumnsCollection.Count > 0) + { + minInColumnsCollection = xlWorksheet.Internals.ColumnsCollection.Keys.Min(); + maxInColumnsCollection = xlWorksheet.Internals.ColumnsCollection.Keys.Max(); + } + else + { + minInColumnsCollection = 1; + maxInColumnsCollection = 0; + } + + if (minInColumnsCollection > 1) + { + UInt32Value min = 1; + UInt32Value max = (UInt32)(minInColumnsCollection - 1); + + for (var co = min; co <= max; co++) + { + var column = new Column + { + Min = co, + Max = co, + Style = worksheetStyleId, + Width = worksheetColumnWidth, + CustomWidth = true + }; + + UpdateColumn(column, columns, sheetColumnsByMin); //, sheetColumnsByMax); + } + } + + for (var co = minInColumnsCollection; co <= maxInColumnsCollection; co++) + { + UInt32 styleId; + Double columnWidth; + var isHidden = false; + var collapsed = false; + var outlineLevel = 0; + if (xlWorksheet.Internals.ColumnsCollection.TryGetValue(co, out XLColumn col)) + { + styleId = context.SharedStyles[col.StyleValue].StyleId; + columnWidth = GetColumnWidth(col.Width).SaveRound(); + isHidden = col.IsHidden; + collapsed = col.Collapsed; + outlineLevel = col.OutlineLevel; + } + else + { + styleId = context.SharedStyles[xlWorksheet.StyleValue].StyleId; + columnWidth = worksheetColumnWidth; + } + + var column = new Column + { + Min = (UInt32)co, + Max = (UInt32)co, + Style = styleId, + Width = columnWidth, + CustomWidth = true + }; + + if (isHidden) + column.Hidden = true; + if (collapsed) + column.Collapsed = true; + if (outlineLevel > 0) + column.OutlineLevel = (byte)outlineLevel; + + UpdateColumn(column, columns, sheetColumnsByMin); //, sheetColumnsByMax); + } + + var collection = maxInColumnsCollection; + foreach ( + var col in + columns.Elements().Where(c => c.Min > (UInt32)(collection)).OrderBy( + c => c.Min.Value)) + { + col.Style = worksheetStyleId; + col.Width = worksheetColumnWidth; + col.CustomWidth = true; + + if ((Int32)col.Max.Value > maxInColumnsCollection) + maxInColumnsCollection = (Int32)col.Max.Value; + } + + if (maxInColumnsCollection < XLHelper.MaxColumnNumber && worksheetStyleId != 0) + { + var column = new Column + { + Min = (UInt32)(maxInColumnsCollection + 1), + Max = (UInt32)(XLHelper.MaxColumnNumber), + Style = worksheetStyleId, + Width = worksheetColumnWidth, + CustomWidth = true + }; + columns.AppendChild(column); + } + + CollapseColumns(columns, sheetColumnsByMin); + + if (!columns.Any()) + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWorksheetContents.Columns, null); + } + } + + #endregion Columns + + #region SheetData + + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.SheetData); + worksheetPart.Worksheet.InsertAfter(new SheetData(), previousElement); + } + + var sheetData = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWorksheetContents.SheetData, sheetData); + + var lastRow = 0; + var existingSheetDataRows = + sheetData.Elements().ToDictionary(r => r.RowIndex == null ? ++lastRow : (Int32)r.RowIndex.Value, + r => r); + foreach ( + var r in + xlWorksheet.Internals.RowsCollection.Deleted.Where(r => existingSheetDataRows.ContainsKey(r.Key))) + { + sheetData.RemoveChild(existingSheetDataRows[r.Key]); + existingSheetDataRows.Remove(r.Key); + xlWorksheet.Internals.CellsCollection.Deleted.Remove(r.Key); + } + + var tableTotalCells = new HashSet( + xlWorksheet.Tables + .Where(table => table.ShowTotalsRow) + .SelectMany(table => + table.TotalsRow().CellsUsed()) + .Select(cell => cell.Address)); + + var distinctRows = xlWorksheet.Internals.CellsCollection.RowsCollection.Keys.Union(xlWorksheet.Internals.RowsCollection.Keys); + var noRows = !sheetData.Elements().Any(); + foreach (var distinctRow in distinctRows.OrderBy(r => r)) + { + Row row; + if (!existingSheetDataRows.TryGetValue(distinctRow, out row)) + row = new Row { RowIndex = (UInt32)distinctRow }; + + if (maxColumn > 0) + row.Spans = new ListValue { InnerText = "1:" + maxColumn.ToInvariantString() }; + + row.Height = null; + row.CustomHeight = null; + row.Hidden = null; + row.StyleIndex = null; + row.CustomFormat = null; + row.Collapsed = null; + if (xlWorksheet.Internals.RowsCollection.TryGetValue(distinctRow, out XLRow thisRow)) + { + if (thisRow.HeightChanged) + { + row.Height = thisRow.Height.SaveRound(); + row.CustomHeight = true; + row.CustomFormat = true; + } + + if (thisRow.StyleValue != xlWorksheet.StyleValue) + { + row.StyleIndex = context.SharedStyles[thisRow.StyleValue].StyleId; + row.CustomFormat = true; + } + + if (thisRow.IsHidden) + row.Hidden = true; + if (thisRow.Collapsed) + row.Collapsed = true; + if (thisRow.OutlineLevel > 0) + row.OutlineLevel = (byte)thisRow.OutlineLevel; + } + + var lastCell = 0; + var currentOpenXmlRowCells = row.Elements() + .ToDictionary + ( + c => c.CellReference?.Value ?? XLHelper.GetColumnLetterFromNumber(++lastCell) + distinctRow, + c => c + ); + + if (xlWorksheet.Internals.CellsCollection.Deleted.TryGetValue(distinctRow, out HashSet deletedColumns)) + { + foreach (var deletedColumn in deletedColumns.ToList()) + { + var key = XLHelper.GetColumnLetterFromNumber(deletedColumn) + distinctRow.ToInvariantString(); + + if (!currentOpenXmlRowCells.TryGetValue(key, out Cell cell)) + continue; + + row.RemoveChild(cell); + deletedColumns.Remove(deletedColumn); + } + if (deletedColumns.Count == 0) + xlWorksheet.Internals.CellsCollection.Deleted.Remove(distinctRow); + } + + if (xlWorksheet.Internals.CellsCollection.RowsCollection.TryGetValue(distinctRow, out Dictionary cells)) + { + var isNewRow = !row.Elements().Any(); + lastCell = 0; + var mRows = row.Elements().ToDictionary(c => XLHelper.GetColumnNumberFromAddress(c.CellReference == null + ? (XLHelper.GetColumnLetterFromNumber(++lastCell) + distinctRow) : c.CellReference.Value), c => c); + foreach (var xlCell in cells.Values + .OrderBy(c => c.Address.ColumnNumber) + .Select(c => c)) + { + XLTableField field = null; + + var styleId = context.SharedStyles[xlCell.StyleValue].StyleId; + var cellReference = (xlCell.Address).GetTrimmedAddress(); + + // For saving cells to file, ignore conditional formatting, data validation rules and merged + // ranges. They just bloat the file + var isEmpty = xlCell.IsEmpty(XLCellsUsedOptions.All + & ~XLCellsUsedOptions.ConditionalFormats + & ~XLCellsUsedOptions.DataValidation + & ~XLCellsUsedOptions.MergedRanges); + + if (currentOpenXmlRowCells.TryGetValue(cellReference, out Cell cell)) + { + if (isEmpty) + { + cell.Remove(); + } + + // reset some stuff that we'll populate later + cell.DataType = null; + cell.RemoveAllChildren(); + } + + if (!isEmpty) + { + if (cell == null) + { + cell = new Cell(); + cell.CellReference = new StringValue(cellReference); + + if (isNewRow) + row.AppendChild(cell); + else + { + var newColumn = XLHelper.GetColumnNumberFromAddress(cellReference); + + Cell cellBeforeInsert = null; + int[] lastCo = { Int32.MaxValue }; + foreach (var c in mRows.Where(kp => kp.Key > newColumn).Where(c => lastCo[0] > c.Key)) + { + cellBeforeInsert = c.Value; + lastCo[0] = c.Key; + } + if (cellBeforeInsert == null) + row.AppendChild(cell); + else + row.InsertBefore(cell, cellBeforeInsert); + } + } + + cell.StyleIndex = styleId; + if (xlCell.HasFormula) + { + var formula = xlCell.FormulaA1; + if (xlCell.HasArrayFormula) + { + formula = formula.Substring(1, formula.Length - 2); + var f = new CellFormula { FormulaType = CellFormulaValues.Array }; + + if (xlCell.FormulaReference == null) + xlCell.FormulaReference = xlCell.AsRange().RangeAddress; + + if (xlCell.FormulaReference.FirstAddress.Equals(xlCell.Address)) + { + f.Text = formula; + f.Reference = xlCell.FormulaReference.ToStringRelative(); + } + + cell.CellFormula = f; + } + else + { + cell.CellFormula = new CellFormula(); + cell.CellFormula.Text = formula; + } + + if (!options.EvaluateFormulasBeforeSaving || xlCell.CachedValue == null || xlCell.NeedsRecalculation) + cell.CellValue = null; + else + { + string valueCalculated; + if (xlCell.CachedValue is int) + valueCalculated = ((int)xlCell.CachedValue).ToInvariantString(); + else if (xlCell.CachedValue is double) + valueCalculated = ((double)xlCell.CachedValue).ToInvariantString(); + else + valueCalculated = xlCell.CachedValue.ToString(); + + cell.CellValue = new CellValue(valueCalculated); + } + } + else if (tableTotalCells.Contains(xlCell.Address)) + { + var table = xlWorksheet.Tables.First(t => t.AsRange().Contains(xlCell)); + field = table.Fields.First(f => f.Column.ColumnNumber() == xlCell.Address.ColumnNumber) as XLTableField; + + if (!String.IsNullOrWhiteSpace(field.TotalsRowLabel)) + { + cell.DataType = XLWorkbook.CvSharedString; + } + else + { + cell.DataType = null; + } + cell.CellFormula = null; + } + else + { + cell.CellFormula = null; + cell.DataType = xlCell.DataType == XLDataType.DateTime ? null : GetCellValueType(xlCell); + } + + if (options.EvaluateFormulasBeforeSaving || field != null || !xlCell.HasFormula) + SetCellValue(xlCell, field, cell, context); + } + } + xlWorksheet.Internals.CellsCollection.Deleted.Remove(distinctRow); + } + + // If we're adding a new row (not in sheet already and it's not "empty" + if (!existingSheetDataRows.ContainsKey(distinctRow)) + { + var invalidRow = row.Height == null + && row.CustomHeight == null + && row.Hidden == null + && row.StyleIndex == null + && row.CustomFormat == null + && row.Collapsed == null + && row.OutlineLevel == null + && !row.Elements().Any(); + + if (!invalidRow) + { + if (noRows) + { + sheetData.AppendChild(row); + noRows = false; + } + else + { + if (existingSheetDataRows.Any(r => r.Key > row.RowIndex.Value)) + { + var minRow = existingSheetDataRows.Where(r => r.Key > (Int32)row.RowIndex.Value).Min(r => r.Key); + var rowBeforeInsert = existingSheetDataRows[minRow]; + sheetData.InsertBefore(row, rowBeforeInsert); + } + else + sheetData.AppendChild(row); + } + } + } + } + + foreach (var r in xlWorksheet.Internals.CellsCollection.Deleted.Keys) + { + if (existingSheetDataRows.TryGetValue(r, out Row row)) + { + sheetData.RemoveChild(row); + existingSheetDataRows.Remove(r); + } + } + + #endregion SheetData + + #region SheetProtection + + if (xlWorksheet.Protection.IsProtected) + { + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.SheetProtection); + worksheetPart.Worksheet.InsertAfter(new SheetProtection(), previousElement); + } + + var sheetProtection = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWorksheetContents.SheetProtection, sheetProtection); + + var protection = xlWorksheet.Protection; + sheetProtection.Sheet = OpenXmlHelper.GetBooleanValue(protection.IsProtected, false); + + sheetProtection.Password = null; + sheetProtection.AlgorithmName = null; + sheetProtection.HashValue = null; + sheetProtection.SpinCount = null; + sheetProtection.SaltValue = null; + + if (protection.Algorithm == XLProtectionAlgorithm.Algorithm.SimpleHash) + { + if (!String.IsNullOrWhiteSpace(protection.PasswordHash)) + sheetProtection.Password = protection.PasswordHash; + } + else + { + sheetProtection.AlgorithmName = DescribedEnumParser.ToDescription(protection.Algorithm); + sheetProtection.HashValue = protection.PasswordHash; + sheetProtection.SpinCount = protection.SpinCount; + sheetProtection.SaltValue = protection.Base64EncodedSalt; + } + + // default value of "1" + sheetProtection.FormatCells = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLSheetProtectionElements.FormatCells), true); + sheetProtection.FormatColumns = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLSheetProtectionElements.FormatColumns), true); + sheetProtection.FormatRows = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLSheetProtectionElements.FormatRows), true); + sheetProtection.InsertColumns = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLSheetProtectionElements.InsertColumns), true); + sheetProtection.InsertRows = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLSheetProtectionElements.InsertRows), true); + sheetProtection.InsertHyperlinks = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLSheetProtectionElements.InsertHyperlinks), true); + sheetProtection.DeleteColumns = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLSheetProtectionElements.DeleteColumns), true); + sheetProtection.DeleteRows = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLSheetProtectionElements.DeleteRows), true); + sheetProtection.Sort = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLSheetProtectionElements.Sort), true); + sheetProtection.AutoFilter = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLSheetProtectionElements.AutoFilter), true); + sheetProtection.PivotTables = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLSheetProtectionElements.PivotTables), true); + sheetProtection.Scenarios = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLSheetProtectionElements.EditScenarios), true); + + // default value of "0" + sheetProtection.Objects = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLSheetProtectionElements.EditObjects), false); + sheetProtection.SelectLockedCells = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLSheetProtectionElements.SelectLockedCells), false); + sheetProtection.SelectUnlockedCells = OpenXmlHelper.GetBooleanValue(!protection.AllowedElements.HasFlag(XLSheetProtectionElements.SelectUnlockedCells), false); + } + else + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWorksheetContents.SheetProtection, null); + } + + #endregion SheetProtection + + #region AutoFilter + + worksheetPart.Worksheet.RemoveAllChildren(); + if (xlWorksheet.AutoFilter.IsEnabled) + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.AutoFilter); + worksheetPart.Worksheet.InsertAfter(new AutoFilter(), previousElement); + + var autoFilter = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWorksheetContents.AutoFilter, autoFilter); + + PopulateAutoFilter(xlWorksheet.AutoFilter, autoFilter); + } + else + { + cm.SetElement(XLWorksheetContents.AutoFilter, null); + } + + #endregion AutoFilter + + #region MergeCells + + if ((xlWorksheet).Internals.MergedRanges.Any()) + { + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.MergeCells); + worksheetPart.Worksheet.InsertAfter(new MergeCells(), previousElement); + } + + var mergeCells = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWorksheetContents.MergeCells, mergeCells); + mergeCells.RemoveAllChildren(); + + foreach (var mergeCell in (xlWorksheet).Internals.MergedRanges.Select( + m => m.RangeAddress.FirstAddress.ToString() + ":" + m.RangeAddress.LastAddress.ToString()).Select( + merged => new MergeCell { Reference = merged })) + mergeCells.AppendChild(mergeCell); + + mergeCells.Count = (UInt32)mergeCells.Count(); + } + else + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWorksheetContents.MergeCells, null); + } + + #endregion MergeCells + + #region Conditional Formatting + + if (!xlWorksheet.ConditionalFormats.Any()) + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWorksheetContents.ConditionalFormatting, null); + } + else + { + worksheetPart.Worksheet.RemoveAllChildren(); + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.ConditionalFormatting); + + var conditionalFormats = xlWorksheet.ConditionalFormats.ToList(); // Required for IndexOf method + + foreach (var cfGroup in conditionalFormats + .GroupBy( + c => string.Join(" ", c.Ranges.Select(r => r.RangeAddress.ToStringRelative(false))), + c => c, + (key, g) => new { RangeId = key, CfList = g.ToList() } + ) + ) + { + var conditionalFormatting = new ConditionalFormatting + { + SequenceOfReferences = + new ListValue { InnerText = cfGroup.RangeId } + }; + foreach (var cf in cfGroup.CfList) + { + var priority = conditionalFormats.IndexOf(cf) + 1; + conditionalFormatting.Append(XLCFConverters.Convert(cf, priority, context)); + } + worksheetPart.Worksheet.InsertAfter(conditionalFormatting, previousElement); + previousElement = conditionalFormatting; + cm.SetElement(XLWorksheetContents.ConditionalFormatting, conditionalFormatting); + } + } + + var exlst = from c in xlWorksheet.ConditionalFormats where c.ConditionalFormatType == XLConditionalFormatType.DataBar && typeof(IXLConditionalFormat).IsAssignableFrom(c.GetType()) select c; + if (exlst != null && exlst.Any()) + { + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.WorksheetExtensionList); + worksheetPart.Worksheet.InsertAfter(new WorksheetExtensionList(), previousElement); + } + + WorksheetExtensionList worksheetExtensionList = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWorksheetContents.WorksheetExtensionList, worksheetExtensionList); + + var conditionalFormattings = worksheetExtensionList.Descendants().SingleOrDefault(); + if (conditionalFormattings == null || !conditionalFormattings.Any()) + { + WorksheetExtension worksheetExtension1 = new WorksheetExtension { Uri = "{78C0D931-6437-407d-A8EE-F0AAD7539E65}" }; + worksheetExtension1.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); + worksheetExtensionList.Append(worksheetExtension1); + + conditionalFormattings = new DocumentFormat.OpenXml.Office2010.Excel.ConditionalFormattings(); + worksheetExtension1.Append(conditionalFormattings); + } + + foreach (var cfGroup in exlst + .GroupBy( + c => string.Join(" ", c.Ranges.Select(r => r.RangeAddress.ToStringRelative(false))), + c => c, + (key, g) => new { RangeId = key, CfList = g.ToList() } + ) + ) + { + foreach (var xlConditionalFormat in cfGroup.CfList.Cast()) + { + var conditionalFormattingRule = conditionalFormattings.Descendants() + .SingleOrDefault(r => r.Id == xlConditionalFormat.Id.WrapInBraces()); + if (conditionalFormattingRule != null) + { + var conditionalFormat = conditionalFormattingRule.Ancestors().SingleOrDefault(); + conditionalFormattings.RemoveChild(conditionalFormat); + } + + var conditionalFormatting = new DocumentFormat.OpenXml.Office2010.Excel.ConditionalFormatting(); + conditionalFormatting.AddNamespaceDeclaration("xm", "http://schemas.microsoft.com/office/excel/2006/main"); + conditionalFormatting.Append(XLCFConvertersExtension.Convert(xlConditionalFormat, context)); + var referenceSequence = new DocumentFormat.OpenXml.Office.Excel.ReferenceSequence { Text = cfGroup.RangeId }; + conditionalFormatting.Append(referenceSequence); + + conditionalFormattings.Append(conditionalFormatting); + } + } + } + + #endregion Conditional Formatting + + #region Sparklines + + const string sparklineGroupsExtensionUri = "{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"; + + if (!xlWorksheet.SparklineGroups.Any()) + { + var worksheetExtensionList = worksheetPart.Worksheet.Elements().FirstOrDefault(); + var worksheetExtension = worksheetExtensionList?.Elements() + .FirstOrDefault(ext => string.Equals(ext.Uri, sparklineGroupsExtensionUri, StringComparison.InvariantCultureIgnoreCase)); + + worksheetExtension?.RemoveAllChildren(); + + if (worksheetExtensionList != null) + { + if (worksheetExtension != null && !worksheetExtension.HasChildren) + { + worksheetExtensionList.RemoveChild(worksheetExtension); + } + + if (!worksheetExtensionList.HasChildren) + { + worksheetPart.Worksheet.RemoveChild(worksheetExtensionList); + cm.SetElement(XLWorksheetContents.WorksheetExtensionList, null); + } + } + } + else + { + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.WorksheetExtensionList); + worksheetPart.Worksheet.InsertAfter(new WorksheetExtensionList(), previousElement); + } + + var worksheetExtensionList = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWorksheetContents.WorksheetExtensionList, worksheetExtensionList); + + var sparklineGroups = worksheetExtensionList.Descendants().SingleOrDefault(); + + if (sparklineGroups == null || !sparklineGroups.Any()) + { + var worksheetExtension1 = new WorksheetExtension() { Uri = sparklineGroupsExtensionUri }; + worksheetExtension1.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); + worksheetExtensionList.Append(worksheetExtension1); + + sparklineGroups = new X14.SparklineGroups(); + sparklineGroups.AddNamespaceDeclaration("xm", "http://schemas.microsoft.com/office/excel/2006/main"); + worksheetExtension1.Append(sparklineGroups); + } + else + { + sparklineGroups.RemoveAllChildren(); + } + + foreach (var xlSparklineGroup in xlWorksheet.SparklineGroups) + { + // Do not create an empty Sparkline group + if (!xlSparklineGroup.Any()) + continue; + + var sparklineGroup = new X14.SparklineGroup(); + sparklineGroup.SetAttribute(new OpenXmlAttribute("xr2", "uid", "http://schemas.microsoft.com/office/spreadsheetml/2015/revision2", "{A98FF5F8-AE60-43B5-8001-AD89004F45D3}")); + + sparklineGroup.FirstMarkerColor = new X14.FirstMarkerColor().FromClosedXMLColor(xlSparklineGroup.Style.FirstMarkerColor); + sparklineGroup.LastMarkerColor = new X14.LastMarkerColor().FromClosedXMLColor(xlSparklineGroup.Style.LastMarkerColor); + sparklineGroup.HighMarkerColor = new X14.HighMarkerColor().FromClosedXMLColor(xlSparklineGroup.Style.HighMarkerColor); + sparklineGroup.LowMarkerColor = new X14.LowMarkerColor().FromClosedXMLColor(xlSparklineGroup.Style.LowMarkerColor); + sparklineGroup.SeriesColor = new X14.SeriesColor().FromClosedXMLColor(xlSparklineGroup.Style.SeriesColor); + sparklineGroup.NegativeColor = new X14.NegativeColor().FromClosedXMLColor(xlSparklineGroup.Style.NegativeColor); + sparklineGroup.MarkersColor = new X14.MarkersColor().FromClosedXMLColor(xlSparklineGroup.Style.MarkersColor); + + sparklineGroup.High = xlSparklineGroup.ShowMarkers.HasFlag(XLSparklineMarkers.HighPoint); + sparklineGroup.Low = xlSparklineGroup.ShowMarkers.HasFlag(XLSparklineMarkers.LowPoint); + sparklineGroup.First = xlSparklineGroup.ShowMarkers.HasFlag(XLSparklineMarkers.FirstPoint); + sparklineGroup.Last = xlSparklineGroup.ShowMarkers.HasFlag(XLSparklineMarkers.LastPoint); + sparklineGroup.Negative = xlSparklineGroup.ShowMarkers.HasFlag(XLSparklineMarkers.NegativePoints); + sparklineGroup.Markers = xlSparklineGroup.ShowMarkers.HasFlag(XLSparklineMarkers.Markers); + + sparklineGroup.DisplayHidden = xlSparklineGroup.DisplayHidden; + sparklineGroup.LineWeight = xlSparklineGroup.LineWeight; + sparklineGroup.Type = xlSparklineGroup.Type.ToOpenXml(); + sparklineGroup.DisplayEmptyCellsAs = xlSparklineGroup.DisplayEmptyCellsAs.ToOpenXml(); + + sparklineGroup.AxisColor = new X14.AxisColor() { Rgb = xlSparklineGroup.HorizontalAxis.Color.Color.ToHex() }; + sparklineGroup.DisplayXAxis = xlSparklineGroup.HorizontalAxis.IsVisible; + sparklineGroup.RightToLeft = xlSparklineGroup.HorizontalAxis.RightToLeft; + sparklineGroup.DateAxis = xlSparklineGroup.HorizontalAxis.DateAxis; + if (xlSparklineGroup.HorizontalAxis.DateAxis) + sparklineGroup.Formula = new OfficeExcel.Formula( + xlSparklineGroup.DateRange.RangeAddress.ToString(XLReferenceStyle.A1, true)); + + sparklineGroup.MinAxisType = xlSparklineGroup.VerticalAxis.MinAxisType.ToOpenXml(); + if (xlSparklineGroup.VerticalAxis.MinAxisType == XLSparklineAxisMinMax.Custom) + sparklineGroup.ManualMin = xlSparklineGroup.VerticalAxis.ManualMin; + + sparklineGroup.MaxAxisType = xlSparklineGroup.VerticalAxis.MaxAxisType.ToOpenXml(); + if (xlSparklineGroup.VerticalAxis.MaxAxisType == XLSparklineAxisMinMax.Custom) + sparklineGroup.ManualMax = xlSparklineGroup.VerticalAxis.ManualMax; + + var sparklines = new X14.Sparklines(xlSparklineGroup + .Select(xlSparkline => new X14.Sparkline + { + Formula = new OfficeExcel.Formula(xlSparkline.SourceData.RangeAddress.ToString(XLReferenceStyle.A1, true)), + ReferenceSequence = + new OfficeExcel.ReferenceSequence(xlSparkline.Location.Address.ToString()) + }) + ); + + sparklineGroup.Append(sparklines); + sparklineGroups.Append(sparklineGroup); + } + + // if all Sparkline groups had no Sparklines, remove the entire SparklineGroup element + if (sparklineGroups.ChildElements.Count == 0) + { + sparklineGroups.Remove(); + } + } + + #endregion Sparklines + + #region DataValidations + + if (!xlWorksheet.DataValidations.Any(d => d.IsDirty())) + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWorksheetContents.DataValidations, null); + } + else + { + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.DataValidations); + worksheetPart.Worksheet.InsertAfter(new DataValidations(), previousElement); + } + + var dataValidations = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWorksheetContents.DataValidations, dataValidations); + dataValidations.RemoveAllChildren(); + + if (options.ConsolidateDataValidationRanges) + { + xlWorksheet.DataValidations.Consolidate(); + } + + foreach (var dv in xlWorksheet.DataValidations) + { + var sequence = dv.Ranges.Aggregate(String.Empty, (current, r) => current + (r.RangeAddress + " ")); + + if (sequence.Length > 0) + sequence = sequence.Substring(0, sequence.Length - 1); + + var dataValidation = new DataValidation + { + AllowBlank = dv.IgnoreBlanks, + Formula1 = new Formula1(dv.MinValue), + Formula2 = new Formula2(dv.MaxValue), + Type = dv.AllowedValues.ToOpenXml(), + ShowErrorMessage = dv.ShowErrorMessage, + Prompt = dv.InputMessage, + PromptTitle = dv.InputTitle, + ErrorTitle = dv.ErrorTitle, + Error = dv.ErrorMessage, + ShowDropDown = !dv.InCellDropdown, + ShowInputMessage = dv.ShowInputMessage, + ErrorStyle = dv.ErrorStyle.ToOpenXml(), + Operator = dv.Operator.ToOpenXml(), + SequenceOfReferences = + new ListValue { InnerText = sequence } + }; + + dataValidations.AppendChild(dataValidation); + } + dataValidations.Count = (UInt32)xlWorksheet.DataValidations.Count(); + } + + #endregion DataValidations + + #region Hyperlinks + + var relToRemove = worksheetPart.HyperlinkRelationships.ToList(); + relToRemove.ForEach(worksheetPart.DeleteReferenceRelationship); + if (!xlWorksheet.Hyperlinks.Any()) + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWorksheetContents.Hyperlinks, null); + } + else + { + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.Hyperlinks); + worksheetPart.Worksheet.InsertAfter(new Hyperlinks(), previousElement); + } + + var hyperlinks = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWorksheetContents.Hyperlinks, hyperlinks); + hyperlinks.RemoveAllChildren(); + foreach (var hl in xlWorksheet.Hyperlinks) + { + Hyperlink hyperlink; + if (hl.IsExternal) + { + var rId = context.RelIdGenerator.GetNext(RelType.Workbook); + hyperlink = new Hyperlink { Reference = hl.Cell.Address.ToString(), Id = rId }; + worksheetPart.AddHyperlinkRelationship(hl.ExternalAddress, true, rId); + } + else + { + hyperlink = new Hyperlink + { + Reference = hl.Cell.Address.ToString(), + Location = hl.InternalAddress, + Display = hl.Cell.GetFormattedString() + }; + } + if (!String.IsNullOrWhiteSpace(hl.Tooltip)) + hyperlink.Tooltip = hl.Tooltip; + hyperlinks.AppendChild(hyperlink); + } + } + + #endregion Hyperlinks + + #region PrintOptions + + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.PrintOptions); + worksheetPart.Worksheet.InsertAfter(new PrintOptions(), previousElement); + } + + var printOptions = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWorksheetContents.PrintOptions, printOptions); + + printOptions.HorizontalCentered = xlWorksheet.PageSetup.CenterHorizontally; + printOptions.VerticalCentered = xlWorksheet.PageSetup.CenterVertically; + printOptions.Headings = xlWorksheet.PageSetup.ShowRowAndColumnHeadings; + printOptions.GridLines = xlWorksheet.PageSetup.ShowGridlines; + + #endregion PrintOptions + + #region PageMargins + + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.PageMargins); + worksheetPart.Worksheet.InsertAfter(new PageMargins(), previousElement); + } + + var pageMargins = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWorksheetContents.PageMargins, pageMargins); + pageMargins.Left = xlWorksheet.PageSetup.Margins.Left; + pageMargins.Right = xlWorksheet.PageSetup.Margins.Right; + pageMargins.Top = xlWorksheet.PageSetup.Margins.Top; + pageMargins.Bottom = xlWorksheet.PageSetup.Margins.Bottom; + pageMargins.Header = xlWorksheet.PageSetup.Margins.Header; + pageMargins.Footer = xlWorksheet.PageSetup.Margins.Footer; + + #endregion PageMargins + + #region PageSetup + + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.PageSetup); + worksheetPart.Worksheet.InsertAfter(new PageSetup(), previousElement); + } + + var pageSetup = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWorksheetContents.PageSetup, pageSetup); + + pageSetup.Orientation = xlWorksheet.PageSetup.PageOrientation.ToOpenXml(); + pageSetup.PaperSize = (UInt32)xlWorksheet.PageSetup.PaperSize; + pageSetup.BlackAndWhite = xlWorksheet.PageSetup.BlackAndWhite; + pageSetup.Draft = xlWorksheet.PageSetup.DraftQuality; + pageSetup.PageOrder = xlWorksheet.PageSetup.PageOrder.ToOpenXml(); + pageSetup.CellComments = xlWorksheet.PageSetup.ShowComments.ToOpenXml(); + pageSetup.Errors = xlWorksheet.PageSetup.PrintErrorValue.ToOpenXml(); + + if (xlWorksheet.PageSetup.FirstPageNumber.HasValue) + { + pageSetup.FirstPageNumber = UInt32Value.FromUInt32(xlWorksheet.PageSetup.FirstPageNumber.Value); + pageSetup.UseFirstPageNumber = true; + } + else + { + pageSetup.FirstPageNumber = null; + pageSetup.UseFirstPageNumber = null; + } + + if (xlWorksheet.PageSetup.HorizontalDpi > 0) + pageSetup.HorizontalDpi = (UInt32)xlWorksheet.PageSetup.HorizontalDpi; + else + pageSetup.HorizontalDpi = null; + + if (xlWorksheet.PageSetup.VerticalDpi > 0) + pageSetup.VerticalDpi = (UInt32)xlWorksheet.PageSetup.VerticalDpi; + else + pageSetup.VerticalDpi = null; + + if (xlWorksheet.PageSetup.Scale > 0) + { + pageSetup.Scale = (UInt32)xlWorksheet.PageSetup.Scale; + pageSetup.FitToWidth = null; + pageSetup.FitToHeight = null; + } + else + { + pageSetup.Scale = null; + + if (xlWorksheet.PageSetup.PagesWide >= 0 && xlWorksheet.PageSetup.PagesWide != 1) + pageSetup.FitToWidth = (UInt32)xlWorksheet.PageSetup.PagesWide; + + if (xlWorksheet.PageSetup.PagesTall >= 0 && xlWorksheet.PageSetup.PagesTall != 1) + pageSetup.FitToHeight = (UInt32)xlWorksheet.PageSetup.PagesTall; + } + + // For some reason some Excel files already contains pageSetup.Copies = 0 + // The validation fails for this + // Let's remove the attribute of that's the case. + if ((pageSetup?.Copies ?? 0) <= 0) + pageSetup.Copies = null; + + #endregion PageSetup + + #region HeaderFooter + + var headerFooter = worksheetPart.Worksheet.Elements().FirstOrDefault(); + if (headerFooter == null) + headerFooter = new HeaderFooter(); + else + worksheetPart.Worksheet.RemoveAllChildren(); + + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.HeaderFooter); + worksheetPart.Worksheet.InsertAfter(headerFooter, previousElement); + cm.SetElement(XLWorksheetContents.HeaderFooter, headerFooter); + } + if (((XLHeaderFooter)xlWorksheet.PageSetup.Header).Changed + || ((XLHeaderFooter)xlWorksheet.PageSetup.Footer).Changed) + { + headerFooter.RemoveAllChildren(); + + headerFooter.ScaleWithDoc = xlWorksheet.PageSetup.ScaleHFWithDocument; + headerFooter.AlignWithMargins = xlWorksheet.PageSetup.AlignHFWithMargins; + headerFooter.DifferentFirst = xlWorksheet.PageSetup.DifferentFirstPageOnHF; + headerFooter.DifferentOddEven = xlWorksheet.PageSetup.DifferentOddEvenPagesOnHF; + + var oddHeader = new OddHeader(xlWorksheet.PageSetup.Header.GetText(XLHFOccurrence.OddPages)); + headerFooter.AppendChild(oddHeader); + var oddFooter = new OddFooter(xlWorksheet.PageSetup.Footer.GetText(XLHFOccurrence.OddPages)); + headerFooter.AppendChild(oddFooter); + + var evenHeader = new EvenHeader(xlWorksheet.PageSetup.Header.GetText(XLHFOccurrence.EvenPages)); + headerFooter.AppendChild(evenHeader); + var evenFooter = new EvenFooter(xlWorksheet.PageSetup.Footer.GetText(XLHFOccurrence.EvenPages)); + headerFooter.AppendChild(evenFooter); + + var firstHeader = new FirstHeader(xlWorksheet.PageSetup.Header.GetText(XLHFOccurrence.FirstPage)); + headerFooter.AppendChild(firstHeader); + var firstFooter = new FirstFooter(xlWorksheet.PageSetup.Footer.GetText(XLHFOccurrence.FirstPage)); + headerFooter.AppendChild(firstFooter); + } + + #endregion HeaderFooter + + #region RowBreaks + + var rowBreakCount = xlWorksheet.PageSetup.RowBreaks.Count; + if (rowBreakCount > 0) + { + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.RowBreaks); + worksheetPart.Worksheet.InsertAfter(new RowBreaks(), previousElement); + } + + var rowBreaks = worksheetPart.Worksheet.Elements().First(); + + var existingBreaks = rowBreaks.ChildElements.OfType(); + var rowBreaksToDelete = existingBreaks + .Where(rb => !rb.Id.HasValue || + !xlWorksheet.PageSetup.RowBreaks.Contains((int)rb.Id.Value)) + .ToList(); + + foreach (var rb in rowBreaksToDelete) + { + rowBreaks.RemoveChild(rb); + } + + var rowBreaksToAdd = xlWorksheet.PageSetup.RowBreaks + .Where(xlRb => !existingBreaks.Any(rb => rb.Id.HasValue && rb.Id.Value == xlRb)); + + rowBreaks.Count = (UInt32)rowBreakCount; + rowBreaks.ManualBreakCount = (UInt32)rowBreakCount; + var lastRowNum = (UInt32)xlWorksheet.RangeAddress.LastAddress.RowNumber; + foreach (var break1 in rowBreaksToAdd.Select(rb => new Break + { + Id = (UInt32)rb, + Max = lastRowNum, + ManualPageBreak = true + })) + rowBreaks.AppendChild(break1); + cm.SetElement(XLWorksheetContents.RowBreaks, rowBreaks); + } + else + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWorksheetContents.RowBreaks, null); + } + + #endregion RowBreaks + + #region ColumnBreaks + + var columnBreakCount = xlWorksheet.PageSetup.ColumnBreaks.Count; + if (columnBreakCount > 0) + { + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.ColumnBreaks); + worksheetPart.Worksheet.InsertAfter(new ColumnBreaks(), previousElement); + } + + var columnBreaks = worksheetPart.Worksheet.Elements().First(); + + var existingBreaks = columnBreaks.ChildElements.OfType(); + var columnBreaksToDelete = existingBreaks + .Where(cb => !cb.Id.HasValue || + !xlWorksheet.PageSetup.ColumnBreaks.Contains((int)cb.Id.Value)) + .ToList(); + + foreach (var rb in columnBreaksToDelete) + { + columnBreaks.RemoveChild(rb); + } + + var columnBreaksToAdd = xlWorksheet.PageSetup.ColumnBreaks + .Where(xlCb => !existingBreaks.Any(cb => cb.Id.HasValue && cb.Id.Value == xlCb)); + + columnBreaks.Count = (UInt32)columnBreakCount; + columnBreaks.ManualBreakCount = (UInt32)columnBreakCount; + var maxColumnNumber = (UInt32)xlWorksheet.RangeAddress.LastAddress.ColumnNumber; + foreach (var break1 in columnBreaksToAdd.Select(cb => new Break + { + Id = (UInt32)cb, + Max = maxColumnNumber, + ManualPageBreak = true + })) + columnBreaks.AppendChild(break1); + cm.SetElement(XLWorksheetContents.ColumnBreaks, columnBreaks); + } + else + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWorksheetContents.ColumnBreaks, null); + } + + #endregion ColumnBreaks + + #region Tables + + GenerateTables(xlWorksheet, worksheetPart, context, cm); + + #endregion Tables + + #region Drawings + + if (worksheetPart.DrawingsPart != null) + { + var xlPictures = xlWorksheet.Pictures as Drawings.XLPictures; + foreach (var removedPicture in xlPictures.Deleted) + { + worksheetPart.DrawingsPart.DeletePart(removedPicture); + } + xlPictures.Deleted.Clear(); + } + + foreach (var pic in xlWorksheet.Pictures) + { + AddPictureAnchor(worksheetPart, pic, context); + } + + if (xlWorksheet.Pictures.Any()) + RebaseNonVisualDrawingPropertiesIds(worksheetPart); + + var tableParts = worksheetPart.Worksheet.Elements().First(); + if (xlWorksheet.Pictures.Any() && !worksheetPart.Worksheet.OfType().Any()) + { + var worksheetDrawing = new Drawing { Id = worksheetPart.GetIdOfPart(worksheetPart.DrawingsPart) }; + worksheetDrawing.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + worksheetPart.Worksheet.InsertBefore(worksheetDrawing, tableParts); + cm.SetElement(XLWorksheetContents.Drawing, worksheetPart.Worksheet.Elements().First()); + } + + // Instead of saving a file with an empty Drawings.xml file, rather remove the .xml file + if (!xlWorksheet.Pictures.Any() && worksheetPart.DrawingsPart != null + && !worksheetPart.DrawingsPart.Parts.Any()) + { + var id = worksheetPart.GetIdOfPart(worksheetPart.DrawingsPart); + worksheetPart.Worksheet.RemoveChild(worksheetPart.Worksheet.OfType().FirstOrDefault(p => p.Id == id)); + worksheetPart.DeletePart(worksheetPart.DrawingsPart); + } + + #endregion Drawings + + #region LegacyDrawing + + if (xlWorksheet.LegacyDrawingIsNew) + { + worksheetPart.Worksheet.RemoveAllChildren(); + + if (!String.IsNullOrWhiteSpace(xlWorksheet.LegacyDrawingId)) + { + var previousElement = cm.GetPreviousElementFor(XLWorksheetContents.LegacyDrawing); + worksheetPart.Worksheet.InsertAfter(new LegacyDrawing { Id = xlWorksheet.LegacyDrawingId }, + previousElement); + + cm.SetElement(XLWorksheetContents.LegacyDrawing, worksheetPart.Worksheet.Elements().First()); + } + } + + #endregion LegacyDrawing + + #region LegacyDrawingHeaderFooter + + //LegacyDrawingHeaderFooter legacyHeaderFooter = worksheetPart.Worksheet.Elements().FirstOrDefault(); + //if (legacyHeaderFooter != null) + //{ + // worksheetPart.Worksheet.RemoveAllChildren(); + // { + // var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.LegacyDrawingHeaderFooter); + // worksheetPart.Worksheet.InsertAfter(new LegacyDrawingHeaderFooter { Id = xlWorksheet.LegacyDrawingId }, + // previousElement); + // } + //} + + #endregion LegacyDrawingHeaderFooter + } + + private static void SetCellValue(XLCell xlCell, XLTableField field, Cell openXmlCell, SaveContext context) + { + if (field != null) + { + if (!String.IsNullOrWhiteSpace(field.TotalsRowLabel)) + { + var cellValue = new CellValue(); + cellValue.Text = xlCell.SharedStringId.ToInvariantString(); + openXmlCell.DataType = CvSharedString; + openXmlCell.CellValue = cellValue; + } + else if (field.TotalsRowFunction == XLTotalsRowFunction.None) + { + openXmlCell.DataType = CvSharedString; + openXmlCell.CellValue = null; + } + return; + } + + if (xlCell.HasFormula) + { + openXmlCell.InlineString = null; + var cellValue = new CellValue(); + try + { + var v = xlCell.Value; + cellValue.Text = v.ObjectToInvariantString(); + switch (v) + { + case String s: + openXmlCell.DataType = new EnumValue(CellValues.String); + break; + + case DateTime dt: + openXmlCell.DataType = new EnumValue(CellValues.Date); + break; + + case Boolean b: + openXmlCell.DataType = new EnumValue(CellValues.Boolean); + break; + + default: + if (v.IsNumber()) + openXmlCell.DataType = new EnumValue(CellValues.Number); + else + openXmlCell.DataType = null; + break; + } + } + catch + { + cellValue = null; + } + + openXmlCell.CellValue = cellValue; + return; + } + else + openXmlCell.CellValue = null; + + var dataType = xlCell.DataType; + + if (dataType != XLDataType.Text) + openXmlCell.InlineString = null; + + if (dataType == XLDataType.Text) + { + if (!xlCell.StyleValue.IncludeQuotePrefix && xlCell.InnerText.Length == 0) + openXmlCell.CellValue = null; + else + { + if (xlCell.ShareString) + { + var cellValue = new CellValue(); + cellValue.Text = xlCell.SharedStringId.ToInvariantString(); + openXmlCell.CellValue = cellValue; + + openXmlCell.InlineString = null; + } + else + { + var inlineString = new InlineString(); + if (xlCell.HasRichText) + { + PopulatedRichTextElements(inlineString, xlCell, context); + } + else + { + var text = xlCell.GetString(); + var t = new Text(text); + if (text.PreserveSpaces()) + t.Space = SpaceProcessingModeValues.Preserve; + + inlineString.Text = t; + } + + openXmlCell.InlineString = inlineString; + } + } + } + else if (dataType == XLDataType.TimeSpan) + { + var timeSpan = xlCell.GetTimeSpan(); + var cellValue = new CellValue(); + cellValue.Text = timeSpan.TotalDays.ToInvariantString(); + openXmlCell.CellValue = cellValue; + } + else if (dataType == XLDataType.DateTime || dataType == XLDataType.Number) + { + if (!String.IsNullOrWhiteSpace(xlCell.InnerText)) + { + var cellValue = new CellValue(); + var d = Double.Parse(xlCell.InnerText, XLHelper.NumberStyle, XLHelper.ParseCulture); + + if (xlCell.Worksheet.Workbook.Use1904DateSystem && xlCell.DataType == XLDataType.DateTime) + { + // Internally ClosedXML stores cells as standard 1900-based style + // so if a workbook is in 1904-format, we do that adjustment here and when loading. + d -= 1462; + } + + cellValue.Text = d.ToInvariantString(); + openXmlCell.CellValue = cellValue; + } + } + else + { + var cellValue = new CellValue(); + cellValue.Text = xlCell.InnerText; + openXmlCell.CellValue = cellValue; + } + } + + private static void PopulateAutoFilter(XLAutoFilter xlAutoFilter, AutoFilter autoFilter) + { + var filterRange = xlAutoFilter.Range; + autoFilter.Reference = filterRange.RangeAddress.ToString(); + + foreach (var kp in xlAutoFilter.Filters) + { + var filterColumn = new FilterColumn { ColumnId = (UInt32)kp.Key - 1 }; + var xlFilterColumn = xlAutoFilter.Column(kp.Key); + + switch (xlFilterColumn.FilterType) + { + case XLFilterType.Custom: + var customFilters = new CustomFilters(); + foreach (var filter in kp.Value) + { + var customFilter = new CustomFilter { Val = filter.Value.ObjectToInvariantString() }; + + if (filter.Operator != XLFilterOperator.Equal) + customFilter.Operator = filter.Operator.ToOpenXml(); + + if (filter.Connector == XLConnector.And) + customFilters.And = true; + + customFilters.Append(customFilter); + } + filterColumn.Append(customFilters); + break; + + case XLFilterType.TopBottom: + + var top101 = new Top10 { Val = (double)xlFilterColumn.TopBottomValue }; + if (xlFilterColumn.TopBottomType == XLTopBottomType.Percent) + top101.Percent = true; + if (xlFilterColumn.TopBottomPart == XLTopBottomPart.Bottom) + top101.Top = false; + + filterColumn.Append(top101); + break; + + case XLFilterType.Dynamic: + + var dynamicFilter = new DynamicFilter + { Type = xlFilterColumn.DynamicType.ToOpenXml(), Val = xlFilterColumn.DynamicValue }; + filterColumn.Append(dynamicFilter); + break; + + case XLFilterType.DateTimeGrouping: + var dateTimeGroupFilters = new Filters(); + foreach (var filter in kp.Value) + { + if (filter.Value is DateTime) + { + var d = (DateTime)filter.Value; + var dgi = new DateGroupItem + { + Year = (UInt16)d.Year, + DateTimeGrouping = filter.DateTimeGrouping.ToOpenXml() + }; + + if (filter.DateTimeGrouping >= XLDateTimeGrouping.Month) dgi.Month = (UInt16)d.Month; + if (filter.DateTimeGrouping >= XLDateTimeGrouping.Day) dgi.Day = (UInt16)d.Day; + if (filter.DateTimeGrouping >= XLDateTimeGrouping.Hour) dgi.Hour = (UInt16)d.Hour; + if (filter.DateTimeGrouping >= XLDateTimeGrouping.Minute) dgi.Minute = (UInt16)d.Minute; + if (filter.DateTimeGrouping >= XLDateTimeGrouping.Second) dgi.Second = (UInt16)d.Second; + + dateTimeGroupFilters.Append(dgi); + } + } + filterColumn.Append(dateTimeGroupFilters); + break; + + default: + var filters = new Filters(); + foreach (var filter in kp.Value) + { + filters.Append(new Filter { Val = filter.Value.ObjectToInvariantString() }); + } + + filterColumn.Append(filters); + break; + } + autoFilter.Append(filterColumn); + } + + if (xlAutoFilter.Sorted) + { + string reference = null; + + if (filterRange.FirstCell().Address.RowNumber < filterRange.LastCell().Address.RowNumber) + reference = filterRange.Range(filterRange.FirstCell().CellBelow(), filterRange.LastCell()).RangeAddress.ToString(); + else + reference = filterRange.RangeAddress.ToString(); + + var sortState = new SortState + { + Reference = reference + }; + + var sortCondition = new SortCondition + { + Reference = + filterRange.Range(1, xlAutoFilter.SortColumn, filterRange.RowCount(), + xlAutoFilter.SortColumn).RangeAddress.ToString() + }; + if (xlAutoFilter.SortOrder == XLSortOrder.Descending) + sortCondition.Descending = true; + + sortState.Append(sortCondition); + autoFilter.Append(sortState); + } + } + + private static void CollapseColumns(Columns columns, Dictionary sheetColumns) + { + UInt32 lastMin = 1; + var count = sheetColumns.Count; + var arr = sheetColumns.OrderBy(kp => kp.Key).ToArray(); + // sheetColumns[kp.Key + 1] + //Int32 i = 0; + //foreach (KeyValuePair kp in arr + // //.Where(kp => !(kp.Key < count && ColumnsAreEqual(kp.Value, ))) + // ) + for (var i = 0; i < count; i++) + { + var kp = arr[i]; + if (i + 1 != count && ColumnsAreEqual(kp.Value, arr[i + 1].Value)) continue; + + var newColumn = (Column)kp.Value.CloneNode(true); + newColumn.Min = lastMin; + var newColumnMax = newColumn.Max.Value; + var columnsToRemove = + columns.Elements().Where(co => co.Min >= lastMin && co.Max <= newColumnMax). + Select(co => co).ToList(); + columnsToRemove.ForEach(c => columns.RemoveChild(c)); + + columns.AppendChild(newColumn); + lastMin = kp.Key + 1; + //i++; + } + } + + private static double GetColumnWidth(double columnWidth) + { + return Math.Min(255.0, Math.Max(0.0, columnWidth + ColumnWidthOffset)); + } + + private static void UpdateColumn(Column column, Columns columns, Dictionary sheetColumnsByMin) + { + if (!sheetColumnsByMin.TryGetValue(column.Min.Value, out Column newColumn)) + { + newColumn = (Column)column.CloneNode(true); + columns.AppendChild(newColumn); + sheetColumnsByMin.Add(column.Min.Value, newColumn); + } + else + { + var existingColumn = sheetColumnsByMin[column.Min.Value]; + newColumn = (Column)existingColumn.CloneNode(true); + newColumn.Min = column.Min; + newColumn.Max = column.Max; + newColumn.Style = column.Style; + newColumn.Width = column.Width.SaveRound(); + newColumn.CustomWidth = column.CustomWidth; + + if (column.Hidden != null) + newColumn.Hidden = true; + else + newColumn.Hidden = null; + + if (column.Collapsed != null) + newColumn.Collapsed = true; + else + newColumn.Collapsed = null; + + if (column.OutlineLevel != null && column.OutlineLevel > 0) + newColumn.OutlineLevel = (byte)column.OutlineLevel; + else + newColumn.OutlineLevel = null; + + sheetColumnsByMin.Remove(column.Min.Value); + if (existingColumn.Min + 1 > existingColumn.Max) + { + //existingColumn.Min = existingColumn.Min + 1; + //columns.InsertBefore(existingColumn, newColumn); + //existingColumn.Remove(); + columns.RemoveChild(existingColumn); + columns.AppendChild(newColumn); + sheetColumnsByMin.Add(newColumn.Min.Value, newColumn); + } + else + { + //columns.InsertBefore(existingColumn, newColumn); + columns.AppendChild(newColumn); + sheetColumnsByMin.Add(newColumn.Min.Value, newColumn); + existingColumn.Min = existingColumn.Min + 1; + sheetColumnsByMin.Add(existingColumn.Min.Value, existingColumn); + } + } + } + + private static bool ColumnsAreEqual(Column left, Column right) + { + return + ((left.Style == null && right.Style == null) + || (left.Style != null && right.Style != null && left.Style.Value == right.Style.Value)) + && ((left.Width == null && right.Width == null) + || (left.Width != null && right.Width != null && (Math.Abs(left.Width.Value - right.Width.Value) < XLHelper.Epsilon))) + && ((left.Hidden == null && right.Hidden == null) + || (left.Hidden != null && right.Hidden != null && left.Hidden.Value == right.Hidden.Value)) + && ((left.Collapsed == null && right.Collapsed == null) + || + (left.Collapsed != null && right.Collapsed != null && left.Collapsed.Value == right.Collapsed.Value)) + && ((left.OutlineLevel == null && right.OutlineLevel == null) + || + (left.OutlineLevel != null && right.OutlineLevel != null && + left.OutlineLevel.Value == right.OutlineLevel.Value)); + } + + #endregion GenerateWorksheetPartContent + } +} diff --git a/ClosedXML/Excel/XLWorksheet.cs b/ClosedXML/Excel/XLWorksheet.cs new file mode 100644 index 0000000..5a27ad2 --- /dev/null +++ b/ClosedXML/Excel/XLWorksheet.cs @@ -0,0 +1,1986 @@ +using ClosedXML.Excel.Caching; +using ClosedXML.Excel.CalcEngine; +using ClosedXML.Excel.Drawings; +using ClosedXML.Excel.Ranges.Index; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using static ClosedXML.Excel.XLProtectionAlgorithm; + +namespace ClosedXML.Excel +{ + internal class XLWorksheet : XLRangeBase, IXLWorksheet + { + #region Fields + + private readonly Dictionary _columnOutlineCount = new Dictionary(); + private readonly Dictionary _rowOutlineCount = new Dictionary(); + private readonly XLRangeFactory _rangeFactory; + private readonly XLRangeRepository _rangeRepository; + private readonly List _rangeIndices; + internal Int32 ZOrder = 1; + private String _name; + internal Int32 _position; + + private Double _rowHeight; + private Boolean _tabActive; + private XLSheetProtection _protection; + internal Boolean EventTrackingEnabled; + + /// + /// Fake address to be used everywhere the invalid address is needed. + /// + internal readonly XLAddress InvalidAddress; + + #endregion Fields + + #region Constructor + + public XLWorksheet(String sheetName, XLWorkbook workbook) + : base( + new XLRangeAddress( + new XLAddress(null, XLHelper.MinRowNumber, XLHelper.MinColumnNumber, false, false), + new XLAddress(null, XLHelper.MaxRowNumber, XLHelper.MaxColumnNumber, false, false)), + (workbook.Style as XLStyle).Value) + { + EventTrackingEnabled = workbook.EventTracking == XLEventTracking.Enabled; + + Workbook = workbook; + InvalidAddress = new XLAddress(this, 0, 0, false, false); + + var firstAddress = new XLAddress(this, RangeAddress.FirstAddress.RowNumber, RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.FirstAddress.FixedRow, RangeAddress.FirstAddress.FixedColumn); + var lastAddress = new XLAddress(this, RangeAddress.LastAddress.RowNumber, RangeAddress.LastAddress.ColumnNumber, + RangeAddress.LastAddress.FixedRow, RangeAddress.LastAddress.FixedColumn); + RangeAddress = new XLRangeAddress(firstAddress, lastAddress); + _rangeFactory = new XLRangeFactory(this); + _rangeRepository = new XLRangeRepository(workbook, _rangeFactory.Create); + _rangeIndices = new List(); + + Pictures = new XLPictures(this); + NamedRanges = new XLNamedRanges(this); + SheetView = new XLSheetView(this); + Tables = new XLTables(); + Hyperlinks = new XLHyperlinks(); + DataValidations = new XLDataValidations(this); + PivotTables = new XLPivotTables(this); + Protection = new XLSheetProtection(DefaultProtectionAlgorithm); + AutoFilter = new XLAutoFilter(); + ConditionalFormats = new XLConditionalFormats(); + SparklineGroups = new XLSparklineGroups(this); + Internals = new XLWorksheetInternals(new XLCellsCollection(), new XLColumnsCollection(), + new XLRowsCollection(), new XLRanges()); + PageSetup = new XLPageSetup((XLPageSetup)workbook.PageOptions, this); + Outline = new XLOutline(workbook.Outline); + _columnWidth = workbook.ColumnWidth; + _rowHeight = workbook.RowHeight; + RowHeightChanged = Math.Abs(workbook.RowHeight - XLWorkbook.DefaultRowHeight) > XLHelper.Epsilon; + Name = sheetName; + Charts = new XLCharts(); + ShowFormulas = workbook.ShowFormulas; + ShowGridLines = workbook.ShowGridLines; + ShowOutlineSymbols = workbook.ShowOutlineSymbols; + ShowRowColHeaders = workbook.ShowRowColHeaders; + ShowRuler = workbook.ShowRuler; + ShowWhiteSpace = workbook.ShowWhiteSpace; + ShowZeros = workbook.ShowZeros; + RightToLeft = workbook.RightToLeft; + TabColor = XLColor.NoColor; + SelectedRanges = new XLRanges(); + + Author = workbook.Author; + } + + #endregion Constructor + + public override XLRangeType RangeType + { + get { return XLRangeType.Worksheet; } + } + + //private IXLStyle _style; + private const String InvalidNameChars = @":\/?*[]"; + + public string LegacyDrawingId; + public Boolean LegacyDrawingIsNew; + private Double _columnWidth; + + public XLWorksheetInternals Internals { get; private set; } + + public XLRangeFactory RangeFactory + { + get { return _rangeFactory; } + } + + public override IEnumerable Styles + { + get + { + yield return GetStyle(); + foreach (XLCell c in Internals.CellsCollection.GetCells()) + yield return c.Style; + } + } + + protected override IEnumerable Children + { + get + { + var columnsUsed = Internals.ColumnsCollection.Keys + .Union(Internals.CellsCollection.ColumnsUsed.Keys) + .Distinct() + .OrderBy(c => c) + .ToList(); + foreach (var col in columnsUsed) + yield return Column(col); + + var rowsUsed = Internals.RowsCollection.Keys + .Union(Internals.CellsCollection.RowsUsed.Keys) + .Distinct() + .OrderBy(r => r) + .ToList(); + foreach (var row in rowsUsed) + yield return Row(row); + } + } + + internal Boolean RowHeightChanged { get; set; } + + internal Boolean ColumnWidthChanged { get; set; } + + public Int32 SheetId { get; set; } + + internal String RelId { get; set; } + + public XLDataValidations DataValidations { get; private set; } + + public IXLCharts Charts { get; private set; } + + public XLSheetProtection Protection + { + get => _protection; + set + { + _protection = value.Clone().CastTo(); + } + } + + public XLAutoFilter AutoFilter { get; private set; } + + public bool IsDeleted { get; private set; } + + #region IXLWorksheet Members + + public XLWorkbook Workbook { get; private set; } + + public Double ColumnWidth + { + get { return _columnWidth; } + set + { + ColumnWidthChanged = true; + _columnWidth = value; + } + } + + public Double RowHeight + { + get { return _rowHeight; } + set + { + RowHeightChanged = true; + _rowHeight = value; + } + } + + public String Name + { + get { return _name; } + set + { + if (_name == value) return; + + if (String.IsNullOrWhiteSpace(value)) + throw new ArgumentException("Worksheet names cannot be empty"); + + if (value.IndexOfAny(InvalidNameChars.ToCharArray()) != -1) + throw new ArgumentException("Worksheet names cannot contain any of the following characters: " + + InvalidNameChars); + + if (value.Length > 31) + throw new ArgumentException("Worksheet names cannot be more than 31 characters"); + + if (value.StartsWith("'", StringComparison.Ordinal)) + throw new ArgumentException("Worksheet names cannot start with an apostrophe"); + + if (value.EndsWith("'", StringComparison.Ordinal)) + throw new ArgumentException("Worksheet names cannot end with an apostrophe"); + + Workbook.WorksheetsInternal.Rename(_name, value); + _name = value; + } + } + + public Int32 Position + { + get { return _position; } + set + { + if (value > Workbook.WorksheetsInternal.Count + Workbook.UnsupportedSheets.Count + 1) + throw new ArgumentOutOfRangeException(nameof(value), "Index must be equal or less than the number of worksheets + 1."); + + if (value < _position) + { + Workbook.WorksheetsInternal + .Where(w => w.Position >= value && w.Position < _position) + .ForEach(w => w._position += 1); + } + + if (value > _position) + { + Workbook.WorksheetsInternal + .Where(w => w.Position <= value && w.Position > _position) + .ForEach(w => (w)._position -= 1); + } + + _position = value; + } + } + + public IXLPageSetup PageSetup { get; private set; } + + public IXLOutline Outline { get; private set; } + + IXLRow IXLWorksheet.FirstRowUsed() + { + return FirstRowUsed(); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRow IXLWorksheet.FirstRowUsed(Boolean includeFormats) + { + return FirstRowUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + IXLRow IXLWorksheet.FirstRowUsed(XLCellsUsedOptions options) + { + return FirstRowUsed(options); + } + + IXLRow IXLWorksheet.LastRowUsed() + { + return LastRowUsed(); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLRow IXLWorksheet.LastRowUsed(Boolean includeFormats) + { + return LastRowUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + IXLRow IXLWorksheet.LastRowUsed(XLCellsUsedOptions options) + { + return LastRowUsed(options); + } + + IXLColumn IXLWorksheet.LastColumn() + { + return LastColumn(); + } + + IXLColumn IXLWorksheet.FirstColumn() + { + return FirstColumn(); + } + + IXLRow IXLWorksheet.FirstRow() + { + return FirstRow(); + } + + IXLRow IXLWorksheet.LastRow() + { + return LastRow(); + } + + IXLColumn IXLWorksheet.FirstColumnUsed() + { + return FirstColumnUsed(); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLColumn IXLWorksheet.FirstColumnUsed(Boolean includeFormats) + { + return FirstColumnUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + IXLColumn IXLWorksheet.FirstColumnUsed(XLCellsUsedOptions options) + { + return FirstColumnUsed(options); + } + + IXLColumn IXLWorksheet.LastColumnUsed() + { + return LastColumnUsed(); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + IXLColumn IXLWorksheet.LastColumnUsed(Boolean includeFormats) + { + return LastColumnUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents); + } + + IXLColumn IXLWorksheet.LastColumnUsed(XLCellsUsedOptions options) + { + return LastColumnUsed(options); + } + + public IXLColumns Columns() + { + var retVal = new XLColumns(this, StyleValue); + var columnList = new List(); + + if (Internals.CellsCollection.Count > 0) + columnList.AddRange(Internals.CellsCollection.ColumnsUsed.Keys); + + if (Internals.ColumnsCollection.Count > 0) + columnList.AddRange(Internals.ColumnsCollection.Keys.Where(c => !columnList.Contains(c))); + + foreach (int c in columnList) + retVal.Add(Column(c)); + + return retVal; + } + + public IXLColumns Columns(String columns) + { + var retVal = new XLColumns(null, StyleValue); + var columnPairs = columns.Split(','); + foreach (string tPair in columnPairs.Select(pair => pair.Trim())) + { + String firstColumn; + String lastColumn; + if (tPair.Contains(':') || tPair.Contains('-')) + { + var columnRange = XLHelper.SplitRange(tPair); + firstColumn = columnRange[0]; + lastColumn = columnRange[1]; + } + else + { + firstColumn = tPair; + lastColumn = tPair; + } + + if (Int32.TryParse(firstColumn, out int tmp)) + { + foreach (IXLColumn col in Columns(Int32.Parse(firstColumn), Int32.Parse(lastColumn))) + retVal.Add((XLColumn)col); + } + else + { + foreach (IXLColumn col in Columns(firstColumn, lastColumn)) + retVal.Add((XLColumn)col); + } + } + return retVal; + } + + public IXLColumns Columns(String firstColumn, String lastColumn) + { + return Columns(XLHelper.GetColumnNumberFromLetter(firstColumn), + XLHelper.GetColumnNumberFromLetter(lastColumn)); + } + + public IXLColumns Columns(Int32 firstColumn, Int32 lastColumn) + { + var retVal = new XLColumns(null, StyleValue); + + for (int co = firstColumn; co <= lastColumn; co++) + retVal.Add(Column(co)); + return retVal; + } + + public IXLRows Rows() + { + var retVal = new XLRows(this, StyleValue); + var rowList = new List(); + + if (Internals.CellsCollection.Count > 0) + rowList.AddRange(Internals.CellsCollection.RowsUsed.Keys); + + if (Internals.RowsCollection.Count > 0) + rowList.AddRange(Internals.RowsCollection.Keys.Where(r => !rowList.Contains(r))); + + foreach (int r in rowList) + retVal.Add(Row(r)); + + return retVal; + } + + public IXLRows Rows(String rows) + { + var retVal = new XLRows(null, StyleValue); + var rowPairs = rows.Split(','); + foreach (string tPair in rowPairs.Select(pair => pair.Trim())) + { + String firstRow; + String lastRow; + if (tPair.Contains(':') || tPair.Contains('-')) + { + var rowRange = XLHelper.SplitRange(tPair); + firstRow = rowRange[0]; + lastRow = rowRange[1]; + } + else + { + firstRow = tPair; + lastRow = tPair; + } + + Rows(Int32.Parse(firstRow), Int32.Parse(lastRow)) + .ForEach(row => retVal.Add((XLRow)row)); + } + return retVal; + } + + public IXLRows Rows(Int32 firstRow, Int32 lastRow) + { + var retVal = new XLRows(null, StyleValue); + + for (int ro = firstRow; ro <= lastRow; ro++) + retVal.Add(Row(ro)); + return retVal; + } + + IXLRow IXLWorksheet.Row(Int32 row) + { + return Row(row); + } + + IXLColumn IXLWorksheet.Column(Int32 column) + { + return Column(column); + } + + IXLColumn IXLWorksheet.Column(String column) + { + return Column(column); + } + + IXLCell IXLWorksheet.Cell(int row, int column) + { + return Cell(row, column); + } + + IXLCell IXLWorksheet.Cell(string cellAddressInRange) + { + return Cell(cellAddressInRange); + } + + IXLCell IXLWorksheet.Cell(int row, string column) + { + return Cell(row, column); + } + + IXLCell IXLWorksheet.Cell(IXLAddress cellAddressInRange) + { + return Cell(cellAddressInRange); + } + + IXLRange IXLWorksheet.Range(IXLRangeAddress rangeAddress) + { + return Range(rangeAddress); + } + + IXLRange IXLWorksheet.Range(string rangeAddress) + { + return Range(rangeAddress); + } + + IXLRange IXLWorksheet.Range(IXLCell firstCell, IXLCell lastCell) + { + return Range(firstCell, lastCell); + } + + IXLRange IXLWorksheet.Range(string firstCellAddress, string lastCellAddress) + { + return Range(firstCellAddress, lastCellAddress); + } + + IXLRange IXLWorksheet.Range(IXLAddress firstCellAddress, IXLAddress lastCellAddress) + { + return Range(firstCellAddress, lastCellAddress); + } + + IXLRange IXLWorksheet.Range(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn) + { + return Range(firstCellRow, firstCellColumn, lastCellRow, lastCellColumn); + } + + public IXLWorksheet CollapseRows() + { + Enumerable.Range(1, 8).ForEach(i => CollapseRows(i)); + return this; + } + + public IXLWorksheet CollapseColumns() + { + Enumerable.Range(1, 8).ForEach(i => CollapseColumns(i)); + return this; + } + + public IXLWorksheet ExpandRows() + { + Enumerable.Range(1, 8).ForEach(i => ExpandRows(i)); + return this; + } + + public IXLWorksheet ExpandColumns() + { + Enumerable.Range(1, 8).ForEach(i => ExpandColumns(i)); + return this; + } + + public IXLWorksheet CollapseRows(Int32 outlineLevel) + { + if (outlineLevel < 1 || outlineLevel > 8) + throw new ArgumentOutOfRangeException("outlineLevel", "Outline level must be between 1 and 8."); + + Internals.RowsCollection.Values.Where(r => r.OutlineLevel == outlineLevel).ForEach(r => r.Collapse()); + return this; + } + + public IXLWorksheet CollapseColumns(Int32 outlineLevel) + { + if (outlineLevel < 1 || outlineLevel > 8) + throw new ArgumentOutOfRangeException("outlineLevel", "Outline level must be between 1 and 8."); + + Internals.ColumnsCollection.Values.Where(c => c.OutlineLevel == outlineLevel).ForEach(c => c.Collapse()); + return this; + } + + public IXLWorksheet ExpandRows(Int32 outlineLevel) + { + if (outlineLevel < 1 || outlineLevel > 8) + throw new ArgumentOutOfRangeException("outlineLevel", "Outline level must be between 1 and 8."); + + Internals.RowsCollection.Values.Where(r => r.OutlineLevel == outlineLevel).ForEach(r => r.Expand()); + return this; + } + + public IXLWorksheet ExpandColumns(Int32 outlineLevel) + { + if (outlineLevel < 1 || outlineLevel > 8) + throw new ArgumentOutOfRangeException("outlineLevel", "Outline level must be between 1 and 8."); + + Internals.ColumnsCollection.Values.Where(c => c.OutlineLevel == outlineLevel).ForEach(c => c.Expand()); + return this; + } + + public void Delete() + { + IsDeleted = true; + (Workbook.NamedRanges as XLNamedRanges).OnWorksheetDeleted(Name); + Workbook.WorksheetsInternal.Delete(Name); + } + + public IXLNamedRanges NamedRanges { get; private set; } + + public IXLNamedRange NamedRange(String rangeName) + { + return NamedRanges.NamedRange(rangeName); + } + + IXLSheetView IXLWorksheet.SheetView { get => SheetView; } + + public XLSheetView SheetView { get; private set; } + + public IXLTables Tables { get; private set; } + + public IXLTable Table(Int32 index) + { + return Tables.Table(index); + } + + public IXLTable Table(String name) + { + return Tables.Table(name); + } + + public IXLWorksheet CopyTo(String newSheetName) + { + return CopyTo(Workbook, newSheetName, Workbook.WorksheetsInternal.Count + 1); + } + + public IXLWorksheet CopyTo(String newSheetName, Int32 position) + { + return CopyTo(Workbook, newSheetName, position); + } + + public IXLWorksheet CopyTo(XLWorkbook workbook, String newSheetName) + { + return CopyTo(workbook, newSheetName, workbook.WorksheetsInternal.Count + 1); + } + + public IXLWorksheet CopyTo(XLWorkbook workbook, String newSheetName, Int32 position) + { + if (this.IsDeleted) + throw new InvalidOperationException($"`{this.Name}` has been deleted and cannot be copied."); + + var targetSheet = (XLWorksheet)workbook.WorksheetsInternal.Add(newSheetName, position); + Internals.ColumnsCollection.ForEach(kp => kp.Value.CopyTo(targetSheet.Column(kp.Key))); + Internals.RowsCollection.ForEach(kp => kp.Value.CopyTo(targetSheet.Row(kp.Key))); + Internals.CellsCollection.GetCells().ForEach(c => targetSheet.Cell(c.Address).CopyFrom(c, XLCellCopyOptions.Values | XLCellCopyOptions.Styles)); + DataValidations.ForEach(dv => targetSheet.DataValidations.Add(new XLDataValidation(dv, this))); + targetSheet.Visibility = Visibility; + targetSheet.ColumnWidth = ColumnWidth; + targetSheet.ColumnWidthChanged = ColumnWidthChanged; + targetSheet.RowHeight = RowHeight; + targetSheet.RowHeightChanged = RowHeightChanged; + targetSheet.InnerStyle = InnerStyle; + targetSheet.PageSetup = new XLPageSetup((XLPageSetup)PageSetup, targetSheet); + (targetSheet.PageSetup.Header as XLHeaderFooter).Changed = true; + (targetSheet.PageSetup.Footer as XLHeaderFooter).Changed = true; + targetSheet.Outline = new XLOutline(Outline); + targetSheet.SheetView = new XLSheetView(targetSheet, SheetView); + targetSheet.SelectedRanges.RemoveAll(); + + Pictures.ForEach(picture => picture.CopyTo(targetSheet)); + NamedRanges.ForEach(nr => nr.CopyTo(targetSheet)); + Tables.Cast().ForEach(t => t.CopyTo(targetSheet, false)); + ConditionalFormats.ForEach(cf => cf.CopyTo(targetSheet)); + SparklineGroups.CopyTo(targetSheet); + MergedRanges.ForEach(mr => targetSheet.Range(((XLRangeAddress)mr.RangeAddress).WithoutWorksheet()).Merge()); + SelectedRanges.ForEach(sr => targetSheet.SelectedRanges.Add(targetSheet.Range(((XLRangeAddress)sr.RangeAddress).WithoutWorksheet()))); + + if (AutoFilter.IsEnabled) + { + var range = targetSheet.Range(((XLRangeAddress)AutoFilter.Range.RangeAddress).WithoutWorksheet()); + range.SetAutoFilter(); + } + + return targetSheet; + } + + public new IXLHyperlinks Hyperlinks { get; private set; } + + IXLDataValidations IXLWorksheet.DataValidations + { + get { return DataValidations; } + } + + private XLWorksheetVisibility _visibility; + + public XLWorksheetVisibility Visibility + { + get { return _visibility; } + set + { + if (value != XLWorksheetVisibility.Visible) + TabSelected = false; + + _visibility = value; + } + } + + public IXLWorksheet Hide() + { + Visibility = XLWorksheetVisibility.Hidden; + return this; + } + + public IXLWorksheet Unhide() + { + Visibility = XLWorksheetVisibility.Visible; + return this; + } + + IXLSheetProtection IXLProtectable.Protection + { + get => Protection; + set => Protection = value as XLSheetProtection; + } + + public IXLSheetProtection Protect() + { + return Protection.Protect(); + } + + public IXLSheetProtection Protect(String password, Algorithm algorithm = DefaultProtectionAlgorithm) + { + return Protection.Protect(password, algorithm, XLSheetProtectionElements.SelectEverything); + } + + public IXLSheetProtection Protect(String password, Algorithm algorithm, XLSheetProtectionElements allowedElements) + { + return Protection.Protect(password, algorithm, allowedElements); + } + + IXLElementProtection IXLProtectable.Protect() + { + return Protect(); + } + + IXLElementProtection IXLProtectable.Protect(String password, Algorithm algorithm) + { + return Protect(password, algorithm); + } + + public IXLSheetProtection Unprotect() + { + return Protection.Unprotect(); + } + + public IXLSheetProtection Unprotect(String password) + { + return Protection.Unprotect(password); + } + + IXLElementProtection IXLProtectable.Unprotect() + { + return Unprotect(); + } + + IXLElementProtection IXLProtectable.Unprotect(String password) + { + return Unprotect(password); + } + + public new IXLRange Sort() + { + return GetRangeForSort().Sort(); + } + + public new IXLRange Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, + Boolean matchCase = false, Boolean ignoreBlanks = true) + { + return GetRangeForSort().Sort(columnsToSortBy, sortOrder, matchCase, ignoreBlanks); + } + + public new IXLRange Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, + Boolean matchCase = false, Boolean ignoreBlanks = true) + { + return GetRangeForSort().Sort(columnToSortBy, sortOrder, matchCase, ignoreBlanks); + } + + public new IXLRange SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, + Boolean ignoreBlanks = true) + { + return GetRangeForSort().SortLeftToRight(sortOrder, matchCase, ignoreBlanks); + } + + public Boolean ShowFormulas { get; set; } + + public Boolean ShowGridLines { get; set; } + + public Boolean ShowOutlineSymbols { get; set; } + + public Boolean ShowRowColHeaders { get; set; } + + public Boolean ShowRuler { get; set; } + + public Boolean ShowWhiteSpace { get; set; } + + public Boolean ShowZeros { get; set; } + + public IXLWorksheet SetShowFormulas() + { + ShowFormulas = true; + return this; + } + + public IXLWorksheet SetShowFormulas(Boolean value) + { + ShowFormulas = value; + return this; + } + + public IXLWorksheet SetShowGridLines() + { + ShowGridLines = true; + return this; + } + + public IXLWorksheet SetShowGridLines(Boolean value) + { + ShowGridLines = value; + return this; + } + + public IXLWorksheet SetShowOutlineSymbols() + { + ShowOutlineSymbols = true; + return this; + } + + public IXLWorksheet SetShowOutlineSymbols(Boolean value) + { + ShowOutlineSymbols = value; + return this; + } + + public IXLWorksheet SetShowRowColHeaders() + { + ShowRowColHeaders = true; + return this; + } + + public IXLWorksheet SetShowRowColHeaders(Boolean value) + { + ShowRowColHeaders = value; + return this; + } + + public IXLWorksheet SetShowRuler() + { + ShowRuler = true; + return this; + } + + public IXLWorksheet SetShowRuler(Boolean value) + { + ShowRuler = value; + return this; + } + + public IXLWorksheet SetShowWhiteSpace() + { + ShowWhiteSpace = true; + return this; + } + + public IXLWorksheet SetShowWhiteSpace(Boolean value) + { + ShowWhiteSpace = value; + return this; + } + + public IXLWorksheet SetShowZeros() + { + ShowZeros = true; + return this; + } + + public IXLWorksheet SetShowZeros(Boolean value) + { + ShowZeros = value; + return this; + } + + public XLColor TabColor { get; set; } + + public IXLWorksheet SetTabColor(XLColor color) + { + TabColor = color; + return this; + } + + public Boolean TabSelected { get; set; } + + public Boolean TabActive + { + get { return _tabActive; } + set + { + if (value && !_tabActive) + { + foreach (XLWorksheet ws in Worksheet.Workbook.WorksheetsInternal) + ws._tabActive = false; + } + _tabActive = value; + } + } + + public IXLWorksheet SetTabSelected() + { + TabSelected = true; + return this; + } + + public IXLWorksheet SetTabSelected(Boolean value) + { + TabSelected = value; + return this; + } + + public IXLWorksheet SetTabActive() + { + TabActive = true; + return this; + } + + public IXLWorksheet SetTabActive(Boolean value) + { + TabActive = value; + return this; + } + + IXLPivotTable IXLWorksheet.PivotTable(String name) + { + return PivotTable(name); + } + + public IXLPivotTables PivotTables { get; private set; } + + public Boolean RightToLeft { get; set; } + + public IXLWorksheet SetRightToLeft() + { + RightToLeft = true; + return this; + } + + public IXLWorksheet SetRightToLeft(Boolean value) + { + RightToLeft = value; + return this; + } + + public override IXLRanges Ranges(String ranges) + { + var retVal = new XLRanges(); + foreach (string rangeAddressStr in ranges.Split(',').Select(s => s.Trim())) + { + if (rangeAddressStr.StartsWith("#REF!")) + { + continue; + } + else if (XLHelper.IsValidRangeAddress(rangeAddressStr)) + { + retVal.Add(Range(new XLRangeAddress(Worksheet, rangeAddressStr))); + } + else if (NamedRanges.TryGetValue(rangeAddressStr, out IXLNamedRange worksheetNamedRange)) + { + worksheetNamedRange.Ranges.ForEach(retVal.Add); + } + else if (Workbook.NamedRanges.TryGetValue(rangeAddressStr, out IXLNamedRange workbookNamedRange) + && workbookNamedRange.Ranges.First().Worksheet == this) + { + workbookNamedRange.Ranges.ForEach(retVal.Add); + } + } + return retVal; + } + + IXLAutoFilter IXLWorksheet.AutoFilter + { + get { return AutoFilter; } + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public IXLRows RowsUsed(Boolean includeFormats, Func predicate = null) + { + return RowsUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents, + predicate); + } + + public IXLRows RowsUsed(XLCellsUsedOptions options = XLCellsUsedOptions.AllContents, Func predicate = null) + { + var rows = new XLRows(Worksheet, StyleValue); + var rowsUsed = new HashSet(); + Internals.RowsCollection.Keys.ForEach(r => rowsUsed.Add(r)); + Internals.CellsCollection.RowsUsed.Keys.ForEach(r => rowsUsed.Add(r)); + foreach (var rowNum in rowsUsed) + { + var row = Row(rowNum); + if (!row.IsEmpty(options) && (predicate == null || predicate(row))) + rows.Add(row); + } + return rows; + } + + public IXLRows RowsUsed(Func predicate = null) + { + return RowsUsed(XLCellsUsedOptions.AllContents, predicate); + } + + [Obsolete("Use the overload with XLCellsUsedOptions")] + public IXLColumns ColumnsUsed(Boolean includeFormats, Func predicate = null) + { + return ColumnsUsed(includeFormats + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents, + predicate); + } + + public IXLColumns ColumnsUsed(XLCellsUsedOptions options = XLCellsUsedOptions.AllContents, Func predicate = null) + { + var columns = new XLColumns(Worksheet, StyleValue); + var columnsUsed = new HashSet(); + Internals.ColumnsCollection.Keys.ForEach(r => columnsUsed.Add(r)); + Internals.CellsCollection.ColumnsUsed.Keys.ForEach(r => columnsUsed.Add(r)); + foreach (var columnNum in columnsUsed) + { + var column = Column(columnNum); + if (!column.IsEmpty(options) && (predicate == null || predicate(column))) + columns.Add(column); + } + return columns; + } + + public IXLColumns ColumnsUsed(Func predicate = null) + { + return ColumnsUsed(XLCellsUsedOptions.AllContents, predicate); + } + + internal void RegisterRangeIndex(IXLRangeIndex rangeIndex) + { + _rangeIndices.Add(rangeIndex); + } + + internal void Cleanup() + { + Internals.Dispose(); + Pictures.ForEach(p => p.Dispose()); + _rangeRepository.Clear(); + _rangeIndices.Clear(); + } + + #endregion IXLWorksheet Members + + #region Outlines + + public void IncrementColumnOutline(Int32 level) + { + if (level <= 0) return; + if (_columnOutlineCount.TryGetValue(level, out Int32 value)) + _columnOutlineCount[level] = value + 1; + else + _columnOutlineCount.Add(level, 1); + } + + public void DecrementColumnOutline(Int32 level) + { + if (level <= 0) return; + if (_columnOutlineCount.TryGetValue(level, out Int32 value)) + { + if (value > 0) + _columnOutlineCount[level] = value - 1; + } + else + _columnOutlineCount.Add(level, 0); + } + + public Int32 GetMaxColumnOutline() + { + var list = _columnOutlineCount.Where(kp => kp.Value > 0).ToList(); + return list.Count == 0 ? 0 : list.Max(kp => kp.Key); + } + + public void IncrementRowOutline(Int32 level) + { + if (level <= 0) return; + if (_rowOutlineCount.TryGetValue(level, out Int32 value)) + _rowOutlineCount[level] = value + 1; + else + _rowOutlineCount.Add(level, 0); + } + + public void DecrementRowOutline(Int32 level) + { + if (level <= 0) return; + if (_rowOutlineCount.TryGetValue(level, out Int32 value)) + { + if (value > 0) + _rowOutlineCount[level] = level - 1; + } + else + _rowOutlineCount.Add(level, 0); + } + + public Int32 GetMaxRowOutline() + { + return _rowOutlineCount.Count == 0 ? 0 : _rowOutlineCount.Where(kp => kp.Value > 0).Max(kp => kp.Key); + } + + #endregion Outlines + + public XLRow FirstRowUsed() + { + return FirstRowUsed(XLCellsUsedOptions.AllContents); + } + + public XLRow FirstRowUsed(XLCellsUsedOptions options) + { + var rngRow = AsRange().FirstRowUsed(options); + return rngRow != null ? Row(rngRow.RangeAddress.FirstAddress.RowNumber) : null; + } + + public XLRow LastRowUsed() + { + return LastRowUsed(XLCellsUsedOptions.AllContents); + } + + public XLRow LastRowUsed(XLCellsUsedOptions options) + { + var rngRow = AsRange().LastRowUsed(options); + return rngRow != null ? Row(rngRow.RangeAddress.LastAddress.RowNumber) : null; + } + + public XLColumn LastColumn() + { + return Column(XLHelper.MaxColumnNumber); + } + + public XLColumn FirstColumn() + { + return Column(1); + } + + public XLRow FirstRow() + { + return Row(1); + } + + public XLRow LastRow() + { + return Row(XLHelper.MaxRowNumber); + } + + public XLColumn FirstColumnUsed() + { + return FirstColumnUsed(XLCellsUsedOptions.AllContents); + } + + public XLColumn FirstColumnUsed(XLCellsUsedOptions options) + { + var rngColumn = AsRange().FirstColumnUsed(options); + return rngColumn != null ? Column(rngColumn.RangeAddress.FirstAddress.ColumnNumber) : null; + } + + public XLColumn LastColumnUsed() + { + return LastColumnUsed(XLCellsUsedOptions.AllContents); + } + + public XLColumn LastColumnUsed(XLCellsUsedOptions options) + { + var rngColumn = AsRange().LastColumnUsed(options); + return rngColumn != null ? Column(rngColumn.RangeAddress.LastAddress.ColumnNumber) : null; + } + + public XLRow Row(Int32 row) + { + return Row(row, true); + } + + public XLColumn Column(Int32 columnNumber) + { + if (columnNumber <= 0 || columnNumber > XLHelper.MaxColumnNumber) + throw new ArgumentOutOfRangeException(nameof(columnNumber), $"Column number must be between 1 and {XLHelper.MaxColumnNumber}"); + + if (Internals.ColumnsCollection.TryGetValue(columnNumber, out XLColumn column)) + return column; + else + { + // This is a new column so we're going to reference all + // cells in this column to preserve their formatting + Internals.RowsCollection.Keys.ForEach(r => Cell(r, columnNumber)); + + column = RangeFactory.CreateColumn(columnNumber); + Internals.ColumnsCollection.Add(columnNumber, column); + } + + return column; + } + + public IXLColumn Column(String column) + { + return Column(XLHelper.GetColumnNumberFromLetter(column)); + } + + public override XLRange AsRange() + { + return Range(1, 1, XLHelper.MaxRowNumber, XLHelper.MaxColumnNumber); + } + + internal override void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted) + { + if (!range.IsEntireColumn()) + { + var model = new XLRangeAddress( + range.RangeAddress.FirstAddress, + new XLAddress(range.RangeAddress.LastAddress.RowNumber, XLHelper.MaxColumnNumber, false, false)); + var rangesToSplit = Worksheet.MergedRanges + .GetIntersectedRanges(model) + .Where(r => r.RangeAddress.FirstAddress.RowNumber < range.RangeAddress.FirstAddress.RowNumber || + r.RangeAddress.LastAddress.RowNumber > range.RangeAddress.LastAddress.RowNumber) + .ToList(); + foreach (var rangeToSplit in rangesToSplit) + { + Worksheet.MergedRanges.Remove(rangeToSplit); + } + } + + Workbook.Worksheets.ForEach(ws => MoveNamedRangesColumns(range, columnsShifted, ws.NamedRanges)); + MoveNamedRangesColumns(range, columnsShifted, Workbook.NamedRanges); + ShiftConditionalFormattingColumns(range, columnsShifted); + ShiftDataValidationColumns(range, columnsShifted); + ShiftPageBreaksColumns(range, columnsShifted); + RemoveInvalidSparklines(); + } + + private void ShiftPageBreaksColumns(XLRange range, int columnsShifted) + { + for (var i = 0; i < PageSetup.ColumnBreaks.Count; i++) + { + int br = PageSetup.ColumnBreaks[i]; + if (range.RangeAddress.FirstAddress.ColumnNumber <= br) + { + PageSetup.ColumnBreaks[i] = br + columnsShifted; + } + } + } + + private void ShiftConditionalFormattingColumns(XLRange range, int columnsShifted) + { + if (!ConditionalFormats.Any()) return; + Int32 firstCol = range.RangeAddress.FirstAddress.ColumnNumber; + if (firstCol == 1) return; + + int colNum = columnsShifted > 0 ? firstCol - 1 : firstCol; + var model = Column(colNum).AsRange(); + + foreach (var cf in ConditionalFormats.ToList()) + { + var cfRanges = cf.Ranges.ToList(); + cf.Ranges.RemoveAll(); + + foreach (var cfRange in cfRanges) + { + var cfAddress = cfRange.RangeAddress; + IXLRange newRange; + if (cfRange.Intersects(model)) + { + newRange = Range(cfAddress.FirstAddress.RowNumber, + cfAddress.FirstAddress.ColumnNumber, + cfAddress.LastAddress.RowNumber, + Math.Min(XLHelper.MaxColumnNumber, cfAddress.LastAddress.ColumnNumber + columnsShifted)); + } + else if (cfAddress.FirstAddress.ColumnNumber >= firstCol) + { + newRange = Range(cfAddress.FirstAddress.RowNumber, + Math.Max(cfAddress.FirstAddress.ColumnNumber + columnsShifted, firstCol), + cfAddress.LastAddress.RowNumber, + Math.Min(XLHelper.MaxColumnNumber, cfAddress.LastAddress.ColumnNumber + columnsShifted)); + } + else + newRange = cfRange; + + if (newRange.RangeAddress.IsValid && + newRange.RangeAddress.FirstAddress.ColumnNumber <= + newRange.RangeAddress.LastAddress.ColumnNumber) + cf.Ranges.Add(newRange); + } + + if (!cf.Ranges.Any()) + ConditionalFormats.Remove(f => f == cf); + } + } + + private void ShiftDataValidationColumns(XLRange range, int columnsShifted) + { + if (!DataValidations.Any()) return; + Int32 firstCol = range.RangeAddress.FirstAddress.ColumnNumber; + if (firstCol == 1) return; + + int colNum = columnsShifted > 0 ? firstCol - 1 : firstCol; + var model = Column(colNum).AsRange(); + + foreach (var dv in DataValidations.ToList()) + { + var dvRanges = dv.Ranges.ToList(); + dv.ClearRanges(); + + foreach (var dvRange in dvRanges) + { + var dvAddress = dvRange.RangeAddress; + IXLRange newRange; + if (dvRange.Intersects(model)) + { + newRange = Range(dvAddress.FirstAddress.RowNumber, + dvAddress.FirstAddress.ColumnNumber, + dvAddress.LastAddress.RowNumber, + Math.Min(XLHelper.MaxColumnNumber, dvAddress.LastAddress.ColumnNumber + columnsShifted)); + } + else if (dvAddress.FirstAddress.ColumnNumber >= firstCol) + { + newRange = Range(dvAddress.FirstAddress.RowNumber, + Math.Max(dvAddress.FirstAddress.ColumnNumber + columnsShifted, firstCol), + dvAddress.LastAddress.RowNumber, + Math.Min(XLHelper.MaxColumnNumber, dvAddress.LastAddress.ColumnNumber + columnsShifted)); + } + else + newRange = dvRange; + + if (newRange.RangeAddress.IsValid && + newRange.RangeAddress.FirstAddress.ColumnNumber <= + newRange.RangeAddress.LastAddress.ColumnNumber) + dv.AddRange(newRange); + } + + if (!dv.Ranges.Any()) + DataValidations.Delete(v => v == dv); + } + } + + internal override void WorksheetRangeShiftedRows(XLRange range, int rowsShifted) + { + if (!range.IsEntireRow()) + { + var model = new XLRangeAddress( + range.RangeAddress.FirstAddress, + new XLAddress(XLHelper.MaxRowNumber, range.RangeAddress.LastAddress.ColumnNumber, false, false)); + var rangesToSplit = Worksheet.MergedRanges + .GetIntersectedRanges(model) + .Where(r => r.RangeAddress.FirstAddress.ColumnNumber < range.RangeAddress.FirstAddress.ColumnNumber || + r.RangeAddress.LastAddress.ColumnNumber > range.RangeAddress.LastAddress.ColumnNumber) + .ToList(); + foreach (var rangeToSplit in rangesToSplit) + { + Worksheet.MergedRanges.Remove(rangeToSplit); + } + } + + Workbook.Worksheets.ForEach(ws => MoveNamedRangesRows(range, rowsShifted, ws.NamedRanges)); + MoveNamedRangesRows(range, rowsShifted, Workbook.NamedRanges); + ShiftConditionalFormattingRows(range, rowsShifted); + ShiftDataValidationRows(range, rowsShifted); + RemoveInvalidSparklines(); + ShiftPageBreaksRows(range, rowsShifted); + } + + private void ShiftPageBreaksRows(XLRange range, int rowsShifted) + { + for (var i = 0; i < PageSetup.RowBreaks.Count; i++) + { + int br = PageSetup.RowBreaks[i]; + if (range.RangeAddress.FirstAddress.RowNumber <= br) + { + PageSetup.RowBreaks[i] = br + rowsShifted; + } + } + } + + private void ShiftConditionalFormattingRows(XLRange range, int rowsShifted) + { + if (!ConditionalFormats.Any()) return; + Int32 firstRow = range.RangeAddress.FirstAddress.RowNumber; + if (firstRow == 1) return; + + int rowNum = rowsShifted > 0 ? firstRow - 1 : firstRow; + var model = Row(rowNum).AsRange(); + + foreach (var cf in ConditionalFormats.ToList()) + { + var cfRanges = cf.Ranges.ToList(); + cf.Ranges.RemoveAll(); + + foreach (var cfRange in cfRanges) + { + var cfAddress = cfRange.RangeAddress; + IXLRange newRange; + if (cfRange.Intersects(model)) + { + newRange = Range(cfAddress.FirstAddress.RowNumber, + cfAddress.FirstAddress.ColumnNumber, + Math.Min(XLHelper.MaxRowNumber, cfAddress.LastAddress.RowNumber + rowsShifted), + cfAddress.LastAddress.ColumnNumber); + } + else if (cfAddress.FirstAddress.RowNumber >= firstRow) + { + newRange = Range(Math.Max(cfAddress.FirstAddress.RowNumber + rowsShifted, firstRow), + cfAddress.FirstAddress.ColumnNumber, + Math.Min(XLHelper.MaxRowNumber, cfAddress.LastAddress.RowNumber + rowsShifted), + cfAddress.LastAddress.ColumnNumber); + } + else + newRange = cfRange; + + if (newRange.RangeAddress.IsValid && + newRange.RangeAddress.FirstAddress.RowNumber <= newRange.RangeAddress.LastAddress.RowNumber) + cf.Ranges.Add(newRange); + } + + if (!cf.Ranges.Any()) + ConditionalFormats.Remove(f => f == cf); + } + } + + private void ShiftDataValidationRows(XLRange range, int rowsShifted) + { + if (!DataValidations.Any()) return; + Int32 firstRow = range.RangeAddress.FirstAddress.RowNumber; + if (firstRow == 1) return; + + int rowNum = rowsShifted > 0 ? firstRow - 1 : firstRow; + var model = Row(rowNum).AsRange(); + + foreach (var dv in DataValidations.ToList()) + { + var dvRanges = dv.Ranges.ToList(); + dv.ClearRanges(); + + foreach (var dvRange in dvRanges) + { + var dvAddress = dvRange.RangeAddress; + IXLRange newRange; + if (dvRange.Intersects(model)) + { + newRange = Range(dvAddress.FirstAddress.RowNumber, + dvAddress.FirstAddress.ColumnNumber, + Math.Min(XLHelper.MaxRowNumber, dvAddress.LastAddress.RowNumber + rowsShifted), + dvAddress.LastAddress.ColumnNumber); + } + else if (dvAddress.FirstAddress.RowNumber >= firstRow) + { + newRange = Range(Math.Max(dvAddress.FirstAddress.RowNumber + rowsShifted, firstRow), + dvAddress.FirstAddress.ColumnNumber, + Math.Min(XLHelper.MaxRowNumber, dvAddress.LastAddress.RowNumber + rowsShifted), + dvAddress.LastAddress.ColumnNumber); + } + else + newRange = dvRange; + + if (newRange.RangeAddress.IsValid && + newRange.RangeAddress.FirstAddress.RowNumber <= newRange.RangeAddress.LastAddress.RowNumber) + dv.AddRange(newRange); + } + + if (!dv.Ranges.Any()) + DataValidations.Delete(v => v == dv); + } + } + + private void RemoveInvalidSparklines() + { + var invalidSparklines = SparklineGroups.SelectMany(g => g) + .Where(sl => !((XLAddress)sl.Location.Address).IsValid) + .ToList(); + + foreach (var sparkline in invalidSparklines) + { + Worksheet.SparklineGroups.Remove(sparkline.Location); + } + } + + private void MoveNamedRangesRows(XLRange range, int rowsShifted, IXLNamedRanges namedRanges) + { + foreach (XLNamedRange nr in namedRanges) + { + var newRangeList = + nr.RangeList.Select(r => XLCell.ShiftFormulaRows(r, this, range, rowsShifted)).Where( + newReference => newReference.Length > 0).ToList(); + nr.RangeList = newRangeList; + } + } + + private void MoveNamedRangesColumns(XLRange range, int columnsShifted, IXLNamedRanges namedRanges) + { + foreach (XLNamedRange nr in namedRanges) + { + var newRangeList = + nr.RangeList.Select(r => XLCell.ShiftFormulaColumns(r, this, range, columnsShifted)).Where( + newReference => newReference.Length > 0).ToList(); + nr.RangeList = newRangeList; + } + } + + public void NotifyRangeShiftedRows(XLRange range, Int32 rowsShifted) + { + try + { + SuspendEvents(); + + var rangesToShift = _rangeRepository + .Where(r => r.RangeAddress.IsValid) + .OrderBy(r => r.RangeAddress.FirstAddress.RowNumber * -Math.Sign(rowsShifted)) + .ToList(); + + WorksheetRangeShiftedRows(range, rowsShifted); + + foreach (var storedRange in rangesToShift) + { + if (storedRange.IsEntireColumn()) + continue; + + if (ReferenceEquals(range, storedRange)) + continue; + + storedRange.WorksheetRangeShiftedRows(range, rowsShifted); + } + range.WorksheetRangeShiftedRows(range, rowsShifted); + } + finally + { + ResumeEvents(); + } + } + + public void NotifyRangeShiftedColumns(XLRange range, Int32 columnsShifted) + { + try + { + SuspendEvents(); + + var rangesToShift = _rangeRepository + .Where(r => r.RangeAddress.IsValid) + .OrderBy(r => r.RangeAddress.FirstAddress.ColumnNumber * -Math.Sign(columnsShifted)) + .ToList(); + + WorksheetRangeShiftedColumns(range, columnsShifted); + + foreach (var storedRange in rangesToShift) + { + if (storedRange.IsEntireRow()) + continue; + + if (ReferenceEquals(range, storedRange)) + continue; + + storedRange.WorksheetRangeShiftedColumns(range, columnsShifted); + } + range.WorksheetRangeShiftedColumns(range, columnsShifted); + } + finally + { + ResumeEvents(); + } + } + + public XLRow Row(Int32 rowNumber, Boolean pingCells) + { + if (rowNumber <= 0 || rowNumber > XLHelper.MaxRowNumber) + throw new ArgumentOutOfRangeException(nameof(rowNumber), $"Row number must be between 1 and {XLHelper.MaxRowNumber}"); + + if (Internals.RowsCollection.TryGetValue(rowNumber, out XLRow row)) + return row; + else + { + if (pingCells) + { + // This is a new row so we're going to reference all + // cells in columns of this row to preserve their formatting + + Internals.ColumnsCollection.Keys.ForEach(c => Cell(rowNumber, c)); + } + + row = RangeFactory.CreateRow(rowNumber); + Internals.RowsCollection.Add(rowNumber, row); + } + + return row; + } + + public IXLTable Table(XLRange range, Boolean addToTables, Boolean setAutofilter = true) + { + return Table(range, GetNewTableName("Table"), addToTables, setAutofilter); + } + + public IXLTable Table(XLRange range, String name, Boolean addToTables, Boolean setAutofilter = true) + { + CheckRangeNotOverlappingOtherEntities(range); + XLRangeAddress rangeAddress; + if (range.Rows().Count() == 1) + { + rangeAddress = new XLRangeAddress(range.FirstCell().Address, range.LastCell().CellBelow().Address); + range.InsertRowsBelow(1); + } + else + rangeAddress = range.RangeAddress; + + var rangeKey = new XLRangeKey(XLRangeType.Table, rangeAddress); + var table = (XLTable)_rangeRepository.GetOrCreate(ref rangeKey); + + if (table.Name != name) + table.Name = name; + + if (addToTables && !Tables.Contains(table)) + { + Tables.Add(table); + } + + if (setAutofilter && !table.ShowAutoFilter) + table.InitializeAutoFilter(); + + return table; + } + + private void CheckRangeNotOverlappingOtherEntities(XLRange range) + { + // Check that the range doesn't overlap with any existing tables + var firstOverlappingTable = Tables.FirstOrDefault(t => t.RangeUsed().Intersects(range)); + if (firstOverlappingTable != null) + throw new InvalidOperationException($"The range {range.RangeAddress.ToStringRelative(includeSheet: true)} is already part of table '{firstOverlappingTable.Name}'"); + + // Check that the range doesn't overlap with any filters + if (AutoFilter.IsEnabled && this.AutoFilter.Range.Intersects(range)) + throw new InvalidOperationException($"The range {range.RangeAddress.ToStringRelative(includeSheet: true)} overlaps with the worksheet's autofilter."); + } + + private string GetNewTableName(string baseName) + { + var existingTableNames = new HashSet( + this.Workbook.Worksheets + .SelectMany(ws => ws.Tables) + .Select(t => t.Name), + StringComparer.OrdinalIgnoreCase); + + var i = 1; + string tableName; + do + { + tableName = baseName + i.ToString(); + i++; + } while (existingTableNames.Contains(tableName)); + + return tableName; + } + + private IXLRange GetRangeForSort() + { + var range = RangeUsed(); + SortColumns.ForEach(e => range.SortColumns.Add(e.ElementNumber, e.SortOrder, e.IgnoreBlanks, e.MatchCase)); + SortRows.ForEach(e => range.SortRows.Add(e.ElementNumber, e.SortOrder, e.IgnoreBlanks, e.MatchCase)); + return range; + } + + public XLPivotTable PivotTable(String name) + { + return (XLPivotTable)PivotTables.PivotTable(name); + } + + public override IXLCells Cells() + { + return Cells(true, XLCellsUsedOptions.All); + } + + public override IXLCells Cells(Boolean usedCellsOnly) + { + if (usedCellsOnly) + return Cells(true, XLCellsUsedOptions.AllContents); + else + return Range((this as IXLRangeBase).FirstCellUsed(XLCellsUsedOptions.All), + (this as IXLRangeBase).LastCellUsed(XLCellsUsedOptions.All)) + .Cells(false, XLCellsUsedOptions.All); + } + + public override XLCell Cell(String cellAddressInRange) + { + var cell = base.Cell(cellAddressInRange); + if (cell != null) return cell; + + if (Workbook.NamedRanges.TryGetValue(cellAddressInRange, out IXLNamedRange workbookNamedRange)) + { + if (!workbookNamedRange.Ranges.Any()) + return null; + + return workbookNamedRange.Ranges.FirstOrDefault().FirstCell().CastTo(); + } + + return null; + } + + public override XLRange Range(String rangeAddressStr) + { + if (XLHelper.IsValidRangeAddress(rangeAddressStr)) + return Range(new XLRangeAddress(Worksheet, rangeAddressStr)); + + if (rangeAddressStr.Contains("[")) + return Table(rangeAddressStr.Substring(0, rangeAddressStr.IndexOf("["))) as XLRange; + + if (NamedRanges.TryGetValue(rangeAddressStr, out IXLNamedRange worksheetNamedRange)) + return worksheetNamedRange.Ranges.First().CastTo(); + + if (Workbook.NamedRanges.TryGetValue(rangeAddressStr, out IXLNamedRange workbookNamedRange)) + { + if (!workbookNamedRange.Ranges.Any()) + return null; + + return workbookNamedRange.Ranges.First().CastTo(); + } + + return null; + } + + public IXLRanges MergedRanges { get { return Internals.MergedRanges; } } + + public IXLConditionalFormats ConditionalFormats { get; private set; } + + public IXLSparklineGroups SparklineGroups { get; private set; } + + private Boolean _eventTracking; + + public void SuspendEvents() + { + _eventTracking = EventTrackingEnabled; + EventTrackingEnabled = false; + } + + public void ResumeEvents() + { + EventTrackingEnabled = _eventTracking; + } + + private IXLRanges _selectedRanges; + + public IXLRanges SelectedRanges + { + get + { + _selectedRanges?.RemoveAll(r => !r.RangeAddress.IsValid); + return _selectedRanges; + } + internal set + { + _selectedRanges = value; + } + } + + public IXLCell ActiveCell { get; set; } + + private XLCalcEngine _calcEngine; + + internal XLCalcEngine CalcEngine + { + get { return _calcEngine ?? (_calcEngine = new XLCalcEngine(this)); } + } + + public Object Evaluate(String expression) + { + return CalcEngine.Evaluate(expression); + } + + /// + /// Force recalculation of all cell formulas. + /// + public void RecalculateAllFormulas() + { + CellsUsed().Cast().ForEach(cell => cell.Evaluate(true)); + } + + public String Author { get; set; } + + public override string ToString() + { + return this.Name; + } + + public IXLPictures Pictures { get; private set; } + + public Boolean IsPasswordProtected => Protection.IsPasswordProtected; + + public bool IsProtected => Protection.IsProtected; + + public IXLPicture Picture(string pictureName) + { + return Pictures.Picture(pictureName); + } + + public IXLPicture AddPicture(Stream stream) + { + return Pictures.Add(stream); + } + + public IXLPicture AddPicture(Stream stream, string name) + { + return Pictures.Add(stream, name); + } + + internal IXLPicture AddPicture(Stream stream, string name, int Id) + { + return (Pictures as XLPictures).Add(stream, name, Id); + } + + public IXLPicture AddPicture(Stream stream, XLPictureFormat format) + { + return Pictures.Add(stream, format); + } + + public IXLPicture AddPicture(Stream stream, XLPictureFormat format, string name) + { + return Pictures.Add(stream, format, name); + } + + public IXLPicture AddPicture(Bitmap bitmap) + { + return Pictures.Add(bitmap); + } + + public IXLPicture AddPicture(Bitmap bitmap, string name) + { + return Pictures.Add(bitmap, name); + } + + public IXLPicture AddPicture(string imageFile) + { + return Pictures.Add(imageFile); + } + + public IXLPicture AddPicture(string imageFile, string name) + { + return Pictures.Add(imageFile, name); + } + + public override Boolean IsEntireRow() + { + return true; + } + + public override Boolean IsEntireColumn() + { + return true; + } + + internal void SetValue(T value, int ro, int co) where T : class + { + if (value == null) + this.Cell(ro, co).SetValue(String.Empty); + else if (value is IConvertible) + this.Cell(ro, co).SetValue((T)Convert.ChangeType(value, typeof(T))); + else + this.Cell(ro, co).SetValue(value); + } + + /// + /// Get a cell value not initializing it if it has not been initialized yet. + /// + /// Row number + /// Column number + /// Current value of the specified cell. Empty string for non-initialized cells. + internal object GetCellValue(int ro, int co) + { + if (Internals.CellsCollection.MaxRowUsed < ro || + Internals.CellsCollection.MaxColumnUsed < co || + !Internals.CellsCollection.Contains(ro, co)) + return string.Empty; + + var cell = Worksheet.Internals.CellsCollection.GetCell(ro, co); + if (cell.IsEvaluating) + return string.Empty; + + return cell.Value; + } + + public XLRange GetOrCreateRange(XLRangeParameters xlRangeParameters) + { + var rangeKey = new XLRangeKey(XLRangeType.Range, xlRangeParameters.RangeAddress); + var range = _rangeRepository.GetOrCreate(ref rangeKey); + if (xlRangeParameters.DefaultStyle != null && range.StyleValue == StyleValue) + range.InnerStyle = xlRangeParameters.DefaultStyle; + + return range as XLRange; + } + + /// + /// Get a range row from the shared repository or create a new one. + /// + /// Address of range row. + /// Style to apply. If null the worksheet's style is applied. + /// Range row with the specified address. + public XLRangeRow RangeRow(XLRangeAddress address, IXLStyle defaultStyle = null) + { + var rangeKey = new XLRangeKey(XLRangeType.RangeRow, address); + var rangeRow = (XLRangeRow)_rangeRepository.GetOrCreate(ref rangeKey); + + if (defaultStyle != null && rangeRow.StyleValue == StyleValue) + rangeRow.InnerStyle = defaultStyle; + + return rangeRow; + } + + /// + /// Get a range column from the shared repository or create a new one. + /// + /// Address of range column. + /// Style to apply. If null the worksheet's style is applied. + /// Range column with the specified address. + public XLRangeColumn RangeColumn(XLRangeAddress address, IXLStyle defaultStyle = null) + { + var rangeKey = new XLRangeKey(XLRangeType.RangeColumn, address); + var rangeColumn = (XLRangeColumn)_rangeRepository.GetOrCreate(ref rangeKey); + + if (defaultStyle != null && rangeColumn.StyleValue == StyleValue) + rangeColumn.InnerStyle = defaultStyle; + + return rangeColumn; + } + + protected override void OnRangeAddressChanged(XLRangeAddress oldAddress, XLRangeAddress newAddress) + { + } + + public void RellocateRange(XLRangeType rangeType, XLRangeAddress oldAddress, XLRangeAddress newAddress) + { + if (_rangeRepository == null) + return; + + var oldKey = new XLRangeKey(rangeType, oldAddress); + var newKey = new XLRangeKey(rangeType, newAddress); + var range = _rangeRepository.Replace(ref oldKey, ref newKey); + + foreach (var rangeIndex in _rangeIndices) + { + if (!rangeIndex.MatchesType(rangeType)) + continue; + + if (rangeIndex.Remove(oldAddress) && + newAddress.IsValid && + range != null) + { + rangeIndex.Add(range); + } + } + } + + internal void DeleteColumn(int columnNumber) + { + Internals.ColumnsCollection.Remove(columnNumber); + + var columnsToMove = new List(); + columnsToMove.AddRange( + Internals.ColumnsCollection.Where(c => c.Key > columnNumber).Select(c => c.Key)); + foreach (int column in columnsToMove.OrderBy(c => c)) + { + Internals.ColumnsCollection.Add(column - 1, Internals.ColumnsCollection[column]); + Internals.ColumnsCollection.Remove(column); + + Internals.ColumnsCollection[column - 1].SetColumnNumber(column - 1); + } + } + + internal void DeleteRow(int rowNumber) + { + Internals.RowsCollection.Remove(rowNumber); + + var rowsToMove = new List(); + rowsToMove.AddRange(Internals.RowsCollection.Where(c => c.Key > rowNumber).Select(c => c.Key)); + foreach (int row in rowsToMove.OrderBy(r => r)) + { + Internals.RowsCollection.Add(row - 1, Worksheet.Internals.RowsCollection[row]); + Internals.RowsCollection.Remove(row); + + Internals.RowsCollection[row - 1].SetRowNumber(row - 1); + } + } + + internal void DeleteRange(XLRangeAddress rangeAddress) + { + var rangeKey = new XLRangeKey(XLRangeType.Range, rangeAddress); + _rangeRepository.Remove(ref rangeKey); + } + } +} diff --git a/ClosedXML/Excel/XLWorksheetInternals.cs b/ClosedXML/Excel/XLWorksheetInternals.cs new file mode 100644 index 0000000..ea5a915 --- /dev/null +++ b/ClosedXML/Excel/XLWorksheetInternals.cs @@ -0,0 +1,51 @@ +using System; + +namespace ClosedXML.Excel +{ + internal class XLWorksheetInternals : IDisposable + { + public XLWorksheetInternals( + XLCellsCollection cellsCollection, + XLColumnsCollection columnsCollection, + XLRowsCollection rowsCollection, + XLRanges mergedRanges + ) + { + CellsCollection = cellsCollection; + ColumnsCollection = columnsCollection; + RowsCollection = rowsCollection; + MergedRanges = mergedRanges; + } + + public XLCellsCollection CellsCollection { get; private set; } + public XLColumnsCollection ColumnsCollection { get; private set; } + public XLRowsCollection RowsCollection { get; private set; } + public XLRanges MergedRanges { get; internal set; } + + // Used by Janitor.Fody + private void DisposeManaged() + { + CellsCollection.Clear(); + ColumnsCollection.Clear(); + RowsCollection.Clear(); + MergedRanges.RemoveAll(); + } + +#if _NET40_ + + public void Dispose() + { + // net40 doesn't support Janitor.Fody, so let's dispose manually + DisposeManaged(); + } + +#else + + public void Dispose() + { + // Leave this empty (for non net40 targets) so that Janitor.Fody can do its work + } + +#endif + } +} diff --git a/ClosedXML/Excel/XLWorksheets.cs b/ClosedXML/Excel/XLWorksheets.cs new file mode 100644 index 0000000..25cd79d --- /dev/null +++ b/ClosedXML/Excel/XLWorksheets.cs @@ -0,0 +1,205 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLWorksheets : IXLWorksheets, IEnumerable + { + private readonly XLWorkbook _workbook; + private readonly Dictionary _worksheets = new Dictionary(StringComparer.OrdinalIgnoreCase); + internal ICollection Deleted { get; private set; } + + #region Constructor + + public XLWorksheets(XLWorkbook workbook) + { + _workbook = workbook; + Deleted = new HashSet(); + } + + #endregion Constructor + + #region IEnumerable Members + + public IEnumerator GetEnumerator() + { + return ((IEnumerable)_worksheets.Values).GetEnumerator(); + } + + #endregion IEnumerable Members + + #region IXLWorksheets Members + + public int Count + { + [DebuggerStepThrough] + get { return _worksheets.Count; } + } + + public Boolean Contains(String sheetName) + { + return _worksheets.ContainsKey(sheetName); + } + + public bool TryGetWorksheet(string sheetName, out IXLWorksheet worksheet) + { + if (_worksheets.TryGetValue(sheetName.UnescapeSheetName(), out XLWorksheet w)) + { + worksheet = w; + return true; + } + worksheet = null; + return false; + } + + public IXLWorksheet Worksheet(String sheetName) + { + sheetName = sheetName.UnescapeSheetName(); + + if (_worksheets.TryGetValue(sheetName, out XLWorksheet w)) + return w; + + throw new ArgumentException("There isn't a worksheet named '" + sheetName + "'."); + } + + public IXLWorksheet Worksheet(Int32 position) + { + int wsCount = _worksheets.Values.Count(w => w.Position == position); + if (wsCount == 0) + throw new ArgumentException("There isn't a worksheet associated with that position."); + + if (wsCount > 1) + { + throw new ArgumentException( + "Can't retrieve a worksheet because there are multiple worksheets associated with that position."); + } + + return _worksheets.Values.Single(w => w.Position == position); + } + + public IXLWorksheet Add() + { + return Add(GetNextWorksheetName()); + } + + public IXLWorksheet Add(Int32 position) + { + return Add(GetNextWorksheetName(), position); + } + + public IXLWorksheet Add(String sheetName) + { + var sheet = new XLWorksheet(sheetName, _workbook); + Add(sheetName, sheet); + sheet._position = _worksheets.Count + _workbook.UnsupportedSheets.Count; + return sheet; + } + + public IXLWorksheet Add(String sheetName, Int32 position) + { + _worksheets.Values.Where(w => w._position >= position).ForEach(w => w._position += 1); + _workbook.UnsupportedSheets.Where(w => w.Position >= position).ForEach(w => w.Position += 1); + var sheet = new XLWorksheet(sheetName, _workbook); + Add(sheetName, sheet); + sheet._position = position; + return sheet; + } + + private void Add(String sheetName, XLWorksheet sheet) + { + if (_worksheets.ContainsKey(sheetName)) + throw new ArgumentException(String.Format("A worksheet with the same name ({0}) has already been added.", sheetName), nameof(sheetName)); + + _worksheets.Add(sheetName, sheet); + } + + public void Delete(String sheetName) + { + Delete(_worksheets[sheetName].Position); + } + + public void Delete(Int32 position) + { + int wsCount = _worksheets.Values.Count(w => w.Position == position); + if (wsCount == 0) + throw new ArgumentException("There isn't a worksheet associated with that index."); + + if (wsCount > 1) + throw new ArgumentException( + "Can't delete the worksheet because there are multiple worksheets associated with that index."); + + var ws = _worksheets.Values.Single(w => w.Position == position); + if (!String.IsNullOrWhiteSpace(ws.RelId) && !Deleted.Contains(ws.RelId)) + Deleted.Add(ws.RelId); + + _worksheets.RemoveAll(w => w.Position == position); + _worksheets.Values.Where(w => w.Position > position).ForEach(w => w._position -= 1); + _workbook.UnsupportedSheets.Where(w => w.Position > position).ForEach(w => w.Position -= 1); + _workbook.InvalidateFormulas(); + + ws.Cleanup(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _worksheets.Values.Cast().GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLWorksheet Add(DataTable dataTable) + { + return Add(dataTable, dataTable.TableName); + } + + public IXLWorksheet Add(DataTable dataTable, String sheetName) + { + var ws = Add(sheetName); + ws.Cell(1, 1).InsertTable(dataTable, sheetName); + return ws; + } + + public void Add(DataSet dataSet) + { + foreach (DataTable t in dataSet.Tables) + Add(t); + } + + #endregion IXLWorksheets Members + + public void Rename(String oldSheetName, String newSheetName) + { + if (String.IsNullOrWhiteSpace(oldSheetName) || !_worksheets.TryGetValue(oldSheetName, out XLWorksheet ws)) return; + + if (!oldSheetName.Equals(newSheetName, StringComparison.OrdinalIgnoreCase) + && _worksheets.ContainsKey(newSheetName)) + throw new ArgumentException(String.Format("A worksheet with the same name ({0}) has already been added.", newSheetName), nameof(newSheetName)); + + _worksheets.Remove(oldSheetName); + Add(newSheetName, ws); + } + + #region Private members + + private String GetNextWorksheetName() + { + var worksheetNumber = this.Count + 1; + var sheetName = $"Sheet{worksheetNumber}"; + while (_worksheets.Values.Any(p => p.Name.Equals(sheetName, StringComparison.OrdinalIgnoreCase))) + { + worksheetNumber++; + sheetName = $"Sheet{worksheetNumber}"; + } + return sheetName; + } + + #endregion Private members + } +} diff --git a/ClosedXML/Extensions/AttributeExtensions.cs b/ClosedXML/Extensions/AttributeExtensions.cs new file mode 100644 index 0000000..008de85 --- /dev/null +++ b/ClosedXML/Extensions/AttributeExtensions.cs @@ -0,0 +1,37 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace ClosedXML +{ + public static class AttributeExtensions + { + public static TAttribute[] GetAttributes( + this MemberInfo member) + where TAttribute : Attribute + { + var attributes = member.GetCustomAttributes(typeof(TAttribute), true); + + return (TAttribute[])attributes; + } + + public static MethodInfo GetMethod(this T instance, Expression> methodSelector) + { + return ((MethodCallExpression)methodSelector.Body).Method; + } + + public static MethodInfo GetMethod(this T instance, Expression> methodSelector) + { + return ((MethodCallExpression)methodSelector.Body).Method; + } + + public static bool HasAttribute( + this MemberInfo member) + where TAttribute : Attribute + { + return GetAttributes(member).Any(); + } + } +} diff --git a/ClosedXML/Extensions/ColorExtensions.cs b/ClosedXML/Extensions/ColorExtensions.cs new file mode 100644 index 0000000..b832509 --- /dev/null +++ b/ClosedXML/Extensions/ColorExtensions.cs @@ -0,0 +1,37 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Drawing; + +namespace ClosedXML.Excel +{ + internal static class ColorExtensions + { + private static readonly char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + + public static String ToHex(this Color color) + { + byte[] bytes = new byte[4]; + + bytes[0] = color.A; + + bytes[1] = color.R; + + bytes[2] = color.G; + + bytes[3] = color.B; + + char[] chars = new char[bytes.Length * 2]; + + for (int i = 0; i < bytes.Length; i++) + { + int b = bytes[i]; + + chars[i * 2] = hexDigits[b >> 4]; + + chars[i * 2 + 1] = hexDigits[b & 0xF]; + } + + return new string(chars); + } + } +} diff --git a/ClosedXML/Extensions/DateTimeExtensions.cs b/ClosedXML/Extensions/DateTimeExtensions.cs new file mode 100644 index 0000000..af989eb --- /dev/null +++ b/ClosedXML/Extensions/DateTimeExtensions.cs @@ -0,0 +1,43 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal static class DateTimeExtensions + { + public static Double MaxOADate + { + get + { + return 2958465.99999999; + } + } + + public static bool IsWorkDay(this DateTime date, IEnumerable bankHolidays) + { + return date.DayOfWeek != DayOfWeek.Saturday + && date.DayOfWeek != DayOfWeek.Sunday + && !bankHolidays.Contains(date); + } + + public static DateTime NextWorkday(this DateTime date, IEnumerable bankHolidays) + { + var nextDate = date.AddDays(1); + while (!nextDate.IsWorkDay(bankHolidays)) + nextDate = nextDate.AddDays(1); + + return nextDate; + } + + public static DateTime PreviousWorkDay(this DateTime date, IEnumerable bankHolidays) + { + var previousDate = date.AddDays(-1); + while (!previousDate.IsWorkDay(bankHolidays)) + previousDate = previousDate.AddDays(-1); + + return previousDate; + } + } +} diff --git a/ClosedXML/Extensions/DecimalExtensions.cs b/ClosedXML/Extensions/DecimalExtensions.cs new file mode 100644 index 0000000..221950f --- /dev/null +++ b/ClosedXML/Extensions/DecimalExtensions.cs @@ -0,0 +1,13 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + internal static class DecimalExtensions + { + public static Decimal SaveRound(this Decimal value) + { + return Math.Round(value, 6); + } + } +} diff --git a/ClosedXML/Extensions/DictionaryExtensions.cs b/ClosedXML/Extensions/DictionaryExtensions.cs new file mode 100644 index 0000000..559ace5 --- /dev/null +++ b/ClosedXML/Extensions/DictionaryExtensions.cs @@ -0,0 +1,20 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal static class DictionaryExtensions + { + public static void RemoveAll(this Dictionary dic, + Func predicate) + { + var keys = dic.Keys.Where(k => predicate(dic[k])).ToList(); + foreach (var key in keys) + { + dic.Remove(key); + } + } + } +} diff --git a/ClosedXML/Extensions/DoubleExtensions.cs b/ClosedXML/Extensions/DoubleExtensions.cs new file mode 100644 index 0000000..8a096f3 --- /dev/null +++ b/ClosedXML/Extensions/DoubleExtensions.cs @@ -0,0 +1,13 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + internal static class DoubleExtensions + { + public static Double SaveRound(this Double value) + { + return Math.Round(value, 6); + } + } +} diff --git a/ClosedXML/Extensions/DoubleValueExtensions.cs b/ClosedXML/Extensions/DoubleValueExtensions.cs new file mode 100644 index 0000000..e5f77b0 --- /dev/null +++ b/ClosedXML/Extensions/DoubleValueExtensions.cs @@ -0,0 +1,14 @@ +// Keep this file CodeMaid organised and cleaned +using DocumentFormat.OpenXml; +using System; + +namespace ClosedXML.Excel +{ + internal static class DoubleValueExtensions + { + public static DoubleValue SaveRound(this DoubleValue value) + { + return value.HasValue ? new DoubleValue(Math.Round(value, 6)) : value; + } + } +} diff --git a/ClosedXML/Extensions/EnumerableExtensions.cs b/ClosedXML/Extensions/EnumerableExtensions.cs new file mode 100644 index 0000000..1c2084a --- /dev/null +++ b/ClosedXML/Extensions/EnumerableExtensions.cs @@ -0,0 +1,33 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal static class EnumerableExtensions + { + public static void ForEach(this IEnumerable source, Action action) + { + foreach (T item in source) + action(item); + } + + public static Type GetItemType(this IEnumerable source) + { + return typeof(T); + } + + public static Boolean HasDuplicates(this IEnumerable source) + { + HashSet distinctItems = new HashSet(); + foreach (var item in source) + { + if (!distinctItems.Add(item)) + { + return true; + } + } + return false; + } + } +} diff --git a/ClosedXML/Extensions/FontBaseExtensions.cs b/ClosedXML/Extensions/FontBaseExtensions.cs new file mode 100644 index 0000000..595865f --- /dev/null +++ b/ClosedXML/Extensions/FontBaseExtensions.cs @@ -0,0 +1,67 @@ +// Keep this file CodeMaid organised and cleaned +using ClosedXML.Utils; +using System; +using System.Collections.Generic; +using System.Drawing; + +namespace ClosedXML.Excel +{ + internal static class FontBaseExtensions + { + public static void CopyFont(this IXLFontBase font, IXLFontBase sourceFont) + { + font.Bold = sourceFont.Bold; + font.Italic = sourceFont.Italic; + font.Underline = sourceFont.Underline; + font.Strikethrough = sourceFont.Strikethrough; + font.VerticalAlignment = sourceFont.VerticalAlignment; + font.Shadow = sourceFont.Shadow; + font.FontSize = sourceFont.FontSize; + font.FontColor = sourceFont.FontColor; + font.FontName = sourceFont.FontName; + font.FontFamilyNumbering = sourceFont.FontFamilyNumbering; + font.FontCharSet = sourceFont.FontCharSet; + } + + public static Double GetHeight(this IXLFontBase fontBase, Dictionary fontCache) + { + var font = GetCachedFont(fontBase, fontCache); + var textHeight = GraphicsUtils.MeasureString("X", font).Height; + return (double)textHeight * 0.85; + } + + public static Double GetWidth(this IXLFontBase fontBase, String text, Dictionary fontCache) + { + if (String.IsNullOrWhiteSpace(text)) + return 0; + + var font = GetCachedFont(fontBase, fontCache); + var textWidth = GraphicsUtils.MeasureString(text, font).Width; + + double width = (textWidth / 7d * 256 - 128 / 7) / 256; + width = Math.Round(width + 0.2, 2); + + return width; + } + + private static Font GetCachedFont(IXLFontBase fontBase, Dictionary fontCache) + { + if (!fontCache.TryGetValue(fontBase, out Font font)) + { + font = new Font(fontBase.FontName, (float)fontBase.FontSize, GetFontStyle(fontBase)); + fontCache.Add(fontBase, font); + } + return font; + } + + private static FontStyle GetFontStyle(IXLFontBase font) + { + FontStyle fontStyle = FontStyle.Regular; + if (font.Bold) fontStyle |= FontStyle.Bold; + if (font.Italic) fontStyle |= FontStyle.Italic; + if (font.Strikethrough) fontStyle |= FontStyle.Strikeout; + if (font.Underline != XLFontUnderlineValues.None) fontStyle |= FontStyle.Underline; + return fontStyle; + } + } +} diff --git a/ClosedXML/Extensions/FormatExtensions.cs b/ClosedXML/Extensions/FormatExtensions.cs new file mode 100644 index 0000000..c8a3add --- /dev/null +++ b/ClosedXML/Extensions/FormatExtensions.cs @@ -0,0 +1,18 @@ +// Keep this file CodeMaid organised and cleaned +using ExcelNumberFormat; +using System.Globalization; + +namespace ClosedXML.Extensions +{ + internal static class FormatExtensions + { + public static string ToExcelFormat(this object o, string format) + { + var nf = new NumberFormat(format); + if (!nf.IsValid) + return format; + + return nf.Format(o, CultureInfo.InvariantCulture); + } + } +} diff --git a/ClosedXML/Extensions/GuidExtensions.cs b/ClosedXML/Extensions/GuidExtensions.cs new file mode 100644 index 0000000..fe2f3a5 --- /dev/null +++ b/ClosedXML/Extensions/GuidExtensions.cs @@ -0,0 +1,13 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Extensions +{ + internal static class GuidExtensions + { + internal static String WrapInBraces(this Guid guid) + { + return string.Concat('{', guid.ToString(), '}'); + } + } +} diff --git a/ClosedXML/Extensions/IntegerExtensions.cs b/ClosedXML/Extensions/IntegerExtensions.cs new file mode 100644 index 0000000..27cf90b --- /dev/null +++ b/ClosedXML/Extensions/IntegerExtensions.cs @@ -0,0 +1,11 @@ +// Keep this file CodeMaid organised and cleaned +namespace ClosedXML.Excel +{ + internal static class IntegerExtensions + { + public static bool Between(this int val, int from, int to) + { + return val >= from && val <= to; + } + } +} diff --git a/ClosedXML/Extensions/ListExtensions.cs b/ClosedXML/Extensions/ListExtensions.cs new file mode 100644 index 0000000..9c699a1 --- /dev/null +++ b/ClosedXML/Extensions/ListExtensions.cs @@ -0,0 +1,19 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal static class ListExtensions + { + public static void RemoveAll(this IList list, Func predicate) + { + var indices = list.Where(item => predicate(item)).Select((item, i) => i).OrderByDescending(i => i).ToList(); + foreach (var i in indices) + { + list.RemoveAt(i); + } + } + } +} diff --git a/ClosedXML/Extensions/ObjectExtensions.cs b/ClosedXML/Extensions/ObjectExtensions.cs new file mode 100644 index 0000000..6660683 --- /dev/null +++ b/ClosedXML/Extensions/ObjectExtensions.cs @@ -0,0 +1,134 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Globalization; + +namespace ClosedXML.Excel +{ + internal static class ObjectExtensions + { + public static T CastTo(this Object o) + { + return (T)Convert.ChangeType(o, typeof(T)); + } + + public static bool IsNumber(this object value) + { + return value is sbyte + || value is byte + || value is short + || value is ushort + || value is int + || value is uint + || value is long + || value is ulong + || value is float + || value is double + || value is decimal; + } + + public static string ToInvariantString(this T value) where T : struct + { + switch (value) + { + case sbyte v: + return v.ToString(CultureInfo.InvariantCulture); + + case byte v: + return v.ToString(CultureInfo.InvariantCulture); + + case short v: + return v.ToString(CultureInfo.InvariantCulture); + + case ushort v: + return v.ToString(CultureInfo.InvariantCulture); + + case int v: + return v.ToString(CultureInfo.InvariantCulture); + + case uint v: + return v.ToString(CultureInfo.InvariantCulture); + + case long v: + return v.ToString(CultureInfo.InvariantCulture); + + case ulong v: + return v.ToString(CultureInfo.InvariantCulture); + + case float v: + // Specify precision explicitly for backward compatibility + return v.ToString("G7", CultureInfo.InvariantCulture); + + case double v: + // Specify precision explicitly for backward compatibility + return v.ToString("G15", CultureInfo.InvariantCulture); + + case decimal v: + return v.ToString(CultureInfo.InvariantCulture); + + case TimeSpan ts: + return ts.ToString("c", CultureInfo.InvariantCulture); + + case DateTime d: + return d.ToString(CultureInfo.InvariantCulture); + + default: + return value.ToString(); + } + } + + // This method may cause boxing of value types so it is better to replace its calls with + // the generic version, where applicable + public static string ObjectToInvariantString(this object value) + { + if (value == null) + return string.Empty; + + switch (value) + { + case sbyte v: + return v.ToString(CultureInfo.InvariantCulture); + + case byte v: + return v.ToString(CultureInfo.InvariantCulture); + + case short v: + return v.ToString(CultureInfo.InvariantCulture); + + case ushort v: + return v.ToString(CultureInfo.InvariantCulture); + + case int v: + return v.ToString(CultureInfo.InvariantCulture); + + case uint v: + return v.ToString(CultureInfo.InvariantCulture); + + case long v: + return v.ToString(CultureInfo.InvariantCulture); + + case ulong v: + return v.ToString(CultureInfo.InvariantCulture); + + case float v: + // Specify precision explicitly for backward compatibility + return v.ToString("G7", CultureInfo.InvariantCulture); + + case double v: + // Specify precision explicitly for backward compatibility + return v.ToString("G15", CultureInfo.InvariantCulture); + + case decimal v: + return v.ToString(CultureInfo.InvariantCulture); + + case TimeSpan ts: + return ts.ToString("c", CultureInfo.InvariantCulture); + + case DateTime d: + return d.ToString(CultureInfo.InvariantCulture); + + default: + return value.ToString(); + } + } + } +} diff --git a/ClosedXML/Extensions/OpenXmlPartContainerExtensions.cs b/ClosedXML/Extensions/OpenXmlPartContainerExtensions.cs new file mode 100644 index 0000000..3c5ed93 --- /dev/null +++ b/ClosedXML/Extensions/OpenXmlPartContainerExtensions.cs @@ -0,0 +1,15 @@ +// Keep this file CodeMaid organised and cleaned +using DocumentFormat.OpenXml.Packaging; +using System; +using System.Linq; + +namespace ClosedXML.Extensions +{ + internal static class OpenXmlPartContainerExtensions + { + public static Boolean HasPartWithId(this OpenXmlPartContainer container, String relId) + { + return container.Parts.Any(p => p.RelationshipId.Equals(relId)); + } + } +} diff --git a/ClosedXML/Extensions/StringExtensions.cs b/ClosedXML/Extensions/StringExtensions.cs new file mode 100644 index 0000000..527db32 --- /dev/null +++ b/ClosedXML/Extensions/StringExtensions.cs @@ -0,0 +1,87 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace ClosedXML.Excel +{ + internal static class StringExtensions + { + private static readonly Regex RegexNewLine = new Regex(@"((? (Char.IsPunctuation(c) && c != '.' && c != '_') || + Char.IsSeparator(c) || + Char.IsControl(c) || + Char.IsSymbol(c)); + if (needEscape) + return String.Concat('\'', sheetName.Replace("'", "''"), '\''); + else + return sheetName; + } + + internal static String FixNewLines(this String value) + { + return value.Contains("\n") ? RegexNewLine.Replace(value, Environment.NewLine) : value; + } + + internal static Boolean PreserveSpaces(this String value) + { + return value.StartsWith(" ") || value.EndsWith(" ") || value.Contains(Environment.NewLine); + } + + internal static String ToCamel(this String value) + { + if (value.Length == 0) + return value; + + if (value.Length == 1) + return value.ToLower(); + + return value.Substring(0, 1).ToLower() + value.Substring(1); + } + + internal static String ToProper(this String value) + { + if (value.Length == 0) + return value; + + if (value.Length == 1) + return value.ToUpper(); + + return value.Substring(0, 1).ToUpper() + value.Substring(1); + } + + internal static string UnescapeSheetName(this String sheetName) + { + return sheetName + .Trim('\'') + .Replace("''", "'"); + } + } +} diff --git a/ClosedXML/Extensions/TypeExtensions.cs b/ClosedXML/Extensions/TypeExtensions.cs new file mode 100644 index 0000000..3b4433c --- /dev/null +++ b/ClosedXML/Extensions/TypeExtensions.cs @@ -0,0 +1,42 @@ +// Keep this file CodeMaid organised and cleaned +using System; + +namespace ClosedXML.Excel +{ + internal static class TypeExtensions + { + public static Type GetUnderlyingType(this Type type) + { + return Nullable.GetUnderlyingType(type) ?? type; + } + + public static bool IsNullableType(this Type type) + { + return Nullable.GetUnderlyingType(type) != null; + } + + public static bool IsNumber(this Type type) + { + return type == typeof(sbyte) + || type == typeof(byte) + || type == typeof(short) + || type == typeof(ushort) + || type == typeof(int) + || type == typeof(uint) + || type == typeof(long) + || type == typeof(ulong) + || type == typeof(float) + || type == typeof(double) + || type == typeof(decimal); + } + + public static bool IsSimpleType(this Type type) + { + return type.IsPrimitive + || type == typeof(String) + || type == typeof(DateTime) + || type == typeof(TimeSpan) + || type.IsNumber(); + } + } +} diff --git a/ClosedXML/Extensions/XDocumentExtensions.cs b/ClosedXML/Extensions/XDocumentExtensions.cs new file mode 100644 index 0000000..36a7a44 --- /dev/null +++ b/ClosedXML/Extensions/XDocumentExtensions.cs @@ -0,0 +1,25 @@ +// Keep this file CodeMaid organised and cleaned +using System.IO; +using System.Xml; +using System.Xml.Linq; + +namespace ClosedXML.Excel +{ + internal static class XDocumentExtensions + { + public static XDocument Load(Stream stream) + { + using (XmlReader reader = XmlReader.Create(stream)) + { + try + { + return XDocument.Load(reader); + } + catch (XmlException) + { + return null; + } + } + } + } +} diff --git a/ClosedXML/FodyWeavers.xml b/ClosedXML/FodyWeavers.xml new file mode 100644 index 0000000..958bbfc --- /dev/null +++ b/ClosedXML/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/ClosedXML/FodyWeavers.xsd b/ClosedXML/FodyWeavers.xsd new file mode 100644 index 0000000..df82d5f --- /dev/null +++ b/ClosedXML/FodyWeavers.xsd @@ -0,0 +1,26 @@ + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/ClosedXML/PathHelper.cs b/ClosedXML/PathHelper.cs new file mode 100644 index 0000000..f87a9db --- /dev/null +++ b/ClosedXML/PathHelper.cs @@ -0,0 +1,243 @@ +using System; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Text.RegularExpressions; + +namespace ClosedXML +{ + /// + /// Help methods for work with files + /// + internal static class PathHelper + { + private static readonly Regex ms_checkValidAbsolutePathRegEx = new Regex( + "^(([a-zA-Z]\\:)|\\\\)(\\\\|(\\\\[^\\n\\r\\t/:*?<>\\\"|]*)+)$", + RegexOptions.IgnoreCase + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.Compiled + ); + /// + /// Can check only .\dfdfd\dfdf\dfdf or ..\..\gfhfgh\fghfh + /// + private static readonly Regex ms_checkValidRelativePathRegEx = new Regex( + "^(\\.\\.|\\.)(\\\\|(\\\\[^\\n\\r\\t/:*?<>\\\"|]*)+)$", + RegexOptions.IgnoreCase + | RegexOptions.Multiline + | RegexOptions.CultureInvariant + | RegexOptions.Compiled + ); + + private static readonly object ms_syncAbsolutePathObj = new object(); + + /// + /// Gets data and time string stamp for file name + /// + /// + public static string GetTimeStamp() + { + return GetTimeStamp(DateTime.Now); + } + /// + /// Gets data and time string stamp for file name + /// + /// + public static string GetTimeStamp(DateTime dateTime) + { + return dateTime.ToString("ddMMMyyyy_HHmmss", DateTimeFormatInfo.InvariantInfo); + } + /// + /// Safety delete file(with try block) + /// + /// file name + public static void SafetyDeleteFile(string fileName) + { + try + { + if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) + { + File.Delete(fileName); + } + } + catch (Exception ex) + { + Debug.Fail("Error during file deleting. Error message:" + ex.Message); + } + } + /// + /// Replace all not implemented symbols to '_' + /// + /// input filename + /// + public static string NormalizeFileName(string fileName) + { + char[] invalidCharacters = Path.GetInvalidFileNameChars(); + #region Replace begin space + string result = fileName.TrimStart(' '); + if (result.Length < fileName.Length) + { + result = new string('_', fileName.Length - result.Length) + result; + } + #endregion + foreach (char curChar in invalidCharacters) + { + result = result.Replace(curChar, '_'); + } + return result; + } + + public static string NormalizePathName(string fileName) + { + char[] invalidCharacters = Path.GetInvalidPathChars(); + string result = fileName.TrimStart(' '); + foreach (char curChar in invalidCharacters) + { + result = result.Replace(curChar, '_'); + } + return result; + } + /// + /// ValidatePath file or diretory path + /// + /// + /// path type + /// + public static bool ValidatePath(string path, PathTypes type) + { + bool _result = false; + if ((type & PathTypes.Absolute) == PathTypes.Absolute) + { + _result |= ms_checkValidAbsolutePathRegEx.IsMatch(path); + } + if ((type & PathTypes.Relative) == PathTypes.Relative) + { + _result |= ms_checkValidRelativePathRegEx.IsMatch(path); + } + return _result; + } + + /// + /// ValidatePath file or diretory path + /// + /// + /// + public static bool ValidateFileName(string fileName) + { + return fileName.LastIndexOfAny(Path.GetInvalidFileNameChars()) < 0; + } + + public static string EvaluateRelativePath(string mainDirPath, string absoluteFilePath) + { + string[] firstPathParts = mainDirPath.Trim(Path.DirectorySeparatorChar).Split(Path.DirectorySeparatorChar); + string[] secondPathParts = absoluteFilePath.Trim(Path.DirectorySeparatorChar).Split(Path.DirectorySeparatorChar); + + int sameCounter = 0; + int partsCount = Math.Min(firstPathParts.Length, secondPathParts.Length); + for (int i = 0; i < partsCount; i++) + { + if (String.Compare(firstPathParts[i], secondPathParts[i], true) != 0) + { + break; + } + sameCounter++; + } + + if (sameCounter == 0) + { + return absoluteFilePath; + } + + string newPath = string.Empty; + for (int i = sameCounter; i < firstPathParts.Length; i++) + { + if (i > sameCounter) + { + newPath += Path.DirectorySeparatorChar; + } + newPath += ".."; + } + if (newPath.Length == 0) + { + newPath = "."; + } + for (int i = sameCounter; i < secondPathParts.Length; i++) + { + newPath += Path.DirectorySeparatorChar; + newPath += secondPathParts[i]; + } + return newPath; + } + + public static string EvaluateAbsolutePath(string rootPath, string relativePath) + { + lock (ms_syncAbsolutePathObj) + { + string _temp = Environment.CurrentDirectory; + Environment.CurrentDirectory = rootPath; + string _result = Path.GetFullPath(relativePath); + Environment.CurrentDirectory = _temp; + return _result; + } + } + + public static bool TryCreateFile(string filePath, out string message) + { + #region Check + if (string.IsNullOrEmpty(filePath)) + { + throw new ArgumentNullException("filePath"); + } + #endregion + try + { + if (File.Exists(filePath)) + { + message = null; + return true; + } + + using (FileStream _stream = new FileStream(filePath, + FileMode.Create, + FileAccess.ReadWrite, + FileShare.Read, + 1024, + FileOptions.DeleteOnClose)) + { + } + } + catch (Exception exc) + { + message = exc.Message; + return false; + } + + message = null; + return true; + } + + public static string CreateDirectory(string path) + { + try + { + var info = new DirectoryInfo(path); + if (!info.Exists) + { + info.Create(); + } + } + catch + { + } + return path; + } + + [Flags] + public enum PathTypes + { + None = 0, + Absolute = 1, + Relative = 2 + } + } +} \ No newline at end of file diff --git a/ClosedXML/Properties/AssemblyInfo.cs b/ClosedXML/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..4c21750 --- /dev/null +++ b/ClosedXML/Properties/AssemblyInfo.cs @@ -0,0 +1,5 @@ +#if STRONGNAME +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("ClosedXML_Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100a1fb8ba59167fe734d64128ca73d32c45cb8a117246d09c95c8769db88fe332b0a3396bedd0ea48ee42b0e5796fec0798ca5cb628a9a6de80d35d6c67b936ca1670347b3d4f2b769c8ce2ddcf959dbac6bcd88e6c08751ea1fffa0522de3507193e7035305a8aa008d6c88cca1341b3120fa9c347ab3f97e2d772e2709277da5")] +#else +[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("ClosedXML_Tests")] +#endif diff --git a/ClosedXML/Utils/ColorStringParser.cs b/ClosedXML/Utils/ColorStringParser.cs new file mode 100644 index 0000000..60203a1 --- /dev/null +++ b/ClosedXML/Utils/ColorStringParser.cs @@ -0,0 +1,22 @@ +using System.Drawing; +using System.Globalization; + +namespace ClosedXML.Utils +{ + internal static class ColorStringParser + { + public static Color ParseFromHtml(string htmlColor) + { + try + { + return ColorTranslator.FromHtml(htmlColor); + } + catch + { + // https://github.com/ClosedXML/ClosedXML/issues/675 + // When regional settings list separator is # , the standard ColorTranslator.FromHtml fails + return Color.FromArgb(int.Parse(htmlColor.Replace("#", ""), NumberStyles.AllowHexSpecifier)); + } + } + } +} diff --git a/ClosedXML/Utils/CryptographicAlgorithms.cs b/ClosedXML/Utils/CryptographicAlgorithms.cs new file mode 100644 index 0000000..472d5de --- /dev/null +++ b/ClosedXML/Utils/CryptographicAlgorithms.cs @@ -0,0 +1,138 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using static ClosedXML.Excel.XLProtectionAlgorithm; + +namespace ClosedXML.Utils +{ + internal static class CryptographicAlgorithms + { + public static string Base64Decode(string base64EncodedData) + { + var base64EncodedBytes = Convert.FromBase64String(base64EncodedData); + return Encoding.UTF8.GetString(base64EncodedBytes); + } + + public static string Base64Encode(string plainText) + { + var plainTextBytes = Encoding.UTF8.GetBytes(plainText); + return Convert.ToBase64String(plainTextBytes); + } + + public static String GenerateNewSalt(Algorithm algorithm) + { + if (RequiresSalt(algorithm)) + return GetSalt(); + else + return String.Empty; + } + + public static String GetPasswordHash(Algorithm algorithm, String password, String salt = "", UInt32 spinCount = 0) + { + if (password == null) + throw new ArgumentNullException(nameof(password)); + + if (salt == null) + throw new ArgumentNullException(nameof(salt)); + + if ("" == password) return ""; + + switch (algorithm) + { + case Algorithm.SimpleHash: + return GetDefaultPasswordHash(password); + + case Algorithm.SHA512: + return GetSha512PasswordHash(password, salt, spinCount); + + default: + return string.Empty; + } + } + + public static string GetSalt(int length = 32) + { + using (var random = new RNGCryptoServiceProvider()) + { + var salt = new byte[length]; + random.GetNonZeroBytes(salt); + return Convert.ToBase64String(salt); + } + } + + public static Boolean RequiresSalt(Algorithm algorithm) + { + switch (algorithm) + { + case Algorithm.SimpleHash: + return false; + + case Algorithm.SHA512: + return true; + + default: + return false; + } + } + + private static String GetDefaultPasswordHash(String password) + { + if (password == null) + throw new ArgumentNullException(nameof(password)); + + // http://kohei.us/2008/01/18/excel-sheet-protection-password-hash/ + // http://sc.openoffice.org/excelfileformat.pdf - 4.18.4 + // http://web.archive.org/web/20080906232341/http://blogs.infosupport.com/wouterv/archive/2006/11/21/Hashing-password-for-use-in-SpreadsheetML.aspx + byte[] passwordCharacters = Encoding.ASCII.GetBytes(password); + int hash = 0; + if (passwordCharacters.Length > 0) + { + int charIndex = passwordCharacters.Length; + + while (charIndex-- > 0) + { + hash = ((hash >> 14) & 0x01) | ((hash << 1) & 0x7fff); + hash ^= passwordCharacters[charIndex]; + } + // Main difference from spec, also hash with charcount + hash = ((hash >> 14) & 0x01) | ((hash << 1) & 0x7fff); + hash ^= passwordCharacters.Length; + hash ^= (0x8000 | ('N' << 8) | 'K'); + } + + return Convert.ToString(hash, 16).ToUpperInvariant(); + } + + private static String GetSha512PasswordHash(String password, String salt, UInt32 spinCount) + { + if (password == null) + throw new ArgumentNullException(nameof(password)); + + if (salt == null) + throw new ArgumentNullException(nameof(salt)); + + var saltBytes = Convert.FromBase64String(salt); + var passwordBytes = Encoding.Unicode.GetBytes(password); + var bytes = saltBytes.Concat(passwordBytes).ToArray(); + + byte[] hashedBytes; + using (var hash = new SHA512Managed()) + { + hashedBytes = hash.ComputeHash(bytes); + + bytes = new byte[hashedBytes.Length + sizeof(uint)]; + for (uint i = 0; i < spinCount; i++) + { + var le = BitConverter.GetBytes(i); + Array.Copy(hashedBytes, bytes, hashedBytes.Length); + Array.Copy(le, 0, bytes, hashedBytes.Length, le.Length); + hashedBytes = hash.ComputeHash(bytes); + } + } + + return Convert.ToBase64String(hashedBytes); + } + } +} diff --git a/ClosedXML/Utils/DescribedEnumParser.cs b/ClosedXML/Utils/DescribedEnumParser.cs new file mode 100644 index 0000000..838a768 --- /dev/null +++ b/ClosedXML/Utils/DescribedEnumParser.cs @@ -0,0 +1,53 @@ +// Keep this file CodeMaid organised and cleaned +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Reflection; + +namespace ClosedXML.Utils +{ + internal static class DescribedEnumParser + { + private static Lazy> fromDescriptions = new Lazy>(() => + { + return ParseEnumDescriptions().ToDictionary(a => a.Item2, a => a.Item1); + }); + + private static Lazy> toDescriptions = new Lazy>(() => + { + return ParseEnumDescriptions().ToDictionary(a => a.Item1, a => a.Item2); + }); + + public static T FromDescription(String value) + { + return fromDescriptions.Value[value]; + } + + public static Boolean IsValidDescription(String value) + { + return fromDescriptions.Value.ContainsKey(value); + } + + public static String ToDescription(T value) + { + return toDescriptions.Value[value]; + } + + private static IEnumerable> ParseEnumDescriptions() + { + var type = typeof(T); + return type.GetFields(BindingFlags.Public | BindingFlags.Static) + .Select(f => + { + var attributes = f.GetCustomAttributes(typeof(DescriptionAttribute), inherit: false).OfType(); + var description = attributes.FirstOrDefault()?.Description ?? f.Name; + return new Tuple + ( + (T)Enum.Parse(type, f.Name), + description + ); + }); + } + } +} diff --git a/ClosedXML/Utils/GraphicsUtils.cs b/ClosedXML/Utils/GraphicsUtils.cs new file mode 100644 index 0000000..f0f7644 --- /dev/null +++ b/ClosedXML/Utils/GraphicsUtils.cs @@ -0,0 +1,31 @@ +using System; +using System.Drawing; + +namespace ClosedXML.Utils +{ + internal static class GraphicsUtils + { + [ThreadStatic] + private static Graphics threadLocalGraphics; + + internal static Graphics Graphics + { + get + { + if (threadLocalGraphics == null) + { + var image = new Bitmap(1, 1); + threadLocalGraphics = Graphics.FromImage(image); + } + return threadLocalGraphics; + } + } + + private static StringFormat defaultStringFormat = StringFormat.GenericTypographic; + public static SizeF MeasureString(string s, Font font) + { + SizeF result = Graphics.MeasureString(s, font, Int32.MaxValue, defaultStringFormat); + return result; + } + } +} diff --git a/ClosedXML/Utils/OpenXmlColorTypeAdapters.cs b/ClosedXML/Utils/OpenXmlColorTypeAdapters.cs new file mode 100644 index 0000000..3d22df4 --- /dev/null +++ b/ClosedXML/Utils/OpenXmlColorTypeAdapters.cs @@ -0,0 +1,56 @@ +// Keep this file CodeMaid organised and cleaned +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Spreadsheet; +using X14 = DocumentFormat.OpenXml.Office2010.Excel; + +namespace ClosedXML.Utils +{ + internal interface IColorTypeAdapter + { + public BooleanValue Auto { get; set; } + public UInt32Value Indexed { get; set; } + public HexBinaryValue Rgb { get; set; } + public UInt32Value Theme { get; set; } + public DoubleValue Tint { get; set; } + } + + internal class ColorTypeAdapter : IColorTypeAdapter + { + public ColorTypeAdapter(ColorType colorType) + { + this.ColorType = colorType; + } + + #region ColorType + + public ColorType ColorType { get; } + + #endregion ColorType + + public BooleanValue Auto { get => ColorType.Auto; set => ColorType.Auto = value; } + public UInt32Value Indexed { get => ColorType.Indexed; set => ColorType.Indexed = value; } + public HexBinaryValue Rgb { get => ColorType.Rgb; set => ColorType.Rgb = value; } + public UInt32Value Theme { get => ColorType.Theme; set => ColorType.Theme = value; } + public DoubleValue Tint { get => ColorType.Tint; set => ColorType.Tint = value; } + } + + internal class X14ColorTypeAdapter : IColorTypeAdapter + { + public X14ColorTypeAdapter(X14.ColorType colorType) + { + this.ColorType = colorType; + } + + #region ColorType + + public X14.ColorType ColorType { get; } + + #endregion ColorType + + public BooleanValue Auto { get => ColorType.Auto; set => ColorType.Auto = value; } + public UInt32Value Indexed { get => ColorType.Indexed; set => ColorType.Indexed = value; } + public HexBinaryValue Rgb { get => ColorType.Rgb; set => ColorType.Rgb = value; } + public UInt32Value Theme { get => ColorType.Theme; set => ColorType.Theme = value; } + public DoubleValue Tint { get => ColorType.Tint; set => ColorType.Tint = value; } + } +} diff --git a/ClosedXML/Utils/OpenXmlHelper.cs b/ClosedXML/Utils/OpenXmlHelper.cs new file mode 100644 index 0000000..35cd2be --- /dev/null +++ b/ClosedXML/Utils/OpenXmlHelper.cs @@ -0,0 +1,161 @@ +// Keep this file CodeMaid organised and cleaned +using ClosedXML.Excel; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Spreadsheet; +using System; +using System.Collections.Generic; +using Drawing = System.Drawing; +using X14 = DocumentFormat.OpenXml.Office2010.Excel; + +namespace ClosedXML.Utils +{ + internal static class OpenXmlHelper + { + #region Public Methods + + /// + /// Convert color in ClosedXML representation to specified OpenXML type. + /// + /// The descendant of . + /// The existing instance of ColorType. + /// Color in ClosedXML format. + /// Flag specifiying that the color should be saved in + /// differential format (affects the transparent color processing). + /// The original color in OpenXML format. + public static T FromClosedXMLColor(this ColorType openXMLColor, XLColor xlColor, bool isDifferential = false) + where T : ColorType + { + var adapter = new ColorTypeAdapter(openXMLColor); + FillFromClosedXMLColor(adapter, xlColor, isDifferential); + return (T)adapter.ColorType; + } + + /// + /// Convert color in ClosedXML representation to specified OpenXML type. + /// + /// The descendant of . + /// The existing instance of ColorType. + /// Color in ClosedXML format. + /// Flag specifiying that the color should be saved in + /// differential format (affects the transparent color processing). + /// The original color in OpenXML format. + public static T FromClosedXMLColor(this X14.ColorType openXMLColor, XLColor xlColor, bool isDifferential = false) + where T : X14.ColorType + { + var adapter = new X14ColorTypeAdapter(openXMLColor); + FillFromClosedXMLColor(adapter, xlColor, isDifferential); + return (T)adapter.ColorType; + } + + public static BooleanValue GetBooleanValue(bool value, bool defaultValue) + { + return value == defaultValue ? null : new BooleanValue(value); + } + + public static bool GetBooleanValueAsBool(BooleanValue value, bool defaultValue) + { + return (value?.HasValue ?? false) ? value.Value : defaultValue; + } + + /// + /// Convert color in OpenXML representation to ClosedXML type. + /// + /// Color in OpenXML format. + /// The dictionary containing parsed colors to optimize performance. + /// The color in ClosedXML format. + public static XLColor ToClosedXMLColor(this ColorType openXMLColor, IDictionary colorCache = null) + { + return ConvertToClosedXMLColor(new ColorTypeAdapter(openXMLColor), colorCache); + } + + /// + /// Convert color in OpenXML representation to ClosedXML type. + /// + /// Color in OpenXML format. + /// The dictionary containing parsed colors to optimize performance. + /// The color in ClosedXML format. + public static XLColor ToClosedXMLColor(this X14.ColorType openXMLColor, IDictionary colorCache = null) + { + return ConvertToClosedXMLColor(new X14ColorTypeAdapter(openXMLColor), colorCache); + } + + #endregion Public Methods + + #region Private Methods + + /// + /// Here we perform the actual convertion from OpenXML color to ClosedXML color. + /// + /// OpenXML color. Must be either or . + /// Since these types do not implement a common interface we use dynamic. + /// The dictionary containing parsed colors to optimize performance. + /// The color in ClosedXML format. + private static XLColor ConvertToClosedXMLColor(IColorTypeAdapter openXMLColor, IDictionary colorCache ) + { + XLColor retVal = null; + if (openXMLColor != null) + { + if (openXMLColor.Rgb != null) + { + String htmlColor = "#" + openXMLColor.Rgb.Value; + if (colorCache == null || !colorCache.TryGetValue(htmlColor, out Drawing.Color thisColor)) + { + thisColor = ColorStringParser.ParseFromHtml(htmlColor); + colorCache?.Add(htmlColor, thisColor); + } + + retVal = XLColor.FromColor(thisColor); + } + else if (openXMLColor.Indexed != null && openXMLColor.Indexed <= 64) + retVal = XLColor.FromIndex((Int32)openXMLColor.Indexed.Value); + else if (openXMLColor.Theme != null) + { + retVal = openXMLColor.Tint != null + ? XLColor.FromTheme((XLThemeColor)openXMLColor.Theme.Value, openXMLColor.Tint.Value) + : XLColor.FromTheme((XLThemeColor)openXMLColor.Theme.Value); + } + } + return retVal ?? XLColor.NoColor; + } + + /// + /// Initialize properties of the existing instance of the color in OpenXML format basing on properties of the color + /// in ClosedXML format. + /// + /// OpenXML color. Must be either or . + /// Since these types do not implement a common interface we use dynamic. + /// Color in ClosedXML format. + /// Flag specifiying that the color should be saved in + /// differential format (affects the transparent color processing). + private static void FillFromClosedXMLColor(IColorTypeAdapter openXMLColor, XLColor xlColor, bool isDifferential) + { + if (openXMLColor == null) + throw new ArgumentNullException(nameof(openXMLColor)); + + if (xlColor == null) + throw new ArgumentNullException(nameof(xlColor)); + + switch (xlColor.ColorType) + { + case XLColorType.Color: + openXMLColor.Rgb = xlColor.Color.ToHex(); + break; + + case XLColorType.Indexed: + // 64 is 'transparent' and should be ignored for differential formats + if (!isDifferential || xlColor.Indexed != 64) + openXMLColor.Indexed = (UInt32)xlColor.Indexed; + break; + + case XLColorType.Theme: + openXMLColor.Theme = (UInt32)xlColor.ThemeColor; + + if (xlColor.ThemeTint != 0) + openXMLColor.Tint = xlColor.ThemeTint; + break; + } + } + + #endregion Private Methods + } +} diff --git a/ClosedXML/Utils/XmlEncoder.cs b/ClosedXML/Utils/XmlEncoder.cs new file mode 100644 index 0000000..866852f --- /dev/null +++ b/ClosedXML/Utils/XmlEncoder.cs @@ -0,0 +1,47 @@ +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; + +namespace ClosedXML.Utils +{ + public static class XmlEncoder + { + private static readonly Regex xHHHHRegex = new Regex("_(x[\\dA-Fa-f]{4})_", RegexOptions.Compiled); + private static readonly Regex Uppercase_X_HHHHRegex = new Regex("_(X[\\dA-Fa-f]{4})_", RegexOptions.Compiled); + + public static string EncodeString(string encodeStr) + { + if (encodeStr == null) return null; + + encodeStr = xHHHHRegex.Replace(encodeStr, "_x005F_$1_"); + + var sb = new StringBuilder(encodeStr.Length); + + foreach (var ch in encodeStr) + { + if (XmlConvert.IsXmlChar(ch)) + { + sb.Append(ch); + } + else + { + sb.Append(XmlConvert.EncodeName(ch.ToString())); + } + } + + return sb.ToString(); + } + + public static string DecodeString(string decodeStr) + { + if (string.IsNullOrEmpty(decodeStr)) return string.Empty; + + // Strings "escaped" with _X (capital X) should not be treated as escaped + // Example: _Xceed_Something + // https://github.com/ClosedXML/ClosedXML/issues/1154 + decodeStr = Uppercase_X_HHHHRegex.Replace(decodeStr, "_x005F_$1_"); + + return XmlConvert.DecodeName(decodeStr); + } + } +} diff --git a/ClosedXML/XLHelper.cs b/ClosedXML/XLHelper.cs new file mode 100644 index 0000000..aa55a6c --- /dev/null +++ b/ClosedXML/XLHelper.cs @@ -0,0 +1,384 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Text.RegularExpressions; + +namespace ClosedXML.Excel +{ + /// + /// Common methods + /// + public static class XLHelper + { + public const int MinRowNumber = 1; + public const int MinColumnNumber = 1; + public const int MaxRowNumber = 1048576; + public const int MaxColumnNumber = 16384; + public const String MaxColumnLetter = "XFD"; + public const Double Epsilon = 1e-10; + + public static String LastCell { get { return $"{MaxColumnLetter}{MaxRowNumber}"; } } + + private static readonly Lazy graphics = new Lazy(() => Graphics.FromImage(new Bitmap(200, 200))); + internal static Graphics Graphics { get => graphics.Value; } + internal static Double DpiX { get => Graphics.DpiX; } + + internal static readonly NumberStyles NumberStyle = NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite | NumberStyles.AllowExponent; + internal static readonly CultureInfo ParseCulture = CultureInfo.InvariantCulture; + + internal static readonly Regex RCSimpleRegex = new Regex( + @"^(r(((-\d)?\d*)|\[(-\d)?\d*\]))?(c(((-\d)?\d*)|\[(-\d)?\d*\]))?$" + , RegexOptions.IgnoreCase | RegexOptions.Compiled); + + internal static readonly Regex A1SimpleRegex = new Regex( + @"\A" + + @"(?" // Start Group to pick + + @"(?" // Start Sheet Name, optional + + @"(" + + @"\'([^\[\]\*/\\\?:\']+|\'\')\'" + // Sheet name with special characters, surrounding apostrophes are required + + @"|" + + @"\'?\w+\'?" // Sheet name with letters and numbers, surrounding apostrophes are optional + + @")" + + @"!)?" // End Sheet Name, optional + + @"(?" // Start range + + @"\$?[a-zA-Z]{1,3}\$?\d{1,7}" // A1 Address 1 + + @"(?:\$?[a-zA-Z]{1,3}\$?\d{1,7})?" // A1 Address 2, optional + + @"|" + + @"(?\$?\d{1,7}:\$?\d{1,7})" // 1:1 + + @"|" + + @"(?\$?[a-zA-Z]{1,3}:\$?[a-zA-Z]{1,3})" // A:A + + @")" // End Range + + @")" // End Group to pick + + @"\Z" + , RegexOptions.Compiled); + + internal static readonly Regex NamedRangeReferenceRegex = + new Regex(@"^('?(?[^'!]+)'?!(?.+))|((?[^\[]+)\[(?[^\]]+)\])$", + RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture + ); + + private static readonly string[] letters = new[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; + + private static readonly string[] allLetters; + private static readonly Dictionary letterIndexes; + + static XLHelper() + { + allLetters = new string[XLHelper.MaxColumnNumber]; + letterIndexes = new Dictionary(XLHelper.MaxColumnNumber, StringComparer.Create(ParseCulture, true)); + for (int i = 0; i < XLHelper.MaxColumnNumber; i++) + { + string letter; + if (i < 26) + letter = letters[i]; + else if (i < 26 * 27) + letter = letters[i / 26 - 1] + letters[i % 26]; + else + letter = letters[(i - 26) / 26 / 26 - 1] + letters[(i / 26 - 1) % 26] + letters[i % 26]; + allLetters[i] = letter; + letterIndexes.Add(letter, i + 1); + } + } + + /// + /// Gets the column number of a given column letter. + /// + /// The column letter to translate into a column number. + public static int GetColumnNumberFromLetter(string columnLetter) + { + if (string.IsNullOrEmpty(columnLetter)) throw new ArgumentNullException("columnLetter"); + + //Extra check because we allow users to pass row col positions in as strings + if (columnLetter[0] <= '9') + { + return Int32.Parse(columnLetter, XLHelper.NumberStyle, XLHelper.ParseCulture); + } + + if (letterIndexes.TryGetValue(columnLetter, out var retVal)) + return retVal; + + throw new ArgumentOutOfRangeException(columnLetter + " is not recognized as a column letter"); + } + + /// + /// Gets the column letter of a given column number. + /// + /// The column number to translate into a column letter. + /// if set to true the column letter will be restricted to the allowed range. + /// + public static string GetColumnLetterFromNumber(int columnNumber, bool trimToAllowed = false) + { + if (trimToAllowed) columnNumber = TrimColumnNumber(columnNumber); + + if (columnNumber <= 0 || columnNumber > allLetters.Length) + throw new ArgumentOutOfRangeException(nameof(columnNumber)); + + // Adjust for start on column 1 + return allLetters[columnNumber - 1]; + } + + internal static int TrimColumnNumber(int columnNumber) + { + return Math.Max(XLHelper.MinColumnNumber, Math.Min(XLHelper.MaxColumnNumber, columnNumber)); + } + + internal static int TrimRowNumber(int rowNumber) + { + return Math.Max(XLHelper.MinRowNumber, Math.Min(XLHelper.MaxRowNumber, rowNumber)); + } + + public static bool IsValidColumn(string column) + { + if (String.IsNullOrWhiteSpace(column)) + return false; + var length = column.Length; + if (length > 3) + return false; + + var theColumn = column.ToUpper(); + + var isValid = theColumn[0] >= 'A' && theColumn[0] <= 'Z'; + if (length == 1) + return isValid; + + if (length == 2) + return isValid && theColumn[1] >= 'A' && theColumn[1] <= 'Z'; + + if (theColumn[0] >= 'A' && theColumn[0] < 'X') + return theColumn[1] >= 'A' && theColumn[1] <= 'Z' + && theColumn[2] >= 'A' && theColumn[2] <= 'Z'; + + if (theColumn[0] != 'X') return false; + + if (theColumn[1] < 'F') + return theColumn[2] >= 'A' && theColumn[2] <= 'Z'; + + if (theColumn[1] != 'F') return false; + + return theColumn[2] >= 'A' && theColumn[2] <= 'D'; + } + + public static bool IsValidRow(string rowString) + { + if (Int32.TryParse(rowString, out int row)) + return row > 0 && row <= MaxRowNumber; + return false; + } + + public static bool IsValidA1Address(string address) + { + if (String.IsNullOrWhiteSpace(address)) + return false; + + address = address.Replace("$", ""); + var rowPos = 0; + var addressLength = address.Length; + while (rowPos < addressLength && (address[rowPos] > '9' || address[rowPos] < '0')) + rowPos++; + + return + rowPos < addressLength + && IsValidRow(address.Substring(rowPos)) + && IsValidColumn(address.Substring(0, rowPos)); + } + + public static bool IsValidRCAddress(string address) + { + if (String.IsNullOrWhiteSpace(address)) + return false; + + return RCSimpleRegex.IsMatch(address); + } + + public static Boolean IsValidRangeAddress(String rangeAddress) + { + return A1SimpleRegex.IsMatch(rangeAddress); + } + + public static Boolean IsValidRangeAddress(IXLRangeAddress rangeAddress) + { + return rangeAddress.IsValid + && rangeAddress.FirstAddress.RowNumber >= 1 && rangeAddress.LastAddress.RowNumber <= MaxRowNumber + && rangeAddress.FirstAddress.ColumnNumber >= 1 && rangeAddress.LastAddress.ColumnNumber <= MaxColumnNumber + && rangeAddress.FirstAddress.RowNumber <= rangeAddress.LastAddress.RowNumber + && rangeAddress.FirstAddress.ColumnNumber <= rangeAddress.LastAddress.ColumnNumber; + } + + public static int GetColumnNumberFromAddress(string cellAddressString) + { + var rowPos = 0; + while (cellAddressString[rowPos] > '9') + rowPos++; + + return GetColumnNumberFromLetter(cellAddressString.Substring(0, rowPos)); + } + + internal static string[] SplitRange(string range) + { + return range.Contains('-') ? range.Replace('-', ':').Split(':') : range.Split(':'); + } + + public static Int32 GetPtFromPx(Double px) + { + return Convert.ToInt32(px * 72.0 / DpiX); + } + + public static Double GetPxFromPt(Int32 pt) + { + return Convert.ToDouble(pt) * DpiX / 72.0; + } + + internal static IXLTableRows InsertRowsWithoutEvents(Func insertFunc, + XLTableRange tableRange, Int32 numberOfRows, + Boolean expandTable) + { + var ws = tableRange.Worksheet; + var tracking = ws.EventTrackingEnabled; + ws.EventTrackingEnabled = false; + + var rows = new XLTableRows(ws.Style); + var inserted = insertFunc(numberOfRows, false); + inserted.ForEach(r => rows.Add(new XLTableRow(tableRange, r as XLRangeRow))); + + if (expandTable) + tableRange.Table.ExpandTableRows(numberOfRows); + + ws.EventTrackingEnabled = tracking; + + return rows; + } + +#if false +// Not using this anymore, but keeping it around for in case we bring back .NET3.5 support. + public static bool IsNullOrWhiteSpace(string value) + { +#if _NET35_ + if (value == null) return true; + return value.All(c => char.IsWhiteSpace(c)); +#else + return String.IsNullOrWhiteSpace(value); +#endif + } +#endif + + private static readonly Regex A1RegexRelative = new Regex( + @"(?<=\W)(?\$?[a-zA-Z]{1,3}\$?\d{1,7})(?=\W)" // A1 + + @"|(?<=\W)(?\$?\d{1,7}:\$?\d{1,7})(?=\W)" // 1:1 + + @"|(?<=\W)(?\$?[a-zA-Z]{1,3}:\$?[a-zA-Z]{1,3})(?=\W)", RegexOptions.Compiled); // A:A + + private static string Evaluator(Match match, Int32 row, String column) + { + if (match.Groups["one"].Success) + { + var split = match.Groups["one"].Value.Split('$'); + if (split.Length == 1) return column + row; // A1 + if (split.Length == 3) return match.Groups["one"].Value; // $A$1 + var a = XLAddress.Create(match.Groups["one"].Value); + if (split[0].Length == 0) return "$" + a.ColumnLetter + row; // $A1 + return column + "$" + a.RowNumber; + } + + if (match.Groups["two"].Success) + return ReplaceGroup(match.Groups["two"].Value, row.ToString()); + + return ReplaceGroup(match.Groups["three"].Value, column); + } + + private static String ReplaceGroup(String value, String item) + { + var split = value.Split(':'); + String ret1 = split[0].StartsWith("$") ? split[0] : item; + String ret2 = split[1].StartsWith("$") ? split[1] : item; + return ret1 + ":" + ret2; + } + + internal static String ReplaceRelative(String value, Int32 row, String column) + { + var oldValue = ">" + value + "<"; + var newVal = A1RegexRelative.Replace(oldValue, m => Evaluator(m, row, column)); + return newVal.Substring(1, newVal.Length - 2); + } + + public static Boolean AreEqual(Double d1, Double d2) + { + return Math.Abs(d1 - d2) < Epsilon; + } + + public static DateTime GetDate(Object v) + { + // handle dates + if (v is DateTime) + { + return (DateTime)v; + } + + // handle doubles + if (v is double && ((double)v).IsValidOADateNumber()) + { + return DateTime.FromOADate((double)v); + } + + // handle everything else + return (DateTime)Convert.ChangeType(v, typeof(DateTime)); + } + + internal static bool IsValidOADateNumber(this double d) + { + return -657435 <= d && d < 2958466; + } + + /// + /// A backward compatible version of that returns a value + /// rounded to milliseconds. In .Net Core 3.0 the behavior has changed and timespan includes microseconds + /// as well. As a result, the value 1:12:30 saved on one machine could become 1:12:29.999999 on another. + /// + internal static TimeSpan GetTimeSpan(double totalDays) + { + var timeSpan = TimeSpan.FromDays(totalDays); + var roundedMilliseconds = Math.Round(timeSpan.TotalMilliseconds); + return TimeSpan.FromMilliseconds(roundedMilliseconds); + } + + public static Boolean ValidateName(String objectType, String newName, String oldName, IEnumerable existingNames, out String message) + { + message = ""; + if (String.IsNullOrWhiteSpace(newName)) + { + message = $"The {objectType} name '{newName}' is invalid"; + return false; + } + + // Table names are case insensitive + if (!oldName.Equals(newName, StringComparison.OrdinalIgnoreCase) + && existingNames.Contains(newName, StringComparer.OrdinalIgnoreCase)) + { + message = $"There is already a {objectType} named '{newName}'"; + return false; + } + + var allowedFirstCharacters = new[] { '_', '\\' }; + if (!allowedFirstCharacters.Contains(newName[0]) && !char.IsLetter(newName[0])) + { + message = $"The {objectType} name '{newName}' does not begin with a letter, an underscore or a backslash."; + return false; + } + + if (newName.Length > 255) + { + message = $"The {objectType} name is more than 255 characters"; + return false; + } + + if (new[] { 'C', 'R' }.Any(c => newName.ToUpper().Equals(c.ToString()))) + { + message = $"The {objectType} name '{newName}' is invalid"; + return false; + } + + return true; + } + } +} diff --git a/ClosedXML_Examples/AutoFilters/CustomAutoFilter.cs b/ClosedXML_Examples/AutoFilters/CustomAutoFilter.cs new file mode 100644 index 0000000..d173415 --- /dev/null +++ b/ClosedXML_Examples/AutoFilters/CustomAutoFilter.cs @@ -0,0 +1,139 @@ +using System; +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class CustomAutoFilter : IXLExample + { + public void Create(string filePath) + { + var wb = new XLWorkbook(); + IXLWorksheet ws; + + #region Single Column Numbers + String singleColumnNumbers = "Single Column Numbers"; + ws = wb.Worksheets.Add(singleColumnNumbers); + + // Add a bunch of numbers to filter + ws.Cell("A1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).EqualTo(3).Or.GreaterThan(4); + + // Sort the filtered list + ws.AutoFilter.Sort(1); + #endregion + + #region Single Column Strings + String singleColumnStrings = "Single Column Strings"; + ws = wb.Worksheets.Add(singleColumnStrings); + + // Add a bunch of strings to filter + ws.Cell("A1").SetValue("Strings") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).Between("B", "D"); + + // Sort the filtered list + ws.AutoFilter.Sort(1); + #endregion + + #region Single Column Mixed + String singleColumnMixed = "Single Column Mixed"; + ws = wb.Worksheets.Add(singleColumnMixed); + + // Add a bunch of items to filter + ws.Cell("A1").SetValue("Mixed") + .CellBelow().SetValue("B") + .CellBelow().SetValue(3) + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).EqualTo(3).Or.EqualTo("C"); + + // Sort the filtered list + ws.AutoFilter.Sort(1); + #endregion + + #region Multi Column + String multiColumn = "Multi Column"; + ws = wb.Worksheets.Add(multiColumn); + + ws.Cell("A1").SetValue("First") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + ws.Cell("B1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + ws.Cell("C1").SetValue("Strings") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(2).EqualTo(3).Or.GreaterThan(4); + ws.RangeUsed().SetAutoFilter().Column(3).Between("B", "D"); + + // Sort the filtered list + ws.AutoFilter.Sort(3); + #endregion + + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms); + + var workbook = new XLWorkbook(ms); + + #region Single Column Numbers + workbook.Worksheet(singleColumnNumbers).AutoFilter.Sort(1, XLSortOrder.Descending); + #endregion + + #region Single Column Strings + workbook.Worksheet(singleColumnStrings).AutoFilter.Sort(1, XLSortOrder.Descending); + #endregion + + #region Single Column Mixed + workbook.Worksheet(singleColumnMixed).AutoFilter.Column(1).EqualOrGreaterThan("D"); + workbook.Worksheet(singleColumnMixed).AutoFilter.Sort(1, XLSortOrder.Descending); + #endregion + + #region Multi Column + workbook.Worksheet(multiColumn).AutoFilter.Column(3).EqualTo("E"); + workbook.Worksheet(multiColumn).AutoFilter.Sort(3, XLSortOrder.Descending); + #endregion + + workbook.SaveAs(filePath); + ms.Close(); + } + } + } +} diff --git a/ClosedXML_Examples/AutoFilters/DateTimeGroupAutoFilter.cs b/ClosedXML_Examples/AutoFilters/DateTimeGroupAutoFilter.cs new file mode 100644 index 0000000..68905d2 --- /dev/null +++ b/ClosedXML_Examples/AutoFilters/DateTimeGroupAutoFilter.cs @@ -0,0 +1,43 @@ +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples +{ + public class DateTimeGroupAutoFilter : IXLExample + { + public void Create(string filePath) + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws; + + #region Single Column Dates + + String singleColumnDates = "Single Column Dates"; + ws = wb.Worksheets.Add(singleColumnDates); + + // Add a bunch of numbers to filter + ws.Cell("A1").SetValue("Dates") + .CellBelow().SetValue(new DateTime(2018, 1, 1).AddDays(2)) + .CellBelow().SetValue(new DateTime(2018, 1, 1).AddDays(3)) + .CellBelow().SetValue(new DateTime(2018, 1, 1).AddDays(3)) + .CellBelow().SetValue(new DateTime(2018, 1, 1).AddDays(5)) + .CellBelow().SetValue(new DateTime(2018, 1, 1).AddDays(1)) + .CellBelow().SetValue(new DateTime(2018, 1, 1).AddDays(4)); + + ws.Column(1).Style.NumberFormat.Format = "d MMMM yyyy"; + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).AddDateGroupFilter(new DateTime(2018, 1, 1).AddDays(3), XLDateTimeGrouping.Day); + + // Sort the filtered list + ws.AutoFilter.Sort(1); + + #endregion Single Column Dates + + ws.Columns().AdjustToContents(); + wb.SaveAs(filePath); + } + } + } +} diff --git a/ClosedXML_Examples/AutoFilters/DynamicAutoFilter.cs b/ClosedXML_Examples/AutoFilters/DynamicAutoFilter.cs new file mode 100644 index 0000000..543e14b --- /dev/null +++ b/ClosedXML_Examples/AutoFilters/DynamicAutoFilter.cs @@ -0,0 +1,88 @@ +using System; +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class DynamicAutoFilter : IXLExample + { + public void Create(string filePath) + { + var wb = new XLWorkbook(); + IXLWorksheet ws; + + #region Single Column Numbers + String singleColumnNumbers = "Single Column Numbers"; + ws = wb.Worksheets.Add(singleColumnNumbers); + + // Add a bunch of numbers to filter + ws.Cell("A1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).AboveAverage(); + + // Sort the filtered list + //ws.AutoFilter.Sort(1); + #endregion + + #region Multi Column + String multiColumn = "Multi Column"; + ws = wb.Worksheets.Add(multiColumn); + + ws.Cell("A1").SetValue("First") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + ws.Cell("B1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + ws.Cell("C1").SetValue("Strings") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(2).BelowAverage(); + + // Sort the filtered list + //ws.AutoFilter.Sort(3); + #endregion + + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms); + + var workbook = new XLWorkbook(ms); + + #region Single Column Numbers + //workbook.Worksheet(singleColumnNumbers).AutoFilter.Sort(1, XLSortOrder.Descending); + #endregion + + #region Multi Column + //workbook.Worksheet(multiColumn).AutoFilter.Sort(3, XLSortOrder.Descending); + #endregion + + workbook.SaveAs(filePath); + ms.Close(); + } + } + } +} diff --git a/ClosedXML_Examples/AutoFilters/RegularAutoFilter.cs b/ClosedXML_Examples/AutoFilters/RegularAutoFilter.cs new file mode 100644 index 0000000..9619ae2 --- /dev/null +++ b/ClosedXML_Examples/AutoFilters/RegularAutoFilter.cs @@ -0,0 +1,205 @@ +using ClosedXML.Excel; +using System; +using System.IO; + +namespace ClosedXML_Examples +{ + public class RegularAutoFilter : IXLExample + { + public void Create(string filePath) + { + var wb = new XLWorkbook(); + IXLWorksheet ws; + + #region Single Column Numbers + + String singleColumnNumbers = "Single Column Numbers"; + ws = wb.Worksheets.Add(singleColumnNumbers); + + // Add a bunch of numbers to filter + ws.Cell("A1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4) + .CellBelow().SetValue(5); + + ws.Cell("B1").SetValue("Names") + .CellBelow().SetValue("John") + .CellBelow().SetValue("Jack") + .CellBelow().SetValue("Neil") + .CellBelow().SetValue("Alex") + .CellBelow().SetValue("Jason") + .CellBelow().SetValue("Patrick") + .CellBelow().SetValue("Jacques"); + + // Add filters + var autoFilter = ws.RangeUsed().SetAutoFilter(); + autoFilter.Column(1).AddFilter(3) + .AddFilter(1); + + autoFilter.Column(2).BeginsWith("J"); + + // Sort the filtered list + ws.AutoFilter.Sort(1); + + #endregion Single Column Numbers + + #region Single Column Strings + + String singleColumnStrings = "Single Column Strings"; + ws = wb.Worksheets.Add(singleColumnStrings); + + // Add a bunch of strings to filter + ws.Cell("A1").SetValue("Strings") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).AddFilter("C") + .AddFilter("A"); + + // Sort the filtered list + ws.AutoFilter.Sort(1); + + #endregion Single Column Strings + + #region Single Column Mixed + + String singleColumnMixed = "Single Column Mixed"; + ws = wb.Worksheets.Add(singleColumnMixed); + + // Add a bunch of items to filter + ws.Cell("A1").SetValue("Mixed") + .CellBelow().SetValue("B") + .CellBelow().SetValue(3) + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).AddFilter("C") + .AddFilter(1); + + // Sort the filtered list + ws.AutoFilter.Sort(1); + + #endregion Single Column Mixed + + #region Multi Column + + String multiColumn = "Multi Column"; + ws = wb.Worksheets.Add(multiColumn); + + ws.Cell("A1").SetValue("First") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + ws.Cell("B1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + ws.Cell("C1").SetValue("Strings") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(2).AddFilter(3) + .AddFilter(1); + + // Sort the filtered list + ws.AutoFilter.Sort(3); + + #endregion Multi Column + + #region Table + + String tableSheetName = "Table"; + ws = wb.Worksheets.Add(tableSheetName); + + // Add a bunch of numbers to filter + ws.Cell("A1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + // Add filters + var table = ws.RangeUsed().CreateTable(); + table.ShowTotalsRow = true; + table.Field(0).TotalsRowFunction = XLTotalsRowFunction.Sum; + table.AutoFilter.Column(1).AddFilter(3).AddFilter(4); + + table.AutoFilter.Sort(1); + + #endregion Table + + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms); + + var workbook = new XLWorkbook(ms); + + #region Single Column Numbers + + workbook.Worksheet(singleColumnNumbers).AutoFilter.Column(1).AddFilter(5); + workbook.Worksheet(singleColumnNumbers).AutoFilter.Sort(1, XLSortOrder.Descending); + + #endregion Single Column Numbers + + #region Single Column Strings + + workbook.Worksheet(singleColumnStrings).AutoFilter.Column(1).AddFilter("E"); + workbook.Worksheet(singleColumnStrings).AutoFilter.Sort(1, XLSortOrder.Descending); + + #endregion Single Column Strings + + #region Single Column Mixed + + workbook.Worksheet(singleColumnMixed).AutoFilter.Column(1).AddFilter("E"); + workbook.Worksheet(singleColumnMixed).AutoFilter.Column(1).AddFilter(3); + workbook.Worksheet(singleColumnMixed).AutoFilter.Sort(1, XLSortOrder.Descending); + + #endregion Single Column Mixed + + #region Multi Column + + workbook.Worksheet(multiColumn).AutoFilter.Column(3).AddFilter("C"); + workbook.Worksheet(multiColumn).AutoFilter.Sort(3, XLSortOrder.Descending); + + #endregion Multi Column + + #region Table + + workbook.Worksheet(tableSheetName).Table(0).AutoFilter.Column(1).AddFilter(5); + workbook.Worksheet(tableSheetName).Table(0).AutoFilter.Sort(1, XLSortOrder.Descending); + + #endregion Table + + workbook.SaveAs(filePath); + ms.Close(); + } + } + } +} diff --git a/ClosedXML_Examples/AutoFilters/TopBottomAutoFilter.cs b/ClosedXML_Examples/AutoFilters/TopBottomAutoFilter.cs new file mode 100644 index 0000000..7d3b0b7 --- /dev/null +++ b/ClosedXML_Examples/AutoFilters/TopBottomAutoFilter.cs @@ -0,0 +1,88 @@ +using System; +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class TopBottomAutoFilter : IXLExample + { + public void Create(string filePath) + { + var wb = new XLWorkbook(); + IXLWorksheet ws; + + #region Single Column Numbers + String singleColumnNumbers = "Single Column Numbers"; + ws = wb.Worksheets.Add(singleColumnNumbers); + + // Add a bunch of numbers to filter + ws.Cell("A1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).Top(2); + + // Sort the filtered list + //ws.AutoFilter.Sort(1); + #endregion + + #region Multi Column + String multiColumn = "Multi Column"; + ws = wb.Worksheets.Add(multiColumn); + + ws.Cell("A1").SetValue("First") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + ws.Cell("B1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + ws.Cell("C1").SetValue("Strings") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(2).Bottom(50, XLTopBottomType.Percent); + + // Sort the filtered list + //ws.AutoFilter.Sort(3); + #endregion + + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms); + + var workbook = new XLWorkbook(ms); + + #region Single Column Numbers + //workbook.Worksheet(singleColumnNumbers).AutoFilter.Sort(1, XLSortOrder.Descending); + #endregion + + #region Multi Column + //workbook.Worksheet(multiColumn).AutoFilter.Sort(3, XLSortOrder.Descending); + #endregion + + workbook.SaveAs(filePath); + ms.Close(); + } + } + } +} diff --git a/ClosedXML_Examples/BasicTable.cs b/ClosedXML_Examples/BasicTable.cs new file mode 100644 index 0000000..083e890 --- /dev/null +++ b/ClosedXML_Examples/BasicTable.cs @@ -0,0 +1,93 @@ +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples +{ + public class BasicTable : IXLExample + { + public void Create(string filePath) + { + // Creating a new workbook + var wb = new XLWorkbook(); + + //Adding a worksheet + var ws = wb.Worksheets.Add("Contacts"); + + //Adding text + //Title + ws.Cell("B2").Value = "Contacts"; + //First Names + ws.Cell("B3").Value = "FName"; + ws.Cell("B4").Value = "John"; + ws.Cell("B5").Value = "Hank"; + ws.Cell("B6").Value = "Dagny"; + //Last Names + ws.Cell("C3").Value = "LName"; + ws.Cell("C4").Value = "Galt"; + ws.Cell("C5").Value = "Rearden"; + ws.Cell("C6").Value = "Taggart"; + + //Adding more data types + //Is an outcast? + ws.Cell("D3").Value = "Outcast"; + ws.Cell("D4").Value = true; + ws.Cell("D5").Value = false; + ws.Cell("D6").Value = false; + //Date of Birth + ws.Cell("E3").Value = "DOB"; + ws.Cell("E4").Value = new DateTime(1919, 1, 21); + ws.Cell("E5").Value = new DateTime(1907, 3, 4); + ws.Cell("E6").Value = new DateTime(1921, 12, 15); + //Income + ws.Cell("F3").Value = "Income"; + ws.Cell("F4").Value = 2000; + ws.Cell("F5").Value = 40000; + ws.Cell("F6").Value = 10000; + + //Defining ranges + //From worksheet + var rngTable = ws.Range("B2:F6"); + //From another range + var rngDates = rngTable.Range("E4:E6"); + var rngNumbers = rngTable.Range("F4:F6"); + + //Formatting dates and numbers + //Using a OpenXML's predefined formats + rngDates.Style.NumberFormat.NumberFormatId = 15; + //Using a custom format + rngNumbers.Style.NumberFormat.Format = "$ #,##0"; + + //Formatting headers + var rngHeaders = rngTable.Range("B3:F3"); + rngHeaders.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + rngHeaders.Style.Font.Bold = true; + rngHeaders.Style.Fill.BackgroundColor = XLColor.Aqua; + + //Adding grid lines + rngTable.Style.Border.BottomBorder = XLBorderStyleValues.Thin; + + //Format title cell + rngTable.Cell(1, 1).Style.Font.Bold = true; + rngTable.Cell(1, 1).Style.Fill.BackgroundColor = XLColor.CornflowerBlue; + rngTable.Cell(1, 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + + //Merge title cells + rngTable.Row(1).Merge(); // We could've also used: rngTable.Range("A1:E1").Merge() + + //Add thick borders + rngTable.Style.Border.OutsideBorder = XLBorderStyleValues.Thick; + + // You can also specify the border for each side with: + // rngTable.FirstColumn().Style.Border.LeftBorder = XLBorderStyleValues.Thick; + // rngTable.LastColumn().Style.Border.RightBorder = XLBorderStyleValues.Thick; + // rngTable.FirstRow().Style.Border.TopBorder = XLBorderStyleValues.Thick; + // rngTable.LastRow().Style.Border.BottomBorder = XLBorderStyleValues.Thick; + + // Adjust column widths to their content + ws.Columns(2, 6).AdjustToContents(); + + //Saving the workbook + wb.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/ClosedXML.snk b/ClosedXML_Examples/ClosedXML.snk new file mode 100644 index 0000000000000000000000000000000000000000..a17cff7ca6e08736fb1cb34fe2fb78dd2538bb8d GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097@`-`QKXZ~|dWD<<0Ju<{xxS3REG#fD>`kXX+v-y54cP=LhCw--* z#ZH~Hg>y#!*B8(sJ8X4@N8kwu@1XxOgH)#^X_Wc~ya61EV6&GsN?8#3zn5H*G18Aq zlPH)t7tXS}26fm?71YYx22fe0j=RjE)u?dKA#_Fyb*JK(Tq!Qy>IPo!%Ecrqzk+3~ zYEDo>0Ipgys{O_Sc)Xnd$i}z{gSf-B1h$a#;gE?it@uU=^9BT)|8MtGtqt%QwRx&G z-EO;UfkchjGeaQ9%2A3jD|v}+JI&)a;)OTvU(a&r(`cpWs~*kTOHVP;=NopJhJ2heC!9#ijkT>4 zCmWC4_A*kD + + + netcoreapp2.0;net40;net46 + 8.0 + Exe + 0.95.4 + $(NoWarn);NU1605 + Debug;Release;Release.Signed + + + + bin\Release.Signed\ + true + ClosedXML.snk + $(DefineConstants);STRONGNAME + + + + $(DefineConstants);_NETSTANDARD_;_NETSTANDARD2_0_ + + + + $(DefineConstants);_NETFRAMEWORK_;_NET40_ + + + + $(DefineConstants);_NETFRAMEWORK_;_NET46_ + + + + + + + + + + + + + + + + + + diff --git a/ClosedXML_Examples/Columns/ColumnCells.cs b/ClosedXML_Examples/Columns/ColumnCells.cs new file mode 100644 index 0000000..3c26137 --- /dev/null +++ b/ClosedXML_Examples/Columns/ColumnCells.cs @@ -0,0 +1,32 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples +{ + public class ColumnCells : IXLExample + { + + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Column Cells"); + + var columnFromWorksheet = ws.Column(1); + columnFromWorksheet.Cell(1).Style.Fill.BackgroundColor = XLColor.Red; + columnFromWorksheet.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue; + columnFromWorksheet.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red; + columnFromWorksheet.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue; + + var columnFromRange = ws.Range("B1:B9").FirstColumn(); + + columnFromRange.Cell(1).Style.Fill.BackgroundColor = XLColor.Red; + columnFromRange.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue; + columnFromRange.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red; + columnFromRange.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue; + + workbook.SaveAs(filePath); + } + + } +} diff --git a/ClosedXML_Examples/Columns/ColumnCollections.cs b/ClosedXML_Examples/Columns/ColumnCollections.cs new file mode 100644 index 0000000..33395ad --- /dev/null +++ b/ClosedXML_Examples/Columns/ColumnCollections.cs @@ -0,0 +1,108 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Columns +{ + public class ColumnCollection : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Columns of a Range"); + + // All columns in a range + ws.Range("A1:B2").Columns().Style.Fill.BackgroundColor = XLColor.DimGray; + + var bigRange = ws.Range("A4:V6"); + + // Contiguous columns by number + bigRange.Columns(1, 2).Style.Fill.BackgroundColor = XLColor.Red; + + // Contiguous columns by letter + bigRange.Columns("D", "E").Style.Fill.BackgroundColor = XLColor.Blue; + + // Contiguous columns by letter + bigRange.Columns("G:H").Style.Fill.BackgroundColor = XLColor.DeepPink; + + // Spread columns by number + bigRange.Columns("10:11,13:14").Style.Fill.BackgroundColor = XLColor.Orange; + + // Spread columns by letter + bigRange.Columns("P:Q,S:T").Style.Fill.BackgroundColor = XLColor.Turquoise; + + // Use a single number/letter + bigRange.Columns("V").Style.Fill.BackgroundColor = XLColor.Cyan; + + // Adjust the width + ws.Columns("A:V").Width = 3; + + var ws2 = workbook.Worksheets.Add("Columns of a worksheet"); + + // Contiguous columns by number + ws2.Columns(1, 2).Style.Fill.BackgroundColor = XLColor.Red; + + // Contiguous columns by letter + ws2.Columns("D", "E").Style.Fill.BackgroundColor = XLColor.Blue; + + // Contiguous columns by letter + ws2.Columns("G:H").Style.Fill.BackgroundColor = XLColor.DeepPink; + + // Spread columns by number + ws2.Columns("10:11,13:14").Style.Fill.BackgroundColor = XLColor.Orange; + + // Spread columns by letter + ws2.Columns("P:Q,S:T").Style.Fill.BackgroundColor = XLColor.Turquoise; + + // Use a single number/letter + ws2.Columns("V").Style.Fill.BackgroundColor = XLColor.Cyan; + + // Adjust the width + ws2.Columns("A:V").Width = 3; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Columns/ColumnSettings.cs b/ClosedXML_Examples/Columns/ColumnSettings.cs new file mode 100644 index 0000000..289d5ff --- /dev/null +++ b/ClosedXML_Examples/Columns/ColumnSettings.cs @@ -0,0 +1,80 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Columns +{ + public class ColumnSettings : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Constructors + + // Public + public ColumnSettings() + { + + } + + + // Private + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Column Settings"); + + var col1 = ws.Column("B"); + col1.Style.Fill.BackgroundColor = XLColor.Red; + col1.Width = 20; + + var col2 = ws.Column(4); + col2.Style.Fill.BackgroundColor = XLColor.DarkOrange; + col2.Width = 5; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Columns/DeletingColumns.cs b/ClosedXML_Examples/Columns/DeletingColumns.cs new file mode 100644 index 0000000..c4f2e84 --- /dev/null +++ b/ClosedXML_Examples/Columns/DeletingColumns.cs @@ -0,0 +1,75 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples +{ + public class DeletingColumns : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Deleting Columns"); + + var rngTitles = ws.Range("B2:D2"); + ws.Row(1).InsertRowsBelow(2); + + var rng1 = ws.Range("B2:D2"); + var rng2 = ws.Range("F2:G2"); + var rng3 = ws.Range("A1:A3"); + var col1 = ws.Column(1); + + rng1.Style.Fill.BackgroundColor = XLColor.Orange; + rng2.Style.Fill.BackgroundColor = XLColor.Blue; + rng3.Style.Fill.BackgroundColor = XLColor.Red; + col1.Style.Fill.BackgroundColor = XLColor.Black; + + ws.Columns("A,C,E:H").Delete(); + ws.Cell("A2").Value = "OK"; + ws.Cell("B2").Value = "OK"; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Columns/InsertColumns.cs b/ClosedXML_Examples/Columns/InsertColumns.cs new file mode 100644 index 0000000..e908c01 --- /dev/null +++ b/ClosedXML_Examples/Columns/InsertColumns.cs @@ -0,0 +1,40 @@ +using ClosedXML.Excel; +using System; +using System.Linq; + +namespace ClosedXML_Examples.Columns +{ + public class InsertColumns : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Inserting Columns"); + + // Color the entire spreadsheet using columns + ws.Columns().Style.Fill.BackgroundColor = XLColor.LightCyan; + + // Put a value in a few cells + foreach (var r in Enumerable.Range(1, 5)) + foreach (var c in Enumerable.Range(1, 5)) + ws.Cell(r, c).Value = "X"; + + var blueColumn = ws.Column(2); + var redColumn = ws.Column(5); + + blueColumn.Style.Fill.BackgroundColor = XLColor.Blue; + blueColumn.InsertColumnsAfter(2); + + redColumn.Style.Fill.BackgroundColor = XLColor.Red; + redColumn.InsertColumnsBefore(2); + + ws.Rows(3, 4).Style.Fill.BackgroundColor = XLColor.Orange; + ws.Range("B1:D1").InsertColumnsAfter(2); + ws.Range("B2:D2").InsertColumnsBefore(2); + ws.Range("B3:D3").InsertColumnsAfter(2); + ws.Range("B4:D4").InsertColumnsBefore(2); + + workbook.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Comments/AddingComments.cs b/ClosedXML_Examples/Comments/AddingComments.cs new file mode 100644 index 0000000..a095894 --- /dev/null +++ b/ClosedXML_Examples/Comments/AddingComments.cs @@ -0,0 +1,285 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ClosedXML.Excel; +using System.IO; +using MoreLinq; + +namespace ClosedXML_Examples +{ + public class AddingComments : IXLExample + { + + public void Create(string filePath) + { + var wb = new XLWorkbook {Author = "Manuel"}; + AddMiscComments(wb); + AddVisibilityComments(wb); + AddPosition(wb); + AddSignatures(wb); + AddStyleAlignment(wb); + AddColorsAndLines(wb); + AddMagins(wb); + AddProperties(wb); + AddProtection(wb); + AddSize(wb); + AddWeb(wb); + + wb.SaveAs(filePath); + } + + private void AddWeb(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Web"); + ws.Cell("A1").Comment.Style.Web.AlternateText = "The alternate text in case you need it."; + } + + private void AddSize(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Size"); + + // Automatic size is a copy of the property comment.Style.Alignment.AutomaticSize + // I created the duplicate because it makes more sense for it to be in Size + // but Excel has it under the Alignment tab. + ws.Cell("A2").Comment.AddText("Things are very tight around here."); + ws.Cell("A2").Comment.Style.Size.SetAutomaticSize(); + + ws.Cell("A4").Comment.AddText("Different size"); + ws.Cell("A4").Comment.Style + .Size.SetHeight(30) // The height is set in the same units as row.Height + .Size.SetWidth(30); // The width is set in the same units as row.Width + + // Set all comments to visible + ws.CellsUsed(XLCellsUsedOptions.All, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); + } + + private void AddProtection(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Protection"); + + ws.Cell("A1").Comment.Style + .Protection.SetLocked(false) + .Protection.SetLockText(false); + } + + private void AddProperties(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Properties"); + + ws.Cell("A1").Comment.Style.Properties.Positioning = XLDrawingAnchor.Absolute; + ws.Cell("A2").Comment.Style.Properties.Positioning = XLDrawingAnchor.MoveAndSizeWithCells; + ws.Cell("A3").Comment.Style.Properties.Positioning = XLDrawingAnchor.MoveWithCells; + } + + private void AddMagins(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Margins"); + + ws.Cell("A2").Comment + .SetVisible() + .AddText("Lorem ipsum dolor sit amet, adipiscing elit. ").AddNewLine() + .AddText("Nunc elementum, sapien a ultrices, commodo nisl. ").AddNewLine() + .AddText("Consequat erat lectus a nisi. Aliquam facilisis."); + + ws.Cell("A2").Comment.Style + .Margins.SetAll(0.25) + .Size.SetAutomaticSize(); + } + + private void AddColorsAndLines(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Colors and Lines"); + + ws.Cell("A2").Comment + .AddText("Now ") + .AddText("THIS").SetBold().SetFontColor(XLColor.Red) + .AddText(" is colorful!"); + ws.Cell("A2").Comment.Style + .ColorsAndLines.SetFillColor(XLColor.RichCarmine) + .ColorsAndLines.SetFillTransparency(0.25) // 25% opaque + .ColorsAndLines.SetLineColor(XLColor.Blue) + .ColorsAndLines.SetLineTransparency(0.75) // 75% opaque + .ColorsAndLines.SetLineDash(XLDashStyle.LongDash) + .ColorsAndLines.SetLineStyle(XLLineStyle.ThickBetweenThin) + .ColorsAndLines.SetLineWeight(7.5); + + // Set all comments to visible + ws.CellsUsed(XLCellsUsedOptions.All, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); + } + + private void AddStyleAlignment(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Alignment"); + + // Automagically adjust the size of the comment to fit the contents + ws.Cell("A1").Comment.Style.Alignment.SetAutomaticSize(); + ws.Cell("A1").Comment.AddText("Things are pretty tight around here"); + + // Default values + ws.Cell("A3").Comment + .AddText("Default Alignments:").AddNewLine() + .AddText("Vertical = Top").AddNewLine() + .AddText("Horizontal = Left").AddNewLine() + .AddText("Orientation = Left to Right"); + + // Let's change the alignments + ws.Cell("A8").Comment + .AddText("Vertical = Bottom").AddNewLine() + .AddText("Horizontal = Right"); + ws.Cell("A8").Comment.Style + .Alignment.SetVertical(XLDrawingVerticalAlignment.Bottom) + .Alignment.SetHorizontal(XLDrawingHorizontalAlignment.Right); + + // And now the orientation... + ws.Cell("D3").Comment.AddText("Orientation = Bottom to Top"); + ws.Cell("D3").Comment.Style + .Alignment.SetOrientation(XLDrawingTextOrientation.BottomToTop) + .Alignment.SetAutomaticSize(); + + ws.Cell("E3").Comment.AddText("Orientation = Top to Bottom"); + ws.Cell("E3").Comment.Style + .Alignment.SetOrientation(XLDrawingTextOrientation.TopToBottom) + .Alignment.SetAutomaticSize(); + + ws.Cell("F3").Comment.AddText("Orientation = Vertical"); + ws.Cell("F3").Comment.Style + .Alignment.SetOrientation(XLDrawingTextOrientation.Vertical) + .Alignment.SetAutomaticSize(); + + + // Set all comments to visible + ws.CellsUsed(XLCellsUsedOptions.All, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); + } + + private static void AddMiscComments(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Comments"); + + ws.Cell("A1").SetValue("Hidden").Comment.AddText("Hidden"); + ws.Cell("A2").SetValue("Visible").Comment.AddText("Visible"); + ws.Cell("A3").SetValue("On Top").Comment.AddText("On Top"); + ws.Cell("A4").SetValue("Underneath").Comment.AddText("Underneath"); + ws.Cell("A4").Comment.Style.Alignment.SetVertical(XLDrawingVerticalAlignment.Bottom); + ws.Cell("A3").Comment.SetZOrder(ws.Cell("A4").Comment.ZOrder + 1); + + ws.Cell("D9").Comment.AddText("Vertical"); + ws.Cell("D9").Comment.Style.Alignment.Orientation = XLDrawingTextOrientation.Vertical; + ws.Cell("D9").Comment.Style.Size.SetAutomaticSize(); + + ws.Cell("E9").Comment.AddText("Top to Bottom"); + ws.Cell("E9").Comment.Style.Alignment.Orientation = XLDrawingTextOrientation.TopToBottom; + ws.Cell("E9").Comment.Style.Size.SetAutomaticSize(); + + ws.Cell("F9").Comment.AddText("Bottom to Top"); + ws.Cell("F9").Comment.Style.Alignment.Orientation = XLDrawingTextOrientation.BottomToTop; + ws.Cell("F9").Comment.Style.Size.SetAutomaticSize(); + + ws.Cell("E1").Comment.Position.SetColumn(5); + ws.Cell("E1").Comment.AddText("Start on Col E, on top border"); + ws.Cell("E1").Comment.Style.Size.SetWidth(10); + var cE3 = ws.Cell("E3").Comment; + cE3.AddText("Size and position"); + cE3.Position.SetColumn(5).SetRow(4).SetColumnOffset(7).SetRowOffset(10); + cE3.Style.Size.SetHeight(25).Size.SetWidth(10); + var cE7 = ws.Cell("E7").Comment; + cE7.Position.SetColumn(6).SetRow(7).SetColumnOffset(0).SetRowOffset(0); + cE7.Style.Size.SetHeight(ws.Row(7).Height).Size.SetWidth(ws.Column(6).Width); + + ws.Cell("G1").Comment.AddText("Automatic Size"); + ws.Cell("G1").Comment.Style.Alignment.SetAutomaticSize(); + var cG3 = ws.Cell("G3").Comment; + cG3.SetAuthor("MDeLeon"); + cG3.AddSignature(); + cG3.AddText("This is a test of the emergency broadcast system."); + cG3.AddNewLine(); + cG3.AddText("Do "); + cG3.AddText("NOT").SetFontColor(XLColor.RadicalRed).SetUnderline().SetBold(); + cG3.AddText(" forget it."); + cG3.Style + .Size.SetWidth(25) + .Size.SetHeight(100) + .Alignment.SetDirection(XLDrawingTextDirection.LeftToRight) + .Alignment.SetHorizontal(XLDrawingHorizontalAlignment.Distributed) + .Alignment.SetVertical(XLDrawingVerticalAlignment.Center) + .Alignment.SetOrientation(XLDrawingTextOrientation.LeftToRight) + .ColorsAndLines.SetFillColor(XLColor.Cyan) + .ColorsAndLines.SetFillTransparency(0.25) + .ColorsAndLines.SetLineColor(XLColor.DarkBlue) + .ColorsAndLines.SetLineTransparency(0.75) + .ColorsAndLines.SetLineDash(XLDashStyle.DashDot) + .ColorsAndLines.SetLineStyle(XLLineStyle.ThinThick) + .ColorsAndLines.SetLineWeight(5) + .Margins.SetAll(0.25) + .Properties.SetPositioning(XLDrawingAnchor.MoveAndSizeWithCells) + .Protection.SetLocked(false) + .Protection.SetLockText(false) + .Web.SetAlternateText("This won't be released to the web"); + + ws.Cell("A9").Comment.SetAuthor("MDeLeon").AddSignature().AddText("Something"); + ws.Cell("A9").Comment.SetBold().SetFontColor(XLColor.DarkBlue); + + ws.CellsUsed(XLCellsUsedOptions.All, c => !c.Address.ToStringRelative().Equals("A1") && c.HasComment).ForEach(c => c.Comment.SetVisible()); + } + + private static void AddVisibilityComments(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Visibility"); + + // By default comments are hidden + ws.Cell("A1").SetValue("I have a hidden comment").Comment.AddText("Hidden"); + + // Set the comment as visible + ws.Cell("A2").Comment.SetVisible().AddText("Visible"); + + // The ZOrder on previous comments were 1 and 2 respectively + // here we're explicit about the ZOrder + ws.Cell("A3").Comment.SetZOrder(5).SetVisible().AddText("On Top"); + + // We want this comment to appear underneath the one for A3 + // so we set the ZOrder to something lower + ws.Cell("A4").Comment.SetZOrder(4).SetVisible().AddText("Underneath"); + ws.Cell("A4").Comment.Style.Alignment.SetVertical(XLDrawingVerticalAlignment.Bottom); + + // Alternatively you could set all comments to visible with the following line: + // ws.CellsUsed(true, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); + + ws.Columns().AdjustToContents(); + } + + private void AddPosition(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Position"); + + ws.Columns().Width = 10; + + ws.Cell("A1").Comment.AddText("This is an unusual place for a comment..."); + ws.Cell("A1").Comment.Position + .SetColumn(3) // Starting from the third column + .SetColumnOffset(5) // The comment will start in the middle of the third column + .SetRow(5) // Starting from the fifth row + .SetRowOffset(7.5); // The comment will start in the middle of the fifth row + + // Set all comments to visible + ws.CellsUsed(XLCellsUsedOptions.All, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); + } + + private void AddSignatures(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Signatures"); + + // By default the signature will be with the logged user + // ws.Cell("A2").Comment.AddSignature().AddText("Hello World!"); + + // You can override this by specifying the comment's author: + ws.Cell("A2").Comment + .SetAuthor("MDeLeon") + .AddSignature() + .AddText("Hello World!"); + + + // Set all comments to visible + ws.CellsUsed(XLCellsUsedOptions.All, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); + } + } +} diff --git a/ClosedXML_Examples/Comments/EditingComments.cs b/ClosedXML_Examples/Comments/EditingComments.cs new file mode 100644 index 0000000..284f157 --- /dev/null +++ b/ClosedXML_Examples/Comments/EditingComments.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ClosedXML.Excel; +using System.IO; + +namespace ClosedXML_Examples +{ + class EditingComments : IXLExample + { + + public void Create(string filePath) { + + // Exercise(@"path/to/test/resources/comments"); + + } + + public void Exercise(string basePath) + { + + // INCOMPLETE + + var book = new XLWorkbook(Path.Combine(basePath, "EditingComments.xlsx")); + var sheet = book.Worksheet(1); + + // no change + // A1 + + // edit existing comment + sheet.Cell("B3").Comment.AddNewLine(); + sheet.Cell("B3").Comment.AddSignature(); + sheet.Cell("B3").Comment.AddText("more comment"); + + // delete + //sheet.Cell("C1").DeleteComment(); + + // clear contents + sheet.Cell("D3").Clear(XLClearOptions.Contents); + + // new basic + sheet.Cell("E1").Comment.AddText("non authored comment"); + + // new with author + sheet.Cell("F3").Comment.AddSignature(); + sheet.Cell("F3").Comment.AddText("comment from author"); + + // TODO: merge with cells + // TODO: resize with cells + // TODO: visible + + book.SaveAs(Path.Combine(basePath, "EditingComments_modified.xlsx")); + } + } +} diff --git a/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs b/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs new file mode 100644 index 0000000..f4af662 --- /dev/null +++ b/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs @@ -0,0 +1,761 @@ +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples +{ + public class CFColorScaleLowMidHigh : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().ColorScale() + .LowestValue(XLColor.Red) + .Midpoint(XLCFContentType.Percent, "50", XLColor.Yellow) + .HighestValue(XLColor.Green); + + workbook.SaveAs(filePath); + } + } + + public class CFColorScaleLowHigh : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().ColorScale() + .Minimum(XLCFContentType.Number, "2", XLColor.Red) + .Maximum(XLCFContentType.Percentile, "90", XLColor.Green); + + workbook.SaveAs(filePath); + } + } + + public class CFColorScaleMinimumMaximum : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().ColorScale() + .LowestValue(XLColor.FromHtml("#FFFF7128")) + .HighestValue(XLColor.FromHtml("#FFFFEF9C")); + + workbook.SaveAs(filePath); + } + } + + public class CFStartsWith : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("Hellos") + .CellBelow().SetValue("Hell") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenStartsWith("Hell") + .Fill.SetBackgroundColor(XLColor.Red) + .Border.SetOutsideBorder(XLBorderStyleValues.Thick) + .Border.SetOutsideBorderColor(XLColor.Blue) + .Font.SetBold(); + + workbook.SaveAs(filePath); + } + } + + public class CFEndsWith : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("Hellos") + .CellBelow().SetValue("Hell") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenEndsWith("ll") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFIsBlank : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("") + .CellBelow().SetValue("") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenIsBlank() + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFNotBlank : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("") + .CellBelow().SetValue("") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenNotBlank() + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFIsError : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetFormulaA1("1/0") + .CellBelow().SetFormulaA1("1/0") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenIsError() + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFNotError : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetFormulaA1("1/0") + .CellBelow().SetFormulaA1("1/0") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenNotError() + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFContains : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("Hellos") + .CellBelow().SetValue("Hell") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenContains("Hell") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFNotContains : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("Hellos") + .CellBelow().SetValue("Hell") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenNotContains("Hell") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFEqualsString : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("Hellos") + .CellBelow().SetValue("Hell") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenEquals("Hell") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFEqualsNumber : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenEquals(2) + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFNotEqualsString : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("Hellos") + .CellBelow().SetValue("Hell") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenNotEquals("Hell") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFNotEqualsNumber : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenNotEquals(2) + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFGreaterThan : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenGreaterThan("2") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFEqualOrGreaterThan : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenEqualOrGreaterThan("2") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFLessThan : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenLessThan("2") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFEqualOrLessThan : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenEqualOrLessThan("2") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFBetween : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenBetween("2", "3") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFNotBetween : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenNotBetween("2", "3") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFUnique : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenIsUnique() + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFDuplicate : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenIsDuplicate() + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFIsTrue : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenIsTrue("TRUE") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFTop : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenIsTop(2) + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFBottom : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenIsBottom(10, XLTopBottomType.Percent) + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFDataBar : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().DataBar(XLColor.Red, true) + .LowestValue() + .Maximum(XLCFContentType.Percent, "100"); + + workbook.SaveAs(filePath); + } + } + + public class CFDataBarNegative : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.Cell(1, 1).SetValue(-1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.Range(ws.Cell(1, 1), ws.Cell(4, 1)) + .AddConditionalFormat() + .DataBar(XLColor.Green, XLColor.Red, showBarOnly: false) + .LowestValue() + .HighestValue(); + + ws.Cell(1, 3).SetValue(-20) + .CellBelow().SetValue(40) + .CellBelow().SetValue(-60) + .CellBelow().SetValue(30); + + ws.Range(ws.Cell(1, 3), ws.Cell(4, 3)) + .AddConditionalFormat() + .DataBar(XLColor.Green, XLColor.Red, showBarOnly: true) + .Minimum(XLCFContentType.Number, -100) + .Maximum(XLCFContentType.Number, 100); + + workbook.SaveAs(filePath); + } + } + + public class CFIconSet : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().IconSet(XLIconSetStyle.ThreeTrafficLights2, true, true) + .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "0", XLCFContentType.Number) + .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "2", XLCFContentType.Number) + .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "3", XLCFContentType.Number); + + workbook.SaveAs(filePath); + } + } + + public class CFTwoConditions : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().IconSet(XLIconSetStyle.ThreeTrafficLights2, true, true) + .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "0", XLCFContentType.Number) + .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "2", XLCFContentType.Number) + .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "3", XLCFContentType.Number); + + ws.RangeUsed().AddConditionalFormat().WhenContains("1") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFInsertRows : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.Cell(2, 1).SetValue(1) + .CellRight().SetValue(1) + .CellRight().SetValue(2) + .CellRight().SetValue(3); + + var range = ws.RangeUsed(); + range.AddConditionalFormat().WhenEquals("1").Font.SetBold(); + range.InsertRowsAbove(1); + + workbook.SaveAs(filePath); + } + } + + public class CFTest : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(4); + + ws.RangeUsed().AddConditionalFormat().DataBar(XLColor.Red, XLColor.Green) + .LowestValue() + .HighestValue(); + + workbook.SaveAs(filePath); + } + } + + public class CFMultipleConditions : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + var range = ws.Range("A1:A10"); + range.AddConditionalFormat().WhenEquals("3") + .Fill.SetBackgroundColor(XLColor.Blue); + range.AddConditionalFormat().WhenEquals("2") + .Fill.SetBackgroundColor(XLColor.Green); + range.AddConditionalFormat().WhenEquals("1") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFStopIfTrue : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(6) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().SetStopIfTrue().WhenGreaterThan(5); + + ws.RangeUsed().AddConditionalFormat().IconSet(XLIconSetStyle.ThreeTrafficLights2, true, true) + .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "0", XLCFContentType.Number) + .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "2", XLCFContentType.Number) + .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "3", XLCFContentType.Number); + + workbook.SaveAs(filePath); + } + } + + public class CFDatesOccurring : IXLExample + { + public void Create(String filePath) + { + using (var workbook = new XLWorkbook()) + { + var ws = workbook.AddWorksheet("Sheet1"); + + var range = ws.Range("A1:A10"); + range.AddConditionalFormat() + .WhenDateIs(XLTimePeriod.Tomorrow) + .Fill.SetBackgroundColor(XLColor.GrannySmithApple); + + range.AddConditionalFormat() + .WhenDateIs(XLTimePeriod.Yesterday) + .Fill.SetBackgroundColor(XLColor.Orange); + + range.AddConditionalFormat() + .WhenDateIs(XLTimePeriod.InTheLast7Days) + .Fill.SetBackgroundColor(XLColor.Blue); + + range.AddConditionalFormat() + .WhenDateIs(XLTimePeriod.ThisMonth) + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + } + + public class CFDataBars : IXLExample + { + public void Create(string filePath) + { + using var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet(); + + ws.Range("A2:F3").Value = 1; + ws.Range("A4:F4").Value = 2; + ws.Range("A5:F5").Value = 3; + ws.Range("A6:F6").Value = 4; + + ws.Cell("A1").Value = "Automatic"; + ws.Range("A2:A6").AddConditionalFormat().DataBar(XLColor.Amber); + + ws.Cell("B1").Value = "Lowest/Highest"; + ws.Range("B2:B6").AddConditionalFormat().DataBar(XLColor.BallBlue) + .LowestValue() + .HighestValue(); + + ws.Cell("C1").Value = "Value"; + ws.Range("C2:C6").AddConditionalFormat().DataBar(XLColor.Cadet) + .Minimum(XLCFContentType.Number, 0) + .Maximum(XLCFContentType.Number, 10); + + ws.Cell("D1").Value = "Percent"; + ws.Range("D2:D6").AddConditionalFormat().DataBar(XLColor.Desert) + .Minimum(XLCFContentType.Percent, 50) + .Maximum(XLCFContentType.Percent, 100); + + ws.Cell("E1").Value = "Formula"; + ws.Range("E2:E6").AddConditionalFormat().DataBar(XLColor.Ecru) + .Minimum(XLCFContentType.Formula, "-SUM($A$2:$E$2)") + .Maximum(XLCFContentType.Formula, "SUM($A$6:$E$6)"); + + ws.Cell("F1").Value = "Percentile"; + ws.Range("F2:F6").AddConditionalFormat().DataBar(XLColor.Fandango) + .Minimum(XLCFContentType.Percentile, 30) + .Maximum(XLCFContentType.Percentile, 70); + + workbook.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Creating/CreateFiles.cs b/ClosedXML_Examples/Creating/CreateFiles.cs new file mode 100644 index 0000000..8f1978f --- /dev/null +++ b/ClosedXML_Examples/Creating/CreateFiles.cs @@ -0,0 +1,98 @@ +using ClosedXML_Examples.Columns; +using ClosedXML_Examples.Misc; +using ClosedXML_Examples.PageSetup; +using ClosedXML_Examples.Ranges; +using ClosedXML_Examples.Rows; +using ClosedXML_Examples.Styles; +using ClosedXML_Examples.Tables; +using System.IO; + +namespace ClosedXML_Examples +{ + public class CreateFiles + { + public static void CreateAllFiles() + { + var path = Program.BaseCreatedDirectory; + + new HelloWorld().Create(Path.Combine(path, "HelloWorld.xlsx")); + new BasicTable().Create(Path.Combine(path, "BasicTable.xlsx")); + + new StyleExamples().Create(); + new ChangingBasicTable().Create(Path.Combine(path, "BasicTable_Modified.xlsx")); + new ShiftingRanges().Create(Path.Combine(path, "ShiftingRanges.xlsx")); + new ColumnSettings().Create(Path.Combine(path, "ColumnSettings.xlsx")); + new RowSettings().Create(Path.Combine(path, "RowSettings.xlsx")); + new MergeCells().Create(Path.Combine(path, "MergedCells.xlsx")); + new InsertRows().Create(Path.Combine(path, "InsertRows.xlsx")); + new InsertColumns().Create(Path.Combine(path, "InsertColumns.xlsx")); + new ColumnCollection().Create(Path.Combine(path, "ColumnCollection.xlsx")); + new DataTypes().Create(Path.Combine(path, "DataTypes.xlsx")); + new DataTypesUnderDifferentCulture().Create(Path.Combine(path, "DataTypesUnderDifferentCulture.xlsx")); + new MultipleSheets().Create(Path.Combine(path, "MultipleSheets.xlsx")); + new RowCollection().Create(Path.Combine(path, "RowCollection.xlsx")); + new DefiningRanges().Create(Path.Combine(path, "DefiningRanges.xlsx")); + new ClearingRanges().Create(Path.Combine(path, "ClearingRanges.xlsx")); + new DeletingRanges().Create(Path.Combine(path, "DeletingRanges.xlsx")); + new Margins().Create(Path.Combine(path, "Margins.xlsx")); + new Page().Create(Path.Combine(path, "Page.xlsx")); + new HeaderFooters().Create(Path.Combine(path, "HeaderFooters.xlsx")); + new Sheets().Create(Path.Combine(path, "Sheets.xlsx")); + new SheetTab().Create(Path.Combine(path, "SheetTab.xlsx")); + new MultipleRanges().Create(Path.Combine(path, "MultipleRanges.xlsx")); + new StyleWorksheet().Create(Path.Combine(path, "StyleWorksheet.xlsx")); + new StyleRowsColumns().Create(Path.Combine(path, "StyleRowsColumns.xlsx")); + new InsertingDeletingRows().Create(Path.Combine(path, "InsertingDeletingRows.xlsx")); + new InsertingDeletingColumns().Create(Path.Combine(path, "InsertingDeletingColumns.xlsx")); + new DeletingColumns().Create(Path.Combine(path, "DeletingColumns.xlsx")); + new CellValues().Create(Path.Combine(path, "CellValues.xlsx")); + new LambdaExpressions().Create(Path.Combine(path, "LambdaExpressions.xlsx")); + new DefaultStyles().Create(Path.Combine(path, "DefaultStyles.xlsx")); + new TransposeRanges().Create(Path.Combine(path, "TransposeRanges.xlsx")); + new TransposeRangesPlus().Create(Path.Combine(path, "TransposeRangesPlus.xlsx")); + new MergeMoves().Create(Path.Combine(path, "MergedMoves.xlsx")); + new WorkbookProperties().Create(Path.Combine(path, "WorkbookProperties.xlsx")); + new AdjustToContents().Create(Path.Combine(path, "AdjustToContents.xlsx")); + new AdjustToContentsWithAutoFilter().Create(Path.Combine(path, "AdjustToContentsWithAutoFilter.xlsx")); + new HideUnhide().Create(Path.Combine(path, "HideUnhide.xlsx")); + new Outline().Create(Path.Combine(path, "Outline.xlsx")); + new Formulas().Create(Path.Combine(path, "Formulas.xlsx")); + new Collections().Create(Path.Combine(path, "Collections.xlsx")); + new NamedRanges().Create(Path.Combine(path, "NamedRanges.xlsx")); + new CopyingRanges().Create(Path.Combine(path, "CopyingRanges.xlsx")); + new BlankCells().Create(Path.Combine(path, "BlankCells.xlsx")); + new TwoPages().Create(Path.Combine(path, "TwoPages.xlsx")); + new UsingColors().Create(Path.Combine(path, "UsingColors.xlsx")); + + new ColumnCells().Create(Path.Combine(path, "ColumnCells.xlsx")); + new RowCells().Create(Path.Combine(path, "RowCells.xlsx")); + new FreezePanes().Create(Path.Combine(path, "FreezePanes.xlsx")); + new UsingTables().Create(Path.Combine(path, "UsingTables.xlsx")); + new ResizingTables().Create(Path.Combine(path, "ResizingTables.xlsx")); + new AddingRowToTables().Create(Path.Combine(path, "AddingRowToTables.xlsx")); + new RightToLeft().Create(Path.Combine(path, "RightToLeft.xlsx")); + new ShowCase().Create(Path.Combine(path, "ShowCase.xlsx")); + new CopyingWorksheets().Create(Path.Combine(path, "CopyingWorksheets.xlsx")); + new InsertingTables().Create(Path.Combine(path, "InsertingTables.xlsx")); + new InsertingData().Create(Path.Combine(path, "InsertingData.xlsx")); + new Hyperlinks().Create(Path.Combine(path, "Hyperlinks.xlsx")); + new DataValidation().Create(Path.Combine(path, "DataValidation.xlsx")); + new HideSheets().Create(Path.Combine(path, "HideSheets.xlsx")); + new SheetProtection().Create(Path.Combine(path, "SheetProtection.xlsx")); + new AutoFilter().Create(Path.Combine(path, "AutoFilter.xlsx")); + new Sorting().Create(Path.Combine(path, "Sorting.xlsx")); + new SortExample().Create(Path.Combine(path, "SortExample.xlsx")); + new AddingDataSet().Create(Path.Combine(path, "AddingDataSet.xlsx")); + new AddingDataTableAsWorksheet().Create(Path.Combine(path, "AddingDataTableAsWorksheet.xlsx")); + new TabColors().Create(Path.Combine(path, "TabColors.xlsx")); + new ShiftingFormulas().Create(Path.Combine(path, "ShiftingFormulas.xlsx")); + new CopyingRowsAndColumns().Create(Path.Combine(path, "CopyingRowsAndColumns.xlsx")); + new UsingRichText().Create(Path.Combine(path, "UsingRichText.xlsx")); + new UsingPhonetics().Create(Path.Combine(path, "UsingPhonetics.xlsx")); + new WalkingRanges().Create(Path.Combine(path, "CellMoves.xlsx")); + new AddingComments().Create(Path.Combine(path, "AddingComments.xlsx")); + new PivotTables().Create(Path.Combine(path, "PivotTables.xlsx")); + new SheetViews().Create(Path.Combine(path, "SheetViews.xlsx")); + } + } +} diff --git a/ClosedXML_Examples/Delete/DeleteFewWorksheets.cs b/ClosedXML_Examples/Delete/DeleteFewWorksheets.cs new file mode 100644 index 0000000..61aa28b --- /dev/null +++ b/ClosedXML_Examples/Delete/DeleteFewWorksheets.cs @@ -0,0 +1,41 @@ +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Delete +{ + public class DeleteFewWorksheets:IXLExample + { + public void Create(string filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + //Note: Prepare + { + var workbook = new XLWorkbook(); + workbook.Worksheets.Add("1"); + workbook.Worksheets.Add("2"); + workbook.Worksheets.Add("3"); + workbook.Worksheets.Add("4"); + workbook.SaveAs(tempFile); + } + + //Note: Delate few worksheet + { + var workbook = new XLWorkbook(tempFile); + workbook.Worksheets.Delete("1"); + workbook.Worksheets.Delete("2"); + workbook.SaveAs(filePath); + } + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + + } + } +} \ No newline at end of file diff --git a/ClosedXML_Examples/Delete/DeleteRows.cs b/ClosedXML_Examples/Delete/DeleteRows.cs new file mode 100644 index 0000000..bf58d62 --- /dev/null +++ b/ClosedXML_Examples/Delete/DeleteRows.cs @@ -0,0 +1,86 @@ +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Delete +{ + public class DeleteRows : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + #region Create case + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Delete red rows"); + + // Put a value in a few cells + foreach (var r in Enumerable.Range(1, 5)) + foreach (var c in Enumerable.Range(1, 5)) + ws.Cell(r, c).Value = string.Format("R{0}C{1}", r, c); + + + var blueRow = ws.Rows(1, 2); + var redRow = ws.Row(5); + + blueRow.Style.Fill.BackgroundColor = XLColor.Blue; + + redRow.Style.Fill.BackgroundColor = XLColor.Red; + workbook.SaveAs(filePath); + } + #endregion + + #region Remove rows + { + var workbook = new XLWorkbook(filePath); + var ws = workbook.Worksheets.Worksheet("Delete red rows"); + + ws.Rows(1, 2).Delete(); + workbook.Save(); + } + #endregion + + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/ExampleHelper.cs b/ClosedXML_Examples/ExampleHelper.cs new file mode 100644 index 0000000..c0d9fe6 --- /dev/null +++ b/ClosedXML_Examples/ExampleHelper.cs @@ -0,0 +1,19 @@ +using System.IO; + +namespace ClosedXML_Examples +{ + public static class ExampleHelper + { + public static string GetTempFilePath() + { + return Path.GetTempFileName(); + } + + public static string GetTempFilePath(string filePath) + { + var extension = Path.GetExtension(filePath); + var tempFilePath = GetTempFilePath(); + return Path.ChangeExtension(tempFilePath, extension); + } + } +} \ No newline at end of file diff --git a/ClosedXML_Examples/HelloWorld.cs b/ClosedXML_Examples/HelloWorld.cs new file mode 100644 index 0000000..588a83f --- /dev/null +++ b/ClosedXML_Examples/HelloWorld.cs @@ -0,0 +1,16 @@ +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class HelloWorld + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var worksheet = workbook.Worksheets.Add("Sample Sheet"); + worksheet.Cell("A1").Value = "Hello World!"; + workbook.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/IXLExample.cs b/ClosedXML_Examples/IXLExample.cs new file mode 100644 index 0000000..23e3a0e --- /dev/null +++ b/ClosedXML_Examples/IXLExample.cs @@ -0,0 +1,7 @@ +namespace ClosedXML_Examples +{ + public interface IXLExample + { + void Create(string filePath); + } +} \ No newline at end of file diff --git a/ClosedXML_Examples/ImageHandling/ImageAnchors.cs b/ClosedXML_Examples/ImageHandling/ImageAnchors.cs new file mode 100644 index 0000000..2285c15 --- /dev/null +++ b/ClosedXML_Examples/ImageHandling/ImageAnchors.cs @@ -0,0 +1,84 @@ +using ClosedXML.Excel; +using ClosedXML.Excel.Drawings; +using System.IO; +using System.Reflection; + +namespace ClosedXML_Examples +{ + public class ImageAnchors : IXLExample + { + public void Create(string filePath) + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws; + + using (Stream fs = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Examples.Resources.ImageHandling.png")) + { + ws = wb.Worksheets.Add("Images1"); + + #region AbsoluteAnchor + + ws.AddPicture(fs, XLPictureFormat.Png, "Image10") + .MoveTo(220, 150); + + #endregion AbsoluteAnchor + + #region OneCellAnchor + + fs.Position = 0; + ws.AddPicture(fs, XLPictureFormat.Png, "Image11") + .MoveTo(ws.Cell(1, 1)); + + #endregion OneCellAnchor + + ws = wb.Worksheets.Add("Images2"); + + #region TwoCellAnchor + + fs.Position = 0; + ws.AddPicture(fs, XLPictureFormat.Png, "Image20") + .MoveTo(ws.Cell(6, 5), ws.Cell(9, 7)); + + #endregion TwoCellAnchor + } + + using (Stream fs = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Examples.Resources.SampleImage.jpg")) + { + // Moving images around and scaling them + ws = wb.Worksheets.Add("Images3"); + + ws.AddPicture(fs, XLPictureFormat.Jpeg) + .MoveTo(ws.Cell(2, 2), 20, 5, ws.Cell(5, 5), 30, 10) + .MoveTo(ws.Cell(2, 2), ws.Cell(5, 5)); + + ws.AddPicture(fs, XLPictureFormat.Jpeg) + .MoveTo(ws.Cell(6, 2), 2, 2, ws.Cell(9, 5), 2, 2) + .MoveTo(ws.Cell(6, 2), 20, 5, ws.Cell(9, 5), 30, 10); + + ws.AddPicture(fs, XLPictureFormat.Jpeg) + .MoveTo(ws.Cell(10, 2), 20, 5) + .Scale(0.2, true) + .MoveTo(ws.Cell(10, 1)); + } + + using (Stream fs = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Examples.Resources.SampleImage.jpg")) + { + // Changing of placement + ws = wb.Worksheets.Add("Images4"); + + ws.AddPicture(fs, XLPictureFormat.Jpeg) + .MoveTo(100, 100) + .WithPlacement(XLPicturePlacement.FreeFloating); + + // Add and delete picture immediately + ws.AddPicture(fs, XLPictureFormat.Jpeg) + .MoveTo(100, 600) + .Delete(); + } + + wb.SaveAs(filePath); + } + } + } +} diff --git a/ClosedXML_Examples/ImageHandling/ImageFormats.cs b/ClosedXML_Examples/ImageHandling/ImageFormats.cs new file mode 100644 index 0000000..eaad0f8 --- /dev/null +++ b/ClosedXML_Examples/ImageHandling/ImageFormats.cs @@ -0,0 +1,40 @@ +using ClosedXML.Excel; +using ClosedXML.Excel.Drawings; +using System.IO; +using System.Reflection; + +namespace ClosedXML_Examples +{ + public class ImageFormats : IXLExample + { + public void Create(string filePath) + { + var wb = new XLWorkbook(); + IXLWorksheet ws; + + using (Stream fs = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Examples.Resources.ImageHandling.jpg")) + { + #region Jpeg + + ws = wb.Worksheets.Add("Jpg"); + ws.AddPicture(fs, XLPictureFormat.Jpeg, "JpegImage") + .MoveTo(ws.Cell(1, 1)); + + #endregion Jpeg + } + + using (Stream fs = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Examples.Resources.ImageHandling.png")) + { + #region Png + + ws = wb.Worksheets.Add("Png"); + ws.AddPicture(fs, XLPictureFormat.Png, "PngImage") + .MoveTo(ws.Cell(1, 1)); + + #endregion Png + + wb.SaveAs(filePath); + } + } + } +} diff --git a/ClosedXML_Examples/Loading/ChangingBasicTable.cs b/ClosedXML_Examples/Loading/ChangingBasicTable.cs new file mode 100644 index 0000000..c64d0d3 --- /dev/null +++ b/ClosedXML_Examples/Loading/ChangingBasicTable.cs @@ -0,0 +1,48 @@ +using System.IO; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples +{ + public class ChangingBasicTable : IXLExample + { + public void Create(string filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + var ws = workbook.Worksheet(1); + + // Change the background color of the headers + var rngHeaders = ws.Range("B3:F3"); + rngHeaders.Style.Fill.BackgroundColor = XLColor.LightSalmon; + + // Change the date formats + var rngDates = ws.Range("E4:E6"); + rngDates.Style.DateFormat.Format = "MM/dd/yyyy"; + + // Change the income values to text + var rngNumbers = ws.Range("F4:F6"); + foreach (var cell in rngNumbers.Cells()) + { + string formattedString = cell.GetFormattedString(); + cell.DataType = XLDataType.Text; + cell.Value = formattedString + " Dollars"; + } + + ws.Columns().AdjustToContents(); + + workbook.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + } +} \ No newline at end of file diff --git a/ClosedXML_Examples/Loading/LoadFiles.cs b/ClosedXML_Examples/Loading/LoadFiles.cs new file mode 100644 index 0000000..772ad70 --- /dev/null +++ b/ClosedXML_Examples/Loading/LoadFiles.cs @@ -0,0 +1,26 @@ +using System; +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class LoadFiles + { + public static void LoadAllFiles() + { + foreach (var file in Directory.GetFiles(Program.BaseCreatedDirectory)) + { + var fileInfo = new FileInfo(file); + var fileName = fileInfo.Name; + LoadAndSaveFile(Path.Combine(Program.BaseCreatedDirectory, fileName), Path.Combine(Program.BaseModifiedDirectory, fileName)); + } + } + + private static void LoadAndSaveFile(String input, String output) + { + var wb = new XLWorkbook(input); + wb.SaveAs(output); + wb.SaveAs(output); + } + } +} \ No newline at end of file diff --git a/ClosedXML_Examples/Misc/AddingDataSet.cs b/ClosedXML_Examples/Misc/AddingDataSet.cs new file mode 100644 index 0000000..1ea165f --- /dev/null +++ b/ClosedXML_Examples/Misc/AddingDataSet.cs @@ -0,0 +1,51 @@ +using ClosedXML.Excel; +using System; +using System.Data; +using System.Linq; + +namespace ClosedXML_Examples.Misc +{ + public class AddingDataSet : IXLExample + { + public void Create(String filePath) + { + var wb = new XLWorkbook(); + + var dataSet = GetDataSet(); + + // Add all DataTables in the DataSet as a worksheets + wb.Worksheets.Add(dataSet); + + foreach (var ws in wb.Worksheets) + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + + private DataSet GetDataSet() + { + var ds = new DataSet(); + ds.Tables.Add(GetTable("Patients")); + ds.Tables.Add(GetTable("Employees")); + ds.Tables.Add(GetTable("Information")); + return ds; + } + + private DataTable GetTable(String tableName) + { + DataTable table = new DataTable(); + table.TableName = tableName; + table.Columns.Add("Dosage", typeof(int)); + table.Columns.Add("Drug", typeof(string)); + table.Columns.Add("Patient", typeof(string)); + table.Columns.Add("Date", typeof(DateTime)); + + table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); + table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); + table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); + table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4)); + table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5)); + return table; + } + } +} diff --git a/ClosedXML_Examples/Misc/AddingDataTableAsWorksheet.cs b/ClosedXML_Examples/Misc/AddingDataTableAsWorksheet.cs new file mode 100644 index 0000000..78a9d0f --- /dev/null +++ b/ClosedXML_Examples/Misc/AddingDataTableAsWorksheet.cs @@ -0,0 +1,79 @@ +using System; +using System.Data; +using System.Linq; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Misc +{ + public class AddingDataTableAsWorksheet : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + + var dataTable = GetTable("Information"); + + // Add a DataTable as a worksheet + wb.Worksheets.Add(dataTable); + wb.Worksheets.First().Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + + // Private + private DataTable GetTable(String tableName) + { + DataTable table = new DataTable(); + table.TableName = tableName; + table.Columns.Add("Dosage", typeof(int)); + table.Columns.Add("Drug", typeof(string)); + table.Columns.Add("Patient", typeof(string)); + table.Columns.Add("Date", typeof(DateTime)); + + table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); + table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); + table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); + table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4)); + table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5)); + return table; + } + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/AdjustToContents.cs b/ClosedXML_Examples/Misc/AdjustToContents.cs new file mode 100644 index 0000000..048dbd2 --- /dev/null +++ b/ClosedXML_Examples/Misc/AdjustToContents.cs @@ -0,0 +1,113 @@ +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples.Misc +{ + public class AdjustToContents : IXLExample + { + // Public + public void Create(String filePath) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Adjust To Contents"); + + // Set some values with different font sizes + ws.Cell(1, 1).Value = "Tall Row"; + ws.Cell(1, 1).Style.Font.FontSize = 30; + ws.Cell(2, 1).Value = "Very Wide Column"; + ws.Cell(2, 1).Style.Font.FontSize = 20; + + // Adjust column width + ws.Column(1).AdjustToContents(); + + // Adjust row heights + ws.Rows(1, 2).AdjustToContents(); + + // You can also adjust all rows/columns in one shot + // ws.Rows().AdjustToContents(); + // ws.Columns().AdjustToContents(); + + // We'll now select which cells should be used for calculating the + // column widths (same method applies for row heights) + + // Set the values + ws.Cell(4, 2).Value = "Width ignored because calling column.AdjustToContents(5, 7)"; + ws.Cell(5, 2).Value = "Short text"; + ws.Cell(6, 2).Value = "Width ignored because it's part of a merge"; + ws.Range(6, 2, 6, 4).Merge(); + ws.Cell(7, 2).Value = "Width should adjust to this cell"; + ws.Cell(8, 2).Value = "Width ignored because calling column.AdjustToContents(5, 7)"; + + // Adjust column widths only taking into account rows 5-7 + // (merged cells will be ignored) + ws.Column(2).AdjustToContents(5, 7); + + // You can also specify the starting row to start calculating the widths: + // e.g. ws.Column(3).AdjustToContents(9); + + var ws2 = wb.Worksheets.Add("Adjust Widths"); + ws2.Cell(1, 1).SetValue("Text to adjust - 255").Style.Alignment.TextRotation = 255; + for (Int32 co = 0; co < 90; co += 5) + { + ws2.Cell(1, (co / 5) + 2).SetValue("Text to adjust - " + co).Style.Alignment.TextRotation = co; + } + + ws2.Columns().AdjustToContents(); + + var ws4 = wb.Worksheets.Add("Adjust Widths 2"); + ws4.Cell(1, 1).SetValue("Text to adjust - 255").Style.Alignment.TextRotation = 255; + for (Int32 co = 0; co < 90; co += 5) + { + var c = ws4.Cell(1, (co / 5) + 2); + + c.RichText.AddText("Text to adjust - " + co).SetBold(); + c.RichText.AddText(Environment.NewLine); + c.RichText.AddText("World!").SetBold().SetFontColor(XLColor.Blue).SetFontSize(25); + c.RichText.AddText(Environment.NewLine); + c.RichText.AddText("Hello Cruel and unsusual world").SetBold().SetFontSize(20); + c.RichText.AddText(Environment.NewLine); + c.RichText.AddText("Hello").SetBold(); + c.Style.Alignment.SetTextRotation(co); + } + ws4.Columns().AdjustToContents(); + + var ws3 = wb.Worksheets.Add("Adjust Heights"); + ws3.Cell(1, 1).SetValue("Text to adjust - 255").Style.Alignment.TextRotation = 255; + for (Int32 ro = 0; ro < 90; ro += 5) + { + ws3.Cell((ro / 5) + 2, 1).SetValue("Text to adjust - " + ro).Style.Alignment.TextRotation = ro; + } + + ws3.Rows().AdjustToContents(); + + var ws5 = wb.Worksheets.Add("Adjust Heights 2"); + ws5.Cell(1, 1).SetValue("Text to adjust - 255").Style.Alignment.TextRotation = 255; + for (Int32 ro = 0; ro < 90; ro += 5) + { + var c = ws5.Cell((ro / 5) + 2, 1); + c.RichText.AddText("Text to adjust - " + ro).SetBold(); + c.RichText.AddText(Environment.NewLine); + c.RichText.AddText("World!").SetBold().SetFontColor(XLColor.Blue).SetFontSize(10); + c.RichText.AddText(Environment.NewLine); + c.RichText.AddText("Hello Cruel and unsusual world").SetBold().SetFontSize(15); + c.RichText.AddText(Environment.NewLine); + c.RichText.AddText("Hello").SetBold(); + c.Style.Alignment.SetTextRotation(ro); + } + + ws5.Rows().AdjustToContents(); + + var ws6 = wb.Worksheets.Add("Absurdly wide column"); + ws6.Cell("A1").Value = "Some string"; + + // This column's width should be capped at 255 + ws6.Cell("B1").Value = @"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."; + + ws6.Columns().AdjustToContents(); + + wb.SaveAs(filePath, true); + } + } + } +} diff --git a/ClosedXML_Examples/Misc/AdjustToContentsWithAutoFilter.cs b/ClosedXML_Examples/Misc/AdjustToContentsWithAutoFilter.cs new file mode 100644 index 0000000..ed5fe6c --- /dev/null +++ b/ClosedXML_Examples/Misc/AdjustToContentsWithAutoFilter.cs @@ -0,0 +1,25 @@ +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples.Misc +{ + public class AdjustToContentsWithAutoFilter : IXLExample + { + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("AutoFilter"); + ws.Cell("A1").Value = "AVeryLongColumnHeader"; + ws.Cell("A2").Value = "John"; + ws.Cell("A3").Value = "Hank"; + ws.Cell("A4").Value = "Dagny"; + + ws.RangeUsed().SetAutoFilter(); + + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Misc/AutoFilter.cs b/ClosedXML_Examples/Misc/AutoFilter.cs new file mode 100644 index 0000000..bb119b2 --- /dev/null +++ b/ClosedXML_Examples/Misc/AutoFilter.cs @@ -0,0 +1,69 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class AutoFilter : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("AutoFilter"); + ws.Cell("A1").Value = "Names"; + ws.Cell("A2").Value = "John"; + ws.Cell("A3").Value = "Hank"; + ws.Cell("A4").Value = "Dagny"; + + ws.RangeUsed().SetAutoFilter(); + + // Your can turn off the autofilter by: + // 1) worksheet.AutoFilter.Clear() + // 2) worksheet.SetAutoFilter(false) + // 3) Pick any range in the worksheet and call the above methods on the range + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/BlankCells.cs b/ClosedXML_Examples/Misc/BlankCells.cs new file mode 100644 index 0000000..a3220d6 --- /dev/null +++ b/ClosedXML_Examples/Misc/BlankCells.cs @@ -0,0 +1,59 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class BlankCells : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).Value = "X"; + ws.Cell(1, 1).Clear(); + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/CellValues.cs b/ClosedXML_Examples/Misc/CellValues.cs new file mode 100644 index 0000000..236da97 --- /dev/null +++ b/ClosedXML_Examples/Misc/CellValues.cs @@ -0,0 +1,148 @@ +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples.Misc +{ + public class CellValues : IXLExample + { + public void Create(String filePath) + { + using (var workbook = new XLWorkbook()) + { + var ws = workbook.Worksheets.Add("Cell Values"); + + // Set the titles + ws.Cell(2, 2).Value = "Initial Value"; + ws.Cell(2, 3).Value = "Casting"; + ws.Cell(2, 4).Value = "Using Get...()"; + ws.Cell(2, 5).Value = "Using GetValue()"; + ws.Cell(2, 6).Value = "GetString()"; + ws.Cell(2, 7).Value = "GetFormattedString()"; + + ////////////////////////////////////////////////////////////////// + // DateTime + + // Fill a cell with a date + var cellDateTime = ws.Cell(3, 2); + cellDateTime.Value = new DateTime(2010, 9, 2); + cellDateTime.Style.DateFormat.Format = "yyyy-MMM-dd"; + + // Extract the date in different ways + DateTime dateTime1 = (DateTime)cellDateTime.Value; + DateTime dateTime2 = cellDateTime.GetDateTime(); + DateTime dateTime3 = cellDateTime.GetValue(); + String dateTimeString = cellDateTime.GetString(); + String dateTimeFormattedString = cellDateTime.GetFormattedString(); + + // Set the values back to cells + // The apostrophe is to force ClosedXML to treat the date as a string + ws.Cell(3, 3).Value = dateTime1; + ws.Cell(3, 4).Value = dateTime2; + ws.Cell(3, 5).Value = dateTime3; + ws.Cell(3, 6).Value = "'" + dateTimeString; + ws.Cell(3, 7).Value = "'" + dateTimeFormattedString; + + ////////////////////////////////////////////////////////////////// + // Boolean + + // Fill a cell with a boolean + var cellBoolean = ws.Cell(4, 2); + cellBoolean.Value = true; + + // Extract the boolean in different ways + Boolean boolean1 = (Boolean)cellBoolean.Value; + Boolean boolean2 = cellBoolean.GetBoolean(); + Boolean boolean3 = cellBoolean.GetValue(); + String booleanString = cellBoolean.GetString(); + String booleanFormattedString = cellBoolean.GetFormattedString(); + + // Set the values back to cells + // The apostrophe is to force ClosedXML to treat the boolean as a string + ws.Cell(4, 3).Value = boolean1; + ws.Cell(4, 4).Value = boolean2; + ws.Cell(4, 5).Value = boolean3; + ws.Cell(4, 6).Value = "'" + booleanString; + ws.Cell(4, 7).Value = "'" + booleanFormattedString; + + ////////////////////////////////////////////////////////////////// + // Double + + // Fill a cell with a double + var cellDouble = ws.Cell(5, 2); + cellDouble.Value = 1234.567; + cellDouble.Style.NumberFormat.Format = "#,##0.00"; + + // Extract the double in different ways + Double double1 = (Double)cellDouble.Value; + Double double2 = cellDouble.GetDouble(); + Double double3 = cellDouble.GetValue(); + String doubleString = cellDouble.GetString(); + String doubleFormattedString = cellDouble.GetFormattedString(); + + // Set the values back to cells + // The apostrophe is to force ClosedXML to treat the double as a string + ws.Cell(5, 3).Value = double1; + ws.Cell(5, 4).Value = double2; + ws.Cell(5, 5).Value = double3; + ws.Cell(5, 6).Value = "'" + doubleString; + ws.Cell(5, 7).Value = "'" + doubleFormattedString; + + ////////////////////////////////////////////////////////////////// + // String + + // Fill a cell with a string + var cellString = ws.Cell(6, 2); + cellString.Value = "Test Case"; + + // Extract the string in different ways + String string1 = (String)cellString.Value; + String string2 = cellString.GetString(); + String string3 = cellString.GetValue(); + String stringString = cellString.GetString(); + String stringFormattedString = cellString.GetFormattedString(); + + // Set the values back to cells + ws.Cell(6, 3).Value = string1; + ws.Cell(6, 4).Value = string2; + ws.Cell(6, 5).Value = string3; + ws.Cell(6, 6).Value = stringString; + ws.Cell(6, 7).Value = stringFormattedString; + + ////////////////////////////////////////////////////////////////// + // TimeSpan + + // Fill a cell with a timeSpan + var cellTimeSpan = ws.Cell(7, 2); + cellTimeSpan.Value = new TimeSpan(1, 2, 31, 45); + + // Extract the timeSpan in different ways + TimeSpan timeSpan1 = (TimeSpan)cellTimeSpan.Value; + TimeSpan timeSpan2 = cellTimeSpan.GetTimeSpan(); + TimeSpan timeSpan3 = cellTimeSpan.GetValue(); + String timeSpanString = "'" + cellTimeSpan.GetString(); + String timeSpanFormattedString = "'" + cellTimeSpan.GetFormattedString(); + + // Set the values back to cells + ws.Cell(7, 3).Value = timeSpan1; + ws.Cell(7, 4).Value = timeSpan2; + ws.Cell(7, 5).Value = timeSpan3; + ws.Cell(7, 6).Value = timeSpanString; + ws.Cell(7, 7).Value = timeSpanFormattedString; + + ////////////////////////////////////////////////////////////////// + // Do some formatting + ws.Columns("B:G").Width = 20; + var rngTitle = ws.Range("B2:G2"); + rngTitle.Style.Font.Bold = true; + rngTitle.Style.Fill.BackgroundColor = XLColor.Cyan; + + ws.Columns().AdjustToContents(); + + ws = workbook.AddWorksheet("Test Whitespace"); + ws.FirstCell().Value = "' "; + + workbook.SaveAs(filePath); + } + } + } +} diff --git a/ClosedXML_Examples/Misc/Collections.cs b/ClosedXML_Examples/Misc/Collections.cs new file mode 100644 index 0000000..a9b9fe5 --- /dev/null +++ b/ClosedXML_Examples/Misc/Collections.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Misc +{ + public class Collections : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Collections"); + + // From a list of strings + var listOfStrings = new List(); + listOfStrings.Add("House"); + listOfStrings.Add("Car"); + ws.Cell(1, 1).Value = "Strings"; + ws.Cell(1, 1).AsRange().AddToNamed("Titles"); + ws.Cell(2, 1).Value = listOfStrings; + + // From a list of arrays + var listOfArr = new List(); + listOfArr.Add(new Int32[] { 1, 2, 3 }); + listOfArr.Add(new Int32[] { 1 }); + listOfArr.Add(new Int32[] { 1, 2, 3, 4, 5, 6 }); + ws.Cell(1, 3).Value = "Arrays"; + ws.Range(1, 3, 1, 8).Merge().AddToNamed("Titles"); + ws.Cell(2, 3).Value = listOfArr; + + // From a DataTable + var dataTable = GetTable(); + ws.Cell(6, 1).Value = "DataTable"; + ws.Range(6, 1, 6, 4).Merge().AddToNamed("Titles"); + ws.Cell(7, 1).Value = dataTable; + + // From a query + var list = new List(); + list.Add(new Person() { Name = "John", Age = 30, House = "On Elm St." }); + list.Add(new Person() { Name = "Mary", Age = 15, House = "On Main St." }); + list.Add(new Person() { Name = "Luis", Age = 21, House = "On 23rd St." }); + list.Add(new Person() { Name = "Henry", Age = 45, House = "On 5th Ave." }); + + var people = from p in list + where p.Age >= 21 + select new { p.Name, p.House, p.Age }; + + ws.Cell(6, 6).Value = "Query"; + ws.Range(6, 6, 6, 8).Merge().AddToNamed("Titles"); + ws.Cell(7, 6).Value = people; + + + // Prepare the style for the titles + var titlesStyle = wb.Style; + titlesStyle.Font.Bold = true; + titlesStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + titlesStyle.Fill.BackgroundColor = XLColor.Cyan; + + // Format all titles in one shot + wb.NamedRanges.NamedRange("Titles").Ranges.Style = titlesStyle; + + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + + class Person + { + public String House { get; set; } + public String Name { get; set; } + public Int32 Age { get; set; } + } + + // Private + private DataTable GetTable() + { + + DataTable table = new DataTable(); + table.Columns.Add("Dosage", typeof(int)); + table.Columns.Add("Drug", typeof(string)); + table.Columns.Add("Patient", typeof(string)); + table.Columns.Add("Date", typeof(DateTime)); + + table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); + table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); + table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); + table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4)); + table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5)); + return table; + } + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/CopyingRowsAndColumns.cs b/ClosedXML_Examples/Misc/CopyingRowsAndColumns.cs new file mode 100644 index 0000000..9f3a190 --- /dev/null +++ b/ClosedXML_Examples/Misc/CopyingRowsAndColumns.cs @@ -0,0 +1,114 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class CopyingRowsAndColumns : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + + var originalSheet = workbook.Worksheets.Add("original"); + + originalSheet.Cell("A2").SetValue("test value"); + originalSheet.Range("A2:E2").Merge(); + + originalSheet.Cell("F1").SetValue("test value").Style.Alignment.SetTopToBottom(); + originalSheet.Range("F1:F6").Merge(); + + var fromRow = workbook.Worksheets.Add("From a Row"); + fromRow.Cell(1, 1).SetValue("Row to Row:"); + originalSheet.Row(2).CopyTo(fromRow.Row(2)); + fromRow.Cell(3, 1).SetValue("Row to Range:"); + originalSheet.Row(2).CopyTo(fromRow.Row(4).AsRange()); + fromRow.Cell(5, 1).SetValue("Row to Cell:"); + originalSheet.Row(2).CopyTo(fromRow.Row(6).FirstCell()); + + var fromRange = workbook.Worksheets.Add("From a Range"); + fromRange.Cell(1, 1).SetValue("Range to Row:"); + originalSheet.Row(2).AsRange().CopyTo(fromRange.Row(2)); + fromRange.Cell(3, 1).SetValue("Range to Range:"); + originalSheet.Row(2).AsRange().CopyTo(fromRange.Row(4).AsRange()); + fromRange.Cell(5, 1).SetValue("Range to Cell:"); + originalSheet.Row(2).AsRange().CopyTo(fromRange.Row(6).FirstCell()); + + CopyRowAsRange(originalSheet, 2, fromRange, 8); + + var fromColumn = workbook.Worksheets.Add("From a Column to Column"); + fromColumn.Cell(1, 1).SetValue("Column to Column:").Style.Alignment.SetTopToBottom(); + originalSheet.Column("F").CopyTo(fromColumn.Column(2)); + fromColumn.Cell(1, 3).SetValue("Column to Range:").Style.Alignment.SetTopToBottom(); + originalSheet.Column("F").CopyTo(fromColumn.Column(4).AsRange()); + fromColumn.Cell(1, 5).SetValue("Column to Cell:").Style.Alignment.SetTopToBottom(); + originalSheet.Column("F").CopyTo(fromColumn.Column(6).FirstCell()); + + var fromRangeToColumn = workbook.Worksheets.Add("From a Range to Column"); + fromRangeToColumn.Cell(1, 1).SetValue("Range to Column:").Style.Alignment.SetTopToBottom(); + originalSheet.Column("F").AsRange().CopyTo(fromRangeToColumn.Column(2)); + fromRangeToColumn.Cell(1, 3).SetValue("Range to Range:").Style.Alignment.SetTopToBottom(); + originalSheet.Column("F").AsRange().CopyTo(fromRangeToColumn.Column(4).AsRange()); + fromRangeToColumn.Cell(1, 5).SetValue("Range to Cell:").Style.Alignment.SetTopToBottom(); + originalSheet.Column("F").AsRange().CopyTo(fromRangeToColumn.Column(6).FirstCell()); + + + workbook.SaveAs(filePath); + } + + private static void CopyRowAsRange(IXLWorksheet originalSheet, int originalRowNumber, IXLWorksheet destSheet, int destRowNumber) + { + { + var destinationRow = destSheet.Row(destRowNumber); + destinationRow.Clear(); + + var originalRow = originalSheet.Row(originalRowNumber); + int columnNumber = originalRow.LastCellUsed(XLCellsUsedOptions.All).Address.ColumnNumber; + + var originalRange = originalSheet.Range(originalRowNumber, 1, originalRowNumber, columnNumber); + var destRange = destSheet.Range(destRowNumber, 1, destRowNumber, columnNumber); + originalRange.CopyTo(destRange); + } + } + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/CopyingWorksheets.cs b/ClosedXML_Examples/Misc/CopyingWorksheets.cs new file mode 100644 index 0000000..e06cd66 --- /dev/null +++ b/ClosedXML_Examples/Misc/CopyingWorksheets.cs @@ -0,0 +1,44 @@ +using ClosedXML.Excel; +using ClosedXML_Examples.Tables; +using System.IO; + +namespace ClosedXML_Examples.Misc +{ + public class CopyingWorksheets : IXLExample + { + public void Create(string filePath) + { + string tempFile1 = ExampleHelper.GetTempFilePath(filePath); + string tempFile2 = ExampleHelper.GetTempFilePath(filePath); + try + { + new UsingTables().Create(tempFile1); + var wb = new XLWorkbook(tempFile1); + + var wsSource = wb.Worksheet(1); + // Copy the worksheet to a new sheet in this workbook + wsSource.CopyTo("Copy"); + + // We're going to open another workbook to show that you can + // copy a sheet from one workbook to another: + new BasicTable().Create(tempFile2); + var wbSource = new XLWorkbook(tempFile2); + wbSource.Worksheet(1).CopyTo(wb, "Copy From Other"); + + // Save the workbook with the 2 copies + wb.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile1)) + { + File.Delete(tempFile1); + } + if (File.Exists(tempFile2)) + { + File.Delete(tempFile2); + } + } + } + } +} diff --git a/ClosedXML_Examples/Misc/DataTypes.cs b/ClosedXML_Examples/Misc/DataTypes.cs new file mode 100644 index 0000000..e642a7f --- /dev/null +++ b/ClosedXML_Examples/Misc/DataTypes.cs @@ -0,0 +1,227 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class DataTypes : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Data Types"); + + var co = 2; + var ro = 1; + + ws.Cell(++ro, co).Value = "Plain Text:"; + ws.Cell(ro, co + 1).Value = "Hello World."; + + ws.Cell(++ro, co).Value = "Plain Date:"; + ws.Cell(ro, co + 1).Value = new DateTime(2010, 9, 2); + + ws.Cell(++ro, co).Value = "Plain DateTime:"; + ws.Cell(ro, co + 1).Value = new DateTime(2010, 9, 2, 13, 45, 22); + + ws.Cell(++ro, co).Value = "Plain Boolean:"; + ws.Cell(ro, co + 1).Value = true; + + ws.Cell(++ro, co).Value = "Plain Number:"; + ws.Cell(ro, co + 1).Value = 123.45; + + ws.Cell(++ro, co).Value = "TimeSpan:"; + ws.Cell(ro, co + 1).Value = new TimeSpan(33, 45, 22); + + ro++; + + ws.Cell(++ro, co).Value = "Decimal Number:"; + ws.Cell(ro, co + 1).Value = 123.45m; + + ws.Cell(++ro, co).Value = "Float Number:"; + ws.Cell(ro, co + 1).Value = 123.45f; + + ws.Cell(++ro, co).Value = "Double Number:"; + ws.Cell(ro, co + 1).Value = 123.45d; + + ws.Cell(++ro, co).Value = "Large Double Number:"; + ws.Cell(ro, co + 1).Value = 9.999E307d; + + ro++; + + ws.Cell(++ro, co).Value = "Explicit Text:"; + ws.Cell(ro, co + 1).Value = "'Hello World."; + + ws.Cell(++ro, co).Value = "Date as Text:"; + ws.Cell(ro, co + 1).Value = "'" + new DateTime(2010, 9, 2).ToString(); + + ws.Cell(++ro, co).Value = "DateTime as Text:"; + ws.Cell(ro, co + 1).Value = "'" + new DateTime(2010, 9, 2, 13, 45, 22).ToString(); + + ws.Cell(++ro, co).Value = "Boolean as Text:"; + ws.Cell(ro, co + 1).Value = "'" + true.ToString(); + + ws.Cell(++ro, co).Value = "Number as Text:"; + ws.Cell(ro, co + 1).Value = "'123.45"; + + ws.Cell(++ro, co).Value = "Number with @ format:"; + ws.Cell(ro, co + 1).Style.NumberFormat.Format = "@"; + ws.Cell(ro, co + 1).Value = 123.45; + + ws.Cell(++ro, co).Value = "Format number with @:"; + ws.Cell(ro, co + 1).Value = 123.45; + ws.Cell(ro, co + 1).Style.NumberFormat.Format = "@"; + + ws.Cell(++ro, co).Value = "TimeSpan as Text:"; + ws.Cell(ro, co + 1).Value = "'" + new TimeSpan(33, 45, 22).ToString(); + + ro++; + + ws.Cell(++ro, co).Value = "Changing Data Types:"; + + ro++; + + ws.Cell(++ro, co).Value = "Date to Text:"; + ws.Cell(ro, co + 1).Value = new DateTime(2010, 9, 2); + ws.Cell(ro, co + 1).DataType = XLDataType.Text; + + ws.Cell(++ro, co).Value = "DateTime to Text:"; + ws.Cell(ro, co + 1).Value = new DateTime(2010, 9, 2, 13, 45, 22); + ws.Cell(ro, co + 1).DataType = XLDataType.Text; + + ws.Cell(++ro, co).Value = "Boolean to Text:"; + ws.Cell(ro, co + 1).Value = true; + ws.Cell(ro, co + 1).DataType = XLDataType.Text; + + ws.Cell(++ro, co).Value = "Number to Text:"; + ws.Cell(ro, co + 1).Value = 123.45; + ws.Cell(ro, co + 1).DataType = XLDataType.Text; + + ws.Cell(++ro, co).Value = "TimeSpan to Text:"; + ws.Cell(ro, co + 1).Value = new TimeSpan(33, 45, 22); + ws.Cell(ro, co + 1).DataType = XLDataType.Text; + + ws.Cell(++ro, co).Value = "Text to Date:"; + ws.Cell(ro, co + 1).Value = "'" + new DateTime(2010, 9, 2).ToString(); + ws.Cell(ro, co + 1).DataType = XLDataType.DateTime; + + ws.Cell(++ro, co).Value = "Text to DateTime:"; + ws.Cell(ro, co + 1).Value = "'" + new DateTime(2010, 9, 2, 13, 45, 22).ToString(); + ws.Cell(ro, co + 1).DataType = XLDataType.DateTime; + + ws.Cell(++ro, co).Value = "Text to Boolean:"; + ws.Cell(ro, co + 1).Value = "'" + true.ToString(); + ws.Cell(ro, co + 1).DataType = XLDataType.Boolean; + + ws.Cell(++ro, co).Value = "Text to Number:"; + ws.Cell(ro, co + 1).Value = "'123.45"; + ws.Cell(ro, co + 1).DataType = XLDataType.Number; + + ws.Cell(++ro, co).Value = "Percentage Text to Number:"; + ws.Cell(ro, co + 1).Value = "'55.12%"; + ws.Cell(ro, co + 1).Style.NumberFormat.SetNumberFormatId((int)XLPredefinedFormat.Number.PercentPrecision2); + ws.Cell(ro, co + 1).DataType = XLDataType.Number; + + ws.Cell(++ro, co).Value = "@ format to Number:"; + ws.Cell(ro, co + 1).Style.NumberFormat.Format = "@"; + ws.Cell(ro, co + 1).Value = 123.45; + ws.Cell(ro, co + 1).DataType = XLDataType.Number; + + ws.Cell(++ro, co).Value = "Text to TimeSpan:"; + ws.Cell(ro, co + 1).Value = "'" + new TimeSpan(33, 45, 22).ToString(); + ws.Cell(ro, co + 1).DataType = XLDataType.TimeSpan; + + ro++; + + ws.Cell(++ro, co).Value = "Formatted Date to Text:"; + ws.Cell(ro, co + 1).Value = new DateTime(2010, 9, 2); + ws.Cell(ro, co + 1).Style.DateFormat.Format = "yyyy-MM-dd"; + ws.Cell(ro, co + 1).DataType = XLDataType.Text; + + ws.Cell(++ro, co).Value = "Formatted Number to Text:"; + ws.Cell(ro, co + 1).Value = 12345.6789; + ws.Cell(ro, co + 1).Style.NumberFormat.Format = "#,##0.00"; + ws.Cell(ro, co + 1).DataType = XLDataType.Text; + + ro++; + + ws.Cell(++ro, co).Value = "Blank Text:"; + ws.Cell(ro, co + 1).Value = 12345.6789; + ws.Cell(ro, co + 1).Style.NumberFormat.Format = "#,##0.00"; + ws.Cell(ro, co + 1).DataType = XLDataType.Text; + ws.Cell(ro, co + 1).Value = ""; + + ro++; + + // Using inline strings (few users will ever need to use this feature) + // + // By default all strings are stored as shared so one block of text + // can be reference by multiple cells. + // You can override this by setting the .ShareString property to false + ws.Cell(++ro, co).Value = "Inline String:"; + var cell = ws.Cell(ro, co + 1); + cell.Value = "Not Shared"; + cell.ShareString = false; + + // To view all shared strings (all texts in the workbook actually), use the following: + // workbook.GetSharedStrings() + + ws.Cell(++ro, co) + .SetDataType(XLDataType.Text) + .SetDataType(XLDataType.Boolean) + .SetDataType(XLDataType.DateTime) + .SetDataType(XLDataType.Number) + .SetDataType(XLDataType.TimeSpan) + .SetDataType(XLDataType.Text) + .SetDataType(XLDataType.TimeSpan) + .SetDataType(XLDataType.Number) + .SetDataType(XLDataType.DateTime) + .SetDataType(XLDataType.Boolean) + .SetDataType(XLDataType.Text); + + ws.Columns(2, 3).AdjustToContents(); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/DataTypesUnderDifferentCulture.cs b/ClosedXML_Examples/Misc/DataTypesUnderDifferentCulture.cs new file mode 100644 index 0000000..cbf1110 --- /dev/null +++ b/ClosedXML_Examples/Misc/DataTypesUnderDifferentCulture.cs @@ -0,0 +1,35 @@ +using System; +using ClosedXML.Excel; +using System.Threading; +using System.Globalization; +using System.IO; + +namespace ClosedXML_Examples.Misc +{ + public class DataTypesUnderDifferentCulture : IXLExample + { + public void Create(string filePath) + { + var backupCulture = Thread.CurrentThread.CurrentCulture; + + // Set thread culture to French, which should format numbers using decimal COMMA + Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR"); + + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new DataTypes().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + workbook.SaveAs(filePath); + } + finally + { + Thread.CurrentThread.CurrentCulture = backupCulture; + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + } +} diff --git a/ClosedXML_Examples/Misc/DataValidation.cs b/ClosedXML_Examples/Misc/DataValidation.cs new file mode 100644 index 0000000..28d2238 --- /dev/null +++ b/ClosedXML_Examples/Misc/DataValidation.cs @@ -0,0 +1,139 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class DataValidation : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Data Validation"); + + // Decimal between 1 and 5 + ws.Cell(1, 1).SetDataValidation().Decimal.Between(1, 5); + + // Whole number equals 2 + var dv1 = ws.Range("A2:A3").SetDataValidation(); + dv1.WholeNumber.EqualTo(2); + // Change the error message + dv1.ErrorStyle = XLErrorStyle.Warning; + dv1.ErrorTitle = "Number out of range"; + dv1.ErrorMessage = "This cell only allows the number 2."; + + // Date after the millenium + var dv2 = ws.Cell("A4").SetDataValidation(); + dv2.Date.EqualOrGreaterThan(new DateTime(2000, 1, 1)); + // Change the input message + dv2.InputTitle = "Can't party like it's 1999."; + dv2.InputMessage = "Please enter a date in this century."; + + // From a list + ws.Cell("C1").Value = "Yes"; + ws.Cell("C2").Value = "No"; + ws.Cell("A5").SetDataValidation().List(ws.Range("C1:C2")); + + ws.Range("C1:C2").AddToNamed("YesNo"); + ws.Cell("A6").SetDataValidation().List("=YesNo"); + + // Intersecting dataValidations + ws.Range("B1:B4").SetDataValidation().WholeNumber.EqualTo(1); + ws.Range("B3:B4").SetDataValidation().WholeNumber.EqualTo(2); + + + // Validate with multiple ranges + var ws2 = wb.Worksheets.Add("Validate Ranges"); + var rng1 = ws2.Ranges("A1:B2,B4:D7,F4:G5"); + rng1.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); + var rng1Validation = rng1.SetDataValidation(); + rng1Validation.Decimal.EqualTo(1); + rng1Validation.IgnoreBlanks = false; + + var rng2 = ws2.Range("A11:E14"); + rng2.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); + var rng2Validation = rng2.SetDataValidation(); + rng2Validation.Decimal.EqualTo(2); + rng2Validation.IgnoreBlanks = false; + + var rng3 = ws2.Range("B2:B12"); + //rng3.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); + var rng3Validation = rng3.SetDataValidation(); + rng3Validation.Decimal.EqualTo(3); + rng3Validation.IgnoreBlanks = true; + + var rng4 = ws2.Range("D5:D6"); + //rng4.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); + var rng4Validation = rng4.SetDataValidation(); + rng4Validation.Decimal.EqualTo(4); + rng4Validation.IgnoreBlanks = true; + + var rng5 = ws2.Range("C13:C14"); + //rng5.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); + var rng5Validation = rng5.SetDataValidation(); + rng5Validation.Decimal.EqualTo(5); + rng5Validation.IgnoreBlanks = true; + + var rng6 = ws2.Range("D11:D12"); + //rng6.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); + var rng6Validation = rng6.SetDataValidation(); + rng6Validation.Decimal.EqualTo(5); + rng6Validation.IgnoreBlanks = true; + + var rng7 = ws2.Range("G4:G5"); + //rng7.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); + var rng7Validation = rng7.SetDataValidation(); + rng7Validation.Decimal.EqualTo(5); + rng7Validation.IgnoreBlanks = true; + + ws.CopyTo(ws.Name + " - Copy"); + ws2.CopyTo(ws2.Name + " - Copy"); + + wb.AddWorksheet("Copy From Range 1").FirstCell().Value = ws.RangeUsed(XLCellsUsedOptions.All); + wb.AddWorksheet("Copy From Range 2").FirstCell().Value = ws2.RangeUsed(XLCellsUsedOptions.All); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/Formulas.cs b/ClosedXML_Examples/Misc/Formulas.cs new file mode 100644 index 0000000..8066a81 --- /dev/null +++ b/ClosedXML_Examples/Misc/Formulas.cs @@ -0,0 +1,79 @@ +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples.Misc +{ + public class Formulas : IXLExample + { + public virtual void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Formulas"); + + ws.Cell(1, 1).Value = "Num1"; + ws.Cell(1, 2).Value = "Num2"; + ws.Cell(1, 3).Value = "Total"; + ws.Cell(1, 4).Value = "cell.FormulaA1"; + ws.Cell(1, 5).Value = "cell.FormulaR1C1"; + ws.Cell(1, 6).Value = "cell.Value"; + ws.Cell(1, 7).Value = "Are Equal?"; + + ws.Cell(2, 1).Value = 1; + ws.Cell(2, 2).Value = 2; + var cellWithFormulaA1 = ws.Cell(2, 3); + // Use A1 notation + cellWithFormulaA1.FormulaA1 = "=A2+$B$2"; // The equal sign (=) in a formula is optional + ws.Cell(2, 4).Value = cellWithFormulaA1.FormulaA1; + ws.Cell(2, 5).Value = cellWithFormulaA1.FormulaR1C1; + ws.Cell(2, 6).Value = cellWithFormulaA1.Value; + + ws.Cell(3, 1).Value = 1; + ws.Cell(3, 2).Value = 2; + var cellWithFormulaR1C1 = ws.Cell(3, 3); + // Use R1C1 notation + cellWithFormulaR1C1.FormulaR1C1 = "RC[-2]+R3C2"; // The equal sign (=) in a formula is optional + ws.Cell(3, 4).Value = cellWithFormulaR1C1.FormulaA1; + ws.Cell(3, 5).Value = cellWithFormulaR1C1.FormulaR1C1; + ws.Cell(3, 6).Value = cellWithFormulaR1C1.Value; + + ws.Cell(4, 1).Value = "A"; + ws.Cell(4, 2).Value = "B"; + var cellWithStringFormula = ws.Cell(4, 3); + + // Use R1C1 notation + cellWithStringFormula.FormulaR1C1 = "=\"Test\" & RC[-2] & \"R3C2\""; + ws.Cell(4, 4).Value = cellWithStringFormula.FormulaA1; + ws.Cell(4, 5).Value = cellWithStringFormula.FormulaR1C1; + ws.Cell(4, 6).Value = cellWithStringFormula.Value; + + // Setting the formula of a range + var rngData = ws.Range(2, 1, 4, 7); + rngData.LastColumn().FormulaR1C1 = "=IF(RC[-4]=RC[-1],\"Yes\", \"No\")"; + + // Using an array formula: + // Just put the formula between curly braces + ws.Cell("A6").Value = "Array Formula: "; + ws.Cell("B6").FormulaA1 = "{A2+A3}"; + ws.Range("C6:D6").FormulaA1 = "{TRANSPOSE(A2:A3)}"; + + ws.Range(1, 1, 1, 7).Style.Fill.BackgroundColor = XLColor.Cyan; + ws.Range(1, 1, 1, 7).Style.Font.Bold = true; + ws.Columns().AdjustToContents(); + + // You can also change the reference notation: + wb.ReferenceStyle = XLReferenceStyle.R1C1; + + // And the workbook calculation mode: + wb.CalculateMode = XLCalculateMode.Auto; + + ws.Range("A10").AddToNamed("A10_R1C1_A10_R1C1"); + ws.Cell("A10").Value = 0; + ws.Cell("A11").FormulaA1 = "A2 + A10_R1C1_A10_R1C1"; + ws.Cell("A12").FormulaR1C1 = "R2C1 + A10_R1C1_A10_R1C1"; + ws.Cell("A13").FormulaR1C1 = "=SUM(R[-5]:R[-4])"; + ws.Cell("A14").FormulaA1 = "=SUM(8:9)"; + + wb.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Misc/FormulasWithEvaluation.cs b/ClosedXML_Examples/Misc/FormulasWithEvaluation.cs new file mode 100644 index 0000000..dca890e --- /dev/null +++ b/ClosedXML_Examples/Misc/FormulasWithEvaluation.cs @@ -0,0 +1,16 @@ +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Misc +{ + public class FormulasWithEvaluation : Formulas + { + public override void Create(string filePath) + { + base.Create(filePath); + using (var wb = new XLWorkbook(filePath)) + { + wb.Save(true, true); + } + } + } +} diff --git a/ClosedXML_Examples/Misc/FreezePanes.cs b/ClosedXML_Examples/Misc/FreezePanes.cs new file mode 100644 index 0000000..d831af3 --- /dev/null +++ b/ClosedXML_Examples/Misc/FreezePanes.cs @@ -0,0 +1,36 @@ +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples.Misc +{ + public class FreezePanes : IXLExample + { + public void Create(String filePath) + { + using (var wb = new XLWorkbook()) + { + // Freeze rows and columns in one shot + var ws1 = wb.AddWorksheet("Freeze1"); + ws1.Cell(5, 5).SetActive(); + ws1.SheetView.Freeze(3, 3); + + // You can also be more specific on what you want to freeze + // For example: + var ws2 = wb.AddWorksheet("FreezeRows"); + ws2.Cell(5, 5).SetActive(); + ws2.SheetView.FreezeRows(3); + + var ws3 = wb.AddWorksheet("FreezeColumns"); + ws3.Cell(5, 5).SetActive(); + ws3.SheetView.FreezeColumns(3); + + var wsSplit = wb.AddWorksheet("Split View"); + wsSplit.Cell(2, 2).SetActive(); + wsSplit.SheetView.SplitRow = 3; + wsSplit.SheetView.SplitColumn = 3; + + wb.SaveAs(filePath); + } + } + } +} diff --git a/ClosedXML_Examples/Misc/HideSheets.cs b/ClosedXML_Examples/Misc/HideSheets.cs new file mode 100644 index 0000000..e4f769f --- /dev/null +++ b/ClosedXML_Examples/Misc/HideSheets.cs @@ -0,0 +1,63 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class HideSheets : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + + wb.Worksheets.Add("First Hidden").Hide(); + wb.Worksheets.Add("Visible"); + wb.Worksheets.Add("Unhidden").Hide().Unhide(); + wb.Worksheets.Add("VeryHidden").Visibility = XLWorksheetVisibility.VeryHidden; + wb.Worksheets.Add("Last Hidden").Hide(); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/HideUnhide.cs b/ClosedXML_Examples/Misc/HideUnhide.cs new file mode 100644 index 0000000..98c3df3 --- /dev/null +++ b/ClosedXML_Examples/Misc/HideUnhide.cs @@ -0,0 +1,64 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class HideUnhide : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Hide Rows Columns"); + + ws.Columns(1, 3).Hide(); + ws.Rows(1, 3).Hide(); + + ws.Column(2).Unhide(); + ws.Row(2).Unhide(); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/Hyperlinks.cs b/ClosedXML_Examples/Misc/Hyperlinks.cs new file mode 100644 index 0000000..4ce869f --- /dev/null +++ b/ClosedXML_Examples/Misc/Hyperlinks.cs @@ -0,0 +1,128 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class Hyperlinks : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Hyperlinks"); + wb.Worksheets.Add("Second Sheet"); + + Int32 ro = 0; + + // You can create a link with pretty much anything you can put on a + // browser: http, ftp, mailto, gopher, news, nntp, etc. + + ws.Cell(++ro, 1).Value = "Link to a web page, no tooltip - Yahoo!"; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink(@"http://www.yahoo.com"); + + ws.Cell(++ro, 1).Value = "Link to a web page, with a tooltip - Yahoo!"; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink(@"http://www.yahoo.com", "Click to go to Yahoo!"); + + ws.Cell(++ro, 1).Value = "Link to a file - same folder"; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink("Test.xlsx"); + + ws.Cell(++ro, 1).Value = "Link to a file - Absolute"; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink(@"D:\Test.xlsx"); + + ws.Cell(++ro, 1).Value = "Link to a file - relative address"; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink(@"../Test.xlsx"); + + ws.Cell(++ro, 1).Value = "Link to an address in this worksheet"; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink("B1"); + + ws.Cell(++ro, 1).Value = "Link to an address in another worksheet"; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink("'Second Sheet'!A1"); + + // You can also set the properties of a hyperlink directly: + + ws.Cell(++ro, 1).Value = "Link to a range in this worksheet"; + ws.Cell(ro, 1).Hyperlink.InternalAddress = "B1:C2"; + ws.Cell(ro, 1).Hyperlink.Tooltip = "SquareBox"; + + ws.Cell(++ro, 1).Value = "Link to an email message"; + ws.Cell(ro, 1).Hyperlink.ExternalAddress = new Uri(@"mailto:SantaClaus@NorthPole.com?subject=Presents"); + + // Deleting a hyperlink + ws.Cell(++ro, 1).Value = "This is no longer a link"; + ws.Cell(ro, 1).Hyperlink.InternalAddress = "A1"; + ws.Cell(ro, 1).Hyperlink.Delete(); + + // Setting a hyperlink preserves previous formatting: + ws.Cell(++ro, 1).Value = "Odd looking link"; + ws.Cell(ro, 1).Style.Font.FontColor = XLColor.Red; + ws.Cell(ro, 1).Style.Font.Underline = XLFontUnderlineValues.Double; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink(ws.Range("B1:C2")); + + // Hyperlink via formula + ws.Cell( ++ro, 1 ).SetValue( "Send Email" ) + .SetFormulaA1( "=HYPERLINK(\"mailto:test@test.com\", \"Send Email\")" ) + .Hyperlink = new XLHyperlink( "mailto:test@test.com", "'Send Email'" ); + + // List all hyperlinks in a worksheet: + var hyperlinksInWorksheet = ws.Hyperlinks; + + // List all hyperlinks in a range: + var hyperlinksInRange = ws.Range("A1:A3").Hyperlinks; + + // Clearing a cell with a hyperlink + ws.Cell(++ro, 1).Value = "ERROR!"; + ws.Cell(ro, 1).Hyperlink.InternalAddress = "A1"; + ws.Cell(ro, 1).Clear(); + + // Deleting a cell with a hyperlink + ws.Cell(++ro, 1).Value = "ERROR!"; + ws.Cell(ro, 1).Hyperlink.InternalAddress = "A1"; + ws.Cell(ro, 1).Clear(); + + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/InsertingData.cs b/ClosedXML_Examples/Misc/InsertingData.cs new file mode 100644 index 0000000..626a9ec --- /dev/null +++ b/ClosedXML_Examples/Misc/InsertingData.cs @@ -0,0 +1,110 @@ +using ClosedXML.Excel; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; + +namespace ClosedXML_Examples.Misc +{ + public class InsertingData : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Inserting Data"); + + // From a list of strings + var listOfStrings = new List(); + listOfStrings.Add("House"); + listOfStrings.Add("001"); + ws.Cell(1, 1).Value = "From Strings"; + ws.Cell(1, 1).AsRange().AddToNamed("Titles"); + ws.Cell(2, 1).InsertData(listOfStrings); + + // From a list of arrays + var listOfArr = new List(); + listOfArr.Add(new Int32[] { 1, 2, 3 }); + listOfArr.Add(new Int32[] { 1 }); + listOfArr.Add(new Int32[] { 1, 2, 3, 4, 5, 6 }); + ws.Cell(1, 3).Value = "From Arrays"; + ws.Range(1, 3, 1, 8).Merge().AddToNamed("Titles"); + ws.Cell(2, 3).InsertData(listOfArr); + + // From a DataTable + var dataTable = GetTable(); + ws.Cell(6, 1).Value = "From DataTable"; + ws.Range(6, 1, 6, 4).Merge().AddToNamed("Titles"); + ws.Cell(7, 1).InsertData(dataTable); + + // From a query + var list = new List(); + list.Add(new Person() { Name = "John", Age = 30, House = "On Elm St." }); + list.Add(new Person() { Name = "Mary", Age = 15, House = "On Main St." }); + list.Add(new Person() { Name = "Luis", Age = 21, House = "On 23rd St." }); + list.Add(new Person() { Name = "Henry", Age = 45, House = "On 5th Ave." }); + + var people = from p in list + where p.Age >= 21 + select new { p.Name, p.House, p.Age }; + + ws.Cell(6, 6).Value = "From Query"; + ws.Range(6, 6, 6, 8).Merge().AddToNamed("Titles"); + ws.Cell(7, 6).InsertData(people); + + ws.Cell(11, 6).Value = "From List"; + ws.Range(11, 6, 11, 9).Merge().AddToNamed("Titles"); + ws.Cell(12, 6).InsertData(list); + + ws.Cell("A13").Value = "Transposed"; + ws.Range(13, 1, 13, 3).Merge().AddToNamed("Titles"); + ws.Cell("A14").InsertData(people.AsEnumerable(), true); + + // Prepare the style for the titles + var titlesStyle = wb.Style; + titlesStyle.Font.Bold = true; + titlesStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + titlesStyle.Fill.BackgroundColor = XLColor.Cyan; + + // Format all titles in one shot + wb.NamedRanges.NamedRange("Titles").Ranges.Style = titlesStyle; + + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + } + + private class Person + { + public String House { get; set; } + public String Name { get; set; } + public Int32 Age { get; set; } + public static String ClassType { get { return nameof(Person); } } + } + + // Private + private DataTable GetTable() + { + DataTable table = new DataTable(); + table.Columns.Add("Dosage", typeof(int)); + table.Columns.Add("Drug", typeof(string)); + table.Columns.Add("Patient", typeof(string)); + table.Columns.Add("Date", typeof(DateTime)); + + table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); + table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); + table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); + table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4)); + table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5)); + return table; + } + + // Override + + #endregion Methods + } +} diff --git a/ClosedXML_Examples/Misc/LambdaExpressions.cs b/ClosedXML_Examples/Misc/LambdaExpressions.cs new file mode 100644 index 0000000..cbffea1 --- /dev/null +++ b/ClosedXML_Examples/Misc/LambdaExpressions.cs @@ -0,0 +1,57 @@ +using System.IO; +using System.Linq; +using ClosedXML.Excel; +using MoreLinq; + +namespace ClosedXML_Examples +{ + public class LambdaExpressions : IXLExample + { + public void Create(string filePath) + { + + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + var ws = workbook.Worksheet(1); + + // Define a range with the data + var firstDataCell = ws.Cell("B4"); + var lastDataCell = ws.LastCellUsed(); + var rngData = ws.Range(firstDataCell.Address, lastDataCell.Address); + + // Delete all rows where Outcast = false (the 3rd column) + rngData.Rows() // From all rows + .Where(r => !r.Cell(3).GetBoolean()) // where the 3rd cell of each row is false + .ForEach(r => r.Delete()); // delete the row and shift the cells up (the default for rows in a range) + + //// Put a light gray background to all text cells + //rngData.Cells() // From all cells + // .Where(c => c.DataType == XLCellValues.Text) // where the data type is Text + // .ForEach(c => c.Style.Fill.BackgroundColor = XLColor.LightGray); // Fill with a light gray + + var cells = rngData.Cells(); + var filtered = cells.Where(c => c.DataType == XLDataType.Text); + var list = filtered.ToList(); + foreach (var c in list) + { + c.Style.Fill.BackgroundColor = XLColor.LightGray; + } + + // Put a thick border to the bottom of the table (we may have deleted the bottom cells with the border) + rngData.LastRow().Style.Border.BottomBorder = XLBorderStyleValues.Thick; + + workbook.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + } +} diff --git a/ClosedXML_Examples/Misc/MergeCells.cs b/ClosedXML_Examples/Misc/MergeCells.cs new file mode 100644 index 0000000..dfe542b --- /dev/null +++ b/ClosedXML_Examples/Misc/MergeCells.cs @@ -0,0 +1,88 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class MergeCells : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Constructors + + // Public + + + // Private + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Merge Cells"); + + // Merge a row + ws.Cell("B2").Value = "Merged Row(1) of Range (B2:D3)"; + ws.Range("B2:D3").Row(1).Merge(); + + // Merge a column + ws.Cell("F2").Value = "Merged Column(1) of Range (F2:G8)"; + ws.Cell("F2").Style.Alignment.WrapText = true; + ws.Range("F2:G8").Column(1).Merge(); + + // Merge a range + ws.Cell("B4").Value = "Merged Range (B4:D6)"; + ws.Cell("B4").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + ws.Cell("B4").Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; + ws.Range("B4:D6").Merge(); + + // Unmerging a range... + ws.Cell("B8").Value = "Unmerged"; + ws.Range("B8:D8").Merge(); + ws.Range("B8:D8").Unmerge(); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/MergeMoves.cs b/ClosedXML_Examples/Misc/MergeMoves.cs new file mode 100644 index 0000000..a5be4ce --- /dev/null +++ b/ClosedXML_Examples/Misc/MergeMoves.cs @@ -0,0 +1,53 @@ +using System.IO; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class MergeMoves : IXLExample + { + + public void Create(string filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new MergeCells().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + + var ws = workbook.Worksheet(1); + + ws.Range("B1:F1").InsertRowsBelow(1); + ws.Range("A3:A9").InsertColumnsAfter(1); + ws.Row(1).Delete(); + ws.Column(1).Delete(); + + ws.Range("E8:E9").InsertColumnsAfter(1); + ws.Range("F2:F8").Merge(); + ws.Range("E3:E4").InsertColumnsAfter(1); + ws.Range("F2:F8").Merge(); + ws.Range("E1:E2").InsertColumnsAfter(1); + ws.Range("G2:G8").Merge(); + ws.Range("E1:E2").Delete(XLShiftDeletedCells.ShiftCellsLeft); + + ws.Range("D3:E3").InsertRowsBelow(1); + ws.Range("A1:B1").InsertRowsBelow(1); + ws.Range("B3:D3").Merge(); + ws.Range("A1:B1").Delete(XLShiftDeletedCells.ShiftCellsUp); + + ws.Range("B8:D8").Merge(); + ws.Range("D8:D9").Clear(); + + workbook.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + + } +} diff --git a/ClosedXML_Examples/Misc/MultipleSheets.cs b/ClosedXML_Examples/Misc/MultipleSheets.cs new file mode 100644 index 0000000..b0217c3 --- /dev/null +++ b/ClosedXML_Examples/Misc/MultipleSheets.cs @@ -0,0 +1,30 @@ +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class MultipleSheets : IXLExample + { + + public void Create(string filePath) + { + var wb = new XLWorkbook(); + foreach (var wsNum in Enumerable.Range(1, 5)) + { + wb.Worksheets.Add("Original Pos. is " + wsNum.ToString()); + } + + // Move first worksheet to the last position + wb.Worksheet(1).Position = wb.Worksheets.Count() + 1; + + // Delete worksheet on position 4 (in this case it's where original position = 5) + wb.Worksheet(4).Delete(); + + // Swap sheets in positions 1 and 2 + wb.Worksheet(2).Position = 1; + + wb.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Misc/Outline.cs b/ClosedXML_Examples/Misc/Outline.cs new file mode 100644 index 0000000..f920a5e --- /dev/null +++ b/ClosedXML_Examples/Misc/Outline.cs @@ -0,0 +1,86 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class Outline : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Outline"); + + ws.Outline.SummaryHLocation = XLOutlineSummaryHLocation.Right; + ws.Columns(2, 6).Group(); // Create an outline (level 1) for columns 2-6 + ws.Columns(2, 4).Group(); // Create an outline (level 2) for columns 2-4 + ws.Column(2).Ungroup(true); // Remove column 2 from all outlines + + ws.Outline.SummaryVLocation = XLOutlineSummaryVLocation.Bottom; + ws.Rows(1, 5).Group(); // Create an outline (level 1) for rows 1-5 + ws.Rows(1, 4).Group(); // Create an outline (level 2) for rows 1-4 + ws.Rows(1, 4).Collapse(); // Collapse rows 1-4 + ws.Rows(1, 2).Group(); // Create an outline (level 3) for rows 1-2 + ws.Rows(1, 2).Ungroup(); // Ungroup rows 1-2 from their last outline + + // You can also Collapse/Expand specific outline levels + // + // ws.CollapseRows(Int32 outlineLevel) + // ws.CollapseColumns(Int32 outlineLevel) + // + // ws.ExpandRows(Int32 outlineLevel) + // ws.ExpandColumns(Int32 outlineLevel) + + // And you can also Collapse/Expand ALL outline levels in one shot + // + // ws.CollapseRows() + // ws.CollapseColumns() + // + // ws.ExpandRows() + // ws.ExpandColumns() + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/RightToLeft.cs b/ClosedXML_Examples/Misc/RightToLeft.cs new file mode 100644 index 0000000..5137fec --- /dev/null +++ b/ClosedXML_Examples/Misc/RightToLeft.cs @@ -0,0 +1,21 @@ +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples.Misc +{ + public class RightToLeft : IXLExample + { + public void Create(String filePath) + { + var wb = new XLWorkbook(); + + var ws = wb.Worksheets.Add("RightToLeftSheet"); + ws.Cell("A1").Value = "A1"; + ws.Cell("B1").Value = "B1"; + ws.Cell("C1").Value = "C1"; + ws.RightToLeft = true; + + wb.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Misc/SheetProtection.cs b/ClosedXML_Examples/Misc/SheetProtection.cs new file mode 100644 index 0000000..c15435a --- /dev/null +++ b/ClosedXML_Examples/Misc/SheetProtection.cs @@ -0,0 +1,58 @@ +using ClosedXML.Excel; +using System; +using static ClosedXML.Excel.XLProtectionAlgorithm; + +namespace ClosedXML_Examples.Misc +{ + public class SheetProtection : IXLExample + { + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Protected No-Password"); + + ws.Protect().AllowElement + ( + // On this sheet we will only allow: + XLSheetProtectionElements.FormatCells + | XLSheetProtectionElements.InsertColumns + | XLSheetProtectionElements.DeleteColumns + | XLSheetProtectionElements.DeleteRows + | XLSheetProtectionElements.EditScenarios + ); + + ws.Cell("A1").SetValue("Locked, No Hidden (Default):").Style.Font.SetBold().Fill.SetBackgroundColor(XLColor.Cyan); + ws.Cell("B1").Style + .Border.SetOutsideBorder(XLBorderStyleValues.Medium); + + ws.Cell("A2").SetValue("Locked, Hidden:").Style.Font.SetBold().Fill.SetBackgroundColor(XLColor.Cyan); + ws.Cell("B2").Style + .Protection.SetHidden() + .Border.SetOutsideBorder(XLBorderStyleValues.Medium); + + ws.Cell("A3").SetValue("Not Locked, Hidden:").Style.Font.SetBold().Fill.SetBackgroundColor(XLColor.Cyan); + ws.Cell("B3").Style + .Protection.SetLocked(false) + .Protection.SetHidden() + .Border.SetOutsideBorder(XLBorderStyleValues.Medium); + + ws.Cell("A4").SetValue("Not Locked, Not Hidden:").Style.Font.SetBold().Fill.SetBackgroundColor(XLColor.Cyan); + ws.Cell("B4").Style + .Protection.SetLocked(false) + .Border.SetOutsideBorder(XLBorderStyleValues.Medium); + + ws.Columns().AdjustToContents(); + + // Protect a sheet with a password + var protectedSheet = wb.Worksheets.Add("Protected Password = 123"); + var protection = protectedSheet.Protect("123", Algorithm.SimpleHash); + protection.AllowElement + ( + XLSheetProtectionElements.InsertRows + | XLSheetProtectionElements.InsertColumns + ); + + wb.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Misc/SheetViews.cs b/ClosedXML_Examples/Misc/SheetViews.cs new file mode 100644 index 0000000..598f722 --- /dev/null +++ b/ClosedXML_Examples/Misc/SheetViews.cs @@ -0,0 +1,44 @@ +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Misc +{ + public class SheetViews : IXLExample + { + public void Create(string filePath) + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws; + + ws = wb.AddWorksheet("ZoomScale"); + ws.FirstCell().SetValue(ws.Name); + ws.SheetView.ZoomScale = 50; + + ws = wb.AddWorksheet("ZoomScaleNormal"); + ws.FirstCell().SetValue(ws.Name); + ws.SheetView.ZoomScaleNormal = 70; + + ws = wb.AddWorksheet("ZoomScalePageLayoutView"); + ws.FirstCell().SetValue(ws.Name); + ws.SheetView.ZoomScalePageLayoutView = 85; + + ws = wb.AddWorksheet("ZoomScaleSheetLayoutView"); + ws.FirstCell().SetValue(ws.Name); + ws.SheetView.ZoomScaleSheetLayoutView = 120; + + ws = wb.AddWorksheet("ZoomScaleTooSmall"); + ws.FirstCell().SetValue(ws.Name); + ws.SheetView.ZoomScale = 5; + + ws = wb.AddWorksheet("ZoomScaleTooBig"); + ws.FirstCell().SetValue(ws.Name); + ws.SheetView.ZoomScale = 500; + + ws = wb.AddWorksheet("TopLeftCell"); + ws.SheetView.TopLeftCellAddress = ws.Cell("AZ2000").Address; + + wb.SaveAs(filePath); + } + } + } +} diff --git a/ClosedXML_Examples/Misc/ShiftingFormulas.cs b/ClosedXML_Examples/Misc/ShiftingFormulas.cs new file mode 100644 index 0000000..63c636f --- /dev/null +++ b/ClosedXML_Examples/Misc/ShiftingFormulas.cs @@ -0,0 +1,93 @@ +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class ShiftingFormulas : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Shifting Formulas"); + ws.Cell("B2").Value = 5; + ws.Cell("B3").Value = 6; + ws.Cell("C2").Value = 1; + ws.Cell("C3").Value = 2; + ws.Cell("A4").Value = "Sum:"; + ws.Range("B4:C4").FormulaR1C1 = "Sum(R[-2]C:R[-1]C)"; + ws.Range("B4:C4").AddToNamed("WorkbookB4C4"); + ws.Range("B4:C4").AddToNamed("WorksheetB4C4", XLScope.Worksheet); + ws.Cell("E2").Value = "Avg:"; + + ws.Cell("F2").FormulaA1 = "Average(B2:C3)"; + ws.Ranges("A4,E2").Style + .Font.SetBold() + .Fill.SetBackgroundColor(XLColor.CyanProcess); + + var ws2 = wb.Worksheets.Add("WS2"); + ws2.Cell(1, 1).FormulaA1 = "='Shifting Formulas'!B2"; + ws2.Cell(1, 2).Value = ws2.Cell(1, 1).Value; + ws2.Cell(2, 1).FormulaA1 = "Average('Shifting Formulas'!$B$2:$C$3)"; + ws2.Cell(3, 1).FormulaA1 = "Average('Shifting Formulas'!$B$2:$C3)"; + ws2.Cell(4, 1).FormulaA1 = "Average('Shifting Formulas'!$B$2:C3)"; + ws2.Cell(5, 1).FormulaA1 = "Average('Shifting Formulas'!$B2:C3)"; + ws2.Cell(6, 1).FormulaA1 = "Average('Shifting Formulas'!B2:C3)"; + ws2.Cell(7, 1).FormulaA1 = "Average('Shifting Formulas'!B2:C$3)"; + ws2.Cell(8, 1).FormulaA1 = "Average('Shifting Formulas'!B2:$C$3)"; + ws2.Cell(9, 1).FormulaA1 = "Average('Shifting Formulas'!B$2:$C$3)"; + + var dataGrid = ws.Range("B2:D3"); + ws.Row(1).InsertRowsAbove(1); + var newRow = dataGrid.LastRow().InsertRowsAbove(1).First(); + newRow.Value = 1; + dataGrid.LastColumn().FormulaR1C1 = String.Format("SUM(RC[-{0}]:RC[-1])", dataGrid.ColumnCount() - 1); + ws.Cell(1, 1).InsertCellsBelow(1); + ws.Column(1).InsertColumnsBefore(1); + ws.Row(4).Delete(); + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/ShowCase.cs b/ClosedXML_Examples/Misc/ShowCase.cs new file mode 100644 index 0000000..77337f3 --- /dev/null +++ b/ClosedXML_Examples/Misc/ShowCase.cs @@ -0,0 +1,104 @@ +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples +{ + public class ShowCase : IXLExample + { + public void Create(String filePath) + { + // Creating a new workbook + var wb = new XLWorkbook(); + + //Adding a worksheet + var ws = wb.Worksheets.Add("Contacts"); + + //Adding text + //Title + ws.Cell("B2").Value = "Contacts"; + //First Names + ws.Cell("B3").Value = "FName"; + ws.Cell("B4").Value = "John"; + ws.Cell("B5").Value = "Hank"; + ws.Cell("B6").SetValue("Dagny"); // Another way to set the value + //Last Names + ws.Cell("C3").Value = "LName"; + ws.Cell("C4").Value = "Galt"; + ws.Cell("C5").Value = "Rearden"; + ws.Cell("C6").SetValue("Taggart"); // Another way to set the value + + //Adding more data types + //Is an outcast? + ws.Cell("D3").Value = "Outcast"; + ws.Cell("D4").Value = true; + ws.Cell("D5").Value = false; + ws.Cell("D6").SetValue(false); // Another way to set the value + //Date of Birth + ws.Cell("E3").Value = "DOB"; + ws.Cell("E4").Value = new DateTime(1919, 1, 21); + ws.Cell("E5").Value = new DateTime(1907, 3, 4); + ws.Cell("E6").SetValue(new DateTime(1921, 12, 15)); // Another way to set the value + //Income + ws.Cell("F3").Value = "Income"; + ws.Cell("F4").Value = 2000; + ws.Cell("F5").Value = 40000; + ws.Cell("F6").SetValue(10000); // Another way to set the value + + //Defining ranges + //From worksheet + var rngTable = ws.Range("B2:F6"); + //From another range + var rngDates = rngTable.Range("E4:E6"); + var rngNumbers = rngTable.Range("F4:F6"); + + //Formatting dates and numbers + //Using a OpenXML's predefined formats + rngDates.Style.NumberFormat.NumberFormatId = 15; + //Using a custom format + rngNumbers.Style.NumberFormat.Format = "$ #,##0"; + + //Format title cell in one shot + rngTable.Cell(1, 1).Style + .Font.SetBold() + .Fill.SetBackgroundColor(XLColor.CornflowerBlue) + .Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center); + + //Merge title cells + rngTable.FirstRow().Merge(); // We could've also used: rngTable.Range("A1:E1").Merge() or rngTable.Row(1).Merge() + + //Formatting headers + var rngHeaders = rngTable.Range("B3:F3"); + rngHeaders.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + rngHeaders.Style.Font.Bold = true; + rngHeaders.Style.Font.FontColor = XLColor.DarkBlue; + rngHeaders.Style.Fill.BackgroundColor = XLColor.Aqua; + + // Create an Excel table with the data portion + var rngData = ws.Range("B3:F6"); + var excelTable = rngData.CreateTable(); + + // Add the totals row + excelTable.ShowTotalsRow = true; + // Put the average on the field "Income" + // Notice how we're calling the cell by the column name + excelTable.Field("Income").TotalsRowFunction = XLTotalsRowFunction.Average; + // Put a label on the totals cell of the field "DOB" + excelTable.Field("DOB").TotalsRowLabel = "Average:"; + + //Add thick borders to the contents of our spreadsheet + ws.RangeUsed().Style.Border.OutsideBorder = XLBorderStyleValues.Thick; + + // You can also specify the border for each side with: + // contents.FirstColumn().Style.Border.LeftBorder = XLBorderStyleValues.Thick; + // contents.LastColumn().Style.Border.RightBorder = XLBorderStyleValues.Thick; + // contents.FirstRow().Style.Border.TopBorder = XLBorderStyleValues.Thick; + // contents.LastRow().Style.Border.BottomBorder = XLBorderStyleValues.Thick; + + // Adjust column widths to their content + ws.Columns(2, 6).AdjustToContents(); + + //Saving the workbook + wb.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Misc/TabColors.cs b/ClosedXML_Examples/Misc/TabColors.cs new file mode 100644 index 0000000..15222b9 --- /dev/null +++ b/ClosedXML_Examples/Misc/TabColors.cs @@ -0,0 +1,67 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class TabColors : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + + var wsRed = wb.Worksheets.Add("Red").SetTabColor(XLColor.Red); + + var wsAccent3 = wb.Worksheets.Add("Accent3").SetTabColor(XLColor.FromTheme(XLThemeColor.Accent3)); + + var wsIndexed = wb.Worksheets.Add("Indexed"); + wsIndexed.TabColor = XLColor.FromIndex(24); + + var wsArgb = wb.Worksheets.Add("Argb"); + wsArgb.TabColor = XLColor.FromArgb(23, 23, 23); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/WorkbookProperties.cs b/ClosedXML_Examples/Misc/WorkbookProperties.cs new file mode 100644 index 0000000..03a7426 --- /dev/null +++ b/ClosedXML_Examples/Misc/WorkbookProperties.cs @@ -0,0 +1,75 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class WorkbookProperties : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Workbook Properties"); + + wb.Properties.Author = "theAuthor"; + wb.Properties.Title = "theTitle"; + wb.Properties.Subject = "theSubject"; + wb.Properties.Category = "theCategory"; + wb.Properties.Keywords = "theKeywords"; + wb.Properties.Comments = "theComments"; + wb.Properties.Status = "theStatus"; + wb.Properties.LastModifiedBy = "theLastModifiedBy"; + wb.Properties.Company = "theCompany"; + wb.Properties.Manager = "theManager"; + + // Creating/Using custom properties + wb.CustomProperties.Add("theText", "XXX"); + wb.CustomProperties.Add("theDate", new DateTime(2011, 1, 1, 17, 0, 0, DateTimeKind.Utc)); // Use UTC to make sure test can be run in any time zone + wb.CustomProperties.Add("theNumber", 123.456); + wb.CustomProperties.Add("theBoolean", true); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/WorkbookProtection.cs b/ClosedXML_Examples/Misc/WorkbookProtection.cs new file mode 100644 index 0000000..0bd0122 --- /dev/null +++ b/ClosedXML_Examples/Misc/WorkbookProtection.cs @@ -0,0 +1,23 @@ +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Misc +{ + public class WorkbookProtection : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Workbook Protection"); + wb.Protect(true, false, "Abc@123"); + wb.SaveAs(filePath); + } + } + + #endregion + } +} diff --git a/ClosedXML_Examples/ModifyFiles.cs b/ClosedXML_Examples/ModifyFiles.cs new file mode 100644 index 0000000..69790b0 --- /dev/null +++ b/ClosedXML_Examples/ModifyFiles.cs @@ -0,0 +1,14 @@ +using ClosedXML_Examples.Delete; +using System.IO; + +namespace ClosedXML_Examples +{ + public class ModifyFiles + { + public static void Run() + { + var path = Program.BaseModifiedDirectory; + new DeleteRows().Create(Path.Combine(path, "DeleteRows.xlsx")); + } + } +} \ No newline at end of file diff --git a/ClosedXML_Examples/PageSetup/HeaderFooters.cs b/ClosedXML_Examples/PageSetup/HeaderFooters.cs new file mode 100644 index 0000000..ed8fee0 --- /dev/null +++ b/ClosedXML_Examples/PageSetup/HeaderFooters.cs @@ -0,0 +1,65 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.PageSetup +{ + public class HeaderFooters : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Headers and Footers"); + + // Simple left header to be placed on all pages + ws.PageSetup.Header.Left.AddText("Created with ClosedXML"); + + // Using various font decorations for the right header on the first page only + // Here we show different methods for setting font decorations. + + // Set single font decorations immediately + ws.PageSetup.Header.Right.AddText("The ", XLHFOccurrence.FirstPage).SetBold(); + ws.PageSetup.Header.Right.AddText("First ", XLHFOccurrence.FirstPage).SetFontColor(XLColor.Red); + + // Use the IXLRichText returned by the AddText(...) method to later on modify the font + var richText = ws.PageSetup.Header.Right.AddText("Colorful ", XLHFOccurrence.FirstPage); + richText.FontColor = XLColor.Blue; + richText.Underline = XLFontUnderlineValues.Double; + + // Set multiple font decorations chained + ws.PageSetup.Header.Right.AddText("Page", XLHFOccurrence.FirstPage) + .SetBold() + .SetItalic() + .SetFontName("Broadway"); + + + // Using predefined header/footer text: + + // Let's put the full path to the file on the right footer of every odd page: + ws.PageSetup.Footer.Right.AddText(XLHFPredefinedText.FullPath, XLHFOccurrence.OddPages); + + // Let's put the current page number and total pages on the center of every footer: + ws.PageSetup.Footer.Center.AddText(XLHFPredefinedText.PageNumber, XLHFOccurrence.AllPages); + ws.PageSetup.Footer.Center.AddText(" / ", XLHFOccurrence.AllPages); + ws.PageSetup.Footer.Center.AddText(XLHFPredefinedText.NumberOfPages, XLHFOccurrence.AllPages); + + // Don't align headers and footers with the margins + ws.PageSetup.AlignHFWithMargins = false; + + // Don't scale headers and footers with the document + ws.PageSetup.ScaleHFWithDocument = false; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/PageSetup/Margins.cs b/ClosedXML_Examples/PageSetup/Margins.cs new file mode 100644 index 0000000..ec2ad79 --- /dev/null +++ b/ClosedXML_Examples/PageSetup/Margins.cs @@ -0,0 +1,36 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.PageSetup +{ + public class Margins : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Margins"); + ws.PageSetup.Margins.Top = 1; + ws.PageSetup.Margins.Bottom = 1.25; + ws.PageSetup.Margins.Left = 0.5; + ws.PageSetup.Margins.Right = 0.75; + ws.PageSetup.Margins.Footer = 0.15; + ws.PageSetup.Margins.Header = 0.30; + + ws.PageSetup.CenterHorizontally = true; + ws.PageSetup.CenterVertically = true; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/PageSetup/Page.cs b/ClosedXML_Examples/PageSetup/Page.cs new file mode 100644 index 0000000..7c8078b --- /dev/null +++ b/ClosedXML_Examples/PageSetup/Page.cs @@ -0,0 +1,43 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.PageSetup +{ + public class Page : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws1 = workbook.Worksheets.Add("Page Setup - Page1"); + ws1.PageSetup.PageOrientation = XLPageOrientation.Landscape; + ws1.PageSetup.AdjustTo(80); + ws1.PageSetup.PaperSize = XLPaperSize.LegalPaper; + ws1.PageSetup.VerticalDpi = 600; + ws1.PageSetup.HorizontalDpi = 600; + + var ws2 = workbook.Worksheets.Add("Page Setup - Page2"); + ws2.PageSetup.PageOrientation = XLPageOrientation.Portrait; + ws2.PageSetup.FitToPages(2, 2); // Alternatively you can use + // ws2.PageSetup.PagesTall = # + // and/or ws2.PageSetup.PagesWide = # + + ws2.PageSetup.PaperSize = XLPaperSize.LetterPaper; + ws2.PageSetup.VerticalDpi = 600; + ws2.PageSetup.HorizontalDpi = 600; + ws2.PageSetup.FirstPageNumber = 5; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/PageSetup/SheetTab.cs b/ClosedXML_Examples/PageSetup/SheetTab.cs new file mode 100644 index 0000000..8bb70d3 --- /dev/null +++ b/ClosedXML_Examples/PageSetup/SheetTab.cs @@ -0,0 +1,58 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.PageSetup +{ + public class SheetTab : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Sheet Tab"); + + // Adding print areas + ws.PageSetup.PrintAreas.Add("A1:B2"); + ws.PageSetup.PrintAreas.Add("D3:D5"); + + // Adding rows to repeat at top + ws.PageSetup.SetRowsToRepeatAtTop(1,2); + + // Adding columns to repeat at left + ws.PageSetup.SetColumnsToRepeatAtLeft(1, 2); + + // Show gridlines + ws.PageSetup.ShowGridlines = true; + + // Print in black and white + ws.PageSetup.BlackAndWhite = true; + + // Print in draft quality + ws.PageSetup.DraftQuality = true; + + // Show row and column headings + ws.PageSetup.ShowRowAndColumnHeadings = true; + + // Set the page print order to over, then down + ws.PageSetup.PageOrder = XLPageOrderValues.OverThenDown; + + // Place comments at the end of the sheet + ws.PageSetup.ShowComments = XLShowCommentsValues.AtEnd; + + // Print errors as #N/A + ws.PageSetup.PrintErrorValue = XLPrintErrorValues.NA; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/PageSetup/Sheets.cs b/ClosedXML_Examples/PageSetup/Sheets.cs new file mode 100644 index 0000000..0ee94cc --- /dev/null +++ b/ClosedXML_Examples/PageSetup/Sheets.cs @@ -0,0 +1,34 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.PageSetup +{ + public class Sheets : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws1 = workbook.Worksheets.Add("Separate PrintAreas"); + ws1.PageSetup.PrintAreas.Add("A1:B2"); + ws1.PageSetup.PrintAreas.Add("D3:D5"); + + var ws2 = workbook.Worksheets.Add("Page Breaks"); + ws2.PageSetup.PrintAreas.Add("A1:D5"); + ws2.PageSetup.AddHorizontalPageBreak(2); + ws2.PageSetup.AddVerticalPageBreak(2); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/PageSetup/TwoPages.cs b/ClosedXML_Examples/PageSetup/TwoPages.cs new file mode 100644 index 0000000..fe06049 --- /dev/null +++ b/ClosedXML_Examples/PageSetup/TwoPages.cs @@ -0,0 +1,36 @@ +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.PageSetup +{ + public class TwoPages : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet1"); + foreach (var ro in Enumerable.Range(1, 100)) + { + foreach (var co in Enumerable.Range(1, 10)) + { + ws.Cell(ro, co).Value = ws.Cell(ro, co).Address.ToString(); + } + } + ws.PageSetup.PagesWide = 1; + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/PivotTables/PivotTables.cs b/ClosedXML_Examples/PivotTables/PivotTables.cs new file mode 100644 index 0000000..cfc8a42 --- /dev/null +++ b/ClosedXML_Examples/PivotTables/PivotTables.cs @@ -0,0 +1,234 @@ +using ClosedXML.Excel; +using System; +using System.Collections.Generic; + +namespace ClosedXML_Examples +{ + public class PivotTables : IXLExample + { + private class Pastry + { + public Pastry(string name, int? code, int numberOfOrders, double quality, string month, DateTime? bakeDate) + { + Name = name; + Code = code; + NumberOfOrders = numberOfOrders; + Quality = quality; + Month = month; + BakeDate = bakeDate; + } + + public string Name { get; set; } + public int? Code { get; } + public int NumberOfOrders { get; set; } + public double Quality { get; set; } + public string Month { get; set; } + public DateTime? BakeDate { get; set; } + } + + public void Create(String filePath) + { + var pastries = new List + { + new Pastry("Croissant", 101, 150, 60.2, "Apr", new DateTime(2016, 04, 21)), + new Pastry("Croissant", 101, 250, 50.42, "May", new DateTime(2016, 05, 03)), + new Pastry("Croissant", 101, 134, 22.12, "Jun", new DateTime(2016, 06, 24)), + new Pastry("Doughnut", 102, 250, 89.99, "Apr", new DateTime(2017, 04, 23)), + new Pastry("Doughnut", 102, 225, 70, "May", new DateTime(2016, 05, 24)), + new Pastry("Doughnut", 102, 210, 75.33, "Jun", new DateTime(2016, 06, 02)), + new Pastry("Bearclaw", 103, 134, 10.24, "Apr", new DateTime(2016, 04, 27)), + new Pastry("Bearclaw", 103, 184, 33.33, "May", new DateTime(2016, 05, 20)), + new Pastry("Bearclaw", 103, 124, 25, "Jun", new DateTime(2017, 06, 05)), + new Pastry("Danish", 104, 394, -20.24, "Apr", new DateTime(2017, 04, 24)), + new Pastry("Danish", 104, 190, 60, "May", new DateTime(2017, 05, 08)), + new Pastry("Danish", 104, 221, 24.76, "Jun", new DateTime(2016, 06, 21)), + + // Deliberately add different casings of same string to ensure pivot table doesn't duplicate it. + new Pastry("Scone", 105, 135, 0, "Apr", new DateTime(2017, 04, 22)), + new Pastry("SconE", 105, 122, 5.19, "May", new DateTime(2017, 05, 03)), + new Pastry("SCONE", 105, 243, 44.2, "Jun", new DateTime(2017, 06, 14)), + + // For ContainsBlank and integer rows/columns test + new Pastry("Scone", null, 255, 18.4, null, null), + }; + + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("PastrySalesData"); + // Insert our list of pastry data into the "PastrySalesData" sheet at cell 1,1 + var table = ws.Cell(1, 1).InsertTable(pastries, "PastrySalesData", true); + ws.Columns().AdjustToContents(); + + + IXLWorksheet ptSheet; + IXLPivotTable pt; + + #region Pivots + + for (int i = 1; i <= 3; i++) + { + // Add a new sheet for our pivot table + ptSheet = wb.Worksheets.Add("pvt" + i); + + // Create the pivot table, using the data from the "PastrySalesData" table + pt = ptSheet.PivotTables.Add("pvt", ptSheet.Cell(1, 1), table.AsRange()); + + // The rows in our pivot table will be the names of the pastries + if (i == 2) pt.RowLabels.Add(XLConstants.PivotTable.ValuesSentinalLabel); + pt.RowLabels.Add("Name"); + + // The columns will be the months + pt.ColumnLabels.Add("Month"); + if (i == 3) pt.ColumnLabels.Add(XLConstants.PivotTable.ValuesSentinalLabel); + + // The values in our table will come from the "NumberOfOrders" field + // The default calculation setting is a total of each row/column + pt.Values.Add("NumberOfOrders", "NumberOfOrdersPercentageOfBearclaw") + .ShowAsPercentageFrom("Name").And("Bearclaw") + .NumberFormat.Format = "0%"; + + if (i > 1) + { + pt.Values.Add("Quality", "Sum of Quality") + .NumberFormat.SetFormat("#,##0.00"); + } + if (i > 2) + { + pt.Values.Add("NumberOfOrders", "Sum of NumberOfOrders"); + } + + ptSheet.Columns().AdjustToContents(); + } + + #endregion Pivots + + #region Different kind of pivot + + ptSheet = wb.Worksheets.Add("pvtNoColumnLabels"); + pt = ptSheet.PivotTables.Add("pvtNoColumnLabels", ptSheet.Cell(1, 1), table.AsRange()); + + pt.RowLabels.Add("Name"); + pt.RowLabels.Add("Month"); + + pt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum); + pt.Values.Add("Quality").SetSummaryFormula(XLPivotSummary.Sum); + + pt.SetRowHeaderCaption("Pastry name"); + + #endregion Different kind of pivot + + #region Pivot table with collapsed fields + + ptSheet = wb.Worksheets.Add("pvtCollapsedFields"); + pt = ptSheet.PivotTables.Add("pvtCollapsedFields", ptSheet.Cell(1, 1), table.AsRange()); + + pt.RowLabels.Add("Name").SetCollapsed(); + pt.RowLabels.Add("Month").SetCollapsed(); + + pt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum); + pt.Values.Add("Quality").SetSummaryFormula(XLPivotSummary.Sum); + + #endregion Pivot table with collapsed fields + + #region Pivot table with a field both as a value and as a row/column/filter label + + ptSheet = wb.Worksheets.Add("pvtFieldAsValueAndLabel"); + pt = ptSheet.PivotTables.Add("pvtFieldAsValueAndLabel", ptSheet.Cell(1, 1), table.AsRange()); + + pt.RowLabels.Add("Name"); + pt.RowLabels.Add("Month"); + + pt.Values.Add("Name").SetSummaryFormula(XLPivotSummary.Count);//.NumberFormat.Format = "#0.00"; + + #endregion Pivot table with a field both as a value and as a row/column/filter label + + #region Pivot table with subtotals disabled + + ptSheet = wb.Worksheets.Add("pvtHideSubTotals"); + + // Create the pivot table, using the data from the "PastrySalesData" table + pt = ptSheet.PivotTables.Add("pvtHidesubTotals", ptSheet.Cell(1, 1), table.AsRange()); + + // The rows in our pivot table will be the names of the pastries + pt.RowLabels.Add(XLConstants.PivotTable.ValuesSentinalLabel); + + // The columns will be the months + pt.ColumnLabels.Add("Month"); + pt.ColumnLabels.Add("Name"); + + // The values in our table will come from the "NumberOfOrders" field + // The default calculation setting is a total of each row/column + pt.Values.Add("NumberOfOrders", "NumberOfOrdersPercentageOfBearclaw") + .ShowAsPercentageFrom("Name").And("Bearclaw") + .NumberFormat.Format = "0%"; + + pt.Values.Add("Quality", "Sum of Quality") + .NumberFormat.SetFormat("#,##0.00"); + + pt.Subtotals = XLPivotSubtotals.DoNotShow; + + pt.SetColumnHeaderCaption("Measures"); + + ptSheet.Columns().AdjustToContents(); + + #endregion Pivot table with subtotals disabled + + #region Pivot Table with filter + + ptSheet = wb.Worksheets.Add("pvtFilter"); + + pt = table.CreatePivotTable(ptSheet.FirstCell(), "pvtFilter"); + + pt.RowLabels.Add("Month"); + + pt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum); + + pt.ReportFilters.Add("Name") + .AddSelectedValue("Scone") + .AddSelectedValue("Doughnut"); + + pt.ReportFilters.Add("Quality") + .AddSelectedValue(5.19); + + pt.ReportFilters.Add("BakeDate") + .AddSelectedValue(new DateTime(2017, 05, 03)); + + #endregion Pivot Table with filter + + #region Pivot table sorting + + ptSheet = wb.Worksheets.Add("pvtSort"); + pt = ptSheet.PivotTables.Add("pvtSort", ptSheet.Cell(1, 1), table.AsRange()); + + pt.RowLabels.Add("Name").SetSort(XLPivotSortType.Ascending); + pt.RowLabels.Add("Month").SetSort(XLPivotSortType.Descending); + + pt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum); + pt.Values.Add("Quality").SetSummaryFormula(XLPivotSummary.Sum); + + pt.SetRowHeaderCaption("Pastry name"); + + #endregion Different kind of pivot + + #region Pivot Table with integer rows + + ptSheet = wb.Worksheets.Add("pvtInteger"); + + pt = ptSheet.PivotTables.Add("pvtInteger", ptSheet.Cell(1, 1), table); + + pt.RowLabels.Add("Name"); + pt.RowLabels.Add("Code"); + pt.RowLabels.Add("BakeDate"); + + pt.ColumnLabels.Add("Month"); + + pt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum); + pt.Values.Add("Quality").SetSummaryFormula(XLPivotSummary.Sum); + + #endregion Pivot Table with filter + + wb.SaveAs(filePath); + } + } + } +} diff --git a/ClosedXML_Examples/Program.cs b/ClosedXML_Examples/Program.cs new file mode 100644 index 0000000..afefad3 --- /dev/null +++ b/ClosedXML_Examples/Program.cs @@ -0,0 +1,34 @@ +using System; +using System.IO; + +namespace ClosedXML_Examples +{ + public class Program + { + public static string BaseCreatedDirectory + { + get + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Created"); + if (!Directory.Exists(path)) Directory.CreateDirectory(path); + return path; + } + } + + public static string BaseModifiedDirectory + { + get + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Modified"); + if (!Directory.Exists(path)) Directory.CreateDirectory(path); + return path; + } + } + + private static void Main(string[] args) + { + CreateFiles.CreateAllFiles(); + LoadFiles.LoadAllFiles(); + } + } +} \ No newline at end of file diff --git a/ClosedXML_Examples/Ranges/AddingRowToTables.cs b/ClosedXML_Examples/Ranges/AddingRowToTables.cs new file mode 100644 index 0000000..b0a7b65 --- /dev/null +++ b/ClosedXML_Examples/Ranges/AddingRowToTables.cs @@ -0,0 +1,56 @@ +using ClosedXML.Excel; +using System; +using System.IO; +using System.Linq; + +namespace ClosedXML_Examples.Ranges +{ + public class AddingRowToTables : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var wb = new XLWorkbook(tempFile); + var ws = wb.Worksheets.First(); + + var firstCell = ws.FirstCellUsed(); + var lastCell = ws.LastCellUsed(); + var range = ws.Range(firstCell.Address, lastCell.Address); + range.FirstRow().Delete(); // Deleting the "Contacts" header (we don't need it for our purposes) + + // We want to use a theme for table, not the hard coded format of the BasicTable + range.Clear(XLClearOptions.AllFormats); + // Put back the date and number formats + range.Column(4).Style.NumberFormat.NumberFormatId = 15; + range.Column(5).Style.NumberFormat.Format = "$ #,##0"; + + var table = range.CreateTable(); // You can also use range.AsTable() if you want to + + ws.Cell("Q6000").Value = "dummy value"; + + var row = table.DataRange.InsertRowsBelow(1).First(); + + wb.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + + // Private + + // Override + + #endregion Methods + } +} diff --git a/ClosedXML_Examples/Ranges/ClearingRanges.cs b/ClosedXML_Examples/Ranges/ClearingRanges.cs new file mode 100644 index 0000000..f33df7c --- /dev/null +++ b/ClosedXML_Examples/Ranges/ClearingRanges.cs @@ -0,0 +1,54 @@ +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Ranges +{ + public class ClearingRanges : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Clearing Ranges"); + foreach (var ro in Enumerable.Range(1, 10)) + { + foreach (var co in Enumerable.Range(1, 10)) + { + var cell = ws.Cell(ro, co); + cell.Value = cell.Address.ToString(); + cell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + cell.Style.Fill.BackgroundColor = XLColor.Turquoise; + cell.Style.Font.Bold = true; + } + } + + // Clearing a range + ws.Range("B1:C2").Clear(); + + // Clearing a row in a range + ws.Range("B4:C5").Row(1).Clear(); + + // Clearing a column in a range + ws.Range("E1:F4").Column(2).Clear(); + + // Clear an entire row + ws.Row(7).Clear(); + + // Clear an entire column + ws.Column("H").Clear(); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Ranges/CopyingRanges.cs b/ClosedXML_Examples/Ranges/CopyingRanges.cs new file mode 100644 index 0000000..7718f7a --- /dev/null +++ b/ClosedXML_Examples/Ranges/CopyingRanges.cs @@ -0,0 +1,37 @@ +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class CopyingRanges : IXLExample + { + public void Create(string filePath) + { + var tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + var ws = workbook.Worksheet(1); + + // Define a range with the data + var firstTableCell = ws.FirstCellUsed(); + var lastTableCell = ws.LastCellUsed(); + var rngData = ws.Range(firstTableCell.Address, lastTableCell.Address); + + // Copy the table to another worksheet + var wsCopy = workbook.Worksheets.Add("Contacts Copy"); + wsCopy.Cell(1, 1).Value = rngData; + + workbook.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + } +} \ No newline at end of file diff --git a/ClosedXML_Examples/Ranges/CurrentRowColumn.cs b/ClosedXML_Examples/Ranges/CurrentRowColumn.cs new file mode 100644 index 0000000..98d662c --- /dev/null +++ b/ClosedXML_Examples/Ranges/CurrentRowColumn.cs @@ -0,0 +1,51 @@ +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Ranges +{ + public class CurrentRowColumn : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Current Row Column"); + + var cell = ws.Cell(5, 2); + cell.Style.Fill.SetBackgroundColor(XLColor.Red); + ws.Cell(1, 1) + .SetValue("Red's Row:") + .CellRight().SetValue(cell.WorksheetRow().RowNumber()) + .CellBelow().SetValue(cell.WorksheetColumn().ColumnLetter()) + .CellLeft().SetValue("Red's Column:"); + + var row = ws.Range("A6:C6").FirstRow(); + row.Style.Fill.SetBackgroundColor(XLColor.Blue); + + var column = ws.Range("B7:B9").FirstColumn(); + column.Style.Fill.SetBackgroundColor(XLColor.Green); + + ws.Cell(1, 4) + .SetValue("Blue's Row:") + .CellRight().SetValue(row.WorksheetRow().RowNumber()) + .CellBelow().SetValue(column.WorksheetColumn().ColumnLetter()) + .CellLeft().SetValue("Green's Column:"); + + ws.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right; + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Ranges/DefiningRanges.cs b/ClosedXML_Examples/Ranges/DefiningRanges.cs new file mode 100644 index 0000000..125ba44 --- /dev/null +++ b/ClosedXML_Examples/Ranges/DefiningRanges.cs @@ -0,0 +1,49 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Ranges +{ + public class DefiningRanges : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Defining a Range"); + + // With a string + var range1 = ws.Range("A1:B1"); + range1.Cell(1, 1).Value = "ws.Range(\"A1:B1\").Merge()"; + range1.Merge(); + + // With two XLAddresses + var range2 = ws.Range(ws.Cell(2, 1).Address, ws.Cell(2, 2).Address); + range2.Cell(1, 1).Value = "ws.Range(ws.Cell(2, 1).Address, ws.Cell(2, 2).Address).Merge()"; + range2.Merge(); + + // With two strings + var range4 = ws.Range("A3", "B3"); + range4.Cell(1, 1).Value = "ws.Range(\"A3\", \"B3\").Merge()"; + range4.Merge(); + + // With 4 points + var range5 = ws.Range(4, 1, 4, 2); + range5.Cell(1, 1).Value = "ws.Range(4, 1, 4, 2).Merge()"; + range5.Merge(); + + ws.Column("A").AdjustToContents(); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Ranges/DeletingRanges.cs b/ClosedXML_Examples/Ranges/DeletingRanges.cs new file mode 100644 index 0000000..cd916c8 --- /dev/null +++ b/ClosedXML_Examples/Ranges/DeletingRanges.cs @@ -0,0 +1,69 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Ranges +{ + public class DeletingRanges : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Deleting Ranges"); + + // Deleting Columns + // Setup test values + ws.Columns("1-3, 5, 7").Style.Fill.BackgroundColor = XLColor.Gray; + ws.Columns("4, 6").Style.Fill.BackgroundColor = XLColor.GreenPigment; + ws.Row(1).Cells("1-3, 5, 7").Value = "FAIL"; + + ws.Column(7).Delete(); + ws.Column(1).Delete(); + ws.Columns(1,2).Delete(); + ws.Column(2).Delete(); + + // Deleting Rows + ws.Rows("1,5,7").Style.Fill.BackgroundColor = XLColor.GreenPigment; + ws.Rows("2-4,6, 8").Style.Fill.BackgroundColor = XLColor.Gray; + ws.Column(1).Cells("2-4,6, 8").Value = "FAIL"; + + ws.Row(8).Delete(); + ws.Row(2).Delete(); + ws.Rows(2, 3).Delete(); + ws.Rows(3, 4).Delete(); + + // Deleting Ranges (Shifting Left) + var rng1 = ws.Range(2, 2, 8, 8); + rng1.Columns("1-3, 5, 7").Style.Fill.BackgroundColor = XLColor.Gray; + rng1.Columns("4, 6").Style.Fill.BackgroundColor = XLColor.Orange; + rng1.Row(1).Cells("1-3, 5, 7").Value = "FAIL"; + + rng1.Column(7).Delete(); + rng1.Column(1).Delete(); + rng1.Range(1, 1, rng1.RowCount(), 2).Delete(XLShiftDeletedCells.ShiftCellsLeft); + rng1.Column(2).Delete(); + + // Deleting Ranges (Shifting Up) + rng1.Rows("4, 6").Style.Fill.BackgroundColor = XLColor.Orange; + rng1.Rows("1-3, 5, 7").Style.Fill.BackgroundColor = XLColor.Gray; + rng1.Column(1).Cells("1-3, 5, 7").Value = "FAIL"; + + rng1.Row(7).Delete(); + rng1.Row(1).Delete(); + rng1.Range(1, 1, 2, rng1.ColumnCount()).Delete(XLShiftDeletedCells.ShiftCellsUp); + rng1.Row(2).Delete(); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Ranges/InsertingDeletingColumns.cs b/ClosedXML_Examples/Ranges/InsertingDeletingColumns.cs new file mode 100644 index 0000000..f2aecb5 --- /dev/null +++ b/ClosedXML_Examples/Ranges/InsertingDeletingColumns.cs @@ -0,0 +1,55 @@ +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class InsertingDeletingColumns : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Inserting and Deleting Columns"); + + // Range starts with 2 columns + var rng = ws.Range("B2:C3"); // Range starts on B2 + + // Insert a column before the range + ws.Column(1).InsertColumnsAfter(1); // Range starts on C2 + + // Insert a column in between the range + ws.Column(3).InsertColumnsAfter(1); // Range now has 3 columns + + // Insert a column (from a range) before the range + ws.Range("A2:A3").InsertColumnsAfter(1); // Range starts on D2 + + // Insert a column (from a range) in between the range + ws.Range("D2:D3").InsertColumnsAfter(1); // Range now has 4 columns + + // Inserting columns from a range not covering all columns + // does not affect our defined range + ws.Range("A1:A2").InsertColumnsAfter(1); + ws.Range("E3:E4").InsertColumnsAfter(1); + + // Delete a column before the range + ws.Column(1).Delete(); // Range starts on C2 + + // Delete a column (from a range) before the range + ws.Range("A2:A3").Delete(XLShiftDeletedCells.ShiftCellsLeft); // Range starts on B2 + + // Delete a column in between the range + ws.Column(3).Delete(); // Range now has 3 columns + + // Delete a column (from a range) in between the range + ws.Range("C2:C3").Delete(XLShiftDeletedCells.ShiftCellsLeft); // Range now has 2 columns + + // Deleting columns from a range not covering all columns + // does not affect our defined range + ws.Range("A1:A2").Delete(XLShiftDeletedCells.ShiftCellsLeft); + ws.Range("D3:D4").Delete(XLShiftDeletedCells.ShiftCellsLeft); + + rng.Style.Fill.BackgroundColor = XLColor.Orange; + + workbook.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Ranges/InsertingDeletingRows.cs b/ClosedXML_Examples/Ranges/InsertingDeletingRows.cs new file mode 100644 index 0000000..9d4617c --- /dev/null +++ b/ClosedXML_Examples/Ranges/InsertingDeletingRows.cs @@ -0,0 +1,55 @@ +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class InsertingDeletingRows : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Inserting and Deleting Rows"); + + // Range starts with 2 rows + var rng = ws.Range("B2:C3"); + + // Insert a row above the range + ws.Row(1).InsertRowsBelow(1); // Range starts on B3 + + // Insert a row in between the range + ws.Row(3).InsertRowsBelow(1); // Range now has 3 rows + + // Insert a row (from a range) above the range + ws.Range("B1:C1").InsertRowsBelow(1); // Range starts on B4 + + // Insert a row (from a range) in between the range + ws.Range("B4:C4").InsertRowsBelow(1); // Range now has 4 rows + + // Inserting rows from a range not covering all columns + // does not affect our defined range + ws.Range("A1:B1").InsertRowsBelow(1); + ws.Range("C4:D4").InsertRowsBelow(1); + + // Delete a row above the range + ws.Row(1).Delete(); // Range starts on B3 + + // Delete a row (from a range) above the range + ws.Range("B1:C1").Delete(XLShiftDeletedCells.ShiftCellsUp); // Range starts on B2 + + // Delete a row in between the range + ws.Row(3).Delete(); // Range now has 3 rows + + // Delete a row (from a range) in between the range + ws.Range("B3:C3").Delete(XLShiftDeletedCells.ShiftCellsUp); // Range now has 2 rows + + // Deleting rows from a range not covering all columns + // does not affect our defined range + ws.Range("A1:B1").Delete(XLShiftDeletedCells.ShiftCellsUp); + ws.Range("C4:D4").Delete(XLShiftDeletedCells.ShiftCellsUp); + + rng.Style.Fill.BackgroundColor = XLColor.Orange; + + workbook.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Ranges/MultipleRanges.cs b/ClosedXML_Examples/Ranges/MultipleRanges.cs new file mode 100644 index 0000000..0652f98 --- /dev/null +++ b/ClosedXML_Examples/Ranges/MultipleRanges.cs @@ -0,0 +1,22 @@ +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class MultipleRanges : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Multiple Ranges"); + + // using multiple string range definitions + ws.Ranges("A1:B2,C3:D4,E5:F6").Style.Fill.BackgroundColor = XLColor.Red; + + // using a single string separated by commas + ws.Ranges("A5:B6,E1:F2").Style.Fill.BackgroundColor = XLColor.Orange; + + workbook.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Ranges/NamedRanges.cs b/ClosedXML_Examples/Ranges/NamedRanges.cs new file mode 100644 index 0000000..948a56c --- /dev/null +++ b/ClosedXML_Examples/Ranges/NamedRanges.cs @@ -0,0 +1,85 @@ +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples.Misc +{ + public class NamedRanges : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var wsPresentation = wb.Worksheets.Add("Presentation"); + var wsData = wb.Worksheets.Add("Data"); + + // Fill up some data + wsData.Cell(1, 1).Value = "Name"; + wsData.Cell(1, 2).Value = "Age"; + wsData.Cell(2, 1).Value = "Tom"; + wsData.Cell(2, 2).Value = 30; + wsData.Cell(3, 1).Value = "Dick"; + wsData.Cell(3, 2).Value = 25; + wsData.Cell(4, 1).Value = "Harry"; + wsData.Cell(4, 2).Value = 29; + + // Create a named range with the data: + wsData.Range("A2:B4").AddToNamed("PeopleData"); // Default named range scope is Workbook + + // Create a hidden named range + wb.NamedRanges.Add("Headers", wsData.Range("A1:B1")).Visible = false; + + // Create a hidden named range n worksheet scope + wsData.NamedRanges.Add("HeadersAndData", wsData.Range("A1:B4")).Visible = false; + + // Let's use the named range in a formula: + wsPresentation.Cell(1, 1).Value = "People Count:"; + wsPresentation.Cell(1, 2).FormulaA1 = "COUNT(PeopleData)"; + + // Create a named range with worksheet scope: + wsPresentation.Range("B1").AddToNamed("PeopleCount", XLScope.Worksheet); + + // Let's use the named range: + wsPresentation.Cell(2, 1).Value = "Total:"; + wsPresentation.Cell(2, 2).FormulaA1 = "PeopleCount"; + + // Copy the data in a named range: + wsPresentation.Cell(4, 1).Value = "People Data:"; + wsPresentation.Cell(5, 1).Value = wb.Range("PeopleData"); + + ///////////////////////////////////////////////////////////////////////// + // For the Excel geeks out there who actually know about + // named ranges with relative addresses, you can + // create such a thing with the following methods: + + // The following creates a relative named range pointing to the same row + // and one column to the right. For example if the current cell is B4 + // relativeRange1 will point to C4. + wsPresentation.NamedRanges.Add("relativeRange1", "Presentation!B1"); + + // The following creates a ralative named range pointing to the same row + // and one column to the left. For example if the current cell is D2 + // relativeRange2 will point to C2. + wb.NamedRanges.Add("relativeRange2", "Presentation!XFD1"); + + // Explanation: The address of a relative range always starts at A1 + // and moves from then on. To get the desired relative range just + // add or subtract the required rows and/or columns from A1. + // Column -1 = XFD, Column -2 = XFC, etc. + // Row -1 = 1048576, Row -2 = 1048575, etc. + ///////////////////////////////////////////////////////////////////////// + + wsData.Columns().AdjustToContents(); + wsPresentation.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + #endregion Methods + } +} diff --git a/ClosedXML_Examples/Ranges/SelectingRanges.cs b/ClosedXML_Examples/Ranges/SelectingRanges.cs new file mode 100644 index 0000000..f5897df --- /dev/null +++ b/ClosedXML_Examples/Ranges/SelectingRanges.cs @@ -0,0 +1,29 @@ +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Ranges +{ + public class SelectingRanges : IXLExample + { + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var wsActiveCell = wb.AddWorksheet("Set Active Cell"); + wsActiveCell.Cell("B2").SetActive(); + + var wsSelectRowsColumns = wb.AddWorksheet("Select Rows and Columns"); + wsSelectRowsColumns.Rows("2, 4-5").Select(); + wsSelectRowsColumns.Columns("2, 4-5").Select(); + + var wsSelectMisc = wb.AddWorksheet("Select Misc"); + wsSelectMisc.Cell("B2").Select(); + wsSelectMisc.Range("D2:E2").Select(); + wsSelectMisc.Ranges("C3, D4:E5").Select(); + + wb.SaveAs(filePath); + } + + } +} diff --git a/ClosedXML_Examples/Ranges/ShiftingRanges.cs b/ClosedXML_Examples/Ranges/ShiftingRanges.cs new file mode 100644 index 0000000..6bba32d --- /dev/null +++ b/ClosedXML_Examples/Ranges/ShiftingRanges.cs @@ -0,0 +1,40 @@ +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class ShiftingRanges : IXLExample + { + public void Create(string filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + var ws = workbook.Worksheet(1); + + // Get a range object + var rngHeaders = ws.Range("B3:F3"); + + // Insert some rows/columns before the range + ws.Row(1).InsertRowsAbove(2); + ws.Column(1).InsertColumnsBefore(2); + + // Change the background color of the headers + rngHeaders.Style.Fill.BackgroundColor = XLColor.LightSalmon; + + ws.Columns().AdjustToContents(); + + workbook.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + } +} diff --git a/ClosedXML_Examples/Ranges/SortExample.cs b/ClosedXML_Examples/Ranges/SortExample.cs new file mode 100644 index 0000000..084808f --- /dev/null +++ b/ClosedXML_Examples/Ranges/SortExample.cs @@ -0,0 +1,233 @@ +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class SortExample : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + + #region Sort a table + var wsTable = wb.Worksheets.Add("Table"); + AddTestTable(wsTable); + var header = wsTable.Row(1).InsertRowsAbove(1).First(); + for(Int32 co = 1; co <= wsTable.LastColumnUsed().ColumnNumber(); co++) + { + header.Cell(co).Value = "Column" + co.ToString(); + } + var rangeTable = wsTable.RangeUsed(); + var table = rangeTable.CopyTo(wsTable.Column(wsTable.LastColumnUsed().ColumnNumber() + 3)).CreateTable(); + + table.Sort("Column2, Column3 Desc, Column1 ASC"); + + wsTable.Row(1).InsertRowsAbove(2); + wsTable.Cell(1, 1) + .SetValue(".Sort(\"Column2, Column3 Desc, Column1 ASC\") = Sort table Top to Bottom, Col 2 Asc, Col 3 Desc, Col 1 Asc, Ignore Blanks, Ignore Case") + .Style.Font.SetBold(); + #endregion + + #region Sort a simple range left to right + var wsLeftToRight = wb.Worksheets.Add("Sort Left to Right"); + AddTestTable(wsLeftToRight); + wsLeftToRight.RangeUsed().Transpose(XLTransposeOptions.MoveCells); + var rangeLeftToRight = wsLeftToRight.RangeUsed(); + var copyLeftToRight = rangeLeftToRight.CopyTo(wsLeftToRight.Row(wsLeftToRight.LastRowUsed().RowNumber() + 3)); + + copyLeftToRight.SortLeftToRight(); + + wsLeftToRight.Row(1).InsertRowsAbove(2); + wsLeftToRight.Cell(1, 1) + .SetValue(".SortLeftToRight() = Sort Range Left to Right, Ascendingly, Ignore Blanks, Ignore Case") + .Style.Font.SetBold(); + #endregion + + #region Sort a range + var wsComplex2 = wb.Worksheets.Add("Complex 2"); + AddTestTable(wsComplex2); + var rangeComplex2 = wsComplex2.RangeUsed(); + var copyComplex2 = rangeComplex2.CopyTo(wsComplex2.Column(wsComplex2.LastColumnUsed().ColumnNumber() + 3)); + + copyComplex2.SortColumns.Add(1, XLSortOrder.Ascending, false, true); + copyComplex2.SortColumns.Add(3, XLSortOrder.Descending); + copyComplex2.Sort(); + + wsComplex2.Row(1).InsertRowsAbove(4); + wsComplex2.Cell(1, 1) + .SetValue(".SortColumns.Add(1, XLSortOrder.Ascending, false, true) = Sort Col 1 Asc, Match Blanks, Match Case").Style.Font.SetBold(); + wsComplex2.Cell(2, 1) + .SetValue(".SortColumns.Add(3, XLSortOrder.Descending) = Sort Col 3 Desc, Ignore Blanks, Ignore Case").Style.Font.SetBold(); + wsComplex2.Cell(3, 1) + .SetValue(".Sort() = Sort range using the parameters defined in SortColumns").Style.Font.SetBold(); + #endregion + + #region Sort a range + var wsComplex1 = wb.Worksheets.Add("Complex 1"); + AddTestTable(wsComplex1); + var rangeComplex1 = wsComplex1.RangeUsed(); + var copyComplex1 = rangeComplex1.CopyTo(wsComplex1.Column(wsComplex1.LastColumnUsed().ColumnNumber() + 3)); + + copyComplex1.Sort("2, 1 DESC", XLSortOrder.Ascending, true); + + wsComplex1.Row(1).InsertRowsAbove(2); + wsComplex1.Cell(1, 1) + .SetValue(".Sort(\"2, 1 DESC\", XLSortOrder.Ascending, true) = Sort Range Top to Bottom, Col 2 Asc, Col 1 Desc, Ignore Blanks, Match Case").Style.Font.SetBold(); + #endregion + + #region Sort a simple column + var wsSimpleColumn = wb.Worksheets.Add("Simple Column"); + AddTestColumn(wsSimpleColumn); + var rangeSimpleColumn = wsSimpleColumn.RangeUsed(); + var copySimpleColumn = rangeSimpleColumn.CopyTo(wsSimpleColumn.Column(wsSimpleColumn.LastColumnUsed().ColumnNumber() + 3)); + + copySimpleColumn.FirstColumn().Sort(XLSortOrder.Descending, true); + + wsSimpleColumn.Row(1).InsertRowsAbove(2); + wsSimpleColumn.Cell(1, 1) + .SetValue(".Sort(XLSortOrder.Descending, true) = Sort Range Top to Bottom, Descendingly, Ignore Blanks, Match Case").Style.Font.SetBold(); + #endregion + + #region Sort a simple range + var wsSimple = wb.Worksheets.Add("Simple"); + AddTestTable(wsSimple); + var rangeSimple = wsSimple.RangeUsed(); + var copySimple = rangeSimple.CopyTo(wsSimple.Column(wsSimple.LastColumnUsed().ColumnNumber() + 3)); + + copySimple.Sort(); + + wsSimple.Row(1).InsertRowsAbove(2); + wsSimple.Cell(1, 1).SetValue(".Sort() = Sort Range Top to Bottom, Ascendingly, Ignore Blanks, Ignore Case").Style.Font.SetBold(); + #endregion + + wb.SaveAs(filePath); + } + + private void AddTestColumnMixed(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(new DateTime(2011, 1, 30)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(1.15).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(new TimeSpan(1, 1, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(9).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(new TimeSpan(9, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(new DateTime(2011, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + private void AddTestColumnNumbers(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(1.30).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(1.15).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(1230).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(9).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(4.30).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(4.15).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + private void AddTestColumnTimeSpans(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(new TimeSpan(0, 12, 35, 21)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(new TimeSpan(45, 1, 15)).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(new TimeSpan(1, 1, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(new TimeSpan(0, 12, 15)).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(new TimeSpan(1, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(new TimeSpan(1, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + private void AddTestColumnDates(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(new DateTime(2011, 1, 30)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(new DateTime(2011, 1, 15)).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(new DateTime(2011, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(new DateTime(2011, 12, 15)).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(new DateTime(2011, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(new DateTime(2011, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + private void AddTestColumn(IXLWorksheet ws) + { + ws.Cell("A1").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue("b").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue("c").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + private void AddTestTable(IXLWorksheet ws) + { + ws.Cell("A1").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + + ws.Cell("B1").SetValue("").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("B2").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("B3").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("B4").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("B5").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("B6").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("B7").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("B8").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + + ws.Cell("C1").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("C2").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("C3").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("C4").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("C5").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("C6").SetValue("b").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("C7").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("C8").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Ranges/Sorting.cs b/ClosedXML_Examples/Ranges/Sorting.cs new file mode 100644 index 0000000..b61c19c --- /dev/null +++ b/ClosedXML_Examples/Ranges/Sorting.cs @@ -0,0 +1,257 @@ +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples.Misc +{ + public class Sorting : IXLExample + { + public void Create(String filePath) + { + using (var wb = new XLWorkbook()) + { + + #region Sort Table + + var wsTable = wb.Worksheets.Add("Table"); + AddTestTable(wsTable); + + wsTable.Row(1).InsertRowsAbove(1); + Int32 lastCo = wsTable.LastColumnUsed().ColumnNumber(); + for (Int32 co = 1; co <= lastCo; co++) + wsTable.Cell(1, co).Value = "Column" + co.ToString(); + + var table = wsTable.RangeUsed().AsTable(); + table.Sort("Column2 Desc, 1, 3 Asc"); + + // Sort table another way + wsTable = wb.Worksheets.Add("Table2"); + AddTestTable(wsTable); + + wsTable.Row(1).InsertRowsAbove(1); + lastCo = wsTable.LastColumnUsed().ColumnNumber(); + for (Int32 co = 1; co <= lastCo; co++) + wsTable.Cell(1, co).Value = "Column" + co.ToString(); + + table = wsTable.RangeUsed().AsTable(); + table.Sort("Column2", XLSortOrder.Descending, false, true); + + + #endregion Sort Table + + #region Sort Rows + + var wsRows = wb.Worksheets.Add("Rows"); + AddTestTable(wsRows); + wsRows.Row(1).Sort(); + wsRows.RangeUsed().Row(2).Sort(); + wsRows.Rows(3, wsRows.LastRowUsed().RowNumber()).Delete(); + + #endregion Sort Rows + + #region Sort Columns + + var wsColumns = wb.Worksheets.Add("Columns"); + AddTestTable(wsColumns); + wsColumns.LastColumnUsed().Delete(); + wsColumns.Column(1).Sort(); + wsColumns.RangeUsed().Column(2).Sort(); + + #endregion Sort Columns + + #region Sort Mixed + + var wsMixed = wb.Worksheets.Add("Mixed"); + AddTestColumnMixed(wsMixed); + wsMixed.Sort(); + + #endregion Sort Mixed + + #region Sort Numbers + + var wsNumbers = wb.Worksheets.Add("Numbers"); + AddTestColumnNumbers(wsNumbers); + wsNumbers.Sort(); + + #endregion Sort Numbers + + #region Sort TimeSpans + + var wsTimeSpans = wb.Worksheets.Add("TimeSpans"); + AddTestColumnTimeSpans(wsTimeSpans); + wsTimeSpans.Sort(); + + #endregion Sort TimeSpans + + #region Sort Dates + + var wsDates = wb.Worksheets.Add("Dates"); + AddTestColumnDates(wsDates); + wsDates.Sort(); + + #endregion Sort Dates + + #region Do Not Ignore Blanks + + var wsIncludeBlanks = wb.Worksheets.Add("Include Blanks"); + AddTestTable(wsIncludeBlanks); + var rangeIncludeBlanks = wsIncludeBlanks; + rangeIncludeBlanks.SortColumns.Add(1, XLSortOrder.Ascending, false, true); + rangeIncludeBlanks.SortColumns.Add(2, XLSortOrder.Descending, false, true); + rangeIncludeBlanks.Sort(); + + var wsIncludeBlanksColumn = wb.Worksheets.Add("Include Blanks Column"); + AddTestColumn(wsIncludeBlanksColumn); + var rangeIncludeBlanksColumn = wsIncludeBlanksColumn; + rangeIncludeBlanksColumn.SortColumns.Add(1, XLSortOrder.Ascending, false, true); + rangeIncludeBlanksColumn.Sort(); + + var wsIncludeBlanksColumnDesc = wb.Worksheets.Add("Include Blanks Column Desc"); + AddTestColumn(wsIncludeBlanksColumnDesc); + var rangeIncludeBlanksColumnDesc = wsIncludeBlanksColumnDesc; + rangeIncludeBlanksColumnDesc.SortColumns.Add(1, XLSortOrder.Descending, false, true); + rangeIncludeBlanksColumnDesc.Sort(); + + #endregion Do Not Ignore Blanks + + #region Case Sensitive + + var wsCaseSensitive = wb.Worksheets.Add("Case Sensitive"); + AddTestTable(wsCaseSensitive); + var rangeCaseSensitive = wsCaseSensitive; + rangeCaseSensitive.SortColumns.Add(1, XLSortOrder.Ascending, true, true); + rangeCaseSensitive.SortColumns.Add(2, XLSortOrder.Descending, true, true); + rangeCaseSensitive.Sort(); + + var wsCaseSensitiveColumn = wb.Worksheets.Add("Case Sensitive Column"); + AddTestColumn(wsCaseSensitiveColumn); + var rangeCaseSensitiveColumn = wsCaseSensitiveColumn; + rangeCaseSensitiveColumn.SortColumns.Add(1, XLSortOrder.Ascending, true, true); + rangeCaseSensitiveColumn.Sort(); + + var wsCaseSensitiveColumnDesc = wb.Worksheets.Add("Case Sensitive Column Desc"); + AddTestColumn(wsCaseSensitiveColumnDesc); + var rangeCaseSensitiveColumnDesc = wsCaseSensitiveColumnDesc; + rangeCaseSensitiveColumnDesc.SortColumns.Add(1, XLSortOrder.Descending, true, true); + rangeCaseSensitiveColumnDesc.Sort(); + + #endregion Case Sensitive + + #region Simple Sorts + + var wsSimple = wb.Worksheets.Add("Simple"); + AddTestTable(wsSimple); + wsSimple.Sort(); + + var wsSimpleDesc = wb.Worksheets.Add("Simple Desc"); + AddTestTable(wsSimpleDesc); + wsSimpleDesc.Sort("", XLSortOrder.Descending); + + var wsSimpleColumns = wb.Worksheets.Add("Simple Columns"); + AddTestTable(wsSimpleColumns); + wsSimpleColumns.Sort("2, A DESC, 3"); + + var wsSimpleColumn = wb.Worksheets.Add("Simple Column"); + AddTestColumn(wsSimpleColumn); + wsSimpleColumn.Sort(); + + var wsSimpleColumnDesc = wb.Worksheets.Add("Simple Column Desc"); + AddTestColumn(wsSimpleColumnDesc); + wsSimpleColumnDesc.Sort(1, XLSortOrder.Descending); + + #endregion Simple Sorts + + wb.SaveAs(filePath); + } + } + + private void AddTestColumnMixed(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(new DateTime(2011, 1, 30)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(1.15).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(new TimeSpan(1, 1, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(9).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(new TimeSpan(9, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(new DateTime(2011, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + + private void AddTestColumnNumbers(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(1.30).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(1.15).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(1230).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(9).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(4.30).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(4.15).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + + private void AddTestColumnTimeSpans(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(new TimeSpan(0, 12, 35, 21)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(new TimeSpan(45, 1, 15)).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(new TimeSpan(1, 1, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(new TimeSpan(0, 12, 15)).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(new TimeSpan(1, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(new TimeSpan(1, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + + private void AddTestColumnDates(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(new DateTime(2011, 1, 30)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(new DateTime(2011, 1, 15)).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(new DateTime(2011, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(new DateTime(2011, 12, 15)).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(new DateTime(2011, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(new DateTime(2011, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + + private void AddTestColumn(IXLWorksheet ws) + { + ws.Cell("A1").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue("b").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue("c").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + + private void AddTestTable(IXLWorksheet ws) + { + ws.Cell("A1").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + + ws.Cell("B1").SetValue("").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("B2").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("B3").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("B4").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("B5").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("B6").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("B7").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("B8").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + + ws.Cell("C1").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("C2").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("C3").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("C4").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("C5").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("C6").SetValue("b").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("C7").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("C8").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + } +} diff --git a/ClosedXML_Examples/Ranges/TransposeRanges.cs b/ClosedXML_Examples/Ranges/TransposeRanges.cs new file mode 100644 index 0000000..bc74b0c --- /dev/null +++ b/ClosedXML_Examples/Ranges/TransposeRanges.cs @@ -0,0 +1,37 @@ +using System.IO; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples +{ + public class TransposeRanges:IXLExample + { + public void Create(string filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + + var ws = workbook.Worksheet(1); + + var rngTable = ws.Range("B2:F6"); + + rngTable.Transpose(XLTransposeOptions.MoveCells); + + ws.Columns().AdjustToContents(); + + workbook.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + + } + } +} \ No newline at end of file diff --git a/ClosedXML_Examples/Ranges/TransposeRangesPlus.cs b/ClosedXML_Examples/Ranges/TransposeRangesPlus.cs new file mode 100644 index 0000000..f96ba38 --- /dev/null +++ b/ClosedXML_Examples/Ranges/TransposeRangesPlus.cs @@ -0,0 +1,46 @@ +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class TransposeRangesPlus : IXLExample + { + public void Create(string filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + + var ws = workbook.Worksheet(1); + + var rngTable = ws.Range("B2:F6"); + + rngTable.Row(rngTable.RowCount() - 1).Delete(XLShiftDeletedCells.ShiftCellsUp); + + // Place some markers + var cellNextRow = ws.Cell(rngTable.RangeAddress.LastAddress.RowNumber + 1, rngTable.RangeAddress.LastAddress.ColumnNumber); + cellNextRow.Value = "ColumnRight Row"; + var cellNextColumn = ws.Cell(rngTable.RangeAddress.LastAddress.RowNumber, rngTable.RangeAddress.LastAddress.ColumnNumber + 1); + cellNextColumn.Value = "ColumnRight Column"; + + rngTable.Transpose(XLTransposeOptions.MoveCells); + rngTable.Transpose(XLTransposeOptions.MoveCells); + rngTable.Transpose(XLTransposeOptions.ReplaceCells); + rngTable.Transpose(XLTransposeOptions.ReplaceCells); + + ws.Columns().AdjustToContents(); + + workbook.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + } +} \ No newline at end of file diff --git a/ClosedXML_Examples/Ranges/WalkingRanges.cs b/ClosedXML_Examples/Ranges/WalkingRanges.cs new file mode 100644 index 0000000..a6b5f75 --- /dev/null +++ b/ClosedXML_Examples/Ranges/WalkingRanges.cs @@ -0,0 +1,68 @@ +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Ranges +{ + public class WalkingRanges : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Walking Cells"); + + var cell = ws.Cell(5, 5).SetValue("(5,5)"); + + cell.CellAbove().SetValue("(4,5)").Style.Fill.SetBackgroundColor(XLColor.LightSalmon); + cell.CellAbove(2).SetValue("(3,5)").Style.Fill.SetBackgroundColor(XLColor.LightSalmon); + cell.CellBelow().SetValue("(6,5)").Style.Fill.SetBackgroundColor(XLColor.Salmon); + cell.CellBelow(2).SetValue("(7,5)").Style.Fill.SetBackgroundColor(XLColor.Salmon); + + cell.CellLeft().SetValue("(5,4)").Style.Fill.SetBackgroundColor(XLColor.LightBlue); + cell.CellLeft(2).SetValue("(5,3)").Style.Fill.SetBackgroundColor(XLColor.LightBlue); + cell.CellRight().SetValue("(5,6)").Style.Fill.SetBackgroundColor(XLColor.BlueBell); + cell.CellRight(2).SetValue("(5,7)").Style.Fill.SetBackgroundColor(XLColor.BlueBell); + + var wsWalkRows = wb.Worksheets.Add("Walking rows"); + + var row = wsWalkRows.Row(3); + row.RowAbove().Style.Fill.SetBackgroundColor(XLColor.Salmon); + row.RowAbove(2).Style.Fill.SetBackgroundColor(XLColor.LightSalmon); + row.RowBelow().Style.Fill.SetBackgroundColor(XLColor.Blue); + row.RowBelow(2).Style.Fill.SetBackgroundColor(XLColor.BlueBell); + + var rangeRow = wsWalkRows.Range("B8:D12").Row(3); + rangeRow.RowAbove().Style.Fill.SetBackgroundColor(XLColor.Salmon); + rangeRow.RowAbove(2).Style.Fill.SetBackgroundColor(XLColor.LightSalmon); + rangeRow.RowBelow().Style.Fill.SetBackgroundColor(XLColor.Blue); + rangeRow.RowBelow(2).Style.Fill.SetBackgroundColor(XLColor.BlueBell); + + var wsWalkColumns = wb.Worksheets.Add("Walking columns"); + + var column = wsWalkColumns.Column(3); + column.ColumnLeft().Style.Fill.SetBackgroundColor(XLColor.Salmon); + column.ColumnLeft(2).Style.Fill.SetBackgroundColor(XLColor.LightSalmon); + column.ColumnRight().Style.Fill.SetBackgroundColor(XLColor.Blue); + column.ColumnRight(2).Style.Fill.SetBackgroundColor(XLColor.BlueBell); + + var rangeColumn = wsWalkColumns.Range("H2:L4").Column(3); + rangeColumn.ColumnLeft().Style.Fill.SetBackgroundColor(XLColor.Salmon); + rangeColumn.ColumnLeft(2).Style.Fill.SetBackgroundColor(XLColor.LightSalmon); + rangeColumn.ColumnRight().Style.Fill.SetBackgroundColor(XLColor.Blue); + rangeColumn.ColumnRight(2).Style.Fill.SetBackgroundColor(XLColor.BlueBell); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Resources/ImageHandling.jpg b/ClosedXML_Examples/Resources/ImageHandling.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6ddf89a5612b2063aa096bc7966ca9f4602aa682 GIT binary patch literal 7590 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

HJg|X&f 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 + g.SetType(XLSparklineType.Column)); + + ws2.Cell("A2").Value = "Column, Colorful 1, All markers, SameForAll scale"; + ws2.Cell("A5").Value = "Column, Colorful 2, First+Last+High+Low, Automatic scale"; + ws2.Cell("A8").Value = "Column, Colorful 3, Markers+Negative, Custom scale"; + ws2.Cell("A11").Value = "Column, Colorful 1, Date range"; + ws2.Cell("A14").Value = "Column, Colorful 4, Line weight=2, Right to left"; + ws2.Cell("A17").Value = "Column, Colorful 3, Different ranges"; + + + var ws3 = ws1.CopyTo("Stacked"); + ws3.SparklineGroups.ForEach(g => + g.SetType(XLSparklineType.Stacked)); + + ws3.Cell("A2").Value = "Stacked, Colorful 1, All markers, SameForAll scale"; + ws3.Cell("A5").Value = "Stacked, Colorful 2, First+Last+High+Low, Automatic scale"; + ws3.Cell("A8").Value = "Stacked, Colorful 3, Markers+Negative, Custom scale"; + ws3.Cell("A11").Value = "Stacked, Colorful 1, Date range"; + ws3.Cell("A14").Value = "Stacked, Colorful 4, Line weight=2, Right to left"; + ws3.Cell("A17").Value = "Stacked, Colorful 3, Different ranges"; + + workbook.SaveAs(filePath); + } + + private void FillSampleData(IXLWorksheet ws) + { + ws.Column(1).Style.Alignment.SetWrapText(true); + ws.Column(1).Width = 30; + ws.Column(2).Width = 30; + + ws.Range("C1:P1").Cells() + .ForEach(c => c.Value = new DateTime(2016, 1, 1).AddDays(c.Address.ColumnNumber * 7)); + + ws.Range("C2:P19").Cells() + .ForEach(c => c.Value = Math.Round(c.Address.RowNumber * Math.Sin(c.Address.ColumnNumber) * 10, 0)); + } + } +} diff --git a/ClosedXML_Examples/StyleExamples.cs b/ClosedXML_Examples/StyleExamples.cs new file mode 100644 index 0000000..869c9ab --- /dev/null +++ b/ClosedXML_Examples/StyleExamples.cs @@ -0,0 +1,74 @@ +using ClosedXML_Examples.Styles; +using System.IO; + +namespace ClosedXML_Examples +{ + public class StyleExamples + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Constructors + + // Public + public StyleExamples() + { + + } + + + // Private + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create() + { + var path = Program.BaseCreatedDirectory; + new StyleFont().Create(Path.Combine(path, "styleFont.xlsx")); + new StyleFill().Create(Path.Combine(path, "styleFill.xlsx")); + new StyleBorder().Create(Path.Combine(path, "styleBorder.xlsx")); + new StyleAlignment().Create(Path.Combine(path, "styleAlignment.xlsx")); + new StyleNumberFormat().Create(Path.Combine(path, "styleNumberFormat.xlsx")); + new StyleIncludeQuotePrefix().Create(Path.Combine(path, "styleIncludeQuotePrefix.xlsx")); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Styles/DefaultStyles.cs b/ClosedXML_Examples/Styles/DefaultStyles.cs new file mode 100644 index 0000000..f940844 --- /dev/null +++ b/ClosedXML_Examples/Styles/DefaultStyles.cs @@ -0,0 +1,29 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Styles +{ + public class DefaultStyles : IXLExample + { + public void Create(String filePath) + { + // Create our workbook + var workbook = new XLWorkbook(); + + // This worksheet will have the default style, row height, column width, and page setup + var ws1 = workbook.Worksheets.Add("Default Style"); + + // Change the default row height for all new worksheets in this workbook + workbook.RowHeight = 30; + + var ws2 = workbook.Worksheets.Add("Tall Rows"); + + // Create a worksheet and change the default row height + var ws3 = workbook.Worksheets.Add("Short Rows"); + ws3.RowHeight = 7.5; + + workbook.SaveAs(filePath); + } + } +} \ No newline at end of file diff --git a/ClosedXML_Examples/Styles/PurpleWorksheet.cs b/ClosedXML_Examples/Styles/PurpleWorksheet.cs new file mode 100644 index 0000000..a42856d --- /dev/null +++ b/ClosedXML_Examples/Styles/PurpleWorksheet.cs @@ -0,0 +1,19 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Styles +{ + public class PurpleWorksheet : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Purple Worksheet"); + + ws.Style.Fill.BackgroundColor = XLColor.Purple; + + workbook.SaveAs(filePath); + } + } +} \ No newline at end of file diff --git a/ClosedXML_Examples/Styles/StyleAlignment.cs b/ClosedXML_Examples/Styles/StyleAlignment.cs new file mode 100644 index 0000000..ca6fcb9 --- /dev/null +++ b/ClosedXML_Examples/Styles/StyleAlignment.cs @@ -0,0 +1,105 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Styles +{ + public class StyleAlignment : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Constructors + + // Public + public StyleAlignment() + { + + } + + + // Private + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Style Alignment"); + + var co = 2; + var ro = 1; + + ws.Cell(++ro, co).Value = "Horizontal = Right"; + ws.Cell(ro, co).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right; + + ws.Cell(++ro, co).Value = "Indent = 2"; + ws.Cell(ro, co).Style.Alignment.Indent = 2; + + ws.Cell(++ro, co).Value = "JustifyLastLine = true"; + ws.Cell(ro, co).Style.Alignment.JustifyLastLine = true; + + ws.Cell(++ro, co).Value = "ReadingOrder = ContextDependent"; + ws.Cell(ro, co).Style.Alignment.ReadingOrder = XLAlignmentReadingOrderValues.ContextDependent; + + ws.Cell(++ro, co).Value = "RelativeIndent = 2"; + ws.Cell(ro, co).Style.Alignment.RelativeIndent = 2; + + ws.Cell(++ro, co).Value = "ShrinkToFit = true"; + ws.Cell(ro, co).Style.Alignment.ShrinkToFit = true; + + ws.Cell(++ro, co).Value = "TextRotation = 45"; + ws.Cell(ro, co).Style.Alignment.TextRotation = 45; + + ws.Cell(++ro, co).Value = "TopToBottom = true"; + ws.Cell(ro, co).Style.Alignment.TopToBottom = true; + + ws.Cell(++ro, co).Value = "Vertical = Center"; + ws.Cell(ro, co).Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; + + ws.Cell(++ro, co).Value = "WrapText = true"; + ws.Cell(ro, co).Style.Alignment.WrapText = true; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Styles/StyleBorder.cs b/ClosedXML_Examples/Styles/StyleBorder.cs new file mode 100644 index 0000000..bffc64d --- /dev/null +++ b/ClosedXML_Examples/Styles/StyleBorder.cs @@ -0,0 +1,52 @@ +using System; + +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Styles +{ + public class StyleBorder : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Style Border"); + + var co = 2; + var ro = 1; + + ws.Cell(++ro, co).Value = "BottomBorder = Thick; BottomBorderColor = Red"; + ws.Cell(ro, co).Style.Border.BottomBorder = XLBorderStyleValues.Thick; + ws.Cell(ro, co).Style.Border.BottomBorderColor = XLColor.Red; + + ws.Cell(++ro, co).Value = "LeftBorder = Thick; LeftBorderColor = Blue"; + ws.Cell(ro, co).Style.Border.LeftBorder = XLBorderStyleValues.Thick; + ws.Cell(ro, co).Style.Border.LeftBorderColor = XLColor.Blue; + + ws.Cell(++ro, co).Value = "TopBorder = Thick; TopBorderColor = Yellow"; + ws.Cell(ro, co).Style.Border.TopBorder = XLBorderStyleValues.Thick; + ws.Cell(ro, co).Style.Border.TopBorderColor = XLColor.Yellow; + + ws.Cell(++ro, co).Value = "RightBorder = Thick; RightBorderColor = Black"; + ws.Cell(ro, co).Style.Border.RightBorder = XLBorderStyleValues.Thick; + ws.Cell(ro, co).Style.Border.RightBorderColor = XLColor.Black; + + ws.Cell(++ro, co).Value = "DiagonalBorder = Thin; DiagonalBorderColor = Red; DiagonalUp = true"; + ws.Cell(ro, co).Style.Border.DiagonalBorder = XLBorderStyleValues.Thin; + ws.Cell(ro, co).Style.Border.DiagonalBorderColor = XLColor.Red; + ws.Cell(ro, co).Style.Border.DiagonalUp = true; + + ws.Cell(++ro, co).Value = "DiagonalBorder = Thin; DiagonalBorderColor = Red; DiagonalDown = true"; + ws.Cell(ro, co).Style.Border.DiagonalBorder = XLBorderStyleValues.Thin; + ws.Cell(ro, co).Style.Border.DiagonalBorderColor = XLColor.Red; + ws.Cell(ro, co).Style.Border.DiagonalDown = true; + + ws.Cell(++ro, co).Value = "DiagonalBorder = Thin; DiagonalBorderColor = Red; DiagonalUp = true; DiagonalDown = true"; + ws.Cell(ro, co).Style.Border.DiagonalBorder = XLBorderStyleValues.Thin; + ws.Cell(ro, co).Style.Border.DiagonalBorderColor = XLColor.Red; + ws.Cell(ro, co).Style.Border.DiagonalUp = true; + ws.Cell(ro, co).Style.Border.DiagonalDown = true; + + workbook.SaveAs(filePath); + } + } +} \ No newline at end of file diff --git a/ClosedXML_Examples/Styles/StyleFill.cs b/ClosedXML_Examples/Styles/StyleFill.cs new file mode 100644 index 0000000..8a85791 --- /dev/null +++ b/ClosedXML_Examples/Styles/StyleFill.cs @@ -0,0 +1,27 @@ +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples.Styles +{ + public class StyleFill : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Style Fill"); + + var co = 2; + var ro = 1; + + ws.Cell(++ro, co + 1).Value = "BackgroundColor = Red"; + ws.Cell(ro, co).Style.Fill.BackgroundColor = XLColor.Red; + + ws.Cell(++ro, co + 1).Value = "PatternType = DarkTrellis; PatternColor = Orange; BackgroundColor = Blue"; + ws.Cell(ro, co).Style.Fill.PatternType = XLFillPatternValues.DarkTrellis; + ws.Cell(ro, co).Style.Fill.PatternColor = XLColor.Orange; + ws.Cell(ro, co).Style.Fill.BackgroundColor = XLColor.Blue; + + workbook.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Styles/StyleFont.cs b/ClosedXML_Examples/Styles/StyleFont.cs new file mode 100644 index 0000000..6fed30f --- /dev/null +++ b/ClosedXML_Examples/Styles/StyleFont.cs @@ -0,0 +1,53 @@ +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples.Styles +{ + public class StyleFont : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Style Font"); + + var co = 2; + var ro = 1; + + ws.Cell(++ro, co).Value = "Bold"; + ws.Cell(ro, co).Style.Font.Bold = true; + + ws.Cell(++ro, co).Value = "FontColor - Red"; + ws.Cell(ro, co).Style.Font.FontColor = XLColor.Red; + + ws.Cell(++ro, co).Value = "FontFamilyNumbering - Script"; + ws.Cell(ro, co).Style.Font.FontFamilyNumbering = XLFontFamilyNumberingValues.Script; + + ws.Cell(++ro, co).Value = "FontCharSet - العربية التنضيد"; + ws.Cell(ro, co).Style + .Font.SetFontName("Arabic Typesetting") + .Font.SetFontCharSet(XLFontCharSet.Arabic); + + ws.Cell(++ro, co).Value = "FontName - Stencil"; + ws.Cell(ro, co).Style.Font.FontName = "Stencil"; + + ws.Cell(++ro, co).Value = "FontSize - 15"; + ws.Cell(ro, co).Style.Font.FontSize = 15; + + ws.Cell(++ro, co).Value = "Italic - true"; + ws.Cell(ro, co).Style.Font.Italic = true; + + ws.Cell(++ro, co).Value = "Strikethrough - true"; + ws.Cell(ro, co).Style.Font.Strikethrough = true; + + ws.Cell(++ro, co).Value = "Underline - Double"; + ws.Cell(ro, co).Style.Font.Underline = XLFontUnderlineValues.Double; + + ws.Cell(++ro, co).Value = "VerticalAlignment - Superscript"; + ws.Cell(ro, co).Style.Font.VerticalAlignment = XLFontVerticalTextAlignmentValues.Superscript; + + ws.Column(co).AdjustToContents(); + + workbook.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Styles/StyleIncludeQuotePrefix.cs b/ClosedXML_Examples/Styles/StyleIncludeQuotePrefix.cs new file mode 100644 index 0000000..47129c6 --- /dev/null +++ b/ClosedXML_Examples/Styles/StyleIncludeQuotePrefix.cs @@ -0,0 +1,39 @@ +using ClosedXML.Excel; +using System; +using System.Linq; + +namespace ClosedXML_Examples.Styles +{ + public class StyleIncludeQuotePrefix : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Style IncludeQuotePrefix"); + + var data = Enumerable.Range(1, 20) + .Select(i => + new + { + IntegerIndex = i, + StringIndex = i.ToString(), + PaddedString1000 = (i * 1000).ToString().PadLeft(8, '0'), + PrependedString1000 = "Str" + (i * 1000).ToString().PadLeft(8, '0') + }); + + ws.FirstCell().InsertData(data); + + // Columns B to D will be of type text + // but column B will not have the leading quotation mark + ws.Column("B").Style.IncludeQuotePrefix = false; + + // Columns C and D will have the leading quotation mark + ws.Column("C").Style.IncludeQuotePrefix = true; + ws.Column("D").Style.SetIncludeQuotePrefix(); + + ws.Columns().AdjustToContents(); + + workbook.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Styles/StyleNumberFormat.cs b/ClosedXML_Examples/Styles/StyleNumberFormat.cs new file mode 100644 index 0000000..0f6e7e6 --- /dev/null +++ b/ClosedXML_Examples/Styles/StyleNumberFormat.cs @@ -0,0 +1,85 @@ +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Styles +{ + public class StyleNumberFormat : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Constructors + + // Public + public StyleNumberFormat() + { + + } + + + // Private + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Style NumberFormat"); + + var co = 2; + var ro = 1; + + ws.Cell(++ro, co).Value = "123456.789"; + ws.Cell(ro, co).Style.NumberFormat.Format = "$ #,##0.00"; + + ws.Cell(++ro, co).Value = "12.345"; + ws.Cell(ro, co).Style.NumberFormat.Format = "0000"; + + ws.Cell(++ro, co).Value = "12.345"; + ws.Cell(ro, co).Style.NumberFormat.NumberFormatId = 3; + + ws.Column(co).AdjustToContents(); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Styles/StyleRowsColumns.cs b/ClosedXML_Examples/Styles/StyleRowsColumns.cs new file mode 100644 index 0000000..a12a0b3 --- /dev/null +++ b/ClosedXML_Examples/Styles/StyleRowsColumns.cs @@ -0,0 +1,34 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Styles +{ + public class StyleRowsColumns : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Style Rows and Columns"); + + //Set the entire worksheet's cells to be bold and with a light cyan background + ws.Style.Font.Bold = true; + ws.Style.Fill.BackgroundColor = XLColor.LightCyan; + + // Set the width of all columns in the worksheet + ws.Columns().Width = 5; + + // Set the height of all rows in the worksheet + ws.Rows().Height = 20; + + // Let's play with the rows and columns + ws.Rows(2, 3).Style.Fill.BackgroundColor = XLColor.Blue; + ws.Columns(3, 4).Style.Fill.BackgroundColor = XLColor.Orange; + ws.Rows(5, 5).Style.Fill.BackgroundColor = XLColor.Pink; + ws.Row(6).Style.Fill.BackgroundColor = XLColor.Brown; + ws.Column("E").Style.Fill.BackgroundColor = XLColor.Gray; + + workbook.SaveAs(filePath); + } + } +} \ No newline at end of file diff --git a/ClosedXML_Examples/Styles/StyleWorksheet.cs b/ClosedXML_Examples/Styles/StyleWorksheet.cs new file mode 100644 index 0000000..d17e4e3 --- /dev/null +++ b/ClosedXML_Examples/Styles/StyleWorksheet.cs @@ -0,0 +1,42 @@ +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Styles +{ + public class StyleWorksheet : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Style Worksheet"); + + ws.Style.Font.Bold = true; + ws.Style.Font.FontColor = XLColor.Red; + ws.Style.Fill.BackgroundColor = XLColor.Cyan; + + // The following cells will be bold and red + // because we've specified those attributes to the entire worksheet + ws.Cell(1, 1).Value = "Test"; + ws.Cell(1, 2).Value = "Case"; + + // Here we'll change the style of a single cell + ws.Cell(2, 1).Value = "Default"; + ws.Cell(2, 1).Style = XLWorkbook.DefaultStyle; + + // Let's play with some rows + ws.Row(4).Style = XLWorkbook.DefaultStyle; + ws.Row(4).Height = 20; + ws.Rows(5, 6).Style = XLWorkbook.DefaultStyle; + ws.Rows(5, 6).Height = 20; + + // Let's play with some columns + ws.Column(4).Style = XLWorkbook.DefaultStyle; + ws.Column(4).Width = 5; + ws.Columns(5, 6).Style = XLWorkbook.DefaultStyle; + ws.Columns(5, 6).Width = 5; + + workbook.SaveAs(filePath); + } + } +} \ No newline at end of file diff --git a/ClosedXML_Examples/Styles/UsingColors.cs b/ClosedXML_Examples/Styles/UsingColors.cs new file mode 100644 index 0000000..54fea8f --- /dev/null +++ b/ClosedXML_Examples/Styles/UsingColors.cs @@ -0,0 +1,84 @@ +using System; +using System.Drawing; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Styles +{ + public class UsingColors : IXLExample + { + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Using Colors"); + + Int32 ro = 0; + + // From Known color + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.Red; + ws.Cell(ro, 2).Value = "XLColor.Red"; + + // From Color not so known + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.Byzantine; + ws.Cell(ro, 2).Value = "XLColor.Byzantine"; + + ro++; + + // FromArgb(Int32 argb) using Hex notation + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromArgb(0xFF00FF); + ws.Cell(ro, 2).Value = "XLColor.FromArgb(0xFF00FF)"; + + // FromArgb(Int32 argb) using an integer (you need to convert the hex value to an int) + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromArgb(16711935); + ws.Cell(ro, 2).Value = "XLColor.FromArgb(16711935)"; + + // FromArgb(Int32 r, Int32 g, Int32 b) + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromArgb(255, 0, 255); + ws.Cell(ro, 2).Value = "XLColor.FromArgb(255, 0, 255)"; + + // FromArgb(Int32 a, Int32 r, Int32 g, Int32 b) + // Note: Excel ignores the alpha value + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromArgb(0, 255, 0, 255); + ws.Cell(ro, 2).Value = "XLColor.FromArgb(0, 255, 0, 255)"; + + ro++; + + // FromColor(Color color) + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromColor(Color.Red); + ws.Cell(ro, 2).Value = "XLColor.FromColor(Color.Red)"; + + ro++; + + // FromHtml(String htmlColor) + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromHtml("#FF996515"); + ws.Cell(ro, 2).Value = "XLColor.FromHtml(\"#FF996515\")"; + + ro++; + + // FromIndex(Int32 indexedColor) + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromIndex(25); + ws.Cell(ro, 2).Value = "XLColor.FromIndex(25)"; + + ro++; + + // FromName(String colorName) + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromName("PowderBlue"); + ws.Cell(ro, 2).Value = "XLColor.FromName(\"PowderBlue\")"; + + ro++; + + // From Theme color + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromTheme(XLThemeColor.Accent1); + ws.Cell(ro, 2).Value = "XLColor.FromTheme(XLThemeColor.Accent1)"; + + // From Theme color with tint + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromTheme(XLThemeColor.Accent1, 0.5); + ws.Cell(ro, 2).Value = "XLColor.FromTheme(XLThemeColor.Accent1, 0.5)"; + + + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Styles/UsingPhonetics.cs b/ClosedXML_Examples/Styles/UsingPhonetics.cs new file mode 100644 index 0000000..f6c6483 --- /dev/null +++ b/ClosedXML_Examples/Styles/UsingPhonetics.cs @@ -0,0 +1,41 @@ +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Styles +{ + public class UsingPhonetics : IXLExample + { + + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Using Phonetics"); + + var cell = ws.Cell(1, 1); + + // Phonetics are implemented as part of the Rich Text functionality. For more information see [Using Rich Text] + // First we add the text. + cell.RichText.AddText("ã¿ã‚“ãªã•ã‚“ã¯ãŠå…ƒæ°—ã§ã™ã‹ã€‚").SetFontSize(16); + + // And then we add the phonetics + cell.RichText.Phonetics.SetFontSize(8); + cell.RichText.Phonetics.Add("ã’ã‚“", 7, 8); + cell.RichText.Phonetics.Add("ã", 8, 9); + + //TODO: I'm looking for someone who understands Japanese to confirm the validity of the above code. + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Styles/UsingRichText.cs b/ClosedXML_Examples/Styles/UsingRichText.cs new file mode 100644 index 0000000..7709a98 --- /dev/null +++ b/ClosedXML_Examples/Styles/UsingRichText.cs @@ -0,0 +1,121 @@ +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Styles +{ + public class UsingRichText : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Constructors + + // Public + + + + // Private + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Rich Text"); + + // Let's start with a plain text and then decorate it... + var cell1 = ws.Cell(1, 1).SetValue("The show must go on..."); + + // We want everything in blue except the word show + // (which we want in red and with Courier Font) + cell1.Style.Font.FontColor = XLColor.Blue; // Set the color for the entire cell + cell1.RichText.Substring(4, 4) + .SetFontColor(XLColor.Red) + .SetFontName("Courier"); // Set the color and font for the word "show" + + // On the next example we'll start with an empty cell and add the rich text + var cell = ws.Cell(3, 1); + + // Add the text parts + cell.RichText.AddText("Hello").SetFontColor(XLColor.Red); + cell.RichText.AddText(" BIG ").SetFontColor(XLColor.Blue).SetBold(); + cell.RichText.AddText("World").SetFontColor(XLColor.Red); + + // Here we're showing that even though we added three pieces of text + // you can treat then like a single one. + cell.RichText.Substring(4, 7).SetUnderline(); + + // Right now cell.RichText has the following 5 strings: + // + // "Hell" -> Red + // "o" -> Red, Underlined + // " BIG " -> Blue, Underlined, Bold + // "W" -> Red, Underlined + // "orld" -> Red + + // Of course you can loop through each piece of text and check its properties + foreach (var richText in cell.RichText) + { + if(richText.Bold) + ws.Cell(3, 2).Value = String.Format("\"{0}\" is Bold.", richText.Text); + } + + + // Now we'll build a cell with rich text, and some other styles + cell = ws.Cell(5, 1); + + // Add the text parts + cell.RichText.AddText("Some").SetFontColor(XLColor.Green); + cell.RichText.AddText(" rich text ").SetFontColor(XLColor.Blue).SetBold(); + cell.RichText.AddText("with a gray background").SetItalic(); + + cell.Style.Fill.SetBackgroundColor(XLColor.Gray); + + ws.Cell(5, 2).Value = cell.RichText; // Should copy only rich text, but not background + + + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Tables/InsertingTables.cs b/ClosedXML_Examples/Tables/InsertingTables.cs new file mode 100644 index 0000000..176eed1 --- /dev/null +++ b/ClosedXML_Examples/Tables/InsertingTables.cs @@ -0,0 +1,111 @@ +using ClosedXML.Attributes; +using ClosedXML.Excel; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; + +namespace ClosedXML_Examples.Tables +{ + public class InsertingTables : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Inserting Tables"); + + // From a list of strings + var listOfStrings = new List(); + listOfStrings.Add("House"); + listOfStrings.Add("Car"); + ws.Cell(1, 1).Value = "From Strings"; + ws.Cell(1, 1).AsRange().AddToNamed("Titles"); + ws.Cell(2, 1).InsertTable(listOfStrings); + + // From a list of arrays + var listOfArr = new List(); + listOfArr.Add(new Int32[] { 1, 2, 3 }); + listOfArr.Add(new Int32[] { 1 }); + listOfArr.Add(new Int32[] { 1, 2, 3, 4, 5, 6 }); + ws.Cell(1, 3).Value = "From Arrays"; + ws.Range(1, 3, 1, 8).Merge().AddToNamed("Titles"); + ws.Cell(2, 3).InsertTable(listOfArr); + + // From a DataTable + var dataTable = GetTable(); + ws.Cell(7, 1).Value = "From DataTable"; + ws.Range(7, 1, 7, 4).Merge().AddToNamed("Titles"); + ws.Cell(8, 1).InsertTable(dataTable); + + // From a query + var list = new List(); + list.Add(new Person() { Name = "John", Age = 30, House = "On Elm St." }); + list.Add(new Person() { Name = "Mary", Age = 15, House = "On Main St." }); + list.Add(new Person() { Name = "Luis", Age = 21, House = "On 23rd St." }); + list.Add(new Person() { Name = "Henry", Age = 45, House = "On 5th Ave." }); + + var people = from p in list + where p.Age >= 21 + select p; + + ws.Cell(7, 6).Value = "From Query"; + ws.Range(7, 6, 7, 9).Merge().AddToNamed("Titles"); + ws.Cell(8, 6).InsertTable(people); + + ws.Cell(15, 6).Value = "From List"; + ws.Range(15, 6, 15, 9).Merge().AddToNamed("Titles"); + ws.Cell(16, 6).InsertTable(people); + + // Prepare the style for the titles + var titlesStyle = wb.Style; + titlesStyle.Font.Bold = true; + titlesStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + titlesStyle.Fill.BackgroundColor = XLColor.Cyan; + + // Format all titles in one shot + wb.NamedRanges.NamedRange("Titles").Ranges.Style = titlesStyle; + + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + } + + private class Person + { + [XLColumn(Header = "House Street")] + public String House { get; set; } + + public String Name { get; set; } + public Int32 Age { get; set; } + + [XLColumn(Header = "Class Type")] + public static String ClassType { get { return nameof(Person); } } + } + + // Private + private DataTable GetTable() + { + DataTable table = new DataTable(); + table.Columns.Add("Dosage", typeof(int)); + table.Columns.Add("Drug", typeof(string)); + table.Columns.Add("Patient", typeof(string)); + table.Columns.Add("Date", typeof(DateTime)); + + table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); + table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); + table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); + table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4)); + table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5)); + return table; + } + + // Override + + #endregion Methods + } +} diff --git a/ClosedXML_Examples/Tables/ResizingTables.cs b/ClosedXML_Examples/Tables/ResizingTables.cs new file mode 100644 index 0000000..0ef7713 --- /dev/null +++ b/ClosedXML_Examples/Tables/ResizingTables.cs @@ -0,0 +1,48 @@ +using ClosedXML.Excel; +using MoreLinq; +using System; +using System.Linq; + +// TODO: Add example to Wiki + +namespace ClosedXML_Examples.Tables +{ + public class ResizingTables : IXLExample + { + public void Create(string filePath) + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.AddWorksheet("Sheet1"); + + var data1 = Enumerable.Range(1, 10) + .Select(i => + new + { + Index = i, + Character = Convert.ToChar(64 + i), + String = new String('a', i), + Integer = 64 + i + }); + + var table1 = ws1.Cell("B2").InsertTable(data1, true) + .SetShowHeaderRow() + .SetShowTotalsRow(); + + table1.Fields.First().TotalsRowLabel = "Sum of Integer"; + table1.Fields.Last().TotalsRowFunction = XLTotalsRowFunction.Sum; + + var ws2 = ws1.CopyTo("Sheet2"); + var table2 = ws2.Tables.First(); + table2.Resize(table2.FirstCell(), table2.LastCell().CellLeft().CellAbove(3)); + + var ws3 = ws2.CopyTo("Sheet3"); + var table3 = ws3.Tables.First(); + table3.Resize(table3.FirstCell().CellLeft(), table3.LastCell().CellRight().CellBelow(1)); + + wb.Worksheets.ForEach(ws => ws.Columns().AdjustToContents()); + wb.SaveAs(filePath); + } + } + } +} diff --git a/ClosedXML_Examples/Tables/UsingTables.cs b/ClosedXML_Examples/Tables/UsingTables.cs new file mode 100644 index 0000000..3dd012d --- /dev/null +++ b/ClosedXML_Examples/Tables/UsingTables.cs @@ -0,0 +1,116 @@ +using ClosedXML.Excel; +using System; +using System.IO; + +namespace ClosedXML_Examples.Tables +{ + public class UsingTables : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + using (var wb = new XLWorkbook(tempFile)) + { + var ws = wb.Worksheet(1); + ws.Name = "Contacts Table"; + var firstCell = ws.FirstCellUsed(); + var lastCell = ws.LastCellUsed(); + var range = ws.Range(firstCell.Address, lastCell.CellRight().Address); + range.FirstRow().Delete(); // Deleting the "Contacts" header (we don't need it for our purposes) + + // We want to use a theme for table, not the hard coded format of the BasicTable + range.Clear(XLClearOptions.AllFormats); + // Put back the date and number formats + range.Column(4).Style.NumberFormat.NumberFormatId = 15; + range.Column(5).Style.NumberFormat.Format = "$ #,##0"; + + // Add a field + range.Column(6).FirstCell().SetValue("Age"); + var c = range.Column(6).FirstCell().CellBelow(); + c.Style.NumberFormat.SetFormat("0.00"); + c.FormulaA1 = "=(DATE(2017, 10, 3) - E3) / 365"; + + c.CopyTo(c.CellBelow()) + .CopyTo(c.CellBelow().CellBelow()); + + var table = range.CreateTable(); // You can also use range.AsTable() if you want to + // manipulate the range as a table but don't want + // to create the table in the worksheet. + + // Let's activate the Totals row and add the sum of Income + table.ShowTotalsRow = true; + table.Field("Income").TotalsRowFunction = XLTotalsRowFunction.Sum; + // Just for fun let's add the text "Sum Of Income" to the totals row + table.Field(0).TotalsRowLabel = "Sum Of Income"; + + table.Field("Age").TotalsRowFunction = XLTotalsRowFunction.Average; + + // Copy all the headers + Int32 columnWithHeaders = lastCell.Address.ColumnNumber + 3; + Int32 currentRow = table.RangeAddress.FirstAddress.RowNumber; + ws.Cell(currentRow, columnWithHeaders).Value = "Table Headers"; + foreach (var cell in table.HeadersRow().Cells()) + { + currentRow++; + ws.Cell(currentRow, columnWithHeaders).Value = cell.Value; + } + + // Format the headers as a table with a different style and no autofilters + var htFirstCell = ws.Cell(table.RangeAddress.FirstAddress.RowNumber, columnWithHeaders); + var htLastCell = ws.Cell(currentRow, columnWithHeaders); + var headersTable = ws.Range(htFirstCell, htLastCell).CreateTable("Headers"); + headersTable.Theme = XLTableTheme.TableStyleLight10; + headersTable.ShowAutoFilter = false; + + // Add a custom formula to the headersTable + headersTable.ShowTotalsRow = true; + headersTable.Field(0).TotalsRowFormulaA1 = "CONCATENATE(\"Count: \", CountA(Headers[Table Headers]))"; + + // Copy the names + Int32 columnWithNames = columnWithHeaders + 2; + currentRow = table.RangeAddress.FirstAddress.RowNumber; // reset the currentRow + ws.Cell(currentRow, columnWithNames).Value = "Names"; + foreach (var row in table.DataRange.Rows()) + { + currentRow++; + var fName = row.Field("FName").GetString(); // Notice how we're calling the cell by field name + var lName = row.Field("LName").GetString(); // Notice how we're calling the cell by field name + var name = String.Format("{0} {1}", fName, lName); + ws.Cell(currentRow, columnWithNames).Value = name; + } + + // Format the names as a table with a different style and no autofilters + var ntFirstCell = ws.Cell(table.RangeAddress.FirstAddress.RowNumber, columnWithNames); + var ntLastCell = ws.Cell(currentRow, columnWithNames); + var namesTable = ws.Range(ntFirstCell, ntLastCell).CreateTable(); + namesTable.Theme = XLTableTheme.TableStyleLight12; + namesTable.ShowAutoFilter = false; + + ws.Columns().AdjustToContents(); + ws.Columns("A,H,J").Width = 3; + + wb.SaveAs(filePath); + } + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + + // Private + + // Override + + #endregion Methods + } +} diff --git a/ClosedXML_Examples/app.config b/ClosedXML_Examples/app.config new file mode 100644 index 0000000..86fcc8b --- /dev/null +++ b/ClosedXML_Examples/app.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/ClosedXML_Sandbox/ClosedXML_Sandbox.csproj b/ClosedXML_Sandbox/ClosedXML_Sandbox.csproj new file mode 100644 index 0000000..c27e354 --- /dev/null +++ b/ClosedXML_Sandbox/ClosedXML_Sandbox.csproj @@ -0,0 +1,46 @@ + + + + Exe + netcoreapp2.0;net40;net46 + 8.0 + 0.95.4 + $(NoWarn);NU1605 + Debug;Release;Release.Signed + + + + $(DefineConstants);_NETSTANDARD_;_NETSTANDARD2_0_ + + + + $(DefineConstants);_NETFRAMEWORK_;_NET40_ + + + + $(DefineConstants);_NETFRAMEWORK_;_NET46_ + + + + + + + + + + + + + + + + + PreserveNewest + + + + + + + + diff --git a/ClosedXML_Sandbox/OneRow.cs b/ClosedXML_Sandbox/OneRow.cs new file mode 100644 index 0000000..2627417 --- /dev/null +++ b/ClosedXML_Sandbox/OneRow.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.ComponentModel.DataAnnotations; + +namespace ClosedXML_Sandbox +{ + public class OneRow + { + [Display(Name = "Col01")] + public int Col01 { get; set; } + + [Display(Name = "Col02")] + public string Col02 { get; set; } + + [Display(Name = "Col03")] + public DateTime? Col03 { get; set; } + + [Display(Name = "Col04")] + public TimeSpan? Col04 { get; set; } + + [Display(Name = "Col05")] + public TimeSpan? Col05 { get; set; } + + [Display(Name = "Col06")] + public TimeSpan? Col06 { get; set; } + + [Display(Name = "Col07")] + public TimeSpan? Col07 { get; set; } + + [Display(Name = "Col08")] + public TimeSpan? Col08 { get; set; } + + [Display(Name = "Col09")] + public string Col09 { get; set; } + + [Display(Name = "Col10")] + public decimal Col10 { get; set; } + + [Display(Name = "Col11")] + public string Col11 { get; set; } + + [Display(Name = "Col12")] + public bool Col12 { get; set; } + + [Display(Name = "Col13")] + public bool Col13 { get; set; } + + [Display(Name = "Col14")] + public string Col14 { get; set; } + + [Display(Name = "Col15")] + public bool Col15 { get; set; } + + [Display(Name = "Col16")] + public string Col16 { get; set; } + + [Display(Name = "Col17")] + public string Col17 { get; set; } + + [Display(Name = "Col18")] + public DateTime? Col18 { get; set; } + + [Display(Name = "Col19")] + public string Col19 { get; set; } + + [Display(Name = "Col20")] + public string Col20 { get; set; } + + [Display(Name = "Col21")] + public string Col21 { get; set; } + + [Display(Name = "Col22")] + public string Col22 { get; set; } + + [Display(Name = "Col23")] + public string Col23 { get; set; } + + [Display(Name = "Col24")] + public bool Col24 { get; set; } + + [Display(Name = "Col25")] + public int? Col25 { get; set; } + + [Display(Name = "Col26")] + public string Col26 { get; set; } + } +} \ No newline at end of file diff --git a/ClosedXML_Sandbox/PerformanceRunner.cs b/ClosedXML_Sandbox/PerformanceRunner.cs new file mode 100644 index 0000000..b535a1d --- /dev/null +++ b/ClosedXML_Sandbox/PerformanceRunner.cs @@ -0,0 +1,170 @@ +using ClosedXML.Excel; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; + +namespace ClosedXML_Sandbox +{ + internal class PerformanceRunner + { + public static void TimeAction(Action action) + { + var stopwatch = Stopwatch.StartNew(); + action(); + Console.WriteLine("Action done in " + stopwatch.Elapsed); + } + + private const int rowCount = 5000; + + public static void RunInsertTable() + { + var rows = new List(); + + for (int i = 0; i < rowCount; i++) + { + var row = GenerateRow(); + rows.Add(row); + } + + var workbook = new XLWorkbook(); + var worksheet = workbook.Worksheets.Add("Sheet 1"); + worksheet.Cell(1, 1).InsertTable(rows); + + CreateMergedCell(worksheet); + + worksheet.Columns().AdjustToContents(); + + EmulateSave(workbook); + } + + public static void OpenTestFile() + { + using (var wb = new XLWorkbook("test.xlsx")) + { + wb.RecalculateAllFormulas(); + var ws = wb.Worksheets.First(); + var cell = ws.FirstCellUsed(); + Console.WriteLine(cell.Value); + } + } + + private static void CreateMergedCell(IXLWorksheet worksheet) + { + worksheet.Cell(rowCount + 2, 1).Value = "Merged cell"; + var range = worksheet.Range(rowCount + 2, 1, rowCount + 2, 2); + range.Row(1).Merge(); + } + + private static void EmulateSave(XLWorkbook workbook) + { + using (MemoryStream memoryStream = new MemoryStream()) + { + workbook.SaveAs(memoryStream); + memoryStream.Seek(0, SeekOrigin.Begin); + Console.WriteLine("Total bytes = " + memoryStream.ToArray().Length); + } + } + + private static Random rnd = new Random(); + + private static T GenerateRow() where T : new() + { + var row = new T(); + + var rowProps = row.GetType().GetProperties(); + + var strings = rowProps.Where(p => p.PropertyType == typeof(string)); + var decimals = rowProps.Where(p => p.PropertyType == typeof(decimal)); + var ints = rowProps.Where(p => p.PropertyType == typeof(int) || p.PropertyType == typeof(int?)); + var dates = rowProps.Where(p => p.PropertyType == typeof(DateTime?)); + var timeSpans = rowProps.Where(p => p.PropertyType == typeof(TimeSpan?)); + var booleans = rowProps.Where(p => p.PropertyType == typeof(bool)); + + // Format strings + var tmpString = new StringBuilder(); + var tmpStringLength = rnd.Next(5, 50); + for (int x = 0; x <= tmpStringLength; x++) + { + tmpString.Append((char)(rnd.Next(48, 120))); + } + foreach (var str in strings) + { + str.SetValue(row, tmpString.ToString(), null); + } + + // Format decimals + var tmpDec = (decimal)(rnd.Next(-10000, 100000) / (Math.Pow(10.0, rnd.Next(1, 4)))); + + foreach (var dec in decimals) + { + dec.SetValue(row, tmpDec, null); + } + + // Format ints + var tmpInt = rnd.Next(-1000, 10000); + + foreach (var intValue in ints) + { + intValue.SetValue(row, tmpInt, null); + } + + // Format dates + var tmpDate = new DateTime(2012, 1, 1, 1, 1, 1); + tmpDate = tmpDate.AddSeconds(rnd.Next(-10000, 100000)); + foreach (var dt in dates) + { + dt.SetValue(row, tmpDate, null); + } + + // Format timespans + var tmpTimespan = new TimeSpan(rnd.Next(1, 24), rnd.Next(1, 60), rnd.Next(1, 60)); + + foreach (var ts in timeSpans) + { + ts.SetValue(row, tmpTimespan, null); + } + + // Format booleans + var tmpBool = (rnd.Next(0, 2) > 0); + foreach (var bl in booleans) + { + bl.SetValue(row, tmpBool, null); + } + + return row; + } + + public static void PerformHeavyCalculation() + { + int rows = 200; + int columns = 200; + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + var lastColumnLetter = sheet.Column(columns).ColumnLetter(); + for (int i = 1; i <= rows; i++) + { + for (int j = 1; j <= columns; j++) + { + if (i == 1) + { + sheet.Cell(i, j).FormulaA1 = string.Format("=ROUND({0}*SIN({0}),2)", j); + } + else + { + sheet.Cell(i, j).FormulaA1 = string.Format("=SUM({0}$1:{0}{1})/SUM($A{1}:${2}{1})", + sheet.Column(j).ColumnLetter(), i - 1, lastColumnLetter); // i.e. for K8 there will be =SUM(K$1:K7)/SUM($A7:$GR7) + } + } + } + + var cells = sheet.CellsUsed(); + var sum1 = cells.Sum(cell => (double)cell.Value); + Console.WriteLine("Total sum: {0:N2}", sum1); + } + } + } +} diff --git a/ClosedXML_Sandbox/Program.cs b/ClosedXML_Sandbox/Program.cs new file mode 100644 index 0000000..704ab40 --- /dev/null +++ b/ClosedXML_Sandbox/Program.cs @@ -0,0 +1,29 @@ +using System; + +namespace ClosedXML_Sandbox +{ + internal static class Program + { + private static void Main(string[] args) + { + Console.WriteLine("Running {0}", nameof(PerformanceRunner.OpenTestFile)); + PerformanceRunner.TimeAction(PerformanceRunner.OpenTestFile); + Console.WriteLine(); + + // Disable this block by default - I don't use it often +#if false + + Console.WriteLine("Running {0}", nameof(PerformanceRunner.RunInsertTable)); + PerformanceRunner.TimeAction(PerformanceRunner.RunInsertTable); + Console.WriteLine(); + + Console.WriteLine("Running {0}", nameof(PerformanceRunner.PerformHeavyCalculation)); + PerformanceRunner.TimeAction(PerformanceRunner.PerformHeavyCalculation); + Console.WriteLine(); +#endif + + Console.WriteLine("Press any key to continue"); + Console.ReadKey(); + } + } +} diff --git a/ClosedXML_Sandbox/ReflectionExtensions.cs b/ClosedXML_Sandbox/ReflectionExtensions.cs new file mode 100644 index 0000000..7229a8c --- /dev/null +++ b/ClosedXML_Sandbox/ReflectionExtensions.cs @@ -0,0 +1,17 @@ +#if _NET40_ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; + +namespace ClosedXML_Sandbox +{ + internal static class ReflectionExtensions + { + public static void SetValue(this PropertyInfo info, object obj, object value) + { + info.SetValue(obj, value, null); + } + } +} +#endif diff --git a/ClosedXML_Sandbox/app.config b/ClosedXML_Sandbox/app.config new file mode 100644 index 0000000..86fcc8b --- /dev/null +++ b/ClosedXML_Sandbox/app.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/ClosedXML_Sandbox/test.xlsx b/ClosedXML_Sandbox/test.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..296c174c53b4698bfd546bc0ddb813095e736851 GIT binary patch literal 8725 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 sDyn~>|C=+f!~Y)ZeuaL0)U58tbGcmMzZ literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/ClosedXML.snk b/ClosedXML_Tests/ClosedXML.snk new file mode 100644 index 0000000000000000000000000000000000000000..a17cff7ca6e08736fb1cb34fe2fb78dd2538bb8d GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097@`-`QKXZ~|dWD<<0Ju<{xxS3REG#fD>`kXX+v-y54cP=LhCw--* z#ZH~Hg>y#!*B8(sJ8X4@N8kwu@1XxOgH)#^X_Wc~ya61EV6&GsN?8#3zn5H*G18Aq zlPH)t7tXS}26fm?71YYx22fe0j=RjE)u?dKA#_Fyb*JK(Tq!Qy>IPo!%Ecrqzk+3~ zYEDo>0Ipgys{O_Sc)Xnd$i}z{gSf-B1h$a#;gE?it@uU=^9BT)|8MtGtqt%QwRx&G z-EO;UfkchjGeaQ9%2A3jD|v}+JI&)a;)OTvU(a&r(`cpWs~*kTOHVP;=NopJhJ2heC!9#ijkT>4 zCmWC4_A*kD + + + netcoreapp3.1;net40;net46 + 8.0 + 0.95.4 + false + $(NoWarn);NU1605 + Debug;Release;Release.Signed + + + + $(AppVeyor) + + + + bin\Release.Signed\ + true + true + ClosedXML.snk + $(DefineConstants);RELEASE;STRONGNAME + + + + $(DefineConstants);_NETSTANDARD_;_NETSTANDARD2_0_ + + + + $(DefineConstants);_NETFRAMEWORK_;_NET40_ + + + + $(DefineConstants);_NETFRAMEWORK_;_NET46_ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ClosedXML_Tests/Examples/AutoFilterTests.cs b/ClosedXML_Tests/Examples/AutoFilterTests.cs new file mode 100644 index 0000000..5aaf1b9 --- /dev/null +++ b/ClosedXML_Tests/Examples/AutoFilterTests.cs @@ -0,0 +1,39 @@ +using ClosedXML_Examples; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class AutoFilterTests + { + [Test] + public void CustomAutoFilter() + { + TestHelper.RunTestExample(@"AutoFilter\CustomAutoFilter.xlsx"); + } + + [Test] + public void DynamicAutoFilter() + { + TestHelper.RunTestExample(@"AutoFilter\DynamicAutoFilter.xlsx"); + } + + [Test] + public void RegularAutoFilter() + { + TestHelper.RunTestExample(@"AutoFilter\RegularAutoFilter.xlsx"); + } + + [Test] + public void TopBottomAutoFilter() + { + TestHelper.RunTestExample(@"AutoFilter\TopBottomAutoFilter.xlsx"); + } + + [Test] + public void DateTimeGroupAutoFilter() + { + TestHelper.RunTestExample(@"AutoFilter\DateTimeGroupAutoFilter.xlsx"); + } + } +} diff --git a/ClosedXML_Tests/Examples/ColumnsTests.cs b/ClosedXML_Tests/Examples/ColumnsTests.cs new file mode 100644 index 0000000..b5007bf --- /dev/null +++ b/ClosedXML_Tests/Examples/ColumnsTests.cs @@ -0,0 +1,40 @@ +using ClosedXML_Examples; +using ClosedXML_Examples.Columns; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class ColumnsTests + { + [Test] + public void ColumnCells() + { + TestHelper.RunTestExample(@"Columns\ColumnCells.xlsx"); + } + + [Test] + public void ColumnCollections() + { + TestHelper.RunTestExample(@"Columns\ColumnCollection.xlsx"); + } + + [Test] + public void ColumnSettings() + { + TestHelper.RunTestExample(@"Columns\ColumnSettings.xlsx"); + } + + [Test] + public void DeletingColumns() + { + TestHelper.RunTestExample(@"Columns\DeletingColumns.xlsx"); + } + + //[Test] // Not working yet + public void InsertColumns() + { + TestHelper.RunTestExample(@"Columns\InsertColumns.xlsx"); + } + } +} diff --git a/ClosedXML_Tests/Examples/CommentsTests.cs b/ClosedXML_Tests/Examples/CommentsTests.cs new file mode 100644 index 0000000..11d719c --- /dev/null +++ b/ClosedXML_Tests/Examples/CommentsTests.cs @@ -0,0 +1,15 @@ +using ClosedXML_Examples; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class CommentsTests + { + [Test] + public void AddingComments() + { + TestHelper.RunTestExample(@"Comments\AddingComments.xlsx"); + } + } +} \ No newline at end of file diff --git a/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs b/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs new file mode 100644 index 0000000..2de6d03 --- /dev/null +++ b/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs @@ -0,0 +1,141 @@ +using ClosedXML_Examples; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class ConditionalFormattingTests + { + [Test] + public void CFColorScaleLowHigh() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFColorScaleLowHigh.xlsx"); + } + + [Test] + public void CFColorScaleLowMidHigh() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFColorScaleLowMidHigh.xlsx"); + } + + [Test] + public void CFColorScaleMinimumMaximum() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFColorScaleMinimumMaximum.xlsx"); + } + + [Test] + public void CFContains() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFContains.xlsx"); + } + + [Test] + public void CFDataBar() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFDataBar.xlsx"); + } + + [Test] + public void CFDataBarNegative() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFDataBarNegative.xlsx"); + } + + [Test] + public void CFEndsWith() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFEndsWith.xlsx"); + } + + [Test] + public void CFEqualsNumber() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFEqualsNumber.xlsx"); + } + + [Test] + public void CFEqualsString() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFEqualsString.xlsx"); + } + + [Test] + public void CFIconSet() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFIconSet.xlsx"); + } + + [Test] + public void CFIsBlank() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFIsBlank.xlsx"); + } + + [Test] + public void CFIsError() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFIsError.xlsx"); + } + + [Test] + public void CFNotBlank() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFNotBlank.xlsx"); + } + + [Test] + public void CFNotContains() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFNotContains.xlsx"); + } + + [Test] + public void CFNotEqualsNumber() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFNotEqualsNumber.xlsx"); + } + + [Test] + public void CFNotEqualsString() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFNotEqualsString.xlsx"); + } + + [Test] + public void CFNotError() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFNotError.xlsx"); + } + + [Test] + public void CFStartsWith() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFStartsWith.xlsx"); + } + + [Test] + public void CFMultipleConditions() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFMultipleConditions.xlsx"); + } + + [Test] + public void CFStopIfTrue() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFStopIfTrue.xlsx"); + } + + [Test] + public void CFDatesOccurring() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFDatesOccurring.xlsx"); + } + + [Test] + public void CFDataBars() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFDataBars.xlsx"); + } + } +} diff --git a/ClosedXML_Tests/Examples/DeleteTests.cs b/ClosedXML_Tests/Examples/DeleteTests.cs new file mode 100644 index 0000000..bd498be --- /dev/null +++ b/ClosedXML_Tests/Examples/DeleteTests.cs @@ -0,0 +1,21 @@ +using ClosedXML_Examples.Delete; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class DeleteTests + { + [Test] + public void DeleteFewWorksheets() + { + TestHelper.RunTestExample(@"Delete\DeleteFewWorksheets.xlsx"); + } + + [Test] + public void RemoveRows() + { + TestHelper.RunTestExample(@"Delete\RemoveRows.xlsx"); + } + } +} \ No newline at end of file diff --git a/ClosedXML_Tests/Examples/ImageHandlingTests.cs b/ClosedXML_Tests/Examples/ImageHandlingTests.cs new file mode 100644 index 0000000..cbbbd94 --- /dev/null +++ b/ClosedXML_Tests/Examples/ImageHandlingTests.cs @@ -0,0 +1,21 @@ +using ClosedXML_Examples; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class ImageHandlingTests + { + [Test] + public void ImageAnchors() + { + TestHelper.RunTestExample(@"ImageHandling\ImageAnchors.xlsx"); + } + + [Test] + public void ImageFormats() + { + TestHelper.RunTestExample(@"ImageHandling\ImageFormats.xlsx"); + } + } +} diff --git a/ClosedXML_Tests/Examples/LoadingTests.cs b/ClosedXML_Tests/Examples/LoadingTests.cs new file mode 100644 index 0000000..d6af919 --- /dev/null +++ b/ClosedXML_Tests/Examples/LoadingTests.cs @@ -0,0 +1,15 @@ +using ClosedXML_Examples; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class LoadingTests + { + [Test] + public void ChangingBasicTable() + { + TestHelper.RunTestExample(@"Loading\ChangingBasicTable.xlsx"); + } + } +} \ No newline at end of file diff --git a/ClosedXML_Tests/Examples/MiscTests.cs b/ClosedXML_Tests/Examples/MiscTests.cs new file mode 100644 index 0000000..d74a9fc --- /dev/null +++ b/ClosedXML_Tests/Examples/MiscTests.cs @@ -0,0 +1,209 @@ +using ClosedXML_Examples; +using ClosedXML_Examples.Misc; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class MiscTests + { + [Test] + public void AddingDataSet() + { + TestHelper.RunTestExample(@"Misc\AddingDataSet.xlsx"); + } + + [Test] + public void AddingDataTableAsWorksheet() + { + TestHelper.RunTestExample(@"Misc\AddingDataTableAsWorksheet.xlsx"); + } + + [Test] + public void AdjustToContents() + { + TestHelper.RunTestExample(@"Misc\AdjustToContents.xlsx"); + } + + [Test] + public void AdjustToContentsWithAutoFilter() + { + TestHelper.RunTestExample(@"Misc\AdjustToContentsWithAutoFilter.xlsx"); + } + + [Test] + public void AutoFilter() + { + TestHelper.RunTestExample(@"Misc\AutoFilter.xlsx"); + } + + [Test] + public void BasicTable() + { + TestHelper.RunTestExample(@"Misc\BasicTable.xlsx"); + } + + [Test] + public void BlankCells() + { + TestHelper.RunTestExample(@"Misc\BlankCells.xlsx"); + } + + [Test] + public void CellValues() + { + TestHelper.RunTestExample(@"Misc\CellValues.xlsx"); + } + + [Test] + public void Collections() + { + TestHelper.RunTestExample(@"Misc\Collections.xlsx"); + } + + [Test] + public void CopyingRowsAndColumns() + { + TestHelper.RunTestExample(@"Misc\CopyingRowsAndColumns.xlsx"); + } + + [Test] + public void CopyingWorksheets() + { + TestHelper.RunTestExample(@"Misc\CopyingWorksheets.xlsx"); + } + + [Test] + public void DataTypes() + { + TestHelper.RunTestExample(@"Misc\DataTypes.xlsx"); + } + + [Test] + public void DataTypesUnderDifferentCulture() + { + TestHelper.RunTestExample(@"Misc\DataTypesUnderDifferentCulture.xlsx"); + } + + [Test] + public void DataValidation() + { + TestHelper.RunTestExample(@"Misc\DataValidation.xlsx"); + } + + [Test] + public void Formulas() + { + TestHelper.RunTestExample(@"Misc\Formulas.xlsx"); + } + + [Test] + public void FormulasWithEvaluation() + { + TestHelper.RunTestExample(@"Misc\FormulasWithEvaluation.xlsx", true); + } + + [Test] + public void FreezePanes() + { + TestHelper.RunTestExample(@"Misc\FreezePanes.xlsx"); + } + + [Test] + public void HideSheets() + { + TestHelper.RunTestExample(@"Misc\HideSheets.xlsx"); + } + + [Test] + public void HideUnhide() + { + TestHelper.RunTestExample(@"Misc\HideUnhide.xlsx"); + } + + [Test] + public void Hyperlinks() + { + TestHelper.RunTestExample(@"Misc\Hyperlinks.xlsx"); + } + + [Test] + public void InsertingData() + { + TestHelper.RunTestExample(@"Misc\InsertingData.xlsx"); + } + + + [Test] + public void LambdaExpressions() + { + TestHelper.RunTestExample(@"Misc\LambdaExpressions.xlsx"); + } + + [Test] + public void MergeCells() + { + TestHelper.RunTestExample(@"Misc\MergeCells.xlsx"); + } + + [Test] + public void MergeMoves() + { + TestHelper.RunTestExample(@"Misc\MergeMoves.xlsx"); + } + + [Test] + public void Outline() + { + TestHelper.RunTestExample(@"Misc\Outline.xlsx"); + } + + [Test] + public void RightToLeft() + { + TestHelper.RunTestExample(@"Misc\RightToLeft.xlsx"); + } + + [Test] + public void SheetProtection() + { + TestHelper.RunTestExample(@"Misc\SheetProtection.xlsx"); + } + + [Test] + public void SheetViews() + { + TestHelper.RunTestExample(@"Misc\SheetViews.xlsx"); + } + + [Test] + public void ShiftingFormulas() + { + TestHelper.RunTestExample(@"Misc\ShiftingFormulas.xlsx"); + } + + [Test] + public void ShowCase() + { + TestHelper.RunTestExample(@"Misc\ShowCase.xlsx"); + } + + [Test] + public void TabColors() + { + TestHelper.RunTestExample(@"Misc\TabColors.xlsx"); + } + + [Test] + public void WorkbookProperties() + { + TestHelper.RunTestExample(@"Misc\WorkbookProperties.xlsx"); + } + + [Test] + public void WorkbookProtection() + { + TestHelper.RunTestExample(@"Misc\WorkbookProtection.xlsx"); + } + } +} diff --git a/ClosedXML_Tests/Examples/PageSetupTests.cs b/ClosedXML_Tests/Examples/PageSetupTests.cs new file mode 100644 index 0000000..63930b0 --- /dev/null +++ b/ClosedXML_Tests/Examples/PageSetupTests.cs @@ -0,0 +1,45 @@ +using ClosedXML_Examples.PageSetup; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class PageSetupTests + { + [Test] + public void HeaderFooters() + { + TestHelper.RunTestExample(@"PageSetup\HeaderFooters.xlsx"); + } + + [Test] + public void Margins() + { + TestHelper.RunTestExample(@"PageSetup\Margins.xlsx"); + } + + [Test] + public void Page() + { + TestHelper.RunTestExample(@"PageSetup\Page.xlsx"); + } + + [Test] + public void SheetTab() + { + TestHelper.RunTestExample(@"PageSetup\SheetTab.xlsx"); + } + + [Test] + public void Sheets() + { + TestHelper.RunTestExample(@"PageSetup\Sheets.xlsx"); + } + + [Test] + public void TwoPages() + { + TestHelper.RunTestExample(@"PageSetup\TwoPages.xlsx"); + } + } +} \ No newline at end of file diff --git a/ClosedXML_Tests/Examples/PivotTableTests.cs b/ClosedXML_Tests/Examples/PivotTableTests.cs new file mode 100644 index 0000000..5a1d061 --- /dev/null +++ b/ClosedXML_Tests/Examples/PivotTableTests.cs @@ -0,0 +1,15 @@ +using ClosedXML_Examples; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class PivotTableTests + { + [Test] + public void PivotTables() + { + TestHelper.RunTestExample(@"PivotTables\PivotTables.xlsx"); + } + } +} diff --git a/ClosedXML_Tests/Examples/RangesTests.cs b/ClosedXML_Tests/Examples/RangesTests.cs new file mode 100644 index 0000000..59cd62b --- /dev/null +++ b/ClosedXML_Tests/Examples/RangesTests.cs @@ -0,0 +1,113 @@ +using ClosedXML_Examples; +using ClosedXML_Examples.Misc; +using ClosedXML_Examples.Ranges; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class RangesTests + { + [Test] + public void ClearingRanges() + { + TestHelper.RunTestExample(@"Ranges\ClearingRanges.xlsx"); + } + + [Test] + public void CopyingRanges() + { + TestHelper.RunTestExample(@"Ranges\CopyingRanges.xlsx"); + } + + [Test] + public void CurrentRowColumn() + { + TestHelper.RunTestExample(@"Ranges\CurrentRowColumn.xlsx"); + } + + [Test] + public void DefiningRanges() + { + TestHelper.RunTestExample(@"Ranges\DefiningRanges.xlsx"); + } + + [Test] + public void DeletingRanges() + { + TestHelper.RunTestExample(@"Ranges\DeletingRanges.xlsx"); + } + + [Test] + public void InsertingDeletingColumns() + { + TestHelper.RunTestExample(@"Ranges\InsertingDeletingColumns.xlsx"); + } + + [Test] + public void InsertingDeletingRows() + { + TestHelper.RunTestExample(@"Ranges\InsertingDeletingRows.xlsx"); + } + + [Test] + public void MultipleRanges() + { + TestHelper.RunTestExample(@"Ranges\MultipleRanges.xlsx"); + } + + [Test] + public void NamedRanges() + { + TestHelper.RunTestExample(@"Ranges\NamedRanges.xlsx"); + } + + [Test] + public void SelectingRanges() + { + TestHelper.RunTestExample(@"Ranges\SelectingRanges.xlsx"); + } + + [Test] + public void ShiftingRanges() + { + TestHelper.RunTestExample(@"Ranges\ShiftingRanges.xlsx"); + } + + [Test] + public void SortExample() + { + TestHelper.RunTestExample(@"Ranges\SortExample.xlsx"); + } + + [Test] + public void Sorting() + { + TestHelper.RunTestExample(@"Ranges\Sorting.xlsx"); + } + + [Test] + public void TransposeRanges() + { + TestHelper.RunTestExample(@"Ranges\TransposeRanges.xlsx"); + } + + [Test] + public void TransposeRangesPlus() + { + TestHelper.RunTestExample(@"Ranges\TransposeRangesPlus.xlsx"); + } + + [Test] + public void AddingRowToTables() + { + TestHelper.RunTestExample(@"Ranges\AddingRowToTables.xlsx"); + } + + [Test] + public void WalkingRanges() + { + TestHelper.RunTestExample(@"Ranges\WalkingRanges.xlsx"); + } + } +} diff --git a/ClosedXML_Tests/Examples/RowsTests.cs b/ClosedXML_Tests/Examples/RowsTests.cs new file mode 100644 index 0000000..446b812 --- /dev/null +++ b/ClosedXML_Tests/Examples/RowsTests.cs @@ -0,0 +1,34 @@ +using ClosedXML_Examples; +using ClosedXML_Examples.Rows; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class RowsTests + { + [Test] + public void RowCells() + { + TestHelper.RunTestExample(@"Rows\RowCells.xlsx"); + } + + [Test] + public void RowCollection() + { + TestHelper.RunTestExample(@"Rows\RowCollection.xlsx"); + } + + [Test] + public void RowSettings() + { + TestHelper.RunTestExample(@"Rows\RowSettings.xlsx"); + } + + //[Test] // Not working yet + public void InsertRows() + { + TestHelper.RunTestExample(@"Rows\InsertRows.xlsx"); + } + } +} diff --git a/ClosedXML_Tests/Examples/StylesTests.cs b/ClosedXML_Tests/Examples/StylesTests.cs new file mode 100644 index 0000000..ac6b17e --- /dev/null +++ b/ClosedXML_Tests/Examples/StylesTests.cs @@ -0,0 +1,87 @@ +using ClosedXML_Examples.Styles; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class StylesTests + { + [Test] + public void DefaultStyles() + { + TestHelper.RunTestExample(@"Styles\DefaultStyles.xlsx"); + } + + [Test] + public void PurpleWorksheet() + { + TestHelper.RunTestExample(@"Styles\PurpleWorksheet.xlsx"); + } + + [Test] + public void StyleAlignment() + { + TestHelper.RunTestExample(@"Styles\StyleAlignment.xlsx"); + } + + [Test] + public void StyleBorder() + { + TestHelper.RunTestExample(@"Styles\StyleBorder.xlsx"); + } + + [Test] + public void StyleFill() + { + TestHelper.RunTestExample(@"Styles\StyleFill.xlsx"); + } + + [Test] + public void StyleFont() + { + TestHelper.RunTestExample(@"Styles\StyleFont.xlsx"); + } + + [Test] + public void StyleNumberFormat() + { + TestHelper.RunTestExample(@"Styles\StyleNumberFormat.xlsx"); + } + + [Test] + public void StyleIncludeQuotePrefix() + { + TestHelper.RunTestExample(@"Styles\StyleIncludeQuotePrefix.xlsx"); + } + + [Test] + public void StyleRowsColumns() + { + TestHelper.RunTestExample(@"Styles\StyleRowsColumns.xlsx"); + } + + [Test] + public void StyleWorksheet() + { + TestHelper.RunTestExample(@"Styles\StyleWorksheet.xlsx"); + } + + [Test] + public void UsingColors() + { + TestHelper.RunTestExample(@"Styles\UsingColors.xlsx"); + } + + [Test] + public void UsingPhonetics() + { + TestHelper.RunTestExample(@"Styles\UsingPhonetics.xlsx"); + } + + [Test] + public void UsingRichText() + { + TestHelper.RunTestExample(@"Styles\UsingRichText.xlsx"); + } + } +} diff --git a/ClosedXML_Tests/Examples/TablesTests.cs b/ClosedXML_Tests/Examples/TablesTests.cs new file mode 100644 index 0000000..934bf65 --- /dev/null +++ b/ClosedXML_Tests/Examples/TablesTests.cs @@ -0,0 +1,27 @@ +using ClosedXML_Examples.Tables; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class TablesTests + { + [Test] + public void InsertingTables() + { + TestHelper.RunTestExample(@"Tables\InsertingTables.xlsx"); + } + + [Test] + public void ResizingTables() + { + TestHelper.RunTestExample(@"Tables\ResizingTables.xlsx"); + } + + [Test] + public void UsingTables() + { + TestHelper.RunTestExample(@"Tables\UsingTables.xlsx"); + } + } +} diff --git a/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs b/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs new file mode 100644 index 0000000..52c8122 --- /dev/null +++ b/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs @@ -0,0 +1,277 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class AutoFilterTests + { + [Test] + public void AutoFilterExpandsWithTable() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + + ws.FirstCell().SetValue("Categories") + .CellBelow().SetValue("1") + .CellBelow().SetValue("2"); + + IXLTable table = ws.RangeUsed().CreateTable(); + + var listOfArr = new List(); + listOfArr.Add(3); + listOfArr.Add(4); + listOfArr.Add(5); + listOfArr.Add(6); + + table.DataRange.InsertRowsBelow(listOfArr.Count - table.DataRange.RowCount()); + table.DataRange.FirstCell().InsertData(listOfArr); + + Assert.AreEqual("A1:A5", table.AutoFilter.Range.RangeAddress.ToStringRelative()); + Assert.AreEqual(5, table.AutoFilter.VisibleRows.Count()); + } + } + + [Test] + public void AutoFilterSortWhenNotInFirstRow() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + + ws.Cell(3, 3).SetValue("Names") + .CellBelow().SetValue("Manuel") + .CellBelow().SetValue("Carlos") + .CellBelow().SetValue("Dominic"); + ws.RangeUsed().SetAutoFilter().Sort(); + Assert.AreEqual("Carlos", ws.Cell(4, 3).GetString()); + } + } + + [Test] + public void CanClearAutoFilter() + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("AutoFilter"); + ws.Cell("A1").Value = "Names"; + ws.Cell("A2").Value = "John"; + ws.Cell("A3").Value = "Hank"; + ws.Cell("A4").Value = "Dagny"; + + ws.AutoFilter.Clear(); // We should be able to clear a filter even if it hasn't been set. + Assert.That(!ws.AutoFilter.IsEnabled); + + ws.RangeUsed().SetAutoFilter(); + Assert.That(ws.AutoFilter.IsEnabled); + + ws.AutoFilter.Clear(); + Assert.That(!ws.AutoFilter.IsEnabled); + } + + [Test] + public void CanClearAutoFilter2() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("AutoFilter"); + ws.Cell("A1").Value = "Names"; + ws.Cell("A2").Value = "John"; + ws.Cell("A3").Value = "Hank"; + ws.Cell("A4").Value = "Dagny"; + + ws.SetAutoFilter(false); + Assert.That(!ws.AutoFilter.IsEnabled); + + ws.RangeUsed().SetAutoFilter(); + Assert.That(ws.AutoFilter.IsEnabled); + + ws.RangeUsed().SetAutoFilter(false); + Assert.That(!ws.AutoFilter.IsEnabled); + } + } + + [Test] + public void CanCopyAutoFilterToNewSheetOnNewWorkbook() + { + using (var ms1 = new MemoryStream()) + using (var ms2 = new MemoryStream()) + { + using (var wb1 = new XLWorkbook()) + using (var wb2 = new XLWorkbook()) + { + var ws = wb1.Worksheets.Add("AutoFilter"); + ws.Cell("A1").Value = "Names"; + ws.Cell("A2").Value = "John"; + ws.Cell("A3").Value = "Hank"; + ws.Cell("A4").Value = "Dagny"; + + ws.RangeUsed().SetAutoFilter(); + + wb1.SaveAs(ms1); + + ws.CopyTo(wb2, ws.Name); + wb2.SaveAs(ms2); + } + + using (var wb2 = new XLWorkbook(ms2)) + { + Assert.IsTrue(wb2.Worksheets.First().AutoFilter.IsEnabled); + } + } + } + + [Test] + public void CannotAddAutoFilterOverExistingTable() + { + using var wb = new XLWorkbook(); + + var data = Enumerable.Range(1, 10).Select(i => new + { + Index = i, + String = $"String {i}" + }); + + var ws = wb.AddWorksheet(); + ws.FirstCell().InsertTable(data); + + Assert.Throws(() => ws.RangeUsed().SetAutoFilter()); + } + + [Test] + [TestCase("A1:A4")] + [TestCase("A1:B4")] + [TestCase("A1:C4")] + public void AutoFilterRangeRemainsValidOnInsertColumn(string rangeAddress) + { + //Arrange + using (var ms1 = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("AutoFilter"); + ws.Cell("A1").Value = "Ids"; + ws.Cell("B1").Value = "Names"; + ws.Cell("B2").Value = "John"; + ws.Cell("B3").Value = "Hank"; + ws.Cell("B4").Value = "Dagny"; + ws.Cell("C1").Value = "Phones"; + + ws.Range("B1:B4").SetAutoFilter(true); + + //Act + var range = ws.Range(rangeAddress); + range.InsertColumnsBefore(1); + + //Assert + Assert.IsTrue(ws.AutoFilter.Range.RangeAddress.IsValid); + } + } + } + + [Test] + public void AutoFilterVisibleRows() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + + ws.Cell(3, 3).SetValue("Names") + .CellBelow().SetValue("Manuel") + .CellBelow().SetValue("Carlos") + .CellBelow().SetValue("Dominic"); + + var autoFilter = ws.RangeUsed() + .SetAutoFilter(); + + autoFilter.Column(1).AddFilter("Carlos"); + + Assert.AreEqual("Carlos", ws.Cell(5, 3).GetString()); + Assert.AreEqual(2, autoFilter.VisibleRows.Count()); + Assert.AreEqual(3, autoFilter.VisibleRows.First().WorksheetRow().RowNumber()); + Assert.AreEqual(5, autoFilter.VisibleRows.Last().WorksheetRow().RowNumber()); + } + } + + [Test] + public void ReapplyAutoFilter() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + + ws.Cell(3, 3).SetValue("Names") + .CellBelow().SetValue("Manuel") + .CellBelow().SetValue("Carlos") + .CellBelow().SetValue("Dominic") + .CellBelow().SetValue("Jose"); + + var autoFilter = ws.RangeUsed() + .SetAutoFilter(); + + autoFilter.Column(1).AddFilter("Carlos"); + + Assert.AreEqual(3, autoFilter.HiddenRows.Count()); + + // Unhide the rows so that the table is out of sync with the filter + autoFilter.HiddenRows.ForEach(r => r.WorksheetRow().Unhide()); + Assert.False(autoFilter.HiddenRows.Any()); + + autoFilter.Reapply(); + Assert.AreEqual(3, autoFilter.HiddenRows.Count()); + } + } + + [Test] + public void CanLoadAutoFilterWithThousandsSeparator() + { + var backupCulture = Thread.CurrentThread.CurrentCulture; + + try + { + // Set thread culture to French, which should format numbers using a space as thousands separator + var culture = CultureInfo.CreateSpecificCulture("fr-FR"); + // but use a period instead of a comma as for decimal separator + culture.NumberFormat.CurrencyDecimalSeparator = "."; + + Thread.CurrentThread.CurrentCulture = culture; + + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\AutoFilter\AutoFilterWithThousandsSeparator.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual(10000, (ws.AutoFilter as XLAutoFilter).Filters.First().Value.First().Value); + Assert.AreEqual(2, ws.AutoFilter.VisibleRows.Count()); + + ws.AutoFilter.Reapply(); + Assert.AreEqual(2, ws.AutoFilter.VisibleRows.Count()); + } + + Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); + + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\AutoFilter\AutoFilterWithThousandsSeparator.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual("10 000.00", (ws.AutoFilter as XLAutoFilter).Filters.First().Value.First().Value); + + var v = ws.AutoFilter.VisibleRows.Select(r => r.FirstCell().Value).ToList(); + Assert.AreEqual(2, ws.AutoFilter.VisibleRows.Count()); + + ws.AutoFilter.Reapply(); + Assert.AreEqual(1, ws.AutoFilter.VisibleRows.Count()); + } + } + finally + { + Thread.CurrentThread.CurrentCulture = backupCulture; + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Caching/SampleRepositoryTests.cs b/ClosedXML_Tests/Excel/Caching/SampleRepositoryTests.cs new file mode 100644 index 0000000..a139601 --- /dev/null +++ b/ClosedXML_Tests/Excel/Caching/SampleRepositoryTests.cs @@ -0,0 +1,237 @@ +using System; +using ClosedXML.Excel; +using ClosedXML.Excel.Caching; +using NUnit.Framework; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace ClosedXML_Tests.Excel.Caching +{ + [TestFixture] + public class BaseRepositoryTests + { + [Test] + public void DifferentEntitiesWithSameKeyStoredOnce() + { + // Arrange + int key = 12345; + var entity1 = new SampleEntity(key); + var entity2 = new SampleEntity(key); + var sampleRepository = this.CreateSampleRepository(); + + // Act + var storedEntity1 = sampleRepository.Store(ref key, entity1); + var storedEntity2 = sampleRepository.Store(ref key, entity2); + + // Assert + Assert.AreSame(entity1, storedEntity1); + Assert.AreSame(entity1, storedEntity2); + Assert.AreNotSame(entity2, storedEntity2); + } + + + [Test] + public void NonUsedReferencesAreGCed() + { +#if !DEBUG + // Arrange + int key = 12345; + var sampleRepository = this.CreateSampleRepository(); + + // Act + var storedEntityRef1 = new WeakReference(sampleRepository.Store(ref key, new SampleEntity(key))); + + int count = 0; + do + { + Thread.Sleep(50); + GC.Collect(); + count++; + } while (storedEntityRef1.IsAlive && count < 10); + + // Assert + if (count == 10) + Assert.Fail("storedEntityRef1 was not GCed"); + + Assert.IsFalse(sampleRepository.Any()); +#else + Assert.Ignore("Can't run in DEBUG"); +#endif + } + + + [Test] + public void NonUsedReferencesAreGCed2() + { +#if !DEBUG + // Arrange + int countUnique = 30; + int repeatCount = 1000; + SampleEntity[] entities = new SampleEntity[countUnique * repeatCount]; + for (int i = 0; i < countUnique; i++) + { + for (int j = 0; j < repeatCount; j++) + { + entities[i * repeatCount + j] = new SampleEntity(i); + } + } + + var sampleRepository = this.CreateSampleRepository(); + + // Act + Parallel.ForEach(entities, new ParallelOptions { MaxDegreeOfParallelism = 8 }, + e => + { + var key = e.Key; + sampleRepository.Store(ref key, e); + }); + + Thread.Sleep(50); + GC.Collect(); + var storedEntries = sampleRepository.ToList(); + + // Assert + Assert.AreEqual(0, storedEntries.Count); +#else + Assert.Ignore("Can't run in DEBUG"); +#endif + } + + [Test] + public void ConcurrentAddingCausesNoDuplication() + { + // Arrange + int countUnique = 30; + int repeatCount = 1000; + SampleEntity[] entities = new SampleEntity[countUnique * repeatCount]; + for (int i = 0; i < countUnique; i++) + { + for (int j = 0; j < repeatCount; j++) + { + entities[i * repeatCount + j] = new SampleEntity(i); + } + } + + var sampleRepository = this.CreateSampleRepository(); + + // Act + Parallel.ForEach(entities, new ParallelOptions { MaxDegreeOfParallelism = 8 }, + e => + { + var key = e.Key; + sampleRepository.Store(ref key, e); + }); + var storedEntries = sampleRepository.ToList(); + + // Assert + Assert.AreEqual(countUnique, storedEntries.Count); + Assert.NotNull(entities); // To protect them from GC + } + + [Test] + public void ReplaceKeyInRepository() + { + // Arrange + int key1 = 12345; + int key2 = 54321; + var entity = new SampleEntity(key1); + var sampleRepository = this.CreateSampleRepository(); + var storedEntity1 = sampleRepository.Store(ref key1, entity); + + // Act + sampleRepository.Replace(ref key1, ref key2); + bool containsOld = sampleRepository.ContainsKey(ref key1, out var _); + bool containsNew = sampleRepository.ContainsKey(ref key2, out var _); + var storedEntity2 = sampleRepository.GetOrCreate(ref key2); + + // Assert + Assert.IsFalse(containsOld); + Assert.IsTrue(containsNew); + Assert.AreSame(entity, storedEntity1); + Assert.AreSame(entity, storedEntity2); + } + + [Test] + public void ConcurrentReplaceKeyInRepository() + { + var sampleRepository = new EditableRepository(); + int[] keys = Enumerable.Range(0, 1000).ToArray(); + keys.ForEach(key => sampleRepository.GetOrCreate(ref key)); + + Parallel.ForEach(keys, key => + { + var modifiedKey = key + 2000; + var val1 = sampleRepository.Replace(ref key, ref modifiedKey); + val1.Key = key + 2000; + var val2 = sampleRepository.GetOrCreate(ref modifiedKey); + Assert.AreSame(val1, val2); + }); + } + + [Test] + public void ReplaceNonExistingKeyInRepository() + { + int key1 = 100; + int key2 = 200; + int key3 = 300; + var entity = new SampleEntity(key1); + var sampleRepository = this.CreateSampleRepository(); + sampleRepository.Store(ref key1, entity); + + sampleRepository.Replace(ref key2, ref key3); + var all = sampleRepository.ToList(); + + Assert.AreEqual(1, all.Count); + Assert.AreSame(entity, all.First()); + } + + private SampleRepository CreateSampleRepository() + { + return new SampleRepository(); + } + + ///

+ /// Class under testing + /// + internal class SampleRepository : XLRepositoryBase + { + public SampleRepository() : base(key => new SampleEntity(key)) + { + } + } + + public class SampleEntity + { + public int Key { get; private set; } + + public SampleEntity(int key) + { + Key = key; + } + } + + + /// + /// Class under testing + /// + internal class EditableRepository : XLRepositoryBase + { + public EditableRepository() : base(key => new EditableEntity(key)) + { + } + } + + public class EditableEntity + { + public int Key { get; set; } + + public EditableEntity(int key) + { + Key = key; + } + } + } + + +} diff --git a/ClosedXML_Tests/Excel/CalcEngine/CalcEngineCellEnumerationTests.cs b/ClosedXML_Tests/Excel/CalcEngine/CalcEngineCellEnumerationTests.cs new file mode 100644 index 0000000..fdc97c7 --- /dev/null +++ b/ClosedXML_Tests/Excel/CalcEngine/CalcEngineCellEnumerationTests.cs @@ -0,0 +1,23 @@ +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.CalcEngine +{ + public class CalcEngineCellEnumerationTests + { + [Test] + public void CanEnumerateCellsOverEmptySheet() + { + using (var wb = new XLWorkbook()) + { + var sheet1 = wb.AddWorksheet("Sheet1"); + var sheet2 = wb.AddWorksheet("Sheet2"); + + var cell = sheet1.FirstCell(); + cell.FormulaA1 = "=SUMIFS(Sheet2!B:B, Sheet2!C:C, 1)"; + + Assert.AreEqual(0, cell.Value); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/CalcEngine/CalcEngineExceptionTests.cs b/ClosedXML_Tests/Excel/CalcEngine/CalcEngineExceptionTests.cs new file mode 100644 index 0000000..26e9f01 --- /dev/null +++ b/ClosedXML_Tests/Excel/CalcEngine/CalcEngineExceptionTests.cs @@ -0,0 +1,56 @@ +using ClosedXML.Excel; +using ClosedXML.Excel.CalcEngine.Exceptions; +using NUnit.Framework; +using System; +using System.Globalization; +using System.Threading; + +namespace ClosedXML_Tests.Excel.CalcEngine +{ + [TestFixture] + public class CalcEngineExceptionTests + { + [OneTimeSetUp] + public void SetCultureInfo() + { + Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); + } + + [Test] + public void InvalidCharNumber() + { + Assert.Throws(() => XLWorkbook.EvaluateExpr("CHAR(-2)")); + Assert.Throws(() => XLWorkbook.EvaluateExpr("CHAR(270)")); + } + + [Test] + public void DivisionByZero() + { + Assert.Throws(() => XLWorkbook.EvaluateExpr("0/0")); + Assert.Throws(() => new XLWorkbook().AddWorksheet().Evaluate("0/0")); + } + + [Test] + public void InvalidFunction() + { + Exception ex; + ex = Assert.Throws(() => XLWorkbook.EvaluateExpr("XXX(A1:A2)")); + Assert.That(ex.Message, Is.EqualTo("The identifier `XXX` was not recognised.")); + + var ws = new XLWorkbook().AddWorksheet(); + ex = Assert.Throws(() => ws.Evaluate("XXX(A1:A2)")); + Assert.That(ex.Message, Is.EqualTo("The identifier `XXX` was not recognised.")); + } + + [Test] + public void NestedNameNotRecognizedException() + { + using var wb = new XLWorkbook(); + var ws = wb.AddWorksheet(); + ws.Cell("A1").SetFormulaA1("=XXX"); + ws.Cell("A2").SetFormulaA1(@"=IFERROR(A1, ""Success"")"); + + Assert.AreEqual("Success", ws.Cell("A2").Value); + } + } +} diff --git a/ClosedXML_Tests/Excel/CalcEngine/DateAndTimeTests.cs b/ClosedXML_Tests/Excel/CalcEngine/DateAndTimeTests.cs new file mode 100644 index 0000000..b26f519 --- /dev/null +++ b/ClosedXML_Tests/Excel/CalcEngine/DateAndTimeTests.cs @@ -0,0 +1,564 @@ +using ClosedXML.Excel; +using ClosedXML.Excel.CalcEngine.Exceptions; +using NUnit.Framework; +using System; +using System.Globalization; +using System.Threading; + +namespace ClosedXML_Tests.Excel.DataValidations +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class DateAndTimeTests + { + [SetUp] + public void SetCultureInfo() + { + Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); + } + + [Test] + public void Date() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr("Date(2008, 1, 1)"); + Assert.AreEqual(39448, actual); + + actual = XLWorkbook.EvaluateExpr("Date(2008, 15, 1)"); + Assert.AreEqual(39873, actual); + + actual = XLWorkbook.EvaluateExpr("Date(2008, -50, 1)"); + Assert.AreEqual(37895, actual); + + actual = XLWorkbook.EvaluateExpr("Date(2008, 5, 63)"); + Assert.AreEqual(39631, actual); + + actual = XLWorkbook.EvaluateExpr("Date(2008, 13, 63)"); + Assert.AreEqual(39876, actual); + + actual = XLWorkbook.EvaluateExpr("Date(2008, 15, -120)"); + Assert.AreEqual(39752, actual); + } + + [TestCase("1/1/2006", "12/12/2010", "Y", ExpectedResult = 4)] + [TestCase("1/1/2006", "12/12/2010", "M", ExpectedResult = 59)] + [TestCase("1/1/2006", "12/12/2010", "D", ExpectedResult = 1806)] + [TestCase("1/1/2006", "12/12/2010", "MD", ExpectedResult = 11)] + [TestCase("1/1/2006", "12/12/2010", "YM", ExpectedResult = 11)] + [TestCase("1/1/2006", "12/12/2010", "YD", ExpectedResult = 345)] + [TestCase(38718, 40524, "Y", ExpectedResult = 4)] + [TestCase(38718, 40524, "M", ExpectedResult = 59)] + [TestCase(38718, 40524, "D", ExpectedResult = 1806)] + [TestCase(38718, 40524, "MD", ExpectedResult = 11)] + [TestCase(38718, 40524, "YM", ExpectedResult = 11)] + [TestCase(38718, 40524, "YD", ExpectedResult = 345)] + [TestCase("2001-12-31", "2002-4-15", "YM", ExpectedResult = 3)] + [TestCase("2001-12-10", "2002-4-15", "YM", ExpectedResult = 4)] + [TestCase("2001-12-15", "2002-4-15", "YM", ExpectedResult = 4)] + [TestCase("2001-12-31", "2002-4-15", "YD", ExpectedResult = 105)] + [TestCase("2001-12-31", "2003-4-15", "YD", ExpectedResult = 105)] + [TestCase("2002-01-31", "2002-4-15", "YD", ExpectedResult = 74)] + [TestCase("2001-12-02", "2001-12-15", "Y", ExpectedResult = 0)] + [TestCase("2001-12-02", "2002-12-02", "Y", ExpectedResult = 1)] + [TestCase("2006-01-15", "2006-03-14", "M", ExpectedResult = 1)] + [TestCase("2020-11-22", "2020-11-23 9:00", "D", ExpectedResult = 1)] + public double Datedif(object startDate, object endDate, string unit) + { + if (startDate is string s1) startDate = $"\"{s1}\""; + if (endDate is string s2) endDate = $"\"{s2}\""; + return (double)XLWorkbook.EvaluateExpr($"DATEDIF({startDate}, {endDate}, \"{unit}\")"); + } + + [TestCase("\"1/1/2010\"", "\"12/12/2006\"", "Y")] + [TestCase(40524, 38718, "Y")] + [TestCase("\"1/1/2006\"", "\"12/12/2010\"", "N")] + [TestCase(38718, 40524, "N")] + public void DatedifExceptions(object startDate, object endDate, string unit) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr($"DATEDIF({startDate}, {endDate}, \"{unit}\")")); + } + + [Test] + public void Datevalue() + { + Object actual = XLWorkbook.EvaluateExpr("DateValue(\"8/22/2008\")"); + Assert.AreEqual(39682, actual); + } + + [Test] + public void Day() + { + Object actual = XLWorkbook.EvaluateExpr("Day(\"8/22/2008\")"); + Assert.AreEqual(22, actual); + } + + [Test] + public void Days() + { + Object actual = XLWorkbook.EvaluateExpr("DAYS(DATE(2016,10,1),DATE(1992,2,29))"); + Assert.AreEqual(8981, actual); + + actual = XLWorkbook.EvaluateExpr("DAYS(\"2016-10-1\",\"1992-2-29\")"); + Assert.AreEqual(8981, actual); + } + + [Test] + public void DayWithDifferentCulture() + { + CultureInfo ci = new CultureInfo(CultureInfo.InvariantCulture.LCID); + ci.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy"; + Thread.CurrentThread.CurrentCulture = ci; + Object actual = XLWorkbook.EvaluateExpr("Day(\"1/6/2008\")"); + Assert.AreEqual(1, actual); + } + + [Test] + public void Days360_Default() + { + Object actual = XLWorkbook.EvaluateExpr("Days360(\"1/30/2008\", \"2/1/2008\")"); + Assert.AreEqual(1, actual); + } + + [Test] + public void Days360_Europe1() + { + Object actual = XLWorkbook.EvaluateExpr("DAYS360(\"1/1/2008\", \"3/31/2008\",TRUE)"); + Assert.AreEqual(89, actual); + } + + [Test] + public void Days360_Europe2() + { + Object actual = XLWorkbook.EvaluateExpr("DAYS360(\"3/31/2008\", \"1/1/2008\",TRUE)"); + Assert.AreEqual(-89, actual); + } + + [Test] + public void Days360_US1() + { + Object actual = XLWorkbook.EvaluateExpr("DAYS360(\"1/1/2008\", \"3/31/2008\",FALSE)"); + Assert.AreEqual(90, actual); + } + + [Test] + public void Days360_US2() + { + Object actual = XLWorkbook.EvaluateExpr("DAYS360(\"3/31/2008\", \"1/1/2008\",FALSE)"); + Assert.AreEqual(-89, actual); + } + + [Test] + public void EDate_Negative1() + { + Object actual = XLWorkbook.EvaluateExpr("EDate(\"3/1/2008\", -1)"); + Assert.AreEqual(new DateTime(2008, 2, 1), actual); + } + + [Test] + public void EDate_Negative2() + { + Object actual = XLWorkbook.EvaluateExpr("EDate(\"3/31/2008\", -1)"); + Assert.AreEqual(new DateTime(2008, 2, 29), actual); + } + + [Test] + public void EDate_Positive1() + { + Object actual = XLWorkbook.EvaluateExpr("EDate(\"3/1/2008\", 1)"); + Assert.AreEqual(new DateTime(2008, 4, 1), actual); + } + + [Test] + public void EDate_Positive2() + { + Object actual = XLWorkbook.EvaluateExpr("EDate(\"3/31/2008\", 1)"); + Assert.AreEqual(new DateTime(2008, 4, 30), actual); + } + + [Test] + public void EOMonth_Negative() + { + Object actual = XLWorkbook.EvaluateExpr("EOMonth(\"3/1/2008\", -1)"); + Assert.AreEqual(new DateTime(2008, 2, 29), actual); + } + + [Test] + public void EOMonth_Positive() + { + Object actual = XLWorkbook.EvaluateExpr("EOMonth(\"3/31/2008\", 1)"); + Assert.AreEqual(new DateTime(2008, 4, 30), actual); + } + + [Test] + public void Hour() + { + Object actual = XLWorkbook.EvaluateExpr("Hour(\"8/22/2008 3:30:45 PM\")"); + Assert.AreEqual(15, actual); + } + + [Test] + public void Minute() + { + Object actual = XLWorkbook.EvaluateExpr("Minute(\"8/22/2008 3:30:45 AM\")"); + Assert.AreEqual(30, actual); + } + + [Test] + public void Month() + { + Object actual = XLWorkbook.EvaluateExpr("Month(\"8/22/2008\")"); + Assert.AreEqual(8, actual); + } + + [Test] + public void IsoWeekNum() + { + Object actual = XLWorkbook.EvaluateExpr("ISOWEEKNUM(DATEVALUE(\"2012-3-9\"))"); + Assert.AreEqual(10, actual); + + actual = XLWorkbook.EvaluateExpr("ISOWEEKNUM(DATE(2012,12,31))"); + Assert.AreEqual(1, actual); + } + + [Test] + public void Networkdays_MultipleHolidaysGiven() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Date") + .CellBelow().SetValue(new DateTime(2008, 10, 1)) + .CellBelow().SetValue(new DateTime(2009, 3, 1)) + .CellBelow().SetValue(new DateTime(2008, 11, 26)) + .CellBelow().SetValue(new DateTime(2008, 12, 4)) + .CellBelow().SetValue(new DateTime(2009, 1, 21)); + Object actual = ws.Evaluate("Networkdays(A2,A3,A4:A6)"); + Assert.AreEqual(105, actual); + } + + [Test] + public void Networkdays_NoHolidaysGiven() + { + Object actual = XLWorkbook.EvaluateExpr("Networkdays(\"10/01/2008\", \"3/01/2009\")"); + Assert.AreEqual(108, actual); + } + + [Test] + public void Networkdays_NegativeResult() + { + Object actual = XLWorkbook.EvaluateExpr("Networkdays(\"3/01/2009\", \"10/01/2008\")"); + Assert.AreEqual(-108, actual); + + actual = XLWorkbook.EvaluateExpr("Networkdays(\"2016-01-01\", \"2015-12-23\")"); + Assert.AreEqual(-8, actual); + } + + [Test] + public void Networkdays_OneHolidaysGiven() + { + Object actual = XLWorkbook.EvaluateExpr("Networkdays(\"10/01/2008\", \"3/01/2009\", \"11/26/2008\")"); + Assert.AreEqual(107, actual); + } + + [Test] + public void Second() + { + Object actual = XLWorkbook.EvaluateExpr("Second(\"8/22/2008 3:30:45 AM\")"); + Assert.AreEqual(45, actual); + } + + [Test] + public void Time() + { + Object actual = XLWorkbook.EvaluateExpr("Time(1,2,3)"); + Assert.AreEqual(new TimeSpan(1, 2, 3), actual); + } + + [Test] + public void TimeValue1() + { + Object actual = XLWorkbook.EvaluateExpr("TimeValue(\"2:24 AM\")"); + Assert.IsTrue(XLHelper.AreEqual(0.1, (double)actual)); + } + + [Test] + public void TimeValue2() + { + Object actual = XLWorkbook.EvaluateExpr("TimeValue(\"22-Aug-2008 6:35 AM\")"); + Assert.IsTrue(XLHelper.AreEqual(0.27430555555555558, (double)actual)); + } + + [Test] + public void Today() + { + Object actual = XLWorkbook.EvaluateExpr("Today()"); + Assert.AreEqual(DateTime.Now.Date, actual); + } + + [Test] + public void Weekday_1() + { + Object actual = XLWorkbook.EvaluateExpr("Weekday(\"2/14/2008\", 1)"); + Assert.AreEqual(5, actual); + } + + [Test] + public void Weekday_2() + { + Object actual = XLWorkbook.EvaluateExpr("Weekday(\"2/14/2008\", 2)"); + Assert.AreEqual(4, actual); + } + + [Test] + public void Weekday_3() + { + Object actual = XLWorkbook.EvaluateExpr("Weekday(\"2/14/2008\", 3)"); + Assert.AreEqual(3, actual); + } + + [Test] + public void Weekday_Omitted() + { + Object actual = XLWorkbook.EvaluateExpr("Weekday(\"2/14/2008\")"); + Assert.AreEqual(5, actual); + } + + [Test] + public void Weeknum_1() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2000\", 1)")); + } + + [Test] + public void Weeknum_10() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2004\", 2)")); + } + + [Test] + public void Weeknum_11() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2005\", 1)")); + } + + [Test] + public void Weeknum_12() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2005\", 2)")); + } + + [Test] + public void Weeknum_13() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2006\", 1)")); + } + + [Test] + public void Weeknum_14() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2006\", 2)")); + } + + [Test] + public void Weeknum_15() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2007\", 1)")); + } + + [Test] + public void Weeknum_16() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2007\", 2)")); + } + + [Test] + public void Weeknum_17() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2008\", 1)")); + } + + [Test] + public void Weeknum_18() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2008\", 2)")); + } + + [Test] + public void Weeknum_19() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2009\", 1)")); + } + + [Test] + public void Weeknum_2() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2000\", 2)")); + } + + [Test] + public void Weeknum_20() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2009\", 2)")); + } + + [Test] + public void Weeknum_3() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2001\", 1)")); + } + + [Test] + public void Weeknum_4() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2001\", 2)")); + } + + [Test] + public void Weeknum_5() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2002\", 1)")); + } + + [Test] + public void Weeknum_6() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2002\", 2)")); + } + + [Test] + public void Weeknum_7() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2003\", 1)")); + } + + [Test] + public void Weeknum_8() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2003\", 2)")); + } + + [Test] + public void Weeknum_9() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2004\", 1)")); + } + + [Test] + public void Weeknum_Default() + { + Object actual = XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2008\")"); + Assert.AreEqual(11, actual); + } + + [Test] + public void Workdays_MultipleHolidaysGiven() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Date") + .CellBelow().SetValue(new DateTime(2008, 10, 1)) + .CellBelow().SetValue(151) + .CellBelow().SetValue(new DateTime(2008, 11, 26)) + .CellBelow().SetValue(new DateTime(2008, 12, 4)) + .CellBelow().SetValue(new DateTime(2009, 1, 21)); + Object actual = ws.Evaluate("Workday(A2,A3,A4:A6)"); + Assert.AreEqual(new DateTime(2009, 5, 5), actual); + } + + [Test] + public void Workdays_NoHolidaysGiven() + { + Object actual = XLWorkbook.EvaluateExpr("Workday(\"10/01/2008\", 151)"); + Assert.AreEqual(new DateTime(2009, 4, 30), actual); + + actual = XLWorkbook.EvaluateExpr("Workday(\"2016-01-01\", -10)"); + Assert.AreEqual(new DateTime(2015, 12, 18), actual); + } + + [Test] + public void Workdays_OneHolidaysGiven() + { + Object actual = XLWorkbook.EvaluateExpr("Workday(\"10/01/2008\", 152, \"11/26/2008\")"); + Assert.AreEqual(new DateTime(2009, 5, 4), actual); + } + + [Test] + public void Year() + { + Object actual = XLWorkbook.EvaluateExpr("Year(\"8/22/2008\")"); + Assert.AreEqual(2008, actual); + } + + [Test] + public void Yearfrac_1_base0() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2008\",0)"); + Assert.IsTrue(XLHelper.AreEqual(0.25, (double)actual)); + } + + [Test] + public void Yearfrac_1_base1() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2008\",1)"); + Assert.IsTrue(XLHelper.AreEqual(0.24590163934426229, (double)actual)); + } + + [Test] + public void Yearfrac_1_base2() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2008\",2)"); + Assert.IsTrue(XLHelper.AreEqual(0.25, (double)actual)); + } + + [Test] + public void Yearfrac_1_base3() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2008\",3)"); + Assert.IsTrue(XLHelper.AreEqual(0.24657534246575341, (double)actual)); + } + + [Test] + public void Yearfrac_1_base4() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2008\",4)"); + Assert.IsTrue(XLHelper.AreEqual(0.24722222222222223, (double)actual)); + } + + [Test] + public void Yearfrac_2_base0() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2013\",0)"); + Assert.IsTrue(XLHelper.AreEqual(5.25, (double)actual)); + } + + [Test] + public void Yearfrac_2_base1() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2013\",1)"); + Assert.IsTrue(XLHelper.AreEqual(5.24452554744526, (double)actual)); + } + + [Test] + public void Yearfrac_2_base2() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2013\",2)"); + Assert.IsTrue(XLHelper.AreEqual(5.32222222222222, (double)actual)); + } + + [Test] + public void Yearfrac_2_base3() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2013\",3)"); + Assert.IsTrue(XLHelper.AreEqual(5.24931506849315, (double)actual)); + } + + [Test] + public void Yearfrac_2_base4() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2013\",4)"); + Assert.IsTrue(XLHelper.AreEqual(5.24722222222222, (double)actual)); + } + } +} diff --git a/ClosedXML_Tests/Excel/CalcEngine/FormulaCachingTests.cs b/ClosedXML_Tests/Excel/CalcEngine/FormulaCachingTests.cs new file mode 100644 index 0000000..221914c --- /dev/null +++ b/ClosedXML_Tests/Excel/CalcEngine/FormulaCachingTests.cs @@ -0,0 +1,391 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Linq; + +namespace ClosedXML_Tests.Excel.CalcEngine +{ + [TestFixture] + public class FormulaCachingTests + { + [Test] + public void NewWorkbookDoesNotNeedRecalculation() + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + var cell = sheet.Cell(1, 1); + + Assert.AreEqual(0, wb.RecalculationCounter); + Assert.IsFalse(cell.NeedsRecalculation); + } + } + + [Test] + public void EditCellCausesCounterIncreasing() + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + var cell = sheet.Cell(1, 1); + cell.Value = "1234567"; + + Assert.Greater(wb.RecalculationCounter, 0); + } + } + + [Test] + public void StaticCellDoesNotNeedRecalculation() + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + var cell = sheet.Cell(1, 1); + cell.Value = "1234567"; + + Assert.IsFalse(cell.NeedsRecalculation); + } + } + + [Test] + public void EditCellInvalidatesDependentCells() + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + var cell = sheet.Cell(1, 1); + var dependentCell = sheet.Cell(2, 1); + dependentCell.FormulaA1 = "=A1"; + var _ = dependentCell.Value; + + cell.Value = "1234567"; + + Assert.IsTrue(dependentCell.NeedsRecalculation); + } + } + + [Test] + public void EditFormulaA1InvalidatesDependentCells() + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + var a1 = sheet.Cell("A1"); + var a2 = sheet.Cell("A2"); + var a3 = sheet.Cell("A3"); + var a4 = sheet.Cell("A4"); + a2.FormulaA1 = "=A1*10"; + a3.FormulaA1 = "=A2*10"; + a4.FormulaA1 = "=SUM(A1:A3)"; + a1.Value = 15; + + var res1 = a4.Value; + a2.FormulaA1 = "=A1*20"; + var res2 = a4.Value; + + Assert.AreEqual(15 + 150 + 1500, res1); + Assert.AreEqual(15 + 300 + 3000, res2); + } + } + + [Test] + public void EditFormulaR1C1InvalidatesDependentCells() + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + var a1 = sheet.Cell("A1"); + var a2 = sheet.Cell("A2"); + var a3 = sheet.Cell("A3"); + var a4 = sheet.Cell("A4"); + a2.FormulaA1 = "=A1*10"; + a3.FormulaA1 = "=A2*10"; + a4.FormulaA1 = "=SUM(A1:A3)"; + a1.Value = 15; + + var res1 = a4.Value; + a2.FormulaR1C1 = "=R[-1]C*2"; + var res2 = a4.Value; + + Assert.AreEqual(15 + 150 + 1500, res1); + Assert.AreEqual(15 + 30 + 300, res2); + } + } + + [Test] + public void InsertRowInvalidatesValues() + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + var a4 = sheet.Cell("A4"); + a4.FormulaA1 = "=COUNTBLANK(A1:A3)"; + + var res1 = a4.Value; + sheet.Row(2).InsertRowsAbove(2); + var res2 = a4.Value; + + Assert.AreEqual(3, res1); + Assert.AreEqual(5, res2); + } + } + + [Test] + public void DeleteRowInvalidatesValues() + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + var a4 = sheet.Cell("A4"); + a4.FormulaA1 = "=COUNTBLANK(A1:A3)"; + + var res1 = a4.Value; + sheet.Row(2).Delete(); + var res2 = a4.Value; + + Assert.AreEqual(3, res1); + Assert.AreEqual(2, res2); + } + } + + [Test] + public void ChainedCalculationPreservesIntermediateValues() + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + var a1 = sheet.Cell("A1"); + var a2 = sheet.Cell("A2"); + var a3 = sheet.Cell("A3"); + var a4 = sheet.Cell("A4"); + a2.FormulaA1 = "=A1*10"; + a3.FormulaA1 = "=A2*10"; + a4.FormulaA1 = "=SUM(A1:A3)"; + + a1.Value = 15; + var res = a4.Value; + + Assert.AreEqual(15 + 150 + 1500, res); + Assert.IsFalse(a4.NeedsRecalculation); + Assert.IsFalse(a3.NeedsRecalculation); + Assert.IsFalse(a2.NeedsRecalculation); + Assert.AreEqual(150, a2.CachedValue); + Assert.AreEqual(1500, a3.CachedValue); + Assert.AreEqual(15 + 150 + 1500, a4.CachedValue); + } + } + + [Test] + public void EditingAffectsDependentCells() + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + var a1 = sheet.Cell("A1"); + var a2 = sheet.Cell("A2"); + var a3 = sheet.Cell("A3"); + var a4 = sheet.Cell("A4"); + a2.FormulaA1 = "=A1*10"; + a3.FormulaA1 = "=A2*10"; + a4.FormulaA1 = "=SUM(A1:A3)"; + a1.Value = 15; + + var res1 = a4.Value; + a1.Value = 20; + var res2 = a4.Value; + + Assert.AreEqual(15 + 150 + 1500, res1); + Assert.AreEqual(20 + 200 + 2000, res2); + } + } + + [Test] + [TestCase("C4", new string[] { "C5" })] + [TestCase("D4", new string[] { })] + [TestCase("A1", new string[] { "A2", "A3", "A4", "C1", "C2", "C3", "C5" })] + [TestCase("B2", new string[] { "B3", "B4", "C2", "C3", "C5" })] + [TestCase("C2", new string[] { "C5" })] + public void EditingDoesNotAffectNonDependingCells(string changedCell, string[] affectedCells) + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + sheet.Cell("A2").FormulaA1 = "A1+1"; + sheet.Cell("A3").FormulaA1 = "SUM(A1:A2)"; + sheet.Cell("A4").FormulaA1 = "SUM(A1:A3)"; + sheet.Cell("B2").FormulaA1 = "B1+1"; + sheet.Cell("B3").FormulaA1 = "SUM(B1:B2)"; + sheet.Cell("B4").FormulaA1 = "SUM(B1:B3)"; + sheet.Cell("C1").FormulaA1 = "SUM(A1:B1)"; + sheet.Cell("C2").FormulaA1 = "SUM(A2:B2)"; + sheet.Cell("C3").FormulaA1 = "SUM(A3:B3)"; + sheet.Cell("C5").FormulaA1 = "SUM($A$1:$C$4)"; + sheet.RecalculateAllFormulas(); + var allCells = sheet.CellsUsed(); + + sheet.Cell(changedCell).Value = 100; + var modifiedCells = allCells.Where(cell => cell.NeedsRecalculation); + + Assert.AreEqual(affectedCells.Length, modifiedCells.Count()); + foreach (var cellAddress in affectedCells) + { + Assert.IsTrue(modifiedCells.Any(cell => cell.Address.ToString() == cellAddress), + string.Format("Cell {0} is expected to need recalculation, but it does not", cellAddress)); + } + } + } + + [Test] + public void CircularReferenceFailsCalculating() + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + var a1 = sheet.Cell("A1"); + var a2 = sheet.Cell("A2"); + var a3 = sheet.Cell("A3"); + var a4 = sheet.Cell("A4"); + + a2.FormulaA1 = "=A1*10"; + a3.FormulaA1 = "=A2*10"; + a4.FormulaA1 = "=A3*10"; + a1.FormulaA1 = "A2+A3+A4"; + + var getValueA1 = new TestDelegate(() => { var v = a1.Value; }); + var getValueA2 = new TestDelegate(() => { var v = a2.Value; }); + var getValueA3 = new TestDelegate(() => { var v = a3.Value; }); + var getValueA4 = new TestDelegate(() => { var v = a4.Value; }); + + Assert.Throws(typeof(InvalidOperationException), getValueA1); + Assert.Throws(typeof(InvalidOperationException), getValueA2); + Assert.Throws(typeof(InvalidOperationException), getValueA3); + Assert.Throws(typeof(InvalidOperationException), getValueA4); + } + } + + [Test] + public void CircularReferenceRecalculationNeededDoesNotFail() + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + var a1 = sheet.Cell("A1"); + var a2 = sheet.Cell("A2"); + var a3 = sheet.Cell("A3"); + var a4 = sheet.Cell("A4"); + + a2.FormulaA1 = "=A1*10"; + a3.FormulaA1 = "=A2*10"; + a4.FormulaA1 = "=A3*10"; + var _ = a4.Value; + a1.FormulaA1 = "=SUM(A2:A4)"; + + var recalcNeededA1 = a1.NeedsRecalculation; + var recalcNeededA2 = a2.NeedsRecalculation; + var recalcNeededA3 = a3.NeedsRecalculation; + var recalcNeededA4 = a4.NeedsRecalculation; + + Assert.IsTrue(recalcNeededA1); + Assert.IsTrue(recalcNeededA2); + Assert.IsTrue(recalcNeededA3); + Assert.IsTrue(recalcNeededA4); + } + } + + [Test] + public void DeleteWorksheetInvalidatesValues() + { + using (var wb = new XLWorkbook()) + { + var sheet1 = wb.Worksheets.Add("Sheet1"); + var sheet2 = wb.Worksheets.Add("Sheet2"); + var sheet1_a1 = sheet1.Cell("A1"); + var sheet2_a1 = sheet2.Cell("A1"); + sheet1_a1.FormulaA1 = "Sheet2!A1"; + sheet2_a1.Value = "TestValue"; + + var val1 = sheet1_a1.Value; + sheet2.Delete(); + var getValue = new TestDelegate(() => { var val2 = sheet1_a1.Value; }); + + Assert.AreEqual("TestValue", val1.ToString()); + Assert.Throws(typeof(ArgumentOutOfRangeException), getValue); + } + } + + [Test] + public void TestValueCellsCachedValue() + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + var cell = sheet.Cell(1, 1); + + var date = new DateTime(2018, 4, 19); ; + cell.Value = date; + + Assert.AreEqual(XLDataType.DateTime, cell.DataType); + Assert.AreEqual(date, cell.CachedValue); + + cell.DataType = XLDataType.Number; + + Assert.AreEqual(XLDataType.Number, cell.DataType); + Assert.AreEqual(date.ToOADate(), cell.CachedValue); + } + } + + [Test] + public void CachedValueToExternalWorkbook() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\ExternalLinks\WorkbookWithExternalLink.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + var cell = ws.Cell("B2"); + Assert.IsFalse(cell.NeedsRecalculation); + Assert.IsTrue(cell.HasFormula); + + // This will fail when we start supporting external links + Assert.IsTrue(cell.FormulaA1.StartsWith("[1]")); + + Assert.AreEqual("hello world", cell.CachedValue); + Assert.AreEqual("hello world", cell.Value); + + Assert.AreEqual(11, ws.Evaluate("LEN(B2)")); + + Assert.Throws(() => wb.RecalculateAllFormulas()); + } + } + + [Test] + public void ChangingDataTypeChangesCachedValue() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Test"); + ws.Cell(1, 1).Value = new DateTime(2019, 1, 1, 14, 0, 0); + ws.Cell(1, 2).Value = new DateTime(2019, 1, 1, 17, 45, 0); + var cell = ws.Cell(1, 3); + cell.FormulaA1 = "=B1-A1"; + cell.Style.DateFormat.Format = "hh:mm"; + + Assert.IsNull(cell.CachedValue); + + double value = (double)cell.Value; + Assert.AreEqual(value, cell.CachedValue); + + cell.DataType = XLDataType.DateTime; + Assert.AreEqual(DateTime.FromOADate(value), cell.CachedValue); + Assert.AreEqual("03:45", cell.GetFormattedString()); + + cell.DataType = XLDataType.Number; + Assert.AreEqual(value, (double)cell.CachedValue, 1e-10); + Assert.AreEqual("0.15625", cell.GetFormattedString()); + + cell.DataType = XLDataType.TimeSpan; + Assert.AreEqual(TimeSpan.FromDays(value), (TimeSpan)cell.CachedValue); + Assert.AreEqual("03:45:00", cell.GetFormattedString()); // I think the seconds in this string is due to a shortcoming in the ExcelNumberFormat library + } + } + } +} diff --git a/ClosedXML_Tests/Excel/CalcEngine/FunctionsTests.cs b/ClosedXML_Tests/Excel/CalcEngine/FunctionsTests.cs new file mode 100644 index 0000000..3773224 --- /dev/null +++ b/ClosedXML_Tests/Excel/CalcEngine/FunctionsTests.cs @@ -0,0 +1,754 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; + +namespace ClosedXML_Tests.Excel.CalcEngine +{ + [TestFixture] + public class FunctionsTests + { + [SetUp] + public void Init() + { + // Make sure tests run on a deterministic culture + System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); + } + + [Test] + public void Asc() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Asc(""Text"")"); + Assert.AreEqual("Text", actual); + } + + [Test] + public void Clean() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(String.Format(@"Clean(""A{0}B"")", Environment.NewLine)); + Assert.AreEqual("AB", actual); + } + + [Test] + public void Combin() + { + object actual1 = XLWorkbook.EvaluateExpr("Combin(200, 2)"); + Assert.AreEqual(19900.0, actual1); + + object actual2 = XLWorkbook.EvaluateExpr("Combin(20.1, 2.9)"); + Assert.AreEqual(190.0, actual2); + } + + [Test] + public void Degrees() + { + object actual1 = XLWorkbook.EvaluateExpr("Degrees(180)"); + Assert.IsTrue(Math.PI - (double)actual1 < XLHelper.Epsilon); + } + + [Test] + public void Dollar() + { + object actual = XLWorkbook.EvaluateExpr("Dollar(12345.123)"); + Assert.AreEqual(TestHelper.CurrencySymbol + "12,345.12", actual); + + actual = XLWorkbook.EvaluateExpr("Dollar(12345.123, 1)"); + Assert.AreEqual(TestHelper.CurrencySymbol + "12,345.1", actual); + } + + [Test] + public void Even() + { + object actual = XLWorkbook.EvaluateExpr("Even(3)"); + Assert.AreEqual(4, actual); + + actual = XLWorkbook.EvaluateExpr("Even(2)"); + Assert.AreEqual(2, actual); + + actual = XLWorkbook.EvaluateExpr("Even(-1)"); + Assert.AreEqual(-2, actual); + + actual = XLWorkbook.EvaluateExpr("Even(-2)"); + Assert.AreEqual(-2, actual); + + actual = XLWorkbook.EvaluateExpr("Even(0)"); + Assert.AreEqual(0, actual); + + actual = XLWorkbook.EvaluateExpr("Even(1.5)"); + Assert.AreEqual(2, actual); + + actual = XLWorkbook.EvaluateExpr("Even(2.01)"); + Assert.AreEqual(4, actual); + } + + [Test] + public void Exact() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr("Exact(\"A\", \"A\")"); + Assert.AreEqual(true, actual); + + actual = XLWorkbook.EvaluateExpr("Exact(\"A\", \"a\")"); + Assert.AreEqual(false, actual); + } + + [Test] + public void Fact() + { + object actual = XLWorkbook.EvaluateExpr("Fact(5.9)"); + Assert.AreEqual(120.0, actual); + } + + [Test] + public void FactDouble() + { + object actual1 = XLWorkbook.EvaluateExpr("FactDouble(6)"); + Assert.AreEqual(48.0, actual1); + object actual2 = XLWorkbook.EvaluateExpr("FactDouble(7)"); + Assert.AreEqual(105.0, actual2); + } + + [Test] + public void Fixed() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr("Fixed(12345.123)"); + Assert.AreEqual("12,345.12", actual); + + actual = XLWorkbook.EvaluateExpr("Fixed(12345.123, 1)"); + Assert.AreEqual("12,345.1", actual); + + actual = XLWorkbook.EvaluateExpr("Fixed(12345.123, 1, TRUE)"); + Assert.AreEqual("12345.1", actual); + } + + [Test] + public void Formula_from_another_sheet() + { + var wb = new XLWorkbook(); + IXLWorksheet ws1 = wb.AddWorksheet("ws1"); + ws1.FirstCell().SetValue(1).CellRight().SetFormulaA1("A1 + 1"); + IXLWorksheet ws2 = wb.AddWorksheet("ws2"); + ws2.FirstCell().SetFormulaA1("ws1!B1 + 1"); + object v = ws2.FirstCell().Value; + Assert.AreEqual(3.0, v); + } + + [Test] + public void Gcd() + { + object actual = XLWorkbook.EvaluateExpr("Gcd(24, 36)"); + Assert.AreEqual(12, actual); + + object actual1 = XLWorkbook.EvaluateExpr("Gcd(5, 0)"); + Assert.AreEqual(5, actual1); + + object actual2 = XLWorkbook.EvaluateExpr("Gcd(0, 5)"); + Assert.AreEqual(5, actual2); + + object actual3 = XLWorkbook.EvaluateExpr("Gcd(240, 360, 30)"); + Assert.AreEqual(30, actual3); + } + + [Test] + public void Lcm() + { + object actual = XLWorkbook.EvaluateExpr("Lcm(24, 36)"); + Assert.AreEqual(72, actual); + + object actual1 = XLWorkbook.EvaluateExpr("Lcm(5, 0)"); + Assert.AreEqual(0, actual1); + + object actual2 = XLWorkbook.EvaluateExpr("Lcm(0, 5)"); + Assert.AreEqual(0, actual2); + + object actual3 = XLWorkbook.EvaluateExpr("Lcm(240, 360, 30)"); + Assert.AreEqual(720, actual3); + } + + [Test] + public void MDetem() + { + IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); + ws.Cell("A1").SetValue(2).CellRight().SetValue(4); + ws.Cell("A2").SetValue(3).CellRight().SetValue(5); + + Object actual; + + ws.Cell("A5").FormulaA1 = "MDeterm(A1:B2)"; + actual = ws.Cell("A5").Value; + + Assert.IsTrue(XLHelper.AreEqual(-2.0, (double)actual)); + + ws.Cell("A6").FormulaA1 = "Sum(A5)"; + actual = ws.Cell("A6").Value; + + Assert.IsTrue(XLHelper.AreEqual(-2.0, (double)actual)); + + ws.Cell("A7").FormulaA1 = "Sum(MDeterm(A1:B2))"; + actual = ws.Cell("A7").Value; + + Assert.IsTrue(XLHelper.AreEqual(-2.0, (double)actual)); + } + + [Test] + public void MInverse() + { + IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); + ws.Cell("A1").SetValue(1).CellRight().SetValue(2).CellRight().SetValue(1); + ws.Cell("A2").SetValue(3).CellRight().SetValue(4).CellRight().SetValue(-1); + ws.Cell("A3").SetValue(0).CellRight().SetValue(2).CellRight().SetValue(0); + + Object actual; + + ws.Cell("A5").FormulaA1 = "MInverse(A1:C3)"; + actual = ws.Cell("A5").Value; + + Assert.IsTrue(XLHelper.AreEqual(0.25, (double)actual)); + + ws.Cell("A6").FormulaA1 = "Sum(A5)"; + actual = ws.Cell("A6").Value; + + Assert.IsTrue(XLHelper.AreEqual(0.25, (double)actual)); + + ws.Cell("A7").FormulaA1 = "Sum(MInverse(A1:C3))"; + actual = ws.Cell("A7").Value; + + Assert.IsTrue(XLHelper.AreEqual(0.5, (double)actual)); + } + + [Test] + public void MMult() + { + IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); + ws.Cell("A1").SetValue(2).CellRight().SetValue(4); + ws.Cell("A2").SetValue(3).CellRight().SetValue(5); + ws.Cell("A3").SetValue(2).CellRight().SetValue(4); + ws.Cell("A4").SetValue(3).CellRight().SetValue(5); + + Object actual; + + ws.Cell("A5").FormulaA1 = "MMult(A1:B2, A3:B4)"; + actual = ws.Cell("A5").Value; + + Assert.AreEqual(16.0, actual); + + ws.Cell("A6").FormulaA1 = "Sum(A5)"; + actual = ws.Cell("A6").Value; + + Assert.AreEqual(16.0, actual); + + ws.Cell("A7").FormulaA1 = "Sum(MMult(A1:B2, A3:B4))"; + actual = ws.Cell("A7").Value; + + Assert.AreEqual(102.0, actual); + } + + [Test] + public void Mod() + { + object actual = XLWorkbook.EvaluateExpr("Mod(3, 2)"); + Assert.AreEqual(1, actual); + + object actual1 = XLWorkbook.EvaluateExpr("Mod(-3, 2)"); + Assert.AreEqual(1, actual1); + + object actual2 = XLWorkbook.EvaluateExpr("Mod(3, -2)"); + Assert.AreEqual(-1, actual2); + + object actual3 = XLWorkbook.EvaluateExpr("Mod(-3, -2)"); + Assert.AreEqual(-1, actual3); + } + + [Test] + public void Multinomial() + { + object actual = XLWorkbook.EvaluateExpr("Multinomial(2,3,4)"); + Assert.AreEqual(1260.0, actual); + } + + [Test] + public void Odd() + { + object actual = XLWorkbook.EvaluateExpr("Odd(1.5)"); + Assert.AreEqual(3, actual); + + object actual1 = XLWorkbook.EvaluateExpr("Odd(3)"); + Assert.AreEqual(3, actual1); + + object actual2 = XLWorkbook.EvaluateExpr("Odd(2)"); + Assert.AreEqual(3, actual2); + + object actual3 = XLWorkbook.EvaluateExpr("Odd(-1)"); + Assert.AreEqual(-1, actual3); + + object actual4 = XLWorkbook.EvaluateExpr("Odd(-2)"); + Assert.AreEqual(-3, actual4); + + actual = XLWorkbook.EvaluateExpr("Odd(0)"); + Assert.AreEqual(1, actual); + } + + [Test] + public void Product() + { + object actual = XLWorkbook.EvaluateExpr("Product(2,3,4)"); + Assert.AreEqual(24.0, actual); + } + + [Test] + public void Quotient() + { + object actual = XLWorkbook.EvaluateExpr("Quotient(5,2)"); + Assert.AreEqual(2, actual); + + actual = XLWorkbook.EvaluateExpr("Quotient(4.5,3.1)"); + Assert.AreEqual(1, actual); + + actual = XLWorkbook.EvaluateExpr("Quotient(-10,3)"); + Assert.AreEqual(-3, actual); + } + + [Test] + public void Radians() + { + object actual = XLWorkbook.EvaluateExpr("Radians(270)"); + Assert.IsTrue(Math.Abs(4.71238898038469 - (double)actual) < XLHelper.Epsilon); + } + + [Test] + public void Roman() + { + object actual = XLWorkbook.EvaluateExpr("Roman(3046, 1)"); + Assert.AreEqual("MMMXLVI", actual); + + actual = XLWorkbook.EvaluateExpr("Roman(270)"); + Assert.AreEqual("CCLXX", actual); + + actual = XLWorkbook.EvaluateExpr("Roman(3999, true)"); + Assert.AreEqual("MMMCMXCIX", actual); + } + + [Test] + public void Round() + { + object actual = XLWorkbook.EvaluateExpr("Round(2.15, 1)"); + Assert.AreEqual(2.2, actual); + + actual = XLWorkbook.EvaluateExpr("Round(2.149, 1)"); + Assert.AreEqual(2.1, actual); + + actual = XLWorkbook.EvaluateExpr("Round(-1.475, 2)"); + Assert.AreEqual(-1.48, actual); + + actual = XLWorkbook.EvaluateExpr("Round(21.5, -1)"); + Assert.AreEqual(20.0, actual); + + actual = XLWorkbook.EvaluateExpr("Round(626.3, -3)"); + Assert.AreEqual(1000.0, actual); + + actual = XLWorkbook.EvaluateExpr("Round(1.98, -1)"); + Assert.AreEqual(0.0, actual); + + actual = XLWorkbook.EvaluateExpr("Round(-50.55, -2)"); + Assert.AreEqual(-100.0, actual); + + actual = XLWorkbook.EvaluateExpr("ROUND(59 * 0.535, 2)"); // (59 * 0.535) = 31.565 + Assert.AreEqual(31.57, actual); + + actual = XLWorkbook.EvaluateExpr("ROUND(59 * -0.535, 2)"); // (59 * -0.535) = -31.565 + Assert.AreEqual(-31.57, actual); + } + + [Test] + public void RoundDown() + { + object actual = XLWorkbook.EvaluateExpr("RoundDown(3.2, 0)"); + Assert.AreEqual(3.0, actual); + + actual = XLWorkbook.EvaluateExpr("RoundDown(76.9, 0)"); + Assert.AreEqual(76.0, actual); + + actual = XLWorkbook.EvaluateExpr("RoundDown(3.14159, 3)"); + Assert.AreEqual(3.141, actual); + + actual = XLWorkbook.EvaluateExpr("RoundDown(-3.14159, 1)"); + Assert.AreEqual(-3.1, actual); + + actual = XLWorkbook.EvaluateExpr("RoundDown(31415.92654, -2)"); + Assert.AreEqual(31400.0, actual); + + actual = XLWorkbook.EvaluateExpr("RoundDown(0, 3)"); + Assert.AreEqual(0.0, actual); + } + + [Test] + public void RoundUp() + { + object actual = XLWorkbook.EvaluateExpr("RoundUp(3.2, 0)"); + Assert.AreEqual(4.0, actual); + + actual = XLWorkbook.EvaluateExpr("RoundUp(76.9, 0)"); + Assert.AreEqual(77.0, actual); + + actual = XLWorkbook.EvaluateExpr("RoundUp(3.14159, 3)"); + Assert.AreEqual(3.142, actual); + + actual = XLWorkbook.EvaluateExpr("RoundUp(-3.14159, 1)"); + Assert.AreEqual(-3.2, actual); + + actual = XLWorkbook.EvaluateExpr("RoundUp(31415.92654, -2)"); + Assert.AreEqual(31500.0, actual); + + actual = XLWorkbook.EvaluateExpr("RoundUp(0, 3)"); + Assert.AreEqual(0.0, actual); + } + + [Test] + public void SeriesSum() + { + object actual = XLWorkbook.EvaluateExpr("SERIESSUM(2,3,4,5)"); + Assert.AreEqual(40.0, actual); + + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A2").FormulaA1 = "PI()/4"; + ws.Cell("A3").Value = 1; + ws.Cell("A4").FormulaA1 = "-1/FACT(2)"; + ws.Cell("A5").FormulaA1 = "1/FACT(4)"; + ws.Cell("A6").FormulaA1 = "-1/FACT(6)"; + + actual = ws.Evaluate("SERIESSUM(A2,0,2,A3:A6)"); + Assert.IsTrue(Math.Abs(0.70710321482284566 - (double)actual) < XLHelper.Epsilon); + } + + [Test] + public void SqrtPi() + { + object actual = XLWorkbook.EvaluateExpr("SqrtPi(1)"); + Assert.IsTrue(Math.Abs(1.7724538509055159 - (double)actual) < XLHelper.Epsilon); + + actual = XLWorkbook.EvaluateExpr("SqrtPi(2)"); + Assert.IsTrue(Math.Abs(2.5066282746310002 - (double)actual) < XLHelper.Epsilon); + } + + [Test] + public void SubtotalAverage() + { + object actual = XLWorkbook.EvaluateExpr("Subtotal(1,2,3)"); + Assert.AreEqual(2.5, actual); + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(1,""A"",3, 2)"); + Assert.AreEqual(2.5, actual); + } + + [Test] + public void SubtotalCount() + { + object actual = XLWorkbook.EvaluateExpr("Subtotal(2,2,3)"); + Assert.AreEqual(2, actual); + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(2,""A"",3)"); + Assert.AreEqual(1, actual); + } + + [Test] + public void SubtotalCountA() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr("Subtotal(3,2,3)"); + Assert.AreEqual(2.0, actual); + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(3,"""",3)"); + Assert.AreEqual(1.0, actual); + } + + [Test] + public void SubtotalMax() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(4,2,3,""A"")"); + Assert.AreEqual(3.0, actual); + } + + [Test] + public void SubtotalMin() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(5,2,3,""A"")"); + Assert.AreEqual(2.0, actual); + } + + [Test] + public void SubtotalProduct() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(6,2,3,""A"")"); + Assert.AreEqual(6.0, actual); + } + + [Test] + public void SubtotalStDev() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(7,2,3,""A"")"); + Assert.IsTrue(Math.Abs(0.70710678118654757 - (double)actual) < XLHelper.Epsilon); + } + + [Test] + public void SubtotalStDevP() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(8,2,3,""A"")"); + Assert.AreEqual(0.5, actual); + } + + [Test] + public void SubtotalSum() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(9,2,3,""A"")"); + Assert.AreEqual(5.0, actual); + } + + [Test] + public void SubtotalVar() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(10,2,3,""A"")"); + Assert.IsTrue(Math.Abs(0.5 - (double)actual) < XLHelper.Epsilon); + } + + [Test] + public void SubtotalVarP() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(11,2,3,""A"")"); + Assert.AreEqual(0.25, actual); + } + + [Test] + public void SubtotalCalc() + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet(); + ws.NamedRanges.Add("subtotalrange", "A37:A38"); + + ws.Cell("A1").Value = 2; + ws.Cell("A2").Value = 4; + ws.Cell("A3").FormulaA1 = "SUBTOTAL(9, A1:A2)"; // simple add subtotal + ws.Cell("A4").Value = 8; + ws.Cell("A5").Value = 16; + ws.Cell("A6").FormulaA1 = "SUBTOTAL(9, A4:A5)"; // simple add subtotal + ws.Cell("A7").Value = 32; + ws.Cell("A8").Value = 64; + ws.Cell("A9").FormulaA1 = "SUM(A7:A8)"; // func but not subtotal + ws.Cell("A10").Value = 128; + ws.Cell("A11").Value = 256; + ws.Cell("A12").FormulaA1 = "SUBTOTAL(1, A10:A11)"; // simple avg subtotal + ws.Cell("A13").Value = 512; + ws.Cell("A14").FormulaA1 = "SUBTOTAL(9, A1:A13)"; // subtotals in range + ws.Cell("A15").Value = 1024; + ws.Cell("A16").Value = 2048; + ws.Cell("A17").FormulaA1 = "42 + SUBTOTAL(9, A15:A16)"; // simple add subtotal in formula + ws.Cell("A18").Value = 4096; + ws.Cell("A19").FormulaA1 = "SUBTOTAL(9, A15:A18)"; // subtotals in range + ws.Cell("A20").Value = 8192; + ws.Cell("A21").Value = 16384; + ws.Cell("A22").FormulaA1 = @"32768 * SEARCH(""SUBTOTAL(9, A1:A2)"", A28)"; // subtotal literal in formula + ws.Cell("A23").FormulaA1 = "SUBTOTAL(9, A20:A22)"; // subtotal literal in formula in range + ws.Cell("A24").Value = 65536; + ws.Cell("A25").FormulaA1 = "A23"; // link to subtotal + ws.Cell("A26").FormulaA1 = "PRODUCT(SUBTOTAL(9, A24:A25), 2)"; // subtotal as parameter in func + ws.Cell("A27").Value = 131072; + ws.Cell("A28").Value = "SUBTOTAL(9, A1:A2)"; // subtotal literal + ws.Cell("A29").FormulaA1 = "SUBTOTAL(9, A27:A28)"; // subtotal literal in range + ws.Cell("A30").FormulaA1 = "SUBTOTAL(9, A31:A32)"; // simple add subtotal backward + ws.Cell("A31").Value = 262144; + ws.Cell("A32").Value = 524288; + ws.Cell("A33").FormulaA1 = "SUBTOTAL(9, A20:A32)"; // subtotals in range + ws.Cell("A34").FormulaA1 = @"SUBTOTAL(VALUE(""9""), A1:A33, A35:A41)"; // func as parameter in subtotal and many ranges + ws.Cell("A35").Value = 1048576; + ws.Cell("A36").FormulaA1 = "SUBTOTAL(9, A31:A32, A35)"; // many ranges + ws.Cell("A37").Value = 2097152; + ws.Cell("A38").Value = 4194304; + ws.Cell("A39").FormulaA1 = "SUBTOTAL(3*3, subtotalrange)"; // formula as parameter in subtotal and named range + ws.Cell("A40").Value = 8388608; + ws.Cell("A41").FormulaA1 = "PRODUCT(SUBTOTAL(A4+1, A35:A40), 2)"; // formula with link as parameter in subtotal + ws.Cell("A42").FormulaA1 = "PRODUCT(SUBTOTAL(A4+1, A35:A40), 2) + SUBTOTAL(A4+1, A35:A40)"; // two subtotals in one formula + + Assert.AreEqual(6, ws.Cell("A3").Value); + Assert.AreEqual(24, ws.Cell("A6").Value); + Assert.AreEqual(192, ws.Cell("A12").Value); + Assert.AreEqual(1118, ws.Cell("A14").Value); + Assert.AreEqual(3114, ws.Cell("A17").Value); + Assert.AreEqual(7168, ws.Cell("A19").Value); + Assert.AreEqual(57344, ws.Cell("A23").Value); + Assert.AreEqual(245760, ws.Cell("A26").Value); + Assert.AreEqual(131072, ws.Cell("A29").Value); + Assert.AreEqual(786432, ws.Cell("A30").Value); + Assert.AreEqual(1097728, ws.Cell("A33").Value); + Assert.AreEqual(16834654, ws.Cell("A34").Value); + Assert.AreEqual(1835008, ws.Cell("A36").Value); + Assert.AreEqual(6291456, ws.Cell("A39").Value); + Assert.AreEqual(31457280, ws.Cell("A41").Value); + Assert.AreEqual(47185920, ws.Cell("A42").Value); + } + + [Test] + public void Sum() + { + IXLCell cell = new XLWorkbook().AddWorksheet("Sheet1").FirstCell(); + IXLCell fCell = cell.SetValue(1).CellBelow().SetValue(2).CellBelow(); + fCell.FormulaA1 = "sum(A1:A2)"; + + Assert.AreEqual(3.0, fCell.Value); + } + + [Test] + public void SumDateTimeAndNumber() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = 1; + ws.Cell("A2").Value = new DateTime(2018, 1, 1); + Assert.AreEqual(43102, ws.Evaluate("SUM(A1:A2)")); + + ws.Cell("A1").Value = 2; + ws.Cell("A2").FormulaA1 = "DATE(2018,1,1)"; + Assert.AreEqual(43103, ws.Evaluate("SUM(A1:A2)")); + } + } + + [Test] + public void SumSq() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"SumSq(3,4)"); + Assert.AreEqual(25.0, actual); + } + + [Test] + public void TextConcat() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = 1; + ws.Cell("A2").Value = 1; + ws.Cell("B1").Value = 1; + ws.Cell("B2").Value = 1; + + ws.Cell("C1").FormulaA1 = "\"The total value is: \" & SUM(A1:B2)"; + + object r = ws.Cell("C1").Value; + Assert.AreEqual("The total value is: 4", r.ToString()); + } + + [Test] + public void Trim() + { + Assert.AreEqual("Test", XLWorkbook.EvaluateExpr("Trim(\"Test \")")); + + //Should not trim non breaking space + //See http://office.microsoft.com/en-us/excel-help/trim-function-HP010062581.aspx + Assert.AreEqual("Test\u00A0", XLWorkbook.EvaluateExpr("Trim(\"Test\u00A0 \")")); + } + + [Test] + public void TestEmptyTallyOperations() + { + //In these test no values have been set + XLWorkbook wb = new XLWorkbook(); + wb.Worksheets.Add("TallyTests"); + var cell = wb.Worksheet(1).Cell(1, 1).SetFormulaA1("=MAX(D1,D2)"); + Assert.AreEqual(0, cell.Value); + cell = wb.Worksheet(1).Cell(2, 1).SetFormulaA1("=MIN(D1,D2)"); + Assert.AreEqual(0, cell.Value); + cell = wb.Worksheet(1).Cell(3, 1).SetFormulaA1("=SUM(D1,D2)"); + Assert.AreEqual(0, cell.Value); + Assert.That(() => wb.Worksheet(1).Cell(3, 1).SetFormulaA1("=AVERAGE(D1,D2)").Value, Throws.TypeOf()); + } + + [Test] + public void TestOmittedParameters() + { + using (var wb = new XLWorkbook()) + { + object value; + value = wb.Evaluate("=IF(TRUE,1)"); + Assert.AreEqual(1, value); + + value = wb.Evaluate("=IF(TRUE,1,)"); + Assert.AreEqual(1, value); + + value = wb.Evaluate("=IF(FALSE,1,)"); + Assert.AreEqual(false, value); + + value = wb.Evaluate("=IF(FALSE,,2)"); + Assert.AreEqual(2, value); + } + } + + [Test] + public void TestDefaultExcelFunctionNamespace() + { + Assert.DoesNotThrow(() => XLWorkbook.EvaluateExpr("TODAY()")); + Assert.DoesNotThrow(() => XLWorkbook.EvaluateExpr("_xlfn.TODAY()")); + Assert.IsTrue((bool)XLWorkbook.EvaluateExpr("_xlfn.TODAY() = TODAY()")); + } + + [TestCase("=1234%", 12.34)] + [TestCase("=1234%%", 0.1234)] + [TestCase("=100+200%", 102.0)] + [TestCase("=100%+200", 201.0)] + [TestCase("=(100+200)%", 3.0)] + [TestCase("=200%^5", 32.0)] + [TestCase("=200%^400%", 16.0)] + [TestCase("=SUM(100,200,300)%", 6.0)] + public void PercentOperator(string formula, double expectedResult) + { + var res = (double)XLWorkbook.EvaluateExpr(formula); + + Assert.AreEqual(expectedResult, res, XLHelper.Epsilon); + } + + [TestCase("=--1", 1)] + [TestCase("=++1", 1)] + [TestCase("=-+-+-1", -1)] + [TestCase("=2^---2", 0.25)] + public void MultipleUnaryOperators(string formula, double expectedResult) + { + var res = (double)XLWorkbook.EvaluateExpr(formula); + + Assert.AreEqual(expectedResult, res, XLHelper.Epsilon); + } + + [TestCase("RIGHT(\"2020\", 2) + 1", 21)] + [TestCase("LEFT(\"20.2020\", 6) + 1", 21.202)] + [TestCase("2 + (\"3\" & \"4\")", 36)] + [TestCase("2 + \"3\" & \"4\"", "54")] + [TestCase("\"7\" & \"4\"", "74")] + public void TestStringSubExpression(string formula, object expectedResult) + { + var actual = XLWorkbook.EvaluateExpr(formula); + + Assert.AreEqual(expectedResult, actual); + } + } +} diff --git a/ClosedXML_Tests/Excel/CalcEngine/InformationTests.cs b/ClosedXML_Tests/Excel/CalcEngine/InformationTests.cs new file mode 100644 index 0000000..07b0027 --- /dev/null +++ b/ClosedXML_Tests/Excel/CalcEngine/InformationTests.cs @@ -0,0 +1,436 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Globalization; +using System.Threading; + +namespace ClosedXML_Tests.Excel.CalcEngine +{ + [TestFixture] + public class InformationTests + { + [SetUp] + public void SetCultureInfo() + { + Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); + } + + #region IsBlank Tests + + [Test] + public void IsBlank_MultipleAllEmpty_true() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + var actual = ws.Evaluate("=IsBlank(A1:A3)"); + Assert.AreEqual(true, actual); + } + } + + [Test] + public void IsBlank_MultipleAllFill_false() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + ws.Cell("A1").Value = "1"; + ws.Cell("A2").Value = "1"; + ws.Cell("A3").Value = "1"; + var actual = ws.Evaluate("=IsBlank(A1:A3)"); + Assert.AreEqual(false, actual); + } + } + + [Test] + public void IsBlank_MultipleMixedFill_false() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + ws.Cell("A1").Value = "1"; + ws.Cell("A3").Value = "1"; + var actual = ws.Evaluate("=IsBlank(A1:A3)"); + Assert.AreEqual(false, actual); + } + } + + [Test] + public void IsBlank_Single_false() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + ws.Cell("A1").Value = " "; + var actual = ws.Evaluate("=IsBlank(A1)"); + Assert.AreEqual(false, actual); + } + } + + [Test] + public void IsBlank_Single_true() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + var actual = ws.Evaluate("=IsBlank(A1)"); + Assert.AreEqual(true, actual); + } + } + #endregion IsBlank Tests + + #region IsEven Tests + + [Test] + public void IsEven_Single_False() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + + ws.Cell("A1").Value = 1; + ws.Cell("A2").Value = 1.2; + ws.Cell("A3").Value = 3; + + var actual = ws.Evaluate("=IsEven(A1)"); + Assert.AreEqual(false, actual); + + actual = ws.Evaluate("=IsEven(A2)"); + Assert.AreEqual(false, actual); + + actual = ws.Evaluate("=IsEven(A3)"); + Assert.AreEqual(false, actual); + } + } + + [Test] + public void IsEven_Single_True() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + + ws.Cell("A1").Value = 4; + ws.Cell("A2").Value = 0.2; + ws.Cell("A3").Value = 12.2; + + var actual = ws.Evaluate("=IsEven(A1)"); + Assert.AreEqual(true, actual); + + actual = ws.Evaluate("=IsEven(A2)"); + Assert.AreEqual(true, actual); + + actual = ws.Evaluate("=IsEven(A3)"); + Assert.AreEqual(true, actual); + } + } + + #endregion IsEven Tests + + #region IsLogical Tests + + [Test] + public void IsLogical_Simpe_False() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + + ws.Cell("A1").Value = 123; + + var actual = ws.Evaluate("=IsLogical(A1)"); + Assert.AreEqual(false, actual); + } + } + + [Test] + public void IsLogical_Simple_True() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + + ws.Cell("A1").Value = true; + + var actual = ws.Evaluate("=IsLogical(A1)"); + Assert.AreEqual(true, actual); + } + } + #endregion IsLogical Tests + + [Test] + public void IsNA() + { + object actual; + actual = XLWorkbook.EvaluateExpr("ISNA(#N/A)"); + Assert.AreEqual(true, actual); + + actual = XLWorkbook.EvaluateExpr("ISNA(#REF!)"); + Assert.AreEqual(false, actual); + } + + #region IsNotText Tests + + [Test] + public void IsNotText_Simple_false() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + ws.Cell("A1").Value = "asd"; + var actual = ws.Evaluate("=IsNonText(A1)"); + Assert.AreEqual(false, actual); + } + } + + [Test] + public void IsNotText_Simple_true() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + ws.Cell("A1").Value = "123"; //Double Value + ws.Cell("A2").Value = DateTime.Now; //Date Value + ws.Cell("A3").Value = "12,235.5"; //Comma Formatting + ws.Cell("A4").Value = "$12,235.5"; //Currency Value + ws.Cell("A5").Value = true; //Bool Value + ws.Cell("A6").Value = "12%"; //Percentage Value + + var actual = ws.Evaluate("=IsNonText(A1)"); + Assert.AreEqual(true, actual); + actual = ws.Evaluate("=IsNonText(A2)"); + Assert.AreEqual(true, actual); + actual = ws.Evaluate("=IsNonText(A3)"); + Assert.AreEqual(true, actual); + actual = ws.Evaluate("=IsNonText(A4)"); + Assert.AreEqual(true, actual); + actual = ws.Evaluate("=IsNonText(A5)"); + Assert.AreEqual(true, actual); + actual = ws.Evaluate("=IsNonText(A6)"); + Assert.AreEqual(true, actual); + } + } + #endregion IsNotText Tests + + #region IsNumber Tests + + [Test] + public void IsNumber_Simple_false() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + ws.Cell("A1").Value = "asd"; //String Value + ws.Cell("A2").Value = true; //Bool Value + + var actual = ws.Evaluate("=IsNumber(A1)"); + Assert.AreEqual(false, actual); + actual = ws.Evaluate("=IsNumber(A2)"); + Assert.AreEqual(false, actual); + } + } + + [Test] + public void IsNumber_Simple_true() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + ws.Cell("A1").Value = "123"; //Double Value + ws.Cell("A2").Value = DateTime.Now; //Date Value + ws.Cell("A3").Value = "12,235.5"; //Coma Formatting + ws.Cell("A4").Value = "$12,235.5"; //Currency Value + ws.Cell("A5").Value = "12%"; //Percentage Value + + var actual = ws.Evaluate("=IsNumber(A1)"); + Assert.AreEqual(true, actual); + actual = ws.Evaluate("=IsNumber(A2)"); + Assert.AreEqual(true, actual); + actual = ws.Evaluate("=IsNumber(A3)"); + Assert.AreEqual(true, actual); + actual = ws.Evaluate("=IsNumber(A4)"); + Assert.AreEqual(true, actual); + actual = ws.Evaluate("=IsNumber(A5)"); + Assert.AreEqual(true, actual); + } + } + #endregion IsNumber Tests + + #region IsOdd Test + + [Test] + public void IsOdd_Simple_false() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + + ws.Cell("A1").Value = 4; + ws.Cell("A2").Value = 0.2; + ws.Cell("A3").Value = 12.2; + + var actual = ws.Evaluate("=IsOdd(A1)"); + Assert.AreEqual(false, actual); + actual = ws.Evaluate("=IsOdd(A2)"); + Assert.AreEqual(false, actual); + actual = ws.Evaluate("=IsOdd(A3)"); + Assert.AreEqual(false, actual); + } + } + + [Test] + public void IsOdd_Simple_true() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + + ws.Cell("A1").Value = 1; + ws.Cell("A2").Value = 1.2; + ws.Cell("A3").Value = 3; + + var actual = ws.Evaluate("=IsOdd(A1)"); + Assert.AreEqual(true, actual); + actual = ws.Evaluate("=IsOdd(A2)"); + Assert.AreEqual(true, actual); + actual = ws.Evaluate("=IsOdd(A3)"); + Assert.AreEqual(true, actual); + } + } + #endregion IsOdd Test + + [Test] + public void IsRef() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + ws.Cell("A1").Value = "123"; + + ws.Cell("B1").FormulaA1 = "ISREF(A1)"; + ws.Cell("B2").FormulaA1 = "ISREF(5)"; + ws.Cell("B3").FormulaA1 = "ISREF(YEAR(TODAY()))"; + + bool actual; + actual = ws.Cell("B1").GetValue(); + Assert.AreEqual(true, actual); + + actual = ws.Cell("B2").GetValue(); + Assert.AreEqual(false, actual); + + actual = ws.Cell("B3").GetValue(); + Assert.AreEqual(false, actual); + } + } + + #region IsText Tests + + [Test] + public void IsText_Simple_false() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + ws.Cell("A1").Value = "123"; //Double Value + ws.Cell("A2").Value = DateTime.Now; //Date Value + ws.Cell("A3").Value = "12,235.5"; //Comma Formatting + ws.Cell("A4").Value = "$12,235.5"; //Currency Value + ws.Cell("A5").Value = true; //Bool Value + ws.Cell("A6").Value = "12%"; //Percentage Value + + var actual = ws.Evaluate("=IsText(A1)"); + Assert.AreEqual(false, actual); + actual = ws.Evaluate("=IsText(A2)"); + Assert.AreEqual(false, actual); + actual = ws.Evaluate("=IsText(A3)"); + Assert.AreEqual(false, actual); + actual = ws.Evaluate("=IsText(A4)"); + Assert.AreEqual(false, actual); + actual = ws.Evaluate("=IsText(A5)"); + Assert.AreEqual(false, actual); + actual = ws.Evaluate("=IsText(A6)"); + Assert.AreEqual(false, actual); + } + } + + [Test] + public void IsText_Simple_true() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + + ws.Cell("A1").Value = "asd"; + + var actual = ws.Evaluate("=IsText(A1)"); + Assert.AreEqual(true, actual); + } + } + #endregion IsText Tests + + #region N Tests + + [Test] + public void N_Date_SerialNumber() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + var testedDate = DateTime.Now; + ws.Cell("A1").Value = testedDate; + var actual = ws.Evaluate("=N(A1)"); + Assert.AreEqual(testedDate.ToOADate(), actual); + } + } + + [Test] + public void N_False_Zero() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + ws.Cell("A1").Value = false; + var actual = ws.Evaluate("=N(A1)"); + Assert.AreEqual(0, actual); + } + } + + [Test] + public void N_Number_Number() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + var testedValue = 123; + ws.Cell("A1").Value = testedValue; + var actual = ws.Evaluate("=N(A1)"); + Assert.AreEqual(testedValue, actual); + } + } + + [Test] + public void N_String_Zero() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + ws.Cell("A1").Value = "asd"; + var actual = ws.Evaluate("=N(A1)"); + Assert.AreEqual(0, actual); + } + } + + [Test] + public void N_True_One() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + ws.Cell("A1").Value = true; + var actual = ws.Evaluate("=N(A1)"); + Assert.AreEqual(1, actual); + } + } + #endregion N Tests + } +} diff --git a/ClosedXML_Tests/Excel/CalcEngine/LogicalTests.cs b/ClosedXML_Tests/Excel/CalcEngine/LogicalTests.cs new file mode 100644 index 0000000..403a6c1 --- /dev/null +++ b/ClosedXML_Tests/Excel/CalcEngine/LogicalTests.cs @@ -0,0 +1,63 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; + +namespace ClosedXML_Tests.Excel.CalcEngine +{ + [TestFixture] + public class LogicalTests + { + [Test] + public void If_2_Params_true() + { + Object actual = XLWorkbook.EvaluateExpr(@"if(1 = 1, ""T"")"); + Assert.AreEqual("T", actual); + } + + [Test] + public void If_2_Params_false() + { + Object actual = XLWorkbook.EvaluateExpr(@"if(1 = 2, ""T"")"); + Assert.AreEqual(false, actual); + } + + [Test] + public void If_3_Params_true() + { + Object actual = XLWorkbook.EvaluateExpr(@"if(1 = 1, ""T"", ""F"")"); + Assert.AreEqual("T", actual); + } + + [Test] + public void If_3_Params_false() + { + Object actual = XLWorkbook.EvaluateExpr(@"if(1 = 2, ""T"", ""F"")"); + Assert.AreEqual("F", actual); + } + + [Test] + public void If_Comparing_Against_Empty_String() + { + Object actual; + actual = XLWorkbook.EvaluateExpr(@"if(date(2016, 1, 1) = """", ""A"",""B"")"); + Assert.AreEqual("B", actual); + + actual = XLWorkbook.EvaluateExpr(@"if("""" = date(2016, 1, 1), ""A"",""B"")"); + Assert.AreEqual("B", actual); + + actual = XLWorkbook.EvaluateExpr(@"if("""" = 123, ""A"",""B"")"); + Assert.AreEqual("B", actual); + + actual = XLWorkbook.EvaluateExpr(@"if("""" = """", ""A"",""B"")"); + Assert.AreEqual("A", actual); + } + + [Test] + public void If_Case_Insensitivity() + { + Object actual; + actual = XLWorkbook.EvaluateExpr(@"IF(""text""=""TEXT"", 1, 2)"); + Assert.AreEqual(1, actual); + } + } +} diff --git a/ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs b/ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs new file mode 100644 index 0000000..2aae1f8 --- /dev/null +++ b/ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs @@ -0,0 +1,250 @@ +// Keep this file CodeMaid organised and cleaned +using ClosedXML.Excel; +using ClosedXML.Excel.CalcEngine.Exceptions; +using NUnit.Framework; +using System; +using System.Linq; + +namespace ClosedXML_Tests.Excel.CalcEngine +{ + [TestFixture] + public class LookupTests + { + private XLWorkbook workbook; + + #region Setup and teardown + + [OneTimeTearDown] + public void Dispose() + { + workbook.Dispose(); + } + + [SetUp] + public void Init() + { + // Make sure tests run on a deterministic culture + System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); + workbook = SetupWorkbook(); + } + + private XLWorkbook SetupWorkbook() + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Data"); + var data = new object[] + { + new {Id=1, OrderDate = DateTime.Parse("2015-01-06"), Region = "East", Rep = "Jones", Item = "Pencil", Units = 95, UnitCost = 1.99, Total = 189.05 }, + new {Id=2, OrderDate = DateTime.Parse("2015-01-23"), Region = "Central", Rep = "Kivell", Item = "Binder", Units = 50, UnitCost = 19.99, Total = 999.5}, + new {Id=3, OrderDate = DateTime.Parse("2015-02-09"), Region = "Central", Rep = "Jardine", Item = "Pencil", Units = 36, UnitCost = 4.99, Total = 179.64}, + new {Id=4, OrderDate = DateTime.Parse("2015-02-26"), Region = "Central", Rep = "Gill", Item = "Pen", Units = 27, UnitCost = 19.99, Total = 539.73}, + new {Id=5, OrderDate = DateTime.Parse("2015-03-15"), Region = "West", Rep = "Sorvino", Item = "Pencil", Units = 56, UnitCost = 2.99, Total = 167.44}, + new {Id=6, OrderDate = DateTime.Parse("2015-04-01"), Region = "East", Rep = "Jones", Item = "Binder", Units = 60, UnitCost = 4.99, Total = 299.4}, + new {Id=7, OrderDate = DateTime.Parse("2015-04-18"), Region = "Central", Rep = "Andrews", Item = "Pencil", Units = 75, UnitCost = 1.99, Total = 149.25}, + new {Id=8, OrderDate = DateTime.Parse("2015-05-05"), Region = "Central", Rep = "Jardine", Item = "Pencil", Units = 90, UnitCost = 4.99, Total = 449.1}, + new {Id=9, OrderDate = DateTime.Parse("2015-05-22"), Region = "West", Rep = "Thompson", Item = "Pencil", Units = 32, UnitCost = 1.99, Total = 63.68}, + new {Id=10, OrderDate = DateTime.Parse("2015-06-08"), Region = "East", Rep = "Jones", Item = "Binder", Units = 60, UnitCost = 8.99, Total = 539.4}, + new {Id=11, OrderDate = DateTime.Parse("2015-06-25"), Region = "Central", Rep = "Morgan", Item = "Pencil", Units = 90, UnitCost = 4.99, Total = 449.1}, + new {Id=12, OrderDate = DateTime.Parse("2015-07-12"), Region = "East", Rep = "Howard", Item = "Binder", Units = 29, UnitCost = 1.99, Total = 57.71}, + new {Id=13, OrderDate = DateTime.Parse("2015-07-29"), Region = "East", Rep = "Parent", Item = "Binder", Units = 81, UnitCost = 19.99, Total = 1619.19}, + new {Id=14, OrderDate = DateTime.Parse("2015-08-15"), Region = "East", Rep = "Jones", Item = "Pencil", Units = 35, UnitCost = 4.99, Total = 174.65}, + new {Id=15, OrderDate = DateTime.Parse("2015-09-01"), Region = "Central", Rep = "Smith", Item = "Desk", Units = 2, UnitCost = 125, Total = 250}, + new {Id=16, OrderDate = DateTime.Parse("2015-09-18"), Region = "East", Rep = "Jones", Item = "Pen Set", Units = 16, UnitCost = 15.99, Total = 255.84}, + new {Id=17, OrderDate = DateTime.Parse("2015-10-05"), Region = "Central", Rep = "Morgan", Item = "Binder", Units = 28, UnitCost = 8.99, Total = 251.72}, + new {Id=18, OrderDate = DateTime.Parse("2015-10-22"), Region = "East", Rep = "Jones", Item = "Pen", Units = 64, UnitCost = 8.99, Total = 575.36}, + new {Id=19, OrderDate = DateTime.Parse("2015-11-08"), Region = "East", Rep = "Parent", Item = "Pen", Units = 15, UnitCost = 19.99, Total = 299.85}, + new {Id=20, OrderDate = DateTime.Parse("2015-11-25"), Region = "Central", Rep = "Kivell", Item = "Pen Set", Units = 96, UnitCost = 4.99, Total = 479.04}, + new {Id=21, OrderDate = DateTime.Parse("2015-12-12"), Region = "Central", Rep = "Smith", Item = "Pencil", Units = 67, UnitCost = 1.29, Total = 86.43}, + new {Id=22, OrderDate = DateTime.Parse("2015-12-29"), Region = "East", Rep = "Parent", Item = "Pen Set", Units = 74, UnitCost = 15.99, Total = 1183.26}, + new {Id=23, OrderDate = DateTime.Parse("2016-01-15"), Region = "Central", Rep = "Gill", Item = "Binder", Units = 46, UnitCost = 8.99, Total = 413.54}, + new {Id=24, OrderDate = DateTime.Parse("2016-02-01"), Region = "Central", Rep = "Smith", Item = "Binder", Units = 87, UnitCost = 15, Total = 1305}, + new {Id=25, OrderDate = DateTime.Parse("2016-02-18"), Region = "East", Rep = "Jones", Item = "Binder", Units = 4, UnitCost = 4.99, Total = 19.96}, + new {Id=26, OrderDate = DateTime.Parse("2016-03-07"), Region = "West", Rep = "Sorvino", Item = "Binder", Units = 7, UnitCost = 19.99, Total = 139.93}, + new {Id=27, OrderDate = DateTime.Parse("2016-03-24"), Region = "Central", Rep = "Jardine", Item = "Pen Set", Units = 50, UnitCost = 4.99, Total = 249.5}, + new {Id=28, OrderDate = DateTime.Parse("2016-04-10"), Region = "Central", Rep = "Andrews", Item = "Pencil", Units = 66, UnitCost = 1.99, Total = 131.34}, + new {Id=29, OrderDate = DateTime.Parse("2016-04-27"), Region = "East", Rep = "Howard", Item = "Pen", Units = 96, UnitCost = 4.99, Total = 479.04}, + new {Id=30, OrderDate = DateTime.Parse("2016-05-14"), Region = "Central", Rep = "Gill", Item = "Pencil", Units = 53, UnitCost = 1.29, Total = 68.37}, + new {Id=31, OrderDate = DateTime.Parse("2016-05-31"), Region = "Central", Rep = "Gill", Item = "Binder", Units = 80, UnitCost = 8.99, Total = 719.2}, + new {Id=32, OrderDate = DateTime.Parse("2016-06-17"), Region = "Central", Rep = "Kivell", Item = "Desk", Units = 5, UnitCost = 125, Total = 625}, + new {Id=33, OrderDate = DateTime.Parse("2016-07-04"), Region = "East", Rep = "Jones", Item = "Pen Set", Units = 62, UnitCost = 4.99, Total = 309.38}, + new {Id=34, OrderDate = DateTime.Parse("2016-07-21"), Region = "Central", Rep = "Morgan", Item = "Pen Set", Units = 55, UnitCost = 12.49, Total = 686.95}, + new {Id=35, OrderDate = DateTime.Parse("2016-08-07"), Region = "Central", Rep = "Kivell", Item = "Pen Set", Units = 42, UnitCost = 23.95, Total = 1005.9}, + new {Id=36, OrderDate = DateTime.Parse("2016-08-24"), Region = "West", Rep = "Sorvino", Item = "Desk", Units = 3, UnitCost = 275, Total = 825}, + new {Id=37, OrderDate = DateTime.Parse("2016-09-10"), Region = "Central", Rep = "Gill", Item = "Pencil", Units = 7, UnitCost = 1.29, Total = 9.03}, + new {Id=38, OrderDate = DateTime.Parse("2016-09-27"), Region = "West", Rep = "Sorvino", Item = "Pen", Units = 76, UnitCost = 1.99, Total = 151.24}, + new {Id=39, OrderDate = DateTime.Parse("2016-10-14"), Region = "West", Rep = "Thompson", Item = "Binder", Units = 57, UnitCost = 19.99, Total = 1139.43}, + new {Id=40, OrderDate = DateTime.Parse("2016-10-31"), Region = "Central", Rep = "Andrews", Item = "Pencil", Units = 14, UnitCost = 1.29, Total = 18.06}, + new {Id=41, OrderDate = DateTime.Parse("2016-11-17"), Region = "Central", Rep = "Jardine", Item = "Binder", Units = 11, UnitCost = 4.99, Total = 54.89}, + new {Id=42, OrderDate = DateTime.Parse("2016-12-04"), Region = "Central", Rep = "Jardine", Item = "Binder", Units = 94, UnitCost = 19.99, Total = 1879.06}, + new {Id=43, OrderDate = DateTime.Parse("2016-12-21"), Region = "Central", Rep = "Andrews", Item = "Binder", Units = 28, UnitCost = 4.99, Total = 139.72} + }; + ws.FirstCell() + .CellBelow() + .CellRight() + .InsertTable(data); + + return wb; + } + + #endregion Setup and teardown + + [Test] + public void Hlookup() + { + // Range lookup false + var value = workbook.Evaluate(@"=HLOOKUP(""Total"",Data!$B$2:$I$71,4,FALSE)"); + Assert.AreEqual(179.64, value); + } + + [Test] + public void Hyperlink() + { + XLHyperlink hl; + hl = XLWorkbook.EvaluateExpr("HYPERLINK(\"http://github.com/ClosedXML/ClosedXML\")") as XLHyperlink; + Assert.IsNotNull(hl); + Assert.AreEqual("http://github.com/ClosedXML/ClosedXML", hl.ExternalAddress.ToString()); + Assert.AreEqual(string.Empty, hl.Tooltip); + + hl = XLWorkbook.EvaluateExpr("HYPERLINK(\"mailto:jsmith@github.com\", \"jsmith@github.com\")") as XLHyperlink; + Assert.IsNotNull(hl); + Assert.AreEqual("mailto:jsmith@github.com", hl.ExternalAddress.ToString()); + Assert.AreEqual("jsmith@github.com", hl.Tooltip); + } + + [Test] + public void Index() + { + var ws = workbook.Worksheets.First(); + Assert.AreEqual("Kivell", ws.Evaluate(@"=INDEX(B2:J12, 3, 4)")); + + // We don't support optional parameter fully here yet. + // Supposedly, if you omit e.g. the row number, then ROW() of the calling cell should be assumed + // Assert.AreEqual("Gill", ws.Evaluate(@"=INDEX(B2:J12, , 4)")); + + Assert.AreEqual("Rep", ws.Evaluate(@"=INDEX(B2:I2, 4)")); + + Assert.AreEqual(3, ws.Evaluate(@"=INDEX(B2:B20, 4)")); + Assert.AreEqual(3, ws.Evaluate(@"=INDEX(B2:B20, 4, 1)")); + Assert.AreEqual(3, ws.Evaluate(@"=INDEX(B2:B20, 4, )")); + + Assert.AreEqual("Rep", ws.Evaluate(@"=INDEX(B2:J2, 1, 4)")); + Assert.AreEqual("Rep", ws.Evaluate(@"=INDEX(B2:J2, , 4)")); + } + + [Test] + public void Index_Exceptions() + { + var ws = workbook.Worksheets.First(); + Assert.Throws(() => ws.Evaluate(@"INDEX(B2:I10, 20, 1)")); + Assert.Throws(() => ws.Evaluate(@"INDEX(B2:I10, 1, 10)")); + Assert.Throws(() => ws.Evaluate(@"INDEX(B2:I2, 10)")); + Assert.Throws(() => ws.Evaluate(@"INDEX(B2:I2, 4, 1)")); + Assert.Throws(() => ws.Evaluate(@"INDEX(B2:I2, 4, )")); + Assert.Throws(() => ws.Evaluate(@"INDEX(B2:B10, 20)")); + Assert.Throws(() => ws.Evaluate(@"INDEX(B2:B10, 20, )")); + Assert.Throws(() => ws.Evaluate(@"INDEX(B2:B10, , 4)")); + } + + [Test] + public void Match() + { + var ws = workbook.Worksheets.First(); + + Object value; + value = ws.Evaluate(@"=MATCH(""Rep"", B2:I2, 0)"); + Assert.AreEqual(4, value); + + value = ws.Evaluate(@"=MATCH(""Rep"", A2:Z2, 0)"); + Assert.AreEqual(5, value); + + value = ws.Evaluate(@"=MATCH(""REP"", B2:I2, 0)"); + Assert.AreEqual(4, value); + + value = ws.Evaluate(@"=MATCH(95, B3:I3, 0)"); + Assert.AreEqual(6, value); + + value = ws.Evaluate(@"=MATCH(DATE(2015,1,6), B3:I3, 0)"); + Assert.AreEqual(2, value); + + value = ws.Evaluate(@"=MATCH(1.99, 3:3, 0)"); + Assert.AreEqual(8, value); + + value = ws.Evaluate(@"=MATCH(43, B:B, 0)"); + Assert.AreEqual(45, value); + + value = ws.Evaluate(@"=MATCH(""cENtraL"", D3:D45, 0)"); + Assert.AreEqual(2, value); + + value = ws.Evaluate(@"=MATCH(4.99, H:H, 0)"); + Assert.AreEqual(5, value); + + value = ws.Evaluate(@"=MATCH(""Rapture"", B2:I2, 1)"); + Assert.AreEqual(2, value); + + value = ws.Evaluate(@"=MATCH(22.5, B3:B45, 1)"); + Assert.AreEqual(22, value); + + value = ws.Evaluate(@"=MATCH(""Rep"", B2:I2)"); + Assert.AreEqual(4, value); + + value = ws.Evaluate(@"=MATCH(""Rep"", B2:I2, 1)"); + Assert.AreEqual(4, value); + + value = ws.Evaluate(@"=MATCH(40, G3:G6, -1)"); + Assert.AreEqual(2, value); + } + + [Test] + public void Match_Exceptions() + { + var ws = workbook.Worksheets.First(); + Assert.Throws(() => ws.Evaluate(@"=MATCH(""Rep"", B2:I5)")); + Assert.Throws(() => ws.Evaluate(@"=MATCH(""Dummy"", B2:I2, 0)")); + Assert.Throws(() => ws.Evaluate(@"=MATCH(4.5,B3:B45,-1)")); + } + + [Test] + public void Vlookup() + { + // Range lookup false + var value = workbook.Evaluate("=VLOOKUP(3,Data!$B$2:$I$71,3,FALSE)"); + Assert.AreEqual("Central", value); + + value = workbook.Evaluate("=VLOOKUP(DATE(2015,5,22),Data!C:I,7,FALSE)"); + Assert.AreEqual(63.68, value); + + value = workbook.Evaluate(@"=VLOOKUP(""Central"",Data!D:E,2,FALSE)"); + Assert.AreEqual("Kivell", value); + + // Case insensitive lookup + value = workbook.Evaluate(@"=VLOOKUP(""central"",Data!D:E,2,FALSE)"); + Assert.AreEqual("Kivell", value); + + // Range lookup true + value = workbook.Evaluate("=VLOOKUP(3,Data!$B$2:$I$71,8,TRUE)"); + Assert.AreEqual(179.64, value); + + value = workbook.Evaluate("=VLOOKUP(3,Data!$B$2:$I$71,8)"); + Assert.AreEqual(179.64, value); + + value = workbook.Evaluate("=VLOOKUP(3,Data!$B$2:$I$71,8,)"); + Assert.AreEqual(179.64, value); + + value = workbook.Evaluate("=VLOOKUP(14.5,Data!$B$2:$I$71,8,TRUE)"); + Assert.AreEqual(174.65, value); + + value = workbook.Evaluate("=VLOOKUP(50,Data!$B$2:$I$71,8,TRUE)"); + Assert.AreEqual(139.72, value); + } + + [Test] + public void Vlookup_Exceptions() + { + Assert.Throws(() => workbook.Evaluate(@"=VLOOKUP("""",Data!$B$2:$I$71,3,FALSE)")); + Assert.Throws(() => workbook.Evaluate(@"=VLOOKUP(50,Data!$B$2:$I$71,3,FALSE)")); + Assert.Throws(() => workbook.Evaluate(@"=VLOOKUP(-1,Data!$B$2:$I$71,2,TRUE)")); + + Assert.Throws(() => workbook.Evaluate(@"=VLOOKUP(20,Data!$B$2:$I$71,9,FALSE)")); + } + } +} diff --git a/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs b/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs new file mode 100644 index 0000000..e264d23 --- /dev/null +++ b/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs @@ -0,0 +1,1471 @@ +// Keep this file CodeMaid organised and cleaned +using ClosedXML.Excel; +using ClosedXML.Excel.CalcEngine.Exceptions; +using NUnit.Framework; +using System; +using System.Globalization; +using System.Linq; + +namespace ClosedXML_Tests.Excel.CalcEngine +{ + [TestFixture] + public class MathTrigTests + { + private readonly double tolerance = 1e-10; + + [Theory] + public void Abs_ReturnsItselfOnPositiveNumbers([Range(0, 10, 0.1)] double input) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ABS({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(input, actual, tolerance * 10); + } + + [Theory] + public void Abs_ReturnsTheCorrectValueOnNegativeInput([Range(-10, -0.1, 0.1)] double input) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ABS({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(-input, actual, tolerance * 10); + } + + [TestCase(-1, 3.141592654)] + [TestCase(-0.9, 2.690565842)] + [TestCase(-0.8, 2.498091545)] + [TestCase(-0.7, 2.346193823)] + [TestCase(-0.6, 2.214297436)] + [TestCase(-0.5, 2.094395102)] + [TestCase(-0.4, 1.982313173)] + [TestCase(-0.3, 1.875488981)] + [TestCase(-0.2, 1.772154248)] + [TestCase(-0.1, 1.670963748)] + [TestCase(0, 1.570796327)] + [TestCase(0.1, 1.470628906)] + [TestCase(0.2, 1.369438406)] + [TestCase(0.3, 1.266103673)] + [TestCase(0.4, 1.159279481)] + [TestCase(0.5, 1.047197551)] + [TestCase(0.6, 0.927295218)] + [TestCase(0.7, 0.79539883)] + [TestCase(0.8, 0.643501109)] + [TestCase(0.9, 0.451026812)] + [TestCase(1, 0)] + public void Acos_ReturnsCorrectValue(double input, double expectedResult) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ACOS({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedResult, actual, tolerance * 10); + } + + [Theory] + public void Acos_ThrowsNumberExceptionOutsideRange([Range(1.1, 3, 0.1)] double input) + { + // checking input and it's additive inverse as both are outside range. + Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ACOS({0})", input.ToString(CultureInfo.InvariantCulture)))); + Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ACOS({0})", (-input).ToString(CultureInfo.InvariantCulture)))); + } + + [Theory] + public void Acosh_NumbersBelow1ThrowNumberException([Range(-1, 0.9, 0.1)] double input) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ACOSH({0})", input.ToString(CultureInfo.InvariantCulture)))); + } + + [TestCase(1.2, 0.622362504)] + [TestCase(1.5, 0.96242365)] + [TestCase(1.8, 1.192910731)] + [TestCase(2.1, 1.372859144)] + [TestCase(2.4, 1.522079367)] + [TestCase(2.7, 1.650193455)] + [TestCase(3, 1.762747174)] + [TestCase(3.3, 1.863279351)] + [TestCase(3.6, 1.954207529)] + [TestCase(3.9, 2.037266466)] + [TestCase(4.2, 2.113748231)] + [TestCase(4.5, 2.184643792)] + [TestCase(4.8, 2.250731414)] + [TestCase(5.1, 2.312634419)] + [TestCase(5.4, 2.370860342)] + [TestCase(5.7, 2.425828318)] + [TestCase(6, 2.47788873)] + [TestCase(1, 0)] + public void Acosh_ReturnsCorrectValue(double input, double expectedResult) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ACOSH({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedResult, actual, tolerance * 10); + } + + [TestCase(-10, 3.041924001)] + [TestCase(-9, 3.030935432)] + [TestCase(-8, 3.017237659)] + [TestCase(-7, 2.999695599)] + [TestCase(-6, 2.976443976)] + [TestCase(-5, 2.944197094)] + [TestCase(-4, 2.89661399)] + [TestCase(-3, 2.819842099)] + [TestCase(-2, 2.677945045)] + [TestCase(-1, 2.35619449)] + [TestCase(0, 1.570796327)] + [TestCase(1, 0.785398163)] + [TestCase(2, 0.463647609)] + [TestCase(3, 0.321750554)] + [TestCase(4, 0.244978663)] + [TestCase(5, 0.19739556)] + [TestCase(6, 0.165148677)] + [TestCase(7, 0.141897055)] + [TestCase(8, 0.124354995)] + [TestCase(9, 0.110657221)] + [TestCase(10, 0.099668652)] + public void Acot_ReturnsCorrectValue(double input, double expectedResult) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ACOT({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedResult, actual, tolerance * 10); + } + + [Theory] + public void Acoth_ForPlusMinusXSmallerThan1_ThrowsNumberException([Range(-0.9, 0.9, 0.1)] double input) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ACOTH({0})", input.ToString(CultureInfo.InvariantCulture)))); + } + + [TestCase(-10, -0.100335348)] + [TestCase(-9, -0.111571776)] + [TestCase(-8, -0.125657214)] + [TestCase(-7, -0.143841036)] + [TestCase(-6, -0.168236118)] + [TestCase(-5, -0.202732554)] + [TestCase(-4, -0.255412812)] + [TestCase(-3, -0.34657359)] + [TestCase(-2, -0.549306144)] + [TestCase(2, 0.549306144)] + [TestCase(3, 0.34657359)] + [TestCase(4, 0.255412812)] + [TestCase(5, 0.202732554)] + [TestCase(6, 0.168236118)] + [TestCase(7, 0.143841036)] + [TestCase(8, 0.125657214)] + [TestCase(9, 0.111571776)] + [TestCase(10, 0.100335348)] + public void Acoth_ReturnsCorrectValue(double input, double expectedResult) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ACOTH({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedResult, actual, tolerance * 10); + } + + [TestCase("LVII", 57)] + [TestCase("mcmxii", 1912)] + [TestCase("", 0)] + [TestCase("-IV", -4)] + [TestCase(" XIV", 14)] + [TestCase("MCMLXXXIII ", 1983)] + public void Arabic_ReturnsCorrectNumber(string roman, int arabic) + { + var actual = (int)XLWorkbook.EvaluateExpr(string.Format($"ARABIC(\"{roman}\")")); + Assert.AreEqual(arabic, actual); + } + + [Test] + public void Arabic_ThrowsNumberExceptionOnMinus() + { + Assert.Throws(() => XLWorkbook.EvaluateExpr("ARABIC(\"-\")")); + } + + [TestCase("- I")] + [TestCase("roman")] + public void Arabic_ThrowsValueExceptionOnInvalidNumber(string invalidRoman) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr($"ARABIC(\"{invalidRoman}\")")); + } + + [TestCase(-1, -1.570796327)] + [TestCase(-0.9, -1.119769515)] + [TestCase(-0.8, -0.927295218)] + [TestCase(-0.7, -0.775397497)] + [TestCase(-0.6, -0.643501109)] + [TestCase(-0.5, -0.523598776)] + [TestCase(-0.4, -0.411516846)] + [TestCase(-0.3, -0.304692654)] + [TestCase(-0.2, -0.201357921)] + [TestCase(-0.1, -0.100167421)] + [TestCase(0, 0)] + [TestCase(0.1, 0.100167421)] + [TestCase(0.2, 0.201357921)] + [TestCase(0.3, 0.304692654)] + [TestCase(0.4, 0.411516846)] + [TestCase(0.5, 0.523598776)] + [TestCase(0.6, 0.643501109)] + [TestCase(0.7, 0.775397497)] + [TestCase(0.8, 0.927295218)] + [TestCase(0.9, 1.119769515)] + [TestCase(1, 1.570796327)] + public void Asin_ReturnsCorrectResult(double input, double expectedResult) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ASIN({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedResult, actual, tolerance * 10); + } + + [Theory] + public void Asin_ThrowsNumberExceptionWhenAbsOfInputGreaterThan1([Range(-3, -1.1, 0.1)] double input) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ASIN({0})", input.ToString(CultureInfo.InvariantCulture)))); + Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ASIN({0})", (-input).ToString(CultureInfo.InvariantCulture)))); + } + + [TestCase(0, 0)] + [TestCase(0.1, 0.0998340788992076)] + [TestCase(0.2, 0.198690110349241)] + [TestCase(0.3, 0.295673047563422)] + [TestCase(0.4, 0.390035319770715)] + [TestCase(0.5, 0.481211825059603)] + [TestCase(0.6, 0.568824898732248)] + [TestCase(0.7, 0.652666566082356)] + [TestCase(0.8, 0.732668256045411)] + [TestCase(0.9, 0.808866935652783)] + [TestCase(1, 0.881373587019543)] + [TestCase(2, 1.44363547517881)] + [TestCase(3, 1.81844645923207)] + [TestCase(4, 2.0947125472611)] + [TestCase(5, 2.31243834127275)] + public void Asinh_ReturnsCorrectResult(double input, double expectedResult) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ASINH({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedResult, actual, tolerance); + var minusActual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ASINH({0})", (-input).ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(-expectedResult, minusActual, tolerance); + } + + [TestCase(0, 0)] + [TestCase(0.1, 0.099668652491162)] + [TestCase(0.2, 0.197395559849881)] + [TestCase(0.3, 0.291456794477867)] + [TestCase(0.4, 0.380506377112365)] + [TestCase(0.5, 0.463647609000806)] + [TestCase(0.6, 0.540419500270584)] + [TestCase(0.7, 0.610725964389209)] + [TestCase(0.8, 0.674740942223553)] + [TestCase(0.9, 0.732815101786507)] + [TestCase(1, 0.785398163397448)] + [TestCase(2, 1.10714871779409)] + [TestCase(3, 1.24904577239825)] + [TestCase(4, 1.32581766366803)] + [TestCase(5, 1.37340076694502)] + public void Atan_ReturnsCorrectResult(double input, double expectedResult) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedResult, actual, tolerance); + var minusActual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN({0})", (-input).ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(-expectedResult, minusActual, tolerance); + } + + [Test] + public void Atan2_Returns0OnSecond0AndFirstGreater0([Range(0.1, 5, 0.4)] double input) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN2({0}, 0)", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(0, actual, tolerance); + } + + [TestCase(1, 2, 1.10714871779409)] + [TestCase(1, 3, 1.24904577239825)] + [TestCase(2, 3, 0.98279372324733)] + [TestCase(1, 4, 1.32581766366803)] + [TestCase(3, 4, 0.92729521800161)] + [TestCase(1, 5, 1.37340076694502)] + [TestCase(2, 5, 1.19028994968253)] + [TestCase(3, 5, 1.03037682652431)] + [TestCase(4, 5, 0.89605538457134)] + [TestCase(1, 6, 1.40564764938027)] + [TestCase(5, 6, 0.87605805059819)] + [TestCase(1, 7, 1.42889927219073)] + [TestCase(2, 7, 1.29249666778979)] + [TestCase(3, 7, 1.16590454050981)] + [TestCase(4, 7, 1.05165021254837)] + [TestCase(5, 7, 0.95054684081208)] + [TestCase(6, 7, 0.86217005466723)] + public void Atan2_ReturnsCorrectResults_EqualOnAllMultiplesOfFraction(double x, double y, double expectedResult) + { + for (int i = 1; i < 5; i++) + { + var actual = (double)XLWorkbook.EvaluateExpr( + string.Format( + @"ATAN2({0}, {1})", + (x * i).ToString(CultureInfo.InvariantCulture), + (y * i).ToString(CultureInfo.InvariantCulture))); + + Assert.AreEqual(expectedResult, actual, tolerance); + } + } + + [Test] + public void Atan2_ReturnsHalfPiOn0AsFirstInputWhenSecondGreater0([Range(0.1, 5, 0.4)] double input) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN2(0, {0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(0.5 * Math.PI, actual, tolerance); + } + + [Test] + public void Atan2_ReturnsMinus3QuartersOfPiWhenFirstSmaller0AndSecondItsNegative([Range(-5, -0.1, 0.3)] double input) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN2({0}, {0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(-0.75 * Math.PI, actual, tolerance); + } + + [Test] + public void Atan2_ReturnsMinusHalfPiOn0AsFirstInputWhenSecondSmaller0([Range(-5, -0.1, 0.4)] double input) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN2(0, {0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(-0.5 * Math.PI, actual, tolerance); + } + + [Test] + public void Atan2_ReturnsPiOn0AsSecondInputWhenFirstSmaller0([Range(-5, -0.1, 0.4)] double input) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN2({0}, 0)", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(Math.PI, actual, tolerance); + } + + [Test] + public void Atan2_ReturnsQuarterOfPiWhenInputsAreEqualAndGreater0([Range(0.1, 5, 0.3)] double input) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN2({0}, {0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(0.25 * Math.PI, actual, tolerance); + } + + [Test] + public void Atan2_ThrowsDiv0ExceptionOn0And0() + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(@"ATAN2(0, 0)")); + } + + [TestCase(-0.99, -2.64665241236225)] + [TestCase(-0.9, -1.47221948958322)] + [TestCase(-0.8, -1.09861228866811)] + [TestCase(-0.6, -0.693147180559945)] + [TestCase(-0.4, -0.423648930193602)] + [TestCase(-0.2, -0.202732554054082)] + [TestCase(0, 0)] + [TestCase(0.2, 0.202732554054082)] + [TestCase(0.4, 0.423648930193602)] + [TestCase(0.6, 0.693147180559945)] + [TestCase(0.8, 1.09861228866811)] + [TestCase(-0.9, -1.47221948958322)] + [TestCase(-0.990, -2.64665241236225)] + [TestCase(-0.999, -3.8002011672502)] + public void Atanh_ReturnsCorrectResults(double input, double expectedResult) + { + var actual = (double)XLWorkbook.EvaluateExpr( + string.Format( + @"ATANH({0})", + input.ToString(CultureInfo.InvariantCulture))); + + Assert.AreEqual(expectedResult, actual, tolerance * 10); + } + + [Theory] + public void Atanh_ThrowsNumberExceptionWhenAbsOfInput1OrGreater([Range(1, 5, 0.2)] double input) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ATANH({0})", input.ToString(CultureInfo.InvariantCulture)))); + Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ATANH({0})", (-input).ToString(CultureInfo.InvariantCulture)))); + } + + [TestCase(0, 36, "0")] + [TestCase(1, 36, "1")] + [TestCase(2, 36, "2")] + [TestCase(3, 36, "3")] + [TestCase(4, 36, "4")] + [TestCase(5, 36, "5")] + [TestCase(6, 36, "6")] + [TestCase(7, 36, "7")] + [TestCase(8, 36, "8")] + [TestCase(9, 36, "9")] + [TestCase(10, 36, "A")] + [TestCase(11, 36, "B")] + [TestCase(12, 36, "C")] + [TestCase(13, 36, "D")] + [TestCase(14, 36, "E")] + [TestCase(15, 36, "F")] + [TestCase(16, 36, "G")] + [TestCase(17, 36, "H")] + [TestCase(18, 36, "I")] + [TestCase(19, 36, "J")] + [TestCase(20, 36, "K")] + [TestCase(21, 36, "L")] + [TestCase(22, 36, "M")] + [TestCase(23, 36, "N")] + [TestCase(24, 36, "O")] + [TestCase(25, 36, "P")] + [TestCase(26, 36, "Q")] + [TestCase(27, 36, "R")] + [TestCase(28, 36, "S")] + [TestCase(29, 36, "T")] + [TestCase(30, 36, "U")] + [TestCase(31, 36, "V")] + [TestCase(32, 36, "W")] + [TestCase(33, 36, "X")] + [TestCase(34, 36, "Y")] + [TestCase(35, 36, "Z")] + [TestCase(36, 36, "10")] + [TestCase(255, 29, "8N")] + [TestCase(255, 2, "11111111")] + public void Base_ReturnsCorrectResultOnInput(int input, int theBase, string expectedResult) + { + var actual = (string)XLWorkbook.EvaluateExpr(string.Format(@"BASE({0}, {1})", input, theBase)); + Assert.AreEqual(expectedResult, actual); + } + + [TestCase(255, 2, 3, "11111111")] + [TestCase(255, 2, 8, "11111111")] + [TestCase(255, 2, 10, "0011111111")] + [TestCase(10, 3, 4, "0101")] + public void Base_ReturnsCorrectResultOnInputWithMinimalLength(int input, int theBase, int minLength, string expectedResult) + { + var actual = (string)XLWorkbook.EvaluateExpr(string.Format(@"BASE({0}, {1}, {2})", input, theBase, minLength)); + Assert.AreEqual(expectedResult, actual); + } + + [TestCase(@"""x""", "2", "2")] + [TestCase("0", @"""x""", "2")] + [TestCase("0", "2", @"""x""")] + public void Base_ThrowsCellValueExceptionOnAnyInputNotANumber(string input, string theBase, string minLength) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr($"BASE({input}, {theBase}, {minLength})")); + } + + [Theory] + public void Base_ThrowsNumberExceptionOnBaseSmallerThan2([Range(-2, 1)] int theBase) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"BASE(0, {0})", theBase.ToString(CultureInfo.InvariantCulture)))); + } + + [Theory] + public void Base_ThrowsNumberExceptionOnInputSmallerThan0([Range(-5, -1)] int input) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"BASE({0}, 2)", input.ToString(CultureInfo.InvariantCulture)))); + } + + [Theory] + public void Base_ThrowsNumberExceptionOnRadixGreaterThan36([Range(37, 40)] int radix) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"BASE(1, {0})", radix.ToString(CultureInfo.InvariantCulture)))); + } + + [TestCase(24.3, 5, 25)] + [TestCase(6.7, 1, 7)] + [TestCase(-8.1, 2, -8)] + [TestCase(5.5, 2.1, 6.3)] + [TestCase(5.5, 0, 0)] + [TestCase(-5.5, 2.1, -4.2)] + [TestCase(-5.5, -2.1, -6.3)] + [TestCase(-5.5, 0, 0)] + public void Ceiling(double input, double significance, double expectedResult) + { + var actual = (double)XLWorkbook.EvaluateExpr($"CEILING({input.ToInvariantString()}, {significance.ToInvariantString()})"); + Assert.AreEqual(expectedResult, actual, tolerance); + } + + [TestCase(6.7, -1)] + public void Ceiling_ThrowsNumberExceptionOnInvalidInput(double input, double significance) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr($"CEILING({input.ToInvariantString()}, {significance.ToInvariantString()})")); + } + + [TestCase(24.3, 5, null, 25)] + [TestCase(6.7, null, null, 7)] + [TestCase(-8.1, 2, null, -8)] + [TestCase(5.5, 2.1, 0, 6.3)] + [TestCase(5.5, -2.1, 0, 6.3)] + [TestCase(5.5, 0, 0, 0)] + [TestCase(5.5, 2.1, -1, 6.3)] + [TestCase(5.5, -2.1, -1, 6.3)] + [TestCase(5.5, 0, -1, 0)] + [TestCase(5.5, 2.1, 10, 6.3)] + [TestCase(5.5, -2.1, 10, 6.3)] + [TestCase(5.5, 0, 10, 0)] + [TestCase(-5.5, 2.1, 0, -4.2)] + [TestCase(-5.5, -2.1, 0, -4.2)] + [TestCase(-5.5, 0, 0, 0)] + [TestCase(-5.5, 2.1, -1, -6.3)] + [TestCase(-5.5, -2.1, -1, -6.3)] + [TestCase(-5.5, 0, -1, 0)] + [TestCase(-5.5, 2.1, 10, -6.3)] + [TestCase(-5.5, -2.1, 10, -6.3)] + [TestCase(-5.5, 0, 10, 0)] + public void CeilingMath(double input, double? step, int? mode, double expectedResult) + { + string parameters = input.ToString(CultureInfo.InvariantCulture); + if (step != null) + { + parameters = parameters + ", " + step?.ToString(CultureInfo.InvariantCulture); + if (mode != null) + parameters = parameters + ", " + mode?.ToString(CultureInfo.InvariantCulture); + } + + var actual = (double)XLWorkbook.EvaluateExpr($"CEILING.MATH({parameters})"); + Assert.AreEqual(expectedResult, actual, tolerance); + } + + [Theory] + public void Combin_Returns1ForKis0OrKEqualsN([Range(0, 10)] int n) + { + var actual = XLWorkbook.EvaluateExpr(string.Format(@"COMBIN({0}, 0)", n)); + Assert.AreEqual(1, actual); + + var actual2 = XLWorkbook.EvaluateExpr(string.Format(@"COMBIN({0}, {0})", n)); + Assert.AreEqual(1, actual2); + } + + [TestCase(4, 2, 6)] + [TestCase(5, 2, 10)] + [TestCase(6, 2, 15)] + [TestCase(6, 3, 20)] + [TestCase(7, 2, 21)] + [TestCase(7, 3, 35)] + public void Combin_ReturnsCorrectResults(int n, int k, int expectedResult) + { + var actual = XLWorkbook.EvaluateExpr(string.Format(@"COMBIN({0}, {1})", n, k)); + Assert.AreEqual(expectedResult, actual); + + var actual2 = XLWorkbook.EvaluateExpr(string.Format(@"COMBIN({0}, {1})", n, n - k)); + Assert.AreEqual(expectedResult, actual2); + } + + [Theory] + public void Combin_ReturnsNforKis1OrKisNminus1([Range(1, 10)] int n) + { + var actual = XLWorkbook.EvaluateExpr(string.Format(@"COMBIN({0}, 1)", n)); + Assert.AreEqual(n, actual); + + var actual2 = XLWorkbook.EvaluateExpr(string.Format(@"COMBIN({0}, {1})", n, n - 1)); + Assert.AreEqual(n, actual2); + } + + [Theory] + public void Combin_ThrowsNumberExceptionForAnyArgumentSmaller0([Range(-4, -1)] int smaller0) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr( + string.Format( + @"COMBIN({0}, {1})", + smaller0.ToString(CultureInfo.InvariantCulture), + (-smaller0).ToString(CultureInfo.InvariantCulture)))); + + Assert.Throws(() => XLWorkbook.EvaluateExpr( + string.Format( + @"COMBIN({0}, {1})", + (-smaller0).ToString(CultureInfo.InvariantCulture), + smaller0.ToString(CultureInfo.InvariantCulture)))); + } + + [TestCase("\"no number\"")] + [TestCase("\"\"")] + public void Combin_ThrowsNumericExceptionForAnyArgumentNotNumeric(string input) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr( + string.Format( + @"COMBIN({0}, 1)", + input?.ToString(CultureInfo.InvariantCulture)))); + + Assert.Throws(() => XLWorkbook.EvaluateExpr( + string.Format( + @"COMBIN(1, {0})", + input?.ToString(CultureInfo.InvariantCulture)))); + } + + [TestCase(4, 3, 20)] + [TestCase(10, 3, 220)] + [TestCase(0, 0, 1)] + public void Combina_CalculatesCorrectValues(int number, int chosen, int expectedResult) + { + var actualResult = XLWorkbook.EvaluateExpr($"COMBINA({number}, {chosen})"); + Assert.AreEqual(expectedResult, (long)actualResult); + } + + [Theory] + public void Combina_Returns1WhenChosenIs0([Range(0, 10)] int number) + { + Combina_CalculatesCorrectValues(number, 0, 1); + } + + [TestCase(-1, 2)] + [TestCase(-3, -2)] + [TestCase(2, -2)] + public void Combina_ThrowsNumExceptionOnInvalidValues(int number, int chosen) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr( + string.Format( + @"COMBINA({0}, {1})", + number.ToString(CultureInfo.InvariantCulture), + chosen.ToString(CultureInfo.InvariantCulture)))); + } + + [TestCase(4.23, 3, 20)] + [TestCase(10.4, 3.14, 220)] + [TestCase(0, 0.4, 1)] + public void Combina_TruncatesNumbersCorrectly(double number, double chosen, int expectedResult) + { + var actualResult = XLWorkbook.EvaluateExpr(string.Format( + @"COMBINA({0}, {1})", + number.ToString(CultureInfo.InvariantCulture), + chosen.ToString(CultureInfo.InvariantCulture))); + + Assert.AreEqual(expectedResult, (long)actualResult); + } + + [TestCase(0, 1)] + [TestCase(0.4, 0.921060994002885)] + [TestCase(0.8, 0.696706709347165)] + [TestCase(1.2, 0.362357754476674)] + [TestCase(1.6, -0.0291995223012888)] + [TestCase(2, -0.416146836547142)] + [TestCase(2.4, -0.737393715541245)] + [TestCase(2.8, -0.942222340668658)] + [TestCase(3.2, -0.998294775794753)] + [TestCase(3.6, -0.896758416334147)] + [TestCase(4, -0.653643620863612)] + [TestCase(4.4, -0.307332869978419)] + [TestCase(4.8, 0.0874989834394464)] + [TestCase(5.2, 0.468516671300377)] + [TestCase(5.6, 0.77556587851025)] + [TestCase(6, 0.960170286650366)] + [TestCase(6.4, 0.993184918758193)] + [TestCase(6.8, 0.869397490349825)] + [TestCase(7.2, 0.608351314532255)] + [TestCase(7.6, 0.251259842582256)] + [TestCase(8, -0.145500033808614)] + [TestCase(8.4, -0.519288654116686)] + public void Cos_ReturnsCorrectResult(double input, double expectedResult) + { + var actualResult = (double)XLWorkbook.EvaluateExpr(string.Format("COS({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedResult, actualResult, tolerance); + } + + [TestCase(0, 1)] + [TestCase(0.4, 1.08107237183845)] + [TestCase(0.8, 1.33743494630484)] + [TestCase(1.2, 1.81065556732437)] + [TestCase(1.6, 2.57746447119489)] + [TestCase(2, 3.76219569108363)] + [TestCase(2.4, 5.55694716696551)] + [TestCase(2.8, 8.25272841686113)] + [TestCase(3.2, 12.2866462005439)] + [TestCase(3.6, 18.3127790830626)] + [TestCase(4, 27.3082328360165)] + [TestCase(4.4, 40.7315730024356)] + [TestCase(4.8, 60.7593236328919)] + [TestCase(5.2, 90.638879219786)] + [TestCase(5.6, 135.215052644935)] + [TestCase(6, 201.715636122456)] + [TestCase(6.4, 300.923349714678)] + [TestCase(6.8, 448.924202712783)] + [TestCase(7.2, 669.715755490113)] + [TestCase(7.6, 999.098197777775)] + [TestCase(8, 1490.47916125218)] + [TestCase(8.4, 2223.53348628359)] + public void Cosh_ReturnsCorrectResult(double input, double expectedResult) + { + var actualResult = (double)XLWorkbook.EvaluateExpr(string.Format("COSH({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedResult, actualResult, tolerance); + var actualResult2 = (double)XLWorkbook.EvaluateExpr(string.Format("COSH({0})", (-input).ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedResult, actualResult2, tolerance); + } + + [TestCase(1, 0.642092616)] + [TestCase(2, -0.457657554)] + [TestCase(3, -7.015252551)] + [TestCase(4, 0.863691154)] + [TestCase(5, -0.295812916)] + [TestCase(6, -3.436353004)] + [TestCase(7, 1.147515422)] + [TestCase(8, -0.147065064)] + [TestCase(9, -2.210845411)] + [TestCase(10, 1.542351045)] + [TestCase(11, -0.004425741)] + [TestCase(Math.PI * 0.5, 0)] + [TestCase(45, 0.617369624)] + [TestCase(-2, 0.457657554)] + [TestCase(-3, 7.015252551)] + public void Cot(double input, double expected) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"COT({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expected, actual, tolerance * 10.0); + } + + [Test] + public void Cot_Input0() + { + Assert.Throws(() => XLWorkbook.EvaluateExpr("COT(0)")); + } + + [Test] + public void Cot_On0_ThrowsDivisionByZeroException() + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(@"COTH(0)")); + } + + [TestCase(-10, -1.000000004)] + [TestCase(-9, -1.00000003)] + [TestCase(-8, -1.000000225)] + [TestCase(-7, -1.000001663)] + [TestCase(-6, -1.000012289)] + [TestCase(-5, -1.000090804)] + [TestCase(-4, -1.00067115)] + [TestCase(-3, -1.004969823)] + [TestCase(-2, -1.037314721)] + [TestCase(-1, -1.313035285)] + [TestCase(1, 1.313035285)] + [TestCase(2, 1.037314721)] + [TestCase(3, 1.004969823)] + [TestCase(4, 1.00067115)] + [TestCase(5, 1.000090804)] + [TestCase(6, 1.000012289)] + [TestCase(7, 1.000001663)] + [TestCase(8, 1.000000225)] + [TestCase(9, 1.00000003)] + [TestCase(10, 1.000000004)] + public void Coth_Examples(double input, double expected) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"COTH({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expected, actual, tolerance * 10.0); + } + + [Test] + public void Csc_On0_ThrowsDivisionByZeroException() + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(@"CSC(0)")); + } + + [TestCase(-10, 1.838163961)] + [TestCase(-9, -2.426486644)] + [TestCase(-8, -1.010756218)] + [TestCase(-7, -1.522101063)] + [TestCase(-6, 3.578899547)] + [TestCase(-5, 1.042835213)] + [TestCase(-4, 1.321348709)] + [TestCase(-3, -7.086167396)] + [TestCase(-2, -1.09975017)] + [TestCase(-1, -1.188395106)] + [TestCase(1, 1.188395106)] + [TestCase(2, 1.09975017)] + [TestCase(3, 7.086167396)] + [TestCase(4, -1.321348709)] + [TestCase(5, -1.042835213)] + [TestCase(6, -3.578899547)] + [TestCase(7, 1.522101063)] + [TestCase(8, 1.010756218)] + [TestCase(9, 2.426486644)] + [TestCase(10, -1.838163961)] + public void Csc_ReturnsCorrectValues(double input, double expected) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"CSC({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expected, actual, tolerance * 10); + } + + [TestCase(1, 0.850918128)] + [TestCase(2, 0.275720565)] + [TestCase(3, 0.09982157)] + [TestCase(4, 0.03664357)] + [TestCase(5, 0.013476506)] + [TestCase(6, 0.004957535)] + [TestCase(7, 0.001823765)] + [TestCase(8, 0.000670925)] + [TestCase(9, 0.00024682)] + [TestCase(10, 0.000090799859712122200000)] + [TestCase(11, 0.0000334034)] + public void CSch_CalculatesCorrectValues(double input, double expectedOutput) + { + Assert.AreEqual(expectedOutput, (double)XLWorkbook.EvaluateExpr($@"CSCH({input})"), 0.000000001); + } + + [Test] + public void Csch_ReturnsDivisionByZeroErrorOnInput0() + { + Assert.Throws(() => XLWorkbook.EvaluateExpr("CSCH(0)")); + } + + [TestCase("FF", 16, 255)] + [TestCase("111", 2, 7)] + [TestCase("zap", 36, 45745)] + public void Decimal(string inputString, int radix, int expectedResult) + { + var actualResult = XLWorkbook.EvaluateExpr($"DECIMAL(\"{inputString}\", {radix})"); + Assert.AreEqual(expectedResult, actualResult); + } + + [Theory] + public void Decimal_ReturnsErrorForRadiansGreater36([Range(37, 255)] int radix) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr($"DECIMAL(\"0\", {radix})")); + } + + [Theory] + public void Decimal_ReturnsErrorForRadiansSmaller2([Range(-5, 1)] int radix) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr($"DECIMAL(\"0\", {radix})")); + } + + [Test] + public void Decimal_ZeroIsZeroInAnyRadix([Range(2, 36)] int radix) + { + Assert.AreEqual(0, XLWorkbook.EvaluateExpr($"DECIMAL(\"0\", {radix})")); + } + + [TestCase(0, 0)] + [TestCase(Math.PI, 180)] + [TestCase(Math.PI * 2, 360)] + [TestCase(1, 57.2957795130823)] + [TestCase(2, 114.591559026165)] + [TestCase(3, 171.887338539247)] + [TestCase(4, 229.183118052329)] + [TestCase(5, 286.478897565412)] + [TestCase(6, 343.774677078494)] + [TestCase(7, 401.070456591576)] + [TestCase(8, 458.366236104659)] + [TestCase(9, 515.662015617741)] + [TestCase(10, 572.957795130823)] + [TestCase(Math.PI * 0.5, 90)] + [TestCase(Math.PI * 1.5, 270)] + [TestCase(Math.PI * 0.25, 45)] + [TestCase(-1, -57.2957795130823)] + public void Degrees_ReturnsCorrectResult(double input, double expected) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"DEGREES({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expected, actual, tolerance); + } + + [TestCase(1.5, 2)] + [TestCase(3, 4)] + [TestCase(2, 2)] + [TestCase(-1, -2)] + [TestCase(0, 0)] + [TestCase(Math.PI, 4)] + public void Even_ReturnsCorrectResults(double input, int expectedResult) + { + var actual = (int)XLWorkbook.EvaluateExpr(string.Format(@"EVEN({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedResult, actual); + } + + [TestCase(0, 1)] + [TestCase(1, Math.E)] + [TestCase(2, 7.38905609893065)] + [TestCase(3, 20.0855369231877)] + [TestCase(4, 54.5981500331442)] + [TestCase(5, 148.413159102577)] + [TestCase(6, 403.428793492735)] + [TestCase(7, 1096.63315842846)] + [TestCase(8, 2980.95798704173)] + [TestCase(9, 8103.08392757538)] + [TestCase(10, 22026.4657948067)] + [TestCase(11, 59874.1417151978)] + [TestCase(12, 162754.791419004)] + public void Exp_ReturnsCorrectResults(double input, double expectedResult) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"EXP({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedResult, actual, tolerance); + } + + [TestCase(0, 1L)] + [TestCase(1, 1L)] + [TestCase(2, 2L)] + [TestCase(3, 6L)] + [TestCase(4, 24L)] + [TestCase(5, 120L)] + [TestCase(6, 720L)] + [TestCase(7, 5040L)] + [TestCase(8, 40320L)] + [TestCase(9, 362880L)] + [TestCase(10, 3628800L)] + [TestCase(11, 39916800L)] + [TestCase(12, 479001600L)] + [TestCase(13, 6227020800L)] + [TestCase(14, 87178291200L)] + [TestCase(15, 1307674368000L)] + [TestCase(16, 20922789888000L)] + [TestCase(0.1, 1L)] + [TestCase(2.3, 2L)] + [TestCase(2.8, 2L)] + public void Fact_ReturnsCorrectResult(double input, long expectedResult) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"FACT({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedResult, actual); + } + + [Theory] + public void Fact_ThrowsNumberExceptionForNegativeInput([Range(-10, -1)] int input) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"FACT({0})", input.ToString(CultureInfo.InvariantCulture)))); + } + + [Test] + public void Fact_ThrowsValueExceptionForNonNumericInput() + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"FACT(""x"")"))); + } + + [TestCase(0, 1L)] + [TestCase(1, 1L)] + [TestCase(2, 2L)] + [TestCase(3, 3L)] + [TestCase(4, 8L)] + [TestCase(5, 15L)] + [TestCase(6, 48L)] + [TestCase(7, 105L)] + [TestCase(8, 384L)] + [TestCase(9, 945L)] + [TestCase(10, 3840L)] + [TestCase(11, 10395L)] + [TestCase(12, 46080L)] + [TestCase(13, 135135L)] + [TestCase(14, 645120)] + [TestCase(15, 2027025)] + [TestCase(16, 10321920)] + [TestCase(-1, 1L)] + [TestCase(0, 1)] + [TestCase(0.1, 1L)] + [TestCase(1.4, 1L)] + [TestCase(2.3, 2L)] + [TestCase(2.8, 2L)] + public void FactDouble_ReturnsCorrectResult(double input, long expectedResult) + { + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"FACTDOUBLE({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedResult, actual); + } + + [Theory] + public void FactDouble_ThrowsNumberExceptionForInputSmallerThanMinus1([Range(-10, -2)] int input) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"FACTDOUBLE({0})", input.ToString(CultureInfo.InvariantCulture)))); + } + + [Test] + public void FactDouble_ThrowsValueExceptionForNonNumericInput() + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"FACTDOUBLE(""x"")"))); + } + + [TestCase(24.3, 5, 20)] + [TestCase(6.7, 1, 6)] + [TestCase(-8.1, 2, -10)] + [TestCase(5.5, 2.1, 4.2)] + [TestCase(-5.5, 2.1, -6.3)] + [TestCase(-5.5, -2.1, -4.2)] + public void Floor(double input, double significance, double expectedResult) + { + var actual = (double)XLWorkbook.EvaluateExpr($"FLOOR({input.ToInvariantString()}, {significance.ToInvariantString()})"); + Assert.AreEqual(expectedResult, actual, tolerance); + } + + [TestCase(6.7, 0)] + [TestCase(-6.7, 0)] + public void Floor_ThrowsDivisionByZeroOnZeroSignificance(double input, double significance) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr($"FLOOR({input.ToInvariantString()}, {significance.ToInvariantString()})")); + } + + [TestCase(6.7, -1)] + public void Floor_ThrowsNumberExceptionOnInvalidInput(double input, double significance) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr($"FLOOR({input.ToInvariantString()}, {significance.ToInvariantString()})")); + } + + [Test] + // Functions have to support a period first before we can implement this + [TestCase(24.3, 5, null, 20)] + [TestCase(6.7, null, null, 6)] + [TestCase(-8.1, 2, null, -10)] + [TestCase(5.5, 2.1, 0, 4.2)] + [TestCase(5.5, -2.1, 0, 4.2)] + [TestCase(5.5, 0, 0, 0)] + [TestCase(5.5, 2.1, -1, 4.2)] + [TestCase(5.5, -2.1, -1, 4.2)] + [TestCase(5.5, 0, -2, 0)] + [TestCase(5.5, 2.1, 10, 4.2)] + [TestCase(5.5, -2.1, 10, 4.2)] + [TestCase(5.5, 0, 10, 0)] + [TestCase(-5.5, 2.1, 0, -6.3)] + [TestCase(-5.5, -2.1, 0, -6.3)] + [TestCase(-5.5, 0, 0, 0)] + [TestCase(-5.5, 2.1, -1, -4.2)] + [TestCase(-5.5, -2.1, -1, -4.2)] + [TestCase(-5.5, 0, -1, 0)] + [TestCase(-5.5, 2.1, 10, -4.2)] + [TestCase(-5.5, -2.1, 10, -4.2)] + [TestCase(-5.5, 0, 0, 0)] + public void FloorMath(double input, double? step, int? mode, double expectedResult) + { + string parameters = input.ToString(CultureInfo.InvariantCulture); + if (step != null) + { + parameters = parameters + ", " + step?.ToString(CultureInfo.InvariantCulture); + if (mode != null) + parameters = parameters + ", " + mode?.ToString(CultureInfo.InvariantCulture); + } + + var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"FLOOR.MATH({0})", parameters)); + Assert.AreEqual(expectedResult, actual, tolerance); + } + + [TestCase(8.9, 8)] + [TestCase(-8.9, -9)] + public void Int(double input, double expected) + { + var actual = XLWorkbook.EvaluateExpr(string.Format(@"INT({0})", input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expected, actual); + } + + [Test] + public void Mod() + { + double actual; + + actual = (double)XLWorkbook.EvaluateExpr(@"MOD(1.5, 1)"); + Assert.AreEqual(0.5, actual, tolerance); + + actual = (double)XLWorkbook.EvaluateExpr(@"MOD(3, 2)"); + Assert.AreEqual(1, actual, tolerance); + + actual = (double)XLWorkbook.EvaluateExpr(@"MOD(-3, 2)"); + Assert.AreEqual(1, actual, tolerance); + + actual = (double)XLWorkbook.EvaluateExpr(@"MOD(3, -2)"); + Assert.AreEqual(-1, actual, tolerance); + + actual = (double)XLWorkbook.EvaluateExpr(@"MOD(-3, -2)"); + Assert.AreEqual(-1, actual, tolerance); + + ////// + + actual = (double)XLWorkbook.EvaluateExpr(@"MOD(-4.3, -0.5)"); + Assert.AreEqual(-0.3, actual, tolerance); + + actual = (double)XLWorkbook.EvaluateExpr(@"MOD(6.9, -0.2)"); + Assert.AreEqual(-0.1, actual, tolerance); + + actual = (double)XLWorkbook.EvaluateExpr(@"MOD(0.7, 0.6)"); + Assert.AreEqual(0.1, actual, tolerance); + + actual = (double)XLWorkbook.EvaluateExpr(@"MOD(6.2, 1.1)"); + Assert.AreEqual(0.7, actual, tolerance); + } + + [TestCase(10, 3, ExpectedResult = 9.0)] + [TestCase(10.5, 3, ExpectedResult = 12.0)] + [TestCase(10.4, 3, ExpectedResult = 9.0)] + [TestCase(-10, -3, ExpectedResult = -9.0)] + [TestCase(1.3, 0.2, ExpectedResult = 1.4)] + [TestCase(5677.912288, 10, ExpectedResult = 5680.0)] + [TestCase(5674.912288, 10, ExpectedResult = 5670.0)] + [TestCase(0.5, 1, ExpectedResult = 1.0)] + [TestCase(0.49999, 1, ExpectedResult = 0.0)] + [TestCase(0.5, 1, ExpectedResult = 1.0)] + [TestCase(0.49999, 1, ExpectedResult = 0.0)] + [TestCase(0.5, 1, ExpectedResult = 1.0)] + [TestCase(0.49999, 1, ExpectedResult = 0.0)] + [TestCase(-13.4, -3, ExpectedResult = -12.0)] + [TestCase(-13.5, -3, ExpectedResult = -15.0)] + [TestCase(0.9, 0.2, ExpectedResult = 1.0)] + [TestCase(0.89999, 0.2, ExpectedResult = 0.8)] + [TestCase(15.5, 3, ExpectedResult = 15.0)] + [TestCase(1.4, 0.5, ExpectedResult = 1.5)] + [DefaultFloatingPointTolerance(1e-12)] + public double MRound(double number, double multiple) + { + return (double)XLWorkbook.EvaluateExpr($"MROUND({number}, {multiple})"); + } + + [TestCase(123456.123, -10)] + [TestCase(-123456.123, 5)] + public void MRoundExceptions(double number, double multiple) + { + Assert.Throws(() => XLWorkbook.EvaluateExpr($"MROUND({number}, {multiple})")); + } + + [TestCase(0, 1)] + [TestCase(0.3, 1.0467516)] + [TestCase(0.6, 1.21162831)] + [TestCase(0.9, 1.60872581)] + [TestCase(1.2, 2.759703601)] + [TestCase(1.5, 14.1368329)] + [TestCase(1.8, -4.401367872)] + [TestCase(2.1, -1.980801656)] + [TestCase(2.4, -1.356127641)] + [TestCase(2.7, -1.10610642)] + [TestCase(3.0, -1.010108666)] + [TestCase(3.3, -1.012678974)] + [TestCase(3.6, -1.115127532)] + [TestCase(3.9, -1.377538917)] + [TestCase(4.2, -2.039730601)] + [TestCase(4.5, -4.743927548)] + [TestCase(4.8, 11.42870421)] + [TestCase(5.1, 2.645658426)] + [TestCase(5.4, 1.575565187)] + [TestCase(5.7, 1.198016873)] + [TestCase(6.0, 1.041481927)] + [TestCase(6.3, 1.000141384)] + [TestCase(6.6, 1.052373922)] + [TestCase(6.9, 1.225903187)] + [TestCase(7.2, 1.643787029)] + [TestCase(7.5, 2.884876262)] + [TestCase(7.8, 18.53381902)] + [TestCase(8.1, -4.106031636)] + [TestCase(8.4, -1.925711244)] + [TestCase(8.7, -1.335743646)] + [TestCase(9.0, -1.097537906)] + [TestCase(9.3, -1.007835594)] + [TestCase(9.6, -1.015550252)] + [TestCase(9.9, -1.124617578)] + [TestCase(10.2, -1.400039323)] + [TestCase(10.5, -2.102886109)] + [TestCase(10.8, -5.145888341)] + [TestCase(11.1, 9.593612018)] + [TestCase(11.4, 2.541355049)] + [TestCase(45, 1.90359)] + [TestCase(30, 6.48292)] + public void Sec_ReturnsCorrectNumber(double input, double expectedOutput) + { + double result = (double)XLWorkbook.EvaluateExpr( + string.Format( + @"SEC({0})", + input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedOutput, result, 0.00001); + + // as the secant is symmetric for positive and negative numbers, let's assert twice: + double resultForNegative = (double)XLWorkbook.EvaluateExpr( + string.Format( + @"SEC({0})", + (-input).ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedOutput, resultForNegative, 0.00001); + } + + [Test] + public void Sec_ThrowsCellValueExceptionOnNonNumericValue() + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(@"SEC(""number"")")); + } + + [TestCase(-9, 0.00024682)] + [TestCase(-8, 0.000670925)] + [TestCase(-7, 0.001823762)] + [TestCase(-6, 0.004957474)] + [TestCase(-5, 0.013475282)] + [TestCase(-4, 0.036618993)] + [TestCase(-3, 0.099327927)] + [TestCase(-2, 0.265802229)] + [TestCase(-1, 0.648054274)] + [TestCase(0, 1)] + public void Sech_ReturnsCorrectNumber(double input, double expectedOutput) + { + double result = (double)XLWorkbook.EvaluateExpr( + string.Format( + @"SECH({0})", + input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedOutput, result, 0.00001); + + // as the secant is symmetric for positive and negative numbers, let's assert twice: + double resultForNegative = (double)XLWorkbook.EvaluateExpr( + string.Format( + @"SECH({0})", + (-input).ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedOutput, resultForNegative, 0.00001); + } + + /// + /// refers to Example 1 from the Excel documentation, + /// + /// + /// + /// + [TestCase(63000, "SUMIF(A1:A4,\">160000\", B1:B4)")] + [TestCase(900000, "SUMIF(A1:A4,\">160000\")")] + [TestCase(21000, "SUMIF(A1:A4, 300000, B1:B4)")] + [TestCase(28000, "SUMIF(A1:A4, \">\" &C1, B1:B4)")] + public void SumIf_ReturnsCorrectValues_ReferenceExample1FromMicrosoft(int expectedOutcome, string formula) + { + using (var wb = new XLWorkbook()) + { + wb.ReferenceStyle = XLReferenceStyle.A1; + + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell(1, 1).Value = 100000; + ws.Cell(1, 2).Value = 7000; + ws.Cell(2, 1).Value = 200000; + ws.Cell(2, 2).Value = 14000; + ws.Cell(3, 1).Value = 300000; + ws.Cell(3, 2).Value = 21000; + ws.Cell(4, 1).Value = 400000; + ws.Cell(4, 2).Value = 28000; + + ws.Cell(1, 3).Value = 300000; + + Assert.AreEqual(expectedOutcome, (double)ws.Evaluate(formula)); + } + } + + /// + /// refers to Example 2 from the Excel documentation, + /// + /// + /// + /// + [TestCase(2000, "SUMIF(A2:A7,\"Fruits\", C2:C7)")] + [TestCase(12000, "SUMIF(A2:A7,\"Vegetables\", C2:C7)")] + [TestCase(4300, "SUMIF(B2:B7, \"*es\", C2:C7)")] + [TestCase(400, "SUMIF(A2:A7, \"\", C2:C7)")] + public void SumIf_ReturnsCorrectValues_ReferenceExample2FromMicrosoft(int expectedOutcome, string formula) + { + using (var wb = new XLWorkbook()) + { + wb.ReferenceStyle = XLReferenceStyle.A1; + + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell(2, 1).Value = "Vegetables"; + ws.Cell(3, 1).Value = "Vegetables"; + ws.Cell(4, 1).Value = "Fruits"; + ws.Cell(5, 1).Value = ""; + ws.Cell(6, 1).Value = "Vegetables"; + ws.Cell(7, 1).Value = "Fruits"; + + ws.Cell(2, 2).Value = "Tomatoes"; + ws.Cell(3, 2).Value = "Celery"; + ws.Cell(4, 2).Value = "Oranges"; + ws.Cell(5, 2).Value = "Butter"; + ws.Cell(6, 2).Value = "Carrots"; + ws.Cell(7, 2).Value = "Apples"; + + ws.Cell(2, 3).Value = 2300; + ws.Cell(3, 3).Value = 5500; + ws.Cell(4, 3).Value = 800; + ws.Cell(5, 3).Value = 400; + ws.Cell(6, 3).Value = 4200; + ws.Cell(7, 3).Value = 1200; + + ws.Cell(1, 3).Value = 300000; + + Assert.AreEqual(expectedOutcome, (double)ws.Evaluate(formula)); + } + } + + [Test] + public void SumIf_ReturnsCorrectValues_WhenCalledOnFullColumn() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Data"); + var data = new object[] + { + new { Id = "A", Value = 2}, + new { Id = "B", Value = 3}, + new { Id = "C", Value = 2}, + new { Id = "A", Value = 1}, + new { Id = "B", Value = 4} + }; + ws.Cell("A1").InsertTable(data); + var formula = "=SUMIF(A:A,\"=A\",B:B)"; + var value = ws.Evaluate(formula); + Assert.AreEqual(3, value); + } + } + + [Test] + public void SumIf_ReturnsCorrectValues_WhenFormulaBelongToSameRange() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Data"); + var data = new object[] + { + new { Id = "A", Value = 2}, + new { Id = "B", Value = 3}, + new { Id = "C", Value = 2}, + new { Id = "A", Value = 1}, + new { Id = "B", Value = 4}, + }; + ws.Cell("A1").InsertTable(data); + ws.Cell("A7").SetValue("Sum A"); + // SUMIF formula + var formula = "=SUMIF(A:A,\"=A\",B:B)"; + ws.Cell("B7").SetFormulaA1(formula); + var value = ws.Cell("B7").Value; + Assert.AreEqual(3, value); + } + } + + /// + /// refers to Example 2 to SumIf from the Excel documentation. + /// As SumIfs should behave the same if called with three parameters, we can take that example here again. + /// + /// + /// + /// + [TestCase(2000, "SUMIFS(C2:C7, A2:A7, \"Fruits\")")] + [TestCase(12000, "SUMIFS(C2:C7, A2:A7, \"Vegetables\")")] + [TestCase(4300, "SUMIFS(C2:C7, B2:B7, \"*es\")")] + [TestCase(400, "SUMIFS(C2:C7, A2:A7, \"\")")] + public void SumIfs_ReturnsCorrectValues_ReferenceExample2FromMicrosoft(int expectedResult, string formula) + { + using (var wb = new XLWorkbook()) + { + wb.ReferenceStyle = XLReferenceStyle.A1; + + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell(2, 1).Value = "Vegetables"; + ws.Cell(3, 1).Value = "Vegetables"; + ws.Cell(4, 1).Value = "Fruits"; + ws.Cell(5, 1).Value = ""; + ws.Cell(6, 1).Value = "Vegetables"; + ws.Cell(7, 1).Value = "Fruits"; + + ws.Cell(2, 2).Value = "Tomatoes"; + ws.Cell(3, 2).Value = "Celery"; + ws.Cell(4, 2).Value = "Oranges"; + ws.Cell(5, 2).Value = "Butter"; + ws.Cell(6, 2).Value = "Carrots"; + ws.Cell(7, 2).Value = "Apples"; + + ws.Cell(2, 3).Value = 2300; + ws.Cell(3, 3).Value = 5500; + ws.Cell(4, 3).Value = 800; + ws.Cell(5, 3).Value = 400; + ws.Cell(6, 3).Value = 4200; + ws.Cell(7, 3).Value = 1200; + + ws.Cell(1, 3).Value = 300000; + + var actualResult = ws.Evaluate(formula).CastTo(); + Assert.AreEqual(expectedResult, actualResult); + } + } + + /// + /// refers to Example 1 to SumIf from the Excel documentation. + /// As SumIfs should behave the same if called with three parameters, but in a different order + /// + /// + /// + /// + [TestCase(63000, "SUMIFS(B1:B4, A1:A4, \">160000\")")] + [TestCase(21000, "SUMIFS(B1:B4, A1:A4, 300000)")] + [TestCase(28000, "SUMIFS(B1:B4, A1:A4, \">\" &C1)")] + public void SumIfs_ReturnsCorrectValues_ReferenceExampleForSumIf1FromMicrosoft(int expectedOutcome, string formula) + { + using (var wb = new XLWorkbook()) + { + wb.ReferenceStyle = XLReferenceStyle.A1; + + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell(1, 1).Value = 100000; + ws.Cell(1, 2).Value = 7000; + ws.Cell(2, 1).Value = 200000; + ws.Cell(2, 2).Value = 14000; + ws.Cell(3, 1).Value = 300000; + ws.Cell(3, 2).Value = 21000; + ws.Cell(4, 1).Value = 400000; + ws.Cell(4, 2).Value = 28000; + + ws.Cell(1, 3).Value = 300000; + + Assert.AreEqual(expectedOutcome, (double)ws.Evaluate(formula)); + } + } + + /// + /// refers to example data and formula to SumIfs in the Excel documentation, + /// + /// + [TestCase(20, "=SUMIFS(A2:A9, B2:B9, \"=A*\", C2:C9, \"Tom\")")] + [TestCase(30, "=SUMIFS(A2:A9, B2:B9, \"<>Bananas\", C2:C9, \"Tom\")")] + public void SumIfs_ReturnsCorrectValues_ReferenceExampleFromMicrosoft( + int expectedResult, + string formula) + { + using (var wb = new XLWorkbook()) + { + wb.ReferenceStyle = XLReferenceStyle.A1; + var ws = wb.AddWorksheet("Sheet1"); + + var row = 2; + + ws.Cell(row, 1).Value = 5; + ws.Cell(row, 2).Value = "Apples"; + ws.Cell(row, 3).Value = "Tom"; + row++; + + ws.Cell(row, 1).Value = 4; + ws.Cell(row, 2).Value = "Apples"; + ws.Cell(row, 3).Value = "Sarah"; + row++; + + ws.Cell(row, 1).Value = 15; + ws.Cell(row, 2).Value = "Artichokes"; + ws.Cell(row, 3).Value = "Tom"; + row++; + + ws.Cell(row, 1).Value = 3; + ws.Cell(row, 2).Value = "Artichokes"; + ws.Cell(row, 3).Value = "Sarah"; + row++; + + ws.Cell(row, 1).Value = 22; + ws.Cell(row, 2).Value = "Bananas"; + ws.Cell(row, 3).Value = "Tom"; + row++; + + ws.Cell(row, 1).Value = 12; + ws.Cell(row, 2).Value = "Bananas"; + ws.Cell(row, 3).Value = "Sarah"; + row++; + + ws.Cell(row, 1).Value = 10; + ws.Cell(row, 2).Value = "Carrots"; + ws.Cell(row, 3).Value = "Tom"; + row++; + + ws.Cell(row, 1).Value = 33; + ws.Cell(row, 2).Value = "Carrots"; + ws.Cell(row, 3).Value = "Sarah"; + + var actualResult = ws.Evaluate(formula).CastTo(); + + Assert.AreEqual(expectedResult, actualResult, tolerance); + } + } + + [Test] + public void SumProduct() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + ws.FirstCell().Value = Enumerable.Range(1, 10); + ws.FirstCell().CellRight().Value = Enumerable.Range(1, 10).Reverse(); + + Assert.AreEqual(2, ws.Evaluate("SUMPRODUCT(A2)")); + Assert.AreEqual(55, ws.Evaluate("SUMPRODUCT(A1:A10)")); + Assert.AreEqual(220, ws.Evaluate("SUMPRODUCT(A1:A10, B1:B10)")); + + Assert.Throws(() => ws.Evaluate("SUMPRODUCT(A1:A10, B1:B5)")); + + // Blank cells and cells with text should be treated as zeros + ws.Range("A1:A5").Clear(); + Assert.AreEqual(110, ws.Evaluate("SUMPRODUCT(A1:A10, B1:B10)")); + + ws.Range("A1:A5").SetValue("asdf"); + Assert.AreEqual(110, ws.Evaluate("SUMPRODUCT(A1:A10, B1:B10)")); + } + } + + [Test] + public void Trunc() + { + var input = 27.64799257; + var expectedResult = 27; + var actual = (double)XLWorkbook.EvaluateExpr($"TRUNC({input.ToString(CultureInfo.InvariantCulture)})"); + Assert.AreEqual(expectedResult, actual); + } + + [TestCase(27.64799257, -1, 20)] + [TestCase(27.64799257, 0, 27)] + [TestCase(27.64799257, 1, 27.6)] + [TestCase(27.64799257, 4, 27.6479)] + public void Trunc_Specify_Digits(double input, int digits, double expectedResult) + { + var actual = (double)XLWorkbook.EvaluateExpr($"TRUNC({input.ToString(CultureInfo.InvariantCulture)}, {digits})"); + Assert.AreEqual(expectedResult, actual); + } + } +} diff --git a/ClosedXML_Tests/Excel/CalcEngine/PrecedentCellsTests.cs b/ClosedXML_Tests/Excel/CalcEngine/PrecedentCellsTests.cs new file mode 100644 index 0000000..197033d --- /dev/null +++ b/ClosedXML_Tests/Excel/CalcEngine/PrecedentCellsTests.cs @@ -0,0 +1,86 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.Excel.CalcEngine +{ + [TestFixture] + public class PrecedentCellsTests + { + [Test] + public void GetPrecedentRangesPreventsDuplication() + { + using (var ms = new MemoryStream()) + { + using (XLWorkbook wb = new XLWorkbook()) + { + var sheet1 = wb.AddWorksheet("Sheet1") as XLWorksheet; + var sheet2 = wb.AddWorksheet("Sheet2"); + var formula = "=MAX(A2:E2)/COUNTBLANK(A2:E2)*MAX(B1:C3)+SUM(Sheet2!B1:C3)+SUM($A$2:$E$2)+A2+B$2+$C$2"; + + var ranges = sheet1.CalcEngine.GetPrecedentRanges(formula); + + Assert.AreEqual(6, ranges.Count()); + Assert.IsTrue(ranges.Any(r => r.RangeAddress.Worksheet.Name == "Sheet1" && r.RangeAddress.ToString() == "A2:E2")); + Assert.IsTrue(ranges.Any(r => r.RangeAddress.Worksheet.Name == "Sheet1" && r.RangeAddress.ToString() == "B1:C3")); + Assert.IsTrue(ranges.Any(r => r.RangeAddress.Worksheet.Name == "Sheet2" && r.RangeAddress.ToString() == "B1:C3")); + Assert.IsTrue(ranges.Any(r => r.RangeAddress.Worksheet.Name == "Sheet1" && r.RangeAddress.ToString() == "A2:A2")); + Assert.IsTrue(ranges.Any(r => r.RangeAddress.Worksheet.Name == "Sheet1" && r.RangeAddress.ToString() == "B$2:B$2")); + Assert.IsTrue(ranges.Any(r => r.RangeAddress.Worksheet.Name == "Sheet1" && r.RangeAddress.ToString() == "$C$2:$C$2")); + } + } + } + + [Test] + public void GetPrecedentRangesDealsWithNamedRanges() + { + using (var ms = new MemoryStream()) + { + using (XLWorkbook wb = new XLWorkbook()) + { + var sheet1 = wb.AddWorksheet("Sheet1") as XLWorksheet; + sheet1.NamedRanges.Add("NAMED_RANGE", sheet1.Range("A2:B3")); + var formula = "=SUM(NAMED_RANGE)"; + + var ranges = sheet1.CalcEngine.GetPrecedentRanges(formula); + + Assert.AreEqual(1, ranges.Count()); + Assert.AreEqual("$A$2:$B$3", ranges.First().RangeAddress.ToString()); + } + } + } + + [Test] + public void GetPrecedentCells() + { + using (var ms = new MemoryStream()) + { + using (XLWorkbook wb = new XLWorkbook()) + { + var sheet1 = wb.AddWorksheet("Sheet1") as XLWorksheet; + var sheet2 = wb.AddWorksheet("Sheet2"); + var formula = "=MAX(A2:E2)/COUNTBLANK(A2:E2)*MAX(B1:C3)+SUM(Sheet2!B1:C3)+SUM($A$2:$E$2)+A2+B$2+$C$2"; + var expectedAtSheet1 = new string[] + { "A2", "B2", "C2", "D2", "E2", "B1", "C1", "B3", "C3" }; + var expectedAtSheet2 = new string[] + { "B1", "C1", "B2", "C2", "B3", "C3" }; + + var cells = sheet1.CalcEngine.GetPrecedentCells(formula); + + Assert.AreEqual(15, cells.Count()); + foreach (var address in expectedAtSheet1) + { + Assert.IsTrue(cells.Any(cell => cell.Address.Worksheet.Name == sheet1.Name && cell.Address.ToString() == address), + string.Format("Address {0}!{1} is not presented", sheet1.Name, address)); + } + foreach (var address in expectedAtSheet2) + { + Assert.IsTrue(cells.Any(cell => cell.Address.Worksheet.Name == sheet2.Name && cell.Address.ToString() == address), + string.Format("Address {0}!{1} is not presented", sheet2.Name, address)); + } + } + } + } + } +} diff --git a/ClosedXML_Tests/Excel/CalcEngine/StatisticalTests.cs b/ClosedXML_Tests/Excel/CalcEngine/StatisticalTests.cs new file mode 100644 index 0000000..e4b7cdb --- /dev/null +++ b/ClosedXML_Tests/Excel/CalcEngine/StatisticalTests.cs @@ -0,0 +1,457 @@ +// Keep this file CodeMaid organised and cleaned +using ClosedXML.Excel; +using ClosedXML.Excel.CalcEngine; +using ClosedXML.Excel.CalcEngine.Exceptions; +using NUnit.Framework; +using System; +using System.Linq; + +namespace ClosedXML_Tests.Excel.CalcEngine +{ + [TestFixture] + public class StatisticalTests + { + private double tolerance = 1e-6; + private XLWorkbook workbook; + + [Test] + public void Average() + { + double value; + value = workbook.Evaluate("AVERAGE(-27.5,93.93,64.51,-70.56)").CastTo(); + Assert.AreEqual(15.095, value, tolerance); + + var ws = workbook.Worksheets.First(); + value = ws.Evaluate("AVERAGE(G3:G45)").CastTo(); + Assert.AreEqual(49.3255814, value, tolerance); + + Assert.That(() => ws.Evaluate("AVERAGE(D3:D45)"), Throws.TypeOf()); + } + + [Test] + public void Count() + { + var ws = workbook.Worksheets.First(); + int value; + value = ws.Evaluate(@"=COUNT(D3:D45)").CastTo(); + Assert.AreEqual(0, value); + + value = ws.Evaluate(@"=COUNT(G3:G45)").CastTo(); + Assert.AreEqual(43, value); + + value = ws.Evaluate(@"=COUNT(G:G)").CastTo(); + Assert.AreEqual(43, value); + + value = workbook.Evaluate(@"=COUNT(Data!G:G)").CastTo(); + Assert.AreEqual(43, value); + } + + [Test] + public void CountA() + { + var ws = workbook.Worksheets.First(); + int value; + value = ws.Evaluate(@"=COUNTA(D3:D45)").CastTo(); + Assert.AreEqual(43, value); + + value = ws.Evaluate(@"=COUNTA(G3:G45)").CastTo(); + Assert.AreEqual(43, value); + + value = ws.Evaluate(@"=COUNTA(G:G)").CastTo(); + Assert.AreEqual(44, value); + + value = workbook.Evaluate(@"=COUNTA(Data!G:G)").CastTo(); + Assert.AreEqual(44, value); + } + + [Test] + public void CountBlank() + { + var ws = workbook.Worksheets.First(); + int value; + value = ws.Evaluate(@"=COUNTBLANK(B:B)").CastTo(); + Assert.AreEqual(1048532, value); + + value = ws.Evaluate(@"=COUNTBLANK(D43:D49)").CastTo(); + Assert.AreEqual(4, value); + + value = ws.Evaluate(@"=COUNTBLANK(E3:E45)").CastTo(); + Assert.AreEqual(0, value); + + value = ws.Evaluate(@"=COUNTBLANK(A1)").CastTo(); + Assert.AreEqual(1, value); + + Assert.Throws(() => workbook.Evaluate(@"=COUNTBLANK(E3:E45)")); + Assert.Throws(() => ws.Evaluate(@"=COUNTBLANK()")); + Assert.Throws(() => ws.Evaluate(@"=COUNTBLANK(A3:A45,E3:E45)")); + } + + [Test] + public void CountIf() + { + var ws = workbook.Worksheets.First(); + int value; + value = ws.Evaluate(@"=COUNTIF(D3:D45,""Central"")").CastTo(); + Assert.AreEqual(24, value); + + value = ws.Evaluate(@"=COUNTIF(D:D,""Central"")").CastTo(); + Assert.AreEqual(24, value); + + value = workbook.Evaluate(@"=COUNTIF(Data!D:D,""Central"")").CastTo(); + Assert.AreEqual(24, value); + } + + [TestCase(@"=COUNTIF(Data!E:E, ""J*"")", 13)] + [TestCase(@"=COUNTIF(Data!E:E, ""*i*"")", 21)] + [TestCase(@"=COUNTIF(Data!E:E, ""*in*"")", 9)] + [TestCase(@"=COUNTIF(Data!E:E, ""*i*l"")", 9)] + [TestCase(@"=COUNTIF(Data!E:E, ""*i?e*"")", 9)] + [TestCase(@"=COUNTIF(Data!E:E, ""*o??s*"")", 10)] + [TestCase(@"=COUNTIF(Data!X1:X1000, """")", 1000)] + [TestCase(@"=COUNTIF(Data!E1:E44, """")", 1)] + public void CountIf_ConditionWithWildcards(string formula, int expectedResult) + { + var ws = workbook.Worksheets.First(); + + int value = ws.Evaluate(formula).CastTo(); + Assert.AreEqual(expectedResult, value); + } + + [TestCase(@"=COUNTIF(A1:A10, 1)", 1)] + [TestCase(@"=COUNTIF(A1:A10, 2.0)", 1)] + [TestCase(@"=COUNTIF(A1:A10, ""3"")", 2)] + [TestCase(@"=COUNTIF(A1:A10, 3)", 2)] + [TestCase(@"=COUNTIF(A1:A10, 43831)", 1)] + [TestCase(@"=COUNTIF(A1:A10, DATE(2020, 1, 1))", 1)] + [TestCase(@"=COUNTIF(A1:A10, TRUE)", 1)] + public void CountIf_MixedData(string formula, int expected) + { + // We follow to Excel's convention. + // Excel treats 1 and TRUE as unequal, but 3 and "3" as equal + // LibreOffice Calc handles some SUMIF and COUNTIF differently, e.g. it treats 1 and TRUE as equal, but 3 and "3" differently + var ws = workbook.Worksheet("MixedData"); + Assert.AreEqual(expected, ws.Evaluate(formula)); + } + + [TestCase("x", @"=COUNTIF(A1:A1, ""?"")", 1)] + [TestCase("x", @"=COUNTIF(A1:A1, ""~?"")", 0)] + [TestCase("?", @"=COUNTIF(A1:A1, ""~?"")", 1)] + [TestCase("~?", @"=COUNTIF(A1:A1, ""~?"")", 0)] + [TestCase("~?", @"=COUNTIF(A1:A1, ""~~~?"")", 1)] + [TestCase("?", @"=COUNTIF(A1:A1, ""~~?"")", 0)] + [TestCase("~?", @"=COUNTIF(A1:A1, ""~~?"")", 1)] + [TestCase("~x", @"=COUNTIF(A1:A1, ""~~?"")", 1)] + [TestCase("*", @"=COUNTIF(A1:A1, ""~*"")", 1)] + [TestCase("~*", @"=COUNTIF(A1:A1, ""~*"")", 0)] + [TestCase("~*", @"=COUNTIF(A1:A1, ""~~~*"")", 1)] + [TestCase("*", @"=COUNTIF(A1:A1, ""~~*"")", 0)] + [TestCase("~*", @"=COUNTIF(A1:A1, ""~~*"")", 1)] + [TestCase("~x", @"=COUNTIF(A1:A1, ""~~*"")", 1)] + [TestCase("~xyz", @"=COUNTIF(A1:A1, ""~~*"")", 1)] + public void CountIf_MoreWildcards(string cellContent, string formula, int expectedResult) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + ws.Cell(1, 1).Value = cellContent; + + Assert.AreEqual(expectedResult, (double)ws.Evaluate(formula)); + } + } + + [TestCase("=COUNTIFS(B1:D1, \"=Yes\")", 1)] + [TestCase("=COUNTIFS(B1:B4, \"=Yes\", C1:C4, \"=Yes\")", 2)] + [TestCase("= COUNTIFS(B4:D4, \"=Yes\", B2:D2, \"=Yes\")", 1)] + public void CountIfs_ReferenceExample1FromExcelDocumentations( + string formula, + int expectedOutcome) + { + using (var wb = new XLWorkbook()) + { + wb.ReferenceStyle = XLReferenceStyle.A1; + + var ws = wb.AddWorksheet("Sheet1"); + + ws.Cell(1, 1).Value = "Davidoski"; + ws.Cell(1, 2).Value = "Yes"; + ws.Cell(1, 3).Value = "No"; + ws.Cell(1, 4).Value = "No"; + + ws.Cell(2, 1).Value = "Burke"; + ws.Cell(2, 2).Value = "Yes"; + ws.Cell(2, 3).Value = "Yes"; + ws.Cell(2, 4).Value = "No"; + + ws.Cell(3, 1).Value = "Sundaram"; + ws.Cell(3, 2).Value = "Yes"; + ws.Cell(3, 3).Value = "Yes"; + ws.Cell(3, 4).Value = "Yes"; + + ws.Cell(4, 1).Value = "Levitan"; + ws.Cell(4, 2).Value = "No"; + ws.Cell(4, 3).Value = "Yes"; + ws.Cell(4, 4).Value = "Yes"; + + Assert.AreEqual(expectedOutcome, ws.Evaluate(formula)); + } + } + + [Test] + public void CountIfs_SingleCondition() + { + var ws = workbook.Worksheets.First(); + int value; + value = ws.Evaluate(@"=COUNTIFS(D3:D45,""Central"")").CastTo(); + Assert.AreEqual(24, value); + + value = ws.Evaluate(@"=COUNTIFS(D:D,""Central"")").CastTo(); + Assert.AreEqual(24, value); + + value = workbook.Evaluate(@"=COUNTIFS(Data!D:D,""Central"")").CastTo(); + Assert.AreEqual(24, value); + } + + [TestCase(@"=COUNTIFS(Data!E:E, ""J*"")", 13)] + [TestCase(@"=COUNTIFS(Data!E:E, ""*i*"")", 21)] + [TestCase(@"=COUNTIFS(Data!E:E, ""*in*"")", 9)] + [TestCase(@"=COUNTIFS(Data!E:E, ""*i*l"")", 9)] + [TestCase(@"=COUNTIFS(Data!E:E, ""*i?e*"")", 9)] + [TestCase(@"=COUNTIFS(Data!E:E, ""*o??s*"")", 10)] + [TestCase(@"=COUNTIFS(Data!X1:X1000, """")", 1000)] + [TestCase(@"=COUNTIFS(Data!E1:E44, """")", 1)] + public void CountIfs_SingleConditionWithWildcards(string formula, int expectedResult) + { + var ws = workbook.Worksheets.First(); + + int value = ws.Evaluate(formula).CastTo(); + Assert.AreEqual(expectedResult, value); + } + + [OneTimeTearDown] + public void Dispose() + { + workbook.Dispose(); + } + + [SetUp] + public void Init() + { + // Make sure tests run on a deterministic culture + System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); + workbook = SetupWorkbook(); + } + + [Test] + public void Max() + { + var ws = workbook.Worksheets.First(); + int value; + value = ws.Evaluate(@"=MAX(D3:D45)").CastTo(); + Assert.AreEqual(0, value); + + value = ws.Evaluate(@"=MAX(G3:G45)").CastTo(); + Assert.AreEqual(96, value); + + value = ws.Evaluate(@"=MAX(G:G)").CastTo(); + Assert.AreEqual(96, value); + + value = workbook.Evaluate(@"=MAX(Data!G:G)").CastTo(); + Assert.AreEqual(96, value); + } + + [Test] + public void Min() + { + var ws = workbook.Worksheets.First(); + int value; + value = ws.Evaluate(@"=MIN(D3:D45)").CastTo(); + Assert.AreEqual(0, value); + + value = ws.Evaluate(@"=MIN(G3:G45)").CastTo(); + Assert.AreEqual(2, value); + + value = ws.Evaluate(@"=MIN(G:G)").CastTo(); + Assert.AreEqual(2, value); + + value = workbook.Evaluate(@"=MIN(Data!G:G)").CastTo(); + Assert.AreEqual(2, value); + } + + [Test] + public void StDev() + { + var ws = workbook.Worksheets.First(); + double value; + Assert.That(() => ws.Evaluate(@"=STDEV(D3:D45)"), Throws.TypeOf()); + + value = ws.Evaluate(@"=STDEV(H3:H45)").CastTo(); + Assert.AreEqual(47.34511769, value, tolerance); + + value = ws.Evaluate(@"=STDEV(H:H)").CastTo(); + Assert.AreEqual(47.34511769, value, tolerance); + + value = workbook.Evaluate(@"=STDEV(Data!H:H)").CastTo(); + Assert.AreEqual(47.34511769, value, tolerance); + } + + [Test] + public void StDevP() + { + var ws = workbook.Worksheets.First(); + double value; + Assert.That(() => ws.Evaluate(@"=STDEVP(D3:D45)"), Throws.InvalidOperationException); + + value = ws.Evaluate(@"=STDEVP(H3:H45)").CastTo(); + Assert.AreEqual(46.79135458, value, tolerance); + + value = ws.Evaluate(@"=STDEVP(H:H)").CastTo(); + Assert.AreEqual(46.79135458, value, tolerance); + + value = workbook.Evaluate(@"=STDEVP(Data!H:H)").CastTo(); + Assert.AreEqual(46.79135458, value, tolerance); + } + + [TestCase(@"=SUMIF(A1:A10, 1, A1:A10)", 1)] + [TestCase(@"=SUMIF(A1:A10, 2.0, A1:A10)", 2)] + [TestCase(@"=SUMIF(A1:A10, 3, A1:A10)", 3)] + [TestCase(@"=SUMIF(A1:A10, ""3"", A1:A10)", 3)] + [TestCase(@"=SUMIF(A1:A10, 43831, A1:A10)", 43831)] + [TestCase(@"=SUMIF(A1:A10, DATE(2020, 1, 1), A1:A10)", 43831)] + [TestCase(@"=SUMIF(A1:A10, TRUE, A1:A10)", 0)] + public void SumIf_MixedData(string formula, double expected) + { + // We follow to Excel's convention. + // Excel treats 1 and TRUE as unequal, but 3 and "3" as equal + // LibreOffice Calc handles some SUMIF and COUNTIF differently, e.g. it treats 1 and TRUE as equal, but 3 and "3" differently + var ws = workbook.Worksheet("MixedData"); + Assert.AreEqual(expected, ws.Evaluate(formula)); + } + + [Test] + [TestCase("COUNT(G:I,G:G,H:I)", 258d, Description = "COUNT overlapping columns")] + [TestCase("COUNT(6:8,6:6,7:8)", 30d, Description = "COUNT overlapping rows")] + [TestCase("COUNTBLANK(H:J)", 3145640d, Description = "COUNTBLANK columns")] + [TestCase("COUNTBLANK(7:9)", 49128d, Description = "COUNTBLANK rows")] + [TestCase("COUNT(1:1048576)", 216d, Description = "COUNT worksheet")] + [TestCase("COUNTBLANK(1:1048576)", 17179868831d, Description = "COUNTBLANK worksheet")] + [TestCase("SUM(H:J)", 20501.15d, Description = "SUM columns")] + [TestCase("SUM(4:5)", 85366.12d, Description = "SUM rows")] + [TestCase("SUMIF(G:G,50,H:H)", 24.98d, Description = "SUMIF columns")] + [TestCase("SUMIF(G23:G52,\"\",H3:H32)", 53.24d, Description = "SUMIF ranges")] + [TestCase("SUMIFS(H:H,G:G,50,I:I,\">900\")", 19.99d, Description = "SUMIFS columns")] + public void TallySkipsEmptyCells(string formulaA1, double expectedResult) + { + using (var wb = SetupWorkbook()) + { + var ws = wb.Worksheets.First(); + //Let's pre-initialize cells we need so they didn't affect the result + ws.Range("A1:J45").Style.Fill.BackgroundColor = XLColor.Amber; + ws.Cell("ZZ1000").Value = 1; + int initialCount = (ws as XLWorksheet).Internals.CellsCollection.Count; + + var actualResult = (double)ws.Evaluate(formulaA1); + int cellsCount = (ws as XLWorksheet).Internals.CellsCollection.Count; + + Assert.AreEqual(expectedResult, actualResult, tolerance); + Assert.AreEqual(initialCount, cellsCount); + } + } + + [Test] + public void Var() + { + var ws = workbook.Worksheets.First(); + double value; + Assert.That(() => ws.Evaluate(@"=VAR(D3:D45)"), Throws.InvalidOperationException); + + value = ws.Evaluate(@"=VAR(H3:H45)").CastTo(); + Assert.AreEqual(2241.560169, value, tolerance); + + value = ws.Evaluate(@"=VAR(H:H)").CastTo(); + Assert.AreEqual(2241.560169, value, tolerance); + + value = workbook.Evaluate(@"=VAR(Data!H:H)").CastTo(); + Assert.AreEqual(2241.560169, value, tolerance); + } + + [Test] + public void VarP() + { + var ws = workbook.Worksheets.First(); + double value; + Assert.That(() => ws.Evaluate(@"=VARP(D3:D45)"), Throws.InvalidOperationException); + + value = ws.Evaluate(@"=VARP(H3:H45)").CastTo(); + Assert.AreEqual(2189.430863, value, tolerance); + + value = ws.Evaluate(@"=VARP(H:H)").CastTo(); + Assert.AreEqual(2189.430863, value, tolerance); + + value = workbook.Evaluate(@"=VARP(Data!H:H)").CastTo(); + Assert.AreEqual(2189.430863, value, tolerance); + } + + private XLWorkbook SetupWorkbook() + { + var wb = new XLWorkbook(); + var ws1 = wb.AddWorksheet("Data"); + var data = new object[] + { + new {Id=1, OrderDate = DateTime.Parse("2015-01-06"), Region = "East", Rep = "Jones", Item = "Pencil", Units = 95, UnitCost = 1.99, Total = 189.05 }, + new {Id=2, OrderDate = DateTime.Parse("2015-01-23"), Region = "Central", Rep = "Kivell", Item = "Binder", Units = 50, UnitCost = 19.99, Total = 999.5}, + new {Id=3, OrderDate = DateTime.Parse("2015-02-09"), Region = "Central", Rep = "Jardine", Item = "Pencil", Units = 36, UnitCost = 4.99, Total = 179.64}, + new {Id=4, OrderDate = DateTime.Parse("2015-02-26"), Region = "Central", Rep = "Gill", Item = "Pen", Units = 27, UnitCost = 19.99, Total = 539.73}, + new {Id=5, OrderDate = DateTime.Parse("2015-03-15"), Region = "West", Rep = "Sorvino", Item = "Pencil", Units = 56, UnitCost = 2.99, Total = 167.44}, + new {Id=6, OrderDate = DateTime.Parse("2015-04-01"), Region = "East", Rep = "Jones", Item = "Binder", Units = 60, UnitCost = 4.99, Total = 299.4}, + new {Id=7, OrderDate = DateTime.Parse("2015-04-18"), Region = "Central", Rep = "Andrews", Item = "Pencil", Units = 75, UnitCost = 1.99, Total = 149.25}, + new {Id=8, OrderDate = DateTime.Parse("2015-05-05"), Region = "Central", Rep = "Jardine", Item = "Pencil", Units = 90, UnitCost = 4.99, Total = 449.1}, + new {Id=9, OrderDate = DateTime.Parse("2015-05-22"), Region = "West", Rep = "Thompson", Item = "Pencil", Units = 32, UnitCost = 1.99, Total = 63.68}, + new {Id=10, OrderDate = DateTime.Parse("2015-06-08"), Region = "East", Rep = "Jones", Item = "Binder", Units = 60, UnitCost = 8.99, Total = 539.4}, + new {Id=11, OrderDate = DateTime.Parse("2015-06-25"), Region = "Central", Rep = "Morgan", Item = "Pencil", Units = 90, UnitCost = 4.99, Total = 449.1}, + new {Id=12, OrderDate = DateTime.Parse("2015-07-12"), Region = "East", Rep = "Howard", Item = "Binder", Units = 29, UnitCost = 1.99, Total = 57.71}, + new {Id=13, OrderDate = DateTime.Parse("2015-07-29"), Region = "East", Rep = "Parent", Item = "Binder", Units = 81, UnitCost = 19.99, Total = 1619.19}, + new {Id=14, OrderDate = DateTime.Parse("2015-08-15"), Region = "East", Rep = "Jones", Item = "Pencil", Units = 35, UnitCost = 4.99, Total = 174.65}, + new {Id=15, OrderDate = DateTime.Parse("2015-09-01"), Region = "Central", Rep = "Smith", Item = "Desk", Units = 2, UnitCost = 125, Total = 250}, + new {Id=16, OrderDate = DateTime.Parse("2015-09-18"), Region = "East", Rep = "Jones", Item = "Pen Set", Units = 16, UnitCost = 15.99, Total = 255.84}, + new {Id=17, OrderDate = DateTime.Parse("2015-10-05"), Region = "Central", Rep = "Morgan", Item = "Binder", Units = 28, UnitCost = 8.99, Total = 251.72}, + new {Id=18, OrderDate = DateTime.Parse("2015-10-22"), Region = "East", Rep = "Jones", Item = "Pen", Units = 64, UnitCost = 8.99, Total = 575.36}, + new {Id=19, OrderDate = DateTime.Parse("2015-11-08"), Region = "East", Rep = "Parent", Item = "Pen", Units = 15, UnitCost = 19.99, Total = 299.85}, + new {Id=20, OrderDate = DateTime.Parse("2015-11-25"), Region = "Central", Rep = "Kivell", Item = "Pen Set", Units = 96, UnitCost = 4.99, Total = 479.04}, + new {Id=21, OrderDate = DateTime.Parse("2015-12-12"), Region = "Central", Rep = "Smith", Item = "Pencil", Units = 67, UnitCost = 1.29, Total = 86.43}, + new {Id=22, OrderDate = DateTime.Parse("2015-12-29"), Region = "East", Rep = "Parent", Item = "Pen Set", Units = 74, UnitCost = 15.99, Total = 1183.26}, + new {Id=23, OrderDate = DateTime.Parse("2016-01-15"), Region = "Central", Rep = "Gill", Item = "Binder", Units = 46, UnitCost = 8.99, Total = 413.54}, + new {Id=24, OrderDate = DateTime.Parse("2016-02-01"), Region = "Central", Rep = "Smith", Item = "Binder", Units = 87, UnitCost = 15, Total = 1305}, + new {Id=25, OrderDate = DateTime.Parse("2016-02-18"), Region = "East", Rep = "Jones", Item = "Binder", Units = 4, UnitCost = 4.99, Total = 19.96}, + new {Id=26, OrderDate = DateTime.Parse("2016-03-07"), Region = "West", Rep = "Sorvino", Item = "Binder", Units = 7, UnitCost = 19.99, Total = 139.93}, + new {Id=27, OrderDate = DateTime.Parse("2016-03-24"), Region = "Central", Rep = "Jardine", Item = "Pen Set", Units = 50, UnitCost = 4.99, Total = 249.5}, + new {Id=28, OrderDate = DateTime.Parse("2016-04-10"), Region = "Central", Rep = "Andrews", Item = "Pencil", Units = 66, UnitCost = 1.99, Total = 131.34}, + new {Id=29, OrderDate = DateTime.Parse("2016-04-27"), Region = "East", Rep = "Howard", Item = "Pen", Units = 96, UnitCost = 4.99, Total = 479.04}, + new {Id=30, OrderDate = DateTime.Parse("2016-05-14"), Region = "Central", Rep = "Gill", Item = "Pencil", Units = 53, UnitCost = 1.29, Total = 68.37}, + new {Id=31, OrderDate = DateTime.Parse("2016-05-31"), Region = "Central", Rep = "Gill", Item = "Binder", Units = 80, UnitCost = 8.99, Total = 719.2}, + new {Id=32, OrderDate = DateTime.Parse("2016-06-17"), Region = "Central", Rep = "Kivell", Item = "Desk", Units = 5, UnitCost = 125, Total = 625}, + new {Id=33, OrderDate = DateTime.Parse("2016-07-04"), Region = "East", Rep = "Jones", Item = "Pen Set", Units = 62, UnitCost = 4.99, Total = 309.38}, + new {Id=34, OrderDate = DateTime.Parse("2016-07-21"), Region = "Central", Rep = "Morgan", Item = "Pen Set", Units = 55, UnitCost = 12.49, Total = 686.95}, + new {Id=35, OrderDate = DateTime.Parse("2016-08-07"), Region = "Central", Rep = "Kivell", Item = "Pen Set", Units = 42, UnitCost = 23.95, Total = 1005.9}, + new {Id=36, OrderDate = DateTime.Parse("2016-08-24"), Region = "West", Rep = "Sorvino", Item = "Desk", Units = 3, UnitCost = 275, Total = 825}, + new {Id=37, OrderDate = DateTime.Parse("2016-09-10"), Region = "Central", Rep = "Gill", Item = "Pencil", Units = 7, UnitCost = 1.29, Total = 9.03}, + new {Id=38, OrderDate = DateTime.Parse("2016-09-27"), Region = "West", Rep = "Sorvino", Item = "Pen", Units = 76, UnitCost = 1.99, Total = 151.24}, + new {Id=39, OrderDate = DateTime.Parse("2016-10-14"), Region = "West", Rep = "Thompson", Item = "Binder", Units = 57, UnitCost = 19.99, Total = 1139.43}, + new {Id=40, OrderDate = DateTime.Parse("2016-10-31"), Region = "Central", Rep = "Andrews", Item = "Pencil", Units = 14, UnitCost = 1.29, Total = 18.06}, + new {Id=41, OrderDate = DateTime.Parse("2016-11-17"), Region = "Central", Rep = "Jardine", Item = "Binder", Units = 11, UnitCost = 4.99, Total = 54.89}, + new {Id=42, OrderDate = DateTime.Parse("2016-12-04"), Region = "Central", Rep = "Jardine", Item = "Binder", Units = 94, UnitCost = 19.99, Total = 1879.06}, + new {Id=43, OrderDate = DateTime.Parse("2016-12-21"), Region = "Central", Rep = "Andrews", Item = "Binder", Units = 28, UnitCost = 4.99, Total = 139.72} + }; + + ws1.FirstCell() + .CellBelow() + .CellRight() + .InsertTable(data, "Table1"); + + var ws2 = wb.AddWorksheet("MixedData"); + ws2.FirstCell().InsertData(new object[] { 1, 2.0, "3", 3, new DateTime(2020, 1, 1), true, new TimeSpan(10, 5, 30, 10) }); + + return wb; + } + } +} diff --git a/ClosedXML_Tests/Excel/CalcEngine/TextTests.cs b/ClosedXML_Tests/Excel/CalcEngine/TextTests.cs new file mode 100644 index 0000000..74046b0 --- /dev/null +++ b/ClosedXML_Tests/Excel/CalcEngine/TextTests.cs @@ -0,0 +1,696 @@ +using ClosedXML.Excel; +using ClosedXML.Excel.CalcEngine; +using ClosedXML.Excel.CalcEngine.Exceptions; +using NUnit.Framework; +using System; +using System.Globalization; +using System.Threading; + +namespace ClosedXML_Tests.Excel.CalcEngine +{ + [TestFixture] + public class TextTests + { + [SetUp] + public void Init() + { + // Make sure tests run on a deterministic culture + Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); + } + + [Test] + public void Char_Empty_Input_String() + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(@"Char("""")")); + } + + [Test] + public void Char_Input_Too_Large() + { + Assert.Throws(() => XLWorkbook.EvaluateExpr(@"Char(9797)")); + } + + [Test] + public void Char_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Char(97)"); + Assert.AreEqual("a", actual); + } + + [Test] + public void Clean_Empty_Input_String() + { + Object actual = XLWorkbook.EvaluateExpr(@"Clean("""")"); + Assert.AreEqual("", actual); + } + + [Test] + public void Clean_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Clean(CHAR(9)&""Monthly report""&CHAR(10))"); + Assert.AreEqual("Monthly report", actual); + + actual = XLWorkbook.EvaluateExpr(@"Clean("" "")"); + Assert.AreEqual(" ", actual); + } + + [Test] + public void Code_Empty_Input_String() + { + // Todo: more specific exception - ValueException? + Assert.That(() => XLWorkbook.EvaluateExpr(@"Code("""")"), Throws.TypeOf()); + } + + [Test] + public void Code_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Code(""A"")"); + Assert.AreEqual(65, actual); + + actual = XLWorkbook.EvaluateExpr(@"Code(""BCD"")"); + Assert.AreEqual(66, actual); + } + + [Test] + public void Concat_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Concat(""ABC"", ""123"")"); + Assert.AreEqual("ABC123", actual); + + actual = XLWorkbook.EvaluateExpr(@"Concat("""", ""123"")"); + Assert.AreEqual("123", actual); + + var ws = new XLWorkbook().AddWorksheet(); + + ws.FirstCell().SetValue(20) + .CellBelow().SetValue("AB") + .CellBelow().SetFormulaA1("=DATE(2019,1,1)") + .CellBelow().SetFormulaA1("=CONCAT(A1:A3)"); + + actual = ws.Cell("A4").Value; + Assert.AreEqual("20AB43466", actual); + } + + [Test] + public void Concatenate_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Concatenate(""ABC"", ""123"")"); + Assert.AreEqual("ABC123", actual); + + actual = XLWorkbook.EvaluateExpr(@"Concatenate("""", ""123"")"); + Assert.AreEqual("123", actual); + + // TODO: Fix CONCATENATE when calling cell references are available + // In Excel, it seems that if the parameter is a range, + // CONCATENATE will return the cell in the range that is the same row number as the calling cell, + // i.e. the cell with the CONCATENATE function. + // Therefore we need reference info about the calling cell to solve this. + // If we can solve ROW(), then we can solve this too. + // For the example below, the calling cell doesn't share any + + var ws = new XLWorkbook().AddWorksheet(); + + ws.FirstCell().SetValue(20) + .CellBelow().SetValue("AB") + .CellBelow().SetFormulaA1("=DATE(2019,1,1)"); + + // Calling cell is 1st row, so formula should return A1 + //ws.Cell("B1").SetFormulaA1("=CONCATENATE(A1:A3)"); + //Assert.AreEqual("20", ws.Cell("B1").Value); + + // Calling cell is 2nd row, so formula should return A2 + //ws.Cell("B2").SetFormulaA1("=CONCATENATE(A1:A3)"); + //Assert.AreEqual("AB", ws.Cell("B2").Value); + + // Calling cell is 3rd row, so formula should return A3's textual representation + //ws.Cell("B3").SetFormulaA1("=CONCATENATE(A1:A3)"); + //Assert.AreEqual("43466", ws.Cell("B3").Value); + + // Calling cell doesn't share row with any cell in parameter range. Throw CellValueException + //ws.Cell("A4").SetFormulaA1("=CONCATENATE(A1:A3)"); + //Assert.Throws(() => ws.Cell("A4").GetString()); + } + + [Test] + public void Concatenate_with_references() + { + var ws = new XLWorkbook().AddWorksheet(); + + ws.Cell("A1").Value = "Hello"; + ws.Cell("B1").Value = "World"; + + Assert.AreEqual("Hello World", ws.Evaluate(@"=CONCATENATE(A1, "" "", B1)")); + Assert.Throws(() => ws.Evaluate(@"=CONCATENATE(A1:A2, "" "", B1:B2)")); + } + + [Test] + public void Dollar_Empty_Input_String() + { + Assert.That(() => XLWorkbook.EvaluateExpr(@"Dollar("", 3)"), Throws.TypeOf()); + } + + [Test] + public void Dollar_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Dollar(123.54)"); + Assert.AreEqual("$123.54", actual); + + actual = XLWorkbook.EvaluateExpr(@"Dollar(123.54, 3)"); + Assert.AreEqual("$123.540", actual); + } + + [Test] + public void Exact_Empty_Input_String() + { + Object actual = XLWorkbook.EvaluateExpr(@"Exact("""", """")"); + Assert.AreEqual(true, actual); + } + + [Test] + public void Exact_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Exact(""asdf"", ""asdf"")"); + Assert.AreEqual(true, actual); + + actual = XLWorkbook.EvaluateExpr(@"Exact(""asdf"", ""ASDF"")"); + Assert.AreEqual(false, actual); + + actual = XLWorkbook.EvaluateExpr(@"Exact(123, 123)"); + Assert.AreEqual(true, actual); + + actual = XLWorkbook.EvaluateExpr(@"Exact(321, 123)"); + Assert.AreEqual(false, actual); + } + + [Test] + public void Find_Start_Position_Too_Large() + { + Assert.That(() => XLWorkbook.EvaluateExpr(@"Find(""abc"", ""abcdef"", 10)"), Throws.TypeOf()); + } + + [Test] + public void Find_String_In_Another_Empty_String() + { + Assert.That(() => XLWorkbook.EvaluateExpr(@"Find(""abc"", """")"), Throws.TypeOf()); + } + + [Test] + public void Find_String_Not_Found() + { + Assert.That(() => XLWorkbook.EvaluateExpr(@"Find(""123"", ""asdf"")"), Throws.TypeOf()); + } + + [Test] + public void Find_Case_Sensitive_String_Not_Found() + { + // Find is case-sensitive + Assert.That(() => XLWorkbook.EvaluateExpr(@"Find(""excel"", ""Microsoft Excel 2010"")"), Throws.TypeOf()); + } + + [Test] + public void Find_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Find(""Tuesday"", ""Today is Tuesday"")"); + Assert.AreEqual(10, actual); + + actual = XLWorkbook.EvaluateExpr(@"Find("""", """")"); + Assert.AreEqual(1, actual); + + actual = XLWorkbook.EvaluateExpr(@"Find("""", ""asdf"")"); + Assert.AreEqual(1, actual); + } + + [Test] + public void Fixed_Input_Is_String() + { + Assert.That(() => XLWorkbook.EvaluateExpr(@"Fixed(""asdf"")"), Throws.TypeOf()); + } + + [Test] + public void Fixed_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Fixed(17300.67, 4)"); + Assert.AreEqual("17,300.6700", actual); + + actual = XLWorkbook.EvaluateExpr(@"Fixed(17300.67, 2, TRUE)"); + Assert.AreEqual("17300.67", actual); + + actual = XLWorkbook.EvaluateExpr(@"Fixed(17300.67)"); + Assert.AreEqual("17,300.67", actual); + } + + [Test] + public void Left_Bigger_Than_Length() + { + Object actual = XLWorkbook.EvaluateExpr(@"Left(""ABC"", 5)"); + Assert.AreEqual("ABC", actual); + } + + [Test] + public void Left_Default() + { + Object actual = XLWorkbook.EvaluateExpr(@"Left(""ABC"")"); + Assert.AreEqual("A", actual); + } + + [Test] + public void Left_Empty_Input_String() + { + Object actual = XLWorkbook.EvaluateExpr(@"Left("""")"); + Assert.AreEqual("", actual); + } + + [Test] + public void Left_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Left(""ABC"", 2)"); + Assert.AreEqual("AB", actual); + } + + [Test] + public void Len_Empty_Input_String() + { + Object actual = XLWorkbook.EvaluateExpr(@"Len("""")"); + Assert.AreEqual(0, actual); + } + + [Test] + public void Len_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Len(""word"")"); + Assert.AreEqual(4, actual); + } + + [Test] + public void Lower_Empty_Input_String() + { + Object actual = XLWorkbook.EvaluateExpr(@"Lower("""")"); + Assert.AreEqual("", actual); + } + + [Test] + public void Lower_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Lower(""AbCdEfG"")"); + Assert.AreEqual("abcdefg", actual); + } + + [Test] + public void Mid_Bigger_Than_Length() + { + Object actual = XLWorkbook.EvaluateExpr(@"Mid(""ABC"", 1, 5)"); + Assert.AreEqual("ABC", actual); + } + + [Test] + public void Mid_Empty_Input_String() + { + Object actual = XLWorkbook.EvaluateExpr(@"Mid("""", 1, 1)"); + Assert.AreEqual("", actual); + } + + [Test] + public void Mid_Start_After() + { + Object actual = XLWorkbook.EvaluateExpr(@"Mid(""ABC"", 5, 5)"); + Assert.AreEqual("", actual); + } + + [Test] + public void Mid_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Mid(""ABC"", 2, 2)"); + Assert.AreEqual("BC", actual); + } + + [TestCase("NUMBERVALUE(\"\")", 0d)] + [TestCase("NUMBERVALUE(\"1,234.56\", \".\", \",\")", 1234.56d)] + [TestCase("NUMBERVALUE(\"1.234,56\", \",\", \".\")", 1234.56d)] + [TestCase("NUMBERVALUE(\"+ 1\")", 1d)] + [TestCase("NUMBERVALUE(\"+1\")", 1d)] + [TestCase("NUMBERVALUE(\"+1.23\")", 1.23)] + [TestCase("NUMBERVALUE(\"- 1.23\")", -1.23)] + [TestCase("NUMBERVALUE(\" - 0 1 2 . 3 4 \")", -12.34)] + [TestCase("NUMBERVALUE(\" - 0 \t1\t2\r .\n3 4 \")", -12.34)] + [TestCase("NUMBERVALUE(\".1\")", 0.1)] + [TestCase("NUMBERVALUE(\"-.1\")", -0.1)] + [TestCase("NUMBERVALUE(\"1.234567890E+307\")", 1.234567890E+307)] + [TestCase("NUMBERVALUE(\"1.234567890E-307\")", 1.234567890E-307d)] + [TestCase("NUMBERVALUE(\"1.234567890E-309\")", 0d)] + [TestCase("NUMBERVALUE(\"-1.234567890E-307\")", -1.234567890E-307d)] + [TestCase("NUMBERVALUE(\".99999999999999\")", 0.99999999999999)] + [TestCase("NUMBERVALUE(\"1,23,4\")", 1234)] + [TestCase("NUMBERVALUE(\"1,234,56\")", 123456)] + public void NumberValue_Correct(string expression, double expectedResult) + { + var actual = (double)XLWorkbook.EvaluateExpr(expression); + Assert.AreEqual(expectedResult, actual, XLHelper.Epsilon); + } + + [TestCase("NUMBERVALUE(\"123.45\", \".\", \".\")")] // Group separator same as decimal separator + [TestCase("NUMBERVALUE(\"1.234.5\")")] // Two decimal separators + [TestCase("NUMBERVALUE(\"1.234,5\")")] // Decimal separator before group separator + [TestCase("NUMBERVALUE(\"12;34\")")] // Illegal character + [TestCase("NUMBERVALUE(\"--1\")")] // Two minuses + [TestCase("NUMBERVALUE(\"1.234567890E+308\")")] // Too large + [TestCase("NUMBERVALUE(\"-1.234567890E+308\")")] // Too large (negative) + [TestCase("NUMBERVALUE(\"1.234567890E-310\")")] // Too tiny + [TestCase("NUMBERVALUE(\"-1.234567890E-310\")")] // Too tiny (negative) + public void NumberValue_Invalid(string expression) + { + TestDelegate action = () => XLWorkbook.EvaluateExpr(expression); + Assert.Throws(action); + } + + [Test] + public void Proper_Empty_Input_String() + { + Object actual = XLWorkbook.EvaluateExpr(@"Proper("""")"); + Assert.AreEqual("", actual); + } + + [Test] + public void Proper_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Proper(""my name is francois botha"")"); + Assert.AreEqual("My Name Is Francois Botha", actual); + } + + [Test] + public void Replace_Empty_Input_String() + { + Object actual = XLWorkbook.EvaluateExpr(@"Replace("""", 1, 1, ""newtext"")"); + Assert.AreEqual("newtext", actual); + } + + [Test] + public void Replace_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Replace(""Here is some obsolete text to replace."", 14, 13, ""new text"")"); + Assert.AreEqual("Here is some new text to replace.", actual); + } + + [Test] + public void Rept_Empty_Input_Strings() + { + Object actual = XLWorkbook.EvaluateExpr(@"Rept("""", 3)"); + Assert.AreEqual("", actual); + } + + [Test] + public void Rept_Start_Is_Negative() + { + Assert.That(() => XLWorkbook.EvaluateExpr(@"Rept(""Francois"", -1)"), Throws.TypeOf()); + } + + [Test] + public void Rept_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Rept(""Francois Botha,"", 3)"); + Assert.AreEqual("Francois Botha,Francois Botha,Francois Botha,", actual); + + actual = XLWorkbook.EvaluateExpr(@"Rept(""123"", 5/2)"); + Assert.AreEqual("123123", actual); + + actual = XLWorkbook.EvaluateExpr(@"Rept(""Francois"", 0)"); + Assert.AreEqual("", actual); + } + + [Test] + public void Right_Bigger_Than_Length() + { + Object actual = XLWorkbook.EvaluateExpr(@"Right(""ABC"", 5)"); + Assert.AreEqual("ABC", actual); + } + + [Test] + public void Right_Default() + { + Object actual = XLWorkbook.EvaluateExpr(@"Right(""ABC"")"); + Assert.AreEqual("C", actual); + } + + [Test] + public void Right_Empty_Input_String() + { + Object actual = XLWorkbook.EvaluateExpr(@"Right("""")"); + Assert.AreEqual("", actual); + } + + [Test] + public void Right_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Right(""ABC"", 2)"); + Assert.AreEqual("BC", actual); + } + + [Test] + public void Search_No_Parameters_With_Values() + { + Assert.That(() => XLWorkbook.EvaluateExpr(@"Search("""", """")"), Throws.TypeOf()); + } + + [Test] + public void Search_Empty_Search_String() + { + Object actual = XLWorkbook.EvaluateExpr(@"Search("""", ""asdf"")"); + Assert.AreEqual(1, actual); + } + + [Test] + public void Search_Start_Position_Too_Large() + { + Assert.That(() => XLWorkbook.EvaluateExpr(@"Search(""abc"", ""abcdef"", 10)"), Throws.TypeOf()); + } + + [Test] + public void Search_Empty_Input_String() + { + Assert.That(() => XLWorkbook.EvaluateExpr(@"Search(""abc"", """")"), Throws.TypeOf()); + } + + [Test] + public void Search_String_Not_Found() + { + Assert.That(() => XLWorkbook.EvaluateExpr(@"Search(""123"", ""asdf"")"), Throws.TypeOf()); + } + + [Test] + public void Search_Wildcard_String_Not_Found() + { + Assert.That(() => XLWorkbook.EvaluateExpr(@"Search(""soft?2010"", ""Microsoft Excel 2010"")"), Throws.TypeOf()); + } + + [Test] + public void Search_Start_Position_Too_Large2() + { + Assert.That(() => XLWorkbook.EvaluateExpr(@"Search(""text"", ""This is some text"", 15)"), Throws.TypeOf()); + } + + // http://www.excel-easy.com/examples/find-vs-search.html + [Test] + public void Search_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Search(""Tuesday"", ""Today is Tuesday"")"); + Assert.AreEqual(10, actual); + + // Find is case-INsensitive + actual = XLWorkbook.EvaluateExpr(@"Search(""excel"", ""Microsoft Excel 2010"")"); + Assert.AreEqual(11, actual); + + actual = XLWorkbook.EvaluateExpr(@"Search(""soft*2010"", ""Microsoft Excel 2010"")"); + Assert.AreEqual(6, actual); + + actual = XLWorkbook.EvaluateExpr(@"Search(""Excel 20??"", ""Microsoft Excel 2010"")"); + Assert.AreEqual(11, actual); + + actual = XLWorkbook.EvaluateExpr(@"Search(""text"", ""This is some text"", 14)"); + Assert.AreEqual(14, actual); + } + + [Test] + public void Substitute_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Substitute(""This is a Tuesday."", ""Tuesday"", ""Monday"")"); + Assert.AreEqual("This is a Monday.", actual); + + actual = XLWorkbook.EvaluateExpr(@"Substitute(""This is a Tuesday. Next week also has a Tuesday."", ""Tuesday"", ""Monday"", 1)"); + Assert.AreEqual("This is a Monday. Next week also has a Tuesday.", actual); + + actual = XLWorkbook.EvaluateExpr(@"Substitute(""This is a Tuesday. Next week also has a Tuesday."", ""Tuesday"", ""Monday"", 2)"); + Assert.AreEqual("This is a Tuesday. Next week also has a Monday.", actual); + + actual = XLWorkbook.EvaluateExpr(@"Substitute("""", """", ""Monday"")"); + Assert.AreEqual("", actual); + + actual = XLWorkbook.EvaluateExpr(@"Substitute(""This is a Tuesday. Next week also has a Tuesday."", """", ""Monday"")"); + Assert.AreEqual("This is a Tuesday. Next week also has a Tuesday.", actual); + + actual = XLWorkbook.EvaluateExpr(@"Substitute(""This is a Tuesday. Next week also has a Tuesday."", ""Tuesday"", """")"); + Assert.AreEqual("This is a . Next week also has a .", actual); + } + + [Test] + public void T_Empty_Input_String() + { + Object actual = XLWorkbook.EvaluateExpr(@"T("""")"); + Assert.AreEqual("", actual); + } + + [Test] + public void T_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"T(""asdf"")"); + Assert.AreEqual("asdf", actual); + + actual = XLWorkbook.EvaluateExpr(@"T(Today())"); + Assert.AreEqual("", actual); + + actual = XLWorkbook.EvaluateExpr(@"T(TRUE)"); + Assert.AreEqual("", actual); + } + + [Test] + public void Text_Empty_Input_String() + { + Object actual = XLWorkbook.EvaluateExpr(@"Text(1913415.93, """")"); + Assert.AreEqual("", actual); + } + + [Test] + public void Text_Value() + { + Object actual; + actual = XLWorkbook.EvaluateExpr(@"Text(Date(2010, 1, 1), ""yyyy-MM-dd"")"); + Assert.AreEqual("2010-01-01", actual); + + actual = XLWorkbook.EvaluateExpr(@"Text(1469.07, ""0,000,000.00"")"); + Assert.AreEqual("0,001,469.07", actual); + + actual = XLWorkbook.EvaluateExpr(@"Text(1913415.93, ""#,000.00"")"); + Assert.AreEqual("1,913,415.93", actual); + + actual = XLWorkbook.EvaluateExpr(@"Text(2800, ""$0.00"")"); + Assert.AreEqual("$2800.00", actual); + + actual = XLWorkbook.EvaluateExpr(@"Text(0.4, ""0%"")"); + Assert.AreEqual("40%", actual); + + actual = XLWorkbook.EvaluateExpr(@"Text(Date(2010, 1, 1), ""MMMM yyyy"")"); + Assert.AreEqual("January 2010", actual); + + actual = XLWorkbook.EvaluateExpr(@"Text(Date(2010, 1, 1), ""M/d/y"")"); + Assert.AreEqual("1/1/10", actual); + } + + [Test] + public void Text_String_Input() + { + Object actual = XLWorkbook.EvaluateExpr(@"TEXT(""211x"", ""#00"")"); + Assert.AreEqual("211x", actual); + } + + [TestCase("=TEXTJOIN(\",\",TRUE,A1:B2)", "A,B,D")] + [TestCase("=TEXTJOIN(\",\",FALSE,A1:B2)", "A,,B,D")] + [TestCase("=TEXTJOIN(\",\",FALSE,A1,A2,B1,B2)", "A,B,,D")] + [TestCase("=TEXTJOIN(\",\",FALSE,1)", "1")] + [TestCase("=TEXTJOIN(\",\", TRUE, A:A, B:B)", "A,B,D")] + [TestCase("=TEXTJOIN(\",\", TRUE, D1:E2)", "")] + [TestCase("=TEXTJOIN(\",\", FALSE, D1:E2)", ",,,")] + [TestCase("=TEXTJOIN(\",\", FALSE, D1:D32768)", ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,")] + [TestCase("=TEXTJOIN(0, FALSE, A1:B2)", "A00B0D")] + [TestCase("=TEXTJOIN(false, FALSE, A1:B2)", "AFALSEFALSEBFALSED")] + [TestCase("=TEXTJOIN(\",\", 0, A1:B2)", "A,,B,D")] + [TestCase("=TEXTJOIN(\",\", 100, A1:B2)", "A,B,D")] + [TestCase("=TEXTJOIN(B2, FALSE, A1:B2)", "ADDBDD")] + [TestCase("=TEXTJOIN(\",\", FALSE, 12345.67, DATE(2018, 10, 30))", "12345.67,43403")] + [TestCase("=TEXTJOIN(\",\", \"0\", A1:B2)", "A,,B,D")] // Excel does not accept text argument, LibreOffice does + public void TextJoin(string formula, string expectedOutput) + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = "A"; + ws.Cell("A2").Value = "B"; + ws.Cell("B1").Value = ""; + ws.Cell("B2").Value = "D"; + + ws.Cell("C1").FormulaA1 = formula; + var a = ws.Cell("C1").Value; + + Assert.AreEqual(expectedOutput, a.ToString()); + } + + [TestCase("=TEXTJOIN(\",\", FALSE, D1:D32769)", "The value is too long")] + [TestCase("=TEXTJOIN(\",\", \"Invalid\", A1:B2)", "The second argument is invalid")] + public void TextJoinWithInvalidArgumentsThrows(string formula, string explain) + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + + ws.Cell("C1").FormulaA1 = formula; + + TestDelegate action = () => + { + var a = ws.Cell("C1").Value; + }; + + Assert.Throws(action, explain); + } + + [TestCase(2020, 11, 1, 9, 23, 11, "m/d/yyyy h:mm:ss", "11/1/2020 9:23:11")] + [TestCase(2023, 7, 14, 2, 12, 3, "m/d/yyyy h:mm:ss", "7/14/2023 2:12:03")] + [TestCase(2025, 10, 14, 2, 48, 55, "m/d/yyyy h:mm:ss", "10/14/2025 2:48:55")] + [TestCase(2023, 2, 19, 22, 1, 38, "m/d/yyyy h:mm:ss", "2/19/2023 22:01:38")] + [TestCase(2025, 12, 19, 19, 43, 58, "m/d/yyyy h:mm:ss", "12/19/2025 19:43:58")] + [TestCase(2034, 11, 16, 1, 48, 9, "m/d/yyyy h:mm:ss", "11/16/2034 1:48:09")] + [TestCase(2018, 12, 10, 11, 22, 42, "m/d/yyyy h:mm:ss", "12/10/2018 11:22:42")] + public void Text_DateFormats(int year, int months, int days, int hour, int minutes, int seconds, string format, string expected) + { + Assert.AreEqual(expected, XLWorkbook.EvaluateExpr($@"TEXT(DATE({year}, {months}, {days}) + TIME({hour}, {minutes}, {seconds}), ""{format}"")")); + } + + [Test] + public void Trim_EmptyInput_Striong() + { + Object actual = XLWorkbook.EvaluateExpr(@"Trim("""")"); + Assert.AreEqual("", actual); + } + + [Test] + public void Trim_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Trim("" some text with padding "")"); + Assert.AreEqual("some text with padding", actual); + } + + [Test] + public void Upper_Empty_Input_String() + { + Object actual = XLWorkbook.EvaluateExpr(@"Upper("""")"); + Assert.AreEqual("", actual); + } + + [Test] + public void Upper_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Upper(""AbCdEfG"")"); + Assert.AreEqual("ABCDEFG", actual); + } + + [Test] + public void Value_Input_String_Is_Not_A_Number() + { + Assert.That(() => XLWorkbook.EvaluateExpr(@"Value(""asdf"")"), Throws.TypeOf()); + } + + [Test] + public void Value_Value() + { + Object actual = XLWorkbook.EvaluateExpr(@"Value(""123.54"")"); + Assert.AreEqual(123.54, actual); + + actual = XLWorkbook.EvaluateExpr(@"Value(654.32)"); + Assert.AreEqual(654.32, actual); + } + } +} diff --git a/ClosedXML_Tests/Excel/CalcEngine/XLMathTests.cs b/ClosedXML_Tests/Excel/CalcEngine/XLMathTests.cs new file mode 100644 index 0000000..5ce2ce5 --- /dev/null +++ b/ClosedXML_Tests/Excel/CalcEngine/XLMathTests.cs @@ -0,0 +1,26 @@ +using ClosedXML.Excel.CalcEngine.Functions; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.CalcEngine +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class XLMathTests + { + [Test] + public void IsEven() + { + Assert.IsTrue(XLMath.IsEven(2)); + Assert.IsFalse(XLMath.IsEven(3)); + } + + [Test] + public void IsOdd() + { + Assert.IsTrue(XLMath.IsOdd(3)); + Assert.IsFalse(XLMath.IsOdd(2)); + } + } +} \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Cells/DataTypeTests.cs b/ClosedXML_Tests/Excel/Cells/DataTypeTests.cs new file mode 100644 index 0000000..2808008 --- /dev/null +++ b/ClosedXML_Tests/Excel/Cells/DataTypeTests.cs @@ -0,0 +1,22 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; + +namespace ClosedXML_Tests.Excel.Cells +{ + [TestFixture] + public class DataTypeTests + { + [Test] + public void ConvertNonNumericTextToNumberThrowsException() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + var c = ws.Cell("A1"); + c.Value = "ABC123"; + Assert.Throws(() => c.DataType = XLDataType.Number); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Cells/XLCellTests.cs b/ClosedXML_Tests/Excel/Cells/XLCellTests.cs new file mode 100644 index 0000000..44c3b39 --- /dev/null +++ b/ClosedXML_Tests/Excel/Cells/XLCellTests.cs @@ -0,0 +1,1180 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class XLCellTests + { + [Test] + public void CellsUsed() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Cell(1, 1); + ws.Cell(2, 2); + int count = ws.Range("A1:B2").CellsUsed().Count(); + Assert.AreEqual(0, count); + } + + [Test] + public void CellsUsedIncludeStyles1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Row(3).Style.Fill.BackgroundColor = XLColor.Red; + ws.Column(3).Style.Fill.BackgroundColor = XLColor.Red; + ws.Cell(2, 2).Value = "ASDF"; + var range = ws.RangeUsed(XLCellsUsedOptions.All).RangeAddress.ToString(); + Assert.AreEqual("B2:C3", range); + } + + [Test] + public void CellsUsedIncludeStyles2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Row(2).Style.Fill.BackgroundColor = XLColor.Red; + ws.Column(2).Style.Fill.BackgroundColor = XLColor.Red; + ws.Cell(3, 3).Value = "ASDF"; + var range = ws.RangeUsed(XLCellsUsedOptions.All).RangeAddress.ToString(); + Assert.AreEqual("B2:C3", range); + } + + [Test] + public void CellsUsedIncludeStyles3() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + var range = ws.RangeUsed(XLCellsUsedOptions.All); + Assert.AreEqual(null, range); + } + + [Test] + public void CellUsedIncludesSparklines() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Range("C3:E4").Value = 1; + ws.SparklineGroups.Add("B2", "C3:E3"); + ws.SparklineGroups.Add("F5", "C4:E4"); + + var range = ws.RangeUsed(true).RangeAddress.ToString(); + Assert.AreEqual("B2:F5", range); + } + + [Test] + public void Double_Infinity_is_a_string() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1"); + var doubleList = new List { 1.0 / 0.0 }; + + cell.Value = 5; + cell.Value = doubleList; + Assert.AreEqual(XLDataType.Text, cell.DataType); + Assert.AreEqual(CultureInfo.CurrentCulture.NumberFormat.PositiveInfinitySymbol, cell.Value); + + cell.Value = 5; + cell.SetValue(doubleList); + Assert.AreEqual(XLDataType.Text, cell.DataType); + Assert.AreEqual(CultureInfo.CurrentCulture.NumberFormat.PositiveInfinitySymbol, cell.Value); + } + + [Test] + public void Double_NaN_is_a_string() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1"); + var doubleList = new List { 0.0 / 0.0 }; + + cell.Value = 5; + cell.Value = doubleList; + Assert.AreEqual(XLDataType.Text, cell.DataType); + Assert.AreEqual(CultureInfo.CurrentCulture.NumberFormat.NaNSymbol, cell.Value); + + cell.Value = 5; + cell.SetValue(doubleList); + Assert.AreEqual(XLDataType.Text, cell.DataType); + Assert.AreEqual(CultureInfo.CurrentCulture.NumberFormat.NaNSymbol, cell.Value); + } + + [Test] + public void GetValue_Nullable() + { + var cell = new XLWorkbook().AddWorksheet().FirstCell(); + + Assert.IsNull(cell.Clear().GetValue()); + Assert.AreEqual(1.5, cell.SetValue(1.5).GetValue()); + Assert.AreEqual(2, cell.SetValue(1.5).GetValue()); + Assert.AreEqual(2.5, cell.SetValue("2.5").GetValue()); + Assert.Throws(() => cell.SetValue("text").GetValue()); + } + + [Test] + public void InsertData1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRange range = ws.Cell(2, 2).InsertData(new[] { "a", "b", "c" }); + Assert.AreEqual("Sheet1!B2:B4", range.ToString()); + } + + [Test] + public void InsertData2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRange range = ws.Cell(2, 2).InsertData(new[] { "a", "b", "c" }, false); + Assert.AreEqual("Sheet1!B2:B4", range.ToString()); + } + + [Test] + public void InsertData3() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRange range = ws.Cell(2, 2).InsertData(new[] { "a", "b", "c" }, true); + Assert.AreEqual("Sheet1!B2:D2", range.ToString()); + } + + [Test] + public void InsertData_with_Guids() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.FirstCell().InsertData(Enumerable.Range(1, 20).Select(i => new { Guid = Guid.NewGuid() })); + + Assert.AreEqual(XLDataType.Text, ws.FirstCell().DataType); + Assert.AreEqual(Guid.NewGuid().ToString().Length, ws.FirstCell().GetString().Length); + } + + [Test] + public void InsertData_with_Nulls() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + + var table = new DataTable(); + table.TableName = "Patients"; + table.Columns.Add("Dosage", typeof(int)); + table.Columns.Add("Drug", typeof(string)); + table.Columns.Add("Patient", typeof(string)); + table.Columns.Add("Date", typeof(DateTime)); + + table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); + table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); + table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); + table.Rows.Add(21, "Combivent", DBNull.Value, new DateTime(2000, 1, 4)); + table.Rows.Add(100, "Dilantin", "Melanie", DBNull.Value); + + ws.FirstCell().InsertData(table); + + Assert.AreEqual(25, ws.Cell("A1").Value); + Assert.AreEqual("", ws.Cell("C4").Value); + Assert.AreEqual("", ws.Cell("D5").Value); + } + + [Test] + public void InsertData_with_Nulls_IEnumerable() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + + var dateTimeList = new List() + { + new DateTime(2000, 1, 1), + new DateTime(2000, 1, 2), + new DateTime(2000, 1, 3), + new DateTime(2000, 1, 4), + null + }; + + ws.FirstCell().InsertData(dateTimeList); + + Assert.AreEqual(new DateTime(2000, 1, 1), ws.Cell("A1").GetDateTime()); + Assert.AreEqual(String.Empty, ws.Cell("A5").Value); + } + + [Test] + public void IsEmpty1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + bool actual = cell.IsEmpty(); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + bool actual = cell.IsEmpty(XLCellsUsedOptions.All); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty3() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Style.Fill.BackgroundColor = XLColor.Red; + bool actual = cell.IsEmpty(); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty4() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Style.Fill.BackgroundColor = XLColor.Red; + bool actual = cell.IsEmpty(XLCellsUsedOptions.AllContents); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty5() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Style.Fill.BackgroundColor = XLColor.Red; + bool actual = cell.IsEmpty(XLCellsUsedOptions.All); + bool expected = false; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty6() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Value = "X"; + bool actual = cell.IsEmpty(); + bool expected = false; + Assert.AreEqual(expected, actual); + } + + [Test] + public void NaN_is_not_a_number() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1"); + cell.Value = "NaN"; + + Assert.AreNotEqual(XLDataType.Number, cell.DataType); + } + + [Test] + public void Nan_is_not_a_number() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1"); + cell.Value = "Nan"; + + Assert.AreNotEqual(XLDataType.Number, cell.DataType); + } + + [Test] + public void TryGetValue_Boolean_Bad() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1").SetValue("ABC"); + bool success = cell.TryGetValue(out bool outValue); + Assert.IsFalse(success); + } + + [Test] + public void TryGetValue_Boolean_False() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1").SetValue(false); + bool success = cell.TryGetValue(out bool outValue); + Assert.IsTrue(success); + Assert.IsFalse(outValue); + } + + [Test] + public void TryGetValue_Boolean_Good() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1").SetValue("True"); + bool success = cell.TryGetValue(out bool outValue); + Assert.IsTrue(success); + Assert.IsTrue(outValue); + } + + [Test] + public void TryGetValue_Boolean_True() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1").SetValue(true); + bool success = cell.TryGetValue(out bool outValue); + Assert.IsTrue(success); + Assert.IsTrue(outValue); + } + + [Test] + public void TryGetValue_DateTime_Good() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + var date = "2018-01-01"; + bool success = ws.Cell("A1").SetValue(date).TryGetValue(out DateTime outValue); + Assert.IsTrue(success); + Assert.AreEqual(new DateTime(2018, 1, 1), outValue); + } + + [Test] + public void TryGetValue_DateTime_Good2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + bool success = ws.Cell("A1").SetFormulaA1("=TODAY() + 10").TryGetValue(out DateTime outValue); + Assert.IsTrue(success); + Assert.AreEqual(DateTime.Today.AddDays(10), outValue); + } + + [Test] + public void TryGetValue_DateTime_BadButFormulaGood() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + bool success = ws.Cell("A1").SetFormulaA1("=\"44\"&\"020\"").TryGetValue(out DateTime outValue); + Assert.IsFalse(success); + + ws.Cell("B1").SetFormulaA1("=A1+1"); + + success = ws.Cell("B1").TryGetValue(out outValue); + Assert.IsTrue(success); + Assert.AreEqual(new DateTime(2020, 07, 09), outValue); + } + + [Test] + public void TryGetValue_DateTime_BadString() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + var date = "ABC"; + bool success = ws.Cell("A1").SetValue(date).TryGetValue(out DateTime outValue); + Assert.IsFalse(success); + } + + [Test] + public void TryGetValue_DateTime_BadString2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + var date = 5545454; + ws.FirstCell().SetValue(date).DataType = XLDataType.DateTime; + bool success = ws.FirstCell().TryGetValue(out DateTime outValue); + Assert.IsFalse(success); + } + + [Test] + public void TryGetValue_Enum_Good() + { + var ws = new XLWorkbook().AddWorksheet(); + Assert.IsTrue(ws.FirstCell().SetValue(NumberStyles.AllowCurrencySymbol).TryGetValue(out NumberStyles value)); + Assert.AreEqual(NumberStyles.AllowCurrencySymbol, value); + + // Nullable alternative + Assert.IsTrue(ws.FirstCell().SetValue(NumberStyles.AllowCurrencySymbol).TryGetValue(out NumberStyles? value2)); + Assert.AreEqual(NumberStyles.AllowCurrencySymbol, value2); + } + + [Test] + public void TryGetValue_Enum_BadString() + { + var ws = new XLWorkbook().AddWorksheet(); + Assert.IsFalse(ws.FirstCell().SetValue("ABC").TryGetValue(out NumberStyles value)); + Assert.IsFalse(ws.FirstCell().SetValue("ABC").TryGetValue(out NumberStyles? value2)); + } + + [Test] + public void TryGetValue_RichText_Bad() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1").SetValue("Anything"); + bool success = cell.TryGetValue(out IXLRichText outValue); + Assert.IsTrue(success); + Assert.AreEqual(cell.RichText, outValue); + Assert.AreEqual("Anything", outValue.ToString()); + } + + [Test] + public void TryGetValue_RichText_Good() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1"); + cell.RichText.AddText("Anything"); + bool success = cell.TryGetValue(out IXLRichText outValue); + Assert.IsTrue(success); + Assert.AreEqual(cell.RichText, outValue); + } + + [Test] + public void TryGetValue_TimeSpan_BadString() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + string timeSpan = "ABC"; + bool success = ws.Cell("A1").SetValue(timeSpan).TryGetValue(out TimeSpan outValue); + Assert.IsFalse(success); + } + + [Test] + public void TryGetValue_TimeSpan_Good() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + var timeSpan = new TimeSpan(1, 1, 1); + bool success = ws.Cell("A1").SetValue(timeSpan).TryGetValue(out TimeSpan outValue); + Assert.IsTrue(success); + Assert.AreEqual(timeSpan, outValue); + } + + [Test] + public void TryGetValue_TimeSpan_Good_Large() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + var timeSpan = TimeSpan.FromMilliseconds((double)int.MaxValue + 1); + bool success = ws.Cell("A1").SetValue(timeSpan).TryGetValue(out TimeSpan outValue); + Assert.IsTrue(success); + Assert.AreEqual(timeSpan, outValue); + } + + [Test] + public void TryGetValue_TimeSpan_GoodString() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + var timeSpan = new TimeSpan(1, 1, 1); + bool success = ws.Cell("A1").SetValue(timeSpan.ToString()).TryGetValue(out TimeSpan outValue); + Assert.IsTrue(success); + Assert.AreEqual(timeSpan, outValue); + } + + [Test] + public void TryGetValue_sbyte_Bad() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1").SetValue(255); + bool success = cell.TryGetValue(out sbyte outValue); + Assert.IsFalse(success); + } + + [Test] + public void TryGetValue_sbyte_Bad2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1").SetValue("255"); + bool success = cell.TryGetValue(out sbyte outValue); + Assert.IsFalse(success); + } + + [Test] + public void TryGetValue_sbyte_Good() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1").SetValue(5); + bool success = cell.TryGetValue(out sbyte outValue); + Assert.IsTrue(success); + Assert.AreEqual(5, outValue); + } + + [Test] + public void TryGetValue_sbyte_Good2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1").SetValue("5"); + bool success = cell.TryGetValue(out sbyte outValue); + Assert.IsTrue(success); + Assert.AreEqual(5, outValue); + } + + [Test] + public void TryGetValue_decimal_Good() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + var cell = ws.Cell("A1").SetValue("5"); + bool success = cell.TryGetValue(out decimal outValue); + Assert.IsTrue(success); + Assert.AreEqual(5, outValue); + } + + [Test] + public void TryGetValue_decimal_Good2() + { + Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); + + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + var cell = ws.Cell("A1").SetValue("1.60000001869776E-06"); + bool success = cell.TryGetValue(out decimal outValue); + Assert.IsTrue(success); + Assert.AreEqual(1.60000001869776E-06, outValue); + } + + [Test] + public void TryGetValue_Hyperlink() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.Worksheets.Add("Sheet1"); + var ws2 = wb.Worksheets.Add("Sheet2"); + + var targetCell = ws2.Cell("A1"); + + var linkCell1 = ws1.Cell("A1"); + linkCell1.Value = "Link to IXLCell"; + linkCell1.Hyperlink = new XLHyperlink(targetCell); + + var success = linkCell1.TryGetValue(out XLHyperlink hyperlink); + Assert.IsTrue(success); + Assert.AreEqual("Sheet2!A1", hyperlink.InternalAddress); + } + } + + [Test] + public void TryGetValue_Unicode_String() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + + Boolean success; + String outValue; + + success = ws.Cell("A1") + .SetValue("Site_x0020_Column_x0020_Test") + .TryGetValue(out outValue); + Assert.IsTrue(success); + Assert.AreEqual("Site Column Test", outValue); + + success = ws.Cell("A1") + .SetValue("Site_x005F_x0020_Column_x005F_x0020_Test") + .TryGetValue(out outValue); + + Assert.IsTrue(success); + Assert.AreEqual("Site_x005F_x0020_Column_x005F_x0020_Test", outValue); + } + + [Test] + public void TryGetValue_Nullable() + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet(); + + ws.Cell("A1").Clear(); + ws.Cell("A2").SetValue(1.5); + ws.Cell("A3").SetValue("2.5"); + ws.Cell("A4").SetValue("text"); + + foreach (var cell in ws.Range("A1:A3").Cells()) + { + Assert.IsTrue(cell.TryGetValue(out double? value)); + } + + Assert.IsFalse(ws.Cell("A4").TryGetValue(out double? _)); + } + + [Test] + public void SetCellValueToGuid() + { + var ws = new XLWorkbook().AddWorksheet("Sheet1"); + var guid = Guid.NewGuid(); + ws.FirstCell().Value = guid; + Assert.AreEqual(XLDataType.Text, ws.FirstCell().DataType); + Assert.AreEqual(guid.ToString(), ws.FirstCell().Value); + Assert.AreEqual(guid.ToString(), ws.FirstCell().GetString()); + + guid = Guid.NewGuid(); + ws.FirstCell().SetValue(guid); + Assert.AreEqual(XLDataType.Text, ws.FirstCell().DataType); + Assert.AreEqual(guid.ToString(), ws.FirstCell().Value); + Assert.AreEqual(guid.ToString(), ws.FirstCell().GetString()); + } + + [Test] + public void SetCellValueToEnum() + { + var ws = new XLWorkbook().AddWorksheet("Sheet1"); + var dataType = XLDataType.Number; + ws.FirstCell().Value = dataType; + Assert.AreEqual(XLDataType.Text, ws.FirstCell().DataType); + Assert.AreEqual(dataType.ToString(), ws.FirstCell().Value); + Assert.AreEqual(dataType.ToString(), ws.FirstCell().GetString()); + + dataType = XLDataType.TimeSpan; + ws.FirstCell().SetValue(dataType); + Assert.AreEqual(XLDataType.Text, ws.FirstCell().DataType); + Assert.AreEqual(dataType.ToString(), ws.FirstCell().Value); + Assert.AreEqual(dataType.ToString(), ws.FirstCell().GetString()); + } + + [Test] + public void SetCellValueToRange() + { + var ws = new XLWorkbook().AddWorksheet("Sheet1"); + + ws.Cell("A1").SetValue(2) + .CellRight().SetValue(3) + .CellRight().SetValue(5) + .CellRight().SetValue(7); + + var range = ws.Range("1:1"); + + ws.Cell("B2").Value = range; + + Assert.AreEqual(2, ws.Cell("B2").Value); + Assert.AreEqual(3, ws.Cell("C2").Value); + Assert.AreEqual(5, ws.Cell("D2").Value); + Assert.AreEqual(7, ws.Cell("E2").Value); + } + + [Test] + public void ValueSetToEmptyString() + { + string expected = String.Empty; + + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Value = new DateTime(2000, 1, 2); + cell.Value = String.Empty; + Assert.AreEqual(expected, cell.GetString()); + Assert.AreEqual(expected, cell.Value); + + cell.Value = new DateTime(2000, 1, 2); + cell.SetValue(string.Empty); + Assert.AreEqual(expected, cell.GetString()); + Assert.AreEqual(expected, cell.Value); + } + + [Test] + public void ValueSetToNull() + { + string expected = String.Empty; + + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Value = new DateTime(2000, 1, 2); + cell.Value = null; + Assert.AreEqual(expected, cell.GetString()); + Assert.AreEqual(expected, cell.Value); + + cell.Value = new DateTime(2000, 1, 2); + cell.SetValue(null as string); + Assert.AreEqual(expected, cell.GetString()); + Assert.AreEqual(expected, cell.Value); + } + + [Test] + public void ValueSetDateWithShortUserDateFormat() + { + // For this test to make sense, user's local date format should be dd/MM/yy (note without the 2 century digits) + // What happened previously was that the century digits got lost in .ToString() conversion and wrong century was sometimes returned. + var ci = new CultureInfo(CultureInfo.InvariantCulture.LCID); + ci.DateTimeFormat.ShortDatePattern = "dd/MM/yy"; + Thread.CurrentThread.CurrentCulture = ci; + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + var expected = DateTime.Today.AddYears(20); + cell.Value = expected; + var actual = (DateTime)cell.Value; + Assert.AreEqual(expected, actual); + } + + [Test] + public void SetStringCellValues() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var cell = ws.FirstCell(); + + object expected; + + var date = new DateTime(2018, 4, 18); + expected = date.ToString(); + cell.Value = expected; + Assert.AreEqual(XLDataType.DateTime, cell.DataType); + Assert.AreEqual(date, cell.Value); + + var b = true; + expected = b.ToString(); + cell.Value = expected; + Assert.AreEqual(XLDataType.Boolean, cell.DataType); + Assert.AreEqual(b, cell.Value); + + var ts = new TimeSpan(8, 12, 4); + expected = ts.ToString(); + cell.Value = expected; + Assert.AreEqual(XLDataType.TimeSpan, cell.DataType); + Assert.AreEqual(ts, cell.Value); + } + } + + [Test] + public void SetStringValueTooLong() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + ws.FirstCell().Value = new DateTime(2018, 5, 15); + + ws.FirstCell().SetValue(new String('A', 32767)); + + Assert.Throws(() => ws.FirstCell().Value = new String('A', 32768)); + Assert.Throws(() => ws.FirstCell().SetValue(new String('A', 32768))); + } + } + + [Test] + public void SetDateOutOfRange() + { + Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-ZA"); + + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + ws.FirstCell().Value = 5; + + var date = XLCell.BaseDate.AddDays(-1); + ws.FirstCell().Value = date; + + // Should default to string representation using current culture's date format + Assert.AreEqual(XLDataType.Text, ws.FirstCell().DataType); + Assert.AreEqual(date.ToString(), ws.FirstCell().Value); + + Assert.Throws(() => ws.FirstCell().SetValue(XLCell.BaseDate.AddDays(-1))); + } + } + + [Test] + public void SetCellValueWipesFormulas() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + ws.FirstCell().FormulaA1 = "=TODAY()"; + ws.FirstCell().Value = "hello world"; + Assert.IsFalse(ws.FirstCell().HasFormula); + + ws.FirstCell().FormulaA1 = "=TODAY()"; + ws.FirstCell().SetValue("hello world"); + Assert.IsFalse(ws.FirstCell().HasFormula); + } + } + + [Test] + public void CellValueLineWrapping() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + ws.FirstCell().Value = "hello world"; + Assert.IsFalse(ws.FirstCell().Style.Alignment.WrapText); + + ws.FirstCell().Value = "hello\r\nworld"; + Assert.IsTrue(ws.FirstCell().Style.Alignment.WrapText); + + ws.FirstCell().Style.Alignment.WrapText = false; + + ws.FirstCell().SetValue("hello world"); + Assert.IsFalse(ws.FirstCell().Style.Alignment.WrapText); + + ws.FirstCell().SetValue("hello\r\nworld"); + Assert.IsTrue(ws.FirstCell().Style.Alignment.WrapText); + } + } + + [Test] + public void TestInvalidXmlCharacters() + { + byte[] data; + + using (var stream = new MemoryStream()) + { + var wb = new XLWorkbook(); + wb.AddWorksheet("Sheet1").FirstCell().SetValue("\u0018"); + wb.SaveAs(stream); + data = stream.ToArray(); + } + + using (var stream = new MemoryStream(data)) + { + var wb = new XLWorkbook(stream); + Assert.AreEqual("\u0018", wb.Worksheets.First().FirstCell().Value); + } + } + + [Test] + public void CanClearCellValueBySettingNullValue() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var cell = ws.FirstCell(); + + cell.Value = "Test"; + Assert.AreEqual("Test", cell.Value); + Assert.AreEqual(XLDataType.Text, cell.DataType); + + string s = null; + cell.SetValue(s); + Assert.AreEqual(string.Empty, cell.Value); + + cell.Value = "Test"; + cell.Value = null; + Assert.AreEqual(string.Empty, cell.Value); + } + } + + [Test] + public void CanClearDateTimeCellValue() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var c = ws.FirstCell(); + c.SetValue(new DateTime(2017, 10, 08)); + Assert.AreEqual(XLDataType.DateTime, c.DataType); + Assert.AreEqual(new DateTime(2017, 10, 08), c.Value); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + var c = ws.FirstCell(); + Assert.AreEqual(XLDataType.DateTime, c.DataType); + Assert.AreEqual(new DateTime(2017, 10, 08), c.Value); + + c.Clear(); + wb.Save(); + } + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + var c = ws.FirstCell(); + Assert.AreEqual(XLDataType.Text, c.DataType); + Assert.True(c.IsEmpty()); + } + } + } + + [Test] + public void ClearCellRemovesSparkline() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.SparklineGroups.Add("B1:B3", "C1:E3"); + + ws.Cell("B1").Clear(XLClearOptions.All); + ws.Cell("B2").Clear(XLClearOptions.Sparklines); + + Assert.AreEqual(1, ws.SparklineGroups.Single().Count()); + Assert.IsFalse(ws.Cell("B1").HasSparkline); + Assert.IsFalse(ws.Cell("B2").HasSparkline); + Assert.IsTrue(ws.Cell("B3").HasSparkline); + } + + [Test] + public void CurrentRegion() + { + // Partially based on sample in https://github.com/ClosedXML/ClosedXML/issues/120 + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + ws.Cell("B1").SetValue("x") + .CellBelow().SetValue("x") + .CellBelow().SetValue("x"); + + ws.Cell("C1").SetValue("x") + .CellBelow().SetValue("x") + .CellBelow().SetValue("x"); + + //Deliberately D2 + ws.Cell("D2").SetValue("x") + .CellBelow().SetValue("x"); + + ws.Cell("G1").SetValue("x") + .CellBelow() // skip a cell + .CellBelow().SetValue("x") + .CellBelow().SetValue("x"); + + // Deliberately H2 + ws.Cell("H2").SetValue("x") + .CellBelow().SetValue("x") + .CellBelow().SetValue("x"); + + // A diagonal + ws.Cell("E8").SetValue("x") + .CellBelow().CellRight().SetValue("x") + .CellBelow().CellRight().SetValue("x") + .CellBelow().CellRight().SetValue("x") + .CellBelow().CellRight().SetValue("x"); + + Assert.AreEqual("A10:A10", ws.Cell("A10").CurrentRegion.RangeAddress.ToString()); + Assert.AreEqual("B5:B5", ws.Cell("B5").CurrentRegion.RangeAddress.ToString()); + Assert.AreEqual("P1:P1", ws.Cell("P1").CurrentRegion.RangeAddress.ToString()); + + Assert.AreEqual("B1:D3", ws.Cell("D3").CurrentRegion.RangeAddress.ToString()); + Assert.AreEqual("B1:D4", ws.Cell("D4").CurrentRegion.RangeAddress.ToString()); + Assert.AreEqual("B1:E4", ws.Cell("E4").CurrentRegion.RangeAddress.ToString()); + + foreach (var c in ws.Range("B1:D3").Cells()) + { + Assert.AreEqual("B1:D3", c.CurrentRegion.RangeAddress.ToString()); + } + + foreach (var c in ws.Range("A1:A3").Cells()) + { + Assert.AreEqual("A1:D3", c.CurrentRegion.RangeAddress.ToString()); + } + + Assert.AreEqual("A1:D4", ws.Cell("A4").CurrentRegion.RangeAddress.ToString()); + + foreach (var c in ws.Range("E1:E3").Cells()) + { + Assert.AreEqual("B1:E3", c.CurrentRegion.RangeAddress.ToString()); + } + + Assert.AreEqual("B1:E4", ws.Cell("E4").CurrentRegion.RangeAddress.ToString()); + + //// SECOND REGION + foreach (var c in ws.Range("F1:F4").Cells()) + { + Assert.AreEqual("F1:H4", c.CurrentRegion.RangeAddress.ToString()); + } + + Assert.AreEqual("F1:H5", ws.Cell("F5").CurrentRegion.RangeAddress.ToString()); + + //// DIAGONAL + Assert.AreEqual("E8:I12", ws.Cell("E8").CurrentRegion.RangeAddress.ToString()); + Assert.AreEqual("E8:I12", ws.Cell("F9").CurrentRegion.RangeAddress.ToString()); + Assert.AreEqual("E8:I12", ws.Cell("G10").CurrentRegion.RangeAddress.ToString()); + Assert.AreEqual("E8:I12", ws.Cell("H11").CurrentRegion.RangeAddress.ToString()); + Assert.AreEqual("E8:I12", ws.Cell("I12").CurrentRegion.RangeAddress.ToString()); + + Assert.AreEqual("E8:I12", ws.Cell("G9").CurrentRegion.RangeAddress.ToString()); + Assert.AreEqual("E8:I12", ws.Cell("F10").CurrentRegion.RangeAddress.ToString()); + + Assert.AreEqual("D7:I12", ws.Cell("D7").CurrentRegion.RangeAddress.ToString()); + Assert.AreEqual("E8:J13", ws.Cell("J13").CurrentRegion.RangeAddress.ToString()); + } + } + + // https://github.com/ClosedXML/ClosedXML/issues/630 + [Test] + public void ConsiderEmptyValueAsNumericInSumFormula() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + ws.Cell("A1").SetValue("Empty"); + ws.Cell("A2").SetValue("Numeric"); + ws.Cell("A3").SetValue("Copy of numeric"); + + ws.Cell("B2").SetFormulaA1("=B1"); + ws.Cell("B3").SetFormulaA1("=B2"); + + ws.Cell("C2").SetFormulaA1("=SUM(C1)"); + ws.Cell("C3").SetFormulaA1("=C2"); + + object b1 = ws.Cell("B1").Value; + object b2 = ws.Cell("B2").Value; + object b3 = ws.Cell("B3").Value; + + Assert.AreEqual("", b1); + Assert.AreEqual(0, b2); + Assert.AreEqual(0, b3); + + object c1 = ws.Cell("C1").Value; + object c2 = ws.Cell("C2").Value; + object c3 = ws.Cell("C3").Value; + + Assert.AreEqual("", c1); + Assert.AreEqual(0, c2); + Assert.AreEqual(0, c3); + } + } + + [Test] + public void SetFormulaA1AffectsR1C1() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var cell = ws.Cell(1, 1); + cell.FormulaR1C1 = "R[1]C"; + + cell.FormulaA1 = "B2"; + + Assert.AreEqual("R[1]C[1]", cell.FormulaR1C1); + } + } + + [Test] + public void SetFormulaR1C1AffectsA1() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var cell = ws.Cell(1, 1); + cell.FormulaA1 = "A2"; + + cell.FormulaR1C1 = "R[1]C[1]"; + + Assert.AreEqual("B2", cell.FormulaA1); + } + } + + [Test] + public void FormulaWithCircularReferenceFails() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var A1 = ws.Cell("A1"); + var A2 = ws.Cell("A2"); + A1.FormulaA1 = "A2 + 1"; + A2.FormulaA1 = "A1 + 1"; + + Assert.Throws(() => + { + var _ = A1.Value; + }); + Assert.Throws(() => + { + var _ = A2.Value; + }); + } + } + + [Test] + public void InvalidFormulaShiftProducesREF() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + ws.Cell("A1").Value = 1; + ws.Cell("B1").Value = 2; + ws.Cell("B2").FormulaA1 = "=A1+B1"; + + Assert.AreEqual(3, ws.Cell("B2").Value); + + ws.Range("A2").Value = ws.Range("B2"); + var fA2 = ws.Cell("A2").FormulaA1; + + wb.SaveAs(ms); + + Assert.AreEqual("#REF!+A1", fA2); + } + + using (var wb2 = new XLWorkbook(ms)) + { + var fA2 = wb2.Worksheets.First().Cell("A2").FormulaA1; + Assert.AreEqual("#REF!+A1", fA2); + } + } + } + + [Test] + public void FormulaWithCircularReferenceFails2() + { + var cell = new XLWorkbook().Worksheets.Add("Sheet1").FirstCell(); + cell.FormulaA1 = "A1"; + Assert.Throws(() => + { + var _ = cell.Value; + }); + } + + [Test] + public void TryGetValueFormulaEvaluation() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var A1 = ws.Cell("A1"); + var A2 = ws.Cell("A2"); + var A3 = ws.Cell("A3"); + A1.FormulaA1 = "A2 + 1"; + A2.FormulaA1 = "A1 + 1"; + + Assert.IsFalse(A1.TryGetValue(out String _)); + Assert.IsFalse(A2.TryGetValue(out String _)); + Assert.IsTrue(A3.TryGetValue(out String _)); + } + } + + [Test] + public void SetValue_IEnumerable() + { + using var wb = new XLWorkbook(); + var ws = wb.AddWorksheet(); + object[] values = { "Text", 45, DateTime.Today, true, "More text" }; + + ws.FirstCell().SetValue(values); + + Assert.AreEqual("Text", ws.FirstCell().GetString()); + Assert.AreEqual(45, ws.Cell("A2").GetDouble()); + Assert.AreEqual(DateTime.Today, ws.Cell("A3").GetDateTime()); + Assert.AreEqual(true, ws.Cell("A4").GetBoolean()); + Assert.AreEqual("More text", ws.Cell("A5").GetString()); + Assert.IsTrue(ws.Cell("A6").IsEmpty()); + } + + [Test] + public void ToStringNoFormatString() + { + using var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet1"); + var c = ws.FirstCell().CellBelow(2).CellRight(3); + + Assert.AreEqual("D3", c.ToString()); + } + + [Test] + [TestCase("D3", "A")] + [TestCase("YEAR(DATE(2018, 1, 1))", "F")] + [TestCase("YEAR(DATE(2018, 1, 1))", "f")] + [TestCase("0000.00", "NF")] + [TestCase("0000.00", "nf")] + [TestCase("FFFF0000", "fg")] + [TestCase("Color Theme: Accent5, Tint: 0", "BG")] + [TestCase("2018.00", "v")] + public void ToStringFormatString(string expected, string format) + { + using var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet1"); + var c = ws.FirstCell().CellBelow(2).CellRight(3); + + var formula = "YEAR(DATE(2018, 1, 1))"; + c.FormulaA1 = formula; + + var numberFormat = "0000.00"; + c.Style.NumberFormat.Format = numberFormat; + + c.Style.Font.FontColor = XLColor.Red; + c.Style.Fill.BackgroundColor = XLColor.FromTheme(XLThemeColor.Accent5); + + Assert.AreEqual(expected, c.ToString(format)); + + Assert.Throws(() => c.ToString("dummy")); + } + + [Test] + public void ToStringInvalidFormat() + { + using var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet1"); + var c = ws.FirstCell(); + + Assert.Throws(() => c.ToString("dummy")); + } + } +} diff --git a/ClosedXML_Tests/Excel/Clearing/ClearingTests.cs b/ClosedXML_Tests/Excel/Clearing/ClearingTests.cs new file mode 100644 index 0000000..be4a3ba --- /dev/null +++ b/ClosedXML_Tests/Excel/Clearing/ClearingTests.cs @@ -0,0 +1,309 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class ClearingTests + { + private static XLColor backgroundColor = XLColor.LightBlue; + private static XLColor foregroundColor = XLColor.DarkBrown; + + private IXLWorkbook SetupWorkbook() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + + var c = ws.FirstCell() + .SetValue("Hello world!"); + + c.Comment.AddText("Some comment"); + + c.Style.Fill.BackgroundColor = backgroundColor; + c.Style.Font.FontColor = foregroundColor; + c.SetDataValidation().Custom("B1"); + + //// + + c = ws.FirstCell() + .CellBelow() + .SetFormulaA1("=LEFT(A1,5)"); + + c.Comment.AddText("Another comment"); + + c.Style.Fill.BackgroundColor = backgroundColor; + c.Style.Font.FontColor = foregroundColor; + + //// + + c = ws.FirstCell() + .CellBelow(2) + .SetValue(new DateTime(2018, 1, 15)); + + c.Comment.AddText("A date"); + + c.Style.Fill.BackgroundColor = backgroundColor; + c.Style.Font.FontColor = foregroundColor; + + ws.Column(1) + .AddConditionalFormat().WhenStartsWith("Hell") + .Fill.SetBackgroundColor(XLColor.Red) + .Border.SetOutsideBorder(XLBorderStyleValues.Thick) + .Border.SetOutsideBorderColor(XLColor.Blue) + .Font.SetBold(); + + Assert.AreEqual(XLDataType.Text, ws.Cell("A1").DataType); + Assert.AreEqual(XLDataType.Text, ws.Cell("A2").DataType); + Assert.AreEqual(XLDataType.DateTime, ws.Cell("A3").DataType); + + Assert.AreEqual(false, ws.Cell("A1").HasFormula); + Assert.AreEqual(true, ws.Cell("A2").HasFormula); + Assert.AreEqual(false, ws.Cell("A1").HasFormula); + + foreach (var cell in ws.Range("A1:A3").Cells()) + { + Assert.AreEqual(backgroundColor, cell.Style.Fill.BackgroundColor); + Assert.AreEqual(foregroundColor, cell.Style.Font.FontColor); + Assert.IsTrue(ws.ConditionalFormats.Any()); + Assert.IsTrue(cell.HasComment); + } + + Assert.AreEqual("B1", ws.Cell("A1").DataValidation.Value); + + return wb; + } + + [Test] + public void WorksheetClearAll() + { + using (var wb = SetupWorkbook()) + { + var ws = wb.Worksheets.First(); + + ws.Clear(XLClearOptions.All); + + foreach (var c in ws.Range("A1:A10").Cells()) + { + Assert.IsTrue(c.IsEmpty()); + Assert.AreEqual(XLDataType.Text, c.DataType); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, c.Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Font.FontColor, c.Style.Font.FontColor); + Assert.IsFalse(ws.ConditionalFormats.Any()); + Assert.IsFalse(c.HasComment); + Assert.AreEqual(String.Empty, c.DataValidation.Value); + } + } + } + + [Test] + public void WorksheetClearContents() + { + using (var wb = SetupWorkbook()) + { + var ws = wb.Worksheets.First(); + + ws.Clear(XLClearOptions.Contents); + + foreach (var c in ws.Range("A1:A3").Cells()) + { + Assert.IsTrue(c.IsEmpty(XLCellsUsedOptions.Contents)); + Assert.AreEqual(backgroundColor, c.Style.Fill.BackgroundColor); + Assert.AreEqual(foregroundColor, c.Style.Font.FontColor); + Assert.IsTrue(ws.ConditionalFormats.Any()); + Assert.IsTrue(c.HasComment); + } + + Assert.AreEqual("B1", ws.Cell("A1").DataValidation.Value); + + Assert.AreEqual(XLDataType.Text, ws.Cell("A1").DataType); + Assert.AreEqual(XLDataType.Text, ws.Cell("A2").DataType); + Assert.AreEqual(XLDataType.DateTime, ws.Cell("A3").DataType); + } + } + + [Test] + public void WorksheetClearDataType() + { + using (var wb = SetupWorkbook()) + { + var ws = wb.Worksheets.First(); + + ws.Clear(XLClearOptions.DataType); + + foreach (var c in ws.Range("A1:A3").Cells()) + { + Assert.IsFalse(c.IsEmpty()); + Assert.AreEqual(XLDataType.Text, c.DataType); + Assert.AreEqual(backgroundColor, c.Style.Fill.BackgroundColor); + Assert.AreEqual(foregroundColor, c.Style.Font.FontColor); + Assert.IsTrue(ws.ConditionalFormats.Any()); + Assert.IsTrue(c.HasComment); + } + + Assert.AreEqual("B1", ws.Cell("A1").DataValidation.Value); + } + } + + [Test] + public void WorksheetClearNormalFormats() + { + using (var wb = SetupWorkbook()) + { + var ws = wb.Worksheets.First(); + + ws.Clear(XLClearOptions.NormalFormats); + + foreach (var c in ws.Range("A1:A3").Cells()) + { + Assert.IsFalse(c.IsEmpty()); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, c.Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Font.FontColor, c.Style.Font.FontColor); + Assert.IsTrue(ws.ConditionalFormats.Any()); + Assert.IsTrue(c.HasComment); + } + + Assert.AreEqual(XLDataType.Text, ws.Cell("A1").DataType); + Assert.AreEqual(XLDataType.Text, ws.Cell("A2").DataType); + Assert.AreEqual(XLDataType.DateTime, ws.Cell("A3").DataType); + + Assert.AreEqual("B1", ws.Cell("A1").DataValidation.Value); + } + } + + [Test] + public void WorksheetClearConditionalFormats() + { + using (var wb = SetupWorkbook()) + { + var ws = wb.Worksheets.First(); + + ws.Clear(XLClearOptions.ConditionalFormats); + + foreach (var c in ws.Range("A1:A3").Cells()) + { + Assert.IsFalse(c.IsEmpty()); + Assert.AreEqual(backgroundColor, c.Style.Fill.BackgroundColor); + Assert.AreEqual(foregroundColor, c.Style.Font.FontColor); + Assert.IsFalse(ws.ConditionalFormats.Any()); + Assert.IsTrue(c.HasComment); + } + + Assert.AreEqual(XLDataType.Text, ws.Cell("A1").DataType); + Assert.AreEqual(XLDataType.Text, ws.Cell("A2").DataType); + Assert.AreEqual(XLDataType.DateTime, ws.Cell("A3").DataType); + + Assert.AreEqual("B1", ws.Cell("A1").DataValidation.Value); + } + } + + [Test] + public void WorksheetClearComments() + { + using (var wb = SetupWorkbook()) + { + var ws = wb.Worksheets.First(); + + ws.Clear(XLClearOptions.Comments); + + foreach (var c in ws.Range("A1:A3").Cells()) + { + Assert.IsFalse(c.IsEmpty()); + Assert.AreEqual(backgroundColor, c.Style.Fill.BackgroundColor); + Assert.AreEqual(foregroundColor, c.Style.Font.FontColor); + Assert.IsTrue(ws.ConditionalFormats.Any()); + Assert.IsFalse(c.HasComment); + } + + Assert.AreEqual(XLDataType.Text, ws.Cell("A1").DataType); + Assert.AreEqual(XLDataType.Text, ws.Cell("A2").DataType); + Assert.AreEqual(XLDataType.DateTime, ws.Cell("A3").DataType); + + Assert.AreEqual("B1", ws.Cell("A1").DataValidation.Value); + } + } + + [Test] + public void WorksheetClearDataValidation() + { + using (var wb = SetupWorkbook()) + { + var ws = wb.Worksheets.First(); + + ws.Clear(XLClearOptions.DataValidation); + + foreach (var c in ws.Range("A1:A3").Cells()) + { + Assert.IsFalse(c.IsEmpty()); + Assert.AreEqual(backgroundColor, c.Style.Fill.BackgroundColor); + Assert.AreEqual(foregroundColor, c.Style.Font.FontColor); + Assert.IsTrue(ws.ConditionalFormats.Any()); + Assert.IsTrue(c.HasComment); + } + + Assert.AreEqual(XLDataType.Text, ws.Cell("A1").DataType); + Assert.AreEqual(XLDataType.Text, ws.Cell("A2").DataType); + Assert.AreEqual(XLDataType.DateTime, ws.Cell("A3").DataType); + + Assert.AreEqual(string.Empty, ws.Cell("A1").DataValidation.Value); + } + } + + [Test] + public void DeleteClearedCellValue() + { + using (var ms = new MemoryStream()) + { + using (var wb = SetupWorkbook()) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual("Hello world!", ws.Cell("A1").GetString()); + Assert.AreEqual(new DateTime(2018, 1, 15), ws.Cell("A3").GetDateTime()); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + ws.Clear(XLClearOptions.Contents); + Assert.AreEqual("", ws.Cell("A1").GetString()); + Assert.Throws(() => ws.Cell("A3").GetDateTime()); + + wb.Save(); + } + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual("", ws.Cell("A1").GetString()); + Assert.Throws(() => ws.Cell("A3").GetDateTime()); + } + } + } + + [TestCase(XLClearOptions.All, 2)] + [TestCase(XLClearOptions.AllContents, 4)] + [TestCase(XLClearOptions.AllFormats, 4)] + [TestCase(XLClearOptions.Contents, 4)] + [TestCase(XLClearOptions.MergedRanges, 2)] + public void CanClearMergedRanges(XLClearOptions options, int expectedCount) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Test"); + + ws.Range("A1:C3").Merge(); + ws.Range("A4:B6").Merge(); + ws.Range("D1:F3").Merge(); + ws.Range("E4:F6").Merge(); + + ws.Range("C1:D6").Clear(options); + + Assert.AreEqual(expectedCount, ws.MergedRanges.Count); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Columns/ColumnTests.cs b/ClosedXML_Tests/Excel/Columns/ColumnTests.cs new file mode 100644 index 0000000..5e07723 --- /dev/null +++ b/ClosedXML_Tests/Excel/Columns/ColumnTests.cs @@ -0,0 +1,249 @@ +using System; +using System.IO; +using System.Linq; +using ClosedXML.Excel; +using NUnit.Framework; +using ClosedXML_Tests.Utils; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class ColumnTests + { + [Test] + public void ColumnUsed() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(2, 1).SetValue("Test"); + ws.Cell(3, 1).SetValue("Test"); + + IXLRangeColumn fromColumn = ws.Column(1).ColumnUsed(); + Assert.AreEqual("A2:A3", fromColumn.RangeAddress.ToStringRelative()); + + IXLRangeColumn fromRange = ws.Range("A1:A5").FirstColumn().ColumnUsed(); + Assert.AreEqual("A2:A3", fromRange.RangeAddress.ToStringRelative()); + } + + [Test] + public void CopyColumn() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Test").Style.Font.SetBold(); + ws.FirstColumn().CopyTo(ws.Column(2)); + + Assert.IsTrue(ws.Cell("B1").Style.Font.Bold); + } + + [Test] + public void InsertingColumnsBefore1() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + + ws.Columns("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); + ws.Column(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); + ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); + + IXLColumn column1 = ws.Column(1); + IXLColumn column2 = ws.Column(2); + IXLColumn column3 = ws.Column(3); + + IXLColumn columnIns = ws.Column(1).InsertColumnsBefore(1).First(); + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Column(1).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Column(1).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Column(1).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Column(3).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", ws.Column(3).Cell(2).GetString()); + + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, columnIns.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, columnIns.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, columnIns.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, column1.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column1.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column1.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, column2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, column2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, column2.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, column3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column3.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", column2.Cell(2).GetString()); + } + + [Test] + public void InsertingColumnsBefore2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + + ws.Columns("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); + ws.Column(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); + ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); + + IXLColumn column1 = ws.Column(1); + IXLColumn column2 = ws.Column(2); + IXLColumn column3 = ws.Column(3); + + IXLColumn columnIns = ws.Column(2).InsertColumnsBefore(1).First(); + + Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Column(3).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", ws.Column(3).Cell(2).GetString()); + + + Assert.AreEqual(XLColor.Red, columnIns.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, columnIns.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, columnIns.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, column1.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column1.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column1.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, column2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, column2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, column2.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, column3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column3.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", column2.Cell(2).GetString()); + } + + [Test] + public void InsertingColumnsBefore3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + + ws.Columns("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); + ws.Column(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); + ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); + + IXLColumn column1 = ws.Column(1); + IXLColumn column2 = ws.Column(2); + IXLColumn column3 = ws.Column(3); + + IXLColumn columnIns = ws.Column(3).InsertColumnsBefore(1).First(); + + Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Column(2).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Column(2).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Column(2).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Column(3).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", ws.Column(2).Cell(2).GetString()); + + + Assert.AreEqual(XLColor.Yellow, columnIns.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, columnIns.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, columnIns.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, column1.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column1.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column1.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, column2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, column2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, column2.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, column3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column3.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", column2.Cell(2).GetString()); + } + + [Test] + public void NoColumnsUsed() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + Int32 count = 0; + + foreach (IXLColumn row in ws.ColumnsUsed()) + count++; + + foreach (IXLRangeColumn row in ws.Range("A1:C3").ColumnsUsed()) + count++; + + Assert.AreEqual(0, count); + } + + [Test] + public void UngroupFromAll() + { + IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); + ws.Columns(1, 2).Group(); + ws.Columns(1, 2).Ungroup(true); + } + + [Test] + public void LastColumnUsed() + { + IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); + ws.Cell("A1").Value = "A1"; + ws.Cell("B1").Value = "B1"; + ws.Cell("A2").Value = "A2"; + var lastCoUsed = ws.LastColumnUsed().ColumnNumber(); + Assert.AreEqual(2, lastCoUsed); + } + + [Test] + public void NegativeColumnNumberIsInvalid() + { + var ws = new XLWorkbook().AddWorksheet("Sheet1") as XLWorksheet; + + var column = new XLColumn(ws, -1); + + Assert.IsFalse(column.RangeAddress.IsValid); + } + } +} diff --git a/ClosedXML_Tests/Excel/Comments/CommentsTests.cs b/ClosedXML_Tests/Excel/Comments/CommentsTests.cs new file mode 100644 index 0000000..9d41745 --- /dev/null +++ b/ClosedXML_Tests/Excel/Comments/CommentsTests.cs @@ -0,0 +1,194 @@ +using ClosedXML.Excel; +using DocumentFormat.OpenXml.Packaging; +using NUnit.Framework; +using System; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.Excel.Comments +{ + public class CommentsTests + { + [Test] + public void CanGetColorFromIndex81() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\CommentsWithIndexedColor81.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + var c = ws.FirstCellUsed(); + + var xlColor = c.Comment.Style.ColorsAndLines.LineColor; + Assert.AreEqual(XLColorType.Indexed, xlColor.ColorType); + Assert.AreEqual(81, xlColor.Indexed); + + var color = xlColor.Color.ToHex(); + Assert.AreEqual("FF000000", color); + } + } + + [Test] + public void AddingCommentDoesNotAffectCollections() + { + var ws = new XLWorkbook().AddWorksheet() as XLWorksheet; + ws.Cell("A1").SetValue(10); + ws.Cell("A4").SetValue(10); + ws.Cell("A5").SetValue(10); + + ws.Rows("1,4").Height = 20; + + Assert.AreEqual(2, ws.Internals.RowsCollection.Count); + Assert.AreEqual(3, ws.Internals.CellsCollection.RowsCollection.SelectMany(r => r.Value.Values).Count()); + + ws.Cell("A4").Comment.AddText("Comment"); + Assert.AreEqual(2, ws.Internals.RowsCollection.Count); + Assert.AreEqual(3, ws.Internals.CellsCollection.RowsCollection.SelectMany(r => r.Value.Values).Count()); + + ws.Row(1).Delete(); + Assert.AreEqual(1, ws.Internals.RowsCollection.Count); + Assert.AreEqual(2, ws.Internals.CellsCollection.RowsCollection.SelectMany(r => r.Value.Values).Count()); + } + + [Test] + public void CopyCommentStyle() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + string strExcelComment = "1) ABCDEFGHIJKLMNOPQRSTUVWXYZ ABC ABC ABC ABC ABC" + Environment.NewLine; + strExcelComment = strExcelComment + "1) ABCDEFGHIJKLMNOPQRSTUVWXYZ ABC ABC ABC ABC ABC" + Environment.NewLine; + strExcelComment = strExcelComment + "2) ABCDEFGHIJKLMNOPQRSTUVWXYZ ABC ABC ABC ABC ABC" + Environment.NewLine; + strExcelComment = strExcelComment + "3) ABCDEFGHIJKLMNOPQRSTUVWXYZ ABC ABC ABC ABC ABC" + Environment.NewLine; + strExcelComment = strExcelComment + "4) ABCDEFGHIJKLMNOPQRSTUVWXYZ ABC ABC ABC ABC ABC" + Environment.NewLine; + strExcelComment = strExcelComment + "5) ABCDEFGHIJKLMNOPQRSTUVWXYZ ABC ABC ABC ABC ABC" + Environment.NewLine; + strExcelComment = strExcelComment + "6) ABCDEFGHIJKLMNOPQRSTUVWXYZ ABC ABC ABC ABC ABC" + Environment.NewLine; + strExcelComment = strExcelComment + "7) ABCDEFGHIJKLMNOPQRSTUVWXYZ ABC ABC ABC ABC ABC" + Environment.NewLine; + strExcelComment = strExcelComment + "8) ABCDEFGHIJKLMNOPQRSTUVWXYZ ABC ABC ABC ABC ABC" + Environment.NewLine; + strExcelComment = strExcelComment + "9) ABCDEFGHIJKLMNOPQRSTUVWXYZ ABC ABC ABC ABC ABC" + Environment.NewLine; + + var cell = ws.Cell(2, 2).SetValue("Comment 1"); + + cell.Comment + .SetVisible(false) + .AddText(strExcelComment); + + cell.Comment + .Style + .Alignment + .SetAutomaticSize(); + + cell.Comment + .Style + .ColorsAndLines + .SetFillColor(XLColor.Red); + + ws.Row(1).InsertRowsAbove(1); + + Action validate = c => + { + Assert.IsTrue(c.Comment.Style.Alignment.AutomaticSize); + Assert.AreEqual(XLColor.Red, c.Comment.Style.ColorsAndLines.FillColor); + }; + + validate(ws.Cell("B3")); + + ws.Column(1).InsertColumnsBefore(2); + + validate(ws.Cell("D3")); + + ws.Column(1).Delete(); + + validate(ws.Cell("C3")); + + ws.Row(1).Delete(); + + validate(ws.Cell("C2")); + } + } + + [Test] + public void EnsureUnaffectedCommentAndVmlPartIdsAndUris() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\CommentAndButton.xlsx"))) + using (var ms = new MemoryStream()) + { + string commentPartId; + string commentPartUri; + + string vmlPartId; + string vmlPartUri; + + using (var ssd = SpreadsheetDocument.Open(stream, isEditable: false)) + { + var wbp = ssd.GetPartsOfType().Single(); + var wsp = wbp.GetPartsOfType().Last(); + + var wscp = wsp.GetPartsOfType().Single(); + commentPartId = wsp.GetIdOfPart(wscp); + commentPartUri = wscp.Uri.ToString(); + + var vmlp = wsp.GetPartsOfType().Single(); + vmlPartId = wsp.GetIdOfPart(vmlp); + vmlPartUri = vmlp.Uri.ToString(); + } + + stream.Position = 0; + stream.CopyTo(ms); + ms.Position = 0; + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + Assert.IsTrue(ws.FirstCell().HasComment); + + wb.SaveAs(ms); + } + + ms.Position = 0; + + using (var ssd = SpreadsheetDocument.Open(ms, isEditable: false)) + { + var wbp = ssd.GetPartsOfType().Single(); + var wsp = wbp.GetPartsOfType().Last(); + + var wscp = wsp.GetPartsOfType().Single(); + Assert.AreEqual(commentPartUri, wscp.Uri.ToString()); + Assert.AreEqual(commentPartId, wsp.GetIdOfPart(wscp)); + + var vmlp = wsp.GetPartsOfType().Single(); + Assert.AreEqual(vmlPartUri, vmlp.Uri.ToString()); + Assert.AreEqual(vmlPartId, wsp.GetIdOfPart(vmlp)); + } + } + } + + [Test] + public void SavingDoesNotCauseTwoRootElements() // See #1157 + { + using (var ms = new MemoryStream()) + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\CommentAndButton.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + wb.SaveAs(ms); + } + + Assert.DoesNotThrow(() => new XLWorkbook(ms)); + } + } + + [Test] + public void CanLoadCommentVisibility() + { + using (var inputStream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\Drawings\Comments\inputfile.xlsx"))) + using (var workbook = new XLWorkbook(inputStream)) + { + var ws = workbook.Worksheets.First(); + + Assert.True(ws.Cell("A1").Comment.Visible); + Assert.False(ws.Cell("A4").Comment.Visible); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatCopyTests.cs b/ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatCopyTests.cs new file mode 100644 index 0000000..3ac5cbd --- /dev/null +++ b/ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatCopyTests.cs @@ -0,0 +1,116 @@ +using System; +using System.Linq; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.ConditionalFormats +{ + [TestFixture] + public class ConditionalFormatCopyTests + { + [Test] + public void StylesAreCreatedDuringCopy() + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet"); + var format = ws.Range("A1:A1").AddConditionalFormat(); + format.WhenEquals("=" + format.Ranges.First().FirstCell().CellRight(4).Address.ToStringRelative()).Fill + .SetBackgroundColor(XLColor.Blue); + + var wb2 = new XLWorkbook(); + var ws2 = wb2.Worksheets.Add("Sheet2"); + ws2.FirstCell().CopyFrom(ws.FirstCell()); + Assert.That(ws2.ConditionalFormats.First().Style.Fill.BackgroundColor, Is.EqualTo(XLColor.Blue)); //Added blue style + } + + [Test] + public void CopyConditionalFormatSingleWorksheet() + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet"); + var format = ws.Range("A1:A1").AddConditionalFormat(); + format.WhenEquals("=" + format.Ranges.First().FirstCell().CellRight(4).Address.ToStringRelative()).Fill + .SetBackgroundColor(XLColor.Blue); + + ws.Cell("A1").CopyTo("B2"); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + Assert.AreEqual(2, ws.ConditionalFormats.First().Ranges.Count); + Assert.AreEqual("A1:A1", ws.ConditionalFormats.First().Ranges.First().RangeAddress.ToString()); + Assert.AreEqual("B2:B2", ws.ConditionalFormats.First().Ranges.Last().RangeAddress.ToString()); + } + + [Test] + public void CopyConditionalFormatSameRange() + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet"); + var format = ws.Range("A1:C3").AddConditionalFormat(); + format.WhenEquals("=" + format.Ranges.First().FirstCell().CellRight(4).Address.ToStringRelative()).Fill + .SetBackgroundColor(XLColor.Blue); + + ws.Cell("A1").CopyTo("B2"); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + Assert.AreEqual(1, ws.ConditionalFormats.First().Ranges.Count); + Assert.AreEqual("A1:C3", ws.ConditionalFormats.First().Ranges.First().RangeAddress.ToString()); + } + + [Test] + public void CopyConditionalFormatsDifferentWorksheets() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + var format = ws1.Range("A1:A1").AddConditionalFormat(); + format.WhenEquals("=" + format.Ranges.First().FirstCell().CellRight(4).Address.ToStringRelative()).Fill + .SetBackgroundColor(XLColor.Blue); + var ws2 = wb.Worksheets.Add("Sheet2"); + var otherCell = ws2.Cell("B2"); + + ws1.Cell("A1").CopyTo(otherCell); + + Assert.AreEqual(1, ws1.ConditionalFormats.Count()); + Assert.AreEqual(1, ws2.ConditionalFormats.Count()); + Assert.AreEqual(1, ws1.ConditionalFormats.First().Ranges.Count); + Assert.AreEqual(1, ws2.ConditionalFormats.First().Ranges.Count); + Assert.AreEqual("Sheet1", ws1.ConditionalFormats.First().Ranges.First().Worksheet.Name); + Assert.AreEqual("Sheet2", ws2.ConditionalFormats.First().Ranges.First().Worksheet.Name); + Assert.AreEqual("A1:A1", ws1.ConditionalFormats.First().Ranges.First().RangeAddress.ToString()); + Assert.AreEqual("B2:B2", ws2.ConditionalFormats.First().Ranges.First().RangeAddress.ToString()); + } + + [Test] + public void FullCopyConditionalFormatSameWorksheet() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + var format = (XLConditionalFormat)ws1.Range("A1:A1").AddConditionalFormat(); + format.WhenEquals("=" + format.Ranges.First().FirstCell().CellRight(4).Address.ToStringRelative()).Fill + .SetBackgroundColor(XLColor.Blue); + + TestDelegate action = () => format.CopyTo(ws1); + + Assert.Throws(typeof(InvalidOperationException), action); + + } + [Test] + public void FullCopyConditionalFormatDifferentWorksheets() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + var format = (XLConditionalFormat)ws1.Range("A1:C3").AddConditionalFormat(); + format.WhenEquals("=" + format.Ranges.First().FirstCell().CellRight(4).Address.ToStringRelative()).Fill + .SetBackgroundColor(XLColor.Blue); + var ws2 = wb.Worksheets.Add("Sheet2"); + + format.CopyTo(ws2); + + Assert.AreEqual(1, ws1.ConditionalFormats.Count()); + Assert.AreEqual(1, ws2.ConditionalFormats.Count()); + Assert.AreEqual(1, ws1.ConditionalFormats.First().Ranges.Count); + Assert.AreEqual(1, ws2.ConditionalFormats.First().Ranges.Count); + Assert.AreEqual("Sheet1!A1:C3", ws1.ConditionalFormats.First().Ranges.First().RangeAddress.ToString(XLReferenceStyle.A1, true)); + Assert.AreEqual("Sheet2!A1:C3", ws2.ConditionalFormats.First().Ranges.First().RangeAddress.ToString(XLReferenceStyle.A1, true)); + } + } +} diff --git a/ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatShiftTests.cs b/ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatShiftTests.cs new file mode 100644 index 0000000..43684cf --- /dev/null +++ b/ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatShiftTests.cs @@ -0,0 +1,127 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System.Linq; + +namespace ClosedXML_Tests.Excel.ConditionalFormats +{ + [TestFixture] + public class ConditionalFormatShiftTests + { + [Test] + public void CFShiftedOnColumnInsert() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("CFShift"); + ws.Range("A1:A1").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AirForceBlue); + ws.Range("A2:B2").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AliceBlue); + ws.Range("A3:C3").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Alizarin); + ws.Range("B4:B6").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Almond); + ws.Range("C7:D7").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Amaranth); + ws.Cells("A1:D7").Value = 1; + + ws.Column(2).InsertColumnsAfter(2); + var cf = ws.ConditionalFormats.ToArray(); + + Assert.AreEqual(5, cf.Length); + Assert.AreEqual("A1:A1", cf[0].Range.RangeAddress.ToString()); + Assert.AreEqual("A2:D2", cf[1].Range.RangeAddress.ToString()); + Assert.AreEqual("A3:E3", cf[2].Range.RangeAddress.ToString()); + Assert.AreEqual("B4:D6", cf[3].Range.RangeAddress.ToString()); + Assert.AreEqual("E7:F7", cf[4].Range.RangeAddress.ToString()); + } + } + + [Test] + public void CFShiftedOnRowInsert() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("CFShift"); + ws.Range("A1:A1").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AirForceBlue); + ws.Range("B1:B2").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AliceBlue); + ws.Range("C1:C3").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Alizarin); + ws.Range("D2:F2").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Almond); + ws.Range("G4:G5").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Amaranth); + ws.Cells("A1:G5").Value = 1; + + ws.Row(2).InsertRowsBelow(2); + var cf = ws.ConditionalFormats.ToArray(); + + Assert.AreEqual(5, cf.Length); + Assert.AreEqual("A1:A1", cf[0].Range.RangeAddress.ToString()); + Assert.AreEqual("B1:B4", cf[1].Range.RangeAddress.ToString()); + Assert.AreEqual("C1:C5", cf[2].Range.RangeAddress.ToString()); + Assert.AreEqual("D2:F4", cf[3].Range.RangeAddress.ToString()); + Assert.AreEqual("G6:G7", cf[4].Range.RangeAddress.ToString()); + } + } + + [Test] + public void CFShiftedOnColumnDelete() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("CFShift"); + ws.Range("A1:A1").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AirForceBlue); + ws.Range("A2:B2").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AliceBlue); + ws.Range("A3:C3").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Alizarin); + ws.Range("B4:B6").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Almond); + ws.Range("C7:D7").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Amaranth); + ws.Cells("A1:D7").Value = 1; + + ws.Column(2).Delete(); + var cf = ws.ConditionalFormats.ToArray(); + + Assert.AreEqual(4, cf.Length); + Assert.AreEqual("A1:A1", cf[0].Range.RangeAddress.ToString()); + Assert.AreEqual("A2:A2", cf[1].Range.RangeAddress.ToString()); + Assert.AreEqual("A3:B3", cf[2].Range.RangeAddress.ToString()); + Assert.AreEqual("B7:C7", cf[3].Range.RangeAddress.ToString()); + } + } + + [Test] + public void CFShiftedOnRowDelete() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("CFShift"); + ws.Range("A1:A1").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AirForceBlue); + ws.Range("B1:B2").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.AliceBlue); + ws.Range("C1:C3").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Alizarin); + ws.Range("D2:F2").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Almond); + ws.Range("G4:G5").AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Amaranth); + ws.Cells("A1:G5").Value = 1; + + ws.Row(2).Delete(); + var cf = ws.ConditionalFormats.ToArray(); + + Assert.AreEqual(4, cf.Length); + Assert.AreEqual("A1:A1", cf[0].Range.RangeAddress.ToString()); + Assert.AreEqual("B1:B1", cf[1].Range.RangeAddress.ToString()); + Assert.AreEqual("C1:C2", cf[2].Range.RangeAddress.ToString()); + Assert.AreEqual("G3:G4", cf[3].Range.RangeAddress.ToString()); + } + } + + [Test] + public void CFShiftedTruncateRange() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("CFShift"); + ws.AsRange().AddConditionalFormat().WhenGreaterThan(0).Fill.SetBackgroundColor(XLColor.Red); + var cf = ws.ConditionalFormats.Single(); + + ws.Row(2).InsertRowsAbove(1); + Assert.IsTrue(cf.Range.RangeAddress.IsValid); + Assert.AreEqual($"1:{XLHelper.MaxRowNumber}", cf.Range.RangeAddress.ToString()); + + ws.Column(2).InsertColumnsAfter(1); + Assert.IsTrue(cf.Range.RangeAddress.IsValid); + Assert.AreEqual($"1:{XLHelper.MaxRowNumber}", cf.Range.RangeAddress.ToString()); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatTests.cs b/ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatTests.cs new file mode 100644 index 0000000..252a4d8 --- /dev/null +++ b/ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatTests.cs @@ -0,0 +1,118 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading; + +namespace ClosedXML_Tests.Excel.ConditionalFormats +{ + [TestFixture] + public class ConditionalFormatTests + { + [Test] + public void MaintainConditionalFormattingOrder() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\StyleReferenceFiles\ConditionalFormattingOrder\inputfile.xlsx"))) + using (var ms = new MemoryStream()) + { + TestHelper.CreateAndCompare(() => + { + var wb = new XLWorkbook(stream); + wb.SaveAs(ms); + return wb; + }, @"Other\StyleReferenceFiles\ConditionalFormattingOrder\ConditionalFormattingOrder.xlsx"); + } + } + + [TestCase(true, 7)] + [TestCase(false, 8)] + public void SaveOptionAffectsConsolidationConditionalFormatRanges(bool consolidateConditionalFormatRanges, int expectedCount) + { + var options = new SaveOptions + { + ConsolidateConditionalFormatRanges = consolidateConditionalFormatRanges + }; + + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet"); + + ws.Range("D2:D3").AddConditionalFormat().DataBar(XLColor.Red).LowestValue().HighestValue(); + ws.Range("B2:B3").AddConditionalFormat().DataBar(XLColor.Red).LowestValue().HighestValue(); + ws.Range("E2:E6").AddConditionalFormat().ColorScale().LowestValue(XLColor.Red).HighestValue(XLColor.Blue); + ws.Range("F2:F6").AddConditionalFormat().ColorScale().LowestValue(XLColor.Red).HighestValue(XLColor.Blue); + ws.Range("G2:G7").AddConditionalFormat().WhenIsUnique().Fill.SetBackgroundColor(XLColor.Blue); + ws.Range("H2:H7").AddConditionalFormat().WhenIsUnique().Fill.SetBackgroundColor(XLColor.Blue); + ws.Range("I2:I6").AddConditionalFormat().WhenContains("test"); + ws.Range("J2:J6").AddConditionalFormat().WhenContains("test"); + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms, options); + var wb_saved = new XLWorkbook(ms); + Assert.AreEqual(expectedCount, wb_saved.Worksheet("Sheet").ConditionalFormats.Count()); + } + } + + [TestCase(true, 1)] + [TestCase(false, 2)] + public void SaveOptionAffectsConsolidationDataValidationRanges(bool consolidateDataValidationRanges, int expectedCount) + { + var options = new SaveOptions + { + ConsolidateDataValidationRanges = consolidateDataValidationRanges + }; + + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet"); + ws.Range("C2:C5").SetDataValidation().Decimal.Between(1, 5); + ws.Range("D2:D5").SetDataValidation().Decimal.Between(1, 5); + + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms, options); + var wb_saved = new XLWorkbook(ms); + Assert.AreEqual(expectedCount, wb_saved.Worksheet("Sheet").DataValidations.Count()); + } + } + + [TestCase("en-US")] + [TestCase("fr-FR")] + [TestCase("ru-RU")] + public void SaveConditionalFormat_CultureIndependent(string culture) + { + using (var ms = new MemoryStream()) + { + var expectedValue = 1.5; + Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(culture); + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var i = 1; + ws.Cell(i++, 1).AddConditionalFormat().WhenEquals(expectedValue).Fill.SetBackgroundColor(XLColor.Red); + ws.Cell(i++, 1).AddConditionalFormat().WhenNotEquals(expectedValue).Fill.SetBackgroundColor(XLColor.Red); + ws.Cell(i++, 1).AddConditionalFormat().WhenGreaterThan(expectedValue).Fill.SetBackgroundColor(XLColor.Red); + ws.Cell(i++, 1).AddConditionalFormat().WhenLessThan(expectedValue).Fill.SetBackgroundColor(XLColor.Red); + ws.Cell(i++, 1).AddConditionalFormat().WhenEqualOrGreaterThan(expectedValue).Fill.SetBackgroundColor(XLColor.Red); + ws.Cell(i++, 1).AddConditionalFormat().WhenEqualOrLessThan(expectedValue).Fill.SetBackgroundColor(XLColor.Red); + ws.Cell(i++, 1).AddConditionalFormat().WhenBetween(expectedValue, expectedValue).Fill.SetBackgroundColor(XLColor.Red); + ws.Cell(i++, 1).AddConditionalFormat().WhenNotBetween(expectedValue, expectedValue).Fill.SetBackgroundColor(XLColor.Red); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + + var conditionalFormatValues = ws.ConditionalFormats + .SelectMany(cf => cf.Values.Values) + .Select(v => v.Value) + .Distinct(); + + Assert.AreEqual(1, conditionalFormatValues.Count()); + Assert.AreEqual("1.5", conditionalFormatValues.Single()); + } + } + } + } +} diff --git a/ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatsConsolidateTests.cs b/ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatsConsolidateTests.cs new file mode 100644 index 0000000..65a8e22 --- /dev/null +++ b/ClosedXML_Tests/Excel/ConditionalFormats/ConditionalFormatsConsolidateTests.cs @@ -0,0 +1,206 @@ +using System.IO; +using System.Linq; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.ConditionalFormats +{ + [TestFixture] + public class ConditionalFormatsConsolidateTests + { + [Test] + public void ConsecutivelyRowsConsolidateTest() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + SetFormat1(ws.Range("B2:C2").AddConditionalFormat()); + SetFormat1(ws.Range("B4:C4").AddConditionalFormat()); + SetFormat1(ws.Range("B3:C3").AddConditionalFormat()); + + ((XLConditionalFormats)ws.ConditionalFormats).Consolidate(); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + var format = ws.ConditionalFormats.First(); + Assert.AreEqual("B2:C4", format.Range.RangeAddress.ToStringRelative()); + Assert.AreEqual("F2", format.Values.Values.First().Value); + } + + [Test] + public void ConsecutivelyColumnsConsolidateTest() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + SetFormat1(ws.Range("D2:D3").AddConditionalFormat()); + SetFormat1(ws.Range("B2:B3").AddConditionalFormat()); + SetFormat1(ws.Range("C2:C3").AddConditionalFormat()); + + ((XLConditionalFormats)ws.ConditionalFormats).Consolidate(); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + var format = ws.ConditionalFormats.First(); + Assert.AreEqual("B2:D3", format.Ranges.First().RangeAddress.ToStringRelative()); + Assert.AreEqual("F2", format.Values.Values.First().Value); + } + + [Test] + public void Contains1ConsolidateTest() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + SetFormat1(ws.Range("B11:D12").AddConditionalFormat()); + SetFormat1(ws.Range("C12:D12").AddConditionalFormat()); + + ((XLConditionalFormats)ws.ConditionalFormats).Consolidate(); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + var format = ws.ConditionalFormats.First(); + Assert.AreEqual("B11:D12", format.Range.RangeAddress.ToStringRelative()); + Assert.AreEqual("F11", format.Values.Values.First().Value); + } + + [Test] + public void Contains2ConsolidateTest() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + SetFormat1(ws.Range("B14:C14").AddConditionalFormat()); + SetFormat1(ws.Range("B14:B14").AddConditionalFormat()); + + ((XLConditionalFormats)ws.ConditionalFormats).Consolidate(); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + var format = ws.ConditionalFormats.First(); + Assert.AreEqual("B14:C14", format.Range.RangeAddress.ToStringRelative()); + Assert.AreEqual("F14", format.Values.Values.First().Value); + } + + [Test] + public void SuperimposedConsolidateTest() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + SetFormat1(ws.Range("B16:D18").AddConditionalFormat()); + SetFormat1(ws.Range("B18:D19").AddConditionalFormat()); + + ((XLConditionalFormats)ws.ConditionalFormats).Consolidate(); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + var format = ws.ConditionalFormats.First(); + Assert.AreEqual("B16:D19", format.Range.RangeAddress.ToStringRelative()); + Assert.AreEqual("F16", format.Values.Values.First().Value); + } + + [Test] + public void DifferentFormatNoConsolidateTest() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + SetFormat1(ws.Range("B11:D12").AddConditionalFormat()); + SetFormat2(ws.Range("C12:D12").AddConditionalFormat()); + + ((XLConditionalFormats)ws.ConditionalFormats).Consolidate(); + + Assert.AreEqual(2, ws.ConditionalFormats.Count()); + } + + [Test] + public void ConsolidatePreservesPriorities() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + SetFormat1(ws.Range("A1:A5").AddConditionalFormat()); + SetFormat2(ws.Range("A1:A5").AddConditionalFormat()); + SetFormat2(ws.Range("A6:A10").AddConditionalFormat()); + SetFormat1(ws.Range("A6:A10").AddConditionalFormat()); + + ((XLConditionalFormats)ws.ConditionalFormats).Consolidate(); + + Assert.AreEqual(3, ws.ConditionalFormats.Count()); + Assert.AreEqual((ws.ConditionalFormats.First().Style as XLStyle).Value, (ws.ConditionalFormats.Last().Style as XLStyle).Value); + Assert.AreNotEqual((ws.ConditionalFormats.First().Style as XLStyle).Value, (ws.ConditionalFormats.ElementAt(1).Style as XLStyle).Value); + } + + + [Test] + public void ConsolidatePreservesPriorities2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + SetFormat1(ws.Range("A1:A1").AddConditionalFormat()); + SetFormat2(ws.Range("A2:A3").AddConditionalFormat()); + SetFormat1(ws.Range("A2:A6").AddConditionalFormat()); + SetFormat1(ws.Range("A7:A8").AddConditionalFormat()); + + ((XLConditionalFormats)ws.ConditionalFormats).Consolidate(); + + Assert.AreEqual(3, ws.ConditionalFormats.Count()); + Assert.AreEqual((ws.ConditionalFormats.First().Style as XLStyle).Value, (ws.ConditionalFormats.Last().Style as XLStyle).Value); + Assert.AreNotEqual((ws.ConditionalFormats.First().Style as XLStyle).Value, (ws.ConditionalFormats.ElementAt(1).Style as XLStyle).Value); + Assert.IsTrue(ws.ConditionalFormats.All(cf => cf.Ranges.Count == 1), "Number of ranges in consolidated conditional formats is expected to be 1"); + Assert.AreEqual("A1:A1", ws.ConditionalFormats.ElementAt(0).Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("A2:A3", ws.ConditionalFormats.ElementAt(1).Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("A2:A8", ws.ConditionalFormats.ElementAt(2).Ranges.Single().RangeAddress.ToString()); + } + + + [Test] + public void ConsolidateShiftsFormulaRelativelyToTopMostCell() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + var ranges = ws.Ranges("B3:B8,C3:C4,A3:A4,C5:C8,A5:A8").Cast(); + var cf = new XLConditionalFormat(ranges); + cf.Values.Add(new XLFormula("=A3=$D3")); + cf.Style.Fill.SetBackgroundColor(XLColor.Red); + ws.ConditionalFormats.Add(cf); + + ((XLConditionalFormats)ws.ConditionalFormats).Consolidate(); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + Assert.AreEqual((ws.ConditionalFormats.Single().Style as XLStyle).Value, (cf.Style as XLStyle).Value); + Assert.AreEqual("A3:C8", ws.ConditionalFormats.Single().Ranges.Single().RangeAddress.ToString()); + Assert.IsTrue(ws.ConditionalFormats.Single().Values.Single().Value.IsFormula); + Assert.AreEqual("A3=$D3", ws.ConditionalFormats.Single().Values.Single().Value.Value); + } + + [Test] + public void ColorScaleComparing() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet"); + + var ranges = ws.Ranges("B3:B8,C3:C4,A3:A4,C5:C8,A5:A8").Cast(); + var cf1 = new XLConditionalFormat(ranges); + cf1.ColorScale() + .LowestValue(XLColor.Red) + .HighestValue(XLColor.Green); + + var cf2 = new XLConditionalFormat(ranges); + cf2.ColorScale() + .LowestValue(XLColor.Red) + .HighestValue(XLColor.Green); + Assert.True(XLConditionalFormat.NoRangeComparer.Equals(cf1, cf2)); + } + } + + private static void SetFormat1(IXLConditionalFormat format) + { + format.WhenEquals("="+format.Range.FirstCell().CellRight(4).Address.ToStringRelative()).Fill.SetBackgroundColor(XLColor.Blue); + } + + private static void SetFormat2(IXLConditionalFormat format) + { + format.WhenEquals(5).Fill.SetBackgroundColor(XLColor.AliceBlue); + } + } +} diff --git a/ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs b/ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs new file mode 100644 index 0000000..77dc0ed --- /dev/null +++ b/ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs @@ -0,0 +1,191 @@ +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class XLAddressTests + { + [Test] + public void ToStringTest() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLAddress address = ws.Cell(1, 1).Address; + + Assert.AreEqual("A1", address.ToString()); + Assert.AreEqual("A1", address.ToString(XLReferenceStyle.A1)); + Assert.AreEqual("R1C1", address.ToString(XLReferenceStyle.R1C1)); + Assert.AreEqual("A1", address.ToString(XLReferenceStyle.Default)); + Assert.AreEqual("Sheet1!A1", address.ToString(XLReferenceStyle.Default, true)); + + Assert.AreEqual("A1", address.ToStringRelative()); + Assert.AreEqual("Sheet1!A1", address.ToStringRelative(true)); + + Assert.AreEqual("$A$1", address.ToStringFixed()); + Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.A1)); + Assert.AreEqual("R1C1", address.ToStringFixed(XLReferenceStyle.R1C1)); + Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.Default)); + Assert.AreEqual("Sheet1!$A$1", address.ToStringFixed(XLReferenceStyle.A1, true)); + Assert.AreEqual("Sheet1!R1C1", address.ToStringFixed(XLReferenceStyle.R1C1, true)); + Assert.AreEqual("Sheet1!$A$1", address.ToStringFixed(XLReferenceStyle.Default, true)); + } + + [Test] + public void ToStringTestWithSpace() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet 1"); + IXLAddress address = ws.Cell(1, 1).Address; + + Assert.AreEqual("A1", address.ToString()); + Assert.AreEqual("A1", address.ToString(XLReferenceStyle.A1)); + Assert.AreEqual("R1C1", address.ToString(XLReferenceStyle.R1C1)); + Assert.AreEqual("A1", address.ToString(XLReferenceStyle.Default)); + Assert.AreEqual("'Sheet 1'!A1", address.ToString(XLReferenceStyle.Default, true)); + + Assert.AreEqual("A1", address.ToStringRelative()); + Assert.AreEqual("'Sheet 1'!A1", address.ToStringRelative(true)); + + Assert.AreEqual("$A$1", address.ToStringFixed()); + Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.A1)); + Assert.AreEqual("R1C1", address.ToStringFixed(XLReferenceStyle.R1C1)); + Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.Default)); + Assert.AreEqual("'Sheet 1'!$A$1", address.ToStringFixed(XLReferenceStyle.A1, true)); + Assert.AreEqual("'Sheet 1'!R1C1", address.ToStringFixed(XLReferenceStyle.R1C1, true)); + Assert.AreEqual("'Sheet 1'!$A$1", address.ToStringFixed(XLReferenceStyle.Default, true)); + } + + [Test] + public void InvalidAddressToStringTest() + { + var address = ProduceInvalidAddress(); + + Assert.AreEqual("#REF!", address.ToString()); + Assert.AreEqual("#REF!", address.ToString(XLReferenceStyle.A1)); + Assert.AreEqual("#REF!", address.ToString(XLReferenceStyle.R1C1)); + Assert.AreEqual("#REF!", address.ToString(XLReferenceStyle.Default)); + Assert.AreEqual("'Sheet 1'!#REF!", address.ToString(XLReferenceStyle.Default, true)); + } + + [Test] + public void InvalidAddressToStringFixedTest() + { + var address = ProduceInvalidAddress(); + + Assert.AreEqual("#REF!", address.ToStringFixed()); + Assert.AreEqual("#REF!", address.ToStringFixed(XLReferenceStyle.A1)); + Assert.AreEqual("#REF!", address.ToStringFixed(XLReferenceStyle.R1C1)); + Assert.AreEqual("#REF!", address.ToStringFixed(XLReferenceStyle.Default)); + Assert.AreEqual("'Sheet 1'!#REF!", address.ToStringFixed(XLReferenceStyle.A1, true)); + Assert.AreEqual("'Sheet 1'!#REF!", address.ToStringFixed(XLReferenceStyle.R1C1, true)); + Assert.AreEqual("'Sheet 1'!#REF!", address.ToStringFixed(XLReferenceStyle.Default, true)); + } + + [Test] + public void InvalidAddressToStringRelativeTest() + { + var address = ProduceInvalidAddress(); + + Assert.AreEqual("#REF!", address.ToStringRelative()); + Assert.AreEqual("'Sheet 1'!#REF!", address.ToStringRelative(true)); + } + + [Test] + public void AddressOnDeletedWorksheetToStringTest() + { + var address = ProduceAddressOnDeletedWorksheet(); + + Assert.AreEqual("A1", address.ToString()); + Assert.AreEqual("A1", address.ToString(XLReferenceStyle.A1)); + Assert.AreEqual("R1C1", address.ToString(XLReferenceStyle.R1C1)); + Assert.AreEqual("A1", address.ToString(XLReferenceStyle.Default)); + Assert.AreEqual("#REF!A1", address.ToString(XLReferenceStyle.Default, true)); + } + + [Test] + public void AddressOnDeletedWorksheetToStringFixedTest() + { + var address = ProduceAddressOnDeletedWorksheet(); + + Assert.AreEqual("$A$1", address.ToStringFixed()); + Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.A1)); + Assert.AreEqual("R1C1", address.ToStringFixed(XLReferenceStyle.R1C1)); + Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.Default)); + Assert.AreEqual("#REF!$A$1", address.ToStringFixed(XLReferenceStyle.A1, true)); + Assert.AreEqual("#REF!R1C1", address.ToStringFixed(XLReferenceStyle.R1C1, true)); + Assert.AreEqual("#REF!$A$1", address.ToStringFixed(XLReferenceStyle.Default, true)); + } + + [Test] + public void AddressOnDeletedWorksheetToStringRelativeTest() + { + var address = ProduceAddressOnDeletedWorksheet(); + + Assert.AreEqual("A1", address.ToStringRelative()); + Assert.AreEqual("#REF!A1", address.ToStringRelative(true)); + } + + [Test] + public void InvalidAddressOnDeletedWorksheetToStringTest() + { + var address = ProduceInvalidAddressOnDeletedWorksheet(); + + Assert.AreEqual("#REF!", address.ToString()); + Assert.AreEqual("#REF!", address.ToString(XLReferenceStyle.A1)); + Assert.AreEqual("#REF!", address.ToString(XLReferenceStyle.R1C1)); + Assert.AreEqual("#REF!", address.ToString(XLReferenceStyle.Default)); + Assert.AreEqual("#REF!#REF!", address.ToString(XLReferenceStyle.Default, true)); + } + + [Test] + public void InvalidAddressOnDeletedWorksheetToStringFixedTest() + { + var address = ProduceInvalidAddressOnDeletedWorksheet(); + + Assert.AreEqual("#REF!", address.ToStringFixed()); + Assert.AreEqual("#REF!", address.ToStringFixed(XLReferenceStyle.A1)); + Assert.AreEqual("#REF!", address.ToStringFixed(XLReferenceStyle.R1C1)); + Assert.AreEqual("#REF!", address.ToStringFixed(XLReferenceStyle.Default)); + Assert.AreEqual("#REF!#REF!", address.ToStringFixed(XLReferenceStyle.A1, true)); + Assert.AreEqual("#REF!#REF!", address.ToStringFixed(XLReferenceStyle.R1C1, true)); + Assert.AreEqual("#REF!#REF!", address.ToStringFixed(XLReferenceStyle.Default, true)); + } + + [Test] + public void InvalidAddressOnDeletedWorksheetToStringRelativeTest() + { + var address = ProduceInvalidAddressOnDeletedWorksheet(); + + Assert.AreEqual("#REF!", address.ToStringRelative()); + Assert.AreEqual("#REF!#REF!", address.ToStringRelative(true)); + } + + #region Private Methods + + private IXLAddress ProduceInvalidAddress() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet 1"); + var range = ws.Range("A1:B2"); + + ws.Rows(1, 5).Delete(); + return range.RangeAddress.FirstAddress; + } + + private IXLAddress ProduceAddressOnDeletedWorksheet() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet 1"); + var address = ws.Cell("A1").Address; + + ws.Delete(); + return address; + } + + private IXLAddress ProduceInvalidAddressOnDeletedWorksheet() + { + var address = ProduceInvalidAddress(); + address.Worksheet.Delete(); + return address; + } + + #endregion Private Methods + } +} diff --git a/ClosedXML_Tests/Excel/DataValidations/DataValidationShiftTests.cs b/ClosedXML_Tests/Excel/DataValidations/DataValidationShiftTests.cs new file mode 100644 index 0000000..03f452f --- /dev/null +++ b/ClosedXML_Tests/Excel/DataValidations/DataValidationShiftTests.cs @@ -0,0 +1,127 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System.Linq; + +namespace ClosedXML_Tests.Excel.DataValidations +{ + [TestFixture] + public class DataValidationShiftTests + { + [Test] + public void DataValidationShiftedOnColumnInsert() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("DataValidationShift"); + ws.Range("A1:A1").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("A2:B2").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("A3:C3").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("B4:B6").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("C7:D7").SetDataValidation().WholeNumber.Between(0, 1); + ws.Cells("A1:D7").Value = 1; + + ws.Column(2).InsertColumnsAfter(2); + var dv = ws.DataValidations.ToArray(); + + Assert.AreEqual(5, dv.Length); + Assert.AreEqual("A1:A1", dv[0].Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("A2:D2", dv[1].Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("A3:E3", dv[2].Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("B4:D6", dv[3].Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("E7:F7", dv[4].Ranges.Single().RangeAddress.ToString()); + } + } + + [Test] + public void DataValidationShiftedOnRowInsert() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("DataValidationShift"); + ws.Range("A1:A1").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("B1:B2").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("C1:C3").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("D2:F2").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("G4:G5").SetDataValidation().WholeNumber.Between(0, 1); + ws.Cells("A1:G5").Value = 1; + + ws.Row(2).InsertRowsBelow(2); + var dv = ws.DataValidations.ToArray(); + + Assert.AreEqual(5, dv.Length); + Assert.AreEqual("A1:A1", dv[0].Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("B1:B4", dv[1].Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("C1:C5", dv[2].Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("D2:F4", dv[3].Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("G6:G7", dv[4].Ranges.Single().RangeAddress.ToString()); + } + } + + [Test] + public void DataValidationShiftedOnColumnDelete() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("DataValidationShift"); + ws.Range("A1:A1").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("A2:B2").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("A3:C3").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("B4:B6").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("C7:D7").SetDataValidation().WholeNumber.Between(0, 1); + ws.Cells("A1:D7").Value = 1; + + ws.Column(2).Delete(); + var dv = ws.DataValidations.ToArray(); + + Assert.AreEqual(4, dv.Length); + Assert.AreEqual("A1:A1", dv[0].Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("A2:A2", dv[1].Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("A3:B3", dv[2].Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("B7:C7", dv[3].Ranges.Single().RangeAddress.ToString()); + } + } + + [Test] + public void DataValidationShiftedOnRowDelete() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("DataValidationShift"); + ws.Range("A1:A1").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("B1:B2").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("C1:C3").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("D2:F2").SetDataValidation().WholeNumber.Between(0, 1); + ws.Range("G4:G5").SetDataValidation().WholeNumber.Between(0, 1); + ws.Cells("A1:G5").Value = 1; + + ws.Row(2).Delete(); + var dv = ws.DataValidations.ToArray(); + + Assert.AreEqual(4, dv.Length); + Assert.AreEqual("A1:A1", dv[0].Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("B1:B1", dv[1].Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("C1:C2", dv[2].Ranges.Single().RangeAddress.ToString()); + Assert.AreEqual("G3:G4", dv[3].Ranges.Single().RangeAddress.ToString()); + } + } + + [Test] + public void DataValidationShiftedTruncateRange() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("DataValidationShift"); + ws.AsRange().SetDataValidation().WholeNumber.Between(0, 1); + var dv = ws.DataValidations.Single(); + + ws.Row(2).InsertRowsAbove(1); + Assert.IsTrue(dv.Ranges.Single().RangeAddress.IsValid); + Assert.AreEqual($"1:{XLHelper.MaxRowNumber}", dv.Ranges.Single().RangeAddress.ToString()); + + ws.Column(2).InsertColumnsAfter(1); + Assert.IsTrue(dv.Ranges.Single().RangeAddress.IsValid); + Assert.AreEqual($"1:{XLHelper.MaxRowNumber}", dv.Ranges.Single().RangeAddress.ToString()); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/DataValidations/DataValidationTests.cs b/ClosedXML_Tests/Excel/DataValidations/DataValidationTests.cs new file mode 100644 index 0000000..4c82a8d --- /dev/null +++ b/ClosedXML_Tests/Excel/DataValidations/DataValidationTests.cs @@ -0,0 +1,483 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML_Tests.Excel.DataValidations +{ + [TestFixture] + public class DataValidationTests + { + [Test] + public void Validation_1() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Data Validation Issue"); + IXLCell cell = ws.Cell("E1"); + cell.SetValue("Value 1"); + cell = cell.CellBelow(); + cell.SetValue("Value 2"); + cell = cell.CellBelow(); + cell.SetValue("Value 3"); + cell = cell.CellBelow(); + cell.SetValue("Value 4"); + + ws.Cell("A1").SetValue("Cell below has Validation Only."); + cell = ws.Cell("A2"); + cell.DataValidation.List(ws.Range("$E$1:$E$4")); + + ws.Cell("B1").SetValue("Cell below has Validation with a title."); + cell = ws.Cell("B2"); + cell.DataValidation.List(ws.Range("$E$1:$E$4")); + cell.DataValidation.InputTitle = "Title for B2"; + + Assert.AreEqual(XLAllowedValues.List, cell.DataValidation.AllowedValues); + Assert.AreEqual("'Data Validation Issue'!$E$1:$E$4", cell.DataValidation.Value); + Assert.AreEqual("Title for B2", cell.DataValidation.InputTitle); + + ws.Cell("C1").SetValue("Cell below has Validation with a message."); + cell = ws.Cell("C2"); + cell.DataValidation.List(ws.Range("$E$1:$E$4")); + cell.DataValidation.InputMessage = "Message for C2"; + + Assert.AreEqual(XLAllowedValues.List, cell.DataValidation.AllowedValues); + Assert.AreEqual("'Data Validation Issue'!$E$1:$E$4", cell.DataValidation.Value); + Assert.AreEqual("Message for C2", cell.DataValidation.InputMessage); + + ws.Cell("D1").SetValue("Cell below has Validation with title and message."); + cell = ws.Cell("D2"); + cell.DataValidation.List(ws.Range("$E$1:$E$4")); + cell.DataValidation.InputTitle = "Title for D2"; + cell.DataValidation.InputMessage = "Message for D2"; + + Assert.AreEqual(XLAllowedValues.List, cell.DataValidation.AllowedValues); + Assert.AreEqual("'Data Validation Issue'!$E$1:$E$4", cell.DataValidation.Value); + Assert.AreEqual("Title for D2", cell.DataValidation.InputTitle); + Assert.AreEqual("Message for D2", cell.DataValidation.InputMessage); + } + + [Test] + public void Validation_2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell("A1").SetValue("A"); + ws.Cell("B1").SetDataValidation().Custom("Sheet1!A1"); + + IXLWorksheet ws2 = wb.AddWorksheet("Sheet2"); + ws2.Cell("A1").SetValue("B"); + ws.Cell("B1").CopyTo(ws2.Cell("B1")); + + Assert.AreEqual("Sheet1!A1", ws2.Cell("B1").DataValidation.Value); + } + + [Test, Ignore("Wait for proper formula shifting (#686)")] + public void Validation_3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell("A1").SetValue("A"); + ws.Cell("B1").SetDataValidation().Custom("A1"); + ws.FirstRow().InsertRowsAbove(1); + + Assert.AreEqual("A2", ws.Cell("B2").DataValidation.Value); + } + + [Test] + public void Validation_4() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell("A1").SetValue("A"); + ws.Cell("B1").SetDataValidation().Custom("A1"); + ws.Cell("B1").CopyTo(ws.Cell("B2")); + Assert.AreEqual("A2", ws.Cell("B2").DataValidation.Value); + } + + [Test, Ignore("Wait for proper formula shifting (#686)")] + public void Validation_5() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell("A1").SetValue("A"); + ws.Cell("B1").SetDataValidation().Custom("A1"); + ws.FirstColumn().InsertColumnsBefore(1); + + Assert.AreEqual("B1", ws.Cell("C1").DataValidation.Value); + } + + [Test] + public void Validation_6() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell("A1").SetValue("A"); + ws.Cell("B1").SetDataValidation().Custom("A1"); + ws.Cell("B1").CopyTo(ws.Cell("C1")); + Assert.AreEqual("B1", ws.Cell("C1").DataValidation.Value); + } + + [Test] + public void Validation_persists_on_Cell_DataValidation() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("People"); + + ws.FirstCell().SetValue("Categories") + .CellBelow().SetValue("A") + .CellBelow().SetValue("B"); + + IXLTable table = ws.RangeUsed().CreateTable(); + + IXLDataValidation dv = table.DataRange.SetDataValidation(); + dv.ErrorTitle = "Error"; + + Assert.AreEqual("Error", table.DataRange.FirstCell().DataValidation.ErrorTitle); + } + + [Test] + public void Validation_persists_on_Worksheet_DataValidations() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("People"); + + ws.FirstCell().SetValue("Categories") + .CellBelow().SetValue("A"); + + IXLTable table = ws.RangeUsed().CreateTable(); + + IXLDataValidation dv = table.DataRange.SetDataValidation(); + dv.ErrorTitle = "Error"; + + Assert.AreEqual("Error", ws.DataValidations.Single().ErrorTitle); + } + + [Test] + [TestCase("A1:C3", 5, false, "A1:C3")] + [TestCase("A1:C3", 2, false, "A1:C4")] + [TestCase("A1:C3", 1, false, "A2:C4")] + [TestCase("A1:C3", 5, true, "A1:C3")] + [TestCase("A1:C3", 2, true, "A1:C4")] + [TestCase("A1:C3", 1, true, "A2:C4")] + public void DataValidationShiftedOnRowInsert(string initialAddress, int rowNum, bool setValue, string expectedAddress) + { + //Arrange + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("DataValidation"); + var validation = ws.Range(initialAddress).SetDataValidation(); + validation.WholeNumber.Between(0, 100); + if (setValue) + ws.Range(initialAddress).Value = 50; + + //Act + ws.Row(rowNum).InsertRowsAbove(1); + + //Assert + Assert.AreEqual(1, ws.DataValidations.Count()); + Assert.AreEqual(1, ws.DataValidations.First().Ranges.Count()); + Assert.AreEqual(expectedAddress, ws.DataValidations.First().Ranges.First().RangeAddress.ToString()); + } + + [Test] + [TestCase("A1:C3", 5, false, "A1:C3")] + [TestCase("A1:C3", 2, false, "A1:D3")] + [TestCase("A1:C3", 1, false, "B1:D3")] + [TestCase("A1:C3", 5, true, "A1:C3")] + [TestCase("A1:C3", 2, true, "A1:D3")] + [TestCase("A1:C3", 1, true, "B1:D3")] + public void DataValidationShiftedOnColumnInsert(string initialAddress, int columnNum, bool setValue, string expectedAddress) + { + //Arrange + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("DataValidation"); + var validation = ws.Range(initialAddress).SetDataValidation(); + validation.WholeNumber.Between(0, 100); + if (setValue) + ws.Range(initialAddress).Value = 50; + + //Act + ws.Column(columnNum).InsertColumnsBefore(1); + + //Assert + Assert.AreEqual(1, ws.DataValidations.Count()); + Assert.AreEqual(1, ws.DataValidations.First().Ranges.Count()); + Assert.AreEqual(expectedAddress, ws.DataValidations.First().Ranges.First().RangeAddress.ToString()); + } + + [Test] + public void DataValidationClearSplitsRange() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("DataValidation"); + var validation = ws.Range("A1:C3").SetDataValidation(); + validation.WholeNumber.Between(0, 100); + + //Act + ws.Cell("B2").Clear(XLClearOptions.DataValidation); + + //Assert + Assert.IsFalse(ws.Cell("B2").HasDataValidation); + Assert.IsTrue(ws.Range("A1:C3").Cells().Where(c => c.Address.ToString() != "B2").All(c => c.HasDataValidation)); + } + } + + [Test] + public void NewDataValidationSplitsRange() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("DataValidation"); + var validation = ws.Range("A1:C3").SetDataValidation(); + validation.WholeNumber.Between(10, 100); + + //Act + ws.Cell("B2").NewDataValidation.WholeNumber.Between(-100, -0); + + //Assert + Assert.AreEqual("-100", ws.Cell("B2").DataValidation.MinValue); + Assert.IsTrue(ws.Range("A1:C3").Cells().Where(c => c.Address.ToString() != "B2").All(c => c.HasDataValidation)); + Assert.IsTrue(ws.Range("A1:C3").Cells().Where(c => c.Address.ToString() != "B2") + .All(c => c.DataValidation.MinValue == "10")); + } + } + + [Test] + public void ListLengthOverflow() + { + var values = string.Join(",", Enumerable.Range(1, 20) + .Select(i => Guid.NewGuid().ToString("N"))); + + Assert.True(values.Length > 255); + + using (var wb = new XLWorkbook()) + { + var dv = wb.AddWorksheet("Sheet 1").Cell(1, 1).DataValidation; + + Assert.Throws(() => dv.List(values)); + Assert.Throws(() => + { + dv.TextLength.Between(0, 5); + dv.MinValue = values; + }); + + Assert.Throws(() => + { + dv.TextLength.Between(0, 5); + dv.MaxValue = values; + }); + } + } + + [Test] + public void CannotCreateDataValidationWithoutRange() + { + Assert.Throws(() => new XLDataValidation(null)); + } + + [Test] + public void DataValidationHasWorksheetAndRangesWhenCreated() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var range = ws.Range("A1:A3"); + + var dv = new XLDataValidation(range); + + Assert.AreSame(ws, dv.Worksheet); + Assert.AreSame(range, dv.Ranges.Single()); + } + } + + [Test] + public void CanAddRangeFromSameWorksheet() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var range1 = ws.Range("A1:A3"); + var range2 = ws.Range("C1:C3"); + var ranges3 = ws.Ranges("D1:D3,F1:F3"); + var dv = new XLDataValidation(range1); + + dv.AddRange(range2); + dv.AddRanges(ranges3); + + Assert.IsTrue(dv.Ranges.Any(r => r == range1)); + Assert.IsTrue(dv.Ranges.Any(r => r == range2)); + Assert.IsTrue(dv.Ranges.Any(r => r == ranges3.First())); + Assert.IsTrue(dv.Ranges.Any(r => r == ranges3.Last())); + } + } + + [Test] + public void CanAddRangeFromAnotherWorksheet() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.AddWorksheet(); + var ws2 = wb.AddWorksheet(); + var range1 = ws1.Range("A1:A3"); + var range2 = ws2.Range("C1:C3"); + var dv = new XLDataValidation(range1); + + dv.AddRange(range2); + + Assert.IsTrue(dv.Ranges.Any(r => r != range2 && r.RangeAddress.ToString() == range2.RangeAddress.ToString())); + } + } + + [Test] + public void CanClearRanges() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var range1 = ws.Range("A1:A3"); + var range2 = ws.Range("C1:C3"); + var ranges3 = ws.Ranges("D1:D3,F1:F3"); + var dv = new XLDataValidation(range1); + dv.AddRange(range2); + dv.AddRanges(ranges3); + + dv.ClearRanges(); + + Assert.IsEmpty(dv.Ranges); + } + } + + [Test] + public void CanRemoveExistingRange() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var range1 = ws.Range("A1:A3"); + var range2 = ws.Range("C1:C3"); + + var dv = new XLDataValidation(range1); + dv.AddRange(range2); + + dv.RemoveRange(range1); + + Assert.AreSame(range2, dv.Ranges.Single()); + } + } + + [Test] + public void RemovingExistingRangeDoesNoFail() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var range1 = ws.Range("A1:A3"); + var range2 = ws.Range("C1:C3"); + + var dv = new XLDataValidation(range1); + + dv.RemoveRange(range2); + dv.RemoveRange(null); + + Assert.AreSame(range1, dv.Ranges.Single()); + } + } + + [Test] + public void AddRangeFiresEvent() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var range1 = ws.Range("A1:A3"); + var range2 = ws.Range("C1:C3"); + var dv = new XLDataValidation(range1); + + IXLRange addedRange = null; + + dv.RangeAdded += (s, e) => addedRange = e.Range; + + dv.AddRange(range2); + + Assert.AreSame(range2, addedRange); + } + } + + [Test] + public void AddRangesFiresMultipleEvents() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var range1 = ws.Range("A1:A3"); + var ranges = ws.Ranges("D1:D3,F1:F3"); + var dv = new XLDataValidation(range1); + + var addedRanges = new List(); + + dv.RangeAdded += (s, e) => addedRanges.Add(e.Range); + + dv.AddRanges(ranges); + + Assert.AreEqual(2, addedRanges.Count); + } + } + + [Test] + public void RemoveRangeFiresEvent() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var range1 = ws.Range("A1:A3"); + var range2 = ws.Range("C1:C3"); + var dv = new XLDataValidation(range1); + dv.AddRange(range2); + IXLRange removedRange = null; + dv.RangeRemoved += (s, e) => removedRange = e.Range; + + dv.RemoveRange(range2); + + Assert.AreSame(range2, removedRange); + } + } + + [Test] + public void RemoveNonExistingRangeDoesNotFireEvent() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var range1 = ws.Range("A1:A3"); + var range2 = ws.Range("C1:C3"); + var dv = new XLDataValidation(range1); + + dv.RangeRemoved += (s, e) => Assert.Fail("Expected not to fire event"); + + dv.RemoveRange(range2); + } + } + + [Test] + public void ClearRangesFiresMultipleEvents() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var range1 = ws.Range("A1:A3"); + var range2 = ws.Range("C1:C3"); + var dv = new XLDataValidation(range1); + dv.AddRange(range2); + + var removedRanges = new List(); + + dv.RangeRemoved += (s, e) => removedRanges.Add(e.Range); + + dv.ClearRanges(); + + Assert.AreEqual(2, removedRanges.Count); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/DataValidations/XLDataValidationsTests.cs b/ClosedXML_Tests/Excel/DataValidations/XLDataValidationsTests.cs new file mode 100644 index 0000000..70757b0 --- /dev/null +++ b/ClosedXML_Tests/Excel/DataValidations/XLDataValidationsTests.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.DataValidations +{ + public class XLDataValidationsTests + { + [Test] + public void CannotCreateWithoutWorksheet() + { + Assert.Throws(() => new XLDataValidations(null)); + } + + [Test] + public void AddedRangesAreTransferredToTargetSheet() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.AddWorksheet(); + var ws2 = wb.AddWorksheet(); + + var dv1 = ws1.Range("A1:A3").SetDataValidation(); + dv1.MinValue = "100"; + + var dv2 = ws2.DataValidations.Add(dv1); + + Assert.AreEqual(1, ws1.DataValidations.Count()); + Assert.AreEqual(1, ws2.DataValidations.Count()); + + Assert.AreNotSame(dv1, dv2); + + Assert.AreSame(ws1, dv1.Ranges.Single().Worksheet); + Assert.AreSame(ws2, dv2.Ranges.Single().Worksheet); + } + } + + [TestCase("A1:A1", true)] + [TestCase("A1:A3", true)] + [TestCase("A1:A4", false)] + [TestCase("C2:C2", true)] + [TestCase("C1:C3", true)] + [TestCase("A1:C3", false)] + public void CanFindDataValidationForRange(string searchAddress, bool expectedResult) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var dv = ws.Range("A1:A3").SetDataValidation(); + dv.MinValue = "100"; + dv.AddRange(ws.Range("C1:C3")); + + var address = new XLRangeAddress(ws as XLWorksheet, searchAddress); + + var actualResult = ws.DataValidations.TryGet(address, out var foundDv); + Assert.AreEqual(expectedResult, actualResult); + if (expectedResult) + Assert.AreSame(dv, foundDv); + else + Assert.IsNull(foundDv); + } + } + + + [TestCase("A1:A1", 1)] + [TestCase("A1:A3", 1)] + [TestCase("B1:B4", 0)] + [TestCase("A1:C3", 1)] + [TestCase("C2:C3", 1)] + [TestCase("C2:G6", 2)] + [TestCase("E2:E3", 0)] + public void CanGetAllDataValidationsForRange(string searchAddress, int expectedCount) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var dv1 = ws.Range("A1:A3").SetDataValidation(); + dv1.MinValue = "100"; + dv1.AddRange(ws.Range("C1:C3")); + + var dv2 = ws.Range("E4:G6").SetDataValidation(); + dv2.MinValue = "200"; + + var address = new XLRangeAddress(ws as XLWorksheet, searchAddress); + + var actualResult = ws.DataValidations.GetAllInRange(address); + + Assert.AreEqual(expectedCount, actualResult.Count()); + } + } + + [Test] + public void AddDataValidationSplitsExistingRanges() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var dv1 = ws.Ranges("B2:G7,C11:C13").SetDataValidation(); + dv1.MinValue = "100"; + + var dv2 = ws.Range("E4:G6").SetDataValidation(); + dv2.MinValue = "100"; + + Assert.AreEqual(4, dv1.Ranges.Count()); + Assert.AreEqual("B2:G3,B4:D6,B7:G7,C11:C13", + string.Join(",", dv1.Ranges.Select(r => r.RangeAddress.ToString()))); + } + } + + [Test] + public void RemovedRangeExcludedFromIndex() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var dv = ws.Range("A1:A3").SetDataValidation(); + dv.MinValue = "100"; + var range = ws.Range("C1:C3"); + dv.AddRange(range); + + dv.RemoveRange(range); + + var actualResult = ws.DataValidations.TryGet(range.RangeAddress, out var foundDv); + Assert.IsFalse(actualResult); + Assert.IsNull(foundDv); + } + } + + [Test] + public void ConsolidatedDataValidationsAreUnsubscribed() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var dv1 = ws.Range("A1:A3").SetDataValidation(); + dv1.MinValue = "100"; + var dv2 = ws.Range("B1:B3").SetDataValidation(); + dv2.MinValue = "100"; + + (ws.DataValidations as XLDataValidations).Consolidate(); + dv1.AddRange(ws.Range("C1:C3")); + dv2.AddRange(ws.Range("D1:D3")); + + var consolidatedDv = ws.DataValidations.Single(); + Assert.AreSame(dv1, consolidatedDv); + Assert.True(ws.Cell("C1").HasDataValidation); + Assert.False(ws.Cell("D1").HasDataValidation); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Globalization/GlobalizationTests.cs b/ClosedXML_Tests/Excel/Globalization/GlobalizationTests.cs new file mode 100644 index 0000000..5cbf5a5 --- /dev/null +++ b/ClosedXML_Tests/Excel/Globalization/GlobalizationTests.cs @@ -0,0 +1,46 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System.IO; +using System.Threading; + +namespace ClosedXML_Tests.Excel.Globalization +{ + [TestFixture] + public class GlobalizationTests + { + [Test] + [TestCase("A1*10", 1230d)] + [TestCase("A1/10", 12.3)] + [TestCase("A1&\" cells\"", "123 cells")] + [TestCase("A1&\"000\"", "123000")] + [TestCase("ISNUMBER(A1)", true)] + [TestCase("ISBLANK(A1)", false)] + [TestCase("DATE(2018,1,28)", 43128d)] + public void LoadFormulaCachedValue(string formula, object expectedValue) + { + Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("ru-RU"); + + using (var ms = new MemoryStream()) + { + using (XLWorkbook book1 = new XLWorkbook()) + { + var sheet = book1.AddWorksheet("sheet1"); + sheet.Cell("A1").Value = 123; + sheet.Cell("A2").FormulaA1 = formula; + var options = new SaveOptions { EvaluateFormulasBeforeSaving = true }; + + book1.SaveAs(ms, options); + } + ms.Position = 0; + + using (XLWorkbook book2 = new XLWorkbook(ms)) + { + var ws = book2.Worksheet(1); + var storedValueA2 = ws.Cell("A2").CachedValue; + Assert.IsFalse(ws.Cell("A2").NeedsRecalculation); + Assert.AreEqual(expectedValue, storedValueA2); + } + } + } + } +} diff --git a/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs b/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs new file mode 100644 index 0000000..cf56d83 --- /dev/null +++ b/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs @@ -0,0 +1,471 @@ +using ClosedXML.Excel; +using ClosedXML.Excel.Drawings; +using NUnit.Framework; +using System; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class PictureTests + { + [Test] + public void CanAddPictureFromBitmap() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + using (var resourceStream = Assembly.GetAssembly(typeof(ClosedXML_Examples.BasicTable)).GetManifestResourceStream("ClosedXML_Examples.Resources.SampleImage.jpg")) + using (var bitmap = Bitmap.FromStream(resourceStream) as Bitmap) + { + var picture = ws.AddPicture(bitmap, "MyPicture") + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(50, 50) + .WithSize(200, 200); + + Assert.AreEqual(XLPictureFormat.Jpeg, picture.Format); + Assert.AreEqual(200, picture.Width); + Assert.AreEqual(200, picture.Height); + } + } + } + + [Test] + public void CanAddPictureFromStream() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + using (var resourceStream = Assembly.GetAssembly(typeof(ClosedXML_Examples.BasicTable)).GetManifestResourceStream("ClosedXML_Examples.Resources.SampleImage.jpg")) + { + var picture = ws.AddPicture(resourceStream, "MyPicture") + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(50, 50) + .WithSize(200, 200); + + Assert.AreEqual(XLPictureFormat.Jpeg, picture.Format); + Assert.AreEqual(200, picture.Width); + Assert.AreEqual(200, picture.Height); + } + } + } + + [Test] + public void CanAddPictureFromFile() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + var path = Path.ChangeExtension(Path.GetTempFileName(), "jpg"); + + try + { + using (var resourceStream = Assembly.GetAssembly(typeof(ClosedXML_Examples.BasicTable)).GetManifestResourceStream("ClosedXML_Examples.Resources.SampleImage.jpg")) + using (var fileStream = File.Create(path)) + { + resourceStream.Seek(0, SeekOrigin.Begin); + resourceStream.CopyTo(fileStream); + fileStream.Close(); + } + + var picture = ws.AddPicture(path) + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(50, 50); + + Assert.AreEqual(XLPictureFormat.Jpeg, picture.Format); + Assert.AreEqual(400, picture.Width); + Assert.AreEqual(400, picture.Height); + } + finally + { + if (File.Exists(path)) + File.Delete(path); + } + } + } + + [Test] + public void CanAddPictureConcurrentlyFromFile() + { + var path = Path.ChangeExtension(Path.GetTempFileName(), "jpg"); + + try + { + using (var resourceStream = Assembly.GetAssembly(typeof(ClosedXML_Examples.BasicTable)).GetManifestResourceStream("ClosedXML_Examples.Resources.SampleImage.jpg")) + using (var fileStream = File.Create(path)) + { + resourceStream.Seek(0, SeekOrigin.Begin); + resourceStream.CopyTo(fileStream); + fileStream.Close(); + } + + Parallel.Invoke(() => verifyAddImageFromFile(path), () => verifyAddImageFromFile(path)); + } + finally + { + if (File.Exists(path)) + { + File.Delete(path); + } + } + } + + private void verifyAddImageFromFile(string filePath) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + var picture = ws.AddPicture(filePath) + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(50, 50); + + Assert.AreEqual(XLPictureFormat.Jpeg, picture.Format); + Assert.AreEqual(400, picture.Width); + Assert.AreEqual(50, picture.Top); + } + } + + + [Test] + public void CanScaleImage() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + using (var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Tests.Resource.Images.ImageHandling.png")) + { + var pic = ws.AddPicture(resourceStream, "MyPicture") + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(50, 50); + + Assert.AreEqual(252, pic.OriginalWidth); + Assert.AreEqual(152, pic.OriginalHeight); + Assert.AreEqual(252, pic.Width); + Assert.AreEqual(152, pic.Height); + + pic.ScaleHeight(0.7); + pic.ScaleWidth(1.2); + + Assert.AreEqual(252, pic.OriginalWidth); + Assert.AreEqual(152, pic.OriginalHeight); + Assert.AreEqual(302, pic.Width); + Assert.AreEqual(106, pic.Height); + + pic.ScaleHeight(0.7); + pic.ScaleWidth(1.2); + + Assert.AreEqual(252, pic.OriginalWidth); + Assert.AreEqual(152, pic.OriginalHeight); + Assert.AreEqual(362, pic.Width); + Assert.AreEqual(74, pic.Height); + + pic.ScaleHeight(0.8, true); + pic.ScaleWidth(1.1, true); + + Assert.AreEqual(252, pic.OriginalWidth); + Assert.AreEqual(152, pic.OriginalHeight); + Assert.AreEqual(277, pic.Width); + Assert.AreEqual(122, pic.Height); + } + } + } + + [Test] + public void TestDefaultPictureNames() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Tests.Resource.Images.ImageHandling.png")) + { + ws.AddPicture(stream, XLPictureFormat.Png); + stream.Position = 0; + + ws.AddPicture(stream, XLPictureFormat.Png); + stream.Position = 0; + + ws.AddPicture(stream, XLPictureFormat.Png).Name = "Picture 4"; + stream.Position = 0; + + ws.AddPicture(stream, XLPictureFormat.Png); + stream.Position = 0; + } + + Assert.AreEqual("Picture 1", ws.Pictures.Skip(0).First().Name); + Assert.AreEqual("Picture 2", ws.Pictures.Skip(1).First().Name); + Assert.AreEqual("Picture 4", ws.Pictures.Skip(2).First().Name); + Assert.AreEqual("Picture 5", ws.Pictures.Skip(3).First().Name); + } + } + + [Test] + public void TestDefaultIds() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Tests.Resource.Images.ImageHandling.png")) + { + ws.AddPicture(stream, XLPictureFormat.Png); + stream.Position = 0; + + ws.AddPicture(stream, XLPictureFormat.Png); + stream.Position = 0; + + ws.AddPicture(stream, XLPictureFormat.Png).Name = "Picture 4"; + stream.Position = 0; + + ws.AddPicture(stream, XLPictureFormat.Png); + stream.Position = 0; + } + + Assert.AreEqual(1, ws.Pictures.Skip(0).First().Id); + Assert.AreEqual(2, ws.Pictures.Skip(1).First().Id); + Assert.AreEqual(3, ws.Pictures.Skip(2).First().Id); + Assert.AreEqual(4, ws.Pictures.Skip(3).First().Id); + } + } + + [Test] + public void XLMarkerTests() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + XLMarker firstMarker = new XLMarker(ws.Cell(1, 10), new Point(100, 0)); + + Assert.AreEqual(10, firstMarker.ColumnNumber); + Assert.AreEqual(1, firstMarker.RowNumber); + Assert.AreEqual(100, firstMarker.Offset.X); + Assert.AreEqual(0, firstMarker.Offset.Y); + } + + [Test] + public void XLPictureTests() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + + using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Tests.Resource.Images.ImageHandling.png")) + { + var pic = ws.AddPicture(stream, XLPictureFormat.Png, "Image1") + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(220, 155); + + Assert.AreEqual(XLPicturePlacement.FreeFloating, pic.Placement); + Assert.AreEqual("Image1", pic.Name); + Assert.AreEqual(XLPictureFormat.Png, pic.Format); + Assert.AreEqual(252, pic.OriginalWidth); + Assert.AreEqual(152, pic.OriginalHeight); + Assert.AreEqual(252, pic.Width); + Assert.AreEqual(152, pic.Height); + Assert.AreEqual(220, pic.Left); + Assert.AreEqual(155, pic.Top); + } + } + } + + [Test] + public void CanLoadFileWithImagesAndCopyImagesToNewSheet() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageAnchors.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual(2, ws.Pictures.Count); + + var copy = ws.CopyTo("NewSheet"); + Assert.AreEqual(2, copy.Pictures.Count); + } + } + + [Test] + public void CanDeletePictures() + { + using (var ms = new MemoryStream()) + { + int originalCount; + + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageAnchors.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + originalCount = ws.Pictures.Count; + ws.Pictures.Delete(ws.Pictures.First()); + + var pictureName = ws.Pictures.First().Name; + ws.Pictures.Delete(pictureName); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual(originalCount - 2, ws.Pictures.Count); + } + } + } + + [Test] + public void PictureRenameTests() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageAnchors.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet("Images3"); + var picture = ws.Pictures.First(); + Assert.AreEqual("Picture 1", picture.Name); + + picture.Name = "picture 1"; + picture.Name = "pICture 1"; + picture.Name = "Picture 1"; + + picture = ws.Pictures.Last(); + picture.Name = "new name"; + + Assert.Throws(() => picture.Name = "Picture 1"); + Assert.Throws(() => picture.Name = "picTURE 1"); + } + } + + [Test] + public void HandleDuplicatePictureIdsAcrossWorksheets() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.AddWorksheet("Sheet1"); + var ws2 = wb.AddWorksheet("Sheet2"); + + using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Tests.Resource.Images.ImageHandling.png")) + { + (ws1 as XLWorksheet).AddPicture(stream, "Picture 1", 2); + (ws1 as XLWorksheet).AddPicture(stream, "Picture 2", 3); + + //Internal method - used for loading files + var pic = (ws2 as XLWorksheet).AddPicture(stream, "Picture 1", 2) + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(220, 155) as XLPicture; + + var id = pic.Id; + + pic.Id = id; + Assert.AreEqual(id, pic.Id); + + pic.Id = 3; + Assert.AreEqual(3, pic.Id); + + pic.Id = id; + + var pic2 = (ws2 as XLWorksheet).AddPicture(stream, "Picture 2", 3) + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(440, 300) as XLPicture; + } + } + } + + [Test] + public void CopyImageSameWorksheet() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + + IXLPicture original; + using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Tests.Resource.Images.ImageHandling.png")) + { + original = (ws1 as XLWorksheet).AddPicture(stream, "Picture 1", 2) + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(220, 155) as XLPicture; + } + + var copy = original.Duplicate() + .MoveTo(300, 200) as XLPicture; + + Assert.AreEqual(2, ws1.Pictures.Count()); + Assert.AreEqual(ws1, copy.Worksheet); + Assert.AreEqual(original.Format, copy.Format); + Assert.AreEqual(original.Height, copy.Height); + Assert.AreEqual(original.Placement, copy.Placement); + Assert.AreEqual(original.TopLeftCell.ToString(), copy.TopLeftCell.ToString()); + Assert.AreEqual(original.Width, copy.Width); + Assert.AreEqual(original.ImageStream.ToArray(), copy.ImageStream.ToArray(), "Image streams differ"); + + Assert.AreEqual(200, copy.Top); + Assert.AreEqual(300, copy.Left); + Assert.AreNotEqual(original.Id, copy.Id); + Assert.AreNotEqual(original.Name, copy.Name); + } + + [Test] + public void CopyImageDifferentWorksheets() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + IXLPicture original; + using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Tests.Resource.Images.ImageHandling.png")) + { + original = (ws1 as XLWorksheet).AddPicture(stream, "Picture 1", 2) + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(220, 155) as XLPicture; + } + var ws2 = wb.Worksheets.Add("Sheet2"); + + var copy = original.CopyTo(ws2); + + Assert.AreEqual(1, ws1.Pictures.Count()); + Assert.AreEqual(1, ws2.Pictures.Count()); + + Assert.AreEqual(ws2, copy.Worksheet); + + Assert.AreEqual(original.Format, copy.Format); + Assert.AreEqual(original.Height, copy.Height); + Assert.AreEqual(original.Left, copy.Left); + Assert.AreEqual(original.Name, copy.Name); + Assert.AreEqual(original.Placement, copy.Placement); + Assert.AreEqual(original.Top, copy.Top); + Assert.AreEqual(original.TopLeftCell.ToString(), copy.TopLeftCell.ToString()); + Assert.AreEqual(original.Width, copy.Width); + Assert.AreEqual(original.ImageStream.ToArray(), copy.ImageStream.ToArray(), "Image streams differ"); + + Assert.AreNotEqual(original.Id, copy.Id); + } + + [Test] + public void PictureShiftsWhenInsertingRows() + { + using (var wb = new XLWorkbook()) + using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Tests.Resource.Images.ImageHandling.png")) + { + var ws = wb.Worksheets.Add("ImageShift"); + var picture = ws.AddPicture(stream, XLPictureFormat.Png, "PngImage") + .MoveTo(ws.Cell(5, 2)) + .WithPlacement(XLPicturePlacement.Move); + + ws.Row(2).InsertRowsBelow(20); + + Assert.AreEqual(25, picture.TopLeftCell.Address.RowNumber); + } + } + + [Test] + public void PictureNotFound() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + Assert.Throws(() => ws.Picture("dummy")); + Assert.Throws(() => ws.Pictures.Delete("dummy")); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Loading/LoadingTests.cs b/ClosedXML_Tests/Excel/Loading/LoadingTests.cs new file mode 100644 index 0000000..21e4e58 --- /dev/null +++ b/ClosedXML_Tests/Excel/Loading/LoadingTests.cs @@ -0,0 +1,546 @@ +using ClosedXML.Excel; +using ClosedXML.Excel.Drawings; +using ClosedXML_Tests.Utils; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.Excel +{ + // Tests in this fixture test only the successful loading of existing Excel files, + // i.e. we test that ClosedXML doesn't choke on a given input file + // These tests DO NOT test that ClosedXML successfully recognises all the Excel parts or that it can successfully save those parts again. + [TestFixture] + public class LoadingTests + { + private static IEnumerable TryToLoad => + TestHelper.ListResourceFiles(s => + s.Contains(".TryToLoad.") && + !s.Contains(".LO.")); + + [TestCaseSource(nameof(TryToLoad))] + public void CanSuccessfullyLoadFiles(string file) + { + TestHelper.LoadFile(file); + } + + [TestCaseSource(nameof(LOFiles))] + public void CanSuccessfullyLoadLOFiles(string file) + { + TestHelper.LoadFile(file); + } + + private static IEnumerable LOFiles + { + get + { + // TODO: unpark all files + var parkedForLater = new[] + { + "TryToLoad.LO.xlsx.formats.xlsx", + "TryToLoad.LO.xlsx.pivot_table.shared-group-field.xlsx", + "TryToLoad.LO.xlsx.pivot_table.shared-nested-dategroup.xlsx", + "TryToLoad.LO.xlsx.pivottable_bool_field_filter.xlsx", + "TryToLoad.LO.xlsx.pivottable_date_field_filter.xlsx", + "TryToLoad.LO.xlsx.pivottable_double_field_filter.xlsx", + "TryToLoad.LO.xlsx.pivottable_duplicated_member_filter.xlsx", + "TryToLoad.LO.xlsx.pivottable_rowcolpage_field_filter.xlsx", + "TryToLoad.LO.xlsx.pivottable_string_field_filter.xlsx", + "TryToLoad.LO.xlsx.pivottable_tabular_mode.xlsx", + "TryToLoad.LO.xlsx.pivot_table_first_header_row.xlsx", + "TryToLoad.LO.xlsx.tdf100709.xlsx", + "TryToLoad.LO.xlsx.tdf89139_pivot_table.xlsx", + "TryToLoad.LO.xlsx.universal-content-strict.xlsx", + "TryToLoad.LO.xlsx.universal-content.xlsx", + "TryToLoad.LO.xlsx.xf_default_values.xlsx", + "TryToLoad.LO.xlsm.pass.CVE-2016-0122-1.xlsm", + "TryToLoad.LO.xlsm.tdf111974.xlsm", + "TryToLoad.LO.xlsm.vba-user-function.xlsm", + }; + + return TestHelper.ListResourceFiles(s => s.Contains(".LO.") && !parkedForLater.Any(i => s.Contains(i))); + } + } + + [Test] + public void CanLoadAndManipulateFileWithEmptyTable() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\EmptyTable.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + var table = ws.Tables.First(); + table.DataRange.InsertRowsBelow(5); + } + } + + [Test] + public void CanLoadDate1904SystemCorrectly() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\Date1904System.xlsx"))) + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + var c = ws.Cell("A2"); + Assert.AreEqual(XLDataType.DateTime, c.DataType); + Assert.AreEqual(new DateTime(2017, 10, 27, 21, 0, 0), c.GetDateTime()); + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + var c = ws.Cell("A2"); + Assert.AreEqual(XLDataType.DateTime, c.DataType); + Assert.AreEqual(new DateTime(2017, 10, 27, 21, 0, 0), c.GetDateTime()); + wb.SaveAs(ms); + } + } + } + + [Test] + public void CanLoadAndSaveFileWithMismatchingSheetIdAndRelId() + { + // This file's workbook.xml contains: + // + // and the mismatch between the sheetId and r:id can create problems. + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\FileWithMismatchSheetIdAndRelId.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms, true); + } + } + } + + [Test] + public void CanLoadBasicPivotTable() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\LoadPivotTables.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet("PivotTable1"); + var pt = ws.PivotTable("PivotTable1"); + Assert.AreEqual("PivotTable1", pt.Name); + + Assert.AreEqual(1, pt.RowLabels.Count()); + Assert.AreEqual("Name", pt.RowLabels.Single().SourceName); + + Assert.AreEqual(1, pt.ColumnLabels.Count()); + Assert.AreEqual("Month", pt.ColumnLabels.Single().SourceName); + + var pv = pt.Values.Single(); + Assert.AreEqual("Sum of NumberOfOrders", pv.CustomName); + Assert.AreEqual("NumberOfOrders", pv.SourceName); + } + } + + [Test] + public void CanLoadOrderedPivotTable() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\LoadPivotTables.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet("OrderedPivotTable"); + var pt = ws.PivotTable("OrderedPivotTable"); + + Assert.AreEqual(XLPivotSortType.Ascending, pt.RowLabels.Single().SortType); + Assert.AreEqual(XLPivotSortType.Descending, pt.ColumnLabels.Single().SortType); + } + } + + [Test] + public void CanLoadPivotTableSubtotals() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\LoadPivotTables.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet("PivotTableSubtotals"); + var pt = ws.PivotTable("PivotTableSubtotals"); + + var subtotals = pt.RowLabels.Get("Group").Subtotals.ToArray(); + Assert.AreEqual(3, subtotals.Length); + Assert.AreEqual(XLSubtotalFunction.Average, subtotals[0]); + Assert.AreEqual(XLSubtotalFunction.Count, subtotals[1]); + Assert.AreEqual(XLSubtotalFunction.Sum, subtotals[2]); + } + } + + /// + /// For non-English locales, the default style ("Normal" in English) can be + /// another piece of text (e.g. ??????? in Russian). + /// This test ensures that the default style is correctly detected and + /// no style conflicts occur on save. + /// + [Test] + public void CanSaveFileWithDefaultStyleNameNotInEnglish() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\FileWithDefaultStyleNameNotInEnglish.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms, true); + } + } + } + + /// + /// As per https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.cellvalues(v=office.15).aspx + /// the 'Date' DataType is available only in files saved with Microsoft Office + /// In other files, the data type will be saved as numeric + /// ClosedXML then deduces the data type by inspecting the number format string + /// + [Test] + public void CanLoadLibreOfficeFileWithDates() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\LibreOfficeFileWithDates.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + foreach (var cell in ws.CellsUsed()) + { + Assert.AreEqual(XLDataType.DateTime, cell.DataType); + } + } + } + + [Test] + public void CanLoadFileWithImagesWithCorrectAnchorTypes() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageAnchors.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual(2, ws.Pictures.Count); + Assert.AreEqual(XLPicturePlacement.FreeFloating, ws.Pictures.First().Placement); + Assert.AreEqual(XLPicturePlacement.Move, ws.Pictures.Skip(1).First().Placement); + + var ws2 = wb.Worksheets.Skip(1).First(); + Assert.AreEqual(1, ws2.Pictures.Count); + Assert.AreEqual(XLPicturePlacement.MoveAndSize, ws2.Pictures.First().Placement); + } + } + + [Test] + public void CanLoadFileWithImagesWithCorrectImageType() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageFormats.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual(1, ws.Pictures.Count); + Assert.AreEqual(XLPictureFormat.Jpeg, ws.Pictures.First().Format); + + var ws2 = wb.Worksheets.Skip(1).First(); + Assert.AreEqual(1, ws2.Pictures.Count); + Assert.AreEqual(XLPictureFormat.Png, ws2.Pictures.First().Format); + } + } + + [Test] + public void CanLoadAndDeduceAnchorsFromExcelGeneratedFile() + { + // This file was produced by Excel. It contains 3 images, but the latter 2 were copied from the first. + // There is actually only 1 embedded image if you inspect the file's internals. + // Additionally, Excel saves all image anchors as TwoCellAnchor, but uses the EditAs attribute to distinguish the types + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\ExcelProducedWorkbookWithImages.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual(3, ws.Pictures.Count); + + Assert.AreEqual(XLPicturePlacement.MoveAndSize, ws.Picture("Picture 1").Placement); + Assert.AreEqual(XLPicturePlacement.Move, ws.Picture("Picture 2").Placement); + Assert.AreEqual(XLPicturePlacement.FreeFloating, ws.Picture("Picture 3").Placement); + + using (var ms = new MemoryStream()) + wb.SaveAs(ms, true); + } + } + + [Test] + public void CanLoadFromTemplate() + { + using (var tf1 = new TemporaryFile()) + using (var tf2 = new TemporaryFile()) + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\AllShapes.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + // Save as temporary file + wb.SaveAs(tf1.Path); + } + + var workbook = XLWorkbook.OpenFromTemplate(tf1.Path); + Assert.True(workbook.Worksheets.Any()); + Assert.Throws(() => workbook.Save()); + + workbook.SaveAs(tf2.Path); + } + } + + /// + /// Excel escapes symbol ' in worksheet title so we have to process this correctly. + /// + [Test] + public void CanOpenWorksheetWithEscapedApostrophe() + { + string title = ""; + TestDelegate openWorkbook = () => + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\EscapedApostrophe.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + title = ws.Name; + } + }; + + Assert.DoesNotThrow(openWorkbook); + Assert.AreEqual("L'E", title); + } + + [Test] + public void CanRoundTripSheetProtectionForObjects() + { + using (var book = new XLWorkbook()) + { + var sheet = book.AddWorksheet("TestSheet"); + sheet.Protect() + .AllowElement(XLSheetProtectionElements.EditObjects | XLSheetProtectionElements.EditScenarios); + + Assert.AreEqual(XLSheetProtectionElements.SelectEverything | XLSheetProtectionElements.EditObjects | XLSheetProtectionElements.EditScenarios, sheet.Protection.AllowedElements); + + using (var xlStream = new MemoryStream()) + { + book.SaveAs(xlStream); + + using (var persistedBook = new XLWorkbook(xlStream)) + { + var persistedSheet = persistedBook.Worksheets.Worksheet(1); + + Assert.AreEqual(sheet.Protection.AllowedElements, persistedSheet.Protection.AllowedElements); + } + } + } + } + + [Test] + [TestCase("A1*10", 1230)] + [TestCase("A1/10", 12.3)] + [TestCase("A1&\" cells\"", "123 cells")] + [TestCase("A1&\"000\"", "123000")] + [TestCase("ISNUMBER(A1)", true)] + [TestCase("ISBLANK(A1)", false)] + [TestCase("DATE(2018,1,28)", 43128)] + public void LoadFormulaCachedValue(string formula, object expectedCachedValue) + { + using (var ms = new MemoryStream()) + { + using (XLWorkbook book1 = new XLWorkbook()) + { + var sheet = book1.AddWorksheet("sheet1"); + sheet.Cell("A1").Value = 123; + sheet.Cell("A2").FormulaA1 = formula; + var options = new SaveOptions { EvaluateFormulasBeforeSaving = true }; + + book1.SaveAs(ms, options); + } + ms.Position = 0; + + using (XLWorkbook book2 = new XLWorkbook(ms)) + { + var ws = book2.Worksheet(1); + Assert.IsFalse(ws.Cell("A2").NeedsRecalculation); + Assert.AreEqual(expectedCachedValue, ws.Cell("A2").CachedValue); + } + } + } + + [Test] + public void LoadingOptions() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\ExternalLinks\WorkbookWithExternalLink.xlsx"))) + { + Assert.DoesNotThrow(() => new XLWorkbook(stream, new LoadOptions { RecalculateAllFormulas = false })); + Assert.Throws(() => new XLWorkbook(stream, new LoadOptions { RecalculateAllFormulas = true })); + + Assert.AreEqual(XLEventTracking.Disabled, new XLWorkbook(stream, new LoadOptions { EventTracking = XLEventTracking.Disabled }).EventTracking); + Assert.AreEqual(XLEventTracking.Enabled, new XLWorkbook(stream, new LoadOptions { EventTracking = XLEventTracking.Enabled }).EventTracking); + } + } + + [Test] + public void CanLoadWorksheetStyle() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\BaseColumnWidth.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet(1); + + Assert.AreEqual(8, ws.Style.Font.FontSize); + Assert.AreEqual("Arial", ws.Style.Font.FontName); + Assert.AreEqual(8, ws.Cell("A1").Style.Font.FontSize); + Assert.AreEqual("Arial", ws.Cell("A1").Style.Font.FontName); + } + } + + [Test] + public void CanCorrectLoadWorkbookCellWithStringDataType() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\CellWithStringDataType.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var cellToCheck = wb.Worksheet(1).Cell("B2"); + Assert.AreEqual(XLDataType.Text, cellToCheck.DataType); + Assert.AreEqual("String with String Data type", cellToCheck.Value); + } + } + + [Test] + public void CanLoadFileWithInvalidSelectedRanges() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\SelectedRanges\InvalidSelectedRange.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet(1); + + Assert.AreEqual(2, ws.SelectedRanges.Count); + Assert.AreEqual("B2:B2", ws.SelectedRanges.First().RangeAddress.ToString()); + Assert.AreEqual("B2:C2", ws.SelectedRanges.Last().RangeAddress.ToString()); + } + } + + [Test] + public void CanLoadCellsWithoutReferencesCorrectly() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\LO\xlsx\row-index-1-based.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet(1); + + Assert.AreEqual("Page 1", ws.Name); + + var expected = new Dictionary() + { + ["A1"] = "Action Plan.Name", + ["B1"] = "Action Plan.Description", + ["A2"] = "Jerry", + ["B2"] = "This is a longer Text.\nSecond line.\nThird line.", + ["A3"] = "", + ["B3"] = "" + }; + + foreach (var pair in expected) + Assert.AreEqual(pair.Value, ws.Cell(pair.Key).GetString(), pair.Key); + } + } + + [Test] + public void CorrectlyLoadMergedCellsBorder() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\StyleReferenceFiles\MergedCellsBorder\inputfile.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet(1); + + var c = ws.Cell("B2"); + Assert.AreEqual(XLColorType.Theme, c.Style.Border.TopBorderColor.ColorType); + Assert.AreEqual(XLThemeColor.Accent1, c.Style.Border.TopBorderColor.ThemeColor); + Assert.AreEqual(0.39994506668294322d, c.Style.Border.TopBorderColor.ThemeTint, XLHelper.Epsilon); + } + } + + [Test] + public void CorrectlyLoadDefaultRowAndColumnStyles() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\StyleReferenceFiles\RowAndColumnStyles\inputfile.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet(1); + + Assert.AreEqual(8, ws.Row(1).Style.Font.FontSize); + Assert.AreEqual(8, ws.Row(2).Style.Font.FontSize); + Assert.AreEqual(8, ws.Column("A").Style.Font.FontSize); + } + } + + [Test] + public void EmptyNumberFormatIdTreatedAsGeneral() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\EmptyNumberFormatId.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet(1); + + Assert.AreEqual(XLPredefinedFormat.General, ws.Cell("A2").Style.NumberFormat.NumberFormatId); + } + } + + [Test] + public void CanLoadProperties() + { + const string author = "TestAuthor"; + const string title = "TestTitle"; + const string subject = "TestSubject"; + const string category = "TestCategory"; + const string keywords = "TestKeywords"; + const string comments = "TestComments"; + const string status = "TestStatus"; + var created = new DateTime(2019, 10, 19, 20, 42, 30); + var modified = new DateTime(2020, 11, 20, 09, 51, 20); + const string lastModifiedBy = "TestLastModifiedBy"; + const string company = "TestCompany"; + const string manager = "TestManager"; + + using (var stream = new MemoryStream()) + { + using (var wb = new XLWorkbook ()) + { + var sheet = wb.AddWorksheet("sheet1"); + + wb.Properties.Author = author; + wb.Properties.Title = title; + wb.Properties.Subject = subject; + wb.Properties.Category = category; + wb.Properties.Keywords = keywords; + wb.Properties.Comments = comments; + wb.Properties.Status = status; + wb.Properties.Created = created; + wb.Properties.Modified = modified; + wb.Properties.LastModifiedBy = lastModifiedBy; + wb.Properties.Company = company; + wb.Properties.Manager = manager; + + wb.SaveAs (stream, true); + } + + stream.Position = 0; + + using (var wb = new XLWorkbook(stream)) + { + Assert.AreEqual (author, wb.Properties.Author); + Assert.AreEqual (title, wb.Properties.Title); + Assert.AreEqual (subject, wb.Properties.Subject); + Assert.AreEqual (category, wb.Properties.Category); + Assert.AreEqual (keywords, wb.Properties.Keywords); + Assert.AreEqual (comments, wb.Properties.Comments); + Assert.AreEqual (status, wb.Properties.Status); + Assert.AreEqual (created, wb.Properties.Created); + Assert.AreEqual (modified, wb.Properties.Modified); + Assert.AreEqual (lastModifiedBy, wb.Properties.LastModifiedBy); + Assert.AreEqual (company, wb.Properties.Company); + Assert.AreEqual (manager, wb.Properties.Manager); + } + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Misc/CopyContentsTests.cs b/ClosedXML_Tests/Excel/Misc/CopyContentsTests.cs new file mode 100644 index 0000000..ed49a87 --- /dev/null +++ b/ClosedXML_Tests/Excel/Misc/CopyContentsTests.cs @@ -0,0 +1,134 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System.Linq; + +namespace ClosedXML_Tests.Excel.Misc +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class CopyContentsTests + { + private static void CopyRowAsRange(IXLWorksheet originalSheet, int originalRowNumber, IXLWorksheet destSheet, + int destRowNumber) + { + { + IXLRow destinationRow = destSheet.Row(destRowNumber); + destinationRow.Clear(); + + IXLRow originalRow = originalSheet.Row(originalRowNumber); + int columnNumber = originalRow.LastCellUsed(XLCellsUsedOptions.All).Address.ColumnNumber; + + IXLRange originalRange = originalSheet.Range(originalRowNumber, 1, originalRowNumber, columnNumber); + IXLRange destRange = destSheet.Range(destRowNumber, 1, destRowNumber, columnNumber); + originalRange.CopyTo(destRange); + } + } + + [Test] + public void CopyConditionalFormatsCount() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().AddConditionalFormat().WhenContains("1").Fill.SetBackgroundColor(XLColor.Blue); + ws.Cell("A2").Value = ws.FirstCell(); + Assert.AreEqual(2, ws.ConditionalFormats.Count()); + } + + [Test] + public void CopyConditionalFormatsFixedNum() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = "1"; + ws.Cell("B1").Value = "1"; + ws.Cell("A1").AddConditionalFormat().WhenEquals(1).Fill.SetBackgroundColor(XLColor.Blue); + ws.Cell("A2").Value = ws.Cell("A1"); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "1" && !v.Value.IsFormula))); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "1" && !v.Value.IsFormula))); + } + + [Test] + public void CopyConditionalFormatsFixedString() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = "A"; + ws.Cell("B1").Value = "B"; + ws.Cell("A1").AddConditionalFormat().WhenEquals("A").Fill.SetBackgroundColor(XLColor.Blue); + ws.Cell("A2").Value = ws.Cell("A1"); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "A" && !v.Value.IsFormula))); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "A" && !v.Value.IsFormula))); + } + + [Test] + public void CopyConditionalFormatsFixedStringNum() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = "1"; + ws.Cell("B1").Value = "1"; + ws.Cell("A1").AddConditionalFormat().WhenEquals("1").Fill.SetBackgroundColor(XLColor.Blue); + ws.Cell("A2").Value = ws.Cell("A1"); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "1" && !v.Value.IsFormula))); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "1" && !v.Value.IsFormula))); + } + + [Test] + public void CopyConditionalFormatsRelative() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = "1"; + ws.Cell("B1").Value = "1"; + ws.Cell("A1").AddConditionalFormat().WhenEquals("=B1").Fill.SetBackgroundColor(XLColor.Blue); + ws.Cell("A2").Value = ws.Cell("A1"); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "B1" && v.Value.IsFormula))); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "B2" && v.Value.IsFormula))); + } + + [Test] + public void TestRowCopyContents() + { + var workbook = new XLWorkbook(); + IXLWorksheet originalSheet = workbook.Worksheets.Add("original"); + IXLWorksheet copyRowSheet = workbook.Worksheets.Add("copy row"); + IXLWorksheet copyRowAsRangeSheet = workbook.Worksheets.Add("copy row as range"); + IXLWorksheet copyRangeSheet = workbook.Worksheets.Add("copy range"); + + originalSheet.Cell("A2").SetValue("test value"); + originalSheet.Range("A2:E2").Merge(); + + { + IXLRange originalRange = originalSheet.Range("A2:E2"); + IXLRange destinationRange = copyRangeSheet.Range("A2:E2"); + + originalRange.CopyTo(destinationRange); + } + CopyRowAsRange(originalSheet, 2, copyRowAsRangeSheet, 3); + { + IXLRow originalRow = originalSheet.Row(2); + IXLRow destinationRow = copyRowSheet.Row(2); + copyRowSheet.Cell("G2").Value = "must be removed after copy"; + originalRow.CopyTo(destinationRow); + } + TestHelper.SaveWorkbook(workbook, "Misc", "CopyRowContents.xlsx"); + } + + [Test] + public void UpdateCellsWorksheetTest() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.Worksheets.Add("Sheet1"); + ws1.Cell(1, 1).Value = "hello, world."; + + var ws2 = ws1.CopyTo("Sheet2"); + + Assert.AreEqual("Sheet1", ws1.FirstCell().Address.Worksheet.Name); + Assert.AreEqual("Sheet2", ws2.FirstCell().Address.Worksheet.Name); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Misc/ExtensionsTests.cs b/ClosedXML_Tests/Excel/Misc/ExtensionsTests.cs new file mode 100644 index 0000000..52ae72a --- /dev/null +++ b/ClosedXML_Tests/Excel/Misc/ExtensionsTests.cs @@ -0,0 +1,87 @@ +using System; +using ClosedXML.Excel; +using NUnit.Framework; +using DocumentFormat.OpenXml; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class ExtensionsTests + { + [Test] + public void FixNewLines() + { + Assert.AreEqual("\n".FixNewLines(), Environment.NewLine); + Assert.AreEqual("\r\n".FixNewLines(), Environment.NewLine); + Assert.AreEqual("\rS\n".FixNewLines(), "\rS" + Environment.NewLine); + Assert.AreEqual("\r\n\n".FixNewLines(), Environment.NewLine + Environment.NewLine); + } + + [Test] + public void DoubleSaveRound() + { + Double value = 1234.1234567; + Assert.AreEqual(value.SaveRound(), Math.Round(value, 6)); + } + + [Test] + public void DoubleValueSaveRound() + { + Double value = 1234.1234567; + Assert.AreEqual(new DoubleValue(value).SaveRound().Value, Math.Round(value, 6)); + } + + [TestCase("NoEscaping", ExpectedResult = "NoEscaping")] + [TestCase("1", ExpectedResult = "'1'")] + [TestCase("AB-CD", ExpectedResult = "'AB-CD'")] + [TestCase(" AB", ExpectedResult = "' AB'")] + [TestCase("Test sheet", ExpectedResult = "'Test sheet'")] + [TestCase("O'Kelly", ExpectedResult = "'O''Kelly'")] + [TestCase("A2+3", ExpectedResult = "'A2+3'")] + [TestCase("A\"B", ExpectedResult = "'A\"B'")] + [TestCase("A!B", ExpectedResult = "'A!B'")] + [TestCase("A~B", ExpectedResult = "'A~B'")] + [TestCase("A^B", ExpectedResult = "'A^B'")] + [TestCase("A&B", ExpectedResult = "'A&B'")] + [TestCase("A>B", ExpectedResult = "'A>B'")] + [TestCase("A ws.Cell("A1").Value, Throws.InstanceOf()); + + ws.Cell("B1").FormulaA1 = "=SUM(Sheet1!A1:UnknownSheet!A50)"; + Assert.That(() => ws.Cell("B1").Value, Throws.InstanceOf()); + } + } + + [Test] + public void DateAgainstStringComparison() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = new DateTime(2016, 1, 1); + ws.Cell("A1").DataType = XLDataType.DateTime; + + ws.Cell("A2").FormulaA1 = @"=IF(A1 = """", ""A"", ""B"")"; + var actual = ws.Cell("A2").Value; + Assert.AreEqual(actual, "B"); + + ws.Cell("A3").FormulaA1 = @"=IF("""" = A1, ""A"", ""B"")"; + actual = ws.Cell("A3").Value; + Assert.AreEqual(actual, "B"); + } + } + + [Test] + public void FormulaThatReferencesEntireRow() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().Value = 1; + ws.FirstCell().CellRight().Value = 2; + ws.FirstCell().CellRight(5).Value = 3; + + ws.FirstCell().CellBelow().FormulaA1 = "=SUM(1:1)"; + + var actual = ws.FirstCell().CellBelow().Value; + Assert.AreEqual(6, actual); + } + } + + [Test] + public void FormulaThatReferencesEntireColumn() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().Value = 1; + ws.FirstCell().CellBelow().Value = 2; + ws.FirstCell().CellBelow(5).Value = 3; + + ws.FirstCell().CellRight().FormulaA1 = "=SUM(A:A)"; + + var actual = ws.FirstCell().CellRight().Value; + Assert.AreEqual(6, actual); + } + } + + [Test] + public void FormulaThatStartsWithEqualsAndPlus() + { + object actual; + actual = XLWorkbook.EvaluateExpr("=MID(\"This is a test\", 6, 2)"); + Assert.AreEqual("is", actual); + + actual = XLWorkbook.EvaluateExpr("=+MID(\"This is a test\", 6, 2)"); + Assert.AreEqual("is", actual); + + actual = XLWorkbook.EvaluateExpr("=+++++MID(\"This is a test\", 6, 2)"); + Assert.AreEqual("is", actual); + + actual = XLWorkbook.EvaluateExpr("+MID(\"This is a test\", 6, 2)"); + Assert.AreEqual("is", actual); + } + + [Test] + public void FormulasWithErrors() + { + Assert.Throws(() => XLWorkbook.EvaluateExpr("YEAR(#REF!)")); + Assert.Throws(() => XLWorkbook.EvaluateExpr("YEAR(#VALUE!)")); + Assert.Throws(() => XLWorkbook.EvaluateExpr("YEAR(#DIV/0!)")); + Assert.Throws(() => XLWorkbook.EvaluateExpr("YEAR(#NAME?)")); + Assert.Throws(() => XLWorkbook.EvaluateExpr("YEAR(#N/A)")); + Assert.Throws(() => XLWorkbook.EvaluateExpr("YEAR(#NULL!)")); + Assert.Throws(() => XLWorkbook.EvaluateExpr("YEAR(#NUM!)")); + } + + [Test] + public void UnicodeLetterParsing() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.AddWorksheet("Sheet C CÄ"); + var ws2 = wb.AddWorksheet("ÖC"); + var ws3 = wb.AddWorksheet("Sheet3"); + + ws1.FirstCell().SetValue(100); + ws2.FirstCell().SetValue(50); + + ws3.FirstCell().FormulaA1 = "='Sheet C CÄ'!A1"; + ws3.FirstCell().CellBelow().FormulaA1 = "ÖC!A1"; + + Assert.AreEqual(100, ws3.FirstCell().Value); + Assert.AreEqual(50, ws3.FirstCell().CellBelow().Value); + } + } + + [Test] + public void ShiftFormula() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + ws.Cell("B1").FormulaA1 = "ATAN2(C1,C2)"; + ws.Cell("B2").FormulaA1 = "DEC2HEX(C2)"; + ws.Range("B3:B5").FormulaA1 = "{DAYS360(C3:C5, D3:D5)}"; + + ws.Column(1).Delete(); + + Assert.AreEqual("ATAN2(B1,B2)", ws.Cell("A1").FormulaA1); + Assert.AreEqual("DEC2HEX(B2)", ws.Cell("A2").FormulaA1); + Assert.AreEqual("{DAYS360(B3:B5, C3:C5)}", ws.Cell("A3").FormulaA1); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Misc/HyperlinkTests.cs b/ClosedXML_Tests/Excel/Misc/HyperlinkTests.cs new file mode 100644 index 0000000..95b2431 --- /dev/null +++ b/ClosedXML_Tests/Excel/Misc/HyperlinkTests.cs @@ -0,0 +1,32 @@ +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.Misc +{ + [TestFixture] + public class HyperlinkTests + { + [Test] + public void TestHyperlinks() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.Worksheets.Add("Sheet1"); + var ws2 = wb.Worksheets.Add("Sheet2"); + + var targetCell = ws2.Cell("A1"); + var targetRange = ws2.Range("A1", "B1"); + + var linkCell1 = ws1.Cell("A1"); + linkCell1.Value = "Link to IXLCell"; + linkCell1.Hyperlink = new XLHyperlink(targetCell); + Assert.AreEqual("Sheet2!A1", linkCell1.Hyperlink.InternalAddress); + + var linkRange1 = ws1.Cell("A2"); + linkRange1.Value = "Link to IXLRangeBase"; + linkRange1.Hyperlink = new XLHyperlink(targetRange); + Assert.AreEqual("Sheet2!A1:B1", linkRange1.Hyperlink.InternalAddress); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Misc/SearchTests.cs b/ClosedXML_Tests/Excel/Misc/SearchTests.cs new file mode 100644 index 0000000..21e299d --- /dev/null +++ b/ClosedXML_Tests/Excel/Misc/SearchTests.cs @@ -0,0 +1,78 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System.Globalization; +using System.Linq; + +namespace ClosedXML_Tests.Excel.Misc +{ + [TestFixture] + public class SearchTests + { + [Test] + public void TestSearch() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\Misc\CellValues.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + + IXLCells foundCells; + + foundCells = ws.Search("Initial Value"); + Assert.AreEqual(1, foundCells.Count()); + Assert.AreEqual("B2", foundCells.Single().Address.ToString()); + Assert.AreEqual("Initial Value", foundCells.Single().GetString()); + + foundCells = ws.Search("Using"); + Assert.AreEqual(2, foundCells.Count()); + Assert.AreEqual("D2", foundCells.First().Address.ToString()); + Assert.AreEqual("Using Get...()", foundCells.First().GetString()); + Assert.AreEqual(2, foundCells.Count()); + Assert.AreEqual("E2", foundCells.Last().Address.ToString()); + Assert.AreEqual("Using GetValue()", foundCells.Last().GetString()); + + foundCells = ws.Search("1234"); + Assert.AreEqual(4, foundCells.Count()); + Assert.AreEqual("C5,D5,E5,F5", string.Join(",", foundCells.Select(c => c.Address.ToString()).ToArray())); + + foundCells = ws.Search("Sep"); + Assert.AreEqual(2, foundCells.Count()); + Assert.AreEqual("B3,G3", string.Join(",", foundCells.Select(c => c.Address.ToString()).ToArray())); + + foundCells = ws.Search("1234", CompareOptions.Ordinal, true); + Assert.AreEqual(5, foundCells.Count()); + Assert.AreEqual("B5,C5,D5,E5,F5", string.Join(",", foundCells.Select(c => c.Address.ToString()).ToArray())); + + foundCells = ws.Search("test case", CompareOptions.Ordinal); + Assert.AreEqual(0, foundCells.Count()); + + foundCells = ws.Search("test case", CompareOptions.OrdinalIgnoreCase); + Assert.AreEqual(6, foundCells.Count()); + } + } + + [Test] + public void TestSearch2() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\Misc\Formulas.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + + IXLCells foundCells; + + foundCells = ws.Search("3", CompareOptions.Ordinal); + Assert.AreEqual(10, foundCells.Count()); + Assert.AreEqual("C2", foundCells.First().Address.ToString()); + + foundCells = ws.Search("A2", CompareOptions.Ordinal, true); + Assert.AreEqual(6, foundCells.Count()); + Assert.AreEqual("C2,D2,B6,C6,D6,A11", string.Join(",", foundCells.Select(c => c.Address.ToString()).ToArray())); + + foundCells = ws.Search("RC", CompareOptions.Ordinal, true); + Assert.AreEqual(3, foundCells.Count()); + Assert.AreEqual("E2,E3,E4", string.Join(",", foundCells.Select(c => c.Address.ToString()).ToArray())); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Misc/StylesTests.cs b/ClosedXML_Tests/Excel/Misc/StylesTests.cs new file mode 100644 index 0000000..96740f4 --- /dev/null +++ b/ClosedXML_Tests/Excel/Misc/StylesTests.cs @@ -0,0 +1,114 @@ +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.Misc +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class StylesTests + { + private static void SetupBorders(IXLRange range) + { + range.FirstRow().Cell(1).Style.Border.TopBorder = XLBorderStyleValues.None; + range.FirstRow().Cell(2).Style.Border.TopBorder = XLBorderStyleValues.Thick; + range.FirstRow().Cell(3).Style.Border.TopBorder = XLBorderStyleValues.Double; + + range.LastRow().Cell(1).Style.Border.BottomBorder = XLBorderStyleValues.None; + range.LastRow().Cell(2).Style.Border.BottomBorder = XLBorderStyleValues.Thick; + range.LastRow().Cell(3).Style.Border.BottomBorder = XLBorderStyleValues.Double; + + range.FirstColumn().Cell(1).Style.Border.LeftBorder = XLBorderStyleValues.None; + range.FirstColumn().Cell(2).Style.Border.LeftBorder = XLBorderStyleValues.Thick; + range.FirstColumn().Cell(3).Style.Border.LeftBorder = XLBorderStyleValues.Double; + + range.LastColumn().Cell(1).Style.Border.RightBorder = XLBorderStyleValues.None; + range.LastColumn().Cell(2).Style.Border.RightBorder = XLBorderStyleValues.Thick; + range.LastColumn().Cell(3).Style.Border.RightBorder = XLBorderStyleValues.Double; + } + + [Test] + public void InsideBorderTest() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + IXLRange range = ws.Range("B2:D4"); + + SetupBorders(range); + + range.Style.Border.InsideBorder = XLBorderStyleValues.Thin; + range.Style.Border.InsideBorderColor = XLColor.Red; + + IXLCell center = range.Cell(2, 2); + + Assert.AreEqual(XLColor.Red, center.Style.Border.TopBorderColor); + Assert.AreEqual(XLColor.Red, center.Style.Border.BottomBorderColor); + Assert.AreEqual(XLColor.Red, center.Style.Border.LeftBorderColor); + Assert.AreEqual(XLColor.Red, center.Style.Border.RightBorderColor); + + Assert.AreEqual(XLBorderStyleValues.None, range.FirstRow().Cell(1).Style.Border.TopBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, range.FirstRow().Cell(2).Style.Border.TopBorder); + Assert.AreEqual(XLBorderStyleValues.Double, range.FirstRow().Cell(3).Style.Border.TopBorder); + + Assert.AreEqual(XLBorderStyleValues.None, range.LastRow().Cell(1).Style.Border.BottomBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, range.LastRow().Cell(2).Style.Border.BottomBorder); + Assert.AreEqual(XLBorderStyleValues.Double, range.LastRow().Cell(3).Style.Border.BottomBorder); + + Assert.AreEqual(XLBorderStyleValues.None, range.FirstColumn().Cell(1).Style.Border.LeftBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, range.FirstColumn().Cell(2).Style.Border.LeftBorder); + Assert.AreEqual(XLBorderStyleValues.Double, range.FirstColumn().Cell(3).Style.Border.LeftBorder); + + Assert.AreEqual(XLBorderStyleValues.None, range.LastColumn().Cell(1).Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, range.LastColumn().Cell(2).Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.Double, range.LastColumn().Cell(3).Style.Border.RightBorder); + } + + [Test] + public void ResolveThemeColors() + { + using (var wb = new XLWorkbook()) + { + string color; + color = wb.Theme.ResolveThemeColor(XLThemeColor.Accent1).Color.ToHex(); + Assert.AreEqual("FF4F81BD", color); + + color = wb.Theme.ResolveThemeColor(XLThemeColor.Background1).Color.ToHex(); + Assert.AreEqual("FFFFFFFF", color); + } + } + + [Theory] + public void CanResolveAllThemeColors(XLThemeColor themeColor) + { + var theme = new XLWorkbook().Theme; + var color = theme.ResolveThemeColor(themeColor); + Assert.IsNotNull(color); + } + + [Test] + public void SetStyleViaRowReference() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Style + .Font.SetFontSize(8) + .Font.SetFontColor(XLColor.Green) + .Font.SetBold(true); + + var row = ws.Row(1); + ws.Cell(1, 1).Value = "Test"; + row.Cell(2).Value = "Test"; + row.Cells(3, 3).Value = "Test"; + + foreach (var cell in ws.CellsUsed()) + { + Assert.AreEqual(8, ws.Cell("A1").Style.Font.FontSize); + Assert.AreEqual(XLColor.Green, ws.Cell("B1").Style.Font.FontColor); + Assert.AreEqual(true, ws.Cell("C1").Style.Font.Bold); + } + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs b/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs new file mode 100644 index 0000000..5352f70 --- /dev/null +++ b/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs @@ -0,0 +1,463 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class XLWorkbookTests + { + [Test] + public void Cell1() + { + var wb = new XLWorkbook(); + IXLCell cell = wb.Cell("ABC"); + Assert.IsNull(cell); + } + + [Test] + public void Cell2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); + IXLCell cell = wb.Cell("Sheet1!Result"); + Assert.IsNotNull(cell); + Assert.AreEqual(1, cell.GetValue()); + } + + [Test] + public void Cell3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result"); + IXLCell cell = wb.Cell("Sheet1!Result"); + Assert.IsNotNull(cell); + Assert.AreEqual(1, cell.GetValue()); + } + + [Test] + public void Cells1() + { + var wb = new XLWorkbook(); + IXLCells cells = wb.Cells("ABC"); + Assert.IsNotNull(cells); + Assert.AreEqual(0, cells.Count()); + } + + [Test] + public void Cells2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); + IXLCells cells = wb.Cells("Sheet1!Result, ABC"); + Assert.IsNotNull(cells); + Assert.AreEqual(1, cells.Count()); + Assert.AreEqual(1, cells.First().GetValue()); + } + + [Test] + public void Cells3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result"); + IXLCells cells = wb.Cells("Sheet1!Result, ABC"); + Assert.IsNotNull(cells); + Assert.AreEqual(1, cells.Count()); + Assert.AreEqual(1, cells.First().GetValue()); + } + + [Test] + public void GetCellFromFullAddress() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + IXLWorksheet ws2 = wb.AddWorksheet("O'Sheet 2"); + var c1 = ws.Cell("C123"); + var c2 = ws2.Cell("B7"); + + var c1_full = wb.Cell("Sheet1!C123"); + var c2_full = wb.Cell("'O'Sheet 2'!B7"); + + Assert.AreSame(c1, c1_full); + Assert.AreSame(c2, c2_full); + Assert.NotNull(c1_full); + Assert.NotNull(c2_full); + } + + [TestCase("Sheet1")] + [TestCase("Sheet1!")] + [TestCase("Sheet2!")] + [TestCase("Sheet2!C1")] + [TestCase("Sheet1!ZZZ1")] + [TestCase("Sheet1!A")] + public void GetCellFromNonExistingFullAddress(string address) + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + + var c = wb.Cell(address); + + Assert.IsNull(c); + } + + [Test] + public void GetRangeFromFullAddress() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + var r1 = ws.Range("C123:D125"); + + var r2 = wb.Range("Sheet1!C123:D125"); + + Assert.AreSame(r1, r2); + Assert.NotNull(r2); + } + + [TestCase("Sheet2!C1:D2")] + [TestCase("Sheet1!A")] + public void GetRangeFromNonExistingFullAddress(string rangeAddress) + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + + var r = wb.Range(rangeAddress); + + Assert.IsNull(r); + } + + [Test] + public void GetRangesFromFullAddress() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + var r1 = ws.Ranges("A1:B2,C1:E3"); + + var r2 = wb.Ranges("Sheet1!A1:B2,Sheet1!C1:E3"); + + Assert.AreEqual(2, r2.Count); + Assert.AreSame(r1.First(), r2.First()); + Assert.AreSame(r1.Last(), r2.Last()); + } + + [TestCase("Sheet2!C1:D2,Sheet2!F1:G4")] + [TestCase("Sheet1!A,Sheet1!B")] + public void GetRangesFromNonExistingFullAddress(string rangesAddress) + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + + var r = wb.Ranges(rangesAddress); + + Assert.NotNull(r); + Assert.False(r.Any()); + } + + [Test] + public void NamedRange1() + { + var wb = new XLWorkbook(); + IXLNamedRange range = wb.NamedRange("ABC"); + Assert.IsNull(range); + } + + [Test] + public void NamedRange2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); + IXLNamedRange range = wb.NamedRange("Sheet1!Result"); + Assert.IsNotNull(range); + Assert.AreEqual(1, range.Ranges.Count); + Assert.AreEqual(1, range.Ranges.Cells().Count()); + Assert.AreEqual(1, range.Ranges.First().FirstCell().GetValue()); + } + + [Test] + public void NamedRange3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + IXLNamedRange range = wb.NamedRange("Sheet1!Result"); + Assert.IsNull(range); + } + + [Test] + public void NamedRange4() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result"); + IXLNamedRange range = wb.NamedRange("Sheet1!Result"); + Assert.IsNotNull(range); + Assert.AreEqual(1, range.Ranges.Count); + Assert.AreEqual(1, range.Ranges.Cells().Count()); + Assert.AreEqual(1, range.Ranges.First().FirstCell().GetValue()); + } + + [Test] + public void Range1() + { + var wb = new XLWorkbook(); + IXLRange range = wb.Range("ABC"); + Assert.IsNull(range); + } + + [Test] + public void Range2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); + IXLRange range = wb.Range("Sheet1!Result"); + Assert.IsNotNull(range); + Assert.AreEqual(1, range.Cells().Count()); + Assert.AreEqual(1, range.FirstCell().GetValue()); + } + + [Test] + public void Range3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result"); + IXLRange range = wb.Range("Sheet1!Result"); + Assert.IsNotNull(range); + Assert.AreEqual(1, range.Cells().Count()); + Assert.AreEqual(1, range.FirstCell().GetValue()); + } + + [Test] + public void Ranges1() + { + var wb = new XLWorkbook(); + IXLRanges ranges = wb.Ranges("ABC"); + Assert.IsNotNull(ranges); + Assert.AreEqual(0, ranges.Count()); + } + + [Test] + public void Ranges2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); + IXLRanges ranges = wb.Ranges("Sheet1!Result, ABC"); + Assert.IsNotNull(ranges); + Assert.AreEqual(1, ranges.Cells().Count()); + Assert.AreEqual(1, ranges.First().FirstCell().GetValue()); + } + + [Test] + public void Ranges3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result"); + IXLRanges ranges = wb.Ranges("Sheet1!Result, ABC"); + Assert.IsNotNull(ranges); + Assert.AreEqual(1, ranges.Cells().Count()); + Assert.AreEqual(1, ranges.First().FirstCell().GetValue()); + } + + [Test] + public void WbNamedCell() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("Test").AddToNamed("TestCell"); + Assert.AreEqual("Test", wb.Cell("TestCell").GetString()); + Assert.AreEqual("Test", ws.Cell("TestCell").GetString()); + } + + [Test] + public void WbNamedCells() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("Test").AddToNamed("TestCell"); + ws.Cell(2, 1).SetValue("B").AddToNamed("Test2"); + IXLCells wbCells = wb.Cells("TestCell, Test2"); + Assert.AreEqual("Test", wbCells.First().GetString()); + Assert.AreEqual("B", wbCells.Last().GetString()); + + IXLCells wsCells = ws.Cells("TestCell, Test2"); + Assert.AreEqual("Test", wsCells.First().GetString()); + Assert.AreEqual("B", wsCells.Last().GetString()); + } + + [Test] + public void WbNamedRange() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("A"); + ws.Cell(2, 1).SetValue("B"); + IXLRange original = ws.Range("A1:A2"); + original.AddToNamed("TestRange"); + Assert.AreEqual(original.RangeAddress.ToStringFixed(), wb.Range("TestRange").RangeAddress.ToString()); + Assert.AreEqual(original.RangeAddress.ToStringFixed(), ws.Range("TestRange").RangeAddress.ToString()); + } + + [Test] + public void WbNamedRanges() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("A"); + ws.Cell(2, 1).SetValue("B"); + ws.Cell(3, 1).SetValue("C").AddToNamed("Test2"); + IXLRange original = ws.Range("A1:A2"); + original.AddToNamed("TestRange"); + IXLRanges wbRanges = wb.Ranges("TestRange, Test2"); + Assert.AreEqual(original.RangeAddress.ToStringFixed(), wbRanges.First().RangeAddress.ToString()); + Assert.AreEqual("$A$3:$A$3", wbRanges.Last().RangeAddress.ToStringFixed()); + + IXLRanges wsRanges = wb.Ranges("TestRange, Test2"); + Assert.AreEqual(original.RangeAddress.ToStringFixed(), wsRanges.First().RangeAddress.ToString()); + Assert.AreEqual("$A$3:$A$3", wsRanges.Last().RangeAddress.ToStringFixed()); + } + + [Test] + public void WbNamedRangesOneString() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + wb.NamedRanges.Add("TestRange", "Sheet1!$A$1,Sheet1!$A$3"); + + IXLRanges wbRanges = ws.Ranges("TestRange"); + Assert.AreEqual("$A$1:$A$1", wbRanges.First().RangeAddress.ToStringFixed()); + Assert.AreEqual("$A$3:$A$3", wbRanges.Last().RangeAddress.ToStringFixed()); + + IXLRanges wsRanges = ws.Ranges("TestRange"); + Assert.AreEqual("$A$1:$A$1", wsRanges.First().RangeAddress.ToStringFixed()); + Assert.AreEqual("$A$3:$A$3", wsRanges.Last().RangeAddress.ToStringFixed()); + } + + [Test] + public void WbProtect1() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + wb.Protect(); + Assert.IsTrue(wb.LockStructure); + Assert.IsFalse(wb.LockWindows); + Assert.IsFalse(wb.IsPasswordProtected); + } + } + + [Test] + public void WbProtect2() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + wb.Protect(true, false); + Assert.IsTrue(wb.LockStructure); + Assert.IsFalse(wb.LockWindows); + Assert.IsFalse(wb.IsPasswordProtected); + } + } + + [Test] + public void WbProtect3() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + wb.Protect("Abc@123"); + Assert.IsTrue(wb.LockStructure); + Assert.IsFalse(wb.LockWindows); + Assert.IsTrue(wb.IsPasswordProtected); + Assert.Throws(() => wb.Protect()); + Assert.Throws(() => wb.Unprotect()); + Assert.Throws(() => wb.Unprotect("Cde@345")); + } + } + + [Test] + public void WbProtect4() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + wb.Protect(); + Assert.IsTrue(wb.LockStructure); + Assert.IsFalse(wb.LockWindows); + Assert.IsFalse(wb.IsPasswordProtected); + wb.Unprotect(); + wb.Protect("Abc@123"); + Assert.IsTrue(wb.LockStructure); + Assert.IsFalse(wb.LockWindows); + Assert.IsTrue(wb.IsPasswordProtected); + } + } + + [Test] + public void WbProtect5() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + wb.Protect(true, false, "Abc@123"); + Assert.IsTrue(wb.LockStructure); + Assert.IsFalse(wb.LockWindows); + Assert.IsTrue(wb.IsPasswordProtected); + wb.Unprotect("Abc@123"); + Assert.IsFalse(wb.LockStructure); + Assert.IsFalse(wb.LockWindows); + Assert.IsFalse(wb.IsPasswordProtected); + } + } + + [Test] + public void FileSharingProperties() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + wb.AddWorksheet("Sheet1").Cell("A1").Value = "Hello world!"; + wb.FileSharing.ReadOnlyRecommended = true; + wb.FileSharing.UserName = Environment.UserName; + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + Assert.IsTrue(wb.FileSharing.ReadOnlyRecommended); + Assert.AreEqual(Environment.UserName, wb.FileSharing.UserName); + } + } + } + +#if _NET40_ + [Ignore(".NET 40 does not support Janitor.Fody")] +#endif + + [Test] + public void AccessDisposedWorkbookThrowsException() + { + IXLWorkbook wb; + using (wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + ws.FirstCell().SetValue("Hello world"); + } + + Assert.Throws(() => Console.WriteLine(wb.Worksheets.First().FirstCell().Value)); + } + } +} diff --git a/ClosedXML_Tests/Excel/Misc/XlHelperTests.cs b/ClosedXML_Tests/Excel/Misc/XlHelperTests.cs new file mode 100644 index 0000000..83e1dd0 --- /dev/null +++ b/ClosedXML_Tests/Excel/Misc/XlHelperTests.cs @@ -0,0 +1,200 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Collections.Generic; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class XlHelperTests + { + private static void CheckColumnNumber(int column) + { + Assert.AreEqual(column, XLHelper.GetColumnNumberFromLetter(XLHelper.GetColumnLetterFromNumber(column))); + } + + [Test] + public void InvalidA1Addresses() + { + Assert.IsFalse(XLHelper.IsValidA1Address("")); + Assert.IsFalse(XLHelper.IsValidA1Address("A")); + Assert.IsFalse(XLHelper.IsValidA1Address("a")); + Assert.IsFalse(XLHelper.IsValidA1Address("1")); + Assert.IsFalse(XLHelper.IsValidA1Address("-1")); + Assert.IsFalse(XLHelper.IsValidA1Address("AAAA1")); + Assert.IsFalse(XLHelper.IsValidA1Address("XFG1")); + + Assert.IsFalse(XLHelper.IsValidA1Address("@A1")); + Assert.IsFalse(XLHelper.IsValidA1Address("@AA1")); + Assert.IsFalse(XLHelper.IsValidA1Address("@AAA1")); + Assert.IsFalse(XLHelper.IsValidA1Address("[A1")); + Assert.IsFalse(XLHelper.IsValidA1Address("[AA1")); + Assert.IsFalse(XLHelper.IsValidA1Address("[AAA1")); + Assert.IsFalse(XLHelper.IsValidA1Address("{A1")); + Assert.IsFalse(XLHelper.IsValidA1Address("{AA1")); + Assert.IsFalse(XLHelper.IsValidA1Address("{AAA1")); + + Assert.IsFalse(XLHelper.IsValidA1Address("A1@")); + Assert.IsFalse(XLHelper.IsValidA1Address("AA1@")); + Assert.IsFalse(XLHelper.IsValidA1Address("AAA1@")); + Assert.IsFalse(XLHelper.IsValidA1Address("A1[")); + Assert.IsFalse(XLHelper.IsValidA1Address("AA1[")); + Assert.IsFalse(XLHelper.IsValidA1Address("AAA1[")); + Assert.IsFalse(XLHelper.IsValidA1Address("A1{")); + Assert.IsFalse(XLHelper.IsValidA1Address("AA1{")); + Assert.IsFalse(XLHelper.IsValidA1Address("AAA1{")); + + Assert.IsFalse(XLHelper.IsValidA1Address("@A1@")); + Assert.IsFalse(XLHelper.IsValidA1Address("@AA1@")); + Assert.IsFalse(XLHelper.IsValidA1Address("@AAA1@")); + Assert.IsFalse(XLHelper.IsValidA1Address("[A1[")); + Assert.IsFalse(XLHelper.IsValidA1Address("[AA1[")); + Assert.IsFalse(XLHelper.IsValidA1Address("[AAA1[")); + Assert.IsFalse(XLHelper.IsValidA1Address("{A1{")); + Assert.IsFalse(XLHelper.IsValidA1Address("{AA1{")); + Assert.IsFalse(XLHelper.IsValidA1Address("{AAA1{")); + } + + [Test] + public void PlusAA1_Is_Not_an_address() + { + Assert.IsFalse(XLHelper.IsValidA1Address("+AA1")); + } + + [Test] + public void TestConvertColumnLetterToNumberAnd() + { + CheckColumnNumber(1); + CheckColumnNumber(27); + CheckColumnNumber(28); + CheckColumnNumber(52); + CheckColumnNumber(53); + CheckColumnNumber(1000); + CheckColumnNumber(1353); + } + + [Test] + public void ValidA1Addresses() + { + Assert.IsTrue(XLHelper.IsValidA1Address("A1")); + Assert.IsTrue(XLHelper.IsValidA1Address("A" + XLHelper.MaxRowNumber)); + Assert.IsTrue(XLHelper.IsValidA1Address("Z1")); + Assert.IsTrue(XLHelper.IsValidA1Address("Z" + XLHelper.MaxRowNumber)); + + Assert.IsTrue(XLHelper.IsValidA1Address("AA1")); + Assert.IsTrue(XLHelper.IsValidA1Address("AA" + XLHelper.MaxRowNumber)); + Assert.IsTrue(XLHelper.IsValidA1Address("ZZ1")); + Assert.IsTrue(XLHelper.IsValidA1Address("ZZ" + XLHelper.MaxRowNumber)); + + Assert.IsTrue(XLHelper.IsValidA1Address("AAA1")); + Assert.IsTrue(XLHelper.IsValidA1Address("AAA" + XLHelper.MaxRowNumber)); + Assert.IsTrue(XLHelper.IsValidA1Address(XLHelper.MaxColumnLetter + "1")); + Assert.IsTrue(XLHelper.IsValidA1Address(XLHelper.MaxColumnLetter + XLHelper.MaxRowNumber)); + } + + [Test] + public void TestColumnLetterLookup() + { + var columnLetters = new List(); + for (int c = 1; c <= XLHelper.MaxColumnNumber; c++) + { + var columnLetter = NaiveGetColumnLetterFromNumber(c); + columnLetters.Add(columnLetter); + + Assert.AreEqual(columnLetter, XLHelper.GetColumnLetterFromNumber(c)); + } + + foreach (var cl in columnLetters) + { + var columnNumber = NaiveGetColumnNumberFromLetter(cl); + Assert.AreEqual(columnNumber, XLHelper.GetColumnNumberFromLetter(cl)); + } + } + + [TestCase("R")] + [TestCase("C")] + [TestCase("RC")] + [TestCase("R111C222")] + [TestCase("R[]C")] + [TestCase("RC[]")] + [TestCase("R[]C[]")] + [TestCase("R[111]C222")] + [TestCase("R111C[222]")] + [TestCase("R[111]C[222]")] + [TestCase("R[-111]C[-222]")] + public void ValidRCAddresses(string address) + { + Assert.IsTrue(XLHelper.IsValidRCAddress(address)); + } + + [TestCase("RD")] + [TestCase("CC")] + [TestCase("R[-]C222")] + [TestCase("R[]C[-]")] + [TestCase("_R111C222")] + public void InvalidRCAddresses(string address) + { + Assert.IsFalse(XLHelper.IsValidRCAddress(address)); + } + + #region Old XLHelper methods + + private static readonly string[] letters = new[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; + + /// + /// These used to be the methods in XLHelper, but were later changed + /// We now use them as a check against the new methods + /// Gets the column number of a given column letter. + /// + /// The column letter to translate into a column number. + private static int NaiveGetColumnNumberFromLetter(string columnLetter) + { + if (string.IsNullOrEmpty(columnLetter)) throw new ArgumentNullException("columnLetter"); + + int retVal; + columnLetter = columnLetter.ToUpper(); + + //Extra check because we allow users to pass row col positions in as strings + if (columnLetter[0] <= '9') + { + retVal = Int32.Parse(columnLetter, XLHelper.NumberStyle, XLHelper.ParseCulture); + return retVal; + } + + int sum = 0; + + for (int i = 0; i < columnLetter.Length; i++) + { + sum *= 26; + sum += (columnLetter[i] - 'A' + 1); + } + + return sum; + } + + /// + /// Gets the column letter of a given column number. + /// + /// The column number to translate into a column letter. + /// if set to true the column letter will be restricted to the allowed range. + /// + private static string NaiveGetColumnLetterFromNumber(int columnNumber, bool trimToAllowed = false) + { + if (trimToAllowed) columnNumber = XLHelper.TrimColumnNumber(columnNumber); + + columnNumber--; // Adjust for start on column 1 + if (columnNumber <= 25) + { + return letters[columnNumber]; + } + var firstPart = (columnNumber) / 26; + var remainder = ((columnNumber) % 26) + 1; + return NaiveGetColumnLetterFromNumber(firstPart) + NaiveGetColumnLetterFromNumber(remainder); + } + + #endregion Old XLHelper methods + } +} diff --git a/ClosedXML_Tests/Excel/Misc/XmlEncoderTests.cs b/ClosedXML_Tests/Excel/Misc/XmlEncoderTests.cs new file mode 100644 index 0000000..8076915 --- /dev/null +++ b/ClosedXML_Tests/Excel/Misc/XmlEncoderTests.cs @@ -0,0 +1,23 @@ +using ClosedXML.Utils; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel +{ + [TestFixture] + public class XmlEncoderTest + { + [Test] + public void TestControlChars() + { + Assert.AreEqual("_x0001_ _x0002_ _x0003_ _x0004_", XmlEncoder.EncodeString("\u0001 \u0002 \u0003 \u0004")); + Assert.AreEqual("_x0005_ _x0006_ _x0007_ _x0008_", XmlEncoder.EncodeString("\u0005 \u0006 \u0007 \u0008")); + + Assert.AreEqual("\u0001 \u0002 \u0003 \u0004", XmlEncoder.DecodeString("_x0001_ _x0002_ _x0003_ _x0004_")); + Assert.AreEqual("\u0005 \u0006 \u0007 \u0008", XmlEncoder.DecodeString("_x0005_ _x0006_ _x0007_ _x0008_")); + Assert.AreEqual("\uAABB \uAABB", XmlEncoder.DecodeString("_xaaBB_ _xAAbb_")); + + // https://github.com/ClosedXML/ClosedXML/issues/1154 + Assert.AreEqual("_Xceed_Something", XmlEncoder.DecodeString("_Xceed_Something")); + } + } +} diff --git a/ClosedXML_Tests/Excel/NamedRanges/NamedRangesTests.cs b/ClosedXML_Tests/Excel/NamedRanges/NamedRangesTests.cs new file mode 100644 index 0000000..517779e --- /dev/null +++ b/ClosedXML_Tests/Excel/NamedRanges/NamedRangesTests.cs @@ -0,0 +1,626 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class NamedRangesTests + { + [Test] + public void MovingRanges() + { + var wb = new XLWorkbook(); + + IXLWorksheet sheet1 = wb.Worksheets.Add("Sheet1"); + IXLWorksheet sheet2 = wb.Worksheets.Add("Sheet2"); + + wb.NamedRanges.Add("wbNamedRange", + "Sheet1!$B$2,Sheet1!$B$3:$C$3,Sheet2!$D$3:$D$4,Sheet1!$6:$7,Sheet1!$F:$G"); + sheet1.NamedRanges.Add("sheet1NamedRange", + "Sheet1!$B$2,Sheet1!$B$3:$C$3,Sheet2!$D$3:$D$4,Sheet1!$6:$7,Sheet1!$F:$G"); + sheet2.NamedRanges.Add("sheet2NamedRange", "Sheet1!A1,Sheet2!A1"); + + sheet1.Row(1).InsertRowsAbove(2); + sheet1.Row(1).Delete(); + sheet1.Column(1).InsertColumnsBefore(2); + sheet1.Column(1).Delete(); + + Assert.AreEqual("Sheet1!$C$3,Sheet1!$C$4:$D$4,Sheet2!$D$3:$D$4,Sheet1!$7:$8,Sheet1!$G:$H", + wb.NamedRanges.First().RefersTo); + Assert.AreEqual("Sheet1!$C$3,Sheet1!$C$4:$D$4,Sheet2!$D$3:$D$4,Sheet1!$7:$8,Sheet1!$G:$H", + sheet1.NamedRanges.First().RefersTo); + Assert.AreEqual("Sheet1!B2,Sheet2!A1", sheet2.NamedRanges.First().RefersTo); + + wb.NamedRanges.ForEach(nr => Assert.AreEqual(XLNamedRangeScope.Workbook, nr.Scope)); + sheet1.NamedRanges.ForEach(nr => Assert.AreEqual(XLNamedRangeScope.Worksheet, nr.Scope)); + sheet2.NamedRanges.ForEach(nr => Assert.AreEqual(XLNamedRangeScope.Worksheet, nr.Scope)); + } + + [Test] + public void WbContainsWsNamedRange() + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().AddToNamed("Name", XLScope.Worksheet); + + Assert.IsTrue(wb.NamedRanges.Contains("Sheet1!Name")); + Assert.IsFalse(wb.NamedRanges.Contains("Sheet1!NameX")); + + Assert.IsNotNull(wb.NamedRange("Sheet1!Name")); + Assert.IsNull(wb.NamedRange("Sheet1!NameX")); + + Boolean result1 = wb.NamedRanges.TryGetValue("Sheet1!Name", out IXLNamedRange range1); + Assert.IsTrue(result1); + Assert.IsNotNull(range1); + Assert.AreEqual(XLNamedRangeScope.Worksheet, range1.Scope); + + Boolean result2 = wb.NamedRanges.TryGetValue("Sheet1!NameX", out IXLNamedRange range2); + Assert.IsFalse(result2); + Assert.IsNull(range2); + } + + [Test] + public void WorkbookContainsNamedRange() + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().AddToNamed("Name"); + + Assert.IsTrue(wb.NamedRanges.Contains("Name")); + Assert.IsFalse(wb.NamedRanges.Contains("NameX")); + + Assert.IsNotNull(wb.NamedRange("Name")); + Assert.IsNull(wb.NamedRange("NameX")); + + Boolean result1 = wb.NamedRanges.TryGetValue("Name", out IXLNamedRange range1); + Assert.IsTrue(result1); + Assert.IsNotNull(range1); + + Boolean result2 = wb.NamedRanges.TryGetValue("NameX", out IXLNamedRange range2); + Assert.IsFalse(result2); + Assert.IsNull(range2); + } + + [Test] + public void WorksheetContainsNamedRange() + { + IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); + ws.FirstCell().AddToNamed("Name", XLScope.Worksheet); + + Assert.IsTrue(ws.NamedRanges.Contains("Name")); + Assert.IsFalse(ws.NamedRanges.Contains("NameX")); + + Assert.IsNotNull(ws.NamedRange("Name")); + Assert.IsNull(ws.NamedRange("NameX")); + + Boolean result1 = ws.NamedRanges.TryGetValue("Name", out IXLNamedRange range1); + Assert.IsTrue(result1); + Assert.IsNotNull(range1); + + Boolean result2 = ws.NamedRanges.TryGetValue("NameX", out IXLNamedRange range2); + Assert.IsFalse(result2); + Assert.IsNull(range2); + } + + [Test] + public void DeleteColumnUsedInNamedRange() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Column1"); + ws.FirstCell().CellRight().SetValue("Column2").Style.Font.SetBold(); + ws.FirstCell().CellRight(2).SetValue("Column3"); + ws.NamedRanges.Add("MyRange", "A1:C1"); + + ws.Column(1).Delete(); + + Assert.IsTrue(ws.Cell("A1").Style.Font.Bold); + Assert.AreEqual("Column3", ws.Cell("B1").GetValue()); + Assert.IsEmpty(ws.Cell("C1").GetValue()); + } + } + + [Test] + public void TestInvalidNamedRangeOnWorkbookScope() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Column1"); + ws.FirstCell().CellRight().SetValue("Column2").Style.Font.SetBold(); + ws.FirstCell().CellRight(2).SetValue("Column3"); + + Assert.Throws(() => wb.NamedRanges.Add("MyRange", "A1:C1")); + } + } + + [Test] + public void NamedRangesWhenCopyingWorksheets() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.AddWorksheet("Sheet1"); + ws1.FirstCell().Value = Enumerable.Range(1, 10); + wb.NamedRanges.Add("wbNamedRange", ws1.Range("A1:A10")); + ws1.NamedRanges.Add("wsNamedRange", ws1.Range("A3")); + + var ws2 = wb.AddWorksheet("Sheet2"); + ws2.FirstCell().Value = Enumerable.Range(101, 10); + ws1.NamedRanges.Add("wsNamedRangeAcrossSheets", ws2.Range("A4")); + + ws1.Cell("C1").FormulaA1 = "=wbNamedRange"; + ws1.Cell("C2").FormulaA1 = "=wsNamedRange"; + ws1.Cell("C3").FormulaA1 = "=wsNamedRangeAcrossSheets"; + + Assert.AreEqual(1, ws1.Cell("C1").Value); + Assert.AreEqual(3, ws1.Cell("C2").Value); + Assert.AreEqual(104, ws1.Cell("C3").Value); + + var wsCopy = ws1.CopyTo("Copy"); + Assert.AreEqual(1, wsCopy.Cell("C1").Value); + Assert.AreEqual(3, wsCopy.Cell("C2").Value); + Assert.AreEqual(104, wsCopy.Cell("C3").Value); + + Assert.AreEqual("Sheet1!A1:A10", + wb.NamedRange("wbNamedRange").Ranges.First().RangeAddress.ToStringRelative(true)); + Assert.AreEqual("Copy!A3:A3", + wsCopy.NamedRange("wsNamedRange").Ranges.First().RangeAddress.ToStringRelative(true)); + Assert.AreEqual("Sheet2!A4:A4", + wsCopy.NamedRange("wsNamedRangeAcrossSheets").Ranges.First().RangeAddress.ToStringRelative(true)); + } + } + + [Test] + public void NamedRangeMayReferToExpression() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.AddWorksheet("Sheet1"); + wb.NamedRanges.Add("TEST", "=0.1"); + wb.NamedRanges.Add("TEST2", "=TEST*2"); + + ws1.Cell(1, 1).FormulaA1 = "TEST"; + ws1.Cell(2, 1).FormulaA1 = "TEST*10"; + ws1.Cell(3, 1).FormulaA1 = "TEST2"; + ws1.Cell(4, 1).FormulaA1 = "TEST2*3"; + + Assert.AreEqual(0.1, (double)ws1.Cell(1, 1).Value, XLHelper.Epsilon); + Assert.AreEqual(1.0, (double)ws1.Cell(2, 1).Value, XLHelper.Epsilon); + Assert.AreEqual(0.2, (double)ws1.Cell(3, 1).Value, XLHelper.Epsilon); + Assert.AreEqual(0.6, (double)ws1.Cell(4, 1).Value, XLHelper.Epsilon); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var ws1 = wb.Worksheets.First(); + + Assert.AreEqual(0.1, (double)ws1.Cell(1, 1).Value, XLHelper.Epsilon); + Assert.AreEqual(1.0, (double)ws1.Cell(2, 1).Value, XLHelper.Epsilon); + Assert.AreEqual(0.2, (double)ws1.Cell(3, 1).Value, XLHelper.Epsilon); + Assert.AreEqual(0.6, (double)ws1.Cell(4, 1).Value, XLHelper.Epsilon); + } + } + } + + [Test] + public void CanEvaluateNamedMultiRange() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.AddWorksheet("Sheet1"); + ws1.Range("A1:C1").Value = 1; + ws1.Range("A3:C3").Value = 3; + wb.NamedRanges.Add("TEST", ws1.Ranges("A1:C1,A3:C3")); + + ws1.Cell(2, 1).FormulaA1 = "=SUM(TEST)"; + + Assert.AreEqual(12.0, (double)ws1.Cell(2, 1).Value, XLHelper.Epsilon); + } + } + + [Test] + public void CanGetNamedFromAnother() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + ws1.Cell("A1").SetValue(1).AddToNamed("value1"); + + Assert.AreEqual(1, wb.Cell("value1").GetValue()); + Assert.AreEqual(1, wb.Range("value1").FirstCell().GetValue()); + + Assert.AreEqual(1, ws1.Cell("value1").GetValue()); + Assert.AreEqual(1, ws1.Range("value1").FirstCell().GetValue()); + + var ws2 = wb.Worksheets.Add("Sheet2"); + + ws2.Cell("A1").SetFormulaA1("=value1").AddToNamed("value2"); + + Assert.AreEqual(1, wb.Cell("value2").GetValue()); + Assert.AreEqual(1, wb.Range("value2").FirstCell().GetValue()); + + Assert.AreEqual(1, ws2.Cell("value1").GetValue()); + Assert.AreEqual(1, ws2.Range("value1").FirstCell().GetValue()); + + Assert.AreEqual(1, ws2.Cell("value2").GetValue()); + Assert.AreEqual(1, ws2.Range("value2").FirstCell().GetValue()); + } + + [Test] + public void CanRenameNamedRange() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.AddWorksheet("Sheet1"); + var nr1 = wb.NamedRanges.Add("TEST", "=0.1"); + + Assert.IsTrue(wb.NamedRanges.TryGetValue("TEST", out IXLNamedRange _)); + Assert.IsFalse(wb.NamedRanges.TryGetValue("TEST1", out IXLNamedRange _)); + + nr1.Name = "TEST1"; + + Assert.IsFalse(wb.NamedRanges.TryGetValue("TEST", out IXLNamedRange _)); + Assert.IsTrue(wb.NamedRanges.TryGetValue("TEST1", out IXLNamedRange _)); + + var nr2 = wb.NamedRanges.Add("TEST2", "=TEST1*2"); + + ws1.Cell(1, 1).FormulaA1 = "TEST1"; + ws1.Cell(2, 1).FormulaA1 = "TEST1*10"; + ws1.Cell(3, 1).FormulaA1 = "TEST2"; + ws1.Cell(4, 1).FormulaA1 = "TEST2*3"; + + Assert.AreEqual(0.1, (double)ws1.Cell(1, 1).Value, XLHelper.Epsilon); + Assert.AreEqual(1.0, (double)ws1.Cell(2, 1).Value, XLHelper.Epsilon); + Assert.AreEqual(0.2, (double)ws1.Cell(3, 1).Value, XLHelper.Epsilon); + Assert.AreEqual(0.6, (double)ws1.Cell(4, 1).Value, XLHelper.Epsilon); + } + } + + [Test] + public void CopyNamedRangeSameWorksheet() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + ws1.Range("B2:E6").AddToNamed("Named range", XLScope.Worksheet); + var nr = ws1.NamedRange("Named range"); + + TestDelegate action = () => nr.CopyTo(ws1); + + Assert.Throws(typeof(InvalidOperationException), action); + } + + [Test] + public void CopyNamedRangeDifferentWorksheets() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + var ws2 = wb.Worksheets.Add("Sheet2"); + var ranges = new XLRanges(); + ranges.Add(ws1.Range("B2:E6")); + ranges.Add(ws2.Range("D1:E2")); + var original = ws1.NamedRanges.Add("Named range", ranges); + + var copy = original.CopyTo(ws2); + + Assert.AreEqual(1, ws1.NamedRanges.Count()); + Assert.AreEqual(1, ws2.NamedRanges.Count()); + Assert.AreEqual(2, original.Ranges.Count); + Assert.AreEqual(2, copy.Ranges.Count); + Assert.AreEqual(original.Name, copy.Name); + Assert.AreEqual(original.Scope, copy.Scope); + Assert.AreEqual("Sheet1!B2:E6", original.Ranges.First().RangeAddress.ToString(XLReferenceStyle.A1, true)); + Assert.AreEqual("Sheet2!D1:E2", original.Ranges.Last().RangeAddress.ToString(XLReferenceStyle.A1, true)); + Assert.AreEqual("Sheet2!D1:E2", copy.Ranges.First().RangeAddress.ToString(XLReferenceStyle.A1, true)); + Assert.AreEqual("Sheet2!B2:E6", copy.Ranges.Last().RangeAddress.ToString(XLReferenceStyle.A1, true)); + } + + [Test] + public void NamedRangesBecomeInvalidOnWorksheetDeleting() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.Worksheets.Add("Sheet 1"); + var ws2 = wb.Worksheets.Add("Sheet 2"); + var ws3 = wb.Worksheets.Add("Sheet'3"); + + ws1.Range("A1:D1").AddToNamed("Named range 1", XLScope.Worksheet); + ws1.Range("A2:D2").AddToNamed("Named range 2", XLScope.Workbook); + ws2.Range("A3:D3").AddToNamed("Named range 3", XLScope.Worksheet); + ws2.Range("A4:D4").AddToNamed("Named range 4", XLScope.Workbook); + wb.NamedRanges.Add("Named range 5", new XLRanges + { + ws1.Range("A5:D5"), + ws3.Range("A5:D5") + }); + + ws2.Delete(); + ws3.Delete(); + + Assert.AreEqual(1, ws1.NamedRanges.Count()); + Assert.AreEqual("Named range 1", ws1.NamedRanges.First().Name); + Assert.AreEqual(XLNamedRangeScope.Worksheet, ws1.NamedRanges.First().Scope); + Assert.AreEqual("'Sheet 1'!$A$1:$D$1", ws1.NamedRanges.First().RefersTo); + Assert.AreEqual("'Sheet 1'!A1:D1", ws1.NamedRanges.First().Ranges.Single().RangeAddress.ToString(XLReferenceStyle.A1, true)); + + Assert.AreEqual(3, wb.NamedRanges.Count()); + + Assert.AreEqual("Named range 2", wb.NamedRanges.ElementAt(0).Name); + Assert.AreEqual(XLNamedRangeScope.Workbook, wb.NamedRanges.ElementAt(0).Scope); + Assert.AreEqual("'Sheet 1'!$A$2:$D$2", wb.NamedRanges.ElementAt(0).RefersTo); + Assert.AreEqual("'Sheet 1'!A2:D2", wb.NamedRanges.ElementAt(0).Ranges.Single().RangeAddress.ToString(XLReferenceStyle.A1, true)); + + Assert.AreEqual("Named range 4", wb.NamedRanges.ElementAt(1).Name); + Assert.AreEqual(XLNamedRangeScope.Workbook, wb.NamedRanges.ElementAt(1).Scope); + Assert.AreEqual("#REF!$A$4:$D$4", wb.NamedRanges.ElementAt(1).RefersTo); + Assert.IsFalse(wb.NamedRanges.ElementAt(1).Ranges.Any()); + + Assert.AreEqual("Named range 5", wb.NamedRanges.ElementAt(2).Name); + Assert.AreEqual(XLNamedRangeScope.Workbook, wb.NamedRanges.ElementAt(2).Scope); + Assert.AreEqual("'Sheet 1'!$A$5:$D$5,#REF!$A$5:$D$5", wb.NamedRanges.ElementAt(2).RefersTo); + Assert.AreEqual(1, wb.NamedRanges.ElementAt(2).Ranges.Count); + Assert.AreEqual("'Sheet 1'!A5:D5", wb.NamedRanges.ElementAt(2).Ranges.Single().RangeAddress.ToString(XLReferenceStyle.A1, true)); + } + } + + [Test] + public void SavedNamedRangesBecomeInvalidOnWorksheetDeleting() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.Worksheets.Add("Sheet 1"); + var ws2 = wb.Worksheets.Add("Sheet2"); + var ws3 = wb.Worksheets.Add("Sheet'3"); + + ws1.Range("A1:D1").AddToNamed("Named range 1", XLScope.Worksheet); + ws1.Range("A2:D2").AddToNamed("Named range 2", XLScope.Workbook); + ws2.Range("A3:D3").AddToNamed("Named range 3", XLScope.Worksheet); + ws2.Range("A4:D4").AddToNamed("Named range 4", XLScope.Workbook); + wb.NamedRanges.Add("Named range 5", new XLRanges + { + ws1.Range("A5:D5"), + ws3.Range("A5:D5") + }); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + wb.Worksheet("Sheet2").Delete(); + wb.Worksheet("Sheet'3").Delete(); + wb.Save(); + } + + using (var wb = new XLWorkbook(ms)) + { + var ws1 = wb.Worksheet("Sheet 1"); + Assert.AreEqual(1, ws1.NamedRanges.Count()); + Assert.AreEqual("Named range 1", ws1.NamedRanges.First().Name); + Assert.AreEqual(XLNamedRangeScope.Worksheet, ws1.NamedRanges.First().Scope); + Assert.AreEqual("'Sheet 1'!$A$1:$D$1", ws1.NamedRanges.First().RefersTo); + Assert.AreEqual("'Sheet 1'!A1:D1", + ws1.NamedRanges.First().Ranges.Single().RangeAddress.ToString(XLReferenceStyle.A1, true)); + + Assert.AreEqual(3, wb.NamedRanges.Count()); + + Assert.AreEqual("Named range 2", wb.NamedRanges.ElementAt(0).Name); + Assert.AreEqual(XLNamedRangeScope.Workbook, wb.NamedRanges.ElementAt(0).Scope); + Assert.AreEqual("'Sheet 1'!$A$2:$D$2", wb.NamedRanges.ElementAt(0).RefersTo); + Assert.AreEqual("'Sheet 1'!A2:D2", + wb.NamedRanges.ElementAt(0).Ranges.Single().RangeAddress.ToString(XLReferenceStyle.A1, true)); + + Assert.AreEqual("Named range 4", wb.NamedRanges.ElementAt(1).Name); + Assert.AreEqual(XLNamedRangeScope.Workbook, wb.NamedRanges.ElementAt(1).Scope); + Assert.AreEqual("#REF!", wb.NamedRanges.ElementAt(1).RefersTo); + Assert.IsFalse(wb.NamedRanges.ElementAt(1).Ranges.Any()); + + Assert.AreEqual("Named range 5", wb.NamedRanges.ElementAt(2).Name); + Assert.AreEqual(XLNamedRangeScope.Workbook, wb.NamedRanges.ElementAt(2).Scope); + Assert.AreEqual("'Sheet 1'!$A$5:$D$5,#REF!", wb.NamedRanges.ElementAt(2).RefersTo); + Assert.AreEqual(1, wb.NamedRanges.ElementAt(2).Ranges.Count); + Assert.AreEqual("'Sheet 1'!A5:D5", + wb.NamedRanges.ElementAt(2).Ranges.Single().RangeAddress.ToString(XLReferenceStyle.A1, true)); + } + } + } + + [Test] + public void NamedRangeReferringToMultipleRangesCanBeSavedAndLoaded() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet 1"); + + wb.NamedRanges.Add("Multirange named range", new XLRanges + { + ws.Range("A5:D5"), + ws.Range("A15:D15") + }); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + Assert.AreEqual(1, wb.NamedRanges.Count()); + var nr = wb.NamedRanges.Single() as XLNamedRange; + Assert.AreEqual("'Sheet 1'!$A$5:$D$5,'Sheet 1'!$A$15:$D$15", nr.RefersTo); + Assert.AreEqual(2, nr.Ranges.Count); + Assert.AreEqual("'Sheet 1'!A5:D5", nr.Ranges.First().RangeAddress.ToString(XLReferenceStyle.A1, true)); + Assert.AreEqual("'Sheet 1'!A15:D15", nr.Ranges.Last().RangeAddress.ToString(XLReferenceStyle.A1, true)); + Assert.AreEqual(2, nr.RangeList.Count); + Assert.AreEqual("'Sheet 1'!$A$5:$D$5", nr.RangeList.First()); + Assert.AreEqual("'Sheet 1'!$A$15:$D$15", nr.RangeList.Last()); + } + } + } + + [Test, Ignore("Muted until shifting is fixed (see #880)")] + public void NamedRangeBecomesInvalidOnRangeDeleting() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet 1"); + ws.Range("A1:B2").AddToNamed("Simple", XLScope.Workbook); + wb.NamedRanges.Add("Compound", new XLRanges + { + ws.Range("C1:D2"), + ws.Range("A10:D15") + }); + + ws.Rows(1,5).Delete(); + + Assert.AreEqual(2, wb.NamedRanges.Count()); + Assert.AreEqual(0, wb.NamedRanges.ValidNamedRanges().Count()); + Assert.AreEqual("'Sheet 1'!#REF!", wb.NamedRanges.ElementAt(0).RefersTo); + Assert.AreEqual("'Sheet 1'!#REF!,'Sheet 1'!A5:D10", wb.NamedRanges.ElementAt(0).RefersTo); + } + } + + [Test, Ignore("Muted until shifting is fixed (see #880)")] + public void NamedRangeBecomesInvalidOnRangeAndWorksheetDeleting() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.Worksheets.Add("Sheet 1"); + var ws2 = wb.Worksheets.Add("Sheet 2"); + ws1.Range("A1:B2").AddToNamed("Simple", XLScope.Workbook); + wb.NamedRanges.Add("Compound", new XLRanges + { + ws1.Range("C1:D2"), + ws2.Range("A10:D15") + }); + + ws1.Rows(1, 5).Delete(); + ws1.Delete(); + + Assert.AreEqual(2, wb.NamedRanges.Count()); + Assert.AreEqual(0, wb.NamedRanges.ValidNamedRanges().Count()); + Assert.AreEqual("#REF!#REF!", wb.NamedRanges.ElementAt(0).RefersTo); + Assert.AreEqual("#REF!#REF!,'Sheet 2'!A10:D15", wb.NamedRanges.ElementAt(0).RefersTo); + } + } + + [Test] + public void CanSaveAndLoadNamedRanges() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var sheet1 = wb.Worksheets.Add("Sheet1"); + var sheet2 = wb.Worksheets.Add("Sheet2"); + + wb.NamedRanges.Add("wbNamedRange", + "Sheet1!$B$2,Sheet1!$B$3:$C$3,Sheet2!$D$3:$D$4,Sheet1!$6:$7,Sheet1!$F:$G"); + sheet1.NamedRanges.Add("sheet1NamedRange", + "Sheet1!$B$2,Sheet1!$B$3:$C$3,Sheet2!$D$3:$D$4,Sheet1!$6:$7,Sheet1!$F:$G"); + sheet2.NamedRanges.Add("sheet2NamedRange", "Sheet1!A1,Sheet2!A1"); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var sheet1 = wb.Worksheet("Sheet1"); + var sheet2 = wb.Worksheet("Sheet2"); + + Assert.AreEqual(1, wb.NamedRanges.Count()); + Assert.AreEqual("wbNamedRange", wb.NamedRanges.Single().Name); + Assert.AreEqual("Sheet1!$B$2,Sheet1!$B$3:$C$3,Sheet2!$D$3:$D$4,Sheet1!$6:$7,Sheet1!$F:$G", wb.NamedRanges.Single().RefersTo); + Assert.AreEqual(5, wb.NamedRanges.Single().Ranges.Count); + + Assert.AreEqual(1, sheet1.NamedRanges.Count()); + Assert.AreEqual("sheet1NamedRange", sheet1.NamedRanges.Single().Name); + Assert.AreEqual("Sheet1!$B$2,Sheet1!$B$3:$C$3,Sheet2!$D$3:$D$4,Sheet1!$6:$7,Sheet1!$F:$G", sheet1.NamedRanges.Single().RefersTo); + Assert.AreEqual(5, sheet1.NamedRanges.Single().Ranges.Count); + + Assert.AreEqual(1, sheet2.NamedRanges.Count()); + Assert.AreEqual("sheet2NamedRange", sheet2.NamedRanges.Single().Name); + Assert.AreEqual("Sheet1!A1,Sheet2!A1", sheet2.NamedRanges.Single().RefersTo); + Assert.AreEqual(2, sheet2.NamedRanges.Single().Ranges.Count); + } + } + } + + [Test] + public void NamedRangesFromDeletedSheetAreSavedWithoutAddress() + { + // Range address referring to the deleted sheet look like #REF!A1:B2. + // But workbooks with such references in named ranges Excel considers as broken files. + // It requires #REF! + + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + wb.Worksheets.Add("Sheet 1"); + var ws2 = wb.Worksheets.Add("Sheet 2"); + ws2.Range("A4:D4").AddToNamed("Test named range", XLScope.Workbook); + ws2.Delete(); + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + Assert.AreEqual("#REF!", wb.NamedRanges.Single().RefersTo); + } + } + } + + [Test] + public void CanGetValidNamedRanges() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.Worksheets.Add("Sheet 1"); + var ws2 = wb.Worksheets.Add("Sheet 2"); + var ws3 = wb.Worksheets.Add("Sheet'3"); + + ws1.Range("A1:D1").AddToNamed("Named range 1", XLScope.Worksheet); + ws1.Range("A2:D2").AddToNamed("Named range 2", XLScope.Workbook); + ws2.Range("A3:D3").AddToNamed("Named range 3", XLScope.Worksheet); + ws2.Range("A4:D4").AddToNamed("Named range 4", XLScope.Workbook); + wb.NamedRanges.Add("Named range 5", new XLRanges + { + ws1.Range("A5:D5"), + ws3.Range("A5:D5") + }); + + ws2.Delete(); + ws3.Delete(); + + var globalValidRanges = wb.NamedRanges.ValidNamedRanges(); + var globalInvalidRanges = wb.NamedRanges.InvalidNamedRanges(); + var localValidRanges = ws1.NamedRanges.ValidNamedRanges(); + var localInvalidRanges = ws1.NamedRanges.InvalidNamedRanges(); + + Assert.AreEqual(1, globalValidRanges.Count()); + Assert.AreEqual("Named range 2", globalValidRanges.First().Name); + + Assert.AreEqual(2, globalInvalidRanges.Count()); + Assert.AreEqual("Named range 4", globalInvalidRanges.First().Name); + Assert.AreEqual("Named range 5", globalInvalidRanges.Last().Name); + + Assert.AreEqual(1, localValidRanges.Count()); + Assert.AreEqual("Named range 1", localValidRanges.First().Name); + + Assert.AreEqual(0, localInvalidRanges.Count()); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/PageSetup/HeaderFooterTests.cs b/ClosedXML_Tests/Excel/PageSetup/HeaderFooterTests.cs new file mode 100644 index 0000000..002df23 --- /dev/null +++ b/ClosedXML_Tests/Excel/PageSetup/HeaderFooterTests.cs @@ -0,0 +1,51 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.Excel +{ + [TestFixture] + public class HeaderFooterTests + { + [Test] + public void CanChangeWorksheetHeader() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + + ws.PageSetup.Header.Center.AddText("Initial page header", XLHFOccurrence.EvenPages); + + var ms = new MemoryStream(); + wb.SaveAs(ms, true); + + wb = new XLWorkbook(ms); + ws = wb.Worksheets.First(); + + ws.PageSetup.Header.Center.Clear(); + ws.PageSetup.Header.Center.AddText("Changed header", XLHFOccurrence.EvenPages); + + wb.SaveAs(ms, true); + + wb = new XLWorkbook(ms); + ws = wb.Worksheets.First(); + + var newHeader = ws.PageSetup.Header.Center.GetText(XLHFOccurrence.EvenPages); + Assert.AreEqual("Changed header", newHeader); + } + + [TestCase("")] + [TestCase("&L&C&\"Arial\"&9 19-10-2017 \n&9&\"Arial\" &P &N &R")] // https://github.com/ClosedXML/ClosedXML/issues/563 + public void CanSetHeaderFooter(string s) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + { + var header = ws.PageSetup.Header as XLHeaderFooter; + header.SetInnerText(XLHFOccurrence.AllPages, s); + } + } + } + } +} diff --git a/ClosedXML_Tests/Excel/PageSetup/PageBreaksTests.cs b/ClosedXML_Tests/Excel/PageSetup/PageBreaksTests.cs new file mode 100644 index 0000000..ff1673c --- /dev/null +++ b/ClosedXML_Tests/Excel/PageSetup/PageBreaksTests.cs @@ -0,0 +1,78 @@ +using System.Diagnostics; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel +{ + [TestFixture] + public class PageBreaksTests + { + [Test] + public void RowBreaksShouldBeSorted() + { + var wb = new XLWorkbook(); + IXLWorksheet sheet = wb.AddWorksheet("Sheet1"); + + sheet.PageSetup.AddHorizontalPageBreak(10); + sheet.PageSetup.AddHorizontalPageBreak(12); + sheet.PageSetup.AddHorizontalPageBreak(5); + Assert.That(sheet.PageSetup.RowBreaks, Is.EqualTo(new[] { 5, 10, 12 })); + } + + [Test] + public void ColumnBreaksShouldBeSorted() + { + var wb = new XLWorkbook(); + IXLWorksheet sheet = wb.AddWorksheet("Sheet1"); + + sheet.PageSetup.AddVerticalPageBreak(10); + sheet.PageSetup.AddVerticalPageBreak(12); + sheet.PageSetup.AddVerticalPageBreak(5); + Assert.That(sheet.PageSetup.ColumnBreaks, Is.EqualTo(new[] { 5, 10, 12 })); + } + + [Test] + public void RowBreaksShiftWhenInsertedRowAbove() + { + var wb = new XLWorkbook(); + IXLWorksheet sheet = wb.AddWorksheet("Sheet1"); + + sheet.PageSetup.AddHorizontalPageBreak(10); + sheet.Row(5).InsertRowsAbove(1); + Assert.AreEqual(11, sheet.PageSetup.RowBreaks[0]); + } + + [Test] + public void RowBreaksNotShiftWhenInsertedRowBelow() + { + var wb = new XLWorkbook(); + IXLWorksheet sheet = wb.AddWorksheet("Sheet1"); + + sheet.PageSetup.AddHorizontalPageBreak(10); + sheet.Row(15).InsertRowsAbove(1); + Assert.AreEqual(10, sheet.PageSetup.RowBreaks[0]); + } + + [Test] + public void ColumnBreaksShiftWhenInsertedColumnBefore() + { + var wb = new XLWorkbook(); + IXLWorksheet sheet = wb.AddWorksheet("Sheet1"); + + sheet.PageSetup.AddVerticalPageBreak(10); + sheet.Column(5).InsertColumnsBefore(1); + Assert.AreEqual(11, sheet.PageSetup.ColumnBreaks[0]); + } + + [Test] + public void ColumnBreaksNotShiftWhenInsertedColumnAfter() + { + var wb = new XLWorkbook(); + IXLWorksheet sheet = wb.AddWorksheet("Sheet1"); + + sheet.PageSetup.AddVerticalPageBreak(10); + sheet.Column(15).InsertColumnsBefore(1); + Assert.AreEqual(10, sheet.PageSetup.ColumnBreaks[0]); + } + } +} \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/PivotTables/XLPivotTableTests.cs b/ClosedXML_Tests/Excel/PivotTables/XLPivotTableTests.cs new file mode 100644 index 0000000..1d72252 --- /dev/null +++ b/ClosedXML_Tests/Excel/PivotTables/XLPivotTableTests.cs @@ -0,0 +1,765 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class XLPivotTableTests + { + [Test] + public void PivotTables() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\PivotTables\PivotTables.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet("PastrySalesData"); + var table = ws.Table("PastrySalesData"); + var ptSheet = wb.Worksheets.Add("BlankPivotTable"); + ptSheet.PivotTables.Add("pvt", ptSheet.Cell(1, 1), table); + + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms, true); + } + } + } + + [Test] + public void TestPivotTableVersioningAttributes() + { + // Pivot table definitions in input file has created and refreshed versioning attributes = 3 + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\PivotTableReferenceFiles\VersioningAttributes\inputfile.xlsx"))) + { + TestHelper.CreateAndCompare(() => + { + var wb = new XLWorkbook(stream); + + var data = wb.Worksheet("Data"); + + var pt = data.RangeUsed().CreatePivotTable(wb.AddWorksheet("pvt2").FirstCell(), "pvt2"); + + pt.ColumnLabels.Add("Sex"); + pt.RowLabels.Add("FullName"); + pt.Values.Add("Id", "Count of Id").SetSummaryFormula(XLPivotSummary.Count); + + return wb; + // Pivot table definitions in output file has created and refreshed versioning attributes = 5 + }, @"Other\PivotTableReferenceFiles\VersioningAttributes\outputfile.xlsx"); + } + } + + [Test] + public void PivotTableOptionsSaveTest() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\PivotTables\PivotTables.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet("PastrySalesData"); + var table = ws.Table("PastrySalesData"); + var ptSheet = wb.Worksheets.Add("BlankPivotTable"); + var pt = ptSheet.PivotTables.Add("pvtOptionsTest", ptSheet.Cell(1, 1), table); + + pt.ColumnHeaderCaption = "clmn header"; + pt.RowHeaderCaption = "row header"; + + pt.AutofitColumns = true; + pt.PreserveCellFormatting = false; + pt.ShowGrandTotalsColumns = true; + pt.ShowGrandTotalsRows = true; + pt.UseCustomListsForSorting = false; + pt.ShowExpandCollapseButtons = false; + pt.ShowContextualTooltips = false; + pt.DisplayCaptionsAndDropdowns = false; + pt.RepeatRowLabels = true; + pt.SaveSourceData = false; + pt.EnableShowDetails = false; + pt.ShowColumnHeaders = false; + pt.ShowRowHeaders = false; + + pt.MergeAndCenterWithLabels = true; // MergeItem + pt.RowLabelIndent = 12; // Indent + pt.FilterAreaOrder = XLFilterAreaOrder.OverThenDown; // PageOverThenDown + pt.FilterFieldsPageWrap = 14; // PageWrap + pt.ErrorValueReplacement = "error test"; // ErrorCaption + pt.EmptyCellReplacement = "empty test"; // MissingCaption + + pt.FilteredItemsInSubtotals = true; // Subtotal filtered page items + pt.AllowMultipleFilters = false; // MultipleFieldFilters + + pt.ShowPropertiesInTooltips = false; + pt.ClassicPivotTableLayout = true; + pt.ShowEmptyItemsOnRows = true; + pt.ShowEmptyItemsOnColumns = true; + pt.DisplayItemLabels = false; + pt.SortFieldsAtoZ = true; + + pt.PrintExpandCollapsedButtons = true; + pt.PrintTitles = true; + + // TODO pt.RefreshDataOnOpen = false; + pt.ItemsToRetainPerField = XLItemsToRetain.Max; + pt.EnableCellEditing = true; + pt.ShowValuesRow = true; + pt.ShowRowStripes = true; + pt.ShowColumnStripes = true; + pt.Theme = XLPivotTableTheme.PivotStyleDark13; + + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms, true); + + ms.Position = 0; + + using (var wbassert = new XLWorkbook(ms)) + { + var wsassert = wbassert.Worksheet("BlankPivotTable"); + var ptassert = wsassert.PivotTable("pvtOptionsTest"); + Assert.AreNotEqual(null, ptassert, "name save failure"); + Assert.AreEqual("clmn header", ptassert.ColumnHeaderCaption, "ColumnHeaderCaption save failure"); + Assert.AreEqual("row header", ptassert.RowHeaderCaption, "RowHeaderCaption save failure"); + Assert.AreEqual(true, ptassert.MergeAndCenterWithLabels, "MergeAndCenterWithLabels save failure"); + Assert.AreEqual(12, ptassert.RowLabelIndent, "RowLabelIndent save failure"); + Assert.AreEqual(XLFilterAreaOrder.OverThenDown, ptassert.FilterAreaOrder, "FilterAreaOrder save failure"); + Assert.AreEqual(14, ptassert.FilterFieldsPageWrap, "FilterFieldsPageWrap save failure"); + Assert.AreEqual("error test", ptassert.ErrorValueReplacement, "ErrorValueReplacement save failure"); + Assert.AreEqual("empty test", ptassert.EmptyCellReplacement, "EmptyCellReplacement save failure"); + Assert.AreEqual(true, ptassert.AutofitColumns, "AutofitColumns save failure"); + Assert.AreEqual(false, ptassert.PreserveCellFormatting, "PreserveCellFormatting save failure"); + Assert.AreEqual(true, ptassert.ShowGrandTotalsRows, "ShowGrandTotalsRows save failure"); + Assert.AreEqual(true, ptassert.ShowGrandTotalsColumns, "ShowGrandTotalsColumns save failure"); + Assert.AreEqual(true, ptassert.FilteredItemsInSubtotals, "FilteredItemsInSubtotals save failure"); + Assert.AreEqual(false, ptassert.AllowMultipleFilters, "AllowMultipleFilters save failure"); + Assert.AreEqual(false, ptassert.UseCustomListsForSorting, "UseCustomListsForSorting save failure"); + Assert.AreEqual(false, ptassert.ShowExpandCollapseButtons, "ShowExpandCollapseButtons save failure"); + Assert.AreEqual(false, ptassert.ShowContextualTooltips, "ShowContextualTooltips save failure"); + Assert.AreEqual(false, ptassert.ShowPropertiesInTooltips, "ShowPropertiesInTooltips save failure"); + Assert.AreEqual(false, ptassert.DisplayCaptionsAndDropdowns, "DisplayCaptionsAndDropdowns save failure"); + Assert.AreEqual(true, ptassert.ClassicPivotTableLayout, "ClassicPivotTableLayout save failure"); + Assert.AreEqual(true, ptassert.ShowEmptyItemsOnRows, "ShowEmptyItemsOnRows save failure"); + Assert.AreEqual(true, ptassert.ShowEmptyItemsOnColumns, "ShowEmptyItemsOnColumns save failure"); + Assert.AreEqual(false, ptassert.DisplayItemLabels, "DisplayItemLabels save failure"); + Assert.AreEqual(true, ptassert.SortFieldsAtoZ, "SortFieldsAtoZ save failure"); + Assert.AreEqual(true, ptassert.PrintExpandCollapsedButtons, "PrintExpandCollapsedButtons save failure"); + Assert.AreEqual(true, ptassert.RepeatRowLabels, "RepeatRowLabels save failure"); + Assert.AreEqual(true, ptassert.PrintTitles, "PrintTitles save failure"); + Assert.AreEqual(false, ptassert.SaveSourceData, "SaveSourceData save failure"); + Assert.AreEqual(false, ptassert.EnableShowDetails, "EnableShowDetails save failure"); + // TODO Assert.AreEqual(false, ptassert.RefreshDataOnOpen, "RefreshDataOnOpen save failure"); + Assert.AreEqual(XLItemsToRetain.Max, ptassert.ItemsToRetainPerField, "ItemsToRetainPerField save failure"); + Assert.AreEqual(true, ptassert.EnableCellEditing, "EnableCellEditing save failure"); + Assert.AreEqual(XLPivotTableTheme.PivotStyleDark13, ptassert.Theme, "Theme save failure"); + Assert.AreEqual(true, ptassert.ShowValuesRow, "ShowValuesRow save failure"); + Assert.AreEqual(false, ptassert.ShowRowHeaders, "ShowRowHeaders save failure"); + Assert.AreEqual(false, ptassert.ShowColumnHeaders, "ShowColumnHeaders save failure"); + Assert.AreEqual(true, ptassert.ShowRowStripes, "ShowRowStripes save failure"); + Assert.AreEqual(true, ptassert.ShowColumnStripes, "ShowColumnStripes save failure"); + } + } + } + } + + [TestCase(true)] + [TestCase(false)] + public void PivotFieldOptionsSaveTest(bool withDefaults) + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\PivotTables\PivotTables.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet("PastrySalesData"); + var table = ws.Table("PastrySalesData"); + + var ptSheet = wb.Worksheets.Add("pvtFieldOptionsTest"); + var pt = ptSheet.PivotTables.Add("pvtFieldOptionsTest", ptSheet.Cell(1, 1), table); + + var field = pt.RowLabels.Add("Name") + .SetSubtotalCaption("Test caption") + .SetCustomName("Test name"); + SetFieldOptions(field, withDefaults); + + pt.ColumnLabels.Add("Month"); + pt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum); + + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms, true); + + ms.Position = 0; + + using (var wbassert = new XLWorkbook(ms)) + { + var wsassert = wbassert.Worksheet("pvtFieldOptionsTest"); + var ptassert = wsassert.PivotTable("pvtFieldOptionsTest"); + var pfassert = ptassert.RowLabels.Get("Name"); + Assert.AreNotEqual(null, pfassert, "name save failure"); + Assert.AreEqual("Test caption", pfassert.SubtotalCaption, "SubtotalCaption save failure"); + Assert.AreEqual("Test name", pfassert.CustomName, "CustomName save failure"); + AssertFieldOptions(pfassert, withDefaults); + } + } + } + } + + [Test] + public void PivotTableStyleFormatsTest() + { + using (var ms = new MemoryStream()) + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\PivotTables\PivotTables.xlsx"))) + using (var wbSource = new XLWorkbook(stream)) + using (var wbDestination = new XLWorkbook()) + { + var ws = wbSource.Worksheet("PastrySalesData"); + wbDestination.AddWorksheet(ws); + ws = wbDestination.Worksheet("PastrySalesData"); + + var table = ws.Table("PastrySalesData"); + var ptSheet = wbDestination.Worksheets.Add("PivotTableStyleFormats"); + var pt = ptSheet.PivotTables.Add("pvtStyleFormats", ptSheet.Cell(1, 1), table); + pt.Layout = XLPivotLayout.Tabular; + + pt.SetSubtotals(XLPivotSubtotals.AtBottom); + + var monthPivotField = pt.ColumnLabels.Add("Month"); + + var namePivotField = pt.RowLabels.Add("Name") + .SetSubtotalCaption("Test caption") + .SetCustomName("Test name") + .AddSubtotal(XLSubtotalFunction.Sum); + + ptSheet.SetTabActive(); + + var numberOfOrdersPivotValue = pt.Values.Add("NumberOfOrders") + .SetSummaryFormula(XLPivotSummary.Sum); + + var qualityPivotValue = pt.Values.Add("Quality").SetSummaryFormula(XLPivotSummary.Sum); + + pt.StyleFormats.RowGrandTotalFormats.ForElement(XLPivotStyleFormatElement.All).Style.Font.FontColor = XLColor.VenetianRed; + + namePivotField.StyleFormats.Subtotal.Style.Fill.BackgroundColor = XLColor.Blue; + monthPivotField.StyleFormats.Label.Style.Fill.BackgroundColor = XLColor.Amber; + monthPivotField.StyleFormats.Header.Style.Font.FontColor = XLColor.Yellow; + namePivotField.StyleFormats.DataValuesFormat + .AndWith(monthPivotField, v => v.ToString() == "May") + .ForValueField(numberOfOrdersPivotValue) + .Style.Font.FontColor = XLColor.Green; + + wbDestination.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheet("PivotTableStyleFormats"); + var pt = ws.PivotTable("pvtStyleFormats").CastTo(); + + Assert.AreEqual(0, pt.StyleFormats.ColumnGrandTotalFormats.Count()); + + Assert.NotNull(pt.StyleFormats.RowGrandTotalFormats); + Assert.AreEqual(1, pt.StyleFormats.RowGrandTotalFormats.Count()); + Assert.AreEqual(XLPivotStyleFormatElement.All, pt.StyleFormats.RowGrandTotalFormats.First().AppliesTo); + Assert.AreEqual(XLColor.VenetianRed, pt.StyleFormats.RowGrandTotalFormats.ForElement(XLPivotStyleFormatElement.All).Style.Font.FontColor); + + var namePivotField = pt.RowLabels.Get("Name"); + var monthPivotField = pt.ColumnLabels.Get("Month"); + var numberOfOrdersPivotValue = pt.Values.Get("NumberOfOrders"); + + Assert.AreEqual(XLStyle.Default, namePivotField.StyleFormats.Label.Style); + Assert.AreEqual(XLColor.Blue, namePivotField.StyleFormats.Subtotal.Style.Fill.BackgroundColor); + + Assert.AreEqual(XLStyle.Default, monthPivotField.StyleFormats.Subtotal.Style); + Assert.AreEqual(XLColor.Amber, monthPivotField.StyleFormats.Label.Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, monthPivotField.StyleFormats.Header.Style.Font.FontColor); + + var nameDataValuesFormat = namePivotField.StyleFormats.DataValuesFormat as XLPivotValueStyleFormat; + Assert.AreEqual(2, nameDataValuesFormat.FieldReferences.Count()); + + Assert.AreEqual(monthPivotField, nameDataValuesFormat.FieldReferences.First().CastTo().PivotField); + + Assert.AreEqual(numberOfOrdersPivotValue.CustomName, nameDataValuesFormat.FieldReferences.Last().CastTo().Value); + + wb.Save(); + } + } + } + + private class Pastry + { + public Pastry(string name, int? code, int numberOfOrders, double quality, string month, DateTime? bakeDate) + { + Name = name; + Code = code; + NumberOfOrders = numberOfOrders; + Quality = quality; + Month = month; + BakeDate = bakeDate; + } + + public string Name { get; set; } + public int? Code { get; } + public int NumberOfOrders { get; set; } + public double Quality { get; set; } + public string Month { get; set; } + public DateTime? BakeDate { get; set; } + } + + [Test] + public void BlankPivotTableField() + { + using (var ms = new MemoryStream()) + { + TestHelper.CreateAndCompare(() => + { + // Based on .\ClosedXML\ClosedXML_Examples\PivotTables\PivotTables.cs + // But with empty column for Month + var pastries = new List + { + new Pastry("Croissant", 101, 150, 60.2, "", new DateTime(2016, 04, 21)), + new Pastry("Croissant", 101, 250, 50.42, "", new DateTime(2016, 05, 03)), + new Pastry("Croissant", 101, 134, 22.12, "", new DateTime(2016, 06, 24)), + new Pastry("Doughnut", 102, 250, 89.99, "", new DateTime(2017, 04, 23)), + new Pastry("Doughnut", 102, 225, 70, "", new DateTime(2016, 05, 24)), + new Pastry("Doughnut", 102, 210, 75.33, "", new DateTime(2016, 06, 02)), + new Pastry("Bearclaw", 103, 134, 10.24, "", new DateTime(2016, 04, 27)), + new Pastry("Bearclaw", 103, 184, 33.33, "", new DateTime(2016, 05, 20)), + new Pastry("Bearclaw", 103, 124, 25, "", new DateTime(2017, 06, 05)), + new Pastry("Danish", 104, 394, -20.24, "", null), + new Pastry("Danish", 104, 190, 60, "", new DateTime(2017, 05, 08)), + new Pastry("Danish", 104, 221, 24.76, "", new DateTime(2016, 06, 21)), + + // Deliberately add different casings of same string to ensure pivot table doesn't duplicate it. + new Pastry("Scone", 105, 135, 0, "", new DateTime(2017, 04, 22)), + new Pastry("SconE", 105, 122, 5.19, "", new DateTime(2017, 05, 03)), + new Pastry("SCONE", 105, 243, 44.2, "", new DateTime(2017, 06, 14)), + + // For ContainsBlank and integer rows/columns test + new Pastry("Scone", null, 255, 18.4, "", null), + }; + + var wb = new XLWorkbook(); + + var sheet = wb.Worksheets.Add("PastrySalesData"); + // Insert our list of pastry data into the "PastrySalesData" sheet at cell 1,1 + var table = sheet.Cell(1, 1).InsertTable(pastries, "PastrySalesData", true); + sheet.Cell("F11").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + sheet.Columns().AdjustToContents(); + + IXLWorksheet ptSheet; + IXLPivotTable pt; + + for (var i = 1; i <= 5; i++) + { + // Add a new sheet for our pivot table + ptSheet = wb.Worksheets.Add("pvt" + i); + + // Create the pivot table, using the data from the "PastrySalesData" table + pt = ptSheet.PivotTables.Add("pvt" + i, ptSheet.Cell(1, 1), table); + + if (i == 1 || i == 4 || i == 5) + pt.ColumnLabels.Add("Name"); + else if (i == 2 || i == 3) + pt.RowLabels.Add("Name"); + + if (i == 1 || i == 3) + pt.RowLabels.Add("Month"); + else if (i == 2 || i == 4) + pt.ColumnLabels.Add("Month"); + else if (i == 5) + pt.RowLabels.Add("BakeDate"); + + // The values in our table will come from the "NumberOfOrders" field + // The default calculation setting is a total of each row/column + pt.Values.Add("NumberOfOrders", "NumberOfOrdersPercentageOfBearclaw") + .ShowAsPercentageFrom("Name").And("Bearclaw") + .NumberFormat.Format = "0%"; + + ptSheet.Columns().AdjustToContents(); + } + + return wb; + }, @"Other\PivotTableReferenceFiles\BlankPivotTableField\BlankPivotTableField.xlsx"); + } + } + + [Test] + public void SourceSheetWithWhitespace() + { + using (var ms = new MemoryStream()) + { + TestHelper.CreateAndCompare(() => + { + // Based on .\ClosedXML\ClosedXML_Examples\PivotTables\PivotTables.cs + // But with empty column for Month + var pastries = new List + { + new Pastry("Croissant", 101, 150, 60.2, "", new DateTime(2016, 04, 21)), + new Pastry("Croissant", 101, 250, 50.42, "", new DateTime(2016, 05, 03)), + new Pastry("Croissant", 101, 134, 22.12, "", new DateTime(2016, 06, 24)), + new Pastry("Doughnut", 102, 250, 89.99, "", new DateTime(2017, 04, 23)), + new Pastry("Doughnut", 102, 225, 70, "", new DateTime(2016, 05, 24)), + new Pastry("Doughnut", 102, 210, 75.33, "", new DateTime(2016, 06, 02)), + new Pastry("Bearclaw", 103, 134, 10.24, "", new DateTime(2016, 04, 27)), + new Pastry("Bearclaw", 103, 184, 33.33, "", new DateTime(2016, 05, 20)), + new Pastry("Bearclaw", 103, 124, 25, "", new DateTime(2017, 06, 05)), + new Pastry("Danish", 104, 394, -20.24, "", null), + new Pastry("Danish", 104, 190, 60, "", new DateTime(2017, 05, 08)), + new Pastry("Danish", 104, 221, 24.76, "", new DateTime(2016, 06, 21)), + + // Deliberately add different casings of same string to ensure pivot table doesn't duplicate it. + new Pastry("Scone", 105, 135, 0, "", new DateTime(2017, 04, 22)), + new Pastry("SconE", 105, 122, 5.19, "", new DateTime(2017, 05, 03)), + new Pastry("SCONE", 105, 243, 44.2, "", new DateTime(2017, 06, 14)), + + // For ContainsBlank and integer rows/columns test + new Pastry("Scone", null, 255, 18.4, "", null), + }; + + var wb = new XLWorkbook(); + + var sheet = wb.Worksheets.Add("Pastry Sales Data"); + // Insert our list of pastry data into the "PastrySalesData" sheet at cell 1,1 + var table = sheet.Cell(1, 1).InsertTable(pastries, "PastrySalesData", true); + sheet.Cell("F11").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + sheet.Columns().AdjustToContents(); + + IXLWorksheet ptSheet; + IXLPivotTable pt; + + // Add a new sheet for our pivot table + ptSheet = wb.Worksheets.Add("pvt"); + + // Create the pivot table, using the data from the "PastrySalesData" table + pt = ptSheet.PivotTables.Add("pvt", ptSheet.Cell(1, 1), table.AsRange()); + pt.ColumnLabels.Add("Name"); + pt.RowLabels.Add("Month"); + + // The values in our table will come from the "NumberOfOrders" field + // The default calculation setting is a total of each row/column + pt.Values.Add("NumberOfOrders", "NumberOfOrdersPercentageOfBearclaw") + .ShowAsPercentageFrom("Name").And("Bearclaw") + .NumberFormat.Format = "0%"; + + ptSheet.Columns().AdjustToContents(); + + return wb; + }, @"Other\PivotTableReferenceFiles\SourceSheetWithWhitespace\outputfile.xlsx"); + } + } + + [Test] + public void PivotTableWithNoneTheme() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\PivotTableReferenceFiles\PivotTableWithNoneTheme\inputfile.xlsx"))) + using (var ms = new MemoryStream()) + { + TestHelper.CreateAndCompare(() => + { + var wb = new XLWorkbook(stream); + wb.SaveAs(ms); + return wb; + }, @"Other\PivotTableReferenceFiles\PivotTableWithNoneTheme\outputfile.xlsx"); + } + } + + [Test] + public void MaintainPivotTableLabelsOrder() + { + var pastries = new List + { + new Pastry("Croissant", 101, 150, 60.2, "", new DateTime(2016, 04, 21)), + new Pastry("Croissant", 101, 250, 50.42, "", new DateTime(2016, 05, 03)), + new Pastry("Croissant", 101, 134, 22.12, "", new DateTime(2016, 06, 24)), + new Pastry("Doughnut", 102, 250, 89.99, "", new DateTime(2017, 04, 23)), + new Pastry("Doughnut", 102, 225, 70, "", new DateTime(2016, 05, 24)), + new Pastry("Doughnut", 102, 210, 75.33, "", new DateTime(2016, 06, 02)), + new Pastry("Bearclaw", 103, 134, 10.24, "", new DateTime(2016, 04, 27)), + new Pastry("Bearclaw", 103, 184, 33.33, "", new DateTime(2016, 05, 20)), + new Pastry("Bearclaw", 103, 124, 25, "", new DateTime(2017, 06, 05)), + new Pastry("Danish", 104, 394, -20.24, "", null), + new Pastry("Danish", 104, 190, 60, "", new DateTime(2017, 05, 08)), + new Pastry("Danish", 104, 221, 24.76, "", new DateTime(2016, 06, 21)), + + // Deliberately add different casings of same string to ensure pivot table doesn't duplicate it. + new Pastry("Scone", 105, 135, 0, "", new DateTime(2017, 04, 22)), + new Pastry("SconE", 105, 122, 5.19, "", new DateTime(2017, 05, 03)), + new Pastry("SCONE", 105, 243, 44.2, "", new DateTime(2017, 06, 14)), + + // For ContainsBlank and integer rows/columns test + new Pastry("Scone", null, 255, 18.4, "", null), + }; + + using (var ms = new MemoryStream()) + { + // Page fields + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("PastrySalesData"); + // Insert our list of pastry data into the "PastrySalesData" sheet at cell 1,1 + var table = sheet.Cell(1, 1).InsertTable(pastries, "PastrySalesData", true); + sheet.Cell("F11").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + sheet.Columns().AdjustToContents(); + + IXLWorksheet ptSheet; + IXLPivotTable pt; + + // Add a new sheet for our pivot table + ptSheet = wb.Worksheets.Add("pvt"); + + // Create the pivot table, using the data from the "PastrySalesData" table + pt = ptSheet.PivotTables.Add("PastryPivot", ptSheet.Cell(1, 1), table); + + pt.ReportFilters.Add("Month"); + pt.ReportFilters.Add("Name"); + + pt.RowLabels.Add("BakeDate"); + pt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum); + + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + var pageFields = wb.Worksheets.SelectMany(ws => ws.PivotTables) + .First() + .ReportFilters + .ToArray(); + + Assert.AreEqual("Month", pageFields[0].SourceName); + Assert.AreEqual("Name", pageFields[1].SourceName); + } + } + + using (var ms = new MemoryStream()) + { + // Column labels + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("PastrySalesData"); + // Insert our list of pastry data into the "PastrySalesData" sheet at cell 1,1 + var table = sheet.Cell(1, 1).InsertTable(pastries, "PastrySalesData", true); + sheet.Cell("F11").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + sheet.Columns().AdjustToContents(); + + IXLWorksheet ptSheet; + IXLPivotTable pt; + + // Add a new sheet for our pivot table + ptSheet = wb.Worksheets.Add("pvt"); + + // Create the pivot table, using the data from the "PastrySalesData" table + pt = ptSheet.PivotTables.Add("PastryPivot", ptSheet.Cell(1, 1), table); + + pt.ColumnLabels.Add("Month"); + pt.ColumnLabels.Add("Name"); + + pt.RowLabels.Add("BakeDate"); + pt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum); + + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + var columnLabels = wb.Worksheets.SelectMany(ws => ws.PivotTables) + .First() + .ColumnLabels + .ToArray(); + + Assert.AreEqual("Month", columnLabels[0].SourceName); + Assert.AreEqual("Name", columnLabels[1].SourceName); + } + } + + using (var ms = new MemoryStream()) + { + // Row labels + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("PastrySalesData"); + // Insert our list of pastry data into the "PastrySalesData" sheet at cell 1,1 + var table = sheet.Cell(1, 1).InsertTable(pastries, "PastrySalesData", true); + sheet.Cell("F11").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + sheet.Columns().AdjustToContents(); + + IXLWorksheet ptSheet; + IXLPivotTable pt; + + // Add a new sheet for our pivot table + ptSheet = wb.Worksheets.Add("pvt"); + + // Create the pivot table, using the data from the "PastrySalesData" table + pt = ptSheet.PivotTables.Add("PastryPivot", ptSheet.Cell(1, 1), table); + + pt.RowLabels.Add("Month"); + pt.RowLabels.Add("Name"); + pt.RowLabels.Add(XLConstants.PivotTable.ValuesSentinalLabel); + + pt.ColumnLabels.Add("BakeDate"); + pt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum); + + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + var rowLabels = wb.Worksheets.SelectMany(ws => ws.PivotTables) + .First() + .RowLabels + .ToArray(); + + Assert.AreEqual("Month", rowLabels[0].SourceName); + Assert.AreEqual("Name", rowLabels[1].SourceName); + Assert.AreEqual("{{Values}}", rowLabels[2].SourceName); + } + } + } + + [Test] + public void MaintainPivotTableIntegrityOnMultipleSaves() + { + var pastries = new List + { + new Pastry("Croissant", 101, 150, 60.2, "", new DateTime(2016, 04, 21)), + new Pastry("Croissant", 101, 250, 50.42, "", new DateTime(2016, 05, 03)), + new Pastry("Croissant", 101, 134, 22.12, "", new DateTime(2016, 06, 24)), + new Pastry("Doughnut", 102, 250, 89.99, "", new DateTime(2017, 04, 23)), + new Pastry("Doughnut", 102, 225, 70, "", new DateTime(2016, 05, 24)), + new Pastry("Doughnut", 102, 210, 75.33, "", new DateTime(2016, 06, 02)), + new Pastry("Bearclaw", 103, 134, 10.24, "", new DateTime(2016, 04, 27)), + new Pastry("Bearclaw", 103, 184, 33.33, "", new DateTime(2016, 05, 20)), + new Pastry("Bearclaw", 103, 124, 25, "", new DateTime(2017, 06, 05)), + new Pastry("Danish", 104, 394, -20.24, "", null), + new Pastry("Danish", 104, 190, 60, "", new DateTime(2017, 05, 08)), + new Pastry("Danish", 104, 221, 24.76, "", new DateTime(2016, 06, 21)), + + // Deliberately add different casings of same string to ensure pivot table doesn't duplicate it. + new Pastry("Scone", 105, 135, 0, "", new DateTime(2017, 04, 22)), + new Pastry("SconE", 105, 122, 5.19, "", new DateTime(2017, 05, 03)), + new Pastry("SCONE", 105, 243, 44.2, "", new DateTime(2017, 06, 14)), + + // For ContainsBlank and integer rows/columns test + new Pastry("Scone", null, 255, 18.4, "", null), + }; + + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("PastrySalesData"); + var table = ws.FirstCell().InsertTable(pastries, "PastrySalesData", true); + + var pvtSheet = wb.Worksheets.Add("pvt"); + var pvt = table.CreatePivotTable(pvtSheet.FirstCell(), "PastryPvt"); + + pvt.ColumnLabels.Add("Month"); + pvt.RowLabels.Add("Name"); + pvt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum); + + //Deliberately try to save twice + wb.SaveAs(ms); + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + Assert.AreEqual(1, wb.Worksheets.SelectMany(ws => ws.PivotTables).Count()); + } + } + } + + [Test] + public void TwoPivotWithOneSourceTest() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\PivotTableReferenceFiles\TwoPivotTablesWithSingleSource\input.xlsx"))) + TestHelper.CreateAndCompare(() => + { + var wb = new XLWorkbook(stream); + var srcRange = wb.Range("Sheet1!$B$2:$H$207"); + + foreach (var pt in wb.Worksheets.SelectMany(ws => ws.PivotTables)) + { + pt.SourceRange = srcRange; + } + + return wb; + }, @"Other\PivotTableReferenceFiles\TwoPivotTablesWithSingleSource\output.xlsx"); + } + + [Test] + public void PivotSubtotalsLoadingTest() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\PivotTableReferenceFiles\PivotSubtotalsSource\input.xlsx"))) + TestHelper.CreateAndCompare(() => + { + var wb = new XLWorkbook(stream); + return wb; + }, @"Other\PivotTableReferenceFiles\PivotSubtotalsSource\input.xlsx"); + } + + [Test] + public void ClearPivotTableTenderedTange() + { + // https://github.com/ClosedXML/ClosedXML/pull/856 + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\PivotTableReferenceFiles\ClearPivotTableRenderedRangeWhenLoading\inputfile.xlsx"))) + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet("Sheet1"); + Assert.IsTrue(ws.Cell("B1").IsEmpty()); + Assert.IsTrue(ws.Cell("C2").IsEmpty()); + Assert.IsTrue(ws.Cell("D5").IsEmpty()); + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheet("Sheet1"); + Assert.IsTrue(ws.Cell("B1").IsEmpty()); + Assert.IsTrue(ws.Cell("C2").IsEmpty()); + Assert.IsTrue(ws.Cell("D5").IsEmpty()); + } + } + } + + private static void SetFieldOptions(IXLPivotField field, bool withDefaults) + { + field.SubtotalsAtTop = !withDefaults; + field.ShowBlankItems = !withDefaults; + field.Outline = !withDefaults; + field.Compact = !withDefaults; + field.Collapsed = withDefaults; + field.InsertBlankLines = withDefaults; + field.RepeatItemLabels = withDefaults; + field.InsertPageBreaks = withDefaults; + field.IncludeNewItemsInFilter = withDefaults; + } + + private static void AssertFieldOptions(IXLPivotField field, bool withDefaults) + { + Assert.AreEqual(!withDefaults, field.SubtotalsAtTop, "SubtotalsAtTop save failure"); + Assert.AreEqual(!withDefaults, field.ShowBlankItems, "ShowBlankItems save failure"); + Assert.AreEqual(!withDefaults, field.Outline, "Outline save failure"); + Assert.AreEqual(!withDefaults, field.Compact, "Compact save failure"); + Assert.AreEqual(withDefaults, field.Collapsed, "Collapsed save failure"); + Assert.AreEqual(withDefaults, field.InsertBlankLines, "InsertBlankLines save failure"); + Assert.AreEqual(withDefaults, field.RepeatItemLabels, "RepeatItemLabels save failure"); + Assert.AreEqual(withDefaults, field.InsertPageBreaks, "InsertPageBreaks save failure"); + Assert.AreEqual(withDefaults, field.IncludeNewItemsInFilter, "IncludeNewItemsInFilter save failure"); + } + } +} diff --git a/ClosedXML_Tests/Excel/Protection/HashAlgorithmTests.cs b/ClosedXML_Tests/Excel/Protection/HashAlgorithmTests.cs new file mode 100644 index 0000000..5955212 --- /dev/null +++ b/ClosedXML_Tests/Excel/Protection/HashAlgorithmTests.cs @@ -0,0 +1,30 @@ +using ClosedXML.Utils; +using NUnit.Framework; +using static ClosedXML.Excel.XLProtectionAlgorithm; + +namespace ClosedXML_Tests.Excel.Protection +{ + public class HashAlgorithmTests + { + [Test] + public void TestEmptyPassword() + { + Assert.IsEmpty(CryptographicAlgorithms.GetPasswordHash(Algorithm.SHA512, string.Empty)); + Assert.IsEmpty(CryptographicAlgorithms.GetPasswordHash(Algorithm.SimpleHash, string.Empty)); + } + + [Test] + public void TestSHA512() + { + var hash = CryptographicAlgorithms.GetPasswordHash(Algorithm.SHA512, "12345", "aVvPw1DNH3evPqRAd/y3UQ==", 100000); + Assert.AreEqual("E+qAhyIg/HM0dUrPaENfimFOZp7wlOkJsf/sdG+AGHOA9grOv7VLb1ik2vuYohljI9G36e0ea9wnixCK0MMuyQ==", hash); + } + + [Test] + public void TestSimple() + { + var hash = CryptographicAlgorithms.GetPasswordHash(Algorithm.SimpleHash, "12345"); + Assert.AreEqual("CA9C", hash); + } + } +} diff --git a/ClosedXML_Tests/Excel/Protection/XLSheetProtectionTests.cs b/ClosedXML_Tests/Excel/Protection/XLSheetProtectionTests.cs new file mode 100644 index 0000000..19498b5 --- /dev/null +++ b/ClosedXML_Tests/Excel/Protection/XLSheetProtectionTests.cs @@ -0,0 +1,193 @@ +// Keep this file CodeMaid organised and cleaned +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.IO; +using System.Linq; +using static ClosedXML.Excel.XLProtectionAlgorithm; + +namespace ClosedXML_Tests.Excel.Worksheets +{ + [TestFixture] + public class XLSheetProtectionTests + { + [Test] + public void AllowEverything() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Protect().AllowedElements = XLSheetProtectionElements.Everything; + + foreach (var element in Enum.GetValues(typeof(XLSheetProtectionElements)).Cast()) + Assert.IsTrue(ws.Protection.AllowedElements.HasFlag(element), element.ToString()); + } + + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Protect().AllowElement(XLSheetProtectionElements.Everything); + + foreach (var element in Enum.GetValues(typeof(XLSheetProtectionElements)).Cast()) + Assert.IsTrue(ws.Protection.AllowedElements.HasFlag(element), element.ToString()); + } + + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Protect().AllowEverything(); + + foreach (var element in Enum.GetValues(typeof(XLSheetProtectionElements)).Cast()) + Assert.IsTrue(ws.Protection.AllowedElements.HasFlag(element), element.ToString()); + } + } + + [Test] + public void AllowNothing() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Protect().AllowedElements = XLSheetProtectionElements.None; + + foreach (var element in Enum.GetValues(typeof(XLSheetProtectionElements)) + .Cast() + .Where(e => e != XLSheetProtectionElements.None)) + + Assert.IsFalse(ws.Protection.AllowedElements.HasFlag(element), element.ToString()); + } + + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Protect().AllowNone(); + + foreach (var element in Enum.GetValues(typeof(XLSheetProtectionElements)) + .Cast() + .Where(e => e != XLSheetProtectionElements.None)) + + Assert.IsFalse(ws.Protection.AllowedElements.HasFlag(element), element.ToString()); + } + } + + [Test] + public void ChangeHashingAlgorithm() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + ws.Protect("123", Algorithm.SimpleHash); + + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + Assert.IsTrue(ws.Protection.IsProtected); + Assert.AreEqual(Algorithm.SimpleHash, ws.Protection.Algorithm); + + ws.Unprotect("123"); + ws.Protect("123", Algorithm.SHA512); + wb.Save(); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + Assert.IsTrue(ws.Protection.IsProtected); + Assert.AreEqual(Algorithm.SHA512, ws.Protection.Algorithm); + + Assert.DoesNotThrow(() => ws.Unprotect("123")); + } + } + } + + [Test] + public void CopyProtectionFromAnotherSheet() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\Misc\SheetProtection.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws1 = wb.Worksheet("Protected Password = 123"); + var p1 = ws1.Protection.CastTo(); + Assert.IsTrue(p1.IsProtected); + + var ws2 = ws1.CopyTo("New worksheet"); + Assert.IsFalse(ws2.Protection.IsProtected); + var p2 = ws2.Protection.CopyFrom(p1).CastTo(); + + Assert.IsTrue(p2.IsProtected); + Assert.IsTrue(p2.IsPasswordProtected); + Assert.AreEqual(p1.Algorithm, p2.Algorithm); + Assert.AreEqual(p1.PasswordHash, p2.PasswordHash); + Assert.AreEqual(p1.Base64EncodedSalt, p2.Base64EncodedSalt); + Assert.AreEqual(p1.SpinCount, p2.SpinCount); + + Assert.IsTrue(p2.AllowedElements.HasFlag(XLSheetProtectionElements.InsertColumns)); + Assert.IsTrue(p2.AllowedElements.HasFlag(XLSheetProtectionElements.InsertRows)); + Assert.IsFalse(p2.AllowedElements.HasFlag(XLSheetProtectionElements.InsertHyperlinks)); + + Assert.Throws(() => ws2.Unprotect()); + ws2.Unprotect("123"); + } + } + + [Test] + public void SetWorksheetProtectionCloning() + { + var ws1 = new XLWorkbook().AddWorksheet(); + var ws2 = new XLWorkbook().AddWorksheet(); + + ws1.Protect("123") + .AllowElement(XLSheetProtectionElements.FormatEverything) + .DisallowElement(XLSheetProtectionElements.FormatCells); + + Assert.AreEqual(XLSheetProtectionElements.FormatColumns | XLSheetProtectionElements.FormatRows | XLSheetProtectionElements.SelectEverything, ws1.Protection.AllowedElements); + + ws2.Protection = ws1.Protection; + + Assert.IsFalse(ReferenceEquals(ws1.Protection, ws2.Protection)); + Assert.IsTrue(ws2.Protection.IsProtected); + Assert.AreEqual(XLSheetProtectionElements.FormatColumns | XLSheetProtectionElements.FormatRows | XLSheetProtectionElements.SelectEverything, ws2.Protection.AllowedElements); + Assert.AreEqual((ws1.Protection as XLSheetProtection).PasswordHash, (ws2.Protection as XLSheetProtection).PasswordHash); + } + + [Test] + public void TestUnprotectWorksheetWithNoPassword() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\SHA512PasswordProtection.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet("Sheet1"); + Assert.IsTrue(ws.Protection.IsProtected); + ws.Unprotect(); + Assert.IsFalse(ws.Protection.IsProtected); + } + } + + [Test] + public void TestWorksheetWithSHA512Protection() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\SHA512PasswordProtection.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet("Sheet2"); + Assert.IsTrue(ws.Protection.IsProtected); + + // Password required + Assert.Throws(() => ws.Unprotect()); + + Assert.AreEqual(Algorithm.SHA512, ws.Protection.Algorithm); + ws.Unprotect("abc"); + Assert.IsFalse(ws.Protection.IsProtected); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Protection/XLWorkbookProtectionTests.cs b/ClosedXML_Tests/Excel/Protection/XLWorkbookProtectionTests.cs new file mode 100644 index 0000000..4a690e2 --- /dev/null +++ b/ClosedXML_Tests/Excel/Protection/XLWorkbookProtectionTests.cs @@ -0,0 +1,329 @@ +// Keep this file CodeMaid organised and cleaned +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using static ClosedXML.Excel.XLProtectionAlgorithm; + +namespace ClosedXML_Tests +{ + public class XLWorkbookProtectionTests + { + [Test] + public void CanChangeProtectionAlgorithm() + { + using (var ms = new MemoryStream()) + { + using (var stream = GetProtectedWorkbookStreamWithPassword()) + using (var wb = new XLWorkbook(stream)) + { + Assert.AreEqual(Algorithm.SHA512, wb.Protection.Algorithm); + wb.Unprotect("12345"); + wb.Protect("12345", Algorithm.SimpleHash); + + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + Assert.IsTrue(wb.IsPasswordProtected); + Assert.AreEqual(Algorithm.SimpleHash, wb.Protection.Algorithm); + } + } + } + + [Test] + public void CanChangeToPasswordProtected() + { + using (var ms = new MemoryStream()) + { + using (var stream = GetProtectedWorkbookStreamWithoutPassword()) + using (var wb = new XLWorkbook(stream)) + + { + wb.Unprotect(); + wb.Protection.Protect("12345"); + + Assert.IsTrue(wb.Protection.IsPasswordProtected); + + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + Assert.IsTrue(wb.Protection.IsPasswordProtected); + Assert.AreEqual(Algorithm.SimpleHash, wb.Protection.Algorithm); + Assert.AreNotEqual("", wb.Protection.PasswordHash); + } + } + } + + [Test] + public void CanChangeToProtectedWithoutPassword() + { + using (var ms = new MemoryStream()) + { + using (var stream = GetProtectedWorkbookStreamWithPassword()) + using (var wb = new XLWorkbook(stream)) + + { + wb.Unprotect("12345"); + wb.Protection.Protect(); + + Assert.IsFalse(wb.Protection.IsPasswordProtected); + Assert.IsTrue(wb.Protection.IsProtected); + + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + Assert.IsFalse(wb.Protection.IsPasswordProtected); + Assert.IsTrue(wb.Protection.IsProtected); + Assert.AreEqual(Algorithm.SimpleHash, wb.Protection.Algorithm); + Assert.AreEqual("", wb.Protection.PasswordHash); + } + } + } + + [Test] + public void CannotUnprotectIfNoPassword() + { + using (var stream = GetProtectedWorkbookStreamWithoutPassword()) + using (var wb = new XLWorkbook(stream)) + { + var ex = Assert.Throws(() => wb.Unprotect("dummy password")); + Assert.AreEqual("Invalid password", ex.Message); + } + } + + [Test] + public void CannotUnprotectWithoutPassword() + { + using (var stream = GetProtectedWorkbookStreamWithPassword()) + using (var wb = new XLWorkbook(stream)) + { + var ex = Assert.Throws(() => wb.Unprotect()); + Assert.AreEqual("The workbook structure is password protected", ex.Message); + } + } + + [Test] + [Theory] + public void CanProtectWithPassword(Algorithm algorithm) + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + wb.AddWorksheet(); + + Assert.IsFalse(wb.Protection.IsProtected); + + wb.Protection.Protect("12345", algorithm); + + wb.Protection.AllowNone(); + Assert.IsFalse(wb.Protection.AllowedElements.HasFlag(XLWorkbookProtectionElements.Structure)); + Assert.IsFalse(wb.Protection.AllowedElements.HasFlag(XLWorkbookProtectionElements.Windows)); + + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + Assert.IsTrue(wb.Protection.IsPasswordProtected); + Assert.IsTrue(wb.Protection.IsProtected); + + Assert.AreEqual(algorithm, wb.Protection.Algorithm); + Assert.AreNotEqual("", wb.Protection.PasswordHash); + + Assert.IsFalse(wb.Protection.AllowedElements.HasFlag(XLWorkbookProtectionElements.Structure)); + Assert.IsFalse(wb.Protection.AllowedElements.HasFlag(XLWorkbookProtectionElements.Windows)); + + var ex = Assert.Throws(() => wb.Unprotect("dummy password")); + Assert.AreEqual("Invalid password", ex.Message); + + wb.Protection.Unprotect("12345"); + + wb.Save(); + } + } + } + + [Test] + public void CanUnprotectWithoutPassword() + { + using (var ms = new MemoryStream()) + { + using (var stream = GetProtectedWorkbookStreamWithoutPassword()) + using (var wb = new XLWorkbook(stream)) + { + // Unprotect without password + wb.Unprotect(); + + Assert.IsFalse(wb.Protection.IsProtected); + + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + Assert.IsFalse(wb.Protection.IsProtected); + } + } + } + + [Test] + public void CanUnprotectWithPassword() + { + using (var ms = new MemoryStream()) + { + using (var stream = GetProtectedWorkbookStreamWithPassword()) + using (var wb = new XLWorkbook(stream)) + { + // Unprotect with password + wb.Unprotect("12345"); + + Assert.IsFalse(wb.Protection.IsProtected); + + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + Assert.IsFalse(wb.Protection.IsProtected); + } + } + } + + [Test] + public void CopyProtectionFromAnotherWorkbook() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\Misc\WorkbookProtection.xlsx"))) + using (var wb1 = new XLWorkbook(stream)) + using (var wb2 = new XLWorkbook()) + { + wb2.AddWorksheet(); + + var p1 = wb1.Protection.CastTo(); + Assert.IsTrue(p1.IsProtected); + + Assert.IsFalse(wb2.Protection.IsProtected); + var p2 = wb2.Protection.CopyFrom(wb1.Protection).CastTo(); + + Assert.IsTrue(p2.IsProtected); + Assert.IsTrue(p2.IsPasswordProtected); + Assert.AreEqual(p1.Algorithm, p2.Algorithm); + Assert.AreEqual(p1.PasswordHash, p2.PasswordHash); + Assert.AreEqual(p1.Base64EncodedSalt, p2.Base64EncodedSalt); + Assert.AreEqual(p1.SpinCount, p2.SpinCount); + + Assert.IsTrue(p2.AllowedElements.HasFlag(XLWorkbookProtectionElements.Windows)); + Assert.IsFalse(p2.AllowedElements.HasFlag(XLWorkbookProtectionElements.Structure)); + + Assert.Throws(() => wb2.Unprotect()); + wb2.Unprotect("Abc@123"); + } + } + + [Test] + public void IXLProtectableTests() + { + using var wb = new XLWorkbook(); + Enumerable.Range(1, 5).ForEach(i => wb.AddWorksheet()); + + var list = new List() { wb }; + list.AddRange(wb.Worksheets); + + list.ForEach(el => el.Protect()); + + list.ForEach(el => Assert.IsTrue(el.IsProtected)); + list.ForEach(el => Assert.IsFalse(el.IsPasswordProtected)); + + list.ForEach(el => el.Unprotect()); + + list.ForEach(el => Assert.IsFalse(el.IsProtected)); + list.ForEach(el => Assert.IsFalse(el.IsPasswordProtected)); + + list.ForEach(el => el.Protect("password")); + + list.ForEach(el => Assert.IsTrue(el.IsProtected)); + list.ForEach(el => Assert.IsTrue(el.IsPasswordProtected)); + + list.ForEach(el => el.Unprotect("password")); + + list.ForEach(el => Assert.IsFalse(el.IsProtected)); + list.ForEach(el => Assert.IsFalse(el.IsPasswordProtected)); + } + + [Test] + public void LoadProtectionWithoutPasswordFromFile() + { + using (var stream = GetProtectedWorkbookStreamWithoutPassword()) + using (var wb = new XLWorkbook(stream)) + { + Assert.IsFalse(wb.Protection.IsPasswordProtected); + Assert.IsTrue(wb.Protection.IsProtected); + Assert.AreEqual("", wb.Protection.PasswordHash); + Assert.IsTrue(wb.Protection.AllowedElements.HasFlag(XLWorkbookProtectionElements.Windows)); + Assert.IsFalse(wb.Protection.AllowedElements.HasFlag(XLWorkbookProtectionElements.Structure)); + } + } + + [Test] + public void LoadProtectionWithPasswordFromFile() + { + using (var stream = GetProtectedWorkbookStreamWithPassword()) + using (var wb = new XLWorkbook(stream)) + { + Assert.IsTrue(wb.Protection.IsPasswordProtected); + Assert.AreNotEqual("", wb.Protection.PasswordHash); + Assert.IsTrue(wb.Protection.AllowedElements.HasFlag(XLWorkbookProtectionElements.Windows)); + Assert.IsFalse(wb.Protection.AllowedElements.HasFlag(XLWorkbookProtectionElements.Structure)); + } + } + + [Test] + public void SetWorkbookProtectionCloning() + { + var wb1 = new XLWorkbook(); + var wb2 = new XLWorkbook(); + + wb1.AddWorksheet(); + wb2.AddWorksheet(); + + wb1.Protect("123", Algorithm.SHA512) + .AllowElement(XLWorkbookProtectionElements.Windows) + .DisallowElement(XLWorkbookProtectionElements.Structure); + + Assert.IsTrue(wb1.Protection.IsProtected); + + Assert.AreEqual(XLWorkbookProtectionElements.Windows, wb1.Protection.AllowedElements); + + wb2.Protection = wb1.Protection; + + Assert.IsFalse(ReferenceEquals(wb1.Protection, wb2.Protection)); + Assert.IsTrue(wb2.Protection.IsProtected); + Assert.AreEqual(XLWorkbookProtectionElements.Windows, wb2.Protection.AllowedElements); + Assert.AreEqual(wb1.Protection.PasswordHash, wb2.Protection.PasswordHash); + } + + private Stream GetProtectedWorkbookStreamWithoutPassword() => TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\Protection\protectstructurewithoutpassword.xlsx")); + + private Stream GetProtectedWorkbookStreamWithPassword() => TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\Protection\protectstructurewithpassword.xlsx")); + } +} diff --git a/ClosedXML_Tests/Excel/Ranges/CopyingRangesTests.cs b/ClosedXML_Tests/Excel/Ranges/CopyingRangesTests.cs new file mode 100644 index 0000000..1925298 --- /dev/null +++ b/ClosedXML_Tests/Excel/Ranges/CopyingRangesTests.cs @@ -0,0 +1,152 @@ +using System.Drawing; +using System.Linq; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class CopyingRangesTests + { + [Test] + public void CopyingColumns() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + IXLColumn column1 = ws.Column(1); + column1.Cell(1).Style.Fill.SetBackgroundColor(XLColor.Red); + column1.Cell(2).Style.Fill.SetBackgroundColor(XLColor.FromArgb(1, 1, 1)); + column1.Cell(3).Style.Fill.SetBackgroundColor(XLColor.FromHtml("#CCCCCC")); + column1.Cell(4).Style.Fill.SetBackgroundColor(XLColor.FromIndex(26)); + column1.Cell(5).Style.Fill.SetBackgroundColor(XLColor.FromColor(Color.MediumSeaGreen)); + column1.Cell(6).Style.Fill.SetBackgroundColor(XLColor.FromName("Blue")); + column1.Cell(7).Style.Fill.SetBackgroundColor(XLColor.FromTheme(XLThemeColor.Accent3)); + + ws.Cell(1, 2).Value = column1; + ws.Cell(1, 3).Value = column1.Column(1, 7); + + IXLColumn column2 = ws.Column(2); + Assert.AreEqual(XLColor.Red, column2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromArgb(1, 1, 1), column2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromHtml("#CCCCCC"), column2.Cell(3).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromIndex(26), column2.Cell(4).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromColor(Color.MediumSeaGreen), + column2.Cell(5).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromName("Blue"), column2.Cell(6).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromTheme(XLThemeColor.Accent3), column2.Cell(7).Style.Fill.BackgroundColor); + + IXLColumn column3 = ws.Column(3); + Assert.AreEqual(XLColor.Red, column3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromArgb(1, 1, 1), column3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromHtml("#CCCCCC"), column3.Cell(3).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromIndex(26), column3.Cell(4).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromColor(Color.MediumSeaGreen), + column3.Cell(5).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromName("Blue"), column3.Cell(6).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromTheme(XLThemeColor.Accent3), column3.Cell(7).Style.Fill.BackgroundColor); + } + + [Test] + public void CopyingRows() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + IXLRow row1 = ws.Row(1); + FillRow(row1); + + ws.Cell(2, 1).Value = row1; + ws.Cell(3, 1).Value = row1.Row(1, 7); + + IXLRow row2 = ws.Row(2); + Assert.AreEqual(XLColor.Red, row2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromArgb(1, 1, 1), row2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromHtml("#CCCCCC"), row2.Cell(3).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromIndex(26), row2.Cell(4).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromColor(Color.MediumSeaGreen), row2.Cell(5).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromName("Blue"), row2.Cell(6).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromTheme(XLThemeColor.Accent3), row2.Cell(7).Style.Fill.BackgroundColor); + + IXLRow row3 = ws.Row(3); + Assert.AreEqual(XLColor.Red, row3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromArgb(1, 1, 1), row3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromHtml("#CCCCCC"), row3.Cell(3).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromIndex(26), row3.Cell(4).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromColor(Color.MediumSeaGreen), row3.Cell(5).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromName("Blue"), row3.Cell(6).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromTheme(XLThemeColor.Accent3), row3.Cell(7).Style.Fill.BackgroundColor); + + Assert.AreEqual(3, ws.ConditionalFormats.Count()); + Assert.IsTrue(ws.ConditionalFormats.Single(x => x.Range.RangeAddress.ToStringRelative() == "B1:B1").Values.Any(v => v.Value.Value == "G1" && v.Value.IsFormula)); + Assert.IsTrue(ws.ConditionalFormats.Single(x => x.Range.RangeAddress.ToStringRelative() == "B2:B2").Values.Any(v => v.Value.Value == "G2" && v.Value.IsFormula)); + Assert.IsTrue(ws.ConditionalFormats.Single(x => x.Range.RangeAddress.ToStringRelative() == "B3:B3").Values.Any(v => v.Value.Value == "G3" && v.Value.IsFormula)); + } + + [Test] + public void CopyingConditionalFormats() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + FillRow(ws.Row(1)); + FillRow(ws.Row(2)); + FillRow(ws.Row(3)); + + ((XLConditionalFormats)ws.ConditionalFormats).Consolidate(); + + ws.Cell(5, 2).Value = ws.Row(2).Row(1, 7); + + Assert.AreEqual(2, ws.ConditionalFormats.Count()); + Assert.IsTrue(ws.ConditionalFormats.Single(x => x.Range.RangeAddress.ToStringRelative() == "B1:B3").Values.Any(v => v.Value.Value == "G1" && v.Value.IsFormula)); + Assert.IsTrue(ws.ConditionalFormats.Single(x => x.Range.RangeAddress.ToStringRelative() == "C5:C5").Values.Any(v => v.Value.Value == "H5" && v.Value.IsFormula)); + } + + [Test] + public void CopyingConditionalFormatsDifferentWorksheets() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + var format = ws1.Range("A1:J2").AddConditionalFormat(); + + var address = format.Ranges + .First() + .FirstCell() + .CellRight(4) + .Address + .ToStringRelative(); + + format.WhenEquals("=" + address) + .Fill + .SetBackgroundColor(XLColor.Blue); + + var ws2 = wb.Worksheets.Add("Sheet2"); + + ws2.FirstCell().Value = ws1.Range("B1:B4"); + + Assert.AreEqual(1, ws2.ConditionalFormats.Count()); + Assert.IsTrue(ws2.ConditionalFormats.All(x => x.Ranges.All(s => s.Worksheet == ws2)), "A conditional format was created for another worksheet."); + Assert.IsTrue(ws2.ConditionalFormats + .Single(x => x.Range.RangeAddress.ToStringRelative() == "A1:A2") + .Values.Any(v => v.Value.Value == "E1" && v.Value.IsFormula), "The formula has not been transferred correctly."); + + Assert.AreEqual("Sheet1", ws1.ConditionalFormats.First().Ranges.First().Worksheet.Name); + Assert.AreEqual("Sheet2", ws2.ConditionalFormats.First().Ranges.First().Worksheet.Name); + Assert.AreEqual("A1:J2", ws1.ConditionalFormats.First().Ranges.First().RangeAddress.ToString()); + Assert.AreEqual("A1:A2", ws2.ConditionalFormats.First().Ranges.First().RangeAddress.ToString()); + } + + private static void FillRow(IXLRow row1) + { + row1.Cell(1).Style.Fill.SetBackgroundColor(XLColor.Red); + row1.Cell(2).Style.Fill.SetBackgroundColor(XLColor.FromArgb(1, 1, 1)); + row1.Cell(3).Style.Fill.SetBackgroundColor(XLColor.FromHtml("#CCCCCC")); + row1.Cell(4).Style.Fill.SetBackgroundColor(XLColor.FromIndex(26)); + row1.Cell(5).Style.Fill.SetBackgroundColor(XLColor.FromColor(Color.MediumSeaGreen)); + row1.Cell(6).Style.Fill.SetBackgroundColor(XLColor.FromName("Blue")); + row1.Cell(7).Style.Fill.SetBackgroundColor(XLColor.FromTheme(XLThemeColor.Accent3)); + + row1.Cell(2).AddConditionalFormat().WhenEquals("=" + row1.FirstCell().CellRight(6).Address.ToStringRelative()).Fill.SetBackgroundColor(XLColor.Blue); + } + } +} diff --git a/ClosedXML_Tests/Excel/Ranges/InsertingRangesTests.cs b/ClosedXML_Tests/Excel/Ranges/InsertingRangesTests.cs new file mode 100644 index 0000000..2f22547 --- /dev/null +++ b/ClosedXML_Tests/Excel/Ranges/InsertingRangesTests.cs @@ -0,0 +1,298 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Linq; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class InsertingRangesTests + { + [Test] + public void InsertingColumnsPreservesFormatting() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + IXLColumn column1 = ws.Column(1); + column1.Style.Fill.SetBackgroundColor(XLColor.FrenchLilac); + column1.Cell(2).Style.Fill.SetBackgroundColor(XLColor.Fulvous); + IXLColumn column2 = ws.Column(2); + column2.Style.Fill.SetBackgroundColor(XLColor.Xanadu); + column2.Cell(2).Style.Fill.SetBackgroundColor(XLColor.MacaroniAndCheese); + + column1.InsertColumnsAfter(1); + column1.InsertColumnsBefore(1); + column2.InsertColumnsBefore(1); + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Column(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FrenchLilac, ws.Column(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FrenchLilac, ws.Column(3).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FrenchLilac, ws.Column(4).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Xanadu, ws.Column(5).Style.Fill.BackgroundColor); + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Cell(2, 1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Fulvous, ws.Cell(2, 2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Fulvous, ws.Cell(2, 3).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Fulvous, ws.Cell(2, 4).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.MacaroniAndCheese, ws.Cell(2, 5).Style.Fill.BackgroundColor); + } + + [Test] + public void InsertingRowsAbove() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + ws.Cell("B3").SetValue("X") + .CellBelow().SetValue("B"); + + IXLRangeRow r = ws.Range("B4").InsertRowsAbove(1).First(); + r.Cell(1).SetValue("A"); + + Assert.AreEqual("X", ws.Cell("B3").GetString()); + Assert.AreEqual("A", ws.Cell("B4").GetString()); + Assert.AreEqual("B", ws.Cell("B5").GetString()); + } + + [Test] + public void InsertingRowsPreservesFormatting() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + IXLRow row1 = ws.Row(1); + row1.Style.Fill.SetBackgroundColor(XLColor.FrenchLilac); + row1.Cell(2).Style.Fill.SetBackgroundColor(XLColor.Fulvous); + IXLRow row2 = ws.Row(2); + row2.Style.Fill.SetBackgroundColor(XLColor.Xanadu); + row2.Cell(2).Style.Fill.SetBackgroundColor(XLColor.MacaroniAndCheese); + + row1.InsertRowsBelow(1); + row1.InsertRowsAbove(1); + row2.InsertRowsAbove(1); + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Row(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FrenchLilac, ws.Row(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FrenchLilac, ws.Row(3).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FrenchLilac, ws.Row(4).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Xanadu, ws.Row(5).Style.Fill.BackgroundColor); + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Cell(1, 2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Fulvous, ws.Cell(2, 2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Fulvous, ws.Cell(3, 2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Fulvous, ws.Cell(4, 2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.MacaroniAndCheese, ws.Cell(5, 2).Style.Fill.BackgroundColor); + } + + [Test] + public void InsertingRowsPreservesComments() + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet1"); + + ws.Cell("A1").SetValue("Insert Below"); + ws.Cell("A2").SetValue("Already existing cell"); + ws.Cell("A3").SetValue("Cell with comment").Comment.AddText("Comment here"); + + ws.Row(1).InsertRowsBelow(2); + Assert.AreEqual("Comment here", ws.Cell("A5").Comment.Text); + } + + [Test] + public void InsertingColumnsPreservesComments() + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet1"); + + ws.Cell("A1").SetValue("Insert to the right"); + ws.Cell("B1").SetValue("Already existing cell"); + ws.Cell("C1").SetValue("Cell with comment").Comment.AddText("Comment here"); + + ws.Column(1).InsertColumnsAfter(2); + Assert.AreEqual("Comment here", ws.Cell("E1").Comment.Text); + } + + [Test] + [TestCase("C4:F7", "C4:F7", 2, "E4:H7")] // Coincide, shift right + [TestCase("C4:F7", "C4:F7", -2, "C4:D7")] // Coincide, shift left + [TestCase("D5:E6", "C4:F7", 2, "F5:G6")] // Inside, shift right + [TestCase("D5:E6", "C4:F7", -2, "C5:C6")] // Inside, shift left + [TestCase("B4:G7", "C4:F7", 2, "B4:I7")] // Includes, shift right + [TestCase("B4:G7", "C4:F7", -2, "B4:E7")] // Includes, shift left + [TestCase("B4:E7", "C4:F7", 2, "B4:G7")] // Intersects at left, shift right + [TestCase("B4:E7", "C4:F7", -2, "B4:C7")] // Intersects at left, shift left + [TestCase("D4:G7", "C4:F7", 2, "F4:I7")] // Intersects at right, shift right + [TestCase("D4:G7", "C4:F7", -2, "C4:E7")] // Intersects at right, shift left + [TestCase("A5:B6", "C4:F7", 2, "A5:B6")] // No intersection, at left, shift right + [TestCase("A5:B6", "C4:F7", -1, "A5:B6")] // No intersection, at left, shift left + [TestCase("H5:I6", "C4:F7", 2, "J5:K6")] // No intersection, at right, shift right + [TestCase("H5:I6", "C4:F7", -2, "F5:G6")] // No intersection, at right, shift left + [TestCase("C8:F11", "C4:F7", 2, "C8:F11")] // Different rows + [TestCase("B1:B8", "A1:C4", 1, "B1:B8")] // More rows, shift right + [TestCase("B1:B8", "A1:C4", -1, "B1:B8")] // More rows, shift left + public void ShiftColumnsValid(string thisRangeAddress, string shiftedRangeAddress, int shiftedColumns, string expectedRange) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + var thisRange = ws.Range(thisRangeAddress) as XLRange; + var shiftedRange = ws.Range(shiftedRangeAddress) as XLRange; + + thisRange.WorksheetRangeShiftedColumns(shiftedRange, shiftedColumns); + + Assert.IsTrue(thisRange.RangeAddress.IsValid); + Assert.AreEqual(expectedRange, thisRange.RangeAddress.ToString()); + } + } + + [Test] + [TestCase("B1:B4", "A1:C4", -2)] // Shift left too much + public void ShiftColumnsInvalid(string thisRangeAddress, string shiftedRangeAddress, int shiftedColumns) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + var thisRange = ws.Range(thisRangeAddress) as XLRange; + var shiftedRange = ws.Range(shiftedRangeAddress) as XLRange; + + thisRange.WorksheetRangeShiftedColumns(shiftedRange, shiftedColumns); + + Assert.IsFalse(thisRange.RangeAddress.IsValid); + } + } + + [Test] + [TestCase("C4:F7", "C4:F7", 2, "C6:F9")] // Coincide, shift down + [TestCase("C4:F7", "C4:F7", -2, "C4:F5")] // Coincide, shift up + [TestCase("D5:E6", "C4:F7", 2, "D7:E8")] // Inside, shift down + [TestCase("D5:E6", "C4:F7", -2, "D4:E4")] // Inside, shift up + [TestCase("C3:F8", "C4:F7", 2, "C3:F10")] // Includes, shift down + [TestCase("C3:F8", "C4:F7", -2, "C3:F6")] // Includes, shift up + [TestCase("C3:F6", "C4:F7", 2, "C3:F8")] // Intersects at top, shift down + [TestCase("C2:F6", "C4:F7", -3, "C2:F3")] // Intersects at top, shift up to the sheet boundary + [TestCase("C3:F6", "C4:F7", -2, "C3:F4")] // Intersects at top, shift up + [TestCase("C5:F8", "C4:F7", 2, "C7:F10")] // Intersects at bottom, shift down + [TestCase("C5:F8", "C4:F7", -2, "C4:F6")] // Intersects at bottom, shift up + [TestCase("C1:F3", "C4:F7", 2, "C1:F3")] // No intersection, at top, shift down + [TestCase("C1:F3", "C4:F7", -2, "C1:F3")] // No intersection, at top, shift up + [TestCase("C8:F10", "C4:F7", 2, "C10:F12")] // No intersection, at bottom, shift down + [TestCase("C8:F10", "C4:F7", -2, "C6:F8")] // No intersection, at bottom, shift up + [TestCase("G4:J7", "C4:F7", 2, "G4:J7")] // Different columns + [TestCase("A2:D2", "A1:C4", 1, "A2:D2")] // More columns, shift down + [TestCase("A2:D2", "A1:C4", -1, "A2:D2")] // More columns, shift up + public void ShiftRowsValid(string thisRangeAddress, string shiftedRangeAddress, int shiftedRows, string expectedRange) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + var thisRange = ws.Range(thisRangeAddress) as XLRange; + var shiftedRange = ws.Range(shiftedRangeAddress) as XLRange; + + thisRange.WorksheetRangeShiftedRows(shiftedRange, shiftedRows); + + Assert.IsTrue(thisRange.RangeAddress.IsValid); + Assert.AreEqual(expectedRange, thisRange.RangeAddress.ToString()); + } + } + + [Test] + [TestCase("A2:C2", "A1:C4", -2)] // Shift up too much + public void ShiftRowsInvalid(string thisRangeAddress, string shiftedRangeAddress, int shiftedRows) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + var thisRange = ws.Range(thisRangeAddress) as XLRange; + var shiftedRange = ws.Range(shiftedRangeAddress) as XLRange; + + thisRange.WorksheetRangeShiftedRows(shiftedRange, shiftedRows); + + Assert.IsFalse(thisRange.RangeAddress.IsValid); + } + } + + [Test] + public void InsertZeroColumnsFails() + { + var ws = new XLWorkbook().AddWorksheet("Sheet1"); + var range = ws.FirstCell().AsRange(); + Assert.Throws(typeof(ArgumentOutOfRangeException), () => range.InsertColumnsAfter(0)); + Assert.Throws(typeof(ArgumentOutOfRangeException), () => range.InsertColumnsBefore(0)); + } + + [Test] + public void InsertNegativeNumberOfColumnsFails() + { + var ws = new XLWorkbook().AddWorksheet("Sheet1"); + var range = ws.FirstCell().AsRange(); + Assert.Throws(typeof(ArgumentOutOfRangeException), () => range.InsertColumnsAfter(-1)); + Assert.Throws(typeof(ArgumentOutOfRangeException), () => range.InsertColumnsBefore(-1)); + } + + [Test] + public void InsertTooLargeNumberOfColumnsFails() + { + var ws = new XLWorkbook().AddWorksheet("Sheet1"); + var range = ws.FirstCell().AsRange(); + Assert.Throws(typeof(ArgumentOutOfRangeException), () => range.InsertColumnsAfter(16385)); + Assert.Throws(typeof(ArgumentOutOfRangeException), () => range.InsertColumnsBefore(16385)); + } + + [Test] + public void InsertZeroRowsFails() + { + var ws = new XLWorkbook().AddWorksheet("Sheet1"); + var range = ws.FirstCell().AsRange(); + Assert.Throws(typeof(ArgumentOutOfRangeException), () => range.InsertRowsAbove(0)); + Assert.Throws(typeof(ArgumentOutOfRangeException), () => range.InsertRowsBelow(0)); + } + + [Test] + public void InsertNegativeNumberOfRowsFails() + { + var ws = new XLWorkbook().AddWorksheet("Sheet1"); + var range = ws.FirstCell().AsRange(); + Assert.Throws(typeof(ArgumentOutOfRangeException), () => range.InsertRowsAbove(-1)); + Assert.Throws(typeof(ArgumentOutOfRangeException), () => range.InsertRowsBelow(-1)); + } + + [Test] + public void InsertTooLargeNumberOrRowsFails() + { + var ws = new XLWorkbook().AddWorksheet("Sheet1"); + var range = ws.FirstCell().AsRange(); + Assert.Throws(typeof(ArgumentOutOfRangeException), () => range.InsertRowsAbove(1048577)); + Assert.Throws(typeof(ArgumentOutOfRangeException), () => range.InsertRowsBelow(1048577)); + } + + [Test] + public void MergedRangesConsistencyWhenInsertingRows() + { + // https://github.com/ClosedXML/ClosedXML/issues/1013 + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + //create merged row + ws.Cell("A1").Value = "Merged Row(1) of Range (A1:F1)"; + ws.Range("A1:F1").Row(1).Merge(); + + var row = ws.FirstRow(); + + // Add some lines and copy format & merging + for (var r = 1; r <= 10; r++) + { + row.InsertRowsBelow(1); // insert a row below row 1, as a row 2 + row.CopyTo(row.RowBelow()); // copy format and merging from row 1 to row 2 + + var duplicates = ws.MergedRanges + .GroupBy(s => s.ToString()) + .Where(g => g.Count() > 1) + .Select(y => new { Element = y.Key, Counter = y.Count() }) + .ToList(); + + Assert.AreEqual(0, duplicates.Count); + } + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Ranges/MergedRangesTests.cs b/ClosedXML_Tests/Excel/Ranges/MergedRangesTests.cs new file mode 100644 index 0000000..25599f8 --- /dev/null +++ b/ClosedXML_Tests/Excel/Ranges/MergedRangesTests.cs @@ -0,0 +1,443 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System.Linq; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class MergedRangesTests + { + [Test] + public void LastCellFromMerge() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + ws.Range("B2:D4").Merge(); + + string first = ws.FirstCellUsed(XLCellsUsedOptions.All).Address.ToStringRelative(); + string last = ws.LastCellUsed(XLCellsUsedOptions.All).Address.ToStringRelative(); + + Assert.AreEqual("B2", first); + Assert.AreEqual("D4", last); + } + + [TestCase("A1:A2", "A1:A2")] + [TestCase("A2:B2", "A2:B2")] + [TestCase("A3:C3", "A3:E3")] + [TestCase("B4:B6", "B4:B6")] + [TestCase("C7:D7", "E7:F7")] + public void MergedRangesShiftedOnColumnInsert(string originalRange, string expectedRange) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("MRShift"); + var range = ws.Range(originalRange).Merge(); + + ws.Column(2).InsertColumnsAfter(2); + + var mr = ws.MergedRanges.ToArray(); + Assert.AreEqual(1, mr.Length); + Assert.AreSame(range, mr.Single()); + Assert.AreEqual(expectedRange, range.RangeAddress.ToString()); + } + } + + [TestCase("A1:B1", "A1:B1")] + [TestCase("B1:B2", "B1:B2")] + [TestCase("C1:C3", "C1:C5")] + [TestCase("D2:F2", "D2:F2")] + [TestCase("G4:G5", "G6:G7")] + public void MergedRangesShiftedOnRowInsert(string originalRange, string expectedRange) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("MRShift"); + var range = ws.Range(originalRange).Merge(); + + ws.Row(2).InsertRowsBelow(2); + + var mr = ws.MergedRanges.ToArray(); + Assert.AreEqual(1, mr.Length); + Assert.AreSame(range, mr.Single()); + Assert.AreEqual(expectedRange, range.RangeAddress.ToString()); + } + } + + [TestCase("A1:A2", true, "A1:A2")] + [TestCase("A2:B2", true, "A2:A2")] + [TestCase("A3:C3", true, "A3:B3")] + [TestCase("B4:B6", false, "")] + [TestCase("C7:D7", true, "B7:C7")] + public void MergedRangesShiftedOnColumnDelete(string originalRange, bool expectedExist, string expectedRange) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("MRShift"); + var range = ws.Range(originalRange).Merge(); + + ws.Column(2).Delete(); + + var mr = ws.MergedRanges.ToArray(); + if (expectedExist) + { + Assert.AreEqual(1, mr.Length); + Assert.AreSame(range, mr.Single()); + Assert.AreEqual(expectedRange, range.RangeAddress.ToString()); + } + else + { + Assert.AreEqual(0, mr.Length); + Assert.IsFalse(range.RangeAddress.IsValid); + } + } + } + + [TestCase("A1:B1", true, "A1:B1")] + [TestCase("B1:B2", true, "B1:B1")] + [TestCase("C1:C3", true, "C1:C2")] + [TestCase("D2:F2", false, "")] + [TestCase("G4:G5", true, "G3:G4")] + public void MergedRangesShiftedOnRowDelete(string originalRange, bool expectedExist, string expectedRange) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("MRShift"); + var range = ws.Range(originalRange).Merge(); + + ws.Row(2).Delete(); + + var mr = ws.MergedRanges.ToArray(); + if (expectedExist) + { + Assert.AreEqual(1, mr.Length); + Assert.AreSame(range, mr.Single()); + Assert.AreEqual(expectedRange, range.RangeAddress.ToString()); + } + else + { + Assert.AreEqual(0, mr.Length); + Assert.IsFalse(range.RangeAddress.IsValid); + } + } + } + + [Test] + public void ShiftRangeRightBreaksMerges() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("MRShift"); + ws.Range("B2:C3").Merge(); + ws.Range("B4:C5").Merge(); + ws.Range("F2:G3").Merge(); // to be broken + ws.Range("F4:G5").Merge(); // to be broken + ws.Range("H1:I2").Merge(); + ws.Range("H5:I6").Merge(); + + ws.Range("D3:E4").InsertColumnsAfter(2); + + var mr = ws.MergedRanges.ToArray(); + Assert.AreEqual(4, mr.Length); + Assert.AreEqual("H1:I2", mr[0].RangeAddress.ToString()); + Assert.AreEqual("B2:C3", mr[1].RangeAddress.ToString()); + Assert.AreEqual("B4:C5", mr[2].RangeAddress.ToString()); + Assert.AreEqual("H5:I6", mr[3].RangeAddress.ToString()); + } + } + + [Test] + public void ShiftRangeLeftBreaksMerges() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("MRShift"); + ws.Range("B2:C3").Merge(); + ws.Range("B4:C5").Merge(); + ws.Range("F2:G3").Merge(); // to be broken + ws.Range("F4:G5").Merge(); // to be broken + ws.Range("H1:I2").Merge(); + ws.Range("H5:I6").Merge(); + + ws.Range("D3:E4").Delete(XLShiftDeletedCells.ShiftCellsLeft); + + var mr = ws.MergedRanges.ToArray(); + Assert.AreEqual(4, mr.Length); + Assert.AreEqual("H1:I2", mr[0].RangeAddress.ToString()); + Assert.AreEqual("B2:C3", mr[1].RangeAddress.ToString()); + Assert.AreEqual("B4:C5", mr[2].RangeAddress.ToString()); + Assert.AreEqual("H5:I6", mr[3].RangeAddress.ToString()); + } + } + + [Test] + public void RangeShiftDownBreaksMerges() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("MRShift"); + ws.Range("B2:C3").Merge(); + ws.Range("D2:E3").Merge(); + ws.Range("B6:C7").Merge(); // to be broken + ws.Range("D6:E7").Merge(); // to be broken + ws.Range("A8:B9").Merge(); + ws.Range("E8:F9").Merge(); + + ws.Range("C4:D5").InsertRowsBelow(2); + + var mr = ws.MergedRanges.ToArray(); + Assert.AreEqual(4, mr.Length); + Assert.AreEqual("B2:C3", mr[0].RangeAddress.ToString()); + Assert.AreEqual("D2:E3", mr[1].RangeAddress.ToString()); + Assert.AreEqual("A8:B9", mr[2].RangeAddress.ToString()); + Assert.AreEqual("E8:F9", mr[3].RangeAddress.ToString()); + } + } + + [Test] + public void RangeShiftUpBreaksMerges() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("MRShift"); + ws.Range("B2:C3").Merge(); + ws.Range("D2:E3").Merge(); + ws.Range("B6:C7").Merge(); // to be broken + ws.Range("D6:E7").Merge(); // to be broken + ws.Range("A8:B9").Merge(); + ws.Range("E8:F9").Merge(); + + ws.Range("C4:D5").Delete(XLShiftDeletedCells.ShiftCellsUp); + + var mr = ws.MergedRanges.ToArray(); + Assert.AreEqual(4, mr.Length); + Assert.AreEqual("B2:C3", mr[0].RangeAddress.ToString()); + Assert.AreEqual("D2:E3", mr[1].RangeAddress.ToString()); + Assert.AreEqual("A8:B9", mr[2].RangeAddress.ToString()); + Assert.AreEqual("E8:F9", mr[3].RangeAddress.ToString()); + } + } + + [Test] + public void MergedCellsAcquireFirstCellStyle() + { + using (XLWorkbook wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Style.Fill.BackgroundColor = XLColor.Red; + ws.Cell("A2").Style.Fill.BackgroundColor = XLColor.Yellow; + ws.Cell("A3").Style.Fill.BackgroundColor = XLColor.Green; + ws.Range("A1:A3").Merge(); + + Assert.AreEqual(XLColor.Red, ws.Cell("A1").Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Cell("A2").Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Cell("A3").Style.Fill.BackgroundColor); + } + } + + [Test] + public void MergedCellsLooseData() + { + using (XLWorkbook wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Range("A1:A3").SetValue(100); + ws.Range("A1:A3").Merge(); + + Assert.AreEqual(100, ws.Cell("A1").Value); + Assert.AreEqual("", ws.Cell("A2").Value); + Assert.AreEqual("", ws.Cell("A3").Value); + } + } + + [Test] + public void MergedCellsLooseConditionalFormats() + { + using (XLWorkbook wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").AddConditionalFormat().WhenContains("1").Fill.BackgroundColor = XLColor.Red; + ws.Cell("A2").AddConditionalFormat().WhenContains("2").Fill.BackgroundColor = XLColor.Yellow; + + ws.Range("A1:A2").Merge(); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + Assert.AreEqual("A1:A1", ws.ConditionalFormats.Single().Ranges.Single().RangeAddress.ToString()); + } + } + + [Test] + public void MergedCellsLooseDataValidation() + { + using (XLWorkbook wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").NewDataValidation.WholeNumber.Between(1, 2); + ws.Cell("A2").NewDataValidation.Date.GreaterThan(new System.DateTime(2018, 1, 1)); + + ws.Range("A1:A2").Merge(); + + Assert.IsTrue(ws.Cell("A1").HasDataValidation); + Assert.AreEqual("1", ws.Cell("A1").DataValidation.MinValue); + Assert.AreEqual("2", ws.Cell("A1").DataValidation.MaxValue); + Assert.IsFalse(ws.Cell("A2").HasDataValidation); + } + } + + [Test] + public void UnmergedCellsPreserveStyle() + { + using (XLWorkbook wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var range = ws.Range("B2:D4"); + range.Style.Fill.SetBackgroundColor(XLColor.Yellow); + range.Style.Border.SetOutsideBorder(XLBorderStyleValues.Thick) + .Border.SetOutsideBorderColor(XLColor.DarkBlue) + .Border.SetInsideBorder(XLBorderStyleValues.Thin) + .Border.SetInsideBorderColor(XLColor.Pink); + range.Cells().ForEach(c => c.Value = c.Address.ToString()); + + var firstCell = ws.Cell("B2"); + firstCell.Style.Fill.SetBackgroundColor(XLColor.Red) + .Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center) + .Font.SetBold(); + + range.Merge(); + range.Unmerge(); + + Assert.IsTrue(range.Cells().All(c => c.Style.Fill.BackgroundColor == XLColor.Red)); + Assert.IsTrue(range.Cells().Where(c => c != firstCell).All(c => c.GetString().Length == 0)); + Assert.AreEqual("B2", firstCell.Value); + + Assert.AreEqual(XLBorderStyleValues.Thick, ws.Cell("B2").Style.Border.TopBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("B2").Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("B2").Style.Border.BottomBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, ws.Cell("B2").Style.Border.LeftBorder); + + Assert.AreEqual(XLBorderStyleValues.Thick, ws.Cell("C2").Style.Border.TopBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("C2").Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("C2").Style.Border.BottomBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("C2").Style.Border.LeftBorder); + + Assert.AreEqual(XLBorderStyleValues.Thick, ws.Cell("D2").Style.Border.TopBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, ws.Cell("D2").Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("D2").Style.Border.BottomBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("D2").Style.Border.LeftBorder); + + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("B3").Style.Border.TopBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("B3").Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("B3").Style.Border.BottomBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, ws.Cell("B3").Style.Border.LeftBorder); + + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("C3").Style.Border.TopBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("C3").Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("C3").Style.Border.BottomBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("C3").Style.Border.LeftBorder); + + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("D3").Style.Border.TopBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, ws.Cell("D3").Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("D3").Style.Border.BottomBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("D3").Style.Border.LeftBorder); + + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("B4").Style.Border.TopBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("B4").Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, ws.Cell("B4").Style.Border.BottomBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, ws.Cell("B4").Style.Border.LeftBorder); + + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("C4").Style.Border.TopBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("C4").Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, ws.Cell("C4").Style.Border.BottomBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("C4").Style.Border.LeftBorder); + + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("D4").Style.Border.TopBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, ws.Cell("D4").Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, ws.Cell("D4").Style.Border.BottomBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("D4").Style.Border.LeftBorder); + } + } + + [Test] + public void MergedRangesCellValuesShouldNotBeSet() + { + using (var workbook = new XLWorkbook()) + { + var ws = workbook.AddWorksheet(); + ws.Range("A2:A4").Merge(); + ws.Cell("A2").Value = "1"; + ws.Cell("A3").Value = "1"; + ws.Cell("A4").Value = "1"; + ws.Cell("B1").FormulaA1 = "SUM(A:A)"; + Assert.AreEqual(1, ws.Cell("B1").Value); + } + + using (var workbook = new XLWorkbook()) + { + var ws = workbook.AddWorksheet(); + ws.Range("A2:A4").Merge().SetValue(1); + ws.Cell("B1").FormulaA1 = "SUM(A:A)"; + Assert.AreEqual(1, ws.Cell("B1").Value); + } + } + + [Test] + public void MergedRangesCellFormulasShouldNotBeSet() + { + using (var workbook = new XLWorkbook()) + { + var ws = workbook.AddWorksheet(); + ws.Range("A2:A4").Merge(); + ws.Cell("A2").FormulaA1 = "=1"; + ws.Cell("A3").FormulaA1 = "=1"; + ws.Cell("A4").FormulaA1 = "=1"; + ws.Cell("B1").FormulaA1 = "SUM(A:A)"; + Assert.AreEqual(1, ws.Cell("B1").Value); + } + + using (var workbook = new XLWorkbook()) + { + var ws = workbook.AddWorksheet(); + ws.Range("A2:A4").Merge(); + ws.Cell("A2").SetFormulaA1("=1"); + ws.Cell("A3").SetFormulaA1("=1"); + ws.Cell("A4").SetFormulaA1("=1"); + ws.Cell("B1").SetFormulaA1("SUM(A:A)"); + Assert.AreEqual(1, ws.Cell("B1").Value); + } + + using (var workbook = new XLWorkbook()) + { + var ws = workbook.AddWorksheet(); + ws.Range("A2:A4").Merge(); + ws.Cell("A2").FormulaR1C1 = "=1"; + ws.Cell("A3").FormulaR1C1 = "=1"; + ws.Cell("A4").FormulaR1C1 = "=1"; + ws.Cell("B1").FormulaR1C1 = "SUM(A:A)"; + Assert.AreEqual(1, ws.Cell("B1").Value); + } + + using (var workbook = new XLWorkbook()) + { + var ws = workbook.AddWorksheet(); + ws.Range("A2:A4").Merge(); + ws.Cell("A2").SetFormulaR1C1("=1"); + ws.Cell("A3").SetFormulaR1C1("=1"); + ws.Cell("A4").SetFormulaR1C1("=1"); + ws.Cell("B1").SetFormulaR1C1("SUM(A:A)"); + Assert.AreEqual(1, ws.Cell("B1").Value); + } + } + + [Test] + public void MergeSingleCellRangeDoesNothing() + { + using var wb = new XLWorkbook(); + var ws = wb.AddWorksheet(); + var range = ws.Range(1, 1, 1, 1); + + range.Merge(); + + Assert.IsFalse(range.IsMerged()); + Assert.AreEqual(0, ws.MergedRanges.Count); + } + } +} diff --git a/ClosedXML_Tests/Excel/Ranges/RangeIndexTest.cs b/ClosedXML_Tests/Excel/Ranges/RangeIndexTest.cs new file mode 100644 index 0000000..93826fa --- /dev/null +++ b/ClosedXML_Tests/Excel/Ranges/RangeIndexTest.cs @@ -0,0 +1,285 @@ +using ClosedXML.Excel; +using ClosedXML.Excel.Patterns; +using ClosedXML.Excel.Ranges.Index; +using NUnit.Framework; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML_Tests.Excel.Ranges +{ + [TestFixture] + public class RangeIndexTest + { + private const int TEST_COUNT = 10000; + + [Test] + public void FindExistingMatches() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1") as XLWorksheet; + var index = FillIndexWithTestData(ws); + + for (int i = 1; i <= TEST_COUNT; i++) + { + for (int j = 2; j <= 4; j++) + { + var address = new XLAddress(ws, i * 2, j, false, false); + Assert.True(index.Contains(in address)); + } + } + } + } + + [Test] + public void FindNonExistingMatches() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1") as XLWorksheet; + var index = FillIndexWithTestData(ws); + + for (int i = 1; i <= TEST_COUNT; i++) + { + var address = new XLAddress(ws, i * 2 + 1, 3, false, false); + Assert.False(index.Contains(in address)); + } + } + } + + [Test] + public void FindExistingIntersections() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1") as XLWorksheet; + var index = FillIndexWithTestData(ws); + + for (int i = 1; i <= TEST_COUNT; i++) + { + var rangeAddress = new XLRangeAddress( + new XLAddress(ws, i * 2, 1 + i % 4, false, false), + new XLAddress(ws, i * 2 + 1, 8 - i % 3, false, false)); + + Assert.True(index.Intersects(in rangeAddress)); + } + + for (int i = 2; i < 4; i++) + { + var columnAddress = XLRangeAddress.EntireColumn(ws, i); + Assert.True(index.Intersects(in columnAddress)); + } + } + } + + [Test] + public void FindNonExistingIntersections() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1") as XLWorksheet; + var index = FillIndexWithTestData(ws); + + for (int i = 1; i <= TEST_COUNT; i++) + { + var rangeAddress = new XLRangeAddress( + new XLAddress(ws, i * 2 + 1, 1 + i % 4, false, false), + new XLAddress(ws, i * 2 + 1, 8 - i % 3, false, false)); + + Assert.False(index.Intersects(in rangeAddress)); + } + + var columnAddress = XLRangeAddress.EntireColumn(ws, 1); + Assert.False(index.Intersects(in columnAddress)); + columnAddress = XLRangeAddress.EntireColumn(ws, 5); + Assert.False(index.Intersects(in columnAddress)); + } + } + + [Test] + public void FindMatchAfterColumnShifting() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1") as XLWorksheet; + var index = FillIndexWithTestData(ws); + + ws.Column(1).InsertColumnsBefore(1000); + + var address = new XLAddress(ws, 102, 1004, false, false); + + Assert.True(index.Contains(in address)); + } + } + + [Test] + public void FindIntersectionsAfterColumnShifting() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1") as XLWorksheet; + var index = FillIndexWithTestData(ws); + + ws.Column(3).InsertColumnsBefore(2); + + var rangeAddress = new XLRangeAddress(ws, "F102:E103"); + + Assert.True(index.Intersects(in rangeAddress)); + } + } + + [Test] + public void FindMatchAfterRowShifting() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1") as XLWorksheet; + var index = FillIndexWithTestData(ws); + + ws.Row(10).InsertRowsBelow(3); + + var address = new XLAddress(ws, 103, 4, false, false); + + Assert.True(index.Contains(in address)); + } + } + + [Test] + public void FindIntersectionsAfterRowShifting() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1") as XLWorksheet; + var index = FillIndexWithTestData(ws); + + ws.Row(10).InsertRowsBelow(3); + + var rangeAddress = new XLRangeAddress(ws, "C103:E103"); + + Assert.True(index.Intersects(in rangeAddress)); + } + } + + [Test] + public void CreateQuadTree() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1") as XLWorksheet; + var quadTree = new Quadrant(); + var range = ws.Range("BT76:CA87"); + + quadTree.Add(range); + + var level0 = quadTree; + Assert.AreEqual(1, level0.MinimumColumn); + Assert.AreEqual(XLHelper.MaxColumnNumber, level0.MaximumColumn); + Assert.AreEqual(1, level0.MinimumRow); + Assert.AreEqual(XLHelper.MaxRowNumber, level0.MaximumRow); + Assert.IsNull(level0.Ranges); + Assert.AreEqual(128, level0.Children.Count()); + Assert.True(level0.Children.All(child => child.Level == 1)); + Assert.AreEqual(64, level0.Children.Count(child => + child.MinimumColumn == 1 && + child.MaximumColumn == 8192 && + child.X == 0)); + Assert.AreEqual(64, level0.Children.Count(child => + child.MinimumColumn == 8193 && + child.MaximumColumn == 16384 && + child.X == 1)); + Assert.AreEqual(2, level0.Children.Count(child => + child.MinimumRow == 1 && + child.MaximumRow == 8192 && + child.Y == 0)); + Assert.AreEqual(2, level0.Children.Count(child => + child.MinimumRow == 16385 && + child.MaximumRow == 24576 && + child.Y == 2)); + + Assert.True(level0.Children.ElementAt(0).Children.Any()); + Assert.True(level0.Children.Skip(1).All(child => child.Children == null)); + + var level8 = level0 + .Children.First() // 1 + .Children.First() // 2 + .Children.First() // 3 + .Children.First() // 4 + .Children.First() // 5 + .Children.First() // 6 + .Children.First() // 7 + .Children.Last(); // 8 + + Assert.AreEqual(65, level8.MinimumColumn); + Assert.AreEqual(65, level8.MinimumRow); + Assert.AreEqual(128, level8.MaximumColumn); + Assert.AreEqual(128, level8.MaximumRow); + + var level9 = level8.Children.First(); + Assert.NotNull(level9.Ranges); + Assert.AreEqual(range, level9.Ranges.Single()); + } + } + + [Test] + public void XLRangesCountChangesCorrectly() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1") as XLWorksheet; + var range1 = ws.Range("A1:B2"); + var range2 = ws.Range("A2:B3"); + var range3 = ws.Range("A1:B2"); // same as range1 + + var ranges = new XLRanges(); + ranges.Add(range1); + Assert.AreEqual(1, ranges.Count); + ranges.Add(range2); + Assert.AreEqual(2, ranges.Count); + ranges.Add(range3); + Assert.AreEqual(2, ranges.Count); + + Assert.AreEqual(ranges.Count, ranges.Count()); + + // Add many entries to activate QuadTree + for (int i = 1; i <= TEST_COUNT; i++) + { + ranges.Add(ws.Range(i * 2, 2, i * 2, 4)); + } + + Assert.AreEqual(2 + TEST_COUNT, ranges.Count); + + for (int i = 1; i <= TEST_COUNT; i++) + { + ranges.Remove(ws.Range(i * 2, 2, i * 2, 4)); + } + + Assert.AreEqual(2, ranges.Count); + + ranges.Remove(range3); + Assert.AreEqual(1, ranges.Count); + ranges.Remove(range2); + Assert.AreEqual(0, ranges.Count); + ranges.Remove(range1); + Assert.AreEqual(0, ranges.Count); + } + } + + private IXLRangeIndex CreateRangeIndex(IXLWorksheet worksheet) + { + return new XLRangeIndex((XLWorksheet)worksheet); + } + + private IXLRangeIndex FillIndexWithTestData(IXLWorksheet worksheet) + { + var ranges = new List(); + for (int i = 1; i <= TEST_COUNT; i++) + { + ranges.Add(worksheet.Range(i * 2, 2, i * 2, 4)); + } + + var index = CreateRangeIndex(worksheet); + ranges.ForEach(r => index.Add(r)); + return index; + } + } +} diff --git a/ClosedXML_Tests/Excel/Ranges/RangeShiftingTests.cs b/ClosedXML_Tests/Excel/Ranges/RangeShiftingTests.cs new file mode 100644 index 0000000..02a7c0d --- /dev/null +++ b/ClosedXML_Tests/Excel/Ranges/RangeShiftingTests.cs @@ -0,0 +1,82 @@ +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.Ranges +{ + public class RangeShiftingTests + { + [Test] + public void CellReferenceRemainAfterColumnDeleted() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var d4 = ws.Cell("D4"); + + ws.Column("C").Delete(); + + Assert.AreSame(d4, ws.Cell("C4")); + } + } + + [Test] + public void CellReferenceRemainAfterRowDeleted() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var d4 = ws.Cell("D4"); + + ws.Row(3).Delete(); + + Assert.AreSame(d4, ws.Cell("D3")); + } + } + + [Test] + public void CellReferenceRemainAfterColumnInserted() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var d4 = ws.Cell("D4"); + + ws.Column("C").InsertColumnsBefore(1); + + Assert.AreSame(d4, ws.Cell("E4")); + } + } + + [Test] + public void CellReferenceRemainAfterRowInserted() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var d4 = ws.Cell("D4"); + + ws.Row(3).InsertRowsAbove(1); + + Assert.AreSame(d4, ws.Cell("D5")); + } + } + + [Test] + public void CellReferenceRemainAfterRangeDeleted() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var d4 = ws.Cell("D4"); + var f8 = ws.Cell("F8"); + + ws.Range("B2:C5").Delete(XLShiftDeletedCells.ShiftCellsLeft); + ws.Range("E5:F7").Delete(XLShiftDeletedCells.ShiftCellsUp); + + Assert.AreSame(d4, ws.Cell("B4")); + Assert.AreSame(f8, ws.Cell("F5")); + } + } + + } +} diff --git a/ClosedXML_Tests/Excel/Ranges/RangesConsolidationTests.cs b/ClosedXML_Tests/Excel/Ranges/RangesConsolidationTests.cs new file mode 100644 index 0000000..8ed5df7 --- /dev/null +++ b/ClosedXML_Tests/Excel/Ranges/RangesConsolidationTests.cs @@ -0,0 +1,126 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System.Linq; + +namespace ClosedXML_Tests.Excel.Ranges +{ + [TestFixture] + public class RangesConsolidationTests + { + [Test] + public void ConsolidateRangesSameWorksheet() + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet1"); + var ranges = new XLRanges(); + ranges.Add(ws.Range("A1:E3")); + ranges.Add(ws.Range("A4:B10")); + ranges.Add(ws.Range("E2:F12")); + ranges.Add(ws.Range("C6:I8")); + ranges.Add(ws.Range("G9:G9")); + ranges.Add(ws.Range("C9:D9")); + ranges.Add(ws.Range("H9:H9")); + ranges.Add(ws.Range("I9:I13")); + ranges.Add(ws.Range("C4:D5")); + + var consRanges = ranges.Consolidate().ToList(); + + Assert.AreEqual(6, consRanges.Count); + Assert.AreEqual("A1:E9", consRanges[0].RangeAddress.ToString()); + Assert.AreEqual("F2:F12", consRanges[1].RangeAddress.ToString()); + Assert.AreEqual("G6:I9", consRanges[2].RangeAddress.ToString()); + Assert.AreEqual("A10:B10", consRanges[3].RangeAddress.ToString()); + Assert.AreEqual("E10:E12", consRanges[4].RangeAddress.ToString()); + Assert.AreEqual("I10:I13", consRanges[5].RangeAddress.ToString()); + } + + [Test] + public void ConsolidateWideRangesSameWorksheet() + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet1"); + var ranges = new XLRanges(); + ranges.Add(ws.Row(5)); + ranges.Add(ws.Row(7)); + ranges.Add(ws.Row(6)); + ranges.Add(ws.Column("D")); + ranges.Add(ws.Column("F")); + ranges.Add(ws.Column("E")); + + var consRanges = ranges.Consolidate() + .OrderBy(r => r.Worksheet.Name) + .ThenBy(r => r.RangeAddress.FirstAddress.RowNumber) + .ThenBy(r => r.RangeAddress.FirstAddress.ColumnNumber) + .ToList(); + + Assert.AreEqual(3, consRanges.Count); + Assert.AreEqual("D:F", consRanges[0].RangeAddress.ToString()); + Assert.AreEqual("A5:C7", consRanges[1].RangeAddress.ToString()); + Assert.AreEqual("G5:XFD7", consRanges[2].RangeAddress.ToString()); + } + + [Test] + public void ConsolidateRangesDifferentWorksheets() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + var ws2 = wb.Worksheets.Add("Sheet2"); + var ranges = new XLRanges(); + ranges.Add(ws1.Range("A1:E3")); + ranges.Add(ws1.Range("A4:B10")); + ranges.Add(ws1.Range("E2:F12")); + ranges.Add(ws1.Range("C6:I8")); + ranges.Add(ws1.Range("G9:G9")); + + ranges.Add(ws2.Row(5)); + ranges.Add(ws2.Row(7)); + ranges.Add(ws2.Row(6)); + ranges.Add(ws2.Column("D")); + ranges.Add(ws2.Column("F")); + ranges.Add(ws2.Column("E")); + + ranges.Add(ws1.Range("C9:D9")); + ranges.Add(ws1.Range("H9:H9")); + ranges.Add(ws1.Range("I9:I13")); + ranges.Add(ws1.Range("C4:D5")); + + var consRanges = ranges.Consolidate() + .OrderBy(r => r.Worksheet.Name) + .ThenBy(r => r.RangeAddress.FirstAddress.RowNumber) + .ThenBy(r => r.RangeAddress.FirstAddress.ColumnNumber) + .ToList(); + + Assert.AreEqual(9, consRanges.Count); + Assert.AreEqual("Sheet1!$A$1:$E$9", consRanges[0].RangeAddress.ToStringFixed(XLReferenceStyle.Default, true)); + Assert.AreEqual("Sheet1!$F$2:$F$12", consRanges[1].RangeAddress.ToStringFixed(XLReferenceStyle.Default, true)); + Assert.AreEqual("Sheet1!$G$6:$I$9", consRanges[2].RangeAddress.ToStringFixed(XLReferenceStyle.Default, true)); + Assert.AreEqual("Sheet1!$A$10:$B$10", consRanges[3].RangeAddress.ToStringFixed(XLReferenceStyle.Default, true)); + Assert.AreEqual("Sheet1!$E$10:$E$12", consRanges[4].RangeAddress.ToStringFixed(XLReferenceStyle.Default, true)); + Assert.AreEqual("Sheet1!$I$10:$I$13", consRanges[5].RangeAddress.ToStringFixed(XLReferenceStyle.Default, true)); + + Assert.AreEqual("Sheet2!$D:$F", consRanges[6].RangeAddress.ToStringFixed(XLReferenceStyle.Default, true)); + Assert.AreEqual("Sheet2!$A$5:$C$7", consRanges[7].RangeAddress.ToStringFixed(XLReferenceStyle.Default, true)); + Assert.AreEqual("Sheet2!$G$5:$XFD$7", consRanges[8].RangeAddress.ToStringFixed(XLReferenceStyle.Default, true)); + } + + [Test] + public void ConsolidateSparsedRanges() + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet1"); + var ranges = new XLRanges(); + ranges.Add(ws.Range("A1:C1")); + ranges.Add(ws.Range("E1:G1")); + ranges.Add(ws.Range("A3:C3")); + ranges.Add(ws.Range("E3:G3")); + + var consRanges = ranges.Consolidate().ToList(); + + Assert.AreEqual(4, consRanges.Count); + Assert.AreEqual("A1:C1", consRanges[0].RangeAddress.ToString()); + Assert.AreEqual("E1:G1", consRanges[1].RangeAddress.ToString()); + Assert.AreEqual("A3:C3", consRanges[2].RangeAddress.ToString()); + Assert.AreEqual("E3:G3", consRanges[3].RangeAddress.ToString()); + } + } +} diff --git a/ClosedXML_Tests/Excel/Ranges/UsedAndUnusedCellsTests.cs b/ClosedXML_Tests/Excel/Ranges/UsedAndUnusedCellsTests.cs new file mode 100644 index 0000000..630deae --- /dev/null +++ b/ClosedXML_Tests/Excel/Ranges/UsedAndUnusedCellsTests.cs @@ -0,0 +1,401 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System.Linq; + +namespace ClosedXML_Tests.Excel.Ranges +{ + [TestFixture] + public class UsedAndUnusedCellsTests + { + private XLWorkbook workbook; + + [SetUp] + public void SetupWorkbook() + { + workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + ws.Cell(1, 1).Value = "A1"; + ws.Cell(1, 3).Value = "C1"; + ws.Cell(2, 2).Value = "B2"; + ws.Cell(4, 1).Value = "A4"; + ws.Cell(5, 2).Value = "B5"; + ws.Cell(6, 2).Style.Fill.BackgroundColor = XLColor.Red; + } + + [Test] + public void CountUsedCellsInRow() + { + int i = 0; + var row = workbook.Worksheets.First().FirstRow(); + foreach (var cell in row.Cells()) // Cells() returns UnUsed cells by default + { + i++; + } + Assert.AreEqual(2, i); + + i = 0; + row = workbook.Worksheets.First().FirstRow().RowBelow(); + foreach (var cell in row.Cells()) + { + i++; + } + Assert.AreEqual(1, i); + + i = 0; + row = workbook.Worksheets.First().LastRowUsed(XLCellsUsedOptions.All); + Assert.AreEqual(6, row.RowNumber()); + foreach (var cell in row.Cells()) + { + i++; + } + Assert.AreEqual(1, i); + + i = 0; + row = workbook.Worksheets.First().LastRowUsed(XLCellsUsedOptions.All); + Assert.AreEqual(6, row.RowNumber()); + foreach (var cell in row.CellsUsed()) + { + i++; + } + Assert.AreEqual(0, i); + } + + [Test(Description = "See 1443")] + public void FirstRowUsedRegression() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + + ws.Range("B3:F6").SetValue(100); + + Assert.AreEqual(3, ws.FirstRowUsed(XLCellsUsedOptions.AllContents).RowNumber()); + } + } + + [Test] + public void CountAllCellsInRow() + { + int i = 0; + var row = workbook.Worksheets.First().FirstRow(); + foreach (var cell in row.Cells(false)) // All cells in range between first and last cells used + { + i++; + } + Assert.AreEqual(3, i); + + i = 0; + row = workbook.Worksheets.First().FirstRow().RowBelow(); //This row has no empty cells BETWEEN used cells + foreach (var cell in row.Cells(false)) + { + i++; + } + Assert.AreEqual(1, i); + } + + [Test] + public void CountUsedCellsInColumn() + { + int i = 0; + var column = workbook.Worksheets.First().FirstColumn(); + foreach (var cell in column.Cells()) // Cells() returns UnUsed cells by default + { + i++; + } + Assert.AreEqual(2, i); + + i = 0; + column = workbook.Worksheets.First().FirstColumn().ColumnRight().ColumnRight(); + foreach (var cell in column.Cells()) + { + i++; + } + Assert.AreEqual(1, i); + + i = 0; + column = workbook.Worksheets.First().Column(2); + foreach (var cell in column.Cells()) + { + i++; + } + Assert.AreEqual(3, i); + + i = 0; + column = workbook.Worksheets.First().Column(2); + foreach (var cell in column.CellsUsed()) + { + i++; + } + Assert.AreEqual(2, i); + } + + [Test] + public void CountAllCellsInColumn() + { + int i = 0; + var column = workbook.Worksheets.First().FirstColumn(); + foreach (var cell in column.Cells(false)) // All cells in range between first and last cells used + { + i++; + } + Assert.AreEqual(4, i); + + i = 0; + column = workbook.Worksheets.First().FirstColumn().ColumnRight().ColumnRight(); //This column has no empty cells BETWEEN used cells + foreach (var cell in column.Cells(false)) + { + i++; + } + Assert.AreEqual(1, i); + } + + [Test] + public void CountCellsInWorksheet() + { + var ws = workbook.Worksheets.First(); + int i = 0; + + foreach (var cell in ws.Cells()) // All cells with content or formats + { + i++; + } + Assert.AreEqual(6, i); + } + + [Test] + public void CountUsedCellsInWorksheet() + { + var ws = workbook.Worksheets.First(); + int i = 0; + + foreach (var cell in ws.CellsUsed()) // Only used cells in worksheet + { + i++; + } + Assert.AreEqual(5, i); + } + + [Test] + public void CountAllCellsInWorksheet() + { + var ws = workbook.Worksheets.First(); + int i = 0; + + foreach (var cell in ws.Cells(false)) // All cells in range between first and last cells used (cartesian product of range) + { + i++; + } + Assert.AreEqual(18, i); + } + + [Test] + public void GetCellsUsedNonRectangular() + { + using (XLWorkbook wb = new XLWorkbook()) + { + var sheet = wb.AddWorksheet("page1"); + + sheet.Range("C1:E1").Value = "row1"; + sheet.Range("A2:E2").Value = "row2"; + + var used = sheet.RangeUsed().RangeAddress.ToString(XLReferenceStyle.A1); + + Assert.AreEqual("A1:E2", used); + } + } + + [TestCase(true, "A1:D2", "A1")] + [TestCase(true, "A2:D2", "A2")] + [TestCase(true, "A1:D2", "A1", "B2")] + [TestCase(true, "B2:D3", "C3")] + [TestCase(true, "B2:F4", "F4")] + [TestCase(false, "A1:D2", "A1")] + [TestCase(false, "A2:D2", "A2")] + [TestCase(false, "A1:D2", "A1", "B2")] + [TestCase(false, "B2:D3", "C3")] + [TestCase(false, "B2:F4", "F4")] + public void RangeUsedIncludesMergedCells(bool includeFormatting, string expectedRange, + params string[] cellsWithValues) + { + using (XLWorkbook wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + foreach (var cellAddress in cellsWithValues) + { + ws.Cell(cellAddress).Value = "Not empty"; + } + ws.Range("B2:D2").Merge(); + + var options = includeFormatting + ? XLCellsUsedOptions.All + : XLCellsUsedOptions.AllContents | XLCellsUsedOptions.MergedRanges; + var actual = ws.RangeUsed(options).RangeAddress; + + Assert.AreEqual(expectedRange, actual.ToString()); + } + } + + [Test] + public void LastCellUsedPredicateConsidersMergedRanges() + { + using (XLWorkbook wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Style.Fill.BackgroundColor = XLColor.Red; + ws.Cell("A2").Style.Fill.BackgroundColor = XLColor.Yellow; + ws.Cell("A3").Style.Fill.BackgroundColor = XLColor.Green; + ws.Range("A1:C1").Merge(); + ws.Range("A2:C2").Merge(); + ws.Range("A3:C3").Merge(); + + var actual = ws.LastCellUsed(XLCellsUsedOptions.All, + c => c.Style.Fill.BackgroundColor == XLColor.Yellow); + + Assert.AreEqual("C2", actual.Address.ToString()); + } + } + + [Test] + public void FirstCellUsedPredicateConsidersMergedRanges() + { + using (XLWorkbook wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Style.Fill.BackgroundColor = XLColor.Red; + ws.Cell("A2").Style.Fill.BackgroundColor = XLColor.Yellow; + ws.Cell("A3").Style.Fill.BackgroundColor = XLColor.Green; + ws.Range("A1:C1").Merge(); + ws.Range("A2:C2").Merge(); + ws.Range("A3:C3").Merge(); + + var actual = ws.FirstCellUsed(XLCellsUsedOptions.All, + c => c.Style.Fill.BackgroundColor == XLColor.Yellow); + + Assert.AreEqual("A2", actual.Address.ToString()); + } + } + + [Test] + public void ApplyingDataValidationMakesCellNotEmpty() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + ws.Range("B2:B12").SetDataValidation() + .Decimal.EqualOrGreaterThan(0); + + var usedCells = ws.CellsUsed(XLCellsUsedOptions.All).ToList(); + + Assert.AreEqual(11, usedCells.Count); + Assert.AreEqual("B2", usedCells.First().Address.ToString()); + Assert.AreEqual("B12", usedCells.Last().Address.ToString()); + } + } + + [Test] + public void MergeMakesCellNotEmpty() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + ws.Range("B2:B12").Merge(); + + var usedCells = ws.CellsUsed(XLCellsUsedOptions.All).ToList(); + + Assert.AreEqual(11, usedCells.Count); + Assert.AreEqual("B2", usedCells.First().Address.ToString()); + Assert.AreEqual("B12", usedCells.Last().Address.ToString()); + } + } + + [Test] + public void FirstCellUsedNotHangingOnLargeCFRules() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + ws.AddConditionalFormat().WhenIsBlank().Fill.SetBackgroundColor(XLColor.Gold); + + var firstCell = ws.FirstCellUsed(XLCellsUsedOptions.All); + + Assert.AreEqual(1, (ws as XLWorksheet).Internals.CellsCollection.Count); + Assert.AreEqual("A1", firstCell.Address.ToString()); + } + } + + [Test] + public void LastCellUsedNotHangingOnLargeCFRules() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + ws.AddConditionalFormat().WhenIsBlank().Fill.SetBackgroundColor(XLColor.Gold); + + var lastCell = ws.LastCellUsed(XLCellsUsedOptions.All); + + Assert.AreEqual(1, (ws as XLWorksheet).Internals.CellsCollection.Count); + Assert.AreEqual(XLHelper.LastCell, lastCell.Address.ToString()); + } + } + + [Test] + public void FirstCellUsedNotHangingOnLargeDVRules() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + ws.SetDataValidation().WholeNumber.GreaterThan(0); + + var firstCell = ws.FirstCellUsed(XLCellsUsedOptions.All); + + Assert.AreEqual(1, (ws as XLWorksheet).Internals.CellsCollection.Count); + Assert.AreEqual("A1", firstCell.Address.ToString()); + } + } + + [Test] + public void LastCellUsedNotHangingOnLargeDVRules() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + ws.SetDataValidation().WholeNumber.GreaterThan(0); + + var lastCell = ws.LastCellUsed(XLCellsUsedOptions.All); + + Assert.AreEqual(1, (ws as XLWorksheet).Internals.CellsCollection.Count); + Assert.AreEqual(XLHelper.LastCell, lastCell.Address.ToString()); + } + } + + [Test] + public void FirstCellUsedNotHangingOnLargeMergedRanges() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + ws.Merge(); + + var firstCell = ws.FirstCellUsed(XLCellsUsedOptions.All); + + Assert.AreEqual(1, (ws as XLWorksheet).Internals.CellsCollection.Count); + Assert.AreEqual("A1", firstCell.Address.ToString()); + } + } + + [Test] + public void LastCellUsedNotHangingOnLargeMergedRanges() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + ws.Merge(); + + var lastCell = ws.LastCellUsed(XLCellsUsedOptions.All); + + Assert.AreEqual(2, (ws as XLWorksheet).Internals.CellsCollection.Count); + Assert.AreEqual(XLHelper.LastCell, lastCell.Address.ToString()); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs b/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs new file mode 100644 index 0000000..9d3c3cc --- /dev/null +++ b/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs @@ -0,0 +1,349 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class XLRangeAddressTests + { + [Test] + public void ToStringTest() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRangeAddress address = ws.Cell(1, 1).AsRange().RangeAddress; + + Assert.AreEqual("A1:A1", address.ToString()); + Assert.AreEqual("Sheet1!R1C1:R1C1", address.ToString(XLReferenceStyle.R1C1, true)); + + Assert.AreEqual("A1:A1", address.ToStringRelative()); + Assert.AreEqual("Sheet1!A1:A1", address.ToStringRelative(true)); + + Assert.AreEqual("$A$1:$A$1", address.ToStringFixed()); + Assert.AreEqual("$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.A1)); + Assert.AreEqual("R1C1:R1C1", address.ToStringFixed(XLReferenceStyle.R1C1)); + Assert.AreEqual("$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.Default)); + Assert.AreEqual("Sheet1!$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.A1, true)); + Assert.AreEqual("Sheet1!R1C1:R1C1", address.ToStringFixed(XLReferenceStyle.R1C1, true)); + Assert.AreEqual("Sheet1!$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.Default, true)); + } + + [Test] + public void ToStringTestWithSpace() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet 1"); + IXLRangeAddress address = ws.Cell(1, 1).AsRange().RangeAddress; + + Assert.AreEqual("A1:A1", address.ToString()); + Assert.AreEqual("'Sheet 1'!R1C1:R1C1", address.ToString(XLReferenceStyle.R1C1, true)); + + Assert.AreEqual("A1:A1", address.ToStringRelative()); + Assert.AreEqual("'Sheet 1'!A1:A1", address.ToStringRelative(true)); + + Assert.AreEqual("$A$1:$A$1", address.ToStringFixed()); + Assert.AreEqual("$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.A1)); + Assert.AreEqual("R1C1:R1C1", address.ToStringFixed(XLReferenceStyle.R1C1)); + Assert.AreEqual("$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.Default)); + Assert.AreEqual("'Sheet 1'!$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.A1, true)); + Assert.AreEqual("'Sheet 1'!R1C1:R1C1", address.ToStringFixed(XLReferenceStyle.R1C1, true)); + Assert.AreEqual("'Sheet 1'!$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.Default, true)); + } + + [TestCase("B2:E5", "B2:E5")] + [TestCase("E5:B2", "B2:E5")] + [TestCase("B5:E2", "B2:E5")] + [TestCase("B2:E$5", "B2:E$5")] + [TestCase("B2:$E$5", "B2:$E$5")] + [TestCase("B$2:$E$5", "B$2:$E$5")] + [TestCase("$B$2:$E$5", "$B$2:$E$5")] + [TestCase("B5:E$2", "B$2:E5")] + [TestCase("$B$5:E2", "$B2:E$5")] + [TestCase("$B$5:E$2", "$B$2:E$5")] + [TestCase("$B$5:$E$2", "$B$2:$E$5")] + public void RangeAddressNormalizeTest(string inputAddress, string expectedAddress) + { + XLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet 1") as XLWorksheet; + var rangeAddress = new XLRangeAddress(ws, inputAddress); + + var normalizedAddress = rangeAddress.Normalize(); + + Assert.AreSame(ws, rangeAddress.Worksheet); + Assert.AreEqual(expectedAddress, normalizedAddress.ToString()); + } + + [Test] + public void InvalidRangeAddressToStringTest() + { + var address = ProduceInvalidAddress(); + + Assert.AreEqual("#REF!", address.ToString()); + Assert.AreEqual("#REF!", address.ToString(XLReferenceStyle.A1)); + Assert.AreEqual("#REF!", address.ToString(XLReferenceStyle.Default)); + Assert.AreEqual("'Sheet 1'!#REF!", address.ToString(XLReferenceStyle.R1C1)); + Assert.AreEqual("'Sheet 1'!#REF!", address.ToString(XLReferenceStyle.A1, true)); + Assert.AreEqual("'Sheet 1'!#REF!", address.ToString(XLReferenceStyle.Default, true)); + Assert.AreEqual("'Sheet 1'!#REF!", address.ToString(XLReferenceStyle.R1C1, true)); + } + + [Test] + public void InvalidRangeAddressToStringFixedTest() + { + var address = ProduceInvalidAddress(); + + Assert.AreEqual("#REF!", address.ToStringFixed()); + Assert.AreEqual("#REF!", address.ToStringFixed(XLReferenceStyle.A1)); + Assert.AreEqual("#REF!", address.ToStringFixed(XLReferenceStyle.Default)); + Assert.AreEqual("#REF!", address.ToStringFixed(XLReferenceStyle.R1C1)); + Assert.AreEqual("'Sheet 1'!#REF!", address.ToStringFixed(XLReferenceStyle.A1, true)); + Assert.AreEqual("'Sheet 1'!#REF!", address.ToStringFixed(XLReferenceStyle.Default, true)); + Assert.AreEqual("'Sheet 1'!#REF!", address.ToStringFixed(XLReferenceStyle.R1C1, true)); + } + + [Test] + public void InvalidRangeAddressToStringRelativeTest() + { + var address = ProduceInvalidAddress(); + + Assert.AreEqual("#REF!", address.ToStringRelative()); + Assert.AreEqual("'Sheet 1'!#REF!", address.ToStringRelative(true)); + } + + [Test] + public void RangeAddressOnDeletedWorksheetToStringTest() + { + var address = ProduceAddressOnDeletedWorksheet(); + + Assert.AreEqual("#REF!A1:B2", address.ToString()); + Assert.AreEqual("#REF!A1:B2", address.ToString(XLReferenceStyle.A1)); + Assert.AreEqual("#REF!A1:B2", address.ToString(XLReferenceStyle.Default)); + Assert.AreEqual("#REF!R1C1:R2C2", address.ToString(XLReferenceStyle.R1C1)); + Assert.AreEqual("#REF!A1:B2", address.ToString(XLReferenceStyle.A1, true)); + Assert.AreEqual("#REF!A1:B2", address.ToString(XLReferenceStyle.Default, true)); + Assert.AreEqual("#REF!R1C1:R2C2", address.ToString(XLReferenceStyle.R1C1, true)); + } + + [Test] + public void RangeAddressOnDeletedWorksheetToStringFixedTest() + { + var address = ProduceAddressOnDeletedWorksheet(); + + Assert.AreEqual("#REF!$A$1:$B$2", address.ToStringFixed()); + Assert.AreEqual("#REF!$A$1:$B$2", address.ToStringFixed(XLReferenceStyle.A1)); + Assert.AreEqual("#REF!$A$1:$B$2", address.ToStringFixed(XLReferenceStyle.Default)); + Assert.AreEqual("#REF!R1C1:R2C2", address.ToStringFixed(XLReferenceStyle.R1C1)); + Assert.AreEqual("#REF!$A$1:$B$2", address.ToStringFixed(XLReferenceStyle.A1, true)); + Assert.AreEqual("#REF!$A$1:$B$2", address.ToStringFixed(XLReferenceStyle.Default, true)); + Assert.AreEqual("#REF!R1C1:R2C2", address.ToStringFixed(XLReferenceStyle.R1C1, true)); + } + + [Test] + public void RangeAddressOnDeletedWorksheetToStringRelativeTest() + { + var address = ProduceAddressOnDeletedWorksheet(); + + Assert.AreEqual("#REF!A1:B2", address.ToStringRelative()); + Assert.AreEqual("#REF!A1:B2", address.ToStringRelative(true)); + } + + [Test] + public void InvalidRangeAddressOnDeletedWorksheetToStringTest() + { + var address = ProduceInvalidAddressOnDeletedWorksheet(); + + Assert.AreEqual("#REF!#REF!", address.ToString()); + Assert.AreEqual("#REF!#REF!", address.ToString(XLReferenceStyle.A1)); + Assert.AreEqual("#REF!#REF!", address.ToString(XLReferenceStyle.Default)); + Assert.AreEqual("#REF!#REF!", address.ToString(XLReferenceStyle.R1C1)); + Assert.AreEqual("#REF!#REF!", address.ToString(XLReferenceStyle.A1, true)); + Assert.AreEqual("#REF!#REF!", address.ToString(XLReferenceStyle.Default, true)); + Assert.AreEqual("#REF!#REF!", address.ToString(XLReferenceStyle.R1C1, true)); + } + + [Test] + public void InvalidRangeAddressOnDeletedWorksheetToStringFixedTest() + { + var address = ProduceInvalidAddressOnDeletedWorksheet(); + + Assert.AreEqual("#REF!#REF!", address.ToStringFixed()); + Assert.AreEqual("#REF!#REF!", address.ToStringFixed(XLReferenceStyle.A1)); + Assert.AreEqual("#REF!#REF!", address.ToStringFixed(XLReferenceStyle.Default)); + Assert.AreEqual("#REF!#REF!", address.ToStringFixed(XLReferenceStyle.R1C1)); + Assert.AreEqual("#REF!#REF!", address.ToStringFixed(XLReferenceStyle.A1, true)); + Assert.AreEqual("#REF!#REF!", address.ToStringFixed(XLReferenceStyle.Default, true)); + Assert.AreEqual("#REF!#REF!", address.ToStringFixed(XLReferenceStyle.R1C1, true)); + } + + [Test] + public void InvalidRangeAddressOnDeletedWorksheetToStringRelativeTest() + { + var address = ProduceInvalidAddressOnDeletedWorksheet(); + + Assert.AreEqual("#REF!#REF!", address.ToStringRelative()); + Assert.AreEqual("#REF!#REF!", address.ToStringRelative(true)); + } + + [Test] + public void FullSpanAddressCannotChange() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + var wsRange = ws.AsRange(); + var row = ws.FirstRow().RowBelow(4).AsRange(); + var column = ws.FirstColumn().ColumnRight(4).AsRange(); + + Assert.AreEqual($"1:{XLHelper.MaxRowNumber}", wsRange.RangeAddress.ToString()); + Assert.AreEqual("5:5", row.RangeAddress.ToString()); + Assert.AreEqual("E:E", column.RangeAddress.ToString()); + + ws.Columns("Y:Z").Delete(); + ws.Rows("9:10").Delete(); + + Assert.AreEqual($"1:{XLHelper.MaxRowNumber}", wsRange.RangeAddress.ToString()); + Assert.AreEqual("5:5", row.RangeAddress.ToString()); + Assert.AreEqual("E:E", column.RangeAddress.ToString()); + } + } + + [Test] + public void RangeAddressIsNormalized() + { + var ws = new XLWorkbook().AddWorksheet(); + + XLRangeAddress rangeAddress; + + rangeAddress = (XLRangeAddress)ws.Range(ws.Cell("A1"), ws.Cell("C3")).RangeAddress; + Assert.IsTrue(rangeAddress.IsNormalized); + + rangeAddress = (XLRangeAddress)ws.Range(ws.Cell("C3"), ws.Cell("A1")).RangeAddress; + Assert.IsFalse(rangeAddress.IsNormalized); + + rangeAddress = (XLRangeAddress)ws.Range("B2:B1").RangeAddress; + Assert.IsFalse(rangeAddress.IsNormalized); + + rangeAddress = (XLRangeAddress)ws.Range("B2:B10").RangeAddress; + Assert.IsTrue(rangeAddress.IsNormalized); + + rangeAddress = (XLRangeAddress)ws.Range("B:B").RangeAddress; + Assert.IsTrue(rangeAddress.IsNormalized); + + rangeAddress = (XLRangeAddress)ws.Range("2:2").RangeAddress; + Assert.IsTrue(rangeAddress.IsNormalized); + + rangeAddress = (XLRangeAddress)ws.RangeAddress; + Assert.IsTrue(rangeAddress.IsNormalized); + } + + [Test] + public void AsRangeTests() + { + XLRangeAddress rangeAddress; + rangeAddress = new XLRangeAddress + ( + new XLAddress(1, 1, false, false), + new XLAddress(5, 5, false, false) + ); + + Assert.IsTrue(rangeAddress.IsValid); + Assert.IsTrue(rangeAddress.IsNormalized); + Assert.Throws(() => rangeAddress.AsRange()); + + var ws = new XLWorkbook().AddWorksheet() as XLWorksheet; + rangeAddress = new XLRangeAddress + ( + new XLAddress(ws, 1, 1, false, false), + new XLAddress(ws, 5, 5, false, false) + ); + + Assert.IsTrue(rangeAddress.IsValid); + Assert.IsTrue(rangeAddress.IsNormalized); + Assert.DoesNotThrow(() => rangeAddress.AsRange()); + } + + [Test] + public void RelativeRanges() + { + var ws = new XLWorkbook().AddWorksheet(); + + IXLRangeAddress rangeAddress; + + rangeAddress = ws.Range("D4:E4").RangeAddress.Relative(ws.Range("A1:E4").RangeAddress, ws.Range("B10:F14").RangeAddress); + Assert.IsTrue(rangeAddress.IsValid); + Assert.AreEqual("E13:F13", rangeAddress.ToString()); + + rangeAddress = ws.Range("D4:E4").RangeAddress.Relative(ws.Range("B10:F14").RangeAddress, ws.Range("A1:E4").RangeAddress); + Assert.IsFalse(rangeAddress.IsValid); + Assert.AreEqual("#REF!", rangeAddress.ToString()); + + rangeAddress = ws.Range("C3").RangeAddress.Relative(ws.Range("A1:B2").RangeAddress, ws.Range("C3").RangeAddress); + Assert.IsTrue(rangeAddress.IsValid); + Assert.AreEqual("E5:E5", rangeAddress.ToString()); + + rangeAddress = ws.Range("B2").RangeAddress.Relative(ws.Range("A1").RangeAddress, ws.Range("C3").RangeAddress); + Assert.IsTrue(rangeAddress.IsValid); + Assert.AreEqual("D4:D4", rangeAddress.ToString()); + + rangeAddress = ws.Range("A1").RangeAddress.Relative(ws.Range("B2").RangeAddress, ws.Range("A1").RangeAddress); + Assert.IsFalse(rangeAddress.IsValid); + Assert.AreEqual("#REF!", rangeAddress.ToString()); + } + + [Test] + public void TestSpanProperties() + { + var ws = new XLWorkbook().AddWorksheet() as XLWorksheet; + + var range = ws.Range("B3:E5"); + var rangeAddress = range.RangeAddress as IXLRangeAddress; + Assert.AreEqual(4, rangeAddress.ColumnSpan); + Assert.AreEqual(3, rangeAddress.RowSpan); + Assert.AreEqual(12, rangeAddress.NumberOfCells); + + range = ws.Range("E5:B3"); + rangeAddress = range.RangeAddress as IXLRangeAddress; + Assert.AreEqual(4, rangeAddress.ColumnSpan); + Assert.AreEqual(3, rangeAddress.RowSpan); + Assert.AreEqual(12, rangeAddress.NumberOfCells); + + rangeAddress = ProduceAddressOnDeletedWorksheet(); + Assert.AreEqual(2, rangeAddress.ColumnSpan); + Assert.AreEqual(2, rangeAddress.RowSpan); + Assert.AreEqual(4, rangeAddress.NumberOfCells); + + rangeAddress = ProduceInvalidAddress(); + Assert.Throws(() => { var x = rangeAddress.ColumnSpan; }); + Assert.Throws(() => { var x = rangeAddress.RowSpan; }); + Assert.Throws(() => { var x = rangeAddress.NumberOfCells; }); + } + + #region Private Methods + + private IXLRangeAddress ProduceInvalidAddress() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet 1"); + var range = ws.Range("A1:B2"); + + ws.Rows(1, 5).Delete(); + return range.RangeAddress; + } + + private IXLRangeAddress ProduceAddressOnDeletedWorksheet() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet 1"); + var address = ws.Range("A1:B2").RangeAddress; + + ws.Delete(); + return address; + } + + private IXLRangeAddress ProduceInvalidAddressOnDeletedWorksheet() + { + var address = ProduceInvalidAddress(); + address.Worksheet.Delete(); + return address; + } + + #endregion Private Methods + } +} diff --git a/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs b/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs new file mode 100644 index 0000000..7bc919b --- /dev/null +++ b/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs @@ -0,0 +1,520 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class XLRangeBaseTests + { + [Test] + public void IsEmpty1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + IXLRange range = ws.Range("A1:B2"); + bool actual = range.IsEmpty(); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + IXLRange range = ws.Range("A1:B2"); + bool actual = range.IsEmpty(XLCellsUsedOptions.All); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty3() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Style.Fill.BackgroundColor = XLColor.Red; + IXLRange range = ws.Range("A1:B2"); + bool actual = range.IsEmpty(); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty4() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Style.Fill.BackgroundColor = XLColor.Red; + IXLRange range = ws.Range("A1:B2"); + bool actual = range.IsEmpty(XLCellsUsedOptions.AllContents); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty5() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Style.Fill.BackgroundColor = XLColor.Red; + IXLRange range = ws.Range("A1:B2"); + bool actual = range.IsEmpty(XLCellsUsedOptions.All); + bool expected = false; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty6() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Value = "X"; + IXLRange range = ws.Range("A1:B2"); + bool actual = range.IsEmpty(); + bool expected = false; + Assert.AreEqual(expected, actual); + } + + [Test] + public void SingleCell() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).Value = "Hello World!"; + wb.NamedRanges.Add("SingleCell", "Sheet1!$A$1"); + IXLRange range = wb.Range("SingleCell"); + Assert.AreEqual(1, range.CellsUsed().Count()); + Assert.AreEqual("Hello World!", range.CellsUsed().Single().GetString()); + } + + [Test] + public void TableRange() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + IXLRangeColumn rangeColumn = ws.Column(1).Column(1, 4); + rangeColumn.Cell(1).Value = "FName"; + rangeColumn.Cell(2).Value = "John"; + rangeColumn.Cell(3).Value = "Hank"; + rangeColumn.Cell(4).Value = "Dagny"; + IXLTable table = rangeColumn.CreateTable(); + wb.NamedRanges.Add("FNameColumn", String.Format("{0}[{1}]", table.Name, "FName")); + + IXLRange namedRange = wb.Range("FNameColumn"); + Assert.AreEqual(3, namedRange.Cells().Count()); + Assert.IsTrue( + namedRange.CellsUsed().Select(cell => cell.GetString()).SequenceEqual(new[] { "John", "Hank", "Dagny" })); + } + + [Test] + public void WsNamedCell() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("Test").AddToNamed("TestCell", XLScope.Worksheet); + Assert.AreEqual("Test", ws.Cell("TestCell").GetString()); + } + + [Test] + public void WsNamedCells() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("Test").AddToNamed("TestCell", XLScope.Worksheet); + ws.Cell(2, 1).SetValue("B"); + IXLCells cells = ws.Cells("TestCell, A2"); + Assert.AreEqual("Test", cells.First().GetString()); + Assert.AreEqual("B", cells.Last().GetString()); + } + + [Test] + public void WsNamedRange() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("A"); + ws.Cell(2, 1).SetValue("B"); + IXLRange original = ws.Range("A1:A2"); + original.AddToNamed("TestRange", XLScope.Worksheet); + IXLRange named = ws.Range("TestRange"); + Assert.AreEqual(original.RangeAddress.ToStringFixed(), named.RangeAddress.ToString()); + } + + [Test] + public void WsNamedRanges() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("A"); + ws.Cell(2, 1).SetValue("B"); + ws.Cell(3, 1).SetValue("C"); + IXLRange original = ws.Range("A1:A2"); + original.AddToNamed("TestRange", XLScope.Worksheet); + IXLRanges namedRanges = ws.Ranges("TestRange, A3"); + Assert.AreEqual(original.RangeAddress.ToStringFixed(), namedRanges.First().RangeAddress.ToString()); + Assert.AreEqual("$A$3:$A$3", namedRanges.Last().RangeAddress.ToStringFixed()); + } + + [Test] + public void WsNamedRangesOneString() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.NamedRanges.Add("TestRange", "Sheet1!$A$1,Sheet1!$A$3"); + IXLRanges namedRanges = ws.Ranges("TestRange"); + + Assert.AreEqual("$A$1:$A$1", namedRanges.First().RangeAddress.ToStringFixed()); + Assert.AreEqual("$A$3:$A$3", namedRanges.Last().RangeAddress.ToStringFixed()); + } + + //[Test] + //public void WsNamedRangeLiteral() + //{ + // var wb = new XLWorkbook(); + // var ws = wb.Worksheets.Add("Sheet1"); + // ws.NamedRanges.Add("TestRange", "\"Hello\""); + // using (MemoryStream memoryStream = new MemoryStream()) + // { + // wb.SaveAs(memoryStream, true); + // var wb2 = new XLWorkbook(memoryStream); + // var text = wb2.Worksheet("Sheet1").NamedRanges.First() + // memoryStream.Close(); + // } + + //} + + [Test] + public void GrowRange() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + Assert.AreEqual("A1:B2", ws.Cell("A1").AsRange().Grow().RangeAddress.ToString()); + Assert.AreEqual("A1:B3", ws.Cell("A2").AsRange().Grow().RangeAddress.ToString()); + Assert.AreEqual("A1:C2", ws.Cell("B1").AsRange().Grow().RangeAddress.ToString()); + + Assert.AreEqual("E4:G6", ws.Cell("F5").AsRange().Grow().RangeAddress.ToString()); + Assert.AreEqual("D3:H7", ws.Cell("F5").AsRange().Grow(2).RangeAddress.ToString()); + Assert.AreEqual("A1:DB105", ws.Cell("F5").AsRange().Grow(100).RangeAddress.ToString()); + } + } + + [Test] + public void ShrinkRange() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + Assert.Null(ws.Cell("A1").AsRange().Shrink()); + Assert.Null(ws.Range("B2:C3").Shrink()); + Assert.AreEqual("C3:C3", ws.Range("B2:D4").Shrink().RangeAddress.ToString()); + Assert.AreEqual("K11:P16", ws.Range("A1:Z26").Shrink(10).RangeAddress.ToString()); + + // Grow and shrink back + Assert.AreEqual("Z26:Z26", ws.Cell("Z26").AsRange().Grow(10).Shrink(10).RangeAddress.ToString()); + } + } + + [Test] + public void Intersection() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + Assert.AreEqual("D9:G11", ws.Range("B9:I11").Intersection(ws.Range("D4:G16")).ToString()); + Assert.AreEqual("E9:G11", ws.Range("E9:I11").Intersection(ws.Range("D4:G16")).ToString()); + Assert.AreEqual("E9:E9", ws.Cell("E9").AsRange().Intersection(ws.Range("D4:G16")).ToString()); + Assert.AreEqual("E9:E9", ws.Range("D4:G16").Intersection(ws.Cell("E9").AsRange()).ToString()); + + XLRangeAddress rangeAddress; + + rangeAddress = (XLRangeAddress)ws.Cell("C3").AsRange().Intersection(ws.Cell("A1").AsRange()); + Assert.IsFalse(rangeAddress.IsValid); + + rangeAddress = (XLRangeAddress)ws.Cell("A1").AsRange().Intersection(ws.Cell("C3").AsRange()); + Assert.IsFalse(rangeAddress.IsValid); + + Assert.Null(ws.Range("A1:C3").Intersection(null)); + + var otherWs = wb.AddWorksheet("Sheet2"); + Assert.Null(ws.Intersection(otherWs)); + Assert.Null(ws.Cell("A1").AsRange().Intersection(otherWs.Cell("A2").AsRange())); + } + } + + [Test] + public void Union() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + Assert.AreEqual(64, ws.Range("B9:I11").Union(ws.Range("D4:G16")).Count()); + Assert.AreEqual(58, ws.Range("E9:I11").Union(ws.Range("D4:G16")).Count()); + Assert.AreEqual(52, ws.Cell("E9").AsRange().Union(ws.Range("D4:G16")).Count()); + Assert.AreEqual(52, ws.Range("D4:G16").Union(ws.Cell("E9").AsRange()).Count()); + + Assert.AreEqual(2, ws.Cell("A1").AsRange().Union(ws.Cell("C3").AsRange()).Count()); + + Assert.AreEqual(9, ws.Range("A1:C3").Union(null).Count()); + + var otherWs = wb.AddWorksheet("Sheet2"); + Assert.False(ws.Union(otherWs).Any()); + Assert.False(ws.Cell("A1").AsRange().Union(otherWs.Cell("A2").AsRange()).Any()); + } + } + + [Test] + public void Difference() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + Assert.AreEqual(12, ws.Range("B9:I11").Difference(ws.Range("D4:G16")).Count()); + Assert.AreEqual(6, ws.Range("E9:I11").Difference(ws.Range("D4:G16")).Count()); + Assert.AreEqual(0, ws.Cell("E9").AsRange().Difference(ws.Range("D4:G16")).Count()); + Assert.AreEqual(51, ws.Range("D4:G16").Difference(ws.Cell("E9").AsRange()).Count()); + + Assert.AreEqual(1, ws.Cell("A1").AsRange().Difference(ws.Cell("C3").AsRange()).Count()); + + Assert.AreEqual(9, ws.Range("A1:C3").Difference(null).Count()); + + var otherWs = wb.AddWorksheet("Sheet2"); + Assert.False(ws.Difference(otherWs).Any()); + Assert.False(ws.Cell("A1").AsRange().Difference(otherWs.Cell("A2").AsRange()).Any()); + } + } + + [Test] + public void SurroundingCells() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + Assert.AreEqual(3, ws.FirstCell().AsRange().SurroundingCells().Count()); + Assert.AreEqual(8, ws.Cell("C3").AsRange().SurroundingCells().Count()); + Assert.AreEqual(16, ws.Range("C3:D6").AsRange().SurroundingCells().Count()); + + Assert.AreEqual(0, ws.Range("C3:D6").AsRange().SurroundingCells(c => !c.IsEmpty()).Count()); + } + } + + [Test] + public void ClearConditionalFormattingsWhenRangeAbove1() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Range("C3:D7").AddConditionalFormat(); + ws.Range("B2:E3").Clear(XLClearOptions.ConditionalFormats); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + Assert.AreEqual("C4:D7", ws.ConditionalFormats.Single().Range.RangeAddress.ToStringRelative()); + } + + [Test] + public void ClearConditionalFormattingsWhenRangeAbove2() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Range("C3:D7").AddConditionalFormat(); + ws.Range("C3:D3").Clear(XLClearOptions.ConditionalFormats); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + Assert.AreEqual("C4:D7", ws.ConditionalFormats.Single().Range.RangeAddress.ToStringRelative()); + } + + [Test] + public void ClearConditionalFormattingsWhenRangeBelow1() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Range("C3:D7").AddConditionalFormat(); + ws.Range("B7:E8").Clear(XLClearOptions.ConditionalFormats); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + Assert.AreEqual("C3:D6", ws.ConditionalFormats.Single().Range.RangeAddress.ToStringRelative()); + } + + [Test] + public void ClearConditionalFormattingsWhenRangeBelow2() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Range("C3:D7").AddConditionalFormat(); + ws.Range("C7:D7").Clear(XLClearOptions.ConditionalFormats); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + Assert.AreEqual("C3:D6", ws.ConditionalFormats.Single().Range.RangeAddress.ToStringRelative()); + } + + [Test] + public void ClearConditionalFormattingsWhenRangeRowInMiddle() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Range("C3:D7").AddConditionalFormat(); + ws.Range("C5:E5").Clear(XLClearOptions.ConditionalFormats); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + Assert.AreEqual("C3:D4", ws.ConditionalFormats.First().Ranges.First().RangeAddress.ToStringRelative()); + Assert.AreEqual("C6:D7", ws.ConditionalFormats.First().Ranges.Last().RangeAddress.ToStringRelative()); + } + + [Test] + public void ClearConditionalFormattingsWhenRangeColumnInMiddle() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Range("C3:G4").AddConditionalFormat(); + ws.Range("E2:E4").Clear(XLClearOptions.ConditionalFormats); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + Assert.AreEqual("C3:D4", ws.ConditionalFormats.First().Ranges.First().RangeAddress.ToStringRelative()); + Assert.AreEqual("F3:G4", ws.ConditionalFormats.First().Ranges.Last().RangeAddress.ToStringRelative()); + } + + [Test] + public void ClearConditionalFormattingsWhenRangeContainsFormatWhole() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Range("C3:G4").AddConditionalFormat(); + ws.Range("B2:G4").Clear(XLClearOptions.ConditionalFormats); + + Assert.AreEqual(0, ws.ConditionalFormats.Count()); + } + + [Test] + public void NoClearConditionalFormattingsWhenRangePartiallySuperimposed() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Range("C3:G4").AddConditionalFormat(); + ws.Range("C2:D3").Clear(XLClearOptions.ConditionalFormats); + + Assert.AreEqual(1, ws.ConditionalFormats.Count()); + Assert.AreEqual(1, ws.ConditionalFormats.Single().Ranges.Count); + Assert.AreEqual("C3:G4", ws.ConditionalFormats.Single().Ranges.Single().RangeAddress.ToStringRelative()); + } + + [Test] + public void RangesRemoveAllWithoutDispose() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + var ranges = new XLRanges(); + ranges.Add(ws.Range("A1:A2")); + ranges.Add(ws.Range("B1:B2")); + var rangesCopy = ranges.ToList(); + + ranges.RemoveAll(null, false); + ws.FirstColumn().InsertColumnsBefore(1); + + Assert.AreEqual(0, ranges.Count); + // if ranges were not disposed they addresses should change + Assert.AreEqual("B1:B2", rangesCopy.First().RangeAddress.ToString()); + Assert.AreEqual("C1:C2", rangesCopy.Last().RangeAddress.ToString()); + } + + + [Test] + public void RangesRemoveAllByCriteria() + { + var ws = new XLWorkbook().Worksheets.Add("Sheet1"); + var ranges = new XLRanges(); + ranges.Add(ws.Range("A1:A2")); + ranges.Add(ws.Range("B1:B3")); + ranges.Add(ws.Range("C1:C4")); + var otherRange = ws.Range("A3:D3"); + + ranges.RemoveAll(r => r.Intersects(otherRange)); + + Assert.AreEqual(1, ranges.Count); + Assert.AreEqual("A1:A2", ranges.Single().RangeAddress.ToString()); + } + + [Test] + public void XLRangesReturnsRangesInDeterministicOrder() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + var ws2 = wb.Worksheets.Add("Another sheet"); + + var ranges = new XLRanges(); + ranges.Add(ws2.Range("F1:F12")); + ranges.Add(ws1.Range("F12:F16")); + ranges.Add(ws1.Range("B1:F2")); + ranges.Add(ws2.Range("A13:B14")); + ranges.Add(ws2.Range("E1:E2")); + ranges.Add(ws1.Range("E1:H2")); + ranges.Add(ws1.Range("G2:G13")); + ranges.Add(ws1.Range("G20:G20")); + + var expectedRanges = new List + { + ws1.Range("B1:F2"), + ws1.Range("E1:H2"), + ws1.Range("G2:G13"), + ws1.Range("F12:F16"), + ws1.Range("G20:G20"), + + ws2.Range("E1:E2"), + ws2.Range("F1:F12"), + ws2.Range("A13:B14"), + }; + + var actualRanges = ranges.ToList(); + + Assert.AreEqual(expectedRanges.Count, actualRanges.Count); + for (int i = 0; i < actualRanges.Count; i++) + { + Assert.AreEqual(expectedRanges[i], actualRanges[i]); + } + } + + [Test] + public void ClearRangeRemovesSparklines() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.SparklineGroups.Add("B1:B3", "C1:E3"); + + ws.Range("B1:C1").Clear(XLClearOptions.All); + ws.Range("B2:C2").Clear(XLClearOptions.Sparklines); + + Assert.AreEqual(1, ws.SparklineGroups.Single().Count()); + Assert.IsFalse(ws.Cell("B1").HasSparkline); + Assert.IsFalse(ws.Cell("B2").HasSparkline); + Assert.IsTrue(ws.Cell("B3").HasSparkline); + + } + + [TestCase("B2:G7", "D4:E5", true, "B2:G3,B4:C5,D4:E5,F4:G5,B6:G7")] + [TestCase("B2:G7", "D4:E5", false, "B2:G3,B4:C5,F4:G5,B6:G7")] + [TestCase("B2:G7", "B2:G7", true, "B2:G7")] + [TestCase("B2:G7", "B2:G7", false, "")] + [TestCase("B2:G7", "A1:H8", true, "B2:G7")] + [TestCase("B2:G7", "A1:H8", false, "")] + [TestCase("B2:G7", "A1:B2", true, "B2:B2,C2:G2,B3:G7")] + [TestCase("B2:G7", "A1:B2", false, "C2:G2,B3:G7")] + [TestCase("B2:G7", "E4:J5", true, "B2:G3,B4:D5,E4:G5,B6:G7")] + [TestCase("B2:G7", "E4:J5", false, "B2:G3,B4:D5,B6:G7")] + [TestCase("B2:G7", "A11:H18", true, "B2:G7")] + [TestCase("B2:G7", "A11:H18", false, "B2:G7")] + [TestCase("B2:G7", "A1:H1", true, "B2:G7")] + [TestCase("B2:G7", "A1:A12", true, "B2:G7")] + [TestCase("B2:G7", "A8:H8", true, "B2:G7")] + [TestCase("B2:G7", "H1:H8", true, "B2:G7")] + public void CanSplitRange(string rangeAddress, string splitBy, bool includeIntersection, string expectedResult) + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet(); + var range = ws.Range(rangeAddress) as XLRange; + var splitter = ws.Range(splitBy); + + var result = range.Split(splitter.RangeAddress, includeIntersection); + + var actualAddresses = string.Join(",", result.Select(r => r.RangeAddress.ToString())); + + Assert.AreEqual(expectedResult, actualAddresses); + + } + } +} diff --git a/ClosedXML_Tests/Excel/RichText/XLRichStringTests.cs b/ClosedXML_Tests/Excel/RichText/XLRichStringTests.cs new file mode 100644 index 0000000..667633d --- /dev/null +++ b/ClosedXML_Tests/Excel/RichText/XLRichStringTests.cs @@ -0,0 +1,762 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests +{ + /// + /// This is a test class for XLRichStringTests and is intended + /// to contain all XLRichStringTests Unit Tests + /// + [TestFixture] + public class XLRichStringTests + { + [Test] + public void AccessRichTextTest1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.RichText.AddText("12"); + cell.DataType = XLDataType.Number; + + Assert.AreEqual(12.0, cell.GetDouble()); + + IXLRichText richText = cell.RichText; + + Assert.AreEqual("12", richText.ToString()); + + richText.AddText("34"); + + Assert.AreEqual("1234", cell.GetString()); + + Assert.AreEqual(XLDataType.Number, cell.DataType); + + Assert.AreEqual(1234.0, cell.GetDouble()); + } + + /// + /// A test for AddText + /// + [Test] + public void AddTextTest1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + IXLRichText richString = cell.RichText; + + string text = "Hello"; + richString.AddText(text).SetBold().SetFontColor(XLColor.Red); + + Assert.AreEqual(cell.GetString(), text); + Assert.AreEqual(cell.RichText.First().Bold, true); + Assert.AreEqual(cell.RichText.First().FontColor, XLColor.Red); + + Assert.AreEqual(1, richString.Count); + + richString.AddText("World"); + Assert.AreEqual(richString.First().Text, text, "Item in collection is not the same as the one returned"); + } + + [Test] + public void AddTextTest2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + Int32 number = 123; + + cell.SetValue(number).Style + .Font.SetBold() + .Font.SetFontColor(XLColor.Red); + + string text = number.ToString(); + + Assert.AreEqual(cell.RichText.ToString(), text); + Assert.AreEqual(cell.RichText.First().Bold, true); + Assert.AreEqual(cell.RichText.First().FontColor, XLColor.Red); + + Assert.AreEqual(1, cell.RichText.Count); + + cell.RichText.AddText("World"); + Assert.AreEqual(cell.RichText.First().Text, text, "Item in collection is not the same as the one returned"); + } + + [Test] + public void AddTextTest3() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + Int32 number = 123; + cell.Value = number; + cell.Style + .Font.SetBold() + .Font.SetFontColor(XLColor.Red); + + string text = number.ToString(); + + Assert.AreEqual(cell.RichText.ToString(), text); + Assert.AreEqual(cell.RichText.First().Bold, true); + Assert.AreEqual(cell.RichText.First().FontColor, XLColor.Red); + + Assert.AreEqual(1, cell.RichText.Count); + + cell.RichText.AddText("World"); + Assert.AreEqual(cell.RichText.First().Text, text, "Item in collection is not the same as the one returned"); + } + + /// + /// A test for Clear + /// + [Test] + public void ClearTest() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + richString.AddText(" "); + richString.AddText("World!"); + + richString.ClearText(); + String expected = String.Empty; + String actual = richString.ToString(); + Assert.AreEqual(expected, actual); + + Assert.AreEqual(0, richString.Count); + } + + [Test] + public void CountTest() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + richString.AddText(" "); + richString.AddText("World!"); + + Assert.AreEqual(3, richString.Count); + } + + [Test] + public void HasRichTextTest1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.RichText.AddText("123"); + + Assert.AreEqual(true, cell.HasRichText); + + cell.DataType = XLDataType.Text; + + Assert.AreEqual(true, cell.HasRichText); + + cell.DataType = XLDataType.Number; + + Assert.AreEqual(false, cell.HasRichText); + + cell.RichText.AddText("123"); + + Assert.AreEqual(true, cell.HasRichText); + + cell.Value = 123; + + Assert.AreEqual(false, cell.HasRichText); + + cell.RichText.AddText("123"); + + Assert.AreEqual(true, cell.HasRichText); + + cell.SetValue("123"); + + Assert.AreEqual(false, cell.HasRichText); + } + + /// + /// A test for Characters + /// + [Test] + public void Substring_All_From_OneString() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + + IXLFormattedText actual = richString.Substring(0); + + Assert.AreEqual(richString.First(), actual.First()); + + Assert.AreEqual(1, actual.Count); + + actual.First().SetBold(); + + Assert.AreEqual(true, ws.Cell(1, 1).RichText.First().Bold); + } + + [Test] + public void Substring_All_From_ThreeStrings() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Good Morning"); + richString.AddText(" my "); + richString.AddText("neighbors!"); + + IXLFormattedText actual = richString.Substring(0); + + Assert.AreEqual(richString.ElementAt(0), actual.ElementAt(0)); + Assert.AreEqual(richString.ElementAt(1), actual.ElementAt(1)); + Assert.AreEqual(richString.ElementAt(2), actual.ElementAt(2)); + + Assert.AreEqual(3, actual.Count); + Assert.AreEqual(3, richString.Count); + + actual.First().SetBold(); + + Assert.AreEqual(true, ws.Cell(1, 1).RichText.First().Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.Last().Bold); + } + + [Test] + public void Substring_From_OneString_End() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + + IXLFormattedText actual = richString.Substring(2); + + Assert.AreEqual(1, actual.Count); // substring was in one piece + + Assert.AreEqual(2, richString.Count); // The text was split because of the substring + + Assert.AreEqual("llo", actual.First().Text); + + Assert.AreEqual("He", richString.First().Text); + Assert.AreEqual("llo", richString.Last().Text); + + actual.First().SetBold(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.First().Bold); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.Last().Bold); + + richString.Last().SetItalic(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.First().Italic); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.Last().Italic); + + Assert.AreEqual(true, actual.First().Italic); + + richString.SetFontSize(20); + + Assert.AreEqual(20, ws.Cell(1, 1).RichText.First().FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.Last().FontSize); + + Assert.AreEqual(20, actual.First().FontSize); + } + + [Test] + public void Substring_From_OneString_Middle() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + + IXLFormattedText actual = richString.Substring(2, 2); + + Assert.AreEqual(1, actual.Count); // substring was in one piece + + Assert.AreEqual(3, richString.Count); // The text was split because of the substring + + Assert.AreEqual("ll", actual.First().Text); + + Assert.AreEqual("He", richString.First().Text); + Assert.AreEqual("ll", richString.ElementAt(1).Text); + Assert.AreEqual("o", richString.Last().Text); + + actual.First().SetBold(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.First().Bold); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(1).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.Last().Bold); + + richString.Last().SetItalic(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.First().Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Italic); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.Last().Italic); + + Assert.AreEqual(false, actual.First().Italic); + + richString.SetFontSize(20); + + Assert.AreEqual(20, ws.Cell(1, 1).RichText.First().FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(1).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.Last().FontSize); + + Assert.AreEqual(20, actual.First().FontSize); + } + + [Test] + public void Substring_From_OneString_Start() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + + IXLFormattedText actual = richString.Substring(0, 2); + + Assert.AreEqual(1, actual.Count); // substring was in one piece + + Assert.AreEqual(2, richString.Count); // The text was split because of the substring + + Assert.AreEqual("He", actual.First().Text); + + Assert.AreEqual("He", richString.First().Text); + Assert.AreEqual("llo", richString.Last().Text); + + actual.First().SetBold(); + + Assert.AreEqual(true, ws.Cell(1, 1).RichText.First().Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.Last().Bold); + + richString.Last().SetItalic(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.First().Italic); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.Last().Italic); + + Assert.AreEqual(false, actual.First().Italic); + + richString.SetFontSize(20); + + Assert.AreEqual(20, ws.Cell(1, 1).RichText.First().FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.Last().FontSize); + + Assert.AreEqual(20, actual.First().FontSize); + } + + [Test] + public void Substring_From_ThreeStrings_End1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Good Morning"); + richString.AddText(" my "); + richString.AddText("neighbors!"); + + IXLFormattedText actual = richString.Substring(21); + + Assert.AreEqual(1, actual.Count); // substring was in one piece + + Assert.AreEqual(4, richString.Count); // The text was split because of the substring + + Assert.AreEqual("bors!", actual.First().Text); + + Assert.AreEqual("Good Morning", richString.ElementAt(0).Text); + Assert.AreEqual(" my ", richString.ElementAt(1).Text); + Assert.AreEqual("neigh", richString.ElementAt(2).Text); + Assert.AreEqual("bors!", richString.ElementAt(3).Text); + + actual.First().SetBold(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(0).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Bold); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(3).Bold); + + richString.Last().SetItalic(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(0).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Italic); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(3).Italic); + + Assert.AreEqual(true, actual.First().Italic); + + richString.SetFontSize(20); + + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(0).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(1).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(2).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(3).FontSize); + + Assert.AreEqual(20, actual.First().FontSize); + } + + [Test] + public void Substring_From_ThreeStrings_End2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Good Morning"); + richString.AddText(" my "); + richString.AddText("neighbors!"); + + IXLFormattedText actual = richString.Substring(13); + + Assert.AreEqual(2, actual.Count); + + Assert.AreEqual(4, richString.Count); // The text was split because of the substring + + Assert.AreEqual("my ", actual.ElementAt(0).Text); + Assert.AreEqual("neighbors!", actual.ElementAt(1).Text); + + Assert.AreEqual("Good Morning", richString.ElementAt(0).Text); + Assert.AreEqual(" ", richString.ElementAt(1).Text); + Assert.AreEqual("my ", richString.ElementAt(2).Text); + Assert.AreEqual("neighbors!", richString.ElementAt(3).Text); + + actual.ElementAt(1).SetBold(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(0).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Bold); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(3).Bold); + + richString.Last().SetItalic(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(0).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Italic); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(3).Italic); + + Assert.AreEqual(false, actual.ElementAt(0).Italic); + Assert.AreEqual(true, actual.ElementAt(1).Italic); + + richString.SetFontSize(20); + + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(0).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(1).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(2).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(3).FontSize); + + Assert.AreEqual(20, actual.ElementAt(0).FontSize); + Assert.AreEqual(20, actual.ElementAt(1).FontSize); + } + + [Test] + public void Substring_From_ThreeStrings_Mid1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Good Morning"); + richString.AddText(" my "); + richString.AddText("neighbors!"); + + IXLFormattedText actual = richString.Substring(5, 10); + + Assert.AreEqual(2, actual.Count); + + Assert.AreEqual(5, richString.Count); // The text was split because of the substring + + Assert.AreEqual("Morning", actual.ElementAt(0).Text); + Assert.AreEqual(" my", actual.ElementAt(1).Text); + + Assert.AreEqual("Good ", richString.ElementAt(0).Text); + Assert.AreEqual("Morning", richString.ElementAt(1).Text); + Assert.AreEqual(" my", richString.ElementAt(2).Text); + Assert.AreEqual(" ", richString.ElementAt(3).Text); + Assert.AreEqual("neighbors!", richString.ElementAt(4).Text); + } + + [Test] + public void Substring_From_ThreeStrings_Mid2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Good Morning"); + richString.AddText(" my "); + richString.AddText("neighbors!"); + + IXLFormattedText actual = richString.Substring(5, 15); + + Assert.AreEqual(3, actual.Count); + + Assert.AreEqual(5, richString.Count); // The text was split because of the substring + + Assert.AreEqual("Morning", actual.ElementAt(0).Text); + Assert.AreEqual(" my ", actual.ElementAt(1).Text); + Assert.AreEqual("neig", actual.ElementAt(2).Text); + + Assert.AreEqual("Good ", richString.ElementAt(0).Text); + Assert.AreEqual("Morning", richString.ElementAt(1).Text); + Assert.AreEqual(" my ", richString.ElementAt(2).Text); + Assert.AreEqual("neig", richString.ElementAt(3).Text); + Assert.AreEqual("hbors!", richString.ElementAt(4).Text); + } + + [Test] + public void Substring_From_ThreeStrings_Start1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Good Morning"); + richString.AddText(" my "); + richString.AddText("neighbors!"); + + IXLFormattedText actual = richString.Substring(0, 4); + + Assert.AreEqual(1, actual.Count); // substring was in one piece + + Assert.AreEqual(4, richString.Count); // The text was split because of the substring + + Assert.AreEqual("Good", actual.First().Text); + + Assert.AreEqual("Good", richString.ElementAt(0).Text); + Assert.AreEqual(" Morning", richString.ElementAt(1).Text); + Assert.AreEqual(" my ", richString.ElementAt(2).Text); + Assert.AreEqual("neighbors!", richString.ElementAt(3).Text); + + actual.First().SetBold(); + + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(0).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(3).Bold); + + richString.First().SetItalic(); + + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(0).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(3).Italic); + + Assert.AreEqual(true, actual.First().Italic); + + richString.SetFontSize(20); + + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(0).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(1).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(2).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(3).FontSize); + + Assert.AreEqual(20, actual.First().FontSize); + } + + [Test] + public void Substring_From_ThreeStrings_Start2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Good Morning"); + richString.AddText(" my "); + richString.AddText("neighbors!"); + + IXLFormattedText actual = richString.Substring(0, 15); + + Assert.AreEqual(2, actual.Count); + + Assert.AreEqual(4, richString.Count); // The text was split because of the substring + + Assert.AreEqual("Good Morning", actual.ElementAt(0).Text); + Assert.AreEqual(" my", actual.ElementAt(1).Text); + + Assert.AreEqual("Good Morning", richString.ElementAt(0).Text); + Assert.AreEqual(" my", richString.ElementAt(1).Text); + Assert.AreEqual(" ", richString.ElementAt(2).Text); + Assert.AreEqual("neighbors!", richString.ElementAt(3).Text); + + actual.ElementAt(1).SetBold(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(0).Bold); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(1).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(3).Bold); + + richString.First().SetItalic(); + + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(0).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(3).Italic); + + Assert.AreEqual(true, actual.ElementAt(0).Italic); + Assert.AreEqual(false, actual.ElementAt(1).Italic); + + richString.SetFontSize(20); + + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(0).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(1).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(2).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(3).FontSize); + + Assert.AreEqual(20, actual.ElementAt(0).FontSize); + Assert.AreEqual(20, actual.ElementAt(1).FontSize); + } + + [Test] + public void Substring_IndexOutsideRange1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + + Assert.That(() => richString.Substring(50), Throws.TypeOf()); + } + + [Test] + public void Substring_IndexOutsideRange2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + richString.AddText("World"); + + Assert.That(() => richString.Substring(50), Throws.TypeOf()); + } + + [Test] + public void Substring_IndexOutsideRange3() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + + Assert.That(() => richString.Substring(1, 10), Throws.TypeOf()); + } + + [Test] + public void Substring_IndexOutsideRange4() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + richString.AddText("World"); + + Assert.That(() => richString.Substring(5, 20), Throws.TypeOf()); + } + + /// + /// A test for ToString + /// + [Test] + public void ToStringTest() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + richString.AddText(" "); + richString.AddText("World"); + string expected = "Hello World"; + string actual = richString.ToString(); + Assert.AreEqual(expected, actual); + + richString.AddText("!"); + expected = "Hello World!"; + actual = richString.ToString(); + Assert.AreEqual(expected, actual); + + richString.ClearText(); + expected = String.Empty; + actual = richString.ToString(); + Assert.AreEqual(expected, actual); + } + + [Test(Description = "See #1361")] + public void CanClearInlinedRichText() + { + using (var outputStream = new MemoryStream()) + { + using (var inputStream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\InlinedRichText\ChangeRichText\inputfile.xlsx"))) + using (var workbook = new XLWorkbook(inputStream)) + { + workbook.Worksheets.First().Cell("A1").Value = ""; + workbook.SaveAs(outputStream); + } + + using (var wb = new XLWorkbook(outputStream)) + { + Assert.AreEqual("", wb.Worksheets.First().Cell("A1").Value); + } + } + } + + [Test] + public void CanChangeInlinedRichText() + { + void testRichText(IXLRichText richText) + { + Assert.IsNotNull(richText); + Assert.IsTrue(richText.Any()); + Assert.AreEqual("3", richText.ElementAt(2).Text); + Assert.AreEqual(XLColor.Red, richText.ElementAt(2).FontColor); + } + + using (var outputStream = new MemoryStream()) + { + using (var inputStream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\InlinedRichText\ChangeRichText\inputfile.xlsx"))) + using (var workbook = new XLWorkbook(inputStream)) + { + var richText = workbook.Worksheets.First().Cell("A1").RichText; + testRichText(richText); + richText.AddText(" - changed"); + workbook.SaveAs(outputStream); + } + + using (var wb = new XLWorkbook(outputStream)) + { + var cell = wb.Worksheets.First().Cell("A1"); + Assert.IsFalse(cell.ShareString); + Assert.IsTrue(cell.HasRichText); + var rt = cell.RichText; + Assert.AreEqual("Year (range: 3 yrs) - changed", rt.ToString()); + testRichText(rt); + } + } + } + + [Test] + public void ClearInlineRichTextWhenRelevant() + { + using (var ms = new MemoryStream()) + { + TestHelper.CreateAndCompare(() => + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var cell = ws.FirstCell(); + + cell.RichText.AddText("Bold").SetBold().AddText(" and red").SetBold().SetFontColor(XLColor.Red); + cell.ShareString = false; + + //wb.SaveAs(ms); + wb.SaveAs(ms); + } + ms.Seek(0, SeekOrigin.Begin); + + var wb2 = new XLWorkbook(ms); + { + var ws = wb2.Worksheets.First(); + var cell = ws.FirstCell(); + + cell.FormulaA1 = "=1 + 2"; + wb2.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + return wb2; + }, @"Other\InlinedRichText\ChangeRichTextToFormula\output.xlsx"); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Rows/RowTests.cs b/ClosedXML_Tests/Excel/Rows/RowTests.cs new file mode 100644 index 0000000..89dc857 --- /dev/null +++ b/ClosedXML_Tests/Excel/Rows/RowTests.cs @@ -0,0 +1,272 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Linq; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class RowTests + { + [Test] + public void CopyRow() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Test").Style.Font.SetBold(); + ws.FirstRow().CopyTo(ws.Row(2)); + + Assert.IsTrue(ws.Cell("A2").Style.Font.Bold); + } + + [Test] + public void InsertingRowsAbove1() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + + ws.Rows("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); + ws.Row(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); + ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); + + IXLRow row1 = ws.Row(1); + IXLRow row2 = ws.Row(2); + IXLRow row3 = ws.Row(3); + + IXLRow rowIns = ws.Row(1).InsertRowsAbove(1).First(); + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Row(1).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Row(1).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Row(1).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Row(3).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", ws.Row(3).Cell(2).GetString()); + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, rowIns.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, rowIns.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, rowIns.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, row1.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row1.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row1.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, row2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, row2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, row2.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, row3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row3.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", row2.Cell(2).GetString()); + } + + [Test] + public void InsertingRowsAbove2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + + ws.Rows("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); + ws.Row(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); + ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); + + IXLRow row1 = ws.Row(1); + IXLRow row2 = ws.Row(2); + IXLRow row3 = ws.Row(3); + + IXLRow rowIns = ws.Row(2).InsertRowsAbove(1).First(); + + Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Row(3).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", ws.Row(3).Cell(2).GetString()); + + Assert.AreEqual(XLColor.Red, rowIns.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, rowIns.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, rowIns.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, row1.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row1.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row1.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, row2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, row2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, row2.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, row3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row3.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", row2.Cell(2).GetString()); + } + + [Test] + public void InsertingRowsAbove3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + + ws.Rows("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); + ws.Row(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); + ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); + + IXLRow row1 = ws.Row(1); + IXLRow row2 = ws.Row(2); + IXLRow row3 = ws.Row(3); + + IXLRow rowIns = ws.Row(3).InsertRowsAbove(1).First(); + + Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Row(2).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Row(2).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Row(2).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Row(3).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", ws.Row(2).Cell(2).GetString()); + + Assert.AreEqual(XLColor.Yellow, rowIns.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, rowIns.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, rowIns.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, row1.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row1.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row1.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, row2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, row2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, row2.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, row3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row3.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", row2.Cell(2).GetString()); + } + + [Test] + public void InsertingRowsAbove4() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + + ws.Row(2).Height = 15; + ws.Row(3).Height = 20; + ws.Row(4).Height = 25; + ws.Row(5).Height = 35; + + ws.Row(2).FirstCell().SetValue("Row height: 15"); + ws.Row(3).FirstCell().SetValue("Row height: 20"); + ws.Row(4).FirstCell().SetValue("Row height: 25"); + ws.Row(5).FirstCell().SetValue("Row height: 35"); + + ws.Range("3:3").InsertRowsAbove(1); + + Assert.AreEqual(15, ws.Row(2).Height); + Assert.AreEqual(20, ws.Row(4).Height); + Assert.AreEqual(25, ws.Row(5).Height); + Assert.AreEqual(35, ws.Row(6).Height); + + Assert.AreEqual(20, ws.Row(3).Height); + ws.Row(3).ClearHeight(); + Assert.AreEqual(ws.RowHeight, ws.Row(3).Height); + } + } + + [Test] + public void NoRowsUsed() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + Int32 count = 0; + + foreach (IXLRow row in ws.RowsUsed()) + count++; + + foreach (IXLRangeRow row in ws.Range("A1:C3").RowsUsed()) + count++; + + Assert.AreEqual(0, count); + } + + [Test] + public void RowUsed() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 2).SetValue("Test"); + ws.Cell(1, 3).SetValue("Test"); + + IXLRangeRow fromRow = ws.Row(1).RowUsed(); + Assert.AreEqual("B1:C1", fromRow.RangeAddress.ToStringRelative()); + + IXLRangeRow fromRange = ws.Range("A1:E1").FirstRow().RowUsed(); + Assert.AreEqual("B1:C1", fromRange.RangeAddress.ToStringRelative()); + } + + [Test] + public void UngroupFromAll() + { + IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); + ws.Rows(1, 2).Group(); + ws.Rows(1, 2).Ungroup(true); + } + + [Test] + public void NegativeRowNumberIsInvalid() + { + var ws = new XLWorkbook().AddWorksheet("Sheet1") as XLWorksheet; + + var row = new XLRow(ws, -1); + + Assert.IsFalse(row.RangeAddress.IsValid); + } + + [Test] + public void DeleteRowOnWorksheetWithComment() + { + var ws = new XLWorkbook().AddWorksheet(); + ws.Cell(4, 1).Comment.AddText("test"); + ws.Column(1).Width = 100; + Assert.DoesNotThrow(() => ws.Row(1).Delete()); + } + } +} diff --git a/ClosedXML_Tests/Excel/Saving/SavingTests.cs b/ClosedXML_Tests/Excel/Saving/SavingTests.cs new file mode 100644 index 0000000..9ddf9d6 --- /dev/null +++ b/ClosedXML_Tests/Excel/Saving/SavingTests.cs @@ -0,0 +1,733 @@ +using ClosedXML.Excel; +using ClosedXML.Excel.Drawings; +using ClosedXML_Tests.Utils; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Packaging; +using NUnit.Framework; +using System; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Threading; + +namespace ClosedXML_Tests.Excel.Saving +{ + [TestFixture] + public class SavingTests + { + [Test] + public void CanSaveEmptyFile() + { + using (var ms = new MemoryStream()) + using (var wb = new XLWorkbook()) + { + wb.AddWorksheet("Sheet1"); + wb.SaveAs(ms); + } + } + + [Test] + public void CanSuccessfullySaveFileMultipleTimes() + { + using (var memoryStream = new MemoryStream()) + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + + // Comments might cause duplicate VmlDrawing Id's - ensure it's tested: + sheet.Cell(1, 1).Comment.AddText("abc"); + + wb.SaveAs(memoryStream, validate: true); + + for (int i = 1; i <= 3; i++) + { + sheet.Cell(i, 1).Value = "test" + i; + wb.SaveAs(memoryStream, validate: true); + } + } + } + + [Test] + public void CanEscape_xHHHH_Correctly() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().Value = "Reserve_TT_A_BLOCAGE_CAG_x6904_2"; + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual("Reserve_TT_A_BLOCAGE_CAG_x6904_2", ws.FirstCell().Value); + } + } + } + + [Test] + public void CanSaveFileMultipleTimesAfterDeletingWorksheet() + { + // https://github.com/ClosedXML/ClosedXML/issues/435 + + using (var ms = new MemoryStream()) + { + using (XLWorkbook book1 = new XLWorkbook()) + { + book1.AddWorksheet("sheet1"); + book1.AddWorksheet("sheet2"); + + book1.SaveAs(ms); + } + ms.Position = 0; + + using (XLWorkbook book2 = new XLWorkbook(ms)) + { + var ws = book2.Worksheet(1); + Assert.AreEqual("sheet1", ws.Name); + ws.Delete(); + book2.Save(); + book2.Save(); + } + } + } + + [Test] + public void CanSaveAndValidateFileInAnotherCulture() + { + string[] cultures = new string[] { "it", "de-AT" }; + + foreach (var culture in cultures) + { + Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(culture); + + using (var wb = new XLWorkbook()) + { + var memoryStream = new MemoryStream(); + var ws = wb.Worksheets.Add("Sheet1"); + + wb.SaveAs(memoryStream, true); + } + } + } + + [Test] + public void NotSaveCachedValueWhenFlagIsFalse() + { + using (var ms = new MemoryStream()) + { + using (XLWorkbook book1 = new XLWorkbook()) + { + var sheet = book1.AddWorksheet("sheet1"); + sheet.Cell("A1").Value = 123; + sheet.Cell("A2").FormulaA1 = "A1*10"; + book1.RecalculateAllFormulas(); + var options = new SaveOptions { EvaluateFormulasBeforeSaving = false }; + + book1.SaveAs(ms, options); + } + ms.Position = 0; + + using (XLWorkbook book2 = new XLWorkbook(ms)) + { + var ws = book2.Worksheet(1); + + Assert.IsNull(ws.Cell("A2").CachedValue); + } + } + } + + [Test] + public void SaveCachedValueWhenFlagIsTrue() + { + using (var ms = new MemoryStream()) + { + using (XLWorkbook book1 = new XLWorkbook()) + { + var sheet = book1.AddWorksheet("sheet1"); + sheet.Cell("A1").Value = 123; + sheet.Cell("A2").FormulaA1 = "A1*10"; + sheet.Cell("A3").FormulaA1 = "TEXT(A2, \"# ###\")"; + var options = new SaveOptions { EvaluateFormulasBeforeSaving = true }; + + book1.SaveAs(ms, options); + } + ms.Position = 0; + + using (XLWorkbook book2 = new XLWorkbook(ms)) + { + var ws = book2.Worksheet(1); + + Assert.AreEqual(1230, ws.Cell("A2").CachedValue); + + Assert.AreEqual("1 230", ws.Cell("A3").CachedValue); + } + } + } + + [Test] + public void CanSaveAsCopyReadOnlyFile() + { + using (var original = new TemporaryFile()) + { + try + { + using (var copy = new TemporaryFile()) + { + // Arrange + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + wb.SaveAs(original.Path); + } + File.SetAttributes(original.Path, FileAttributes.ReadOnly); + + // Act + using (var wb = new XLWorkbook(original.Path)) + { + wb.SaveAs(copy.Path); + } + + // Assert + Assert.IsTrue(File.Exists(copy.Path)); + Assert.IsFalse(File.GetAttributes(copy.Path).HasFlag(FileAttributes.ReadOnly)); + } + } + finally + { + // Tear down + File.SetAttributes(original.Path, FileAttributes.Normal); + } + } + } + + [Test] + public void CanSaveAsOverwriteExistingFile() + { + using (var existing = new TemporaryFile()) + { + // Arrange + File.WriteAllText(existing.Path, ""); + + // Act + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + wb.SaveAs(existing.Path); + } + + // Assert + Assert.IsTrue(File.Exists(existing.Path)); + Assert.Greater(new FileInfo(existing.Path).Length, 0); + } + } + + [Test] + public void CannotSaveAsOverwriteExistingReadOnlyFile() + { + using (var existing = new TemporaryFile()) + { + try + { + // Arrange + File.WriteAllText(existing.Path, ""); + File.SetAttributes(existing.Path, FileAttributes.ReadOnly); + + // Act + TestDelegate saveAs = () => + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + wb.SaveAs(existing.Path); + } + }; + + // Assert + Assert.Throws(typeof(UnauthorizedAccessException), saveAs); + } + finally + { + // Tear down + File.SetAttributes(existing.Path, FileAttributes.Normal); + } + } + } + + [Test] + public void PageBreaksDontDuplicateAtSaving() + { + // https://github.com/ClosedXML/ClosedXML/issues/666 + + using (var ms = new MemoryStream()) + { + using (var wb1 = new XLWorkbook()) + { + var ws = wb1.Worksheets.Add("Page Breaks"); + ws.PageSetup.PrintAreas.Add("A1:D5"); + ws.PageSetup.AddHorizontalPageBreak(2); + ws.PageSetup.AddVerticalPageBreak(2); + wb1.SaveAs(ms); + wb1.Save(); + } + using (var wb2 = new XLWorkbook(ms)) + { + var ws = wb2.Worksheets.First(); + + Assert.AreEqual(1, ws.PageSetup.ColumnBreaks.Count); + Assert.AreEqual(1, ws.PageSetup.RowBreaks.Count); + } + } + } + + [Test] + public void CanSaveFileWithPictureAndComment() + { + using (var ms = new MemoryStream()) + using (var wb = new XLWorkbook()) + using (var resourceStream = Assembly.GetAssembly(typeof(ClosedXML_Examples.BasicTable)).GetManifestResourceStream("ClosedXML_Examples.Resources.SampleImage.jpg")) + using (var bitmap = Bitmap.FromStream(resourceStream) as Bitmap) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell("D4").Value = "Hello world."; + + ws.AddPicture(bitmap, "MyPicture") + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(50, 50) + .WithSize(200, 200); + + ws.Cell("D4").Comment.SetVisible().AddText("This is a comment"); + + wb.SaveAs(ms); + } + } + + [Test] + public void PreserveChartsWhenSaving() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\Charts\PreserveCharts\inputfile.xlsx"))) + using (var ms = new MemoryStream()) + { + TestHelper.CreateAndCompare(() => + { + var wb = new XLWorkbook(stream); + wb.SaveAs(ms); + return wb; + }, @"Other\Charts\PreserveCharts\outputfile.xlsx"); + } + } + + [Test] + public void DeletingAllPicturesRemovesDrawingPart() + { + TestHelper.CreateAndCompare(() => + { + var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageAnchors.xlsx")); + var wb = new XLWorkbook(stream); + foreach (var ws in wb.Worksheets) + { + var pictureNames = ws.Pictures.Select(pic => pic.Name).ToArray(); + foreach (var name in pictureNames) + ws.Pictures.Delete(name); + } + + return wb; + }, @"Other\Drawings\NoDrawings\outputfile.xlsx"); + } + + [Test] + [TestCase("xlsx", SpreadsheetDocumentType.Workbook)] + [TestCase("xlsm", SpreadsheetDocumentType.MacroEnabledWorkbook)] + [TestCase("xltx", SpreadsheetDocumentType.Template)] + [TestCase("xltm", SpreadsheetDocumentType.MacroEnabledTemplate)] + public void SavesAsProperSpreadsheetDocumentType(string extension, SpreadsheetDocumentType expectedType) + { + using (var tf = new TemporaryFile(Path.ChangeExtension(Path.GetTempFileName(), extension))) + { + using (var wb = new XLWorkbook()) + { + wb.Worksheets.Add("Sheet1"); + wb.SaveAs(tf.Path); + } + + using (var package = SpreadsheetDocument.Open(tf.Path, false)) + { + Assert.AreEqual(expectedType, package.DocumentType); + } + } + } + + [Test] + public void CanSaveTemplateAsWorkbook() + { + // See #1375 + using (var template = new TemporaryFile(Path.ChangeExtension(Path.GetTempFileName(), "xltx"))) + using (var workbook = new TemporaryFile()) + { + using (var wb = new XLWorkbook()) + { + wb.AddWorksheet(); + wb.SaveAs(template.Path); + } + using (var wb = new XLWorkbook(template.Path)) + { + wb.SaveAs(workbook.Path); + } + using (var package = SpreadsheetDocument.Open(workbook.Path, false)) + { + Assert.AreEqual(SpreadsheetDocumentType.Workbook, package.DocumentType); + } + } + } + + [Test] + public void SaveAsWithNoExtensionFails() + { + using (var tf = new TemporaryFile("FileWithNoExtension")) + using (var wb = new XLWorkbook()) + { + wb.Worksheets.Add("Sheet1"); + TestDelegate action = () => wb.SaveAs(tf.Path); + + Assert.Throws(action); + } + } + + [Test] + public void SaveAsWithUnsupportedExtensionFails() + { + using (var tf = new TemporaryFile("FileWithBadExtension.bad")) + using (var wb = new XLWorkbook()) + { + wb.Worksheets.Add("Sheet1"); + TestDelegate action = () => wb.SaveAs(tf.Path); + + Assert.Throws(action); + } + } + + [Test] + public void SaveCellValueWithLeadingQuotationMarkCorrectly() + { + var quotedFormulaValue = "'=IF(TRUE, 1, 0)"; + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var cell = ws.FirstCell(); + cell.SetValue(quotedFormulaValue); + Assert.IsFalse(cell.HasFormula); + Assert.AreEqual(quotedFormulaValue, cell.Value); + + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + var cell = ws.FirstCell(); + Assert.IsFalse(cell.HasFormula); + Assert.AreEqual(quotedFormulaValue, cell.Value); + } + } + } + + [Test] + public void PreserveHeightOfEmptyRowsOnSaving() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.RowHeight = 50; + ws.Row(2).Height = 0; + ws.Row(3).Height = 20; + ws.Row(4).Height = 100; + + ws.CopyTo("Sheet2"); + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + foreach (var sheetName in new[] { "Sheet1", "Sheet2" }) + { + var ws = wb.Worksheet(sheetName); + + Assert.AreEqual(50, ws.Row(1).Height); + Assert.AreEqual(0, ws.Row(2).Height); + Assert.AreEqual(20, ws.Row(3).Height); + Assert.AreEqual(100, ws.Row(4).Height); + } + } + } + } + + [Test] + public void PreserveWidthOfEmptyColumnsOnSaving() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Column(2).Width = 0; + ws.Column(3).Width = 20; + ws.Column(4).Width = 100; + + ws.CopyTo("Sheet2"); + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + foreach (var sheetName in new[] { "Sheet1", "Sheet2" }) + { + var ws = wb.Worksheet(sheetName); + + Assert.AreEqual(ws.ColumnWidth, ws.Column(1).Width); + Assert.AreEqual(0, ws.Column(2).Width); + Assert.AreEqual(20, ws.Column(3).Width); + Assert.AreEqual(100, ws.Column(4).Width); + } + } + } + } + + [Test] + public void PreserveAlignmentOnSaving() + { + using (var input = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\HorizontalAlignment.xlsx"))) + using (var output = new MemoryStream()) + { + using (var wb = new XLWorkbook(input)) + { + wb.SaveAs(output); + } + + using (var wb = new XLWorkbook(output)) + { + Assert.AreEqual(XLAlignmentHorizontalValues.Center, wb.Worksheets.First().Cell("B1").Style.Alignment.Horizontal); + } + } + } + + [Test] + public void PreserveMultipleColorScalesOnSaving() + { + using (var output = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("test"); + sheet.Column(1).AddConditionalFormat().ColorScale().LowestValue(XLColor.Red) + .HighestValue(XLColor.Green); + + sheet.Column(2).AddConditionalFormat().ColorScale().LowestValue(XLColor.Alizarin) + .HighestValue(XLColor.Blue); + + wb.SaveAs(output); + } + + using (var wb = new XLWorkbook(output)) + { + var sheet = wb.Worksheets.First(); + var cf = sheet.ConditionalFormats + .OrderBy(x => x.Range.RangeAddress.FirstAddress.ColumnNumber) + .ToArray(); + Assert.AreEqual(2, cf.Length); + Assert.AreEqual(XLConditionalFormatType.ColorScale, cf[0].ConditionalFormatType); + Assert.AreEqual(XLColor.Red, cf[0].Colors[1]); + Assert.AreEqual(XLCFContentType.Minimum, cf[0].ContentTypes[1]); + Assert.AreEqual(XLColor.Green, cf[0].Colors[2]); + Assert.AreEqual(XLCFContentType.Maximum, cf[0].ContentTypes[2]); + Assert.AreEqual(XLConditionalFormatType.ColorScale, cf[1].ConditionalFormatType); + Assert.AreEqual(XLColor.Alizarin, cf[1].Colors[1]); + Assert.AreEqual(XLCFContentType.Minimum, cf[1].ContentTypes[1]); + Assert.AreEqual(XLColor.Blue, cf[1].Colors[2]); + Assert.AreEqual(XLCFContentType.Maximum, cf[1].ContentTypes[2]); + } + } + } + + [Test] + public void RemoveExistingInlineStringsIfRequired() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\InlineStrings\inputfile.xlsx"))) + using (var ms = new MemoryStream()) + { + TestHelper.CreateAndCompare(() => + { + var wb = new XLWorkbook(stream); + var ws = wb.Worksheet(1); + + var numericCells = ws.CellsUsed(c => double.TryParse(c.GetString(), out double _)); + var textCells = ws.CellsUsed(c => !double.TryParse(c.GetString(), out double _)); + + foreach (var cell in numericCells) + { + cell.Clear(XLClearOptions.AllFormats); + cell.SetDataType(XLDataType.Number); + } + + foreach (var cell in textCells) + { + cell.ShareString = true; + } + + wb.SaveAs(ms); + + return wb; + }, @"Other\InlineStrings\outputfile.xlsx"); + } + } + + [Test] + public void CanSaveFileWithEmptyFill() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\EmptyFill.xlsx"))) + using (var wb = new XLWorkbook(stream)) + using (var ms = new MemoryStream()) + { + Assert.DoesNotThrow(() => wb.SaveAs(ms, false)); + } + } + + [Test] + public void CanSaveSingleRowAutoFilter() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\SingleRowAutoFilter.xlsx"))) + using (var wb = new XLWorkbook(stream)) + using (var ms = new MemoryStream()) + { + Assert.DoesNotThrow(() => wb.SaveAs(ms, false)); + } + } + + [Test] + public void PivotTableWithVeryLongField() + { + TestHelper.CreateAndCompare(() => + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet(); + + var longText = string.Join(" ", Enumerable.Range(0, 40).Select(i => "1234567890")); + + var data = new[] + { + new { Col1 = longText, Col2 = 2} + }; + + var table = ws.FirstCell().InsertTable(data); + + var pvtSheet = wb.AddWorksheet("pvt"); + + var pvt = table.CreatePivotTable(pvtSheet.FirstCell(), "PivotTable1"); + pvt.RowLabels.Add("Col1"); + + return wb; + }, @"Other\PivotTableReferenceFiles\LongText\outputfile.xlsx"); + } + + [Test] + public void CanSaveFileWithVml_NoComments() + { + //See #1285 + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\FileWithButton.xlsm"))) + using (var wb = new XLWorkbook(stream)) + using (var ms = new MemoryStream()) + { + Assert.DoesNotThrow(() => wb.SaveAs(ms)); + } + } + + [Test] + public void CanEnableWorkbookFilterPrivacyAndSaveInWorkbook() + { + using var ms = new MemoryStream(); + + using (var wb = new XLWorkbook()) + { + wb.AddWorksheet(); + wb.SaveAs(ms, new SaveOptions { FilterPrivacy = true }); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = SpreadsheetDocument.Open(ms, false)) + { + Assert.IsTrue(wb.WorkbookPart.Workbook.WorkbookProperties.FilterPrivacy); + } + } + + [Test] + public void WorkbookFilterPrivacyIsNotSetByDefault() + { + using var ms = new MemoryStream(); + + using (var wb = new XLWorkbook()) + { + wb.AddWorksheet(); + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = SpreadsheetDocument.Open(ms, false)) + { + Assert.IsNull(wb.WorkbookPart.Workbook.WorkbookProperties.FilterPrivacy); + } + } + + [Test] + public void WorkbookFilterPrivacyIsReadCorrectly() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"TryToLoad\FilterPrivacyEnabledWorkbook.xlsx"))) + using (var wb = SpreadsheetDocument.Open(stream, false)) + { + Assert.IsTrue(wb.WorkbookPart.Workbook.WorkbookProperties.FilterPrivacy); + } + } + + [Test] + public void CanSaveAsWithDataValidationAfterInsertFirstRowsAboveAndInsertFirstColumnsBefore() + { + using (var wb = new XLWorkbook()) + using (var ms = new MemoryStream()) + { + var ws = wb.AddWorksheet("WithDataValidation"); + ws.Range("B4:B4").SetDataValidation().WholeNumber.Between(0, 1); + + ws.Row(1).InsertRowsAbove(1); + var dv = ws.DataValidations.ToArray(); + Assert.AreEqual(1, dv.Length); + Assert.AreEqual("B5:B5", dv[0].Ranges.Single().RangeAddress.ToString()); + + Assert.DoesNotThrow(() => wb.SaveAs(ms)); + + + ws.Column(1).InsertColumnsBefore(1); + dv = ws.DataValidations.ToArray(); + Assert.AreEqual(1, dv.Length); + Assert.AreEqual("C5:C5", dv[0].Ranges.Single().RangeAddress.ToString()); + + Assert.DoesNotThrow(() => wb.SaveAs(ms)); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Sparklines/SparklinesTests.cs b/ClosedXML_Tests/Excel/Sparklines/SparklinesTests.cs new file mode 100644 index 0000000..8f8a372 --- /dev/null +++ b/ClosedXML_Tests/Excel/Sparklines/SparklinesTests.cs @@ -0,0 +1,1075 @@ +using ClosedXML.Excel; +using ClosedXML_Examples.Sparklines; +using NUnit.Framework; +using System; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.Excel.Sparklines +{ + [TestFixture] + public class SparklinesTests + { + #region Add sparklines + + [Test] + public void CannotCreateSparklineGroupsWithoutWorksheet() + { + TestDelegate action = () => new XLSparklineGroups(null); + Assert.Throws(action); + } + + [Test] + public void CannotCreateSparklineGroupWithoutWorksheet() + { + TestDelegate action = () => new XLSparklineGroup(null); + Assert.Throws(action); + } + + [Test] + public void CannotCreateSparklineWithoutGroup() + { + var ws = new XLWorkbook().AddWorksheet("Sheet1"); + TestDelegate action = () => new XLSparkline(null, ws.Cell("A1"), ws.Range("A2:A5")); + Assert.Throws(action); + } + + [Test] + public void CannotCreateSparklineWithoutLocation() + { + var ws = new XLWorkbook().AddWorksheet("Sheet1"); + var group = new XLSparklineGroup(ws); + TestDelegate action = () => new XLSparkline(group, null, ws.Range("A2:A5")); + Assert.Throws(action); + } + + [Test] + public void CanCreateInvalidSparklineWithoutSourceData() + { + var ws = new XLWorkbook().AddWorksheet("Sheet1"); + var group = new XLSparklineGroup(ws); + var sparkline = new XLSparkline(group, ws.FirstCell(), null); + Assert.IsFalse(sparkline.IsValid); + } + + [Test] + public void CanAddSparklineGroupForSingleCell() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + ws.SparklineGroups.Add(new XLSparklineGroup(ws, "A1", "B1:E1")); + ws.SparklineGroups.Add("A2", "B2:E2"); + ws.SparklineGroups.Add(ws.Cell("A3"), ws.Range("B3:E3")); + + Assert.AreEqual(3, ws.SparklineGroups.Count()); + + Assert.AreEqual("A1", ws.SparklineGroups.ElementAt(0).Single().Location.Address.ToString()); + Assert.AreEqual("A2", ws.SparklineGroups.ElementAt(1).Single().Location.Address.ToString()); + Assert.AreEqual("A3", ws.SparklineGroups.ElementAt(2).Single().Location.Address.ToString()); + + Assert.AreEqual("B1:E1", ws.SparklineGroups.ElementAt(0).Single().SourceData.RangeAddress.ToString()); + Assert.AreEqual("B2:E2", ws.SparklineGroups.ElementAt(1).Single().SourceData.RangeAddress.ToString()); + Assert.AreEqual("B3:E3", ws.SparklineGroups.ElementAt(2).Single().SourceData.RangeAddress.ToString()); + + Assert.IsTrue(ws.SparklineGroups.All(g => g.Worksheet == ws)); + } + + [Test] + public void CanAddSparklineGroupForVerticalRange() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + ws.SparklineGroups.Add(ws.Range("A1:A3"), ws.Range("B1:E3")); + + Assert.AreEqual(1, ws.SparklineGroups.Count()); + + Assert.AreEqual("A1", ws.SparklineGroups.Single().ElementAt(0).Location.Address.ToString()); + Assert.AreEqual("A2", ws.SparklineGroups.Single().ElementAt(1).Location.Address.ToString()); + Assert.AreEqual("A3", ws.SparklineGroups.Single().ElementAt(2).Location.Address.ToString()); + + Assert.AreEqual("B1:E1", ws.SparklineGroups.Single().ElementAt(0).SourceData.RangeAddress.ToString()); + Assert.AreEqual("B2:E2", ws.SparklineGroups.Single().ElementAt(1).SourceData.RangeAddress.ToString()); + Assert.AreEqual("B3:E3", ws.SparklineGroups.Single().ElementAt(2).SourceData.RangeAddress.ToString()); + } + + [Test] + public void CanAddSparklineGroupForHorizontalRange() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + ws.SparklineGroups.Add(ws.Range("A1:C1"), ws.Range("A2:C4")); + + Assert.AreEqual(1, ws.SparklineGroups.Count()); + + Assert.AreEqual("A1", ws.SparklineGroups.Single().ElementAt(0).Location.Address.ToString()); + Assert.AreEqual("B1", ws.SparklineGroups.Single().ElementAt(1).Location.Address.ToString()); + Assert.AreEqual("C1", ws.SparklineGroups.Single().ElementAt(2).Location.Address.ToString()); + + Assert.AreEqual("A2:A4", ws.SparklineGroups.Single().ElementAt(0).SourceData.RangeAddress.ToString()); + Assert.AreEqual("B2:B4", ws.SparklineGroups.Single().ElementAt(1).SourceData.RangeAddress.ToString()); + Assert.AreEqual("C2:C4", ws.SparklineGroups.Single().ElementAt(2).SourceData.RangeAddress.ToString()); + } + + [Test] + public void CannotAddSparklineForNonLinearRange() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + TestDelegate action = () => ws.SparklineGroups.Add(ws.Range("A1:C2"), ws.Range("A3:C4")); + + var message = Assert.Throws(action).Message; + Assert.AreEqual("locationRange must have either a single row or a single column", message); + } + + [Test] + public void CannotAddSparklineWhenRangesHaveDifferentWidths() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + TestDelegate action = () => ws.SparklineGroups.Add(ws.Range("A1:C1"), ws.Range("A3:D4")); + + var message = Assert.Throws(action).Message; + Assert.AreEqual("locationRange and sourceDataRange must have the same width", message); + } + + [Test] + public void CannotAddSparklineWhenRangesHaveDifferentHeights() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + TestDelegate action = () => ws.SparklineGroups.Add(ws.Range("A1:A3"), ws.Range("B1:B4")); + + var message = Assert.Throws(action).Message; + Assert.AreEqual("locationRange and sourceDataRange must have the same height", message); + } + + [Test] + public void CannotAddSparklineForCellWhenDataRangeIsNotLinear() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + TestDelegate action = () => ws.SparklineGroups.Add(ws.Range("A1:A1"), ws.Range("B1:C4")); + + var message = Assert.Throws(action).Message; + Assert.AreEqual("SourceData range must have either a single row or a single column", message); + } + + [Test] + public void CanAddSparklineToExistingGroup() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + var group = new XLSparklineGroup(ws); + + group.Add("A2", "B2:E2"); + group.Add(ws.Cell("A3"), ws.Range("B3:E3")); + + Assert.AreEqual(0, ws.SparklineGroups.Count()); + + Assert.AreEqual("A2", group.ElementAt(0).Location.Address.ToString()); + Assert.AreEqual("A3", group.ElementAt(1).Location.Address.ToString()); + + Assert.AreEqual("B2:E2", group.ElementAt(0).SourceData.RangeAddress.ToString()); + Assert.AreEqual("B3:E3", group.ElementAt(1).SourceData.RangeAddress.ToString()); + } + + [Test] + public void CannotAddSparklineGroupFromDifferentWorksheet() + { + var wb = new XLWorkbook(); + var ws1 = wb.AddWorksheet("Sheet 1"); + var ws2 = wb.AddWorksheet("Sheet 2"); + + var group = new XLSparklineGroup(ws1); + + TestDelegate action = () => ws2.SparklineGroups.Add(group); + + var message = Assert.Throws(action).Message; + Assert.AreEqual("The specified sparkline group belongs to the different worksheet", message); + } + + [Test] + public void CannotAddSparklineFromDifferentWorksheet() + { + var wb = new XLWorkbook(); + var ws1 = wb.AddWorksheet("Sheet 1"); + var ws2 = wb.AddWorksheet("Sheet 2"); + + var group = new XLSparklineGroup(ws1); + + TestDelegate action = () => group.Add(ws2.Cell("A3"), ws1.Range("B3:E3")); + + var message = Assert.Throws(action).Message; + Assert.AreEqual("The specified sparkline belongs to the different worksheet", message); + } + + [Test] + public void AddSparklineToSameCellOverwritesItWhenSameGroup() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + var group = ws.SparklineGroups.Add("A1", "B1:E1"); + group.Add("A1", "B2:E2"); + + Assert.AreEqual(1, group.Count()); + + Assert.AreEqual("A1", group.Single().Location.Address.ToString()); + Assert.AreEqual("B2:E2", group.Single().SourceData.RangeAddress.ToString()); + } + + [Test] + public void AddSparklineToSameCellOverwritesItWhenDifferentGroup() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + ws.SparklineGroups.Add("A1", "B1:E1"); + ws.SparklineGroups.Add("A1", "B2:E2"); + + Assert.AreEqual(2, ws.SparklineGroups.Count()); + Assert.IsFalse(ws.SparklineGroups.First().Any()); + Assert.AreEqual("A1", ws.SparklineGroups.Last().Single().Location.Address.ToString()); + Assert.AreEqual("B2:E2", ws.SparklineGroups.Last().Single().SourceData.RangeAddress.ToString()); + } + + [Test] + public void CanAddSparklineReferringToDifferentWorksheet() + { + var wb = new XLWorkbook(); + var ws1 = wb.AddWorksheet("Sheet 1"); + var ws3 = wb.AddWorksheet("Sheet 3"); + + var group = ws1.SparklineGroups.Add("A1", "'Sheet 3'!B1:F1"); + + Assert.AreSame(ws3, group.Single().SourceData.Worksheet); + } + + #endregion Add sparklines + + #region Get sparklines + + [TestCase("A2", "B2:Z2")] + [TestCase("A50", "B50:Z50")] + [TestCase("A100", "B100:Z100")] + [TestCase("B1", "B2:B100")] + [TestCase("K1", "K2:K100")] + [TestCase("Z1", "Z2:Z100")] + public void CanGetSparklineForExistingCell(string cellAddress, string expectedSourceDataRange) + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + ws.SparklineGroups.Add("A2:A100", "B2:Z100"); + ws.SparklineGroups.Add("B1:Z1", "B2:Z100"); + + var sp = ws.SparklineGroups.GetSparkline(ws.Cell(cellAddress)); + Assert.IsNotNull(sp); + Assert.AreEqual(cellAddress, sp.Location.Address.ToString()); + Assert.AreEqual(expectedSourceDataRange, sp.SourceData.RangeAddress.ToString()); + } + + [TestCase("A1")] + [TestCase("B2")] + [TestCase("A101")] + [TestCase("AA1")] + public void CannotGetSparklineForNonExistingCell(string cellAddress) + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + ws.SparklineGroups.Add("A2:A100", "B2:Z100"); + ws.SparklineGroups.Add("B1:Z1", "B2:Z100"); + + var sp = ws.SparklineGroups.GetSparkline(ws.Cell(cellAddress)); + Assert.IsNull(sp); + } + + [Test] + public void CanGetSparklinesForRange() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + ws.SparklineGroups.Add("A2:A100", "B2:Z100"); + ws.SparklineGroups.Add("B1:Z1", "B2:Z100"); + + var sparklines1 = ws.SparklineGroups.GetSparklines(ws.Range("A1:B2")); + var sparklines2 = ws.SparklineGroups.GetSparklines(ws.Range("B2:E4")); + var sparklines3 = ws.SparklineGroups.GetSparklines(ws.Range("A1:Z100")); + var sparklines4 = ws.SparklineGroups.GetSparklines(ws.Range("A:A")); + var sparklines5 = ws.SparklineGroups.GetSparklines(ws.Range("1:1")); + + Assert.AreEqual(2, sparklines1.Count()); + Assert.AreEqual(0, sparklines2.Count()); + Assert.AreEqual(99 + 25, sparklines3.Count()); + Assert.AreEqual(99, sparklines4.Count()); + Assert.AreEqual(25, sparklines5.Count()); + + Assert.AreEqual("A2", sparklines1.First().Location.Address.ToString()); + Assert.AreEqual("B1", sparklines1.Last().Location.Address.ToString()); + Assert.AreEqual("B2:Z2", sparklines1.First().SourceData.RangeAddress.ToString()); + Assert.AreEqual("B2:B100", sparklines1.Last().SourceData.RangeAddress.ToString()); + } + + #endregion Get sparklines + + #region Remove sparklines + + [Test] + public void CanRemoveSparklineFromCell() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + ws.SparklineGroups.Add("A1:A3", "B1:Z3"); + ws.SparklineGroups.Remove(ws.Cell("A2")); + + Assert.AreEqual(1, ws.SparklineGroups.Count()); + Assert.AreEqual(2, ws.SparklineGroups.Single().Count()); + Assert.AreEqual("A1", ws.SparklineGroups.Single().First().Location.Address.ToString()); + Assert.AreEqual("A3", ws.SparklineGroups.Single().Last().Location.Address.ToString()); + Assert.AreEqual("B1:Z1", ws.SparklineGroups.Single().First().SourceData.RangeAddress.ToString()); + Assert.AreEqual("B3:Z3", ws.SparklineGroups.Single().Last().SourceData.RangeAddress.ToString()); + } + + [Test] + public void CanRemoveSparklineFromRange() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + ws.SparklineGroups.Add("A1:A5", "B1:Z5"); + ws.SparklineGroups.Remove(ws.Range("A2:D4")); + + Assert.AreEqual(1, ws.SparklineGroups.Count()); + Assert.AreEqual(2, ws.SparklineGroups.Single().Count()); + Assert.AreEqual("A1", ws.SparklineGroups.Single().First().Location.Address.ToString()); + Assert.AreEqual("A5", ws.SparklineGroups.Single().Last().Location.Address.ToString()); + Assert.AreEqual("B1:Z1", ws.SparklineGroups.Single().First().SourceData.RangeAddress.ToString()); + Assert.AreEqual("B5:Z5", ws.SparklineGroups.Single().Last().SourceData.RangeAddress.ToString()); + } + + [Test] + public void RemoveSparklineFromEmptyCellDoesNothing() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + ws.SparklineGroups.Add("A1:A2", "B1:Z2"); + ws.SparklineGroups.Remove(ws.Cell("F2")); + + Assert.AreEqual(1, ws.SparklineGroups.Count()); + Assert.AreEqual(2, ws.SparklineGroups.Single().Count()); + Assert.AreEqual("A1", ws.SparklineGroups.Single().First().Location.Address.ToString()); + Assert.AreEqual("A2", ws.SparklineGroups.Single().Last().Location.Address.ToString()); + Assert.AreEqual("B1:Z1", ws.SparklineGroups.Single().First().SourceData.RangeAddress.ToString()); + Assert.AreEqual("B2:Z2", ws.SparklineGroups.Single().Last().SourceData.RangeAddress.ToString()); + } + + #endregion Remove sparklines + + #region Change sparklines + + [Test] + public void CanChangeSparklineLocationInsideWorksheet() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + ws.SparklineGroups.Add("A1:A2", "B1:Z2"); + ws.SparklineGroups.Single().Last().SetLocation(ws.Cell("F2")); + + Assert.AreEqual(1, ws.SparklineGroups.Count()); + Assert.AreEqual(2, ws.SparklineGroups.Single().Count()); + Assert.AreEqual("A1", ws.SparklineGroups.Single().First().Location.Address.ToString()); + Assert.AreEqual("F2", ws.SparklineGroups.Single().Last().Location.Address.ToString()); + Assert.AreEqual("B1:Z1", ws.SparklineGroups.Single().First().SourceData.RangeAddress.ToString()); + Assert.AreEqual("B2:Z2", ws.SparklineGroups.Single().Last().SourceData.RangeAddress.ToString()); + Assert.IsTrue(ws.Cell("A1").HasSparkline); + Assert.IsFalse(ws.Cell("A2").HasSparkline); + Assert.IsTrue(ws.Cell("F2").HasSparkline); + } + + [Test] + public void ChangeSparklineLocationOverwritesExistingSparklineSameGroup() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + ws.SparklineGroups.Add("A1:A2", "B1:Z2"); + ws.SparklineGroups.Single().Last().SetLocation(ws.Cell("A1")); + + Assert.AreEqual(1, ws.SparklineGroups.Count()); + Assert.AreEqual(1, ws.SparklineGroups.Single().Count()); + Assert.AreEqual("A1", ws.SparklineGroups.Single().Single().Location.Address.ToString()); + Assert.AreEqual("B2:Z2", ws.SparklineGroups.Single().Single().SourceData.RangeAddress.ToString()); + } + + [Test] + public void ChangeSparklineLocationOverwritesExistingSparklineDifferentGroups() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + ws.SparklineGroups.Add("A1:A2", "B1:Z2"); + ws.SparklineGroups.Add("A3", "B3:Z3"); + ws.SparklineGroups.Last().Single().SetLocation(ws.Cell("A2")); + + Assert.AreEqual(2, ws.SparklineGroups.Count()); + Assert.AreEqual(1, ws.SparklineGroups.First().Count()); + Assert.AreEqual("A1", ws.SparklineGroups.First().Single().Location.Address.ToString()); + Assert.AreEqual("B1:Z1", ws.SparklineGroups.First().Single().SourceData.RangeAddress.ToString()); + Assert.AreEqual(1, ws.SparklineGroups.Last().Count()); + Assert.AreEqual("A2", ws.SparklineGroups.Last().Single().Location.Address.ToString()); + Assert.AreEqual("B3:Z3", ws.SparklineGroups.Last().Single().SourceData.RangeAddress.ToString()); + } + + [Test] + public void CannotChangeSparklineLocationToAnotherWorksheet() + { + var wb = new XLWorkbook(); + var ws1 = wb.AddWorksheet("Sheet 1"); + var ws2 = wb.AddWorksheet("Sheet 2"); + + var group = ws1.SparklineGroups.Add("A1:A2", "B1:Z2"); + + TestDelegate action = () => group.First().SetLocation(ws2.FirstCell()); + + var message = Assert.Throws(action).Message; + Assert.AreEqual("Cannot move the sparkline to a different worksheet", message); + } + + [Test] + public void CanChangeSparklineSourceDataInsideWorksheet() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + + ws.SparklineGroups.Add("A1:A2", "B1:Z2"); + ws.SparklineGroups.Single().Last().SetSourceData(ws.Range("D4:D50")); + + Assert.AreEqual(1, ws.SparklineGroups.Count()); + Assert.AreEqual(2, ws.SparklineGroups.Single().Count()); + Assert.AreEqual("A1", ws.SparklineGroups.Single().First().Location.Address.ToString()); + Assert.AreEqual("A2", ws.SparklineGroups.Single().Last().Location.Address.ToString()); + Assert.AreEqual("B1:Z1", ws.SparklineGroups.Single().First().SourceData.RangeAddress.ToString()); + Assert.AreEqual("D4:D50", ws.SparklineGroups.Single().Last().SourceData.RangeAddress.ToString()); + } + + [Test] + public void CannotChangeSparklineSourceDataToNonLinearRange() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group = ws.SparklineGroups.Add("A1", "B1:Z1"); + var sparkline = group.Single(); + + TestDelegate action = () => sparkline.SetSourceData(ws.Range("B1:Z2")); + + var message = Assert.Throws(action).Message; + Assert.AreEqual("SourceData range must have either a single row or a single column", message); + } + + [Test] + public void CanChangeSparklineStyle() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group = ws.SparklineGroups.Add("A1", "B1:Z1"); + + group.Style = XLSparklineTheme.Colorful1; + + Assert.AreEqual(XLColor.FromHtml("FF5F5F5F"), group.Style.SeriesColor); + Assert.AreEqual(XLColor.FromHtml("FFFFB620"), group.Style.NegativeColor); + Assert.AreEqual(XLColor.FromHtml("FFD70077"), group.Style.MarkersColor); + Assert.AreEqual(XLColor.FromHtml("FF56BE79"), group.Style.HighMarkerColor); + Assert.AreEqual(XLColor.FromHtml("FFFF5055"), group.Style.LowMarkerColor); + Assert.AreEqual(XLColor.FromHtml("FF5687C2"), group.Style.FirstMarkerColor); + Assert.AreEqual(XLColor.FromHtml("FF359CEB"), group.Style.LastMarkerColor); + } + + [Test] + public void ChangeSparklineStyleDoesNotAffectOriginal() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group = ws.SparklineGroups.Add("A1", "B1:Z1"); + group.Style = XLSparklineTheme.Colorful1; + + group.Style.NegativeColor = XLColor.Red; + + Assert.AreEqual(XLColor.Red, group.Style.NegativeColor); + Assert.AreNotEqual(XLColor.Red, XLSparklineTheme.Colorful1.NegativeColor); + } + + [Test] + public void CannotSetSparklineStyleToNull() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group = ws.SparklineGroups.Add("A1", "B1:Z1"); + + TestDelegate action = () => group.Style = null; + + Assert.Throws(action); + } + + [Test] + public void SparklinesShiftOnRowInsert() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group1 = ws.SparklineGroups.Add("B2", "D4:F4"); + var group2 = ws.SparklineGroups.Add("B3", "D4:D8"); + var group3 = ws.SparklineGroups.Add("B4", "E1:E8"); + + ws.Row(2).InsertRowsBelow(3); + + Assert.AreEqual("B2", group1.First().Location.Address.ToString()); + Assert.AreEqual("D7:F7", group1.First().SourceData.RangeAddress.ToString()); + Assert.AreEqual("B6", group2.First().Location.Address.ToString()); + Assert.AreEqual("D7:D11", group2.First().SourceData.RangeAddress.ToString()); + Assert.AreEqual("B7", group3.First().Location.Address.ToString()); + Assert.AreEqual("E1:E11", group3.First().SourceData.RangeAddress.ToString()); + } + + [Test] + public void SparklinesShiftOnRowDelete() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group1 = ws.SparklineGroups.Add("B2", "D7:F7"); + var group2 = ws.SparklineGroups.Add("B6", "D7:D11"); + var group3 = ws.SparklineGroups.Add("B7", "E1:E11"); + + ws.Rows(3, 5).Delete(); + + Assert.AreEqual("B2", group1.First().Location.Address.ToString()); + Assert.AreEqual("D4:F4", group1.First().SourceData.RangeAddress.ToString()); + Assert.AreEqual("B3", group2.First().Location.Address.ToString()); + Assert.AreEqual("D4:D8", group2.First().SourceData.RangeAddress.ToString()); + Assert.AreEqual("B4", group3.First().Location.Address.ToString()); + Assert.AreEqual("E1:E8", group3.First().SourceData.RangeAddress.ToString()); + } + + [Test] + public void SparklinesShiftOnColumnInsert() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group1 = ws.SparklineGroups.Add("B2", "D4:F4"); + var group2 = ws.SparklineGroups.Add("C3", "D4:D8"); + var group3 = ws.SparklineGroups.Add("D4", "A4:E4"); + + ws.Column(2).InsertColumnsAfter(3); + + Assert.AreEqual("B2", group1.First().Location.Address.ToString()); + Assert.AreEqual("G4:I4", group1.First().SourceData.RangeAddress.ToString()); + Assert.AreEqual("F3", group2.First().Location.Address.ToString()); + Assert.AreEqual("G4:G8", group2.First().SourceData.RangeAddress.ToString()); + Assert.AreEqual("G4", group3.First().Location.Address.ToString()); + Assert.AreEqual("A4:H4", group3.First().SourceData.RangeAddress.ToString()); + } + + [Test] + public void SparklinesShiftOnColumnDelete() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group1 = ws.SparklineGroups.Add("B2", "G4:I4"); + var group2 = ws.SparklineGroups.Add("F3", "G4:G8"); + var group3 = ws.SparklineGroups.Add("G4", "A4:H4"); + + ws.Columns(3, 5).Delete(); + + Assert.AreEqual("B2", group1.First().Location.Address.ToString()); + Assert.AreEqual("D4:F4", group1.First().SourceData.RangeAddress.ToString()); + Assert.AreEqual("C3", group2.First().Location.Address.ToString()); + Assert.AreEqual("D4:D8", group2.First().SourceData.RangeAddress.ToString()); + Assert.AreEqual("D4", group3.First().Location.Address.ToString()); + Assert.AreEqual("A4:E4", group3.First().SourceData.RangeAddress.ToString()); + } + + [Test] + public void SparklineRemovedWhenColumnDeleted() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group = ws.SparklineGroups.Add("A1:B1", "C2:D6"); + + ws.Column(2).Delete(); + + Assert.AreEqual(1, group.Count()); + Assert.AreEqual("A1", group.Single().Location.Address.ToString()); + Assert.AreEqual("B2:B6", group.Single().SourceData.RangeAddress.ToString()); + } + + [Test] + public void SparklineRemovedWhenRowDeleted() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group = ws.SparklineGroups.Add("A1:A2", "C3:F4"); + + ws.Row(2).Delete(); + + Assert.AreEqual(1, group.Count()); + Assert.AreEqual("A1", group.Single().Location.Address.ToString()); + Assert.AreEqual("C2:F2", group.Single().SourceData.RangeAddress.ToString()); + } + + [Test] + public void SparklineRemovedWhenShiftedTooFarRight() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group = ws.SparklineGroups.Add("XFD1", "A1:Z1"); + + ws.Column(1).InsertColumnsBefore(1); + + Assert.AreEqual(0, group.Count()); + } + + [Test] + public void SparklineRemovedWhenShiftedTooFarDown() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group = ws.SparklineGroups.Add("A1048576", "A1:Z1"); + + ws.Row(1).InsertRowsAbove(1); + + Assert.AreEqual(0, group.Count()); + } + + [Test] + public void SparklineRangeInvalidatedWhenDeleted() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group = ws.SparklineGroups.Add("A1:B1", "C2:D6"); + + ws.Column(4).Delete(); + + Assert.AreEqual(2, group.Count()); + Assert.AreEqual("A1", group.First().Location.Address.ToString()); + Assert.AreEqual("C2:C6", group.First().SourceData.RangeAddress.ToString()); + Assert.AreEqual("B1", group.Last().Location.Address.ToString()); + Assert.IsFalse(group.Last().SourceData.RangeAddress.IsValid); + } + + #endregion Change sparklines + + #region Load and save sparkline groups + + [Test] + public void CanChangeSaveAndLoadSparklineGroup() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet 1"); + var originalGroup = ws.SparklineGroups.Add("A1:A3", "B1:Z3") + .SetDateRange(ws.Range("B4:Z4")) + .SetLineWeight(5.5) + .SetDisplayHidden(true) + .SetShowMarkers(XLSparklineMarkers.FirstPoint | XLSparklineMarkers.LastPoint | + XLSparklineMarkers.HighPoint | XLSparklineMarkers.LowPoint | + XLSparklineMarkers.NegativePoints | XLSparklineMarkers.Markers) + .SetDisplayEmptyCellsAs(XLDisplayBlanksAsValues.Zero) + .SetType(XLSparklineType.Stacked); + + originalGroup.HorizontalAxis + .SetColor(XLColor.AirForceBlue) + .SetVisible(true) + .SetRightToLeft(true); + + originalGroup.VerticalAxis + .SetManualMax(6.6) + .SetManualMin(1.2) + .SetMaxAxisType(XLSparklineAxisMinMax.Custom) + .SetMinAxisType(XLSparklineAxisMinMax.Custom); + + originalGroup.Style + .SetFirstMarkerColor(XLColor.AliceBlue) + .SetHighMarkerColor(XLColor.Alizarin) + .SetLastMarkerColor(XLColor.Almond) + .SetLowMarkerColor(XLColor.Amaranth) + .SetMarkersColor(XLColor.Amber) + .SetNegativeColor(XLColor.AmberSaeEce) + .SetSeriesColor(XLColor.AmericanRose); + + AssertGroupIsValid(originalGroup); + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + + Assert.AreEqual(1, ws.SparklineGroups.Count()); + AssertGroupIsValid(ws.SparklineGroups.Single()); + } + } + + void AssertGroupIsValid(IXLSparklineGroup group) + { + Assert.AreEqual(3, group.Count()); + + Assert.AreEqual("A1", group.ElementAt(0).Location.Address.ToString()); + Assert.AreEqual("A2", group.ElementAt(1).Location.Address.ToString()); + Assert.AreEqual("A3", group.ElementAt(2).Location.Address.ToString()); + + Assert.AreEqual("B1:Z1", group.ElementAt(0).SourceData.RangeAddress.ToString()); + Assert.AreEqual("B2:Z2", group.ElementAt(1).SourceData.RangeAddress.ToString()); + Assert.AreEqual("B3:Z3", group.ElementAt(2).SourceData.RangeAddress.ToString()); + + Assert.AreEqual("B4:Z4", group.DateRange.RangeAddress.ToString()); + + Assert.AreEqual(XLColor.AliceBlue, group.Style.FirstMarkerColor); + Assert.AreEqual(XLColor.Alizarin, group.Style.HighMarkerColor); + Assert.AreEqual(XLColor.Almond, group.Style.LastMarkerColor); + Assert.AreEqual(XLColor.Amaranth, group.Style.LowMarkerColor); + Assert.AreEqual(XLColor.Amber, group.Style.MarkersColor); + Assert.AreEqual(XLColor.AmberSaeEce, group.Style.NegativeColor); + Assert.AreEqual(XLColor.AmericanRose, group.Style.SeriesColor); + Assert.IsTrue(group.DisplayHidden); + Assert.AreEqual(5.5, group.LineWeight, XLHelper.Epsilon); + Assert.AreEqual(XLDisplayBlanksAsValues.Zero, group.DisplayEmptyCellsAs); + Assert.AreEqual(XLSparklineType.Stacked, group.Type); + + Assert.IsTrue(group.ShowMarkers.HasFlag(XLSparklineMarkers.FirstPoint)); + Assert.IsTrue(group.ShowMarkers.HasFlag(XLSparklineMarkers.LastPoint)); + Assert.IsTrue(group.ShowMarkers.HasFlag(XLSparklineMarkers.HighPoint)); + Assert.IsTrue(group.ShowMarkers.HasFlag(XLSparklineMarkers.LowPoint)); + Assert.IsTrue(group.ShowMarkers.HasFlag(XLSparklineMarkers.NegativePoints)); + Assert.IsTrue(group.ShowMarkers.HasFlag(XLSparklineMarkers.Markers)); + + Assert.AreEqual(XLColor.AirForceBlue, group.HorizontalAxis.Color); + Assert.IsTrue(group.HorizontalAxis.IsVisible); + Assert.IsTrue(group.HorizontalAxis.RightToLeft); + Assert.IsTrue(group.HorizontalAxis.DateAxis); + + Assert.AreEqual(6.6, group.VerticalAxis.ManualMax, XLHelper.Epsilon); + Assert.AreEqual(1.2, group.VerticalAxis.ManualMin, XLHelper.Epsilon); + Assert.AreEqual(XLSparklineAxisMinMax.Custom, group.VerticalAxis.MaxAxisType); + Assert.AreEqual(XLSparklineAxisMinMax.Custom, group.VerticalAxis.MinAxisType); + } + } + + [Test] + public void CanLoadSparklines() + { + using (var ms = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\Sparklines\SparklineThemes\inputfile.xlsx"))) + using (var wb = new XLWorkbook(ms)) + { + Assert.IsTrue(wb.Worksheets.All(ws => ws.SparklineGroups.Count() == 6)); + } + } + + [TestCase("Accent!B1", nameof(XLSparklineTheme.Accent1))] + [TestCase("Accent!B2", nameof(XLSparklineTheme.Accent2))] + [TestCase("Accent!B3", nameof(XLSparklineTheme.Accent3))] + [TestCase("Accent!B4", nameof(XLSparklineTheme.Accent4))] + [TestCase("Accent!B5", nameof(XLSparklineTheme.Accent5))] + [TestCase("Accent!B6", nameof(XLSparklineTheme.Accent6))] + [TestCase("'Accent Darker 25%'!B1", nameof(XLSparklineTheme.Accent1Darker25))] + [TestCase("'Accent Darker 25%'!B2", nameof(XLSparklineTheme.Accent2Darker25))] + [TestCase("'Accent Darker 25%'!B3", nameof(XLSparklineTheme.Accent3Darker25))] + [TestCase("'Accent Darker 25%'!B4", nameof(XLSparklineTheme.Accent4Darker25))] + [TestCase("'Accent Darker 25%'!B5", nameof(XLSparklineTheme.Accent5Darker25))] + [TestCase("'Accent Darker 25%'!B6", nameof(XLSparklineTheme.Accent6Darker25))] + [TestCase("'Accent Darker 50%'!B1", nameof(XLSparklineTheme.Accent1Darker50))] + [TestCase("'Accent Darker 50%'!B2", nameof(XLSparklineTheme.Accent2Darker50))] + [TestCase("'Accent Darker 50%'!B3", nameof(XLSparklineTheme.Accent3Darker50))] + [TestCase("'Accent Darker 50%'!B4", nameof(XLSparklineTheme.Accent4Darker50))] + [TestCase("'Accent Darker 50%'!B5", nameof(XLSparklineTheme.Accent5Darker50))] + [TestCase("'Accent Darker 50%'!B6", nameof(XLSparklineTheme.Accent6Darker50))] + [TestCase("'Accent Lighter 40%'!B1", nameof(XLSparklineTheme.Accent1Lighter40))] + [TestCase("'Accent Lighter 40%'!B2", nameof(XLSparklineTheme.Accent2Lighter40))] + [TestCase("'Accent Lighter 40%'!B3", nameof(XLSparklineTheme.Accent3Lighter40))] + [TestCase("'Accent Lighter 40%'!B4", nameof(XLSparklineTheme.Accent4Lighter40))] + [TestCase("'Accent Lighter 40%'!B5", nameof(XLSparklineTheme.Accent5Lighter40))] + [TestCase("'Accent Lighter 40%'!B6", nameof(XLSparklineTheme.Accent6Lighter40))] + [TestCase("Dark!B1", nameof(XLSparklineTheme.Dark1))] + [TestCase("Dark!B2", nameof(XLSparklineTheme.Dark2))] + [TestCase("Dark!B3", nameof(XLSparklineTheme.Dark3))] + [TestCase("Dark!B4", nameof(XLSparklineTheme.Dark4))] + [TestCase("Dark!B5", nameof(XLSparklineTheme.Dark5))] + [TestCase("Dark!B6", nameof(XLSparklineTheme.Dark6))] + [TestCase("Colorful!B1", nameof(XLSparklineTheme.Colorful1))] + [TestCase("Colorful!B2", nameof(XLSparklineTheme.Colorful2))] + [TestCase("Colorful!B3", nameof(XLSparklineTheme.Colorful3))] + [TestCase("Colorful!B4", nameof(XLSparklineTheme.Colorful4))] + [TestCase("Colorful!B5", nameof(XLSparklineTheme.Colorful5))] + [TestCase("Colorful!B6", nameof(XLSparklineTheme.Colorful6))] + public void SparklineThemesAreIdenticalToExcel(string cellAddress, string expectedThemeName) + { + using (var ms = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\Sparklines\SparklineThemes\inputfile.xlsx"))) + using (var wb = new XLWorkbook(ms)) + { + var expectedStyle = GetThemeByName(expectedThemeName); + var actualStyle = wb.Cell(cellAddress).Sparkline.SparklineGroup.Style; + + Assert.AreEqual(expectedStyle, actualStyle); + } + + IXLSparklineStyle GetThemeByName(string themeName) + { + var themes = typeof(XLSparklineTheme); + var prop = themes.GetProperty(themeName, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static); + return prop.GetValue(null, null) as IXLSparklineStyle; + } + } + + [Test] + public void DeletedSparklinesRemovedFromFile() + { + using (var input = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\Sparklines\SparklineThemes\inputfile.xlsx"))) + using (var output = new MemoryStream()) + { + using (var wb = new XLWorkbook(input)) + { + wb.Worksheet(1).SparklineGroups.RemoveAll(); + wb.Worksheet(2).SparklineGroups.Remove(wb.Worksheet(2).Cell("B1")); + wb.Worksheet(3).SparklineGroups.Remove(wb.Worksheet(3).Range("B2:B6")); + wb.Worksheet(4).SparklineGroups.Remove(wb.Worksheet(4).SparklineGroups.First()); + + wb.SaveAs(output); + } + + using (var wb = new XLWorkbook(output)) + { + Assert.AreEqual(0, wb.Worksheet(1).SparklineGroups.Count()); + Assert.AreEqual(5, wb.Worksheet(2).SparklineGroups.Count()); + Assert.AreEqual(1, wb.Worksheet(3).SparklineGroups.Count()); + Assert.AreEqual(5, wb.Worksheet(4).SparklineGroups.Count()); + Assert.AreEqual(6, wb.Worksheet(5).SparklineGroups.Count()); + Assert.AreEqual(6, wb.Worksheet(6).SparklineGroups.Count()); + } + } + } + + [Test] + public void EmptySparklineGroupsSkippedOnSaving() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet 1"); + var group = ws.SparklineGroups.Add("A1:A2", "B1:Z2"); + + group.RemoveAll(); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + Assert.AreEqual(0, wb.Worksheets.First().SparklineGroups.Count()); + } + } + } + + [Test] + public void CanSaveAndLoadSparklineWithInvalidRange() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.AddWorksheet("Sheet 1"); + var ws2 = wb.AddWorksheet("Sheet 2"); + + ws1.SparklineGroups.Add("A1:A3", "'Sheet 2'!B1:F3"); + ws1.SparklineGroups.Add("A4:A6", "B4:F6") + .SetDateRange(ws2.Range("A1:E1")); + + ws2.Delete(); + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.Single(); + + Assert.AreEqual(2, ws.SparklineGroups.Count()); + Assert.IsFalse(ws.Cell("A2").Sparkline.IsValid); + Assert.AreEqual("B5:F5", ws.Cell("A5").Sparkline.SourceData.RangeAddress.ToString()); + Assert.IsNull(ws.Cell("A5").Sparkline.SparklineGroup.DateRange); + } + } + } + + #endregion Load and save sparkline groups + + #region Change sparkline groups + + [Test] + public void SetManualMinChangesAxisTypeToCustom() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var axis = ws.SparklineGroups.Add("A1:A2", "B1:Z2") + .VerticalAxis + .SetMinAxisType(XLSparklineAxisMinMax.SameForAll); + + axis.ManualMin = 100; + + Assert.AreEqual(100, axis.ManualMin, XLHelper.Epsilon); + Assert.AreEqual(XLSparklineAxisMinMax.Custom, axis.MinAxisType); + } + + [Test] + public void SetManualMaxChangesAxisTypeToCustom() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var axis = ws.SparklineGroups.Add("A1:A2", "B1:Z2") + .VerticalAxis + .SetMaxAxisType(XLSparklineAxisMinMax.SameForAll); + + axis.ManualMax = 100; + + Assert.AreEqual(100, axis.ManualMax, XLHelper.Epsilon); + Assert.AreEqual(XLSparklineAxisMinMax.Custom, axis.MaxAxisType); + } + + [TestCase(XLSparklineAxisMinMax.Custom, 100)] + [TestCase(XLSparklineAxisMinMax.SameForAll, null)] + [TestCase(XLSparklineAxisMinMax.Automatic, null)] + public void SetAxisTypeToNonCustomSetsManualMinToNull(XLSparklineAxisMinMax axisType, double? expectedManualMin) + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var axis = ws.SparklineGroups.Add("A1", "B1:Z1") + .VerticalAxis + .SetManualMin(100); + + axis.MinAxisType = axisType; + + if (expectedManualMin.HasValue) + Assert.AreEqual(expectedManualMin.Value, axis.ManualMin.Value, XLHelper.Epsilon); + else + Assert.IsNull(axis.ManualMin); + } + + [TestCase(XLSparklineAxisMinMax.Custom, 100)] + [TestCase(XLSparklineAxisMinMax.SameForAll, null)] + [TestCase(XLSparklineAxisMinMax.Automatic, null)] + public void SetAxisTypeToNonCustomSetsManualMaxToNull(XLSparklineAxisMinMax axisType, double? expectedManualMax) + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var axis = ws.SparklineGroups.Add("A1", "B1:Z1") + .VerticalAxis + .SetManualMax(100); + + axis.MaxAxisType = axisType; + + if (expectedManualMax.HasValue) + Assert.AreEqual(expectedManualMax.Value, axis.ManualMax.Value, XLHelper.Epsilon); + else + Assert.IsNull(axis.ManualMax); + } + + [Test] + public void SetDateRangeChangesAxisType() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group = ws.SparklineGroups.Add("A1:A2", "B1:Z2"); + + group.DateRange = ws.Range("B3:Z3"); + + Assert.IsTrue(group.HorizontalAxis.DateAxis); + } + + [Test] + public void SetDateRangeToNullChangesAxisType() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group = ws.SparklineGroups.Add("A1:A2", "B1:Z2"); + group.DateRange = ws.Range("B3:Z3"); + + group.DateRange = null; + + Assert.IsFalse(group.HorizontalAxis.DateAxis); + } + + [Test] + public void CannotSetNonLinearDateRange() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + var group = ws.SparklineGroups.Add("A1:A2", "B1:Z2"); + + TestDelegate action = () => group.DateRange = ws.Range("B3:Z4"); + + Assert.Throws(action); + } + + #endregion Change sparkline groups + + #region Copy sparkline groups + + [Test] + public void CopyCellToSameWorksheetCopiesSparkline() + { + var ws = new XLWorkbook().AddWorksheet("Sheet 1"); + ws.SparklineGroups.Add("A1:A3", "B1:F3"); + var target = ws.Cell("D4"); + + ws.Cell("A2").CopyTo(target); + + Assert.AreEqual(1, ws.SparklineGroups.Count()); + Assert.IsTrue(target.HasSparkline); + Assert.AreSame(ws.Cell("A2").Sparkline.SparklineGroup, target.Sparkline.SparklineGroup); + Assert.AreEqual("E4:I4", target.Sparkline.SourceData.RangeAddress.ToString()); + } + + [Test] + public void CopyCellToDifferentWorksheetCopiesSparklineGroup() + { + var wb = new XLWorkbook(); + var ws1 = wb.AddWorksheet("Sheet 1"); + var ws2 = wb.AddWorksheet("Sheet 2"); + var ws3 = wb.AddWorksheet("Sheet 3"); + ws1.SparklineGroups.Add("A1:A3", "B1:F3"); + ws1.SparklineGroups.Add("A4:A6", "'Sheet 3'!B4:F6"); + var target1 = ws2.Cell("D4"); + var target2 = ws2.Cell("D5"); + + ws1.Cell("A2").CopyTo(target1); + ws1.Cell("A5").CopyTo(target2); + + Assert.AreEqual(2, ws1.SparklineGroups.Count()); + Assert.AreEqual(2, ws2.SparklineGroups.Count()); + Assert.IsTrue(target1.HasSparkline); + Assert.IsTrue(target2.HasSparkline); + Assert.AreEqual("'Sheet 2'!E4:I4", target1.Sparkline.SourceData.RangeAddress.ToString(XLReferenceStyle.A1, true)); + Assert.AreEqual("'Sheet 3'!E5:I5", target2.Sparkline.SourceData.RangeAddress.ToString(XLReferenceStyle.A1, true)); + } + + [Test] + public void CopySparklineIfDateRangeOnSameWorksheet() + { + var wb = new XLWorkbook(); + var ws1 = wb.AddWorksheet("Sheet 1"); + var ws2 = wb.AddWorksheet("Sheet 2"); + var group = ws1.SparklineGroups.Add("A1:A3", "B1:F3"); + group.SetDateRange(ws1.Range("A4:E4")); + var target = ws2.Cell("D4"); + + ws1.Cell("A2").CopyTo(target); + + Assert.AreEqual(1, ws1.SparklineGroups.Count()); + Assert.AreEqual(1, ws2.SparklineGroups.Count()); + Assert.IsTrue(target.HasSparkline); + Assert.AreEqual("'Sheet 2'!D6:H6", target.Sparkline.SparklineGroup.DateRange.RangeAddress.ToString(XLReferenceStyle.A1, true)); + } + + [Test] + public void CopySparklineIfDateRangeSourceOnDifferentWorksheet() + { + var wb = new XLWorkbook(); + var ws1 = wb.AddWorksheet("Sheet 1"); + var ws2 = wb.AddWorksheet("Sheet 2"); + var ws3 = wb.AddWorksheet("Sheet 3"); + var group = ws1.SparklineGroups.Add("A1:A3", "B1:F3"); + group.SetDateRange(ws3.Range("A4:E4")); + var target = ws2.Cell("D4"); + + ws1.Cell("A2").CopyTo(target); + + Assert.AreEqual(1, ws1.SparklineGroups.Count()); + Assert.AreEqual(1, ws2.SparklineGroups.Count()); + Assert.IsTrue(target.HasSparkline); + Assert.AreEqual("'Sheet 3'!D6:H6", target.Sparkline.SparklineGroup.DateRange.RangeAddress.ToString(XLReferenceStyle.A1, true)); + } + + #endregion Copy sparkline groups + + #region Test Examples + + [Test] + public void CreateSampleSparklines() + { + TestHelper.RunTestExample(@"Sparklines\SampleSparklines.xlsx"); + } + + #endregion Test Examples + } +} diff --git a/ClosedXML_Tests/Excel/Styles/BorderTests.cs b/ClosedXML_Tests/Excel/Styles/BorderTests.cs new file mode 100644 index 0000000..bc64cae --- /dev/null +++ b/ClosedXML_Tests/Excel/Styles/BorderTests.cs @@ -0,0 +1,36 @@ +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.Styles +{ + public class BorderTests + { + [Test] + public void SetInsideBorderPreservesOutsideBorders() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + + ws.Cells("B2:C2").Style + .Border.SetOutsideBorder(XLBorderStyleValues.Thin) + .Border.SetOutsideBorderColor(XLColor.FromTheme(XLThemeColor.Accent1, 0.5)); + + //Check pre-conditions + Assert.AreEqual(XLBorderStyleValues.Thin, ws.Cell("B2").Style.Border.LeftBorder); + Assert.AreEqual(XLBorderStyleValues.Thin, ws.Cell("B2").Style.Border.RightBorder); + Assert.AreEqual(XLThemeColor.Accent1, ws.Cell("B2").Style.Border.LeftBorderColor.ThemeColor); + Assert.AreEqual(XLThemeColor.Accent1, ws.Cell("B2").Style.Border.RightBorderColor.ThemeColor); + + ws.Range("B2:C2").Style.Border.SetInsideBorder(XLBorderStyleValues.None); + + Assert.AreEqual(XLBorderStyleValues.Thin, ws.Cell("B2").Style.Border.LeftBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("B2").Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.None, ws.Cell("C2").Style.Border.LeftBorder); + Assert.AreEqual(XLBorderStyleValues.Thin, ws.Cell("C2").Style.Border.RightBorder); + Assert.AreEqual(XLThemeColor.Accent1, ws.Cell("B2").Style.Border.LeftBorderColor.ThemeColor); + Assert.AreEqual(XLThemeColor.Accent1, ws.Cell("C2").Style.Border.RightBorderColor.ThemeColor); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Styles/ColorTests.cs b/ClosedXML_Tests/Excel/Styles/ColorTests.cs new file mode 100644 index 0000000..d631194 --- /dev/null +++ b/ClosedXML_Tests/Excel/Styles/ColorTests.cs @@ -0,0 +1,177 @@ +using ClosedXML.Excel; +using ClosedXML.Utils; +using DocumentFormat.OpenXml.Spreadsheet; +using NUnit.Framework; +using Color = System.Drawing.Color; +using X14 = DocumentFormat.OpenXml.Office2010.Excel; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class ColorTests + { + [Test] + public void ColorEqualOperatorInPlace() + { + Assert.IsTrue(XLColor.Black == XLColor.Black); + } + + [Test] + public void ColorNotEqualOperatorInPlace() + { + Assert.IsFalse(XLColor.Black != XLColor.Black); + } + + [Test] + public void ColorNamedVsHTML() + { + Assert.IsTrue(XLColor.Black == XLColor.FromHtml("#000000")); + } + + [Test] + public void DefaultColorIndex64isTransparentWhite() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + XLColor color = ws.FirstCell().Style.Fill.BackgroundColor; + Assert.AreEqual(XLColorType.Indexed, color.ColorType); + Assert.AreEqual(64, color.Indexed); + Assert.AreEqual(Color.Transparent, color.Color); + } + + [Test] + public void CanConvertXLColorToColorType() + { + var xlColor1 = XLColor.Red; + var xlColor2 = XLColor.FromIndex(20); + var xlColor3 = XLColor.FromTheme(XLThemeColor.Accent1); + var xlColor4 = XLColor.FromTheme(XLThemeColor.Accent2, 0.4); + + var color1 = new ForegroundColor().FromClosedXMLColor(xlColor1); + var color2 = new ForegroundColor().FromClosedXMLColor(xlColor2); + var color3 = new BackgroundColor().FromClosedXMLColor(xlColor3); + var color4 = new BackgroundColor().FromClosedXMLColor(xlColor4); + + Assert.AreEqual("FFFF0000", color1.Rgb.Value); + Assert.IsNull(color1.Indexed); + Assert.IsNull(color1.Theme); + Assert.IsNull(color1.Tint); + + Assert.IsNull(color2.Rgb); + Assert.AreEqual(20, color2.Indexed.Value); + Assert.IsNull(color2.Theme); + Assert.IsNull(color2.Tint); + + Assert.IsNull(color3.Rgb); + Assert.IsNull(color3.Indexed); + Assert.AreEqual(4, color3.Theme.Value); + Assert.IsNull(color3.Tint); + + Assert.IsNull(color4.Rgb); + Assert.IsNull(color4.Indexed); + Assert.AreEqual(5, color4.Theme.Value); + Assert.AreEqual(0.4, color4.Tint.Value); + } + + [Test] + public void CanConvertXlColorToX14ColorType() + { + var xlColor1 = XLColor.Red; + var xlColor2 = XLColor.FromIndex(20); + var xlColor3 = XLColor.FromTheme(XLThemeColor.Accent1); + var xlColor4 = XLColor.FromTheme(XLThemeColor.Accent2, 0.4); + + var color1 = new X14.AxisColor().FromClosedXMLColor(xlColor1); + var color2 = new X14.BorderColor().FromClosedXMLColor(xlColor2); + var color3 = new X14.FillColor().FromClosedXMLColor(xlColor3); + var color4 = new X14.HighMarkerColor().FromClosedXMLColor(xlColor4); + + Assert.AreEqual("FFFF0000", color1.Rgb.Value); + Assert.IsNull(color1.Indexed); + Assert.IsNull(color1.Theme); + Assert.IsNull(color1.Tint); + + Assert.IsNull(color2.Rgb); + Assert.AreEqual(20, color2.Indexed.Value); + Assert.IsNull(color2.Theme); + Assert.IsNull(color2.Tint); + + Assert.IsNull(color3.Rgb); + Assert.IsNull(color3.Indexed); + Assert.AreEqual(4, color3.Theme.Value); + Assert.IsNull(color3.Tint); + + Assert.IsNull(color4.Rgb); + Assert.IsNull(color4.Indexed); + Assert.AreEqual(5, color4.Theme.Value); + Assert.AreEqual(0.4, color4.Tint.Value); + } + + [Test] + public void CanConvertColorTypeToXlColor() + { + var color1 = new ForegroundColor { Rgb = new DocumentFormat.OpenXml.HexBinaryValue("FFFF0000") }; + var color2 = new ForegroundColor { Indexed = new DocumentFormat.OpenXml.UInt32Value((uint)20) }; + var color3 = new BackgroundColor { Theme = new DocumentFormat.OpenXml.UInt32Value((uint)4) }; + var color4 = new BackgroundColor + { + Theme = new DocumentFormat.OpenXml.UInt32Value((uint)4), + Tint = new DocumentFormat.OpenXml.DoubleValue(0.4) + }; + + var xlColor1 = color1.ToClosedXMLColor(); + var xlColor2 = color2.ToClosedXMLColor(); + var xlColor3 = color3.ToClosedXMLColor(); + var xlColor4 = color4.ToClosedXMLColor(); + + Assert.AreEqual(XLColorType.Color, xlColor1.ColorType); + Assert.AreEqual(XLColor.Red.Color, xlColor1.Color); + + Assert.AreEqual(XLColorType.Indexed, xlColor2.ColorType); + Assert.AreEqual(20, xlColor2.Indexed); + + Assert.AreEqual(XLColorType.Theme, xlColor3.ColorType); + Assert.AreEqual(XLThemeColor.Accent1, xlColor3.ThemeColor); + Assert.AreEqual(0, xlColor3.ThemeTint, XLHelper.Epsilon); + + Assert.AreEqual(XLColorType.Theme, xlColor4.ColorType); + Assert.AreEqual(XLThemeColor.Accent1, xlColor4.ThemeColor); + Assert.AreEqual(0.4, xlColor4.ThemeTint, XLHelper.Epsilon); + } + + [Test] + public void CanConvertX14ColorTypeToXlColor() + { + var color1 = new X14.AxisColor { Rgb = new DocumentFormat.OpenXml.HexBinaryValue("FFFF0000") }; + var color2 = new X14.BorderColor { Indexed = new DocumentFormat.OpenXml.UInt32Value((uint)20) }; + var color3 = new X14.FillColor { Theme = new DocumentFormat.OpenXml.UInt32Value((uint)4) }; + var color4 = new X14.HighMarkerColor + { + Theme = new DocumentFormat.OpenXml.UInt32Value((uint)4), + Tint = new DocumentFormat.OpenXml.DoubleValue(0.4) + }; + + var xlColor1 = color1.ToClosedXMLColor(); + var xlColor2 = color2.ToClosedXMLColor(); + var xlColor3 = color3.ToClosedXMLColor(); + var xlColor4 = color4.ToClosedXMLColor(); + + Assert.AreEqual(XLColorType.Color, xlColor1.ColorType); + Assert.AreEqual(XLColor.Red.Color, xlColor1.Color); + + Assert.AreEqual(XLColorType.Indexed, xlColor2.ColorType); + Assert.AreEqual(20, xlColor2.Indexed); + + Assert.AreEqual(XLColorType.Theme, xlColor3.ColorType); + Assert.AreEqual(XLThemeColor.Accent1, xlColor3.ThemeColor); + Assert.AreEqual(0, xlColor3.ThemeTint, XLHelper.Epsilon); + + Assert.AreEqual(XLColorType.Theme, xlColor4.ColorType); + Assert.AreEqual(XLThemeColor.Accent1, xlColor4.ThemeColor); + Assert.AreEqual(0.4, xlColor4.ThemeTint, XLHelper.Epsilon); + } + } +} diff --git a/ClosedXML_Tests/Excel/Styles/FontTests.cs b/ClosedXML_Tests/Excel/Styles/FontTests.cs new file mode 100644 index 0000000..9a397d7 --- /dev/null +++ b/ClosedXML_Tests/Excel/Styles/FontTests.cs @@ -0,0 +1,30 @@ +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.Styles +{ + public class FontTests + { + [Test] + public void XLFontKey_GetHashCode_IsCaseInsensitive() + { + var fontKey1 = new XLFontKey { FontName = "Arial" }; + var fontKey2 = new XLFontKey { FontName = "Times New Roman" }; + var fontKey3 = new XLFontKey { FontName = "TIMES NEW ROMAN" }; + + Assert.AreNotEqual(fontKey1.GetHashCode(), fontKey2.GetHashCode()); + Assert.AreEqual(fontKey2.GetHashCode(), fontKey3.GetHashCode()); + } + + [Test] + public void XLFontKey_Equals_IsCaseInsensitive() + { + var fontKey1 = new XLFontKey { FontName = "Arial" }; + var fontKey2 = new XLFontKey { FontName = "Times New Roman" }; + var fontKey3 = new XLFontKey { FontName = "TIMES NEW ROMAN" }; + + Assert.IsFalse(fontKey1.Equals(fontKey2)); + Assert.IsTrue(fontKey2.Equals(fontKey3)); + } + } +} diff --git a/ClosedXML_Tests/Excel/Styles/NumberFormatTests.cs b/ClosedXML_Tests/Excel/Styles/NumberFormatTests.cs new file mode 100644 index 0000000..dfe4e93 --- /dev/null +++ b/ClosedXML_Tests/Excel/Styles/NumberFormatTests.cs @@ -0,0 +1,94 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Data; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.Excel +{ + public class NumberFormatTests + { + [Test] + public void PreserveCellFormat() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + var table = new DataTable(); + table.Columns.Add("Date", typeof(DateTime)); + + for (int i = 0; i < 10; i++) + { + table.Rows.Add(new DateTime(2017, 1, 1).AddMonths(i)); + } + + ws.Column(1).Style.NumberFormat.Format = "yy-MM-dd"; + ws.Cell("A1").InsertData(table); + Assert.AreEqual("yy-MM-dd", ws.Cell("A5").Style.DateFormat.Format); + + ws.Row(1).Style.NumberFormat.Format = "yy-MM-dd"; + ws.Cell("A1").InsertData(table.Rows, true); + Assert.AreEqual("yy-MM-dd", ws.Cell("E1").Style.DateFormat.Format); + } + } + + [Test] + public void TestExcelNumberFormats() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var c = ws.FirstCell() + .SetValue(41573.875) + .SetDataType(XLDataType.DateTime); + + c.Style.NumberFormat.SetFormat("m/d/yy\\ h:mm;@"); + + Assert.AreEqual("10/26/13 21:00", c.GetFormattedString()); + } + } + + [Test] + public void ReadAndWriteColumnNumberFormat() + { + using (var memoryStream = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var sourceColumn = ws.Column(1); + sourceColumn.Style.NumberFormat.Format = "0.000"; + wb.SaveAs(memoryStream); + } + + memoryStream.Position = 0; + + using (var wb = new XLWorkbook(memoryStream)) + { + var column = wb.Worksheets.Single().Column(1); + Assert.AreEqual("0.000", column.Style.NumberFormat.Format); + } + } + } + + [Test] + public void XLNumberFormatKey_GetHashCode_IsCaseSensitive() + { + var numberFormatKey1 = new XLNumberFormatKey { Format = "MM" }; + var numberFormatKey2 = new XLNumberFormatKey { Format = "mm" }; + + Assert.AreNotEqual(numberFormatKey1.GetHashCode(), numberFormatKey2.GetHashCode()); + } + + [Test] + public void XLNumberFormatKey_Equals_IsCaseSensitive() + { + var numberFormatKey1 = new XLNumberFormatKey { Format = "MM" }; + var numberFormatKey2 = new XLNumberFormatKey { Format = "mm" }; + + Assert.IsFalse(numberFormatKey1.Equals(numberFormatKey2)); + } + } +} diff --git a/ClosedXML_Tests/Excel/Styles/StyleChangeTests.cs b/ClosedXML_Tests/Excel/Styles/StyleChangeTests.cs new file mode 100644 index 0000000..fcfc50d --- /dev/null +++ b/ClosedXML_Tests/Excel/Styles/StyleChangeTests.cs @@ -0,0 +1,136 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ClosedXML_Tests.Excel.Styles +{ + [TestFixture] + public class StyleChangeTests + { + [Test] + public void ChangeFontColorDoesNotAffectOtherProperties() + { + using (var wb = new XLWorkbook()) + { + // Arrange + var ws = wb.AddWorksheet("Sheet1"); + var a1 = ws.Cell("A1"); + var a2 = ws.Cell("A2"); + var b1 = ws.Cell("B1"); + var b2 = ws.Cell("B2"); + + ws.Range("A1:B2").Value = "Test"; + + a1.Style.Fill.BackgroundColor = XLColor.Red; + a2.Style.Fill.BackgroundColor = XLColor.Green; + b1.Style.Fill.BackgroundColor = XLColor.Blue; + b2.Style.Fill.BackgroundColor = XLColor.Pink; + + a1.Style.Font.FontName = "Arial"; + a2.Style.Font.FontName = "Times New Roman"; + b1.Style.Font.FontName = "Calibri"; + b2.Style.Font.FontName = "Cambria"; + + // Act + ws.Range("A1:B2").Style.Font.FontColor = XLColor.PowderBlue; + + //Assert + Assert.AreEqual(XLColor.Red, ws.Cell("A1").Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Cell("A2").Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Blue, ws.Cell("B1").Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Pink, ws.Cell("B2").Style.Fill.BackgroundColor); + + Assert.AreEqual("Arial", ws.Cell("A1").Style.Font.FontName); + Assert.AreEqual("Times New Roman", ws.Cell("A2").Style.Font.FontName); + Assert.AreEqual("Calibri", ws.Cell("B1").Style.Font.FontName); + Assert.AreEqual("Cambria", ws.Cell("B2").Style.Font.FontName); + + Assert.AreEqual(XLColor.PowderBlue, ws.Cell("A1").Style.Font.FontColor); + Assert.AreEqual(XLColor.PowderBlue, ws.Cell("A2").Style.Font.FontColor); + Assert.AreEqual(XLColor.PowderBlue, ws.Cell("B1").Style.Font.FontColor); + Assert.AreEqual(XLColor.PowderBlue, ws.Cell("B2").Style.Font.FontColor); + } + } + + + [Test] + public void ChangeDetachedStyleAlignment() + { + var style = XLStyle.Default; + + style.Alignment.Horizontal = XLAlignmentHorizontalValues.Justify; + + Assert.AreEqual(XLAlignmentHorizontalValues.Justify, style.Alignment.Horizontal); + } + + [Test] + public void ChangeDetachedStyleBorder() + { + var style = XLStyle.Default; + + style.Border.DiagonalBorder = XLBorderStyleValues.Double; + + Assert.AreEqual(XLBorderStyleValues.Double, style.Border.DiagonalBorder); + } + + [Test] + public void ChangeDetachedStyleFill() + { + var style = XLStyle.Default; + + style.Fill.BackgroundColor = XLColor.Red; + + Assert.AreEqual(XLColor.Red, style.Fill.BackgroundColor); + } + + + [Test] + public void ChangeDetachedStyleFont() + { + var style = XLStyle.Default; + + style.Font.FontSize = 50; + + Assert.AreEqual(50, style.Font.FontSize); + } + + + [Test] + public void ChangeDetachedStyleNumberFormat() + { + var style = XLStyle.Default; + + style.NumberFormat.Format = "YYYY"; + + Assert.AreEqual("YYYY", style.NumberFormat.Format); + } + + [Test] + public void ChangeDetachedStyleProtection() + { + var style = XLStyle.Default; + + style.Protection.Hidden = true; + + Assert.AreEqual(true, style.Protection.Hidden); + } + + [Test] + public void ChangeAttachedStyleAlignment() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var a1 = ws.Cell("A1"); + + a1.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Justify; + + Assert.AreEqual(XLAlignmentHorizontalValues.Justify, a1.Style.Alignment.Horizontal); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Styles/StyleTests.cs b/ClosedXML_Tests/Excel/Styles/StyleTests.cs new file mode 100644 index 0000000..34e468c --- /dev/null +++ b/ClosedXML_Tests/Excel/Styles/StyleTests.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using ClosedXML.Excel; +using NUnit.Framework; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.Excel +{ + [TestFixture] + public class StyleTests + { + [Test] + public void EmptyCellWithQuotePrefixNotTreatedAsEmpty() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Empty cell with quote prefix:"); + var cell = ws.FirstCell().CellRight() as XLCell; + + Assert.IsTrue(cell.IsEmpty()); + cell.Style.IncludeQuotePrefix = true; + + Assert.IsTrue(cell.IsEmpty()); + Assert.IsFalse(cell.IsEmpty(XLCellsUsedOptions.All)); + + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + var cell = ws.FirstCell().CellRight() as XLCell; + Assert.AreEqual(1, cell.SharedStringId); + + Assert.IsTrue(cell.IsEmpty()); + Assert.IsFalse(cell.IsEmpty(XLCellsUsedOptions.All)); + } + } + } + + [TestCase("A1", TestName = "First cell")] + [TestCase("A2", TestName = "Cell from initialized row")] + [TestCase("B1", TestName = "Cell from initialized column")] + [TestCase("D4", TestName = "Initialized cell")] + [TestCase("F6", TestName = "Non-initialized cell")] + public void CellTakesWorksheetStyle(string cellAddress) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Column(2); + ws.Row(2); + ws.Cell("D4").Value = "Non empty"; + ws.Style.Font.SetFontName("Arial"); + ws.Style.Font.SetFontSize(9); + + var cell = ws.Cell(cellAddress); + Assert.AreEqual("Arial", cell.Style.Font.FontName); + Assert.AreEqual(9, cell.Style.Font.FontSize); + } + } + + [TestCaseSource(nameof(StylizedEntities))] + public void WorksheetStyleAffectsAllNestedEntities(Func getEntityStyle) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + + ws.Style.Font.FontSize = 8; + + var style = getEntityStyle(ws); + + Assert.AreEqual(8, style.Font.FontSize); + } + } + + private static IEnumerable StylizedEntities + { + get + { + var t = nameof(WorksheetStyleAffectsAllNestedEntities); + yield return new TestCaseData(new Func((ws) => ws.Style)).SetName(t + ": Worksheet"); + + yield return new TestCaseData(new Func((ws) => ws.Columns().Style)).SetName(t + ": Columns()"); + yield return new TestCaseData(new Func((ws) => ws.Columns(1, 3).Style)).SetName(t + ": Columns(1, 3)"); + yield return new TestCaseData(new Func((ws) => ws.Columns("B:F").Style)).SetName(t + ": Columns(\"B:F\")"); + yield return new TestCaseData(new Func((ws) => ws.Columns("B", "F").Style)).SetName(t + ": Columns(\"B\", \"F\")"); + yield return new TestCaseData(new Func((ws) => ws.Column(5).Style)).SetName(t + ": Column(5)"); + yield return new TestCaseData(new Func((ws) => ws.Column("D").Style)).SetName(t + ": Column(\"D\")"); + + yield return new TestCaseData(new Func((ws) => ws.Rows().Style)).SetName(t + ": Rows()"); + yield return new TestCaseData(new Func((ws) => ws.Rows(1, 3).Style)).SetName(t + ": Rows(1, 3)"); + yield return new TestCaseData(new Func((ws) => ws.Rows("1:3").Style)).SetName(t + ": Rows(\"1:3\")"); + yield return new TestCaseData(new Func((ws) => ws.Row(5).Style)).SetName(t + ": Row(5)"); + + yield return new TestCaseData(new Func((ws) => ws.Cells().Style)).SetName(t + ": Cells()"); + yield return new TestCaseData(new Func((ws) => ws.Cells("B2,D4").Style)).SetName(t + ": Cells(\"B2, D4\")"); + yield return new TestCaseData(new Func((ws) => ws.Cell("F6").Style)).SetName(t + ": Cell(\"F6\")"); + yield return new TestCaseData(new Func((ws) => ws.Cell(2, 3).Style)).SetName(t + ": Cell(2, 3)"); + + yield return new TestCaseData(new Func((ws) => ws.Ranges("F6:H9,I8:K10").Style)).SetName(t + ": Ranges(\"F6:H9,I8:K10\")"); + yield return new TestCaseData(new Func((ws) => ws.Range("G8:H10").Style)).SetName(t + ": Range(\"G8:H10\")"); + yield return new TestCaseData(new Func((ws) => ws.Range("G8:H10").Column(1).Style)).SetName(t + ": Range(\"G8:H10\").Column(1)"); + yield return new TestCaseData(new Func((ws) => ws.Range("G8:H10").Row(2).Style)).SetName(t + ": Range(\"G8:H10\").Row(2)"); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Styles/XLFillTests.cs b/ClosedXML_Tests/Excel/Styles/XLFillTests.cs new file mode 100644 index 0000000..dcd21c5 --- /dev/null +++ b/ClosedXML_Tests/Excel/Styles/XLFillTests.cs @@ -0,0 +1,119 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System.IO; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class XLFillTests + { + [Test] + public void BackgroundColorSetsPattern() + { + var fill = new XLFill { BackgroundColor = XLColor.Blue }; + Assert.AreEqual(XLFillPatternValues.Solid, fill.PatternType); + } + + [Test] + public void BackgroundNoColorSetsPatternNone() + { + var fill = new XLFill { BackgroundColor = XLColor.NoColor }; + Assert.AreEqual(XLFillPatternValues.None, fill.PatternType); + } + + [Test] + public void BackgroundPatternEqualCheck() + { + var fill1 = new XLFill { BackgroundColor = XLColor.Blue }; + var fill2 = new XLFill { BackgroundColor = XLColor.Blue }; + Assert.IsTrue(fill1.Equals(fill2)); + Assert.AreEqual(fill1.GetHashCode(), fill2.GetHashCode()); + } + + [Test] + public void BackgroundPatternNotEqualCheck() + { + var fill1 = new XLFill { PatternType = XLFillPatternValues.Solid, BackgroundColor = XLColor.Blue }; + var fill2 = new XLFill { PatternType = XLFillPatternValues.Solid, BackgroundColor = XLColor.Red }; + Assert.IsFalse(fill1.Equals(fill2)); + Assert.AreNotEqual(fill1.GetHashCode(), fill2.GetHashCode()); + } + + [Test] + public void FillsWithTransparentColorEqual() + { + var fill1 = new XLFill { BackgroundColor = XLColor.ElectricUltramarine, PatternType = XLFillPatternValues.None }; + var fill2 = new XLFill { BackgroundColor = XLColor.EtonBlue, PatternType = XLFillPatternValues.None }; + var fill3 = new XLFill { BackgroundColor = XLColor.FromIndex(64) }; + var fill4 = new XLFill { BackgroundColor = XLColor.NoColor }; + + Assert.IsTrue(fill1.Equals(fill2)); + Assert.IsTrue(fill1.Equals(fill3)); + Assert.IsTrue(fill1.Equals(fill4)); + Assert.AreEqual(fill1.GetHashCode(), fill2.GetHashCode()); + Assert.AreEqual(fill1.GetHashCode(), fill3.GetHashCode()); + Assert.AreEqual(fill1.GetHashCode(), fill4.GetHashCode()); + } + + [Test] + public void SolidFillsWithDifferentPatternColorEqual() + { + var fill1 = new XLFill + { + PatternType = XLFillPatternValues.Solid, + BackgroundColor = XLColor.Red, + PatternColor = XLColor.Blue + }; + + var fill2 = new XLFill { + PatternType = XLFillPatternValues.Solid, + BackgroundColor = XLColor.Red, + PatternColor = XLColor.Green + }; + + Assert.IsTrue(fill1.Equals(fill2)); + Assert.AreEqual(fill1.GetHashCode(), fill2.GetHashCode()); + } + + [Test] + public void BackgroundWithConditionalFormat() + { + var workbook = new XLWorkbook(); + var worksheet = workbook.AddWorksheet("Test"); + worksheet.Cell(2, 2).SetValue("Text"); + var cf = worksheet.Cell(2, 2).AddConditionalFormat(); + var style = cf.WhenNotBlank(); + style = style + .Border.SetOutsideBorder(XLBorderStyleValues.Thick) + .Border.SetOutsideBorderColor(XLColor.Blue); + + Assert.AreEqual(style.Border.BottomBorder, XLBorderStyleValues.Thick); + Assert.AreEqual(style.Border.TopBorder, XLBorderStyleValues.Thick); + Assert.AreEqual(style.Border.LeftBorder, XLBorderStyleValues.Thick); + Assert.AreEqual(style.Border.RightBorder, XLBorderStyleValues.Thick); + + Assert.AreEqual(style.Border.BottomBorderColor, XLColor.Blue); + Assert.AreEqual(style.Border.TopBorderColor, XLColor.Blue); + Assert.AreEqual(style.Border.LeftBorderColor, XLColor.Blue); + Assert.AreEqual(style.Border.RightBorderColor, XLColor.Blue); + } + + [Test] + public void LoadAndSaveTransparentBackgroundFill() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\StyleReferenceFiles\TransparentBackgroundFill\inputfile.xlsx"))) + using (var ms = new MemoryStream()) + { + TestHelper.CreateAndCompare(() => + { + var wb = new XLWorkbook(stream); + wb.SaveAs(ms); + return wb; + }, @"Other\StyleReferenceFiles\TransparentBackgroundFill\TransparentBackgroundFill.xlsx"); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Tables/AddingAndReplacingTableDataTests.cs b/ClosedXML_Tests/Excel/Tables/AddingAndReplacingTableDataTests.cs new file mode 100644 index 0000000..ccae4ad --- /dev/null +++ b/ClosedXML_Tests/Excel/Tables/AddingAndReplacingTableDataTests.cs @@ -0,0 +1,675 @@ +using ClosedXML.Attributes; +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.Excel.Tables +{ + [TestFixture] + public class AppendingAndReplacingTableDataTests + { + public class TestObjectWithoutAttributes + { + public String Column1 { get; set; } + public String Column2 { get; set; } + } + + public class Person + { + public int Age { get; set; } + + [XLColumn(Header = "Last name", Order = 2)] + public String LastName { get; set; } + + [XLColumn(Header = "First name", Order = 1)] + public String FirstName { get; set; } + + [XLColumn(Header = "Full name", Order = 0)] + public String FullName { get => string.Concat(FirstName, " ", LastName); } + + [XLColumn(Order = 3)] + public DateTime DateOfBirth { get; set; } + + [XLColumn(Header = "Is active", Order = 4)] + public bool IsActive; + } + + private XLWorkbook PrepareWorkbook() + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Tables"); + + var data = new[] + { + new Person{FirstName = "Francois", LastName = "Botha", Age = 39, DateOfBirth = new DateTime(1980,1,1), IsActive = true}, + new Person{FirstName = "Leon", LastName = "Oosthuizen", Age = 40, DateOfBirth = new DateTime(1979,1,1), IsActive = false}, + new Person{FirstName = "Rian", LastName = "Prinsloo", Age = 41, DateOfBirth = new DateTime(1978,1,1), IsActive = false} + }; + + ws.FirstCell().CellRight().CellBelow().InsertTable(data); + + ws.Columns().AdjustToContents(); + + return wb; + } + + private XLWorkbook PrepareWorkbookWithAdditionalColumns() + { + var wb = PrepareWorkbook(); + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + table.HeadersRow() + .LastCell().CellRight() + .InsertData(new[] { "CumulativeAge", "NameLength", "IsOld", "HardCodedValue" }, transpose: true); + + table.Resize(ws.Range(table.FirstCell(), table.LastCell().CellRight(4))); + + table.Field("CumulativeAge").DataCells.ForEach(c => c.FormulaA1 = $"SUM($G$3:G{c.WorksheetRow().RowNumber()})"); + table.Field("NameLength").DataCells.ForEach(c => c.FormulaA1 = $"LEN(B{c.WorksheetRow().RowNumber()})"); + table.Field("IsOld").DataCells.ForEach(c => c.FormulaA1 = $"=G{c.WorksheetRow().RowNumber()}>=40"); + table.Field("HardCodedValue").DataCells.Value = "40 is not old!"; + + return wb; + } + + private Person[] NewData + { + get + { + return new[] + { + new Person{FirstName = "Michelle", LastName = "de Beer", Age = 35, DateOfBirth = new DateTime(1983,1,1), IsActive = false}, + new Person{FirstName = "Marichen", LastName = "van der Gryp", Age = 30, DateOfBirth = new DateTime(1990,1,1), IsActive = true} + }; + } + } + + [Test] + public void AddingEmptyEnumerables() + { + using (var wb = PrepareWorkbook()) + { + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + + IEnumerable personEnumerable = null; + Assert.AreEqual(null, table.AppendData(personEnumerable)); + + personEnumerable = new Person[] { }; + Assert.AreEqual(null, table.AppendData(personEnumerable)); + + IEnumerable enumerable = null; + Assert.AreEqual(null, table.AppendData(enumerable)); + + enumerable = new Person[] { }; + Assert.AreEqual(null, table.AppendData(enumerable)); + } + } + + [Test] + public void ReplaceWithEmptyEnumerables() + { + using (var wb = PrepareWorkbook()) + { + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + + IEnumerable personEnumerable = null; + Assert.Throws(() => table.ReplaceData(personEnumerable)); + + personEnumerable = new Person[] { }; + Assert.Throws(() => table.ReplaceData(personEnumerable)); + + IEnumerable enumerable = null; + Assert.Throws(() => table.ReplaceData(enumerable)); + + enumerable = new Person[] { }; + Assert.Throws(() => table.ReplaceData(enumerable)); + } + } + + [Test] + public void CanAppendTypedEnumerable() + { + using (var ms = new MemoryStream()) + { + using (var wb = PrepareWorkbook()) + { + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + + IEnumerable personEnumerable = NewData; + var addedRange = table.AppendData(personEnumerable); + + Assert.AreEqual("B6:G7", addedRange.RangeAddress.ToString()); + ws.Columns().AdjustToContents(); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var table = wb.Worksheets.SelectMany(ws => ws.Tables).First(); + + Assert.AreEqual(5, table.DataRange.RowCount()); + Assert.AreEqual(6, table.DataRange.ColumnCount()); + } + } + } + + [Test] + public void CanAppendToTableWithTotalsRow() + { + using (var ms = new MemoryStream()) + { + using (var wb = PrepareWorkbook()) + { + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + table.SetShowTotalsRow(true); + table.Fields.Last().TotalsRowFunction = XLTotalsRowFunction.Average; + + IEnumerable personEnumerable = NewData; + var addedRange = table.AppendData(personEnumerable); + + Assert.AreEqual("B6:G7", addedRange.RangeAddress.ToString()); + ws.Columns().AdjustToContents(); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var table = wb.Worksheets.SelectMany(ws => ws.Tables).First(); + + Assert.AreEqual(5, table.DataRange.RowCount()); + Assert.AreEqual(6, table.DataRange.ColumnCount()); + } + } + } + + [Test] + public void CanAppendTypedEnumerableAndPushDownCellsBelowTable() + { + using (var ms = new MemoryStream()) + { + var value = "Some value that will be overwritten"; + IXLAddress address; + using (var wb = PrepareWorkbook()) + { + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + + var cell = table.LastRow().FirstCell().CellRight(2).CellBelow(1); + address = cell.Address; + cell.Value = value; + + IEnumerable personEnumerable = NewData; + var addedRange = table.AppendData(personEnumerable); + + Assert.AreEqual("B6:G7", addedRange.RangeAddress.ToString()); + ws.Columns().AdjustToContents(); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + + var cell = ws.Cell(address); + Assert.AreEqual("de Beer", cell.Value); + Assert.AreEqual(5, table.DataRange.RowCount()); + Assert.AreEqual(6, table.DataRange.ColumnCount()); + + Assert.AreEqual(value, cell.CellBelow(NewData.Count()).Value); + } + } + } + + [Test] + public void CanAppendUntypedEnumerable() + { + using (var ms = new MemoryStream()) + { + using (var wb = PrepareWorkbook()) + { + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + + var list = new ArrayList(); + list.AddRange(NewData); + + var addedRange = table.AppendData(list); + + Assert.AreEqual("B6:G7", addedRange.RangeAddress.ToString()); + + ws.Columns().AdjustToContents(); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var table = wb.Worksheets.SelectMany(ws => ws.Tables).First(); + + Assert.AreEqual(5, table.DataRange.RowCount()); + Assert.AreEqual(6, table.DataRange.ColumnCount()); + } + } + } + + [Test] + public void CanAppendDataTable() + { + using (var ms = new MemoryStream()) + { + using (var wb = PrepareWorkbook()) + { + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + + IEnumerable personEnumerable = NewData; + + var ws2 = wb.AddWorksheet("temp"); + var dataTable = ws2.FirstCell().InsertTable(personEnumerable).AsNativeDataTable(); + + var addedRange = table.AppendData(dataTable); + + Assert.AreEqual("B6:G7", addedRange.RangeAddress.ToString()); + ws.Columns().AdjustToContents(); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var table = wb.Worksheets.SelectMany(ws => ws.Tables).First(); + + Assert.AreEqual(5, table.DataRange.RowCount()); + Assert.AreEqual(6, table.DataRange.ColumnCount()); + } + } + } + + [Test] + public void CanReplaceWithTypedEnumerable() + { + using (var ms = new MemoryStream()) + { + using (var wb = PrepareWorkbook()) + { + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + + IEnumerable personEnumerable = NewData; + var replacedRange = table.ReplaceData(personEnumerable); + + Assert.AreEqual("B3:G4", replacedRange.RangeAddress.ToString()); + ws.Columns().AdjustToContents(); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var table = wb.Worksheets.SelectMany(ws => ws.Tables).First(); + + Assert.AreEqual(2, table.DataRange.RowCount()); + Assert.AreEqual(6, table.DataRange.ColumnCount()); + } + } + } + + [Test] + public void CanReplaceWithUntypedEnumerable() + { + using (var ms = new MemoryStream()) + { + using (var wb = PrepareWorkbook()) + { + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + + var list = new ArrayList(); + list.AddRange(NewData); + + var replacedRange = table.ReplaceData(list); + + Assert.AreEqual("B3:G4", replacedRange.RangeAddress.ToString()); + + ws.Columns().AdjustToContents(); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var table = wb.Worksheets.SelectMany(ws => ws.Tables).First(); + + Assert.AreEqual(2, table.DataRange.RowCount()); + Assert.AreEqual(6, table.DataRange.ColumnCount()); + } + } + } + + [Test] + public void CanReplaceWithDataTable() + { + using (var ms = new MemoryStream()) + { + using (var wb = PrepareWorkbook()) + { + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + + IEnumerable personEnumerable = NewData; + + var ws2 = wb.AddWorksheet("temp"); + var dataTable = ws2.FirstCell().InsertTable(personEnumerable).AsNativeDataTable(); + + var replacedRange = table.ReplaceData(dataTable); + + Assert.AreEqual("B3:G4", replacedRange.RangeAddress.ToString()); + ws.Columns().AdjustToContents(); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var table = wb.Worksheets.SelectMany(ws => ws.Tables).First(); + + Assert.AreEqual(2, table.DataRange.RowCount()); + Assert.AreEqual(6, table.DataRange.ColumnCount()); + } + } + } + + [Test] + public void CanReplaceToTableWithTablesRow1() + { + using (var ms = new MemoryStream()) + { + using (var wb = PrepareWorkbook()) + { + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + table.SetShowTotalsRow(true); + table.Fields.Last().TotalsRowFunction = XLTotalsRowFunction.Average; + + // Will cause table to overflow + IEnumerable personEnumerable = NewData.Union(NewData).Union(NewData); + var replacedRange = table.ReplaceData(personEnumerable); + + Assert.AreEqual("B3:G8", replacedRange.RangeAddress.ToString()); + ws.Columns().AdjustToContents(); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var table = wb.Worksheets.SelectMany(ws => ws.Tables).First(); + + Assert.AreEqual(6, table.DataRange.RowCount()); + Assert.AreEqual(6, table.DataRange.ColumnCount()); + } + } + } + + [Test] + public void CanReplaceToTableWithTablesRow2() + { + using (var ms = new MemoryStream()) + { + using (var wb = PrepareWorkbook()) + { + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + table.SetShowTotalsRow(true); + table.Fields.Last().TotalsRowFunction = XLTotalsRowFunction.Average; + + // Will cause table to shrink + IEnumerable personEnumerable = NewData.Take(1); + var replacedRange = table.ReplaceData(personEnumerable); + + Assert.AreEqual("B3:G3", replacedRange.RangeAddress.ToString()); + ws.Columns().AdjustToContents(); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var table = wb.Worksheets.SelectMany(ws => ws.Tables).First(); + + Assert.AreEqual(1, table.DataRange.RowCount()); + Assert.AreEqual(6, table.DataRange.ColumnCount()); + } + } + } + + [Test] + public void CanReplaceWithUntypedEnumerableAndPropagateExtraColumns() + { + using (var ms = new MemoryStream()) + { + using (var wb = PrepareWorkbookWithAdditionalColumns()) + { + var ws = wb.Worksheets.First(); + var table = ws.Tables.First(); + + var list = new ArrayList(); + list.AddRange(NewData); + list.AddRange(NewData); + + var replacedRange = table.ReplaceData(list, propagateExtraColumns: true); + + Assert.AreEqual("B3:G6", replacedRange.RangeAddress.ToString()); + + ws.Columns().AdjustToContents(); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var table = wb.Worksheets.SelectMany(ws => ws.Tables).First(); + + Assert.AreEqual(4, table.DataRange.RowCount()); + Assert.AreEqual(10, table.DataRange.ColumnCount()); + + Assert.AreEqual("SUM($G$3:G5)", table.Worksheet.Cell("H5").FormulaA1); + Assert.AreEqual("SUM($G$3:G6)", table.Worksheet.Cell("H6").FormulaA1); + Assert.AreEqual(100, table.Worksheet.Cell("H5").Value); + Assert.AreEqual(130, table.Worksheet.Cell("H6").Value); + + Assert.AreEqual("LEN(B5)", table.Worksheet.Cell("I5").FormulaA1); + Assert.AreEqual("LEN(B6)", table.Worksheet.Cell("I6").FormulaA1); + Assert.AreEqual(16, table.Worksheet.Cell("I5").Value); + Assert.AreEqual(21, table.Worksheet.Cell("I6").Value); + + Assert.AreEqual("G5>=40", table.Worksheet.Cell("J5").FormulaA1); + Assert.AreEqual("G6>=40", table.Worksheet.Cell("J6").FormulaA1); + Assert.AreEqual(false, table.Worksheet.Cell("J5").Value); + Assert.AreEqual(false, table.Worksheet.Cell("J6").Value); + + Assert.AreEqual("40 is not old!", table.Worksheet.Cell("K5").Value); + Assert.AreEqual("40 is not old!", table.Worksheet.Cell("K6").Value); + } + } + } + + [Test] + public void CanReplaceWithTypedEnumerableAndPropagateExtraColumns() + { + using (var ms = new MemoryStream()) + { + using (var wb = PrepareWorkbookWithAdditionalColumns()) + { + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + + IEnumerable personEnumerable = NewData.Concat(NewData).OrderBy(p => p.Age); + var replacedRange = table.ReplaceData(personEnumerable, propagateExtraColumns: true); + + Assert.AreEqual("B3:G6", replacedRange.RangeAddress.ToString()); + ws.Columns().AdjustToContents(); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var table = wb.Worksheets.SelectMany(ws => ws.Tables).First(); + + Assert.AreEqual(4, table.DataRange.RowCount()); + Assert.AreEqual(10, table.DataRange.ColumnCount()); + + Assert.AreEqual("SUM($G$3:G5)", table.Worksheet.Cell("H5").FormulaA1); + Assert.AreEqual("SUM($G$3:G6)", table.Worksheet.Cell("H6").FormulaA1); + Assert.AreEqual(95, table.Worksheet.Cell("H5").Value); + Assert.AreEqual(130, table.Worksheet.Cell("H6").Value); + + Assert.AreEqual("LEN(B5)", table.Worksheet.Cell("I5").FormulaA1); + Assert.AreEqual("LEN(B6)", table.Worksheet.Cell("I6").FormulaA1); + Assert.AreEqual(16, table.Worksheet.Cell("I5").Value); + Assert.AreEqual(16, table.Worksheet.Cell("I6").Value); + + Assert.AreEqual("G5>=40", table.Worksheet.Cell("J5").FormulaA1); + Assert.AreEqual("G6>=40", table.Worksheet.Cell("J6").FormulaA1); + Assert.AreEqual(false, table.Worksheet.Cell("J5").Value); + Assert.AreEqual(false, table.Worksheet.Cell("J6").Value); + + Assert.AreEqual("40 is not old!", table.Worksheet.Cell("K5").Value); + Assert.AreEqual("40 is not old!", table.Worksheet.Cell("K6").Value); + } + } + } + + [Test] + public void CanAppendWithUntypedEnumerableAndPropagateExtraColumns() + { + using (var ms = new MemoryStream()) + { + using (var wb = PrepareWorkbookWithAdditionalColumns()) + { + var ws = wb.Worksheets.First(); + var table = ws.Tables.First(); + + var list = new ArrayList(); + list.AddRange(NewData); + list.AddRange(NewData); + + var appendedRange = table.AppendData(list, propagateExtraColumns: true); + + Assert.AreEqual("B6:G9", appendedRange.RangeAddress.ToString()); + + ws.Columns().AdjustToContents(); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var table = wb.Worksheets.SelectMany(ws => ws.Tables).First(); + + Assert.AreEqual(7, table.DataRange.RowCount()); + Assert.AreEqual(10, table.DataRange.ColumnCount()); + + Assert.AreEqual("SUM($G$3:G8)", table.Worksheet.Cell("H8").FormulaA1); + Assert.AreEqual("SUM($G$3:G9)", table.Worksheet.Cell("H9").FormulaA1); + Assert.AreEqual(220, table.Worksheet.Cell("H8").Value); + Assert.AreEqual(250, table.Worksheet.Cell("H9").Value); + + Assert.AreEqual("LEN(B8)", table.Worksheet.Cell("I8").FormulaA1); + Assert.AreEqual("LEN(B9)", table.Worksheet.Cell("I9").FormulaA1); + Assert.AreEqual(16, table.Worksheet.Cell("I8").Value); + Assert.AreEqual(21, table.Worksheet.Cell("I9").Value); + + Assert.AreEqual("G8>=40", table.Worksheet.Cell("J8").FormulaA1); + Assert.AreEqual("G9>=40", table.Worksheet.Cell("J9").FormulaA1); + Assert.AreEqual(false, table.Worksheet.Cell("J8").Value); + Assert.AreEqual(false, table.Worksheet.Cell("J9").Value); + + Assert.AreEqual("40 is not old!", table.Worksheet.Cell("K8").Value); + Assert.AreEqual("40 is not old!", table.Worksheet.Cell("K9").Value); + } + } + } + + [Test] + public void CanAppendTypedEnumerableAndPropagateExtraColumns() + { + using (var ms = new MemoryStream()) + { + using (var wb = PrepareWorkbookWithAdditionalColumns()) + { + var ws = wb.Worksheets.First(); + + var table = ws.Tables.First(); + + IEnumerable personEnumerable = + NewData + .Concat(NewData) + .Concat(NewData) + .OrderBy(p => p.FirstName); + + var addedRange = table.AppendData(personEnumerable); + + Assert.AreEqual("B6:G11", addedRange.RangeAddress.ToString()); + ws.Columns().AdjustToContents(); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var table = wb.Worksheets.SelectMany(ws => ws.Tables).First(); + + Assert.AreEqual(9, table.DataRange.RowCount()); + Assert.AreEqual(10, table.DataRange.ColumnCount()); + + Assert.AreEqual("SUM($G$3:G10)", table.Worksheet.Cell("H10").FormulaA1); + Assert.AreEqual("SUM($G$3:G11)", table.Worksheet.Cell("H11").FormulaA1); + Assert.AreEqual(280, table.Worksheet.Cell("H10").Value); + Assert.AreEqual(315, table.Worksheet.Cell("H11").Value); + + Assert.AreEqual("LEN(B10)", table.Worksheet.Cell("I10").FormulaA1); + Assert.AreEqual("LEN(B11)", table.Worksheet.Cell("I11").FormulaA1); + Assert.AreEqual(16, table.Worksheet.Cell("I10").Value); + Assert.AreEqual(16, table.Worksheet.Cell("I11").Value); + + Assert.AreEqual("G10>=40", table.Worksheet.Cell("J10").FormulaA1); + Assert.AreEqual("G11>=40", table.Worksheet.Cell("J11").FormulaA1); + Assert.AreEqual(false, table.Worksheet.Cell("J10").Value); + Assert.AreEqual(false, table.Worksheet.Cell("J11").Value); + + Assert.AreEqual("40 is not old!", table.Worksheet.Cell("K10").Value); + Assert.AreEqual("40 is not old!", table.Worksheet.Cell("K11").Value); + } + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Tables/TablesTests.cs b/ClosedXML_Tests/Excel/Tables/TablesTests.cs new file mode 100644 index 0000000..d35e118 --- /dev/null +++ b/ClosedXML_Tests/Excel/Tables/TablesTests.cs @@ -0,0 +1,1178 @@ +using ClosedXML.Attributes; +using ClosedXML.Excel; +using ClosedXML.Excel.Exceptions; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class TablesTests + { + public class TestObjectWithoutAttributes + { + public String Column1 { get; set; } + public String Column2 { get; set; } + } + + public class TestObjectWithAttributes + { + public int UnOrderedColumn { get; set; } + + [XLColumn(Header = "SecondColumn", Order = 1)] + public String Column1 { get; set; } + + [XLColumn(Header = "FirstColumn", Order = 0)] + public String Column2 { get; set; } + + [XLColumn(Header = "SomeFieldNotProperty", Order = 2)] + public int MyField; + } + + [Test] + public void CanSaveTableCreatedFromEmptyDataTable() + { + var dt = new DataTable("sheet1"); + dt.Columns.Add("col1", typeof(string)); + dt.Columns.Add("col2", typeof(double)); + + using (var wb = new XLWorkbook()) + { + wb.AddWorksheet(dt); + + using (var ms = new MemoryStream()) + wb.SaveAs(ms, true); + } + } + + [Test] + public void PreventAddingOfEmptyDataTable() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + var dt = new DataTable(); + var table = ws.FirstCell().InsertTable(dt); + + Assert.AreEqual(null, table); + } + } + + [Test] + public void CanSaveTableCreatedFromSingleRow() + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Title"); + ws.Range("A1").CreateTable(); + + using (var ms = new MemoryStream()) + wb.SaveAs(ms, true); + } + } + + [Test] + public void CreatingATableFromHeadersPushCellsBelow() + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Title") + .CellBelow().SetValue("X"); + ws.Range("A1").CreateTable(); + + Assert.AreEqual(String.Empty, ws.Cell("A2").GetString()); + Assert.AreEqual("X", ws.Cell("A3").GetString()); + } + } + + [Test] + public void Inserting_Column_Sets_Header() + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Categories") + .CellBelow().SetValue("A") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C"); + + IXLTable table = ws.RangeUsed().CreateTable(); + table.InsertColumnsAfter(1); + Assert.AreEqual("Column2", table.HeadersRow().LastCell().GetString()); + } + } + + [Test] + public void DataRange_returns_null_if_empty() + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Categories") + .CellBelow().SetValue("A") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C"); + + IXLTable table = ws.RangeUsed().CreateTable(); + + ws.Rows("2:4").Delete(); + + Assert.IsNull(table.DataRange); + } + } + + [Test] + public void SavingLoadingTableWithNewLineInHeader() + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + string columnName = "Line1" + Environment.NewLine + "Line2"; + ws.FirstCell().SetValue(columnName) + .CellBelow().SetValue("A"); + ws.RangeUsed().CreateTable(); + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms, true); + var wb2 = new XLWorkbook(ms); + IXLWorksheet ws2 = wb2.Worksheet(1); + IXLTable table2 = ws2.Table(0); + string fieldName = table2.Field(0).Name; + Assert.AreEqual("Line1\nLine2", fieldName); + } + } + } + + [Test] + public void SavingLoadingTableWithNewLineInHeader2() + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.Worksheets.Add("Test"); + + var dt = new DataTable(); + string columnName = "Line1" + Environment.NewLine + "Line2"; + dt.Columns.Add(columnName); + + DataRow dr = dt.NewRow(); + dr[columnName] = "some text"; + dt.Rows.Add(dr); + ws.Cell(1, 1).InsertTable(dt); + + IXLTable table1 = ws.Table(0); + string fieldName1 = table1.Field(0).Name; + Assert.AreEqual(columnName, fieldName1); + + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms, true); + var wb2 = new XLWorkbook(ms); + IXLWorksheet ws2 = wb2.Worksheet(1); + IXLTable table2 = ws2.Table(0); + string fieldName2 = table2.Field(0).Name; + Assert.AreEqual("Line1\nLine2", fieldName2); + } + } + } + + [Test] + public void TableCreatedFromEmptyDataTable() + { + var dt = new DataTable("sheet1"); + dt.Columns.Add("col1", typeof(string)); + dt.Columns.Add("col2", typeof(double)); + + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().InsertTable(dt); + Assert.AreEqual(2, ws.Tables.First().ColumnCount()); + } + } + + [Test] + public void TableCreatedFromEmptyListOfInt() + { + var l = new List(); + + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().InsertTable(l); + Assert.AreEqual(1, ws.Tables.First().ColumnCount()); + } + } + + [Test] + public void TableCreatedFromEmptyListOfObject() + { + var l = new List(); + + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().InsertTable(l); + Assert.AreEqual(2, ws.Tables.First().ColumnCount()); + } + } + + [Test] + public void TableCreatedFromListOfObjectWithPropertyAttributes() + { + var l = new List() + { + new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 }, + new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 } + }; + + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().InsertTable(l); + Assert.AreEqual(4, ws.Tables.First().ColumnCount()); + Assert.AreEqual("FirstColumn", ws.FirstCell().Value); + Assert.AreEqual("SecondColumn", ws.FirstCell().CellRight().Value); + Assert.AreEqual("SomeFieldNotProperty", ws.FirstCell().CellRight().CellRight().Value); + Assert.AreEqual("UnOrderedColumn", ws.FirstCell().CellRight().CellRight().CellRight().Value); + } + } + + [Test] + public void TableInsertAboveFromData() + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Value"); + + IXLTable table = ws.Range("A1:A2").CreateTable(); + table.SetShowTotalsRow() + .Field(0).TotalsRowFunction = XLTotalsRowFunction.Sum; + + IXLTableRow row = table.DataRange.FirstRow(); + row.Field("Value").Value = 3; + row = table.DataRange.InsertRowsAbove(1).First(); + row.Field("Value").Value = 2; + row = table.DataRange.InsertRowsAbove(1).First(); + row.Field("Value").Value = 1; + + Assert.AreEqual(1, ws.Cell(2, 1).GetDouble()); + Assert.AreEqual(2, ws.Cell(3, 1).GetDouble()); + Assert.AreEqual(3, ws.Cell(4, 1).GetDouble()); + } + } + + [Test] + public void TableInsertAboveFromRows() + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Value"); + + IXLTable table = ws.Range("A1:A2").CreateTable(); + table.SetShowTotalsRow() + .Field(0).TotalsRowFunction = XLTotalsRowFunction.Sum; + + IXLTableRow row = table.DataRange.FirstRow(); + row.Field("Value").Value = 3; + row = row.InsertRowsAbove(1).First(); + row.Field("Value").Value = 2; + row = row.InsertRowsAbove(1).First(); + row.Field("Value").Value = 1; + + Assert.AreEqual(1, ws.Cell(2, 1).GetDouble()); + Assert.AreEqual(2, ws.Cell(3, 1).GetDouble()); + Assert.AreEqual(3, ws.Cell(4, 1).GetDouble()); + } + } + + [Test] + public void TableInsertBelowFromData() + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Value"); + + IXLTable table = ws.Range("A1:A2").CreateTable(); + table.SetShowTotalsRow() + .Field(0).TotalsRowFunction = XLTotalsRowFunction.Sum; + + IXLTableRow row = table.DataRange.FirstRow(); + row.Field("Value").Value = 1; + row = table.DataRange.InsertRowsBelow(1).First(); + row.Field("Value").Value = 2; + row = table.DataRange.InsertRowsBelow(1).First(); + row.Field("Value").Value = 3; + + Assert.AreEqual(1, ws.Cell(2, 1).GetDouble()); + Assert.AreEqual(2, ws.Cell(3, 1).GetDouble()); + Assert.AreEqual(3, ws.Cell(4, 1).GetDouble()); + } + } + + [Test] + public void TableInsertBelowFromRows() + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Value"); + + IXLTable table = ws.Range("A1:A2").CreateTable(); + table.SetShowTotalsRow() + .Field(0).TotalsRowFunction = XLTotalsRowFunction.Sum; + + IXLTableRow row = table.DataRange.FirstRow(); + row.Field("Value").Value = 1; + row = row.InsertRowsBelow(1).First(); + row.Field("Value").Value = 2; + row = row.InsertRowsBelow(1).First(); + row.Field("Value").Value = 3; + + Assert.AreEqual(1, ws.Cell(2, 1).GetDouble()); + Assert.AreEqual(2, ws.Cell(3, 1).GetDouble()); + Assert.AreEqual(3, ws.Cell(4, 1).GetDouble()); + } + } + + [Test] + public void TableShowHeader() + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Categories") + .CellBelow().SetValue("A") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C"); + + IXLTable table = ws.RangeUsed().CreateTable(); + + Assert.AreEqual("Categories", table.Fields.First().Name); + + table.SetShowHeaderRow(false); + + Assert.AreEqual("Categories", table.Fields.First().Name); + + Assert.IsTrue(ws.Cell(1, 1).IsEmpty(XLCellsUsedOptions.All)); + Assert.AreEqual(null, table.HeadersRow()); + Assert.AreEqual("A", table.DataRange.FirstRow().Field("Categories").GetString()); + Assert.AreEqual("C", table.DataRange.LastRow().Field("Categories").GetString()); + Assert.AreEqual("A", table.DataRange.FirstCell().GetString()); + Assert.AreEqual("C", table.DataRange.LastCell().GetString()); + + table.SetShowHeaderRow(); + IXLRangeRow headerRow = table.HeadersRow(); + Assert.AreNotEqual(null, headerRow); + Assert.AreEqual("Categories", headerRow.Cell(1).GetString()); + + table.SetShowHeaderRow(false); + + ws.FirstCell().SetValue("x"); + + table.SetShowHeaderRow(); + + Assert.AreEqual("x", ws.FirstCell().GetString()); + Assert.AreEqual("Categories", ws.Cell("A2").GetString()); + Assert.AreNotEqual(null, headerRow); + Assert.AreEqual("A", table.DataRange.FirstRow().Field("Categories").GetString()); + Assert.AreEqual("C", table.DataRange.LastRow().Field("Categories").GetString()); + Assert.AreEqual("A", table.DataRange.FirstCell().GetString()); + Assert.AreEqual("C", table.DataRange.LastCell().GetString()); + } + } + + [Test] + public void ChangeFieldName() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet"); + ws.Cell("A1").SetValue("FName") + .CellBelow().SetValue("John"); + + ws.Cell("B1").SetValue("LName") + .CellBelow().SetValue("Doe"); + + var tbl = ws.RangeUsed().CreateTable(); + var nameBefore = tbl.Field(tbl.Fields.Last().Index).Name; + tbl.Field(tbl.Fields.Last().Index).Name = "LastName"; + var nameAfter = tbl.Field(tbl.Fields.Last().Index).Name; + + var cellValue = ws.Cell("B1").GetString(); + + Assert.AreEqual("LName", nameBefore); + Assert.AreEqual("LastName", nameAfter); + Assert.AreEqual("LastName", cellValue); + + tbl.ShowHeaderRow = false; + tbl.Field(tbl.Fields.Last().Index).Name = "LastNameChanged"; + nameAfter = tbl.Field(tbl.Fields.Last().Index).Name; + Assert.AreEqual("LastNameChanged", nameAfter); + + tbl.SetShowHeaderRow(true); + nameAfter = tbl.Cell("B1").Value.ToString(); + Assert.AreEqual("LastNameChanged", nameAfter); + + var field = tbl.Field("LastNameChanged"); + Assert.AreEqual("LastNameChanged", field.Name); + + tbl.Cell(1, 1).Value = "FirstName"; + Assert.AreEqual("FirstName", tbl.Field(0).Name); + } + } + + [Test] + public void CanDeleteTableColumn() + { + var l = new List() + { + new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 }, + new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 } + }; + + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var table = ws.FirstCell().InsertTable(l); + + table.Column("C").Delete(); + + Assert.AreEqual(3, table.Fields.Count()); + + Assert.AreEqual("FirstColumn", table.Fields.First().Name); + Assert.AreEqual(0, table.Fields.First().Index); + + Assert.AreEqual("UnOrderedColumn", table.Fields.Last().Name); + Assert.AreEqual(2, table.Fields.Last().Index); + } + } + + [Test] + public void TestFieldCellTypes() + { + var l = new List() + { + new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 }, + new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 } + }; + + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var table = ws.Cell("B2").InsertTable(l); + + Assert.AreEqual(4, table.Fields.Count()); + + Assert.AreEqual("B2", table.Field(0).HeaderCell.Address.ToString()); + Assert.AreEqual("C2", table.Field(1).HeaderCell.Address.ToString()); + Assert.AreEqual("D2", table.Field(2).HeaderCell.Address.ToString()); + Assert.AreEqual("E2", table.Field(3).HeaderCell.Address.ToString()); + + Assert.IsNull(table.Field(0).TotalsCell); + Assert.IsNull(table.Field(1).TotalsCell); + Assert.IsNull(table.Field(2).TotalsCell); + Assert.IsNull(table.Field(3).TotalsCell); + + table.SetShowTotalsRow(); + + Assert.AreEqual("B5", table.Field(0).TotalsCell.Address.ToString()); + Assert.AreEqual("C5", table.Field(1).TotalsCell.Address.ToString()); + Assert.AreEqual("D5", table.Field(2).TotalsCell.Address.ToString()); + Assert.AreEqual("E5", table.Field(3).TotalsCell.Address.ToString()); + + var field = table.Fields.Last(); + + Assert.AreEqual("E2:E5", field.Column.RangeAddress.ToString()); + Assert.AreEqual("E3", field.DataCells.First().Address.ToString()); + Assert.AreEqual("E4", field.DataCells.Last().Address.ToString()); + } + } + + [Test] + public void CanDeleteTable() + { + var l = new List() + { + new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 }, + new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 } + }; + + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().InsertTable(l); + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + var table = ws.Tables.First(); + + ws.Tables.Remove(table.Name); + Assert.AreEqual(0, ws.Tables.Count()); + wb.Save(); + } + } + } + + [Test] + public void TableNameCannotBeValidCellName() + { + var dt = new DataTable("sheet1"); + dt.Columns.Add("Patient", typeof(string)); + dt.Rows.Add("David"); + + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + Assert.Throws(() => ws.Cell(1, 1).InsertTable(dt, "May2019")); + Assert.Throws(() => ws.Cell(1, 1).InsertTable(dt, "A1")); + Assert.Throws(() => ws.Cell(1, 1).InsertTable(dt, "R1C2")); + Assert.Throws(() => ws.Cell(1, 1).InsertTable(dt, "r3c2")); + Assert.Throws(() => ws.Cell(1, 1).InsertTable(dt, "R2C33333")); + Assert.Throws(() => ws.Cell(1, 1).InsertTable(dt, "RC")); + } + } + + [Test] + public void CanDeleteTableField() + { + var l = new List() + { + new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 }, + new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 } + }; + + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var table = ws.Cell("B2").InsertTable(l); + + Assert.AreEqual("B2:E4", table.RangeAddress.ToString()); + + table.Field("SomeFieldNotProperty").Delete(); + + Assert.AreEqual(3, table.Fields.Count()); + + Assert.AreEqual("FirstColumn", table.Fields.First().Name); + Assert.AreEqual(0, table.Fields.First().Index); + + Assert.AreEqual("UnOrderedColumn", table.Fields.Last().Name); + Assert.AreEqual(2, table.Fields.Last().Index); + + Assert.AreEqual("B2:D4", table.RangeAddress.ToString()); + } + } + + [Test] + public void CanDeleteTableRows() + { + var l = new List() + { + new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 }, + new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 }, + new TestObjectWithAttributes() { Column1 = "e", Column2 = "f", MyField = 6, UnOrderedColumn = 555 }, + new TestObjectWithAttributes() { Column1 = "g", Column2 = "h", MyField = 7, UnOrderedColumn = 333 } + }; + + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var table = ws.Cell("B2").InsertTable(l); + + Assert.AreEqual("B2:E6", table.RangeAddress.ToString()); + + table.DataRange.Rows(3, 4).Delete(); + + Assert.AreEqual(2, table.DataRange.Rows().Count()); + + Assert.AreEqual("b", table.DataRange.FirstCell().Value); + Assert.AreEqual(777, table.DataRange.LastCell().Value); + + Assert.AreEqual("B2:E4", table.RangeAddress.ToString()); + } + } + + [Test] + public void OverlappingTablesThrowsException() + { + var dt = new DataTable("sheet1"); + dt.Columns.Add("col1", typeof(string)); + dt.Columns.Add("col2", typeof(double)); + + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().InsertTable(dt, true); + Assert.Throws(() => ws.FirstCell().CellRight().InsertTable(dt, true)); + } + } + + [Test] + public void OverwritingTableTotalsRow() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + var data1 = Enumerable.Range(1, 10) + .Select(i => + new + { + Index = i, + Character = Convert.ToChar(64 + i), + String = new String('a', i) + }); + + var table = ws.FirstCell().InsertTable(data1, true) + .SetShowHeaderRow() + .SetShowTotalsRow(); + table.Fields.First().TotalsRowFunction = XLTotalsRowFunction.Sum; + + var data2 = Enumerable.Range(1, 20) + .Select(i => + new + { + Index = i, + Character = Convert.ToChar(64 + i), + String = new String('b', i), + Int = 64 + i + }); + + ws.FirstCell().CellBelow().InsertData(data2); + + table.Fields.ForEach(f => Assert.AreEqual(XLTotalsRowFunction.None, f.TotalsRowFunction)); + + Assert.AreEqual("11", table.Field(0).TotalsRowLabel); + Assert.AreEqual("K", table.Field(1).TotalsRowLabel); + Assert.AreEqual("bbbbbbbbbbb", table.Field(2).TotalsRowLabel); + } + } + + [Test] + public void TableRenameTests() + { + var l = new List() + { + new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 }, + new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 } + }; + + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + var table1 = ws.FirstCell().InsertTable(l); + var table2 = ws.Cell("A10").InsertTable(l); + + Assert.AreEqual("Table1", table1.Name); + Assert.AreEqual("Table2", table2.Name); + + table1.Name = "table1"; + Assert.AreEqual("table1", table1.Name); + + table1.Name = "_table1"; + Assert.AreEqual("_table1", table1.Name); + + table1.Name = "\\table1"; + Assert.AreEqual("\\table1", table1.Name); + + Assert.Throws(() => table1.Name = ""); + Assert.Throws(() => table1.Name = "R"); + Assert.Throws(() => table1.Name = "C"); + Assert.Throws(() => table1.Name = "r"); + Assert.Throws(() => table1.Name = "c"); + + Assert.Throws(() => table1.Name = "123"); + Assert.Throws(() => table1.Name = new String('A', 256)); + + Assert.Throws(() => table1.Name = "Table2"); + Assert.Throws(() => table1.Name = "TABLE2"); + } + } + + [Test] + public void CanResizeTable() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + var data1 = Enumerable.Range(1, 10) + .Select(i => + new + { + Index = i, + Character = Convert.ToChar(64 + i), + String = new String('a', i) + }); + + var table = ws.FirstCell().InsertTable(data1, true) + .SetShowHeaderRow() + .SetShowTotalsRow(); + table.Fields.First().TotalsRowFunction = XLTotalsRowFunction.Sum; + + var data2 = Enumerable.Range(1, 10) + .Select(i => + new + { + Index = i, + Character = Convert.ToChar(64 + i), + String = new String('b', i), + Integer = 64 + i + }); + + ws.FirstCell().CellBelow().InsertData(data2); + table.Resize(table.FirstCell().Address, table.AsRange().LastCell().CellRight().Address); + + Assert.AreEqual(4, table.Fields.Count()); + + Assert.AreEqual("Column4", table.Field(3).Name); + + ws.Cell("D1").Value = "Integer"; + Assert.AreEqual("Integer", table.Field(3).Name); + } + } + + [Test] + public void TableAsDynamicEnumerable() + { + var l = new List() + { + new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 }, + new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 } + }; + + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + var table = ws.FirstCell().InsertTable(l); + + foreach (var d in table.AsDynamicEnumerable()) + { + Assert.DoesNotThrow(() => + { + object value; + value = d.FirstColumn; + value = d.SecondColumn; + value = d.UnOrderedColumn; + value = d.SomeFieldNotProperty; + }); + } + } + } + + [Test] + public void TableAsDotNetDataTable() + { + var l = new List() + { + new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 }, + new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 } + }; + + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + var table = ws.FirstCell().InsertTable(l).AsNativeDataTable(); + + Assert.AreEqual(4, table.Columns.Count); + Assert.AreEqual("FirstColumn", table.Columns[0].ColumnName); + Assert.AreEqual("SecondColumn", table.Columns[1].ColumnName); + Assert.AreEqual("SomeFieldNotProperty", table.Columns[2].ColumnName); + Assert.AreEqual("UnOrderedColumn", table.Columns[3].ColumnName); + + Assert.AreEqual(typeof(String), table.Columns[0].DataType); + Assert.AreEqual(typeof(String), table.Columns[1].DataType); + Assert.AreEqual(typeof(Double), table.Columns[2].DataType); + Assert.AreEqual(typeof(Double), table.Columns[3].DataType); + + var dr = table.Rows[0]; + Assert.AreEqual("b", dr["FirstColumn"]); + Assert.AreEqual("a", dr["SecondColumn"]); + Assert.AreEqual(4, dr["SomeFieldNotProperty"]); + Assert.AreEqual(999, dr["UnOrderedColumn"]); + + dr = table.Rows[1]; + Assert.AreEqual("d", dr["FirstColumn"]); + Assert.AreEqual("c", dr["SecondColumn"]); + Assert.AreEqual(5, dr["SomeFieldNotProperty"]); + Assert.AreEqual(777, dr["UnOrderedColumn"]); + } + } + + [Test] + public void TestTableCellTypes() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + var data1 = Enumerable.Range(1, 10) + .Select(i => + new + { + Index = i, + Character = Convert.ToChar(64 + i), + String = new String('a', i) + }); + + var table = ws.FirstCell().InsertTable(data1, true) + .SetShowHeaderRow() + .SetShowTotalsRow(); + table.Fields.First().TotalsRowFunction = XLTotalsRowFunction.Sum; + + Assert.AreEqual(XLTableCellType.Header, table.HeadersRow().Cell(1).TableCellType()); + Assert.AreEqual(XLTableCellType.Data, table.HeadersRow().Cell(1).CellBelow().TableCellType()); + Assert.AreEqual(XLTableCellType.Total, table.TotalsRow().Cell(1).TableCellType()); + Assert.AreEqual(XLTableCellType.None, ws.Cell("Z100").TableCellType()); + } + } + + [Test] + public void TotalsFunctionsOfHeadersWithWeirdCharacters() + { + var l = new List() + { + new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 }, + new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 } + }; + + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().InsertTable(l, false); + + // Give the headings weird names (i.e. spaces, hashes, single quotes + ws.Cell("A1").Value = "ABCD "; + ws.Cell("B1").Value = " #BCD"; + ws.Cell("C1").Value = " as'df "; + ws.Cell("D1").Value = "Normal"; + + var table = ws.RangeUsed().CreateTable(); + Assert.IsNotNull(table); + + table.ShowTotalsRow = true; + table.Field(0).TotalsRowFunction = XLTotalsRowFunction.Count; + table.Field(1).TotalsRowFunction = XLTotalsRowFunction.Count; + table.Field(2).TotalsRowFunction = XLTotalsRowFunction.Sum; + table.Field(3).TotalsRowFunction = XLTotalsRowFunction.Sum; + + Assert.AreEqual("SUBTOTAL(103,Table1[[ABCD ]])", table.Field(0).TotalsRowFormulaA1); + Assert.AreEqual("SUBTOTAL(103,Table1[[ '#BCD]])", table.Field(1).TotalsRowFormulaA1); + Assert.AreEqual("SUBTOTAL(109,Table1[[ as''df ]])", table.Field(2).TotalsRowFormulaA1); + Assert.AreEqual("SUBTOTAL(109,[Normal])", table.Field(3).TotalsRowFormulaA1); + } + } + + [Test] + public void CannotCreateDuplicateTablesOverSameRange() + { + var l = new List() + { + new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 }, + new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 } + }; + + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().InsertTable(l); + Assert.Throws(() => ws.RangeUsed().CreateTable()); + } + } + + [Test] + public void CannotCreateTableOverExistingAutoFilter() + { + using var wb = new XLWorkbook(); + + var data = Enumerable.Range(1, 10).Select(i => new + { + Index = i, + String = $"String {i}" + }); + + var ws = wb.AddWorksheet(); + ws.FirstCell().InsertTable(data, createTable: false); + ws.RangeUsed().SetAutoFilter().Column(1).AddFilter(5); + + Assert.Throws(() => ws.RangeUsed().CreateTable()); + } + + [Test] + public void CopyTableSameWorksheet() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + + var table = ws1.Range("A1:C2").AsTable(); + + TestDelegate action = () => table.CopyTo(ws1); + + Assert.Throws(typeof(InvalidOperationException), action); + } + + [Test] + public void CopyDetachedTableDifferentWorksheets() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + ws1.Cell("A1").Value = "Custom column 1"; + ws1.Cell("B1").Value = "Custom column 2"; + ws1.Cell("C1").Value = "Custom column 3"; + ws1.Cell("A2").Value = "Value 1"; + ws1.Cell("B2").Value = 123.45; + ws1.Cell("C2").Value = new DateTime(2018, 5, 10); + var original = ws1.Range("A1:C2").AsTable("Detached table"); + var ws2 = wb.Worksheets.Add("Sheet2"); + + var copy = original.CopyTo(ws2); + + Assert.AreEqual(0, ws1.Tables.Count()); // We did not add it + Assert.AreEqual(1, ws2.Tables.Count()); + + AssertTablesAreEqual(original, copy); + + Assert.AreEqual("Sheet2!A1:C2", copy.RangeAddress.ToString(XLReferenceStyle.A1, true)); + Assert.AreEqual("Custom column 1", ws2.Cell("A1").Value); + Assert.AreEqual("Custom column 2", ws2.Cell("B1").Value); + Assert.AreEqual("Custom column 3", ws2.Cell("C1").Value); + Assert.AreEqual("Value 1", ws2.Cell("A2").Value); + Assert.AreEqual(123.45, (double)ws2.Cell("B2").Value, XLHelper.Epsilon); + Assert.AreEqual(new DateTime(2018, 5, 10), ws2.Cell("C2").Value); + } + + [Test] + public void CopyTableDifferentWorksheets() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + ws1.Cell("A1").Value = "Custom column 1"; + ws1.Cell("B1").Value = "Custom column 2"; + ws1.Cell("C1").Value = "Custom column 3"; + ws1.Cell("A2").Value = "Value 1"; + ws1.Cell("B2").Value = 123.45; + ws1.Cell("C2").Value = new DateTime(2018, 5, 10); + var original = ws1.Range("A1:C2").AsTable("Attached table"); + ws1.Tables.Add(original); + var ws2 = wb.Worksheets.Add("Sheet2"); + + original.CopyTo(ws2); + + Assert.AreEqual(1, ws1.Tables.Count()); + Assert.AreEqual(1, ws2.Tables.Count()); + + var copy = ws2.Tables.First(); + + AssertTablesAreEqual(original, copy); + + Assert.AreEqual("Sheet2!A1:C2", copy.RangeAddress.ToString(XLReferenceStyle.A1, true)); + Assert.AreEqual("Custom column 1", ws2.Cell("A1").Value); + Assert.AreEqual("Custom column 2", ws2.Cell("B1").Value); + Assert.AreEqual("Custom column 3", ws2.Cell("C1").Value); + Assert.AreEqual("Value 1", ws2.Cell("A2").Value); + Assert.AreEqual(123.45, (double)ws2.Cell("B2").Value, XLHelper.Epsilon); + Assert.AreEqual(new DateTime(2018, 5, 10), ws2.Cell("C2").Value); + } + + [Test] + public void NewTableHasNullRelId() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + ws.Cell("A1").Value = "Custom column 1"; + ws.Cell("B1").Value = "Custom column 2"; + ws.Cell("C1").Value = "Custom column 3"; + ws.Cell("A2").Value = "Value 1"; + ws.Cell("B2").Value = 123.45; + ws.Cell("C2").Value = new DateTime(2018, 5, 10); + var original = ws.Range("A1:C2").CreateTable("Attached table"); + + Assert.AreEqual(1, ws.Tables.Count()); + Assert.IsNull((original as XLTable).RelId); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.Add("Sheet2"); + var original = wb.Worksheets.First().Tables.First(); + + Assert.IsNotNull((original as XLTable).RelId); + + var copy = original.CopyTo(ws); + + Assert.AreEqual(1, ws.Tables.Count()); + Assert.IsNull((copy as XLTable).RelId); + + AssertTablesAreEqual(original, copy); + + Assert.AreEqual("Sheet2!A1:C2", copy.RangeAddress.ToString(XLReferenceStyle.A1, true)); + Assert.AreEqual("Custom column 1", ws.Cell("A1").Value); + Assert.AreEqual("Custom column 2", ws.Cell("B1").Value); + Assert.AreEqual("Custom column 3", ws.Cell("C1").Value); + Assert.AreEqual("Value 1", ws.Cell("A2").Value); + Assert.AreEqual(123.45, (double)ws.Cell("B2").Value, XLHelper.Epsilon); + Assert.AreEqual(new DateTime(2018, 5, 10), ws.Cell("C2").Value); + } + } + } + + [Test] + public void CopyTableWithoutData() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + ws1.Cell("A1").Value = "Custom column 1"; + ws1.Cell("B1").Value = "Custom column 2"; + ws1.Cell("C1").Value = "Custom column 3"; + ws1.Cell("A2").Value = "Value 1"; + ws1.Cell("B2").Value = 123.45; + ws1.Cell("C2").Value = new DateTime(2018, 5, 10); + var original = ws1.Range("A1:C2").AsTable("Attached table"); + ws1.Tables.Add(original); + var ws2 = wb.Worksheets.Add("Sheet2") as XLWorksheet; + + var copy = (original as XLTable).CopyTo(ws2, false); + + AssertTablesAreEqual(original, copy); + + Assert.AreEqual("Sheet2!A1:C2", copy.RangeAddress.ToString(XLReferenceStyle.A1, true)); + Assert.AreEqual("Custom column 1", ws2.Cell("A1").Value); + Assert.AreEqual("Custom column 2", ws2.Cell("B1").Value); + Assert.AreEqual("Custom column 3", ws2.Cell("C1").Value); + Assert.AreEqual("", ws2.Cell("A2").Value); + Assert.AreEqual("", ws2.Cell("B2").Value); + Assert.AreEqual("", ws2.Cell("C2").Value); + } + + [Test] + public void SavingTableWithNullDataRangeThrowsException() + { + using (var ms = new MemoryStream()) + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + var data = Enumerable.Range(1, 10) + .Select(i => new + { + Number = i, + NumberString = String.Concat("Number", i.ToString()) + }); + + var table = ws.FirstCell() + .InsertTable(data) + .SetShowTotalsRow(); + + table.Fields.Last().TotalsRowFunction = XLTotalsRowFunction.Count; + + table.DataRange.Rows() + .OrderByDescending(r => r.RowNumber()) + .ToList() + .ForEach(r => r.WorksheetRow().Delete()); + + Assert.IsNull(table.DataRange); + Assert.Throws(() => wb.SaveAs(ms)); + } + } + + [Test] + public void CanCreateTableWithWhiteSpaceColumnHeaders() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + ws.Cell("A1").SetValue("Header"); + ws.Cell("B1").SetValue(new string(' ', 1)); + ws.Cell("C1").SetValue(new string(' ', 2)); + ws.Cell("D1").SetValue(new string(' ', 3)); + + var table = ws.Range("A1:E3").CreateTable("Table1"); + + Assert.AreEqual("Header", table.Field(0).Name); + Assert.AreEqual(new string(' ', 1), table.Field(1).Name); + Assert.AreEqual(new string(' ', 2), table.Field(2).Name); + Assert.AreEqual(new string(' ', 3), table.Field(3).Name); + Assert.AreEqual("Column5", table.Field(4).Name); + } + } + + [Test] + public void TableNotFound() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + Assert.Throws(() => ws.Table("dummy")); + Assert.Throws(() => wb.Table("dummy")); + } + } + + [Test] + public void SecondTableOnNewSheetHasUniqueName() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.AddWorksheet(); + var t1 = ws1.FirstCell().InsertTable(Enumerable.Range(1, 10).Select(i => new { Number = i })); + Assert.AreEqual("Table1", t1.Name); + + var ws2 = wb.AddWorksheet(); + var t2 = ws2.FirstCell().InsertTable(Enumerable.Range(1, 10).Select(i => new { Number = i })); + Assert.AreEqual("Table2", t2.Name); + } + } + + private void AssertTablesAreEqual(IXLTable table1, IXLTable table2) + { + Assert.AreEqual(table1.RangeAddress.ToString(XLReferenceStyle.A1, false), table2.RangeAddress.ToString(XLReferenceStyle.A1, false)); + Assert.AreEqual(table1.Fields.Count(), table2.Fields.Count()); + for (int j = 0; j < table1.Fields.Count(); j++) + { + var originalField = table1.Fields.ElementAt(j); + var copyField = table2.Fields.ElementAt(j); + Assert.AreEqual(originalField.Name, copyField.Name); + if (table1.ShowTotalsRow) + { + Assert.AreEqual(originalField.TotalsRowFormulaA1, copyField.TotalsRowFormulaA1); + Assert.AreEqual(originalField.TotalsRowFunction, copyField.TotalsRowFunction); + } + } + + Assert.AreEqual(table1.Name, table2.Name); + Assert.AreEqual(table1.ShowAutoFilter, table2.ShowAutoFilter); + Assert.AreEqual(table1.ShowColumnStripes, table2.ShowColumnStripes); + Assert.AreEqual(table1.ShowHeaderRow, table2.ShowHeaderRow); + Assert.AreEqual(table1.ShowRowStripes, table2.ShowRowStripes); + Assert.AreEqual(table1.ShowTotalsRow, table2.ShowTotalsRow); + Assert.AreEqual((table1.Style as XLStyle).Value, (table2.Style as XLStyle).Value); + Assert.AreEqual(table1.Theme, table2.Theme); + } + + //TODO: Delete table (not underlying range) + } +} diff --git a/ClosedXML_Tests/Excel/Worksheets/XLSheetViewTests.cs b/ClosedXML_Tests/Excel/Worksheets/XLSheetViewTests.cs new file mode 100644 index 0000000..ce594f4 --- /dev/null +++ b/ClosedXML_Tests/Excel/Worksheets/XLSheetViewTests.cs @@ -0,0 +1,73 @@ +// Keep this file CodeMaid organised and cleaned +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.Excel.Worksheets +{ + [TestFixture] + public class XLSheetViewTests + { + [Test] + public void CopyWorksheetSheetViews() + { + using var wb1 = new XLWorkbook(); + using var wb2 = new XLWorkbook(); + + var ws1 = wb1.AddWorksheet("WS1"); + ws1.SheetView.TopLeftCellAddress = ws1.Cell("AZ2000").Address; + + var ws2 = ws1.CopyTo(wb2, "WS2"); + + Assert.AreEqual(ws2, ws2.SheetView.Worksheet); + Assert.AreEqual("AZ2000", ws2.SheetView.TopLeftCellAddress.ToString()); + } + + [Test] + public void InvalidTopLeftCell() + { + using var wb = new XLWorkbook(); + var ws1 = wb.AddWorksheet(); + var ws2 = wb.AddWorksheet(); + + Assert.Throws(() => ws1.SheetView.TopLeftCellAddress = ws2.Cell("A1").Address); + } + + [Test] + public void SheetViews() + { + using var ms = new MemoryStream(); + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + ws.SheetView.TopLeftCellAddress = ws.Cell("AZ2000").Address; + wb.SaveAs(ms); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual("AZ2000", ws.SheetView.TopLeftCellAddress.ToString()); + + ws.SheetView.TopLeftCellAddress = ws.Cell("AZ2000") + .CellBelow() + .CellRight() + .Address; + + wb.Save(); + } + + ms.Seek(0, SeekOrigin.Begin); + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual("BA2001", ws.SheetView.TopLeftCellAddress.ToString()); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs b/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs new file mode 100644 index 0000000..76db567 --- /dev/null +++ b/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs @@ -0,0 +1,1184 @@ +using ClosedXML.Excel; +using ClosedXML.Excel.Drawings; +using NUnit.Framework; +using System; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Reflection; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class XLWorksheetTests + { + [Test] + public void ColumnCountTime() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + DateTime start = DateTime.Now; + ws.ColumnCount(); + DateTime end = DateTime.Now; + Assert.IsTrue((end - start).TotalMilliseconds < 500); + } + + [Test] + public void CopyConditionalFormatsCount() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.Range("A1:C3").AddConditionalFormat().WhenContains("1").Fill.SetBackgroundColor(XLColor.Blue); + ws.Range("A1:C3").Value = 1; + IXLWorksheet ws2 = ws.CopyTo("Sheet2"); + Assert.AreEqual(1, ws2.ConditionalFormats.Count()); + } + + [Test] + public void CopyColumnVisibility() + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet1"); + ws.Columns(10, 20).Hide(); + ws.CopyTo("Sheet2"); + Assert.IsTrue(wb.Worksheet("Sheet2").Column(10).IsHidden); + } + + [Test] + public void CopyRowVisibility() + { + var wb = new XLWorkbook(); + var ws = wb.AddWorksheet("Sheet1"); + ws.Rows(2, 5).Hide(); + ws.CopyTo("Sheet2"); + Assert.IsTrue(wb.Worksheet("Sheet2").Row(4).IsHidden); + } + + [Test] + public void DeletingSheets1() + { + var wb = new XLWorkbook(); + wb.Worksheets.Add("Sheet3"); + wb.Worksheets.Add("Sheet2"); + wb.Worksheets.Add("Sheet1", 1); + + wb.Worksheet("Sheet3").Delete(); + + Assert.AreEqual("Sheet1", wb.Worksheet(1).Name); + Assert.AreEqual("Sheet2", wb.Worksheet(2).Name); + Assert.AreEqual(2, wb.Worksheets.Count); + } + + [Test] + public void InsertingSheets1() + { + var wb = new XLWorkbook(); + wb.Worksheets.Add("Sheet1"); + wb.Worksheets.Add("Sheet2"); + wb.Worksheets.Add("Sheet3"); + + Assert.AreEqual("Sheet1", wb.Worksheet(1).Name); + Assert.AreEqual("Sheet2", wb.Worksheet(2).Name); + Assert.AreEqual("Sheet3", wb.Worksheet(3).Name); + } + + [Test] + public void InsertingSheets2() + { + var wb = new XLWorkbook(); + wb.Worksheets.Add("Sheet2"); + wb.Worksheets.Add("Sheet1", 1); + wb.Worksheets.Add("Sheet3"); + + Assert.AreEqual("Sheet1", wb.Worksheet(1).Name); + Assert.AreEqual("Sheet2", wb.Worksheet(2).Name); + Assert.AreEqual("Sheet3", wb.Worksheet(3).Name); + } + + [Test] + public void InsertingSheets3() + { + var wb = new XLWorkbook(); + wb.Worksheets.Add("Sheet3"); + wb.Worksheets.Add("Sheet2", 1); + wb.Worksheets.Add("Sheet1", 1); + + Assert.AreEqual("Sheet1", wb.Worksheet(1).Name); + Assert.AreEqual("Sheet2", wb.Worksheet(2).Name); + Assert.AreEqual("Sheet3", wb.Worksheet(3).Name); + } + + [Test] + public void InsertingSheets4() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add(); + + Assert.AreEqual("Sheet1", ws1.Name); + ws1.Name = "shEEt1"; + + var ws2 = wb.Worksheets.Add(); + Assert.AreEqual("Sheet2", ws2.Name); + + wb.Worksheets.Add("SHEET4"); + + Assert.AreEqual("Sheet5", wb.Worksheets.Add().Name); + Assert.AreEqual("Sheet6", wb.Worksheets.Add().Name); + + wb.Worksheets.Add(1); + + Assert.AreEqual("Sheet7", wb.Worksheet(1).Name); + } + + [Test] + public void AddingDuplicateSheetNameThrowsException() + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws; + ws = wb.AddWorksheet("Sheet1"); + + Assert.Throws(() => wb.AddWorksheet("Sheet1")); + + //Sheet names are case insensitive + Assert.Throws(() => wb.AddWorksheet("sheet1")); + } + } + + [Test] + public void MergedRanges() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Range("A1:B2").Merge(); + ws.Range("C1:D3").Merge(); + ws.Range("D2:E2").Merge(); + + Assert.AreEqual(2, ws.MergedRanges.Count); + Assert.AreEqual("A1:B2", ws.MergedRanges.First().RangeAddress.ToStringRelative()); + Assert.AreEqual("D2:E2", ws.MergedRanges.Last().RangeAddress.ToStringRelative()); + + Assert.AreEqual("A1:B2", ws.Cell("A2").MergedRange().RangeAddress.ToStringRelative()); + Assert.AreEqual("D2:E2", ws.Cell("D2").MergedRange().RangeAddress.ToStringRelative()); + + Assert.AreEqual(null, ws.Cell("Z10").MergedRange()); + } + + [Test] + public void RowCountTime() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + DateTime start = DateTime.Now; + ws.RowCount(); + DateTime end = DateTime.Now; + Assert.IsTrue((end - start).TotalMilliseconds < 500); + } + + [Test] + public void SheetsWithCommas() + { + using (var wb = new XLWorkbook()) + { + var sourceSheetName = "Sheet1, Sheet3"; + var ws = wb.Worksheets.Add(sourceSheetName); + ws.Cell("A1").Value = 1; + ws.Cell("A2").Value = 2; + ws.Cell("B2").Value = 3; + + ws = wb.Worksheets.Add("Formula"); + ws.FirstCell().FormulaA1 = string.Format("=SUM('{0}'!A1:A2,'{0}'!B1:B2)", sourceSheetName); + + var value = ws.FirstCell().Value; + Assert.AreEqual(6, value); + } + } + + [Test] + public void CanRenameWorksheet() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.AddWorksheet("Sheet1"); + var ws2 = wb.AddWorksheet("Sheet2"); + + ws1.Name = "New sheet name"; + Assert.AreEqual("New sheet name", ws1.Name); + + ws2.Name = "sheet2"; + Assert.AreEqual("sheet2", ws2.Name); + + Assert.Throws(() => ws1.Name = "SHEET2"); + } + } + + [Test] + public void TryGetWorksheet() + { + using (var wb = new XLWorkbook()) + { + wb.AddWorksheet("Sheet1"); + wb.AddWorksheet("Sheet2"); + + IXLWorksheet ws; + Assert.IsTrue(wb.Worksheets.TryGetWorksheet("Sheet1", out ws)); + Assert.IsTrue(wb.Worksheets.TryGetWorksheet("sheet1", out ws)); + Assert.IsTrue(wb.Worksheets.TryGetWorksheet("sHEeT1", out ws)); + Assert.IsFalse(wb.Worksheets.TryGetWorksheet("Sheeeet2", out ws)); + + Assert.IsTrue(wb.TryGetWorksheet("Sheet1", out ws)); + Assert.IsTrue(wb.TryGetWorksheet("sheet1", out ws)); + Assert.IsTrue(wb.TryGetWorksheet("sHEeT1", out ws)); + Assert.IsFalse(wb.TryGetWorksheet("Sheeeet2", out ws)); + } + } + + [Test] + public void HideWorksheet() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + wb.Worksheets.Add("VisibleSheet"); + wb.Worksheets.Add("HiddenSheet").Hide(); + wb.SaveAs(ms); + } + + // unhide the hidden sheet + using (var wb = new XLWorkbook(ms)) + { + Assert.AreEqual(XLWorksheetVisibility.Visible, wb.Worksheet("VisibleSheet").Visibility); + Assert.AreEqual(XLWorksheetVisibility.Hidden, wb.Worksheet("HiddenSheet").Visibility); + + var ws = wb.Worksheet("HiddenSheet"); + ws.Unhide().Name = "NoAlsoVisible"; + + Assert.AreEqual(XLWorksheetVisibility.Visible, ws.Visibility); + + wb.Save(); + } + + using (var wb = new XLWorkbook(ms)) + { + Assert.AreEqual(XLWorksheetVisibility.Visible, wb.Worksheet("VisibleSheet").Visibility); + Assert.AreEqual(XLWorksheetVisibility.Visible, wb.Worksheet("NoAlsoVisible").Visibility); + } + } + } + + [Test] + public void CanCopySheetsWithAllAnchorTypes() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageAnchors.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + ws.CopyTo("Copy1"); + + var ws2 = wb.Worksheets.Skip(1).First(); + ws2.CopyTo("Copy2"); + + var ws3 = wb.Worksheets.Skip(2).First(); + ws3.CopyTo("Copy3"); + + var ws4 = wb.Worksheets.Skip(3).First(); + ws3.CopyTo("Copy4"); + } + } + + [Test] + public void CannotCopyDeletedWorksheet() + { + using (var wb = new XLWorkbook()) + { + wb.AddWorksheet("Sheet1"); + var ws = wb.AddWorksheet("Sheet2"); + + ws.Delete(); + Assert.Throws(() => ws.CopyTo("Copy of Sheet2")); + } + } + + [Test] + public void WorksheetNameCannotStartWithApostrophe() + { + var title = "'StartsWithApostrophe"; + TestDelegate addWorksheet = () => + { + using (var wb = new XLWorkbook()) + { + wb.Worksheets.Add(title); + } + }; + + Assert.Throws(typeof(ArgumentException), addWorksheet); + } + + [Test] + public void WorksheetNameCannotEndWithApostrophe() + { + var title = "EndsWithApostrophe'"; + TestDelegate addWorksheet = () => + { + using (var wb = new XLWorkbook()) + { + wb.Worksheets.Add(title); + } + }; + + Assert.Throws(typeof(ArgumentException), addWorksheet); + } + + [Test] + public void WorksheetNameCanContainApostrophe() + { + var title = "With'Apostrophe"; + var savedTitle = ""; + TestDelegate saveAndOpenWorkbook = () => + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + wb.Worksheets.Add(title); + wb.Worksheets.First().Cell(1, 1).FormulaA1 = $"{title}!A2"; + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + savedTitle = wb.Worksheets.First().Name; + } + } + }; + + Assert.DoesNotThrow(saveAndOpenWorkbook); + Assert.AreEqual(title, savedTitle); + } + + [Test] + public void CopyWorksheetPreservesContents() + { + using (var wb1 = new XLWorkbook()) + using (var wb2 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + + ws1.Cell("A1").Value = "A1 value"; + ws1.Cell("A2").Value = 100; + ws1.Cell("D4").Value = new DateTime(2018, 5, 1); + + var ws2 = ws1.CopyTo(wb2, "Copy"); + + Assert.AreEqual("A1 value", ws2.Cell("A1").Value); + Assert.AreEqual(100, ws2.Cell("A2").Value); + Assert.AreEqual(new DateTime(2018, 5, 1), ws2.Cell("D4").Value); + } + } + + [Test] + public void CopyWorksheetPreservesFormulae() + { + using (var wb1 = new XLWorkbook()) + using (var wb2 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + + ws1.Cell("A1").FormulaA1 = "10*10"; + ws1.Cell("A2").FormulaA1 = "A1 * 2"; + + var ws2 = ws1.CopyTo(wb2, "Copy"); + + Assert.AreEqual("10*10", ws2.Cell("A1").FormulaA1); + Assert.AreEqual("A1 * 2", ws2.Cell("A2").FormulaA1); + } + } + + [Test] + public void CopyWorksheetPreservesRowHeights() + { + using (var wb1 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + using (var wb2 = new XLWorkbook()) + { + ws1.RowHeight = 55; + ws1.Row(2).Height = 0; + ws1.Row(3).Height = 20; + + var ws2 = ws1.CopyTo(wb2, "Copy"); + + Assert.AreEqual(ws1.RowHeight, ws2.RowHeight); + for (int i = 1; i <= 3; i++) + { + Assert.AreEqual(ws1.Row(i).Height, ws2.Row(i).Height); + } + } + } + } + + [Test] + public void CopyWorksheetPreservesColumnWidths() + { + using (var wb1 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + using (var wb2 = new XLWorkbook()) + { + ws1.ColumnWidth = 160; + ws1.Column(2).Width = 0; + ws1.Column(3).Width = 240; + + var ws2 = ws1.CopyTo(wb2, "Copy"); + + Assert.AreEqual(ws1.ColumnWidth, ws2.ColumnWidth); + for (int i = 1; i <= 3; i++) + { + Assert.AreEqual(ws1.Column(i).Width, ws2.Column(i).Width); + } + } + } + } + + [Test] + public void CopyWorksheetPreservesMergedCells() + { + using (var wb1 = new XLWorkbook()) + using (var wb2 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + + ws1.Range("A:A").Merge(); + ws1.Range("B1:C2").Merge(); + + var ws2 = ws1.CopyTo(wb2, "Copy"); + + Assert.AreEqual(ws1.MergedRanges.Count, ws2.MergedRanges.Count); + for (int i = 0; i < ws1.MergedRanges.Count; i++) + { + Assert.AreEqual(ws1.MergedRanges.ElementAt(i).RangeAddress.ToString(), + ws2.MergedRanges.ElementAt(i).RangeAddress.ToString()); + } + } + } + + [Test] + public void CopyWorksheetAcrossWorkbooksPreservesNamedRanges() + { + using (var wb1 = new XLWorkbook()) + using (var wb2 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + + ws1.Range("A1:A2").AddToNamed("GLOBAL", XLScope.Workbook); + ws1.Ranges("B1:B2,D1:D2").AddToNamed("LOCAL", XLScope.Worksheet); + + var ws2 = ws1.CopyTo(wb2, "Copy"); + + Assert.AreEqual(ws1.NamedRanges.Count(), ws2.NamedRanges.Count()); + for (int i = 0; i < ws1.NamedRanges.Count(); i++) + { + var nr1 = ws1.NamedRanges.ElementAt(i); + var nr2 = ws2.NamedRanges.ElementAt(i); + Assert.AreEqual(nr1.Ranges.ToString(), nr2.Ranges.ToString()); + Assert.AreEqual(nr1.Scope, nr2.Scope); + Assert.AreEqual(nr1.Name, nr2.Name); + Assert.AreEqual(nr1.Visible, nr2.Visible); + Assert.AreEqual(nr1.Comment, nr2.Comment); + } + } + } + + [Test] + public void CopyWorksheeInsideWorkbookMakesNamedRangesLocal() + { + using (var wb1 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + + ws1.Range("A1:A2").AddToNamed("GLOBAL", XLScope.Workbook); + ws1.Ranges("B1:B2,D1:D2").AddToNamed("LOCAL", XLScope.Worksheet); + + var ws2 = ws1.CopyTo("Copy"); + + Assert.AreEqual(ws1.NamedRanges.Count(), ws2.NamedRanges.Count()); + for (int i = 0; i < ws1.NamedRanges.Count(); i++) + { + var nr1 = ws1.NamedRanges.ElementAt(i); + var nr2 = ws2.NamedRanges.ElementAt(i); + + Assert.AreEqual(XLScope.Worksheet, nr2.Scope); + + Assert.AreEqual(nr1.Ranges.ToString(), nr2.Ranges.ToString()); + Assert.AreEqual(nr1.Name, nr2.Name); + Assert.AreEqual(nr1.Visible, nr2.Visible); + Assert.AreEqual(nr1.Comment, nr2.Comment); + } + } + } + + [Test] + public void CopyWorksheetPreservesStyles() + { + using (var ms = new MemoryStream()) + using (var wb1 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + + ws1.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + ws1.Range("A1:B2").Style.Font.FontSize = 25; + ws1.Cell("C3").Style.Fill.BackgroundColor = XLColor.Red; + ws1.Cell("C4").Style.Fill.BackgroundColor = XLColor.AliceBlue; + ws1.Cell("C4").Value = "Non empty"; + + using (var wb2 = new XLWorkbook()) + { + var ws2 = ws1.CopyTo(wb2, "Copy"); + AssertStylesAreEqual(ws1, ws2); + wb2.SaveAs(ms); + } + + using (var wb2 = new XLWorkbook(ms)) + { + var ws2 = wb2.Worksheet("Copy"); + AssertStylesAreEqual(ws1, ws2); + } + } + + void AssertStylesAreEqual(IXLWorksheet ws1, IXLWorksheet ws2) + { + Assert.AreEqual((ws1.Style as XLStyle).Value, (ws2.Style as XLStyle).Value, + "Worksheet styles differ"); + var cellsUsed = ws1.Range(ws1.FirstCell(), ws1.LastCellUsed()).Cells(); + foreach (var cell in cellsUsed) + { + var style1 = (cell.Style as XLStyle).Value; + var style2 = (ws2.Cell(cell.Address.ToString()).Style as XLStyle).Value; + Assert.AreEqual(style1, style2, $"Cell {cell.Address} styles differ"); + } + } + } + + [Test] + public void CopyWorksheetPreservesConditionalFormats() + { + using (var wb1 = new XLWorkbook()) + using (var wb2 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + + ws1.Range("A:A").AddConditionalFormat() + .WhenContains("0").Fill.SetBackgroundColor(XLColor.Red); + var cf = ws1.Range("B1:C2").AddConditionalFormat(); + cf.Ranges.Add(ws1.Range("D4:D5")); + cf.WhenEqualOrGreaterThan(100).Font.SetBold(); + + var ws2 = ws1.CopyTo(wb2, "Copy"); + + Assert.AreEqual(ws1.ConditionalFormats.Count(), ws2.ConditionalFormats.Count()); + for (int i = 0; i < ws1.ConditionalFormats.Count(); i++) + { + var original = ws1.ConditionalFormats.ElementAt(i); + var copy = ws2.ConditionalFormats.ElementAt(i); + Assert.AreEqual(original.Ranges.Count, copy.Ranges.Count); + for (int j = 0; j < original.Ranges.Count; j++) + { + Assert.AreEqual(original.Ranges.ElementAt(j).RangeAddress.ToString(XLReferenceStyle.A1, false), + copy.Ranges.ElementAt(j).RangeAddress.ToString(XLReferenceStyle.A1, false)); + } + + Assert.AreEqual((original.Style as XLStyle).Value, (copy.Style as XLStyle).Value); + Assert.AreEqual(original.Values.Single().Value.Value, copy.Values.Single().Value.Value); + } + } + } + + [Test] + public void CopyWorksheetPreservesTables() + { + using (var wb1 = new XLWorkbook()) + using (var wb2 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + + ws1.Cell("A2").Value = "Name"; + ws1.Cell("B2").Value = "Count"; + ws1.Cell("A3").Value = "John Smith"; + ws1.Cell("B3").Value = 50; + ws1.Cell("A4").Value = "Ivan Ivanov"; + ws1.Cell("B4").Value = 40; + var table1 = ws1.Range("A2:B4").CreateTable("Test table 1"); + table1 + .SetShowAutoFilter(true) + .SetShowTotalsRow(true) + .SetEmphasizeFirstColumn(true) + .SetShowColumnStripes(true) + .SetShowRowStripes(true); + table1.Theme = XLTableTheme.TableStyleDark8; + table1.Field(1).TotalsRowFunction = XLTotalsRowFunction.Sum; + + var ws2 = ws1.CopyTo(wb2, "Copy"); + + Assert.AreEqual(ws1.Tables.Count(), ws2.Tables.Count()); + for (int i = 0; i < ws1.Tables.Count(); i++) + { + var original = ws1.Tables.ElementAt(i); + var copy = ws2.Tables.ElementAt(i); + Assert.AreEqual(original.RangeAddress.ToString(XLReferenceStyle.A1, false), copy.RangeAddress.ToString(XLReferenceStyle.A1, false)); + Assert.AreEqual(original.Fields.Count(), copy.Fields.Count()); + for (int j = 0; j < original.Fields.Count(); j++) + { + var originalField = original.Fields.ElementAt(j); + var copyField = copy.Fields.ElementAt(j); + Assert.AreEqual(originalField.Name, copyField.Name); + Assert.AreEqual(originalField.TotalsRowFormulaA1, copyField.TotalsRowFormulaA1); + Assert.AreEqual(originalField.TotalsRowFunction, copyField.TotalsRowFunction); + } + + Assert.AreEqual(original.Name, copy.Name); + Assert.AreEqual(original.ShowAutoFilter, copy.ShowAutoFilter); + Assert.AreEqual(original.ShowColumnStripes, copy.ShowColumnStripes); + Assert.AreEqual(original.ShowHeaderRow, copy.ShowHeaderRow); + Assert.AreEqual(original.ShowRowStripes, copy.ShowRowStripes); + Assert.AreEqual(original.ShowTotalsRow, copy.ShowTotalsRow); + Assert.AreEqual((original.Style as XLStyle).Value, (copy.Style as XLStyle).Value); + Assert.AreEqual(original.Theme, copy.Theme); + } + } + } + + [Test] + public void CopyWorksheetPreservesDataValidation() + { + using (var wb1 = new XLWorkbook()) + using (var wb2 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + + var dv1 = ws1.Range("A:A").SetDataValidation(); + dv1.WholeNumber.EqualTo(2); + dv1.ErrorStyle = XLErrorStyle.Warning; + dv1.ErrorTitle = "Number out of range"; + dv1.ErrorMessage = "This cell only allows the number 2."; + + var dv2 = ws1.Ranges("B2:C3,D4:E5").SetDataValidation(); + dv2.Decimal.GreaterThan(5); + dv2.ErrorStyle = XLErrorStyle.Stop; + dv2.ErrorTitle = "Decimal number out of range"; + dv2.ErrorMessage = "This cell only allows decimals greater than 5."; + + var dv3 = ws1.Cell("D1").SetDataValidation(); + dv3.TextLength.EqualOrLessThan(10); + dv3.ErrorStyle = XLErrorStyle.Information; + dv3.ErrorTitle = "Text length out of range"; + dv3.ErrorMessage = "You entered more than 10 characters."; + + var ws2 = ws1.CopyTo(wb2, "Copy"); + + Assert.AreEqual(ws1.DataValidations.Count(), ws2.DataValidations.Count()); + for (int i = 0; i < ws1.DataValidations.Count(); i++) + { + var original = ws1.DataValidations.ElementAt(i); + var copy = ws2.DataValidations.ElementAt(i); + + var originalRanges = string.Join(",", original.Ranges.Select(r => r.RangeAddress.ToString())); + var copyRanges = string.Join(",", original.Ranges.Select(r => r.RangeAddress.ToString())); + + Assert.AreEqual(originalRanges, copyRanges); + Assert.AreEqual(original.AllowedValues, copy.AllowedValues); + Assert.AreEqual(original.Operator, copy.Operator); + Assert.AreEqual(original.ErrorStyle, copy.ErrorStyle); + Assert.AreEqual(original.ErrorTitle, copy.ErrorTitle); + Assert.AreEqual(original.ErrorMessage, copy.ErrorMessage); + } + } + } + + [Test] + public void CopyWorksheetPreservesPictures() + { + using (var ms = new MemoryStream()) + using (var resourceStream = Assembly.GetAssembly(typeof(ClosedXML_Examples.BasicTable)) + .GetManifestResourceStream("ClosedXML_Examples.Resources.SampleImage.jpg")) + using (var bitmap = Bitmap.FromStream(resourceStream) as Bitmap) + using (var wb1 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + + var picture = ws1.AddPicture(bitmap, "MyPicture") + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(50, 50) + .WithSize(200, 200); + + using (var wb2 = new XLWorkbook()) + { + var ws2 = ws1.CopyTo(wb2, "Copy"); + AssertPicturesAreEqual(ws1, ws2); + wb2.SaveAs(ms); + } + + using (var wb2 = new XLWorkbook(ms)) + { + var ws2 = wb2.Worksheet("Copy"); + AssertPicturesAreEqual(ws1, ws2); + } + } + + void AssertPicturesAreEqual(IXLWorksheet ws1, IXLWorksheet ws2) + { + Assert.AreEqual(ws1.Pictures.Count(), ws2.Pictures.Count()); + + for (int i = 0; i < ws1.Pictures.Count(); i++) + { + var original = ws1.Pictures.ElementAt(i); + var copy = ws2.Pictures.ElementAt(i); + Assert.AreEqual(ws2, copy.Worksheet); + + Assert.AreEqual(original.Format, copy.Format); + Assert.AreEqual(original.Height, copy.Height); + Assert.AreEqual(original.Id, copy.Id); + Assert.AreEqual(original.Left, copy.Left); + Assert.AreEqual(original.Name, copy.Name); + Assert.AreEqual(original.Placement, copy.Placement); + Assert.AreEqual(original.Top, copy.Top); + Assert.AreEqual(original.TopLeftCell.Address.ToString(), copy.TopLeftCell.Address.ToString()); + Assert.AreEqual(original.Width, copy.Width); + Assert.AreEqual(original.ImageStream.ToArray(), copy.ImageStream.ToArray(), "Image streams differ"); + } + } + } + + [Test] + public void CopyWorksheetPreservesSelectedRanges() + { + using (var wb1 = new XLWorkbook()) + using (var wb2 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + + ws1.SelectedRanges.RemoveAll(); + ws1.SelectedRanges.Add(ws1.Range("E12:H20")); + ws1.SelectedRanges.Add(ws1.Range("B:B")); + ws1.SelectedRanges.Add(ws1.Range("3:6")); + + var ws2 = ws1.CopyTo(wb2, "Copy"); + + Assert.AreEqual(ws1.SelectedRanges.Count, ws2.SelectedRanges.Count); + for (int i = 0; i < ws1.SelectedRanges.Count; i++) + { + Assert.AreEqual(ws1.SelectedRanges.ElementAt(i).RangeAddress.ToString(), + ws2.SelectedRanges.ElementAt(i).RangeAddress.ToString()); + } + } + } + + [Test] + public void CopyWorksheetPreservesPageSetup() + { + using (var wb1 = new XLWorkbook()) + using (var wb2 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + + ws1.PageSetup.AddHorizontalPageBreak(15); + ws1.PageSetup.AddVerticalPageBreak(5); + ws1.PageSetup + .SetBlackAndWhite() + .SetCenterHorizontally() + .SetCenterVertically() + .SetFirstPageNumber(200) + .SetPageOrientation(XLPageOrientation.Landscape) + .SetPaperSize(XLPaperSize.A5Paper) + .SetScale(89) + .SetShowGridlines() + .SetHorizontalDpi(200) + .SetVerticalDpi(300) + .SetPagesTall(5) + .SetPagesWide(2) + .SetColumnsToRepeatAtLeft(1, 3); + ws1.PageSetup.PrintAreas.Clear(); + ws1.PageSetup.PrintAreas.Add("A1:Z200"); + ws1.PageSetup.Margins.SetBottom(5).SetTop(6).SetLeft(7).SetRight(8).SetFooter(9).SetHeader(10); + ws1.PageSetup.Header.Left.AddText(XLHFPredefinedText.FullPath, XLHFOccurrence.AllPages); + ws1.PageSetup.Footer.Right.AddText(XLHFPredefinedText.PageNumber, XLHFOccurrence.OddPages); + + var ws2 = ws1.CopyTo(wb2, "Copy"); + + Assert.AreEqual(ws1.PageSetup.FirstRowToRepeatAtTop, ws2.PageSetup.FirstRowToRepeatAtTop); + Assert.AreEqual(ws1.PageSetup.LastRowToRepeatAtTop, ws2.PageSetup.LastRowToRepeatAtTop); + Assert.AreEqual(ws1.PageSetup.FirstColumnToRepeatAtLeft, ws2.PageSetup.FirstColumnToRepeatAtLeft); + Assert.AreEqual(ws1.PageSetup.LastColumnToRepeatAtLeft, ws2.PageSetup.LastColumnToRepeatAtLeft); + Assert.AreEqual(ws1.PageSetup.PageOrientation, ws2.PageSetup.PageOrientation); + Assert.AreEqual(ws1.PageSetup.PagesWide, ws2.PageSetup.PagesWide); + Assert.AreEqual(ws1.PageSetup.PagesTall, ws2.PageSetup.PagesTall); + Assert.AreEqual(ws1.PageSetup.Scale, ws2.PageSetup.Scale); + Assert.AreEqual(ws1.PageSetup.HorizontalDpi, ws2.PageSetup.HorizontalDpi); + Assert.AreEqual(ws1.PageSetup.VerticalDpi, ws2.PageSetup.VerticalDpi); + Assert.AreEqual(ws1.PageSetup.FirstPageNumber, ws2.PageSetup.FirstPageNumber); + Assert.AreEqual(ws1.PageSetup.CenterHorizontally, ws2.PageSetup.CenterHorizontally); + Assert.AreEqual(ws1.PageSetup.CenterVertically, ws2.PageSetup.CenterVertically); + Assert.AreEqual(ws1.PageSetup.PaperSize, ws2.PageSetup.PaperSize); + Assert.AreEqual(ws1.PageSetup.Margins.Bottom, ws2.PageSetup.Margins.Bottom); + Assert.AreEqual(ws1.PageSetup.Margins.Top, ws2.PageSetup.Margins.Top); + Assert.AreEqual(ws1.PageSetup.Margins.Left, ws2.PageSetup.Margins.Left); + Assert.AreEqual(ws1.PageSetup.Margins.Right, ws2.PageSetup.Margins.Right); + Assert.AreEqual(ws1.PageSetup.Margins.Footer, ws2.PageSetup.Margins.Footer); + Assert.AreEqual(ws1.PageSetup.Margins.Header, ws2.PageSetup.Margins.Header); + Assert.AreEqual(ws1.PageSetup.ScaleHFWithDocument, ws2.PageSetup.ScaleHFWithDocument); + Assert.AreEqual(ws1.PageSetup.AlignHFWithMargins, ws2.PageSetup.AlignHFWithMargins); + Assert.AreEqual(ws1.PageSetup.ShowGridlines, ws2.PageSetup.ShowGridlines); + Assert.AreEqual(ws1.PageSetup.ShowRowAndColumnHeadings, ws2.PageSetup.ShowRowAndColumnHeadings); + Assert.AreEqual(ws1.PageSetup.BlackAndWhite, ws2.PageSetup.BlackAndWhite); + Assert.AreEqual(ws1.PageSetup.DraftQuality, ws2.PageSetup.DraftQuality); + Assert.AreEqual(ws1.PageSetup.PageOrder, ws2.PageSetup.PageOrder); + Assert.AreEqual(ws1.PageSetup.ShowComments, ws2.PageSetup.ShowComments); + Assert.AreEqual(ws1.PageSetup.PrintErrorValue, ws2.PageSetup.PrintErrorValue); + + Assert.AreEqual(ws1.PageSetup.PrintAreas.Count(), ws2.PageSetup.PrintAreas.Count()); + + Assert.AreEqual(ws1.PageSetup.Header.Left.GetText(XLHFOccurrence.AllPages), ws2.PageSetup.Header.Left.GetText(XLHFOccurrence.AllPages)); + Assert.AreEqual(ws1.PageSetup.Footer.Right.GetText(XLHFOccurrence.OddPages), ws2.PageSetup.Footer.Right.GetText(XLHFOccurrence.OddPages)); + } + } + + [Test] + public void CopyWorksheetPreservesSparklineGroups() + { + using (var wb1 = new XLWorkbook()) + using (var wb2 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + var original = ws1.SparklineGroups.Add("A1:A10", "D1:Z10") + .SetDateRange(ws1.Range("D11:Z11")) + .SetDisplayEmptyCellsAs(XLDisplayBlanksAsValues.Zero) + .SetDisplayHidden(true) + .SetLineWeight(1.5) + .SetShowMarkers(XLSparklineMarkers.All) + .SetStyle(XLSparklineTheme.Colorful3) + .SetType(XLSparklineType.Column); + + original.HorizontalAxis + .SetColor(XLColor.Blue) + .SetRightToLeft(true) + .SetVisible(true); + + original.VerticalAxis + .SetManualMin(-100.0) + .SetManualMax(100.0); + + var ws2 = ws1.CopyTo(wb2, "Copy"); + + Assert.AreEqual(1, ws2.SparklineGroups.Count()); + var copy = ws2.SparklineGroups.Single(); + + Assert.AreEqual(original.Count(), copy.Count()); + for (int i = 0; i < original.Count(); i++) + { + Assert.AreSame(ws2, copy.ElementAt(i).Location.Worksheet); + Assert.AreSame(ws2, copy.ElementAt(i).SourceData.Worksheet); + Assert.AreEqual(original.ElementAt(i).Location.Address.ToString(), copy.ElementAt(i).Location.Address.ToString()); + Assert.AreEqual(original.ElementAt(i).SourceData.RangeAddress.ToString(), copy.ElementAt(i).SourceData.RangeAddress.ToString()); + } + + Assert.AreEqual(original.DateRange.RangeAddress.ToString(), copy.DateRange.RangeAddress.ToString()); + Assert.AreSame(ws2, copy.DateRange.Worksheet); + + Assert.AreEqual(original.DisplayEmptyCellsAs, copy.DisplayEmptyCellsAs); + Assert.AreEqual(original.DisplayHidden, copy.DisplayHidden); + Assert.AreEqual(original.LineWeight, copy.LineWeight, XLHelper.Epsilon); + Assert.AreEqual(original.ShowMarkers, copy.ShowMarkers); + Assert.AreEqual(original.Style, copy.Style); + Assert.AreNotSame(original.Style, copy.Style); + Assert.AreEqual(original.Type, copy.Type); + + Assert.AreEqual(original.HorizontalAxis.Color, copy.HorizontalAxis.Color); + Assert.AreEqual(original.HorizontalAxis.DateAxis, copy.HorizontalAxis.DateAxis); + Assert.AreEqual(original.HorizontalAxis.IsVisible, copy.HorizontalAxis.IsVisible); + Assert.AreEqual(original.HorizontalAxis.RightToLeft, copy.HorizontalAxis.RightToLeft); + + Assert.AreEqual(original.VerticalAxis.ManualMax, copy.VerticalAxis.ManualMax); + Assert.AreEqual(original.VerticalAxis.ManualMin, copy.VerticalAxis.ManualMin); + Assert.AreEqual(original.VerticalAxis.MaxAxisType, copy.VerticalAxis.MaxAxisType); + Assert.AreEqual(original.VerticalAxis.MinAxisType, copy.VerticalAxis.MinAxisType); + } + } + + [Test, Ignore("Muted until #836 is fixed")] + public void CopyWorksheetChangesAbsoluteReferencesInFormulae() + { + using (var wb1 = new XLWorkbook()) + using (var wb2 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + + ws1.Cell("A1").FormulaA1 = "10*10"; + ws1.Cell("A2").FormulaA1 = "Original!A1 * 3"; + + var ws2 = ws1.CopyTo(wb2, "Copy"); + + Assert.AreEqual("Copy!A1 * 3", ws2.Cell("A2").FormulaA1); + } + } + + [Test, Ignore("Muted until #836 is fixed")] + public void RenameWorksheetChangesAbsoluteReferencesInFormulae() + { + using (var wb1 = new XLWorkbook()) + { + var ws1 = wb1.Worksheets.Add("Original"); + + ws1.Cell("A1").FormulaA1 = "10*10"; + ws1.Cell("A2").FormulaA1 = "Original!A1 * 3"; + + ws1.Name = "Renamed"; + + Assert.AreEqual("Renamed!A1 * 3", ws1.Cell("A2").FormulaA1); + } + } + + [Test] + public void RangesFromDeletedWorksheetContainREF() + { + using (var wb1 = new XLWorkbook()) + { + wb1.Worksheets.Add("Sheet1"); + var ws2 = wb1.Worksheets.Add("Sheet2"); + var range = ws2.Range("A1:B2"); + + ws2.Delete(); + + Assert.AreEqual("#REF!A1:B2", range.RangeAddress.ToString()); + } + } + + [Test] + public void InvalidRowAndColumnIndices() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + Assert.Throws(() => ws.Row(-1)); + Assert.Throws(() => ws.Row(XLHelper.MaxRowNumber + 1)); + + Assert.Throws(() => ws.Column(-1)); + Assert.Throws(() => ws.Column(XLHelper.MaxColumnNumber + 1)); + } + } + + [Test] + public void InvalidSelectedRangeExcluded() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var range1 = ws.Range("B2:C2"); + var range2 = ws.Range("B4:C4"); + ws.SelectedRanges.Clear(); + + ws.SelectedRanges.Add(range1); + ws.SelectedRanges.Add(range2); + + ws.Row(4).Delete(); + + Assert.IsFalse(range2.RangeAddress.IsValid); + Assert.AreEqual(range1, ws.SelectedRanges.Single()); + } + } + + [Test] + public void InsertColumnsDoesNotIncreaseCellsCount() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var cell1 = ws.Cell("A1"); + var cell2 = ws.Cell("AAA50"); + var originalCount = (ws as XLWorksheet).Internals.CellsCollection.Count; + + ws.Column(1).InsertColumnsBefore(1); + + Assert.AreEqual(originalCount, (ws as XLWorksheet).Internals.CellsCollection.Count); + } + } + + [Test] + public void InsertRowsDoesNotIncreaseCellsCount() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var cell1 = ws.Cell("A1"); + var cell2 = ws.Cell("AAA500"); + var originalCount = (ws as XLWorksheet).Internals.CellsCollection.Count; + + ws.Row(1).InsertRowsAbove(1); + + Assert.AreEqual(originalCount, (ws as XLWorksheet).Internals.CellsCollection.Count); + } + } + + [Test] + public void InsertCellsBeforeDoesNotIncreaseCellsCount() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var cell1 = ws.Cell("A1"); + var cell2 = ws.Cell("AAA50"); + var originalCount = (ws as XLWorksheet).Internals.CellsCollection.Count; + + cell1.InsertCellsBefore(1); + + Assert.AreEqual(originalCount, (ws as XLWorksheet).Internals.CellsCollection.Count); + } + } + + [Test] + public void InsertCellsAboveDoesNotIncreaseCellsCount() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var cell1 = ws.Cell("A1"); + var cell2 = ws.Cell("AAA500"); + var originalCount = (ws as XLWorksheet).Internals.CellsCollection.Count; + + cell1.InsertCellsAbove(1); + + Assert.AreEqual(originalCount, (ws as XLWorksheet).Internals.CellsCollection.Count); + } + } + + [Test] + public void CellsShiftedTooFarRightArePurged() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var cell1 = ws.Cell("A1"); + var cell2 = ws.Cell(1, XLHelper.MaxColumnNumber); + var cell3 = ws.Cell(2, XLHelper.MaxColumnNumber); + + cell1.InsertCellsBefore(1); + Assert.AreEqual(2, (ws as XLWorksheet).Internals.CellsCollection.Count); + ws.Column(1).InsertColumnsBefore(1); + Assert.AreEqual(1, (ws as XLWorksheet).Internals.CellsCollection.Count); + } + } + + [Test] + public void CellsShiftedTooFarDownArePurged() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var cell1 = ws.Cell("A1"); + var cell2 = ws.Cell(XLHelper.MaxRowNumber, 1); + var cell3 = ws.Cell(XLHelper.MaxRowNumber, 2); + + cell1.InsertCellsAbove(1); + Assert.AreEqual(2, (ws as XLWorksheet).Internals.CellsCollection.Count); + ws.Row(1).InsertRowsAbove(1); + Assert.AreEqual(1, (ws as XLWorksheet).Internals.CellsCollection.Count); + } + } + + [Test] + public void MaxColumnUsedUpdatedWhenColumnDeleted() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var cell1 = ws.Cell("C1"); + var cell2 = ws.Cell(1, XLHelper.MaxColumnNumber); + + ws.Column(XLHelper.MaxColumnNumber).Delete(); + + Assert.AreEqual(3, (ws as XLWorksheet).Internals.CellsCollection.MaxColumnUsed); + } + } + + [Test] + public void MaxRowUsedUpdatedWhenRowDeleted() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet(); + var cell1 = ws.Cell("A3"); + var cell2 = ws.Cell(XLHelper.MaxRowNumber, 1); + + ws.Row(XLHelper.MaxRowNumber).Delete(); + + Assert.AreEqual(3, (ws as XLWorksheet).Internals.CellsCollection.MaxRowUsed); + } + } + + [Test] + public void ChangeColumnStyleFirst() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("ColumnFirst"); + + ws.Column(2).Style.Font.SetBold(true); + ws.Row(2).Style.Font.SetItalic(true); + + Assert.IsTrue(ws.Cell("B2").Style.Font.Bold); + Assert.IsTrue(ws.Cell("B2").Style.Font.Italic); + } + } + + [Test] + public void ChangeRowStyleFirst() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("RowFirst"); + + ws.Row(2).Style.Font.SetItalic(true); + ws.Column(2).Style.Font.SetBold(true); + + Assert.IsTrue(ws.Cell("B2").Style.Font.Bold); + Assert.IsTrue(ws.Cell("B2").Style.Font.Italic); + } + } + + [Test] + public void SelectedTabIsActive_WhenInsertBefore() + { + using (var ms = new MemoryStream()) + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.AddWorksheet(); + ws1.TabSelected = true; + var ws2 = wb.Worksheets.Add(1); + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var ws1 = wb.Worksheets.First(); + var ws2 = wb.Worksheets.Last(); + + Assert.IsFalse(ws1.TabActive); + Assert.IsFalse(ws1.TabSelected); + Assert.IsTrue(ws2.TabActive); + Assert.IsTrue(ws2.TabSelected); + } + } + } + + [TestCase("noactive_noselected.xlsx")] + [TestCase("noactive_twoselected.xlsx")] + public void FirstSheetIsActive_WhenNotSpecified(string fileName) + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Other\NoActiveSheet\"+fileName))) + using (var wb = new XLWorkbook(stream)) + { + Assert.IsTrue(wb.Worksheets.First().TabActive); + Assert.AreEqual(XLWorksheetVisibility.Visible, wb.Worksheets.First().Visibility); + } + } + } +} diff --git a/ClosedXML_Tests/ExcelDocsComparerTests.cs b/ClosedXML_Tests/ExcelDocsComparerTests.cs new file mode 100644 index 0000000..dd32014 --- /dev/null +++ b/ClosedXML_Tests/ExcelDocsComparerTests.cs @@ -0,0 +1,59 @@ +using ClosedXML_Examples; +using NUnit.Framework; +using System.IO; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class ExcelDocsComparerTests + { + [Test] + public void CheckEqual() + { + string left = ExampleHelper.GetTempFilePath("left.xlsx"); + string right = ExampleHelper.GetTempFilePath("right.xlsx"); + try + { + new BasicTable().Create(left); + new BasicTable().Create(right); + Assert.IsTrue(ExcelDocsComparer.Compare(left, right, out string message)); + } + finally + { + if (File.Exists(left)) + { + File.Delete(left); + } + if (File.Exists(right)) + { + File.Delete(right); + } + } + } + + [Test] + public void CheckNonEqual() + { + string left = ExampleHelper.GetTempFilePath("left.xlsx"); + string right = ExampleHelper.GetTempFilePath("right.xlsx"); + try + { + new BasicTable().Create(left); + new HelloWorld().Create(right); + + Assert.IsFalse(ExcelDocsComparer.Compare(left, right, out string message)); + } + finally + { + if (File.Exists(left)) + { + File.Delete(left); + } + if (File.Exists(right)) + { + File.Delete(right); + } + } + } + } +} diff --git a/ClosedXML_Tests/OleDb/OleDbTests.cs b/ClosedXML_Tests/OleDb/OleDbTests.cs new file mode 100644 index 0000000..c20184f --- /dev/null +++ b/ClosedXML_Tests/OleDb/OleDbTests.cs @@ -0,0 +1,120 @@ +#if !APPVEYOR && _NETFRAMEWORK_ +using ClosedXML.Excel; +using ClosedXML_Tests.Utils; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.OleDb; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.OleDb +{ + [TestFixture] + public class OleDbTests + { + [Test] + public void TestOleDbValues() + { + using (var tf = new TemporaryFile(CreateTestFile())) + { + Console.Write("Using temporary file\t{0}", tf.Path); + var connectionString = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1';", tf.Path); + using (var connection = new OleDbConnection(connectionString)) + { + // Install driver from https://www.microsoft.com/en-za/download/details.aspx?id=13255 if required + // Also check that test runner is running under correct architecture: + connection.Open(); + using (var command = new OleDbCommand("select * from [Sheet1$]", connection)) + using (var dataAdapter = new OleDbDataAdapter()) + { + dataAdapter.SelectCommand = command; + var dt = new DataTable(); + dataAdapter.Fill(dt); + + Assert.AreEqual("Base", dt.Columns[0].ColumnName); + Assert.AreEqual("Ref", dt.Columns[1].ColumnName); + + Assert.AreEqual(2, dt.Rows.Count); + + Assert.AreEqual(42, dt.Rows.Cast().First()[0]); + Assert.AreEqual(42, dt.Rows.Cast().First()[1]); + + Assert.AreEqual(41, dt.Rows.Cast().Last()[0]); + Assert.AreEqual(41, dt.Rows.Cast().Last()[1]); + } + + using (var command = new OleDbCommand("select * from [Sheet2$]", connection)) + using (var dataAdapter = new OleDbDataAdapter()) + { + dataAdapter.SelectCommand = command; + var dt = new DataTable(); + dataAdapter.Fill(dt); + + Assert.AreEqual("Ref1", dt.Columns[0].ColumnName); + Assert.AreEqual("Ref2", dt.Columns[1].ColumnName); + Assert.AreEqual("Sum", dt.Columns[2].ColumnName); + Assert.AreEqual("SumRef", dt.Columns[3].ColumnName); + + var expected = new Dictionary() + { + {"Ref1", 42 }, + {"Ref2", 41 }, + {"Sum", 83 }, + {"SumRef", 83 }, + }; + + foreach (var col in dt.Columns.Cast()) + foreach (var row in dt.Rows.Cast()) + { + Assert.AreEqual(expected[col.ColumnName], row[col]); + } + + Assert.AreEqual(2, dt.Rows.Count); + } + + connection.Close(); + } + } + } + + private string CreateTestFile() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = "Base"; + ws.Cell("B1").Value = "Ref"; + + ws.Cell("A2").Value = 42; + ws.Cell("A3").Value = 41; + + ws.Cell("B2").FormulaA1 = "=A2"; + ws.Cell("B3").FormulaA1 = "=A3"; + + ws = wb.AddWorksheet("Sheet2"); + ws.Cell("A1").Value = "Ref1"; + ws.Cell("B1").Value = "Ref2"; + ws.Cell("C1").Value = "Sum"; + ws.Cell("D1").Value = "SumRef"; + + ws.Cell("A2").FormulaA1 = "=Sheet1!A2"; + ws.Cell("B2").FormulaA1 = "=Sheet1!A3"; + ws.Cell("C2").FormulaA1 = "=SUM(A2:B2)"; + ws.Cell("D2").FormulaA1 = "=SUM(Sheet1!A2:Sheet1!A3)"; + + ws.Cell("A3").FormulaA1 = "=Sheet1!B2"; + ws.Cell("B3").FormulaA1 = "=Sheet1!B3"; + ws.Cell("C3").FormulaA1 = "=SUM(A3:B3)"; + ws.Cell("D3").FormulaA1 = "=SUM(Sheet1!B2:Sheet1!B3)"; + + var path = Path.ChangeExtension(Path.GetTempFileName(), "xlsx"); + wb.SaveAs(path, true, true); + + return path; + } + } + } +} +#endif diff --git a/ClosedXML_Tests/OpenXMLTests.cs b/ClosedXML_Tests/OpenXMLTests.cs new file mode 100644 index 0000000..c0d0ddf --- /dev/null +++ b/ClosedXML_Tests/OpenXMLTests.cs @@ -0,0 +1,30 @@ +using DocumentFormat.OpenXml.Packaging; +using NUnit.Framework; +using System.IO; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class OpenXMLTests + { + [Test] + [Ignore("Workaround has been included in ClosedXML")] + public static void SetPackagePropertiesEntryToNullWithOpenXml() + { + // Fixed in .NET Standard 2.1 + // See: + // https://github.com/OfficeDev/Open-XML-SDK/issues/235 + // https://github.com/dotnet/corefx/issues/23795 + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\PivotTables\PivotTables.xlsx"))) + using (var ms = new MemoryStream()) + { + stream.CopyTo(ms); + + using (var document = SpreadsheetDocument.Open(ms, true)) + { + document.PackageProperties.Creator = null; + } + } + } + } +} diff --git a/ClosedXML_Tests/Resource/Examples/AutoFilter/CustomAutoFilter.xlsx b/ClosedXML_Tests/Resource/Examples/AutoFilter/CustomAutoFilter.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..156af429a3604bb481c649911cbe7e17b4db3690 GIT binary patch literal 10674 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/AutoFilter/DynamicAutoFilter.xlsx b/ClosedXML_Tests/Resource/Examples/AutoFilter/DynamicAutoFilter.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ca266742da5c219fc4f94504ba1103ec70c52b90 GIT binary patch literal 8551 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/AutoFilter/RegularAutoFilter.xlsx b/ClosedXML_Tests/Resource/Examples/AutoFilter/RegularAutoFilter.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..08b4b9d6b07fe0709fd283eed758c26a0d7e60fe GIT binary patch literal 10432 zcmcI~byS<%@^)}{C|2AZin}`$cXxN!7Hx5-XmNLUhvFVwi&LOjv0`7^bJwr;aL@Vk zOIF^jtYn_-clOM)#}s8DATa>|SXe-Zj=DU!(tULf7yytA2>_q~002*0CJzT^8)F9t z8%9q%+lB<$w|&g0p;gA^QstJ*LI~kfXecB#0Fs74v)wNk#$P4Pcw^gYHl=g}q@{v| z3y8tWJh$%l@gG_Jy}SkZN|VS@3^SQ|^749O(WhFzifowGUkpru@uv~aALiBE$eMhI z+q3z!9GSdcHN)lZ1sC2DpcU|?tygn^FZ7y`L!88!i`A<@=$;D~nW_eAn6FlsMm^en z?pv0s3mrma8+te0ow^)Lj@9B?1H~e*E(;WH=BM5@ckIM|d3~35w6g;drOP19ULHZ4 za0^U+!xn55W{Xh{5xWQJ)$4PA(pK?_DGs4xx@F2|q1qCLSkZe3;sEJls}tlA$cfyM*<2k1j4u z5eNtKAKc&J8Ldm^44oMBVSK*u>Ad*>uyUrf;D;JihM&k;(&kyyKYF-UcYPf-b3o2x z=?yE@1&HAYXp6hr+_ro^?H;Cd0v88U`rT!) zsM76g%W`!M5rga~pdrcKCg;UtfOLuK6=|wrm}<1VDR&AE@0&g?3|POu-uWo-V;-1j z!A)VAuhwB@UN}?z2%823iMBmWI5s0+_O(UamE zN)IL2M3QH>)0r<>; zfv|GgF`uG3XTcs>qTKoW@P@(q2St=V<_5}4=46Oy?ePt!4(Z|~x*B*0B#4)Ab0h^9 zZn`{V#AH6!?DGCyjc%7k&Ql;Ynn42qs30|(I+!RrJ2<*9896%s@`}u)N&78k)Gr1U zM?P?>$JW>(s%p>0*sYerCum3$kmWq?rV6>P26ia-QupvjT#1E=%Dr}cPkyXfgV7hK zlN$%QBc_VEH6mp!_&|dXhFzs~2Ies=hYE{C>R9PRA>%k0U(kw1IIVCqKp|)$VM!g_$ot z*}iAJg`7jUju~9zq&ib9_I4RkwpugGV@!q_9J8i7e8ZmG6lvbnkKRR=(jT}tT!}U; z@s;DSk7Ffzfcfbg81`$(bnTm1BlHLGhF(Sn=)On(-V-Ce2YYlz7HsnAC%GcSgP{-Q(|OCx79Qx#WdD|-uo zr581W?(6b8OL%}Pp~OSkHXAxKG~e7l=~y!t)TlxohB^iw7OG=qBL(%pm1`Zlt!|V+-b=xCGjn2_j$#g4s4d_{FK>8_~bv$JdXiB(?l;2J|`TMmQLU9 z{AdxCeFr&em^gS5;>#xta8m7*pcT^B7D(zhMg334yyHpQ+IXA(2AE>RU-)(W zPKEhnKkm)NO~(MENv^oPW^~yuy*j5K ztS*iQC)ci~;GH4un&WBo3@WI>w2I?Lc?$T|9oA=$9_<(LUPJM50Ho+e(@tV%plenr z!)WjM%?5HwO64?Gh(Ou1x3)4&VER>Liqtu5 z({7(<=ymQ49!RwidTx{9KHCtUhd1a(ejPOrXILc+K_$gDMs^aV8pD^~ zGGR`uhRCKB`7Be)j=zxJROO{~7Plkwsd1@l6iZ0iS)FdUe_`U2pR!=71urh015LKb zmLv)EZBZ>n&w8q*J|{LBf6r3(H^#48m$7KM)=VVOp{!{aox%K0xpW#67}FY^020E? zL5Df5yAR)d*LUfcJH=U=!{Lv3SOk99A@f{T_1(c2j~8VI`fL=BVI5&PwyJI-zn0Cb-M-h=?UpYiWS=@ z1(>AsurI6Ek8Jx}oa4Lv+*ThPCbcBZGn#jkXJ9n6)6aCT+xNj+BDEd6xGuk46jeVX z{oT@nHemS|K$hkV3jpB!Wof@W)y2}x%+&=%WuP~fUmO;dJZ`_jj5ug8aOTwgt^ZDJ zD&JBCa-}*)oY&T3uFxc>)>6uO=6cS3k?aIZLi#N}jLdSn)bKNr^iuxwANECzJ5W*;`|$C$^PbZy?3{umi9X3v0qpUx0Pw(^_y?vlf~` z`5oYD1Bj{CnTASdh?Oihw6T=ZJ{?ZELd>GfdKcP*70a`dK-Y@*yNn-YJZr+8a97SU zZq%13I3yh5nrLU_)mW~4p}?CGb=qB4&)uvt$h0!3GC#Pyja$|hgAe!eUCPpvU#qzW zG9l}%)sX6>!t_hp_>S*8Rgtau8Sc*HOgU3)l8q7AcM0K-TV}b8Bi4oX+U5HmvnQmf z*8wRqv~CKncuCM5yjF6T5hfI2wFv+Unr;F@KO~ zF9zb_-0Eq^?}@xyA?QK+y&(5^79q_~Hoyr?&Md$cFPIX>fXfE4vY9#iS|@sqCc`5v zx5P9t=WKk}ZmXLi zuK=mMH#ecUmX``1cPmj8BN;1B!UQT7#E-hU`R)z19>B(x%;>uH5$gi$fr6Hjwbd{g z)d#2oBV%b5ILzBZdC{q}<8G~)evZ54?Ko-XS0eWJb&hfy?nat?3L3@`QpwI zPB#afa*t6MHdSPsIHQ4pbwUfwkHKr1K3H8avp}VBYsH%fs0Zq7>XTAQrA1cGk>Q=@ zBth9&&P3_gO7V#w@f+%Q2a(R9MhThBp4xUo$)$)j#zF`rabauvN20Aq6mubeVk^R9 zX>l(!7*57E<=jnaFq)sT91C|ds7TDN%t$dEI_zC-7@fa3%$ZWs)k8qepbw(me{qI4 ze}#1aaR%`-zlH>VQ-m~3tyW_Qj(W=vC*|6%^s29rWZo`!EF=5mcl1)zSS9ohhw355 z#rr>~`pGO*ORNA&~R8c$DX|$JcmE*nFHvbK_7i# z8@4`Oar)d=8!FLCX4`Y28v>M?q-1a|r`7AFNY;ax-|x%i8ikAe@p^2o)om&5`j&}p z0bL49oQ<*vuf*=vj`%532#Nc;B?2e8?gCr<=k=f-to>xW*G=9^_Xk5o`*#!O1zJ{I z2*Qf;wM&M4_ycA~Y8!0jtI-s_!>eQhklP7qrUS_C9(`(Z9|~xSO)VZ6Dg}DA#}C~z zWDm`lVKoBduhq2&^UjGWb)j$QZ%xFYn-2`$ZiFn37H3BqnA_%r`Y84h0<*csc-D== zwCSL7!W*jx{T6$Sj)w`usQk*m8qFVq61;cS6HlMNYY|=FGP~DHZWYJ4&5Vv1Bt;$b z>050FG#+t{sZR4s&a$f~S}G58j`eHHi`FEX$B!?VwVb41-3r)_Jf$X_N<=h7?VPs% zs7_{I9fHSjsh9aM-(A(0WT=9&736<~dCBm$UcVNpIJy36!S0wPS7JtR%G+vhHQ+rl zzoNaT{->%8b`Nai)Cpf za^dOauqhGmp(~OpKjg|f`5bom!gLpdsyw4XrtA3crpx-9$CLh#$Nk&{(#&E1(R4fi z&vZ|Er9D{0WPYA2gylXzJ-PUwYaW_Hm|~@Q@$lj1!==0~cyr{n+`QE{_yfe_Tq~sf zi|E}H?LCXQ;Vh?LwU*-H~v-rGwy1Tr4bwa`P5@?nVFowmh6pXl&8d?X=-usw5l)fa}+35R}hW+oNE&eM%| zRRcY!wGC13L}cTd;kIlY*IwD!Tg+ z3|J4tek^Y05H7)nT$Si9bV7U0Dt=a}$eASV46M;Nun;NuVpNOf{khUzeCc|?WA@7L z`+3w2%GZ!gH>_Z5NoS9@T#M2KCj~#lu<%NJ>o#wUU6^a=oE|u1SZ$mFue`wt)e_!( zZ$;LlqKN~t;!*tw_d!SPry6CLDtU;i+wt!s*=8@79(GvO%*Cp$7{Kd9(5Bn7roPRE zrc$Y-3|HX6Lq2*uBh2g@(XsX9IunP<6WXc1cVjx^b(GHp=0dlsOrqk0mHo&AD?78P zq%kD7ACEyFW4DN>{AI#;3FMWhzBZS z5o1|e9h-AVXDSAnF8H*(!7v{r&cKY_T5CD6FX>))F7!`ee~(3y%|6lnibdey{*`{& ze$(%tSj4a4vI9y!{EK)E7`}FWpS!vp&nw!9P;#mheY+3*Gx|n}iKb3@m0#>h#h>r; z$RmC}UM}1Xs4(OrQI9JzZuMy4NfNuzH|sKO%_p9&4`PpA7Tvv?%c}&)i4jThYeY1^ zDNLmbo1iOB73hN|A5SW_HXl+wf*g(CcMS2;31S;&mM;ne??I%P#d2_MSMm9lSBMW) z?ugoOX3W0*rqOf4r|cM2hpahR2kWr0GSyo@pqpXt)hU68uO9BcRPw&`{&pZniC%=1 zaLY#~m`mHeUU#JpE?c+3@Z%9aVgc=Km70&U(Y7~1HX6t|Sc+)riPFTx{_kRxc74& zpNV5J!B-C+!n)yzAc2=hi#}f4CnpeFqfBGWPp_2c#U2w6@xWI{2bJ@SDQFH>9p7{1 zvm=5>L%h!;HU#~sdzkKh!qfYN_4f(SfQ-(LmDyO^SVMNCYUr{N?~k9WC)Uj~LrjDA z?bs2jp(h>ZMO`P;+MBa9ZO+mVAimx9*0UB|no}=pOK`*cup>vCuNEA9m=1-zF`#7f z`#|^eOnyeqpJDdQAhlMY6fdcTbF90v`fDdMZ(I(2^NF!*+|lcNhfiWh#&x0#Qqis% zR~{YZs(H<9oKZF(ltRLvg{)GBinRj4H)M-B@jrJtssmwZ3N{)VwgxP|d9FL#ELOAo z8d;A^YY0i-r+pqjxKZj{@a!|JBNE7F(bS1Rq(gRP%upg#UiMoRejt=v5ks;OTDv6L zW^&s3?NCz3gx8qMd!T^ z9;$9+f-MCFBi^~xA>rkLM-tT*)b5sqkIO7RF-9oh_Ni~uq9y1$@;6fZ63p*l{_YIj zObZjHAZOSBCDQ*Ai?IK4hNQ$Edps7@P=kSG6}pC{kl^5KAu)9EsKi9-scXe6!}+>$ ztf~$?AClp+t0~EEbgs6d2xwE+fqc))8xJOYmzVc3b(cjlHQd=r5;qC+!pY22EojP< zKc%XW?EW56@oZ@>$)45eW+tpy%jBzQBX*2imXBD zKs&`~XR+iIp52^h+L+iNpIl$`E@ufZAi^+L8BN`(1jB);_~zhKp_7btv!r=?>DH|; z*a&@bqbUX7kk(;fEb_!mRG&z^$~$btoCB&pb%#ZymE<-7SZ{SEiiSr09nq=D?W`?C!%aE=E!xMN`?yW3Ps27yEzM@65xy3lQ5~1 z{3ys5XR?v(sy;BK9iibKJVdV7dB`5w$W7VN*Ll(I+0l*J$TxXByo#C6k^~OfnlvGR z4GJ6JHUse5|J(3J36)N9#Ut>0bZwh#qDFYn?d*Ul8}53im08hgr@w6}O~X@D6QM@C zL{Zhcag=hK5<%LhBF6?9YdfKjOj(p+33qfg`Hcl$=yYj0m`%Ve7I>!4J=W%J zu7rLyMaA)@9=Jz699}Z$31HbSkjsLW$c^;1BQE9_#pSt9S16(&8*BATJV$y1;%khS zA7zocxBO&?I7Y9$l>-TtDB$u)OJbR;4pfe{MyfoYxPV)-Gz28D#IZ0daHGN{vMP68 zl33Px0noI$!r{U74O^4M$@95aN1NQV(F$0rF0RSDh0{h-b_a+)@r+mw{fE|L58N2N z8$sS@2!FTC9*Ti^Mo@`I17w~5DS5dX8H0)wOuyfLr;B!R^7g&Vs3BFxUIwoZh{9oE zNk~W<=w+BTDKU(P1>-E_zS`>jkm?X2m=(!hTiU?y^74NAd7CkIEm23{sXFn>murX% zLZ?+`$*u=tj?+XS{p~gPFej3nno}q%9TMh4gXp%FZ8k820W1ImPT4A(N4C!XOp`qqI-j<1nlI>8h`Y>1+W*mMkN+Fh=>c?XnaQ zEd?`>Pwi(cG;X;FML{*?uHIM)pz`~qWMe|>W>ZF(jr$Esn}XaA-~Qc3E0~F%x4Q&t zkw*S9&B~0UdN7x-)_isuf*5EX(V;K#b5DIQR;GmeM&>J@mEZ(K3j%SSLgm?12@h`@ zk0@)X?qCMy@GnZC_ zcP%Yyk_EY!84+r#Ol-Xb0RkLYk07f7L5gj#k2B0hhsb;E%G%j~ zR8qar;^?8h=x@>{vhslfx}kHXh%;jvnh zloXj)c^|EQz-Pu{=fHA$b&5aRb>e5VwVZ?lJ@P`c*y$6;Mr#Y)wQhjjZf{@tb^< zEPNj^rg#&n!#dxJFf0k4hz98%1^knu&Z-WKo^q4oVR7H+*Nl6wj!z9;Tq>oEuqzEG)(#$OQ!<$ z5tXix9Wr7Le8ByMlc8)enCT25L!EoNu~QlDRXX&tHhz0pOl0Iek-s) z3Id$A0Uaj%mL-6cTKNh5bj;q}<9Ka8rv!jTbbRNze(JG)cQza&XwY&^Yz(T})8=eS+AjE)4W3Qn`bbsS= z6{9;OfN_9YR|(-v`CutVNDae6k0s}t*?PxS?0zM~kY`*P*et}wmZj30X#B(SOA7uxn(erlv3pwtTLvrCVNq; zTL%)maE3*pGTO>X$~*8&=}|kji6$}k-p*YU)nry~!oET@kpQp%ZQpsGtX9?b&EG1wY_&(fo#*Ch= zfX77Kq9KKeH4URJ@8>jDi9zBRD+YwLcXXFyE|N8(oWfHh6bv0* z-Y0j$1fT9_`O+f(SZqcMbiN$NXjdB$L-(RY8=BZMRxuW0fe}AI&W;G_R>_-rMEG+NT_1-)%X8_d3xSEyMDKw|E69Nnki1pwmT? zKxl57+mYqW6*bW!DFf{(GNahC+t@tr=2uh|c{I9W+gZ}?W~_#}Sc<+V5Mwx}5u~Q0 zmq}mia{!BJ!?}!n;kfEn=y(=rjsqcD;^8#r>uGYKYCUeVa9ul&1@~>f%&sxGU!;_P zJ}7uh&MfAQlD$YC(gZ&f{>Zo4G;cP})px2f%g({Wt}=XTEb$(*+yWY6uOSo2*vwsO zVuW2X>kX%aWfo=diU>SiW(hg@+mQ2*jP4Gp^r%t>z~0&<>Q|;l!L8S`Qpi+?zP78Wy?Zu~cx&M4ZuxdB4>tn^Qi4aJ4H=tuQ!!@iy|*YB6+9UtW>Aq%3N(wH zpplK)uu)DhgZ(7vg;}YP^f}@K9ooOqd@>{EcVa#Nw3tq|(!BIa* zzguE+Q4fvCd_#cHMb21Lcx1W$@Vuv@l*Vfzz_F8yj(ikOXAd6IVRR|qz_ksXpO zeWae~U}T(vH%RAmU4TCaaW`n(A#o@z8VPg=FN0o6Af9(LGO;nTFk^Btb9T2f0mVCZ zX0Ar2My^IoCJxSK4340#ubH!}73d3N6BZ*Q?q3fxZZ>W<4kHe8P9yd=M(pg&EX-!C z+>DMccBUqdNpbR^feFmuDs(TRXYqh9GBZ#gv81F_!E5R=KCzLy)2~qM+R}5OYjj5~ ztE$>+YO`Ki?cLp9mg$~e#kL1sK3dZDGmFFFuyb@A($*u`wTc|Is^$era%wx~z-0AD zp64oIEr%LHk+|+Yw%G*rQM)yzVk5-dcU7ohW-C{*AS9Pcjf;bGfgsqJej_<1lGR`XM5thO4 z3PD@OYf1&9AYk#(OfHR|>>D)Pn%~z@MX7a}wiWQ>BSiOOrL-0k2g4S`9Z=?Znm?UR zE`}Rq8H8>pO%I@ps7|QoEBNFC=rUB@)#JoVM`hm-A`#6K8V3|`sOL)$8?d|*hX|GY z#-}+3WW@P=#y*y^Z#-eq4c)O0g)u={T_T5%^af8~bR3%pi<3@w-MA(bGr?{RS`F=c zhk78DTwOtu0dYZ@4TTU-4fCQ%9!j^FEg*iHP13r#mP#wdZxk_m+kfh&Dt9r}#yHRS z0q$#FT<pAREov4#pRphw9Xw@S;UKeu?w4ulonb3S{TMR`P#c-j|{;8+Cs~XF=t%|0w={+IBBd zUUoSCpll-kBg*f7$4iu##pXXK>7cQ&e^|@!((_A{m*u`cCSOHqn z-_oR)(l2wAKhiLutmW4Yy~tSp8{nS~zdrz{#Qz_T!k2&llK=nwy$vY<@DHbfqAV21 T6#)P=(6a(l=O_Z<|= literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/AutoFilter/TopBottomAutoFilter.xlsx b/ClosedXML_Tests/Resource/Examples/AutoFilter/TopBottomAutoFilter.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e3963457ee1345f27524a6805d5b99013dc5b5f9 GIT binary patch literal 8535 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotEqualsNumber.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotEqualsNumber.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6e23b6a9765afa38d168db1311ff244c4b9ec4b6 GIT binary patch literal 7388 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

}gs-bS|0T-^iR;*3e8Ae^_Je+AW+8MCbd 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStartsWith.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStartsWith.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cc432eb15d5441e083acd372aab3c455150832ec GIT binary patch literal 7484 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 XM15^SaE2fdQt-DK1WL9{o1gv<-sXtp literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStopIfTrue.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStopIfTrue.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..de67d1ef9a82dae4106eacc3901fb6af72c2026f GIT binary patch literal 7422 zcmcJU2|SeB|Hp@rootCPCVMf~AsJ(>49b?BjG3{U88c&-5ZRS|Nw#Q1QV0>*l@f`N z=qabC}NXL*Ha|M}7#ks^Y!bF^ia)8sm~dT-!}OS>G~nkl}K0 zbIT+cM~2f4na8&H^)y3mc1!eMA!-NGBT9B2U9hJVZ7n=*07R00EiS8(l=@mXh1e=f=zr0*uSHQcW`htNszBUwdhC3|@VC3$<4oV>h)ECdYwe{&7%L&oATSd1ir2n35rcE*x6_=mxx z4S?TCP!xf%n*Zw#5_K>#|K6uR9{{L3mW;xn$S5cpPsIM*qu+azutYB)>ZCvI14S#M z(J=IWIhZU=QC?bBPDvi-uwPzUK}iWK>!2WSFGV1^W6*?eF-K$NVOT|JjI6u^R$dM! zzjl4lO*y8zn&3Z51*A6I{5Vi1l(&IEtU!Wqjn!Xe`T0csBaN%If~^KWltP~?=5dUI zjTfB9xi8*Bq*&YD>Vv#X6%RvP6DMJ}nDb}$H!b)(9W}m2wpm$;?bQ+&c#0A&3ouUw z&eA45sxpaAD!M+!mq@2u87WuDWS%q%`5H;|h!wYhWTY91rWknieGHv_pfMPA;p71I z6Kz52OqbHDYJz-BG>7E-^3o@9lf2vFY95SD*3H?)<`CQb9bU&%bsD3Q;!0lzpN4Um z9DWEB~YEI35?CtX1H&LK~_j{f` ztRCka?@};h_;f$2t8eer2U9Nlex?QnQlxNYA!LlJE>eWshh_3Cx#nR8__R%`fAOgf zWSF-x!;<&a^4XV@af|SqO(!{_h**plBpanXmTPOSBy@u? z%_t_6ouYOwOyczf#bc#R_)W2FiO8@N6Z+1mx$MEvN`&MaNL63Pa$J{3s;m*oRiaC$ z@rLt5>Y;`Mc}D?dP_9?NM)l<=-nnLtp6-%vi^DVQBuLu47 z`L-`;L@tgh?7Pat;meyb?9KDAdl=r}byM|`ozRF~-yzeg=9@I4Y}u^+$~;VFf(f0; zu>7vWsu!6rl!`vyA@$lX?4{^76 zTH9>HZ~{(4j@ck zys&wA@w}D1=H;pD*VxB2M<#RRP9Cr>3aZxhm>>3kVmOA^WFQKD%IDMw{%vJ3w0f7I z2Io-&KVsv3wk4eiZI1?k&pfTcis)pxX`d$A;R^JZ!jQf{r?|l+N zzg<{X>PuJ}(&HMN8QXuZEr$JLWx@R2a?^bSSs$&zsa?899NlaDmy9b{s5htJ7p98h z)uqr^Y7mHfJq1_qS&|bLOC~|rK4gAXh+<6!af8x~%ba)L6_T6>1f7g9l2M#fkMfwR z9iLou&%H5jNPafo_u=}{0ccD@Cgf#89yIc>ad>!-;MbKElGlonYbho9UWSFN3Xc$_ zo&yPc&!XGt{e&w~72%)m#g%PCtri01R&2H~+M)1R-qV7*oP4N)qH%;ix?BiWs^@Na znNiBUx7SV#m^wtoLsFXBtqXWk=bfP0>LjL+j%|^ahpt;nB>MQ>^$%Zhvg*E9&qv?a zTi&#w_^4uRAR%_lHkp(9kTOEoTk1tr`WIW;Q2Ug9rynC$vfYt8+N

JvngRD0;y;#@vzPWd;8E8xbR!1 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Delete/DeleteFewWorksheets.xlsx b/ClosedXML_Tests/Resource/Examples/Delete/DeleteFewWorksheets.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..df718c9dfd77a03c3c681c517eec3cc5325cc20f GIT binary patch literal 7944 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 E0GiBNXaE2J literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Delete/RemoveRows.xlsx b/ClosedXML_Tests/Resource/Examples/Delete/RemoveRows.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..31ef954843e0b811456b6ffc93d470796cfc01ce GIT binary patch literal 7484 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageAnchors.xlsx b/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageAnchors.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..40e2d5d367f70183e0784af8b2202f66bd11cce1 GIT binary patch literal 159154 zcmeFZW0Wjy)-77L&0V%_+tx1Iwrz8lZQHfWwr#s=mwor!-RJ9mKlOLdx%bZ*onu61 zWM)K+C+0I_&AHZ!OnE6_5EK9a00@BPA`vMQ+_wOHKmY&*AOHY(02}}}D>_$O2TKE6 zTT5CuYb*SG3;^=nKQ{l5kLb8**?xMMAzhMRS;ps_{EO|{t@iLBR@6fu|E$J3v$&zW?w?S`ICg_RWgj99=zMAlUk#X(uNSKsv8Qt=`K zo!6V1G|^sRQLBTN-hS?68byAe8F@4ltg4fR#`|g0Z#_>QE~k3Mj5XbG`<%^n5d_~* zs>0K&arunLa)uj`{$04HBQX_ijQ{Lvux1s7&pPM4B>2qhM-jK$Bt@c!vdJ4+bE}m#QenD*4^-T;tU=mzMaFkNL%^eKtufn zwm*QDavCVj{0;IS3-oWGbsdbY9O-EPc>eD|zV7Je=KEtJT#OwY&24RX2pMSU3Gt0> z3~i0fZA^Ixot;c**a`V~xfPAA^qqch;b>-V=ZOD%7aK<&LNg~PJ5D+}M?*7XYkfyr zTRUT$-`|+nI#}yF{eJ6UN@u5UXsK^%Ovgx1&r0`uG=Dz^;h&F*uk3DT{69IOt%-@b zp|P;7p|iEIjnjW}V7fnVL5Q!c?_g@|#6w8;@7PC(FJZ((sA$Y##KO$N%Em&^V#ut| z%s_}w_y60_jNP1!ZH$bKXzUz*gXQ34ZtVCE<1?}~l>hy?Bb~mT-5;07UkB(QVf246 zrvG{Z=&X&M^o{hL^yv(39gP3;5&f^d9gQ7aexvUAU+zO^!lZA=U}D6~LQl`Y%*MjV z&PvbBV#3N~OwY)`Mo+I#Yv*WfWN7y{%uN^!n3;@?nM|0C8JSrP4gZ2U-Jdwd`v<}Q z9!bLEQE`2LN0I;#004yF1poI~{dX+SN|N~xCwhqOenSzFe1zJZ0iB?;$wG0VA_YuwR3W`sh5`EW^mBR zCFR9}d33ih61j72nMUJzJMjOYgI5dU9BedY!_>%n8Clbk$feI{m7l}3WsHzjL%IvP zK1t@&vz4dK$~R>w#hsKrY>kiGw{I0Siu0`G+3p&%50R&_1sijZPhzG}NU)zJa;rSb zsz=HMlA-=}MuKD5++5Y+oTVuzyMg_5fF5>${L_5Ncz(T7g?eudAwqRO-5C_y^>A?0?Y5?KvqtZ@=&p({{2AcS6X~NE59<9p zZpHmxQ2r_jj%NA}#zsm`4!=W=<3G~{o+tshKzsy%Zox;LJRas~M4o4)fQp0>!PTN$ zTb_G~4?&Ix_Owy2?Hqm1{X89YcH(-wOBizEoD}|yV9N7Dz8QmXxy+{q^QkpqqVM`2#}RQElfZK>l<4@P9s)Z4t=3 zr{AaH{F{?le?67I#@&C^xPKahCl~5$`tcFKcGLt~mf2;~RaL}OXf@V50s2f02f;vo zu(~(Hc^Cc^ETdBCDiuPP(&5LsIR_@--P&U7xSNSYk1D&9?ae0_$YuI@rB$&bJUPj8 z(VRhc!E%T?>Ov6SIYI!J7Q7cyx1X)VJg;8_g7@vjD93)=%GLBWp9`B1)d*nY zu4J*3cT+xyQJy62dD5eLmxq*XwQK*<4*5TrAWO-)fO?$enNX#y=?;;EQK=NtW6hyg!nOELg5>BOIh;d974$Zwj+BEQVG#!tek%yxK*~MR&I2b1U9FD%_Rn*S(?TVVNX7nX2mjt{L%P#F@>tt z)~!z7MUj5f1S;({{hVehzruq`)r4@mEZesOANlDyz!-{L!M#{P=^IyTDWGiy=9-Mi zAe|ld(sn7Qly8)R%9kX4xpswRS5ga!q#+KMTB$$pKp}2V2z{!i*7%f6I5k@tnRk8+uOxwI<%+J)@zw>%dW_HBir9SEKaQ3d^XKi`7dF$n}w<>Wma`p1#p zCBj7DlXX*qWr9B=u|m(fQN~G;%#)7jSm|8TEaP(1a<9yVb)J{|a}XpEz}_q4g7IBy zOefpBK)d>lPuUua!Sp4-Te$?cJpwziuG4xw-w@mJ_` zZ}vGdMxv0PT8r*`n^dXSvY)i@f6PkBnp$^yzALqUg8rF;2$bFr6TcNE2^atX+}fk5j~zXMSdAQwYaU20bpkOL={JdeCN2->!_$YCbxAs&y?Nj zo%`$JYJR*78XAh6rizHlS1lY_)JZHCYto^G*!kBpr19+OgT$H?ML@5OgTv3ph%?Eb zZrvio<>)Cg@m)LCXppVMKXhIi7-<9=ZO=5gxFV4w6#6joH6Q8@iuNT?gg{u-A2k#r z$-V}uFW-nLSqCo*kRU~@HihLDk^v4~Ic*RzH4~+iIpjhrhh_FWyhpubwqDoEy7Esy z{`Sqnhi;U@gKnl$@k2X1-K;w;d&0&BicteJ@p2Rtr`JyID{gmHbuhCb1h~c(l_1Ag zwYV+PI3D--meN7QBP%l;A5bO zN;H2mg7CZle%9poXVP_v6x)4&xjl4@8n#W4IDVBuU^y-(UdJOhug2|epN_8cC{l0; z1rE*GQPdKUN~fm!j)*IzI}3qp)fR2sl;Ku5kXcq*5s~$z_k=ofO?pBd4tTU_Ec7Vx z)DYZ?Kz72&S*x)ZY?GjRrxSSJ`RjC133aYEHa#T*$XpS@qB<4c>=pS9rh8#L{)IYF z@pA{kah^d|&MrASTjO)VGIw+dwONYpv}um&6X}L zmpKDR4VK;mI$m=fLk)bq(yvx_R-|Wyc`mz<1AvG8sM{%Htd5n21*pjeGzsor zpQoQweZXekIu-#;z@hV0yp@ZmC2PaQ98|}Ze2`ael*c#9Tte^~5ph#N;(%zmO!{MDS-h39sw2?mK)1S{`k^cw1unVV|*n3S|XG< ze^d2^ai1F+Cfr9VNxhXh0(Zd-*?Mck`rQJpRL42D|0li{{WvygY=^Ryx8Ovt;na!k zq*{qqbTtmOA4B*U58jkS-%4)V(fz2yQ?$F1O07UbrGsJfgQ*ZAYhg{$kV)6b8;H2% z5VcRQLyCsTT0Yr1>z)ri7BV+0raG+6Pf`WBthYvLhWoUw*ucLgAN2Jju*vi3>-s`{D3b6a|aeWl#drCeVvSohoP()p=ZQ5itygFn4LF?Ztm0)5g*P09aSeoAp<5r8 z0+{{j--j-AwX_R!!qL@>vGA0*InK;3xKZ?B6(_%Wh2NEu9y(kamYK{YD;#1)vq#v; zn2#n2bSvM<9;`P$qT%NCM94fP$!<1U;$5s`Y~z0aRyF%#mP+ySh>Tl6eYn*g^R1oh z(YIeJ4d@{OR>t(0qxA%u9x`Ic;8P!KCM&HcKy6cNb{%xkwrb7}4fg zC4k=KrAp-%cyr7slEY94r0HRKJ{1|tQuWbza2*w8KXSfe*=1ss-lmyE`_jqRJJF@E z`FLxG;?AAf@nN)5PuXh_yJ2t~AU@3MKuA`Fw70)u=cm0nh*vc2p`F?@kvsy*3?jiX zZyZH3PT4^(ig<_obXyT&X6H_mPn@#p9($oaOO^A^GjO@n{53)+Kkwv>5pq@JjS<bp&en&BaUR zjegv-huPnzbStrl4BtOonsi!p`>2L3FB_MdL1W5yNs4-ImZaX=zgM1vW;*H4#h>qQ z!UAhDl?W@H;q$V0z3iQ$9Yd8wb2N#Bs+!$%KKoSX6$inY-eq&NnVfGIS10vaz=BIA zw4X<5Tt>lX6CEyi2Ax)3b5wP1MYAc9v@+a9&4sX27+n*c2x3Xrl|XH>7@-`#A>3wo9mhh2;bMFr#zK@y89V=`ivs1m;+}=`~X61MM@B#@IQ3p0pr+XiPnXc}w7lv5g z)~Xiwp-DxQPr8p>mt~HOW!yijlN*4=2u>+G@+;0}N967(s+&5~i$pglf?g`>Yw4q< zRFC}H%0AJ(0?6MI8pqQO+0(@`KaW!pF3bwQIQ(9I1ZuQncFgG{qo4q*8%Tb4Prg5vAn1^vceaJJ^(`j_)} z{rfjd^jG!!M`QF)^=~ka=MVi8twC}xvB5;hE!I|7|C{{1lS4vG4fVvg0wGc>8|WD} z^1i*CdTv}fdomz%DTS?Rz^Nzz5m9N^RPEVG_8Y)jE8&?TQP>VByp8+{kH#5FdPidz zi;oHmzB6)UY}FGUGn79G=7th!r5;BOkpr7ZtL*T24L%7GkXqw#XEd5er?*Jt13DL$ zPh#IO78L42yUx8)1zdl^>HE12(9h>iZAz%}!q}@ZIf?vdm-vr5i2NUPknvwa_%9*+ zmk|C-2>&I7|5phiTJ8A7^luSN{;w-XjQ_lH)ccn@X7Y$@I!YO}vbEZHHJU0=)0&8# z%f5uc;;ryL#nr-*IP$tZ!7IbTyph$OO_l|N?_gm zx}Q1~*%fNGiw`EwT5#f_GXQp^@LuY3-&rO$8K;F-`78QixNd$`30kl~7jh1l*OP4M zueR)P_-dorIslbuqz4bV2*_9s`|3mE`m-tspCf5hRH+qos&CG^4P<9M)D}?RTUVUE z@UY_yWN@N>v);6$KFCnFd!it1fyf#K6YXy#w>ospH!Z}0Z1*9 z=@;3~&vDL8K%P}}ab$$#{W1j9{VW<0tiZspIlt`)z=oijhuJ6Zl zTL)&QF=8V3#tf!Ikr4kMH)-jGHLBd(@s1quo z+t{g}tO?XDIcJioqP=Qm#o2dubMEf@eaqLtCDC5qQZaB|bVLv;CYf{(0P+Wu7`4Xb@J$5)WQI3HZF$#w6}a`O`cgpW@Gxyb=Tl;yAwPW zKZQxutsK-Zs=r2U-aI;1iLq4t_;8~*wOmwlAV~N&M@BfDsh`cCu+f-0E}XvHZ3O8BsEO12=i~< z=aQVqAT%C`78c%;VaOUxF>e*Uq7?o_k=kJxIC&1> zgQp9RR1zg7Y`sbhD0>9Ujx@*z8E4zh{*P)yDgUcBBmxL?4yC5MME7SX{(Dc%^e<2R zFHih0Py8=W{4Y=Zf0ZXrq{wOdLjckLE`a}LdHz%!`X35ltPE5iJxWjw($>~bRRQ7j zcKi9NdmsXDnZQYS3Cag6TJ8ij`kkQw=pX$PUj3clre7OV!#Bx=FR4Sz$^GM#tCv;n zQ|D_rddkY^n8TBh?H73Kwd&&gQxo_IML7}>>+G_vT)=*}$~3@&bw(=WgVyUe44+MU z(ns4nN_@j?Fd7RR5*r9IeEbwLIw2~N1r+xD#)CpUXn2RJf7gaAJ>l{$D`@DgEVMQ) zxBe`ENO;-+f20Q~e|LZX;06BDA!7P}l^!Ugsr*h4XsP~>(}U}U|Bdv(@&B{*AQk;~ z%jvQrm_RGnD#|3*4WlWz084w+U?#B70t*XarwDXPF+a3)_SXOk}1+W7$js=6nyW-8y$n#sT1y!rQg+cs?wP+or% zBoN}i>@ELOf*hu7+N{x|4C@a5`Zz;?2!<#v&zDIohP{NdHKQGQ`NY%Y6M27m@N{ZXCD90Qo;zW<+z?LkLnBS};4OyE@x_|y7&XgU zbvi6g(Q9&{z?<)Tqcolf2SRaWD+Y>g+fX0mX?K}o99Lr(Nv4j;=T*|OXg_T^zR%$P z0aPqXjberuqE6m6ETc_8wJh6zNV_tug64Jv1;7W3i8Xbqb_6)~ODD2#1!1g8p%2LxmjQ}OdtXfZ+;T##{=%E8fZ7er#XIOu|X{$wy2VK zyuQ+Ok+qJZRICT|V!3j@K$v}+r&>Xy%$q5(WJ>cUzjPAE(>Gs_sQHIJUFdRlMc>%@ zM)_-WY5YSf;oJ12EfdyKHbj&QcoqcSg721NfH+rf{gf|Yfw=WfU+d7-j6if(tA&DO zkjEI$b_(w9l_CmPKY6$;KmrbUq3e2V;u9k#e8T!c(A7@s6@7T(Qx7IyAEqwg)B#bS zIrBUA)QJpU^)AWw=pz=w)+J3ND;Iq36#@Sy6~IC_7C)KI72m#N50vGXob)HqpM%Y{ zfbLn%|0MDF3#0xAi3isoMR~BDzci&O34+pH^iLx^{K@U{@@4XggB@7GVg^u0fbx-m z3qIC!E{;DGl*gItp*i?4CJCez^$Lp=0C?k=h2?rpz;g=d(^LavfK|J~I z>q{h_2h`^n%%d}e!-~#lpxn`LcUfgzPkzFxXH>RnyoxbfbBS|eamW?+!(${PFS~Kq zinhi8{k1E7B;n-07!g>Zk^g zv)Mw+y|M%1`qaC*xv7n`vB}cf!PUEo3-tRvqzzy|Fo3|%(YMd3m#H@2jq(i^JrYCKH^30@46aXL~Abj9Y;7(hh0YLeTV4SEz(DaJ@t^>HVE%jo{yc$BctD8X!GwBc^$QR}oE!t6ni5ZbtSk0lpI@se08wFgJiyNTl>0zj&k|s3 z9DstKG!lm$L<|7lk2r)3)gpNi?f?+P7-+xTS(V;n;S!mi0T#F~%QR+;3;ZNVW*j=J zAR`n`n_hYZAZplw;Lt*xG`I;6To|#j-*XYQqaFbGMGB4;0|W+P&t!`PcA#I23@Bxo z3JPjG4So|tGnM-AV}M9+FJNCR7><}IP>d{DL(F)_9E1#s5K7xG7LD*G0#lq;(yv%t z5FYg24ks*5m>j-&m3)pK zMOfNy5}3db0AGirj*s^nDq}9|LkdX(hnK83hB&lr#qG8@B)z+QVD~Osz#SARRH~#r z4h4jfw0HhccenAjZpAo=3KEg!`1GA1fS_N&Q2&pyf zY}|uiR??5SC5TiK0z1l~ywdzU05e2<8Y2vLxp4m^1OOMAbaHIpF?$3Ofej%N z<3OQf0Uq8K!jv%}{E9E39E3PS^iOKc$OvM~1(5A4aVidGML1Tt-z7l!i`g8b7p8J;lTth{rtZ7npyT?D4{uCH_KU4xAOZ=m?LoW35Sa~^dmI@ zn#j^ah?}Su&XgJuX20xS6k^0N><6i$eG7qtYD-nb2o*3lODWg6Kq=di?_36QWXTg!%dH#09=$307%WRkOT@2f8n2DjckP9vxuLYATcrd98RtX4ov zX4gW&X`S%3T;^6wv85O+;h4V=rw}5L!VUMA^xx4AW5K|bBk*1Fe@cRar;iC?iX142 zQuI#&iu=4I@NX4)5~TM3zsX)Mox;UG~%#!X`t0Du!9TZ__1 z7gX_x69ILD5CEXitNMdR3cpe2gnPQgUOXIv(*ZNAV}c=QvkT1Y+DsY|KQJ-E9x1qy zg$ASuj<~hMuh(XZ?r9~*f09>@h^mlf)NjF>YE!_r%JHrR>Dj9INvYO5>-*rZH&43GrMkybTv zW?@G4oBY7W0D{Z3LPg}5F&-9ou|2x|sj5Kbh~egX9*4h|af z$on~eSzAEg1UN3Khd_{sJ^RasWD58j`8Y)B%X z23m7J60l`>khqvbS8AlCK18`Fx^+a=&lX}8-6Gw^iz*Y+G^nSMYnBQb0;lFORR`jv zg7?-g)e@D&&4np6(~y%h$$KqieM`TGdA73=7cynN!9qKPHWONMN7~V`#(9Zhf7)b& z(P1>$`lb3OIQPK9QT$*G+HV$6Nl|I1Z>PtbBwR31CVgIIVKSGBXU{^?`rwS8;Gr>5 zoD0tYWo<;;&{h&h1ci}uLs4wt9!vcUmV@jxk9KW)8v03HT-W91$y7*l>N?QLR6L%- zX$LIotUlNfSZhoU?(dpQvhgyHfTiR9Oh>-btFu@tB6)yp)y{;02IQ^Pnh^UWfSC#n zo&KvlU-?%S!>I+3X4n+j-CVGPoCnZ!^}r#w{tKxW5t04!wu3*b388e653Ko=0Fr=V z2)|KE2S0|{nl3)4Vd?^X3<9l>@O7=z537#dBHpsrNNP?BuiJOdh*@>q5@av95ni-t zvjQKGWxF}zLgrtoWP*X}Xd^Q{Dn{KBZDK~j_Rs!=#{&p@Swf|yU}E(8EH+31@a8z~ zmGLo%!+vToCnL})_w90Cr8y!f!y=?no8}0(v1?+37UW|G>O9|g=25fxVw|W1ae!2? zDIWarNVPLTkegPb?MK)_=P@@Z7+zoqWh&87PzdAIfo|LDMFQ!i%}10OnuhZXmgBQz z!)Hk5S2#vW7`oQNAIL-FA!cw+Xf_sdpZyi-A>Q}F+hi>vy~KC@5Fp^M^7T%M6%m|k zML5zypQ=;<SDu?tfB-pA%&~}q9L7fVLl%a(I+p`T#aie?16XXOvp@9A=0@BffQ;aihPf1Xr{{S z2bwMbwrU}}Yn&rJWGpPlI|{3WGoPF+Wj*j~MTVxhfqjsX3Zajf8Y*j?hHNxeCNm;c zs48L@5X^=f13)B5ay1o>>8*YOQ28Sj|Hg(n zyv>$u0R^VoENP_bYF91-Irfys9QqAg5X7A4HWPdSK}BQbLJGJ5f}S9v%?&|Wq0Oic z3&865Q5h!h!YC39ClaEuh$edEc`F9US~X65*?*-~z-Tp@#Z3VK)?I`37DkOiOQ*=& zU&zR_Y-Iyb0w{%tVQZv!!Km6m^%uq>EV+`$DYsiaDH;>10{-uwP@w?ql7NIE zGiJUO>JcDagK}vwhm=U`6wE;k+H_aU&oqE7(m) z5^U!wh@jwmLvlz^!1J^VDi#4 ziDNowv{%%Ei?4=FI&vfyHZt3YPJ0`QQz{{;pqe zC#Rh6$5@$Iw6({1i<8e-kWOQv>)vlGN9R~ty7FkxpYPPVnQ0iDg$tzGWu&_1VW5$Y zySs`zN(SR@SP8hlAc!wlqB+5N20WMvh~mHy=xRSnwsebp(^$+l>WoL;2_q|9;kBR3 zMl0Ea!=+zJw|3Pek}}V~k;s)wq+cHIuNl?iKUe!+BSv=}=i+3=J?h}2Mcx#D!t3`O z5b;Mq;}z!8+lXHjg*8a2P2ww9b5w-^Q+TQr?pU_>RaARSn59ms86!vv1uto5V`F`W zwt#$r`$NVBsC=3@PEN#l&%Rs(SRA>HA1TOH1-!1xUz zCe$8y(HE6N8O^cxpLvkUw~jS_sc<{o@KL`nnmzJO_|v_{2YS2Fe-{t^s)6nvZ zMdNE0*1JwuB}<8BS-JgnlBD8%=cwFG%=m(TGNdIgYB#ajFCot*QnG8~X9b~3X*Ci$ z(D1SInfL))iO2ZlbfzUovpm*bn34eS(wgQ0iZ5 zxic%=EWhsv1jKXT$lUJs-r)tAd^lldoFaLS-8AvV*m^ChWDmh37oCbij!pf#rI1N% zX+H={QI$~J5{u=9>_X#UN&aCWvrlh6KIbi{m~k(!V{@+Oo;q4pabIAyr#5YFO&5`y=(w-0= zs5#`{?~mK&C!I9xj*gpL0ZtoMJMQ`fX&$G(9-Cu8t>1W{ zzwgIDwhQOV%XV>{0935sWB7RP^R(VQd4FBrC?}5c!qE~Ip~VtSG=$||PLOzPY;0RR zmqi|tY&Rh>X9L^e{EobKpGa7C=Z^eb^V2n1+Z66Kt?T&e`-Y!_n9PF6|nLYiuO9hhNjbpO&jwsoasfc;q!$r1mSe*w)A*b)RNlPitxwKB|bA$e7 zHjHr4Q|-9}$_O@JDazK$T8mC&Ln5#JGnphe@7HxQpLbWfl;H2}xvD>(gu5KAa(bdh z7I?fWvlcpgrJ!ox2y)LDZ>yRDeid2AMveOKcK8n(F_zY>(S%l+bo)_qflnRQsi(UI zRF7>$S?_g7xdT=7);q&d)r1g}d6VeusYIJ{esSEmZTvF(7HIZ8I zYyTP}A?bBANlz7|?xTH8M7!FNMyF-^Dd?%*Ew93X^J)L*Mghx<8EygtaE$slC-C3| zoVl9VZW>*VEapj#hencgFKsV6$4SWPRJ1Y?TeDq*XI14>B@cBdHCy6xlq(~Ol3NBgTZ*9Y}YgjW}A z`F>DaP&z(b?Zo_$OrZP{UppHQddVFPn@)>@{A|3!4L|yfD!JoK9m%=#ciUgp@(O$)%=|Ep@exQ}jf&CUD?UI)(WC6RP)@8;0jg z>BBe+DtT@MY$yAfDG(yx!IW5{Ad2ucgBGVWD5|hur$v=)BHAsb($(G5>;gr7 z6w@Rj{8cp0N=#*|isw;NS+*~*GL2(r78^v=11>*dWZDO+ZlI$TX4Mk&7|%D4=RC@B z2$$|VjEZW=C7WdDhiwO|7^d+s>)3tWVYz9lOx}j(p1d{+uvQPx-1vVC-(Y!xKUZ!U z@~z~F^sm>-UYSU7_{ZRoI~N)@tQnwQs_o5Hr|Dw&VlLTetsdaQ+=sxB;a< z7KRgNU1qu9u{>J3wYwDLB#@75qNhX)7|H`>sk#(kGhF=js2wCcpGEEc-%aDF3~T_iwg2MyU~mx0w{Ca(21KhPuB6opQOlw z$w)0}!tf%fE#~x&hK%z3GWBi<^vqXJO6wTPJ%et@bvtBjdC5g_YBf zt=ej6NM#{0Zqm$@v{paIXAMQ~v#6rM`sj|?SnvWnCuYOn4q7&vf@2SLc%w2L+qBcj zoQXZ!Ig*%&C;X{AQqOxp0$7F?|zA?)z57vjFS2DJwxs?L5F*z z{N|zh_ou+gX43o~Mh+*$fjDDrt^RX#;@!*FLC%9)q+GnJF zzHp=LL5%S)p=L%bOqCpwcvQ_Pm1MV&H7Kr^H{rZJsxm(g-w5$|t&_AHo5;0h3D(&* zw1t1EbuVLtpa7QGgMK&%46*QRp19C1@zR`M5PJ?3oxy<>neS?Ex&pv_kc~=!3uH`a ztmV^;vZt~cx9&_K9Oxl!n9dR}gdrjetniULWn|}BOH`Ma@R>DBEJ~#Q@*pG&zuCOB zsHV>A{t&n9InkN5d1RXK1&_ndl_ z&+Z9AqHe@yu!$-!Y}qq+vpE4caJIPZsz3L?--c0bWQ1N;Q0nu7HY`*9oNMFegRx9r za?|7qZ`Wa;yE_Jb15{w-XmR%`Kv#+{cPqoF+$JuX9(Yw;3({y9&`*(>4lh80$pCAw zKUI=}DrsA4*zJq(!Cpq@xKNkIUyAHnU`0N~Z>IGa44q3~2-oQY<(GG7>Ti6`N?!-MFkXAqN9JBMx)Dy3 z^l|p`l}@*F;4b0)$=HJIepu{9%5bgQy^YAm^!^>w5!ot6vjr7))5yz)q1RUcbOK7o z`Y4~u(nlu1EJ;<#bZuj~QBW;0ylVO+$-81k)yY4lO}kaao&9?;B-A%t#I6>H{0&>L zXC?dAs1q4S>)0RKHqyu$(c-={H>isp=W3FbbeWjpNL){PR2^1t>PKs2e5)n}_a6XL zl&b!!u)-Mr6jMp;Szf;adg%^?%jYgnw(nVax{N<;lYY^8TWdqbmd&95Fc>a`mVe(C(McK&p zk*6)uKZZa)bI*p>rB_>fY7_rHd{BXaO*D0dxM!0?(jgL@1iWkis-s_dj8?!!0w~Qc z!fxn-WU_3yq1r`yc`TiK=;>s%7zuFFB=9Cy2uxBz`E={%a;bSr4EaHUAH+#BW}1tB zV~v@{7zKH?3WwDYJXvm`-aBp9B~~bk60qDuaLl91(6fljxkGzVb2^Q&VNxH;XvM=L z`!}vzDX=awsP*19-F`ZxtDZtmnF=A4nfl86O_j<{-U$>F^ES5FYty#nFfR#@GNjZy zgVQ}#L6&^jPnc!B~!P{9-ve^-5n*dRg_! z45!PQ%-Gmo5p~LbJzb))2w5`&%e2$Iw4)AVwU5Pi3Z#yoIhFjf^#lz$@lEGdvJ+P` zG%IQ?jaRQdvK_gI z|42@B&`q|=2zgO*CeMK;qDNS(CQW4H8VM0^i4XsxQuQK-0yWx}8_;ZhsGP*C$}I+J zssb;!g|CZ(k_6ewxhPGqIE*%yO%40xX#JFOwbMkpj97@OiGy{K2R-WDE7eI%2)5sF z9ggWnZ`x4gFrIJv|G(Y8silmR_ zkRp{5)8QN+g#$mg(V%lujoc|EB2!Q~*5(nAgR)=uRT|*tWeeyGE3GF|gE+C>r)JS@ zyGU^>CP?yYfXVIoXaeIn05iFUsM{!-Q<^=}a_6H}Uu0D~(?&H5{eNZh9H_Ab)+PNY zG74bNn^ler=A1JyT<;}@Z7#LLg0;IZsS|mm#;>r+;~G za}HPA(iK8t?G4xR%t_#y$2;6CFFEBX()*F@A~!9lzjRdgRR1e_Hhy0g7Ckt;8q#!P z8OpM`oq|qudyZ4xG6$mOgu@^YG-bkL;!agKFw_iHWW|+#P3`1ONA|mOYJ8d8}RytC(+8p>Qv;Xo8nw-Dz0k z_MaU7HD=9|#JE=N<)YmRKDgdDnANvVn7yBqmXh=qjNUIP5#6%GQ~QPf(4~fW*l@R_ zC3C=W<)XPO(u8$h4K6#>m2L77KT2Re)G4>uQDoMwXL* C^)RG)^ye;XyXf(iok5 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 FW)n=kI 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageFormats.xlsx b/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageFormats.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ecd11cac2be19fc67db678f6658d638738e74cb2 GIT binary patch literal 19429 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Loading/ChangingBasicTable.xlsx b/ClosedXML_Tests/Resource/Examples/Loading/ChangingBasicTable.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..891cfca49fcc24e18853e323d050b676853b8d43 GIT binary patch literal 6519 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/AddingDataSet.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/AddingDataSet.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..91e6370eedbbd924f7ff572750c40d58e8dc3d0b GIT binary patch literal 10679 zcmdsd2UJsAv~8p}>Afg~UPG_ad+#84<dK>;^r3VDTsB zO8@{H8UR29008{mL4KYvh`pyLgwNl@JuY!b2c3yL$|kC^zNXMvh;vhgs#-wX9ig46 zc^eUm`^q;+lu9PKVjf(q9SybgK133(J=hwl=q?rGl?W%AHq&uV;bgUa_@s8$`^KG* zt4ZbQcVAqSXnikP&we;}>ot73Ybq@k^KB@J-J)cr|D$X%;NqLD3_}e~f7q^Vn~I6n zqpyRC+`tnG+F8sSzMoE)C?$ys2rtVCZ@M@|)(Pv@A7E5>-sNxmP&~SD93+pcxs@C= z=7lGbN_gkBOxL92FsCo09cI7B@jlF=XEZJR*jb5H;A%U6@xA{-w1I~QqGHPE3x>g6J)zP- z0X}{pBN*!7>F5e|mInGDoOs27vNG2U!0vVk)ERIWS1&jt$^;6R2D%^+UXmaX+`$Fx zVF%~)^a4XsN1Qxi9(D-SPna{v%gzB}=L`l3^7D&=P**(10RD=}XcXWD{x^u8PEM{4 zU?oon9}h4T@f%>!uV(-mjqG5~V1zUfbRm&|jOvckKm!Ro5wMt(gSfqrgOISey&#Yg z^xx(h*dGCgI)WW}yGDDV_N7L(#`r%?L{~y zy~9=L$Jy3LvL|a#f?kARLpl$R9Y zy}{mbh$tP?$Mv~lXeeJlS(tyWCJv7QQ7KqNwbd}=u*j0jOZL;gl?P1^C0K@~DaZ~rV@^JkL&u&>SVUBY z3A`j2w4ybPlZ`FrvX#i#yTR|HUp1R-b!eUwN4vt6f`5IhK!38}rkwA9)YiQ>s#U9K zxwmQ8JsZ3yhEHw~nnA+@uUS~p!)8_LgT?BN$%bJ4uRbOuya4=q({gE5=2uZSO9{n1 zD1QIJ7tZJ(?tZ^6EK@5- zUGs~Zj6X|-?UOvlu6swp$W#A75Yb(~x3L2H^ZnUduoNb-eAdt0Lh63LU_zfpa!&O( zk-Zd7-gO<2ks(EBj z^HbPVP+Y#YMlb{E{`Kjhxn;kj+dUROgWg}ZKi&?>|7q}CPaZ~BiR`bF7;#FU*j@)bKh$R z6^|u!0D$&qTz-=B-=A}51U)oX1?^-c#+o;kub-UKAu~2sOXo40c@F4scId{!xF;G= zM;K7_LZO7)xTRE)O4Ce^e)|)8*Y_Ep7U_ft|MrX$+FO#C>~33EY@5ww z7xFkO)ar=TmwEX(E0q@X`yF}WB`IX`287BI3X8AB<`7KN``muUH;@)9D-`M+)5$s? zLK-}CfaN!rt%BHBt<*A6b$`IQO2$Hr%^<~sxqEH91jrsSC5E^7!Yn*-FM3^Y-m~Ax z;nqawQuoafW};yqb7?J z>TJ;^prj@DloMK_Akx-QPjz1^4D(1XrX;G7?7_^zA>S9l$R>#`OjW5@yoQ491J#%+ zjBsOqGu8&7m1@(&pym&gWi;aN#sOGnx7;U#!yyh?B1|6E5qX=LZgSIp4_}AVKKU3^ z6NhD96VE1Y#!Cr`&eO7A)At2Z6e~A=EUL<#L)X8~cNb&EKfDv)ST0-uICD9(H{O6N zV53_eS{sl#nQctE$)W3|Vll53?q_d!gJ2s*6K3iCFsb|*#-k4%vO94_XyH4UD?DR7 zi>wr}L<>W1vAjXjcuYz?Nb*IzghUHEHv*STa|&gouZw%JLAP9=`;mpg!w;2~E#k|{ z?W)O~R#Q$_)44+*+twH)?>6_`3pRRRiY-Nh@7b3x+?$|4ux$!vZlB9^F_~Z|k#2uW zJ(1l}y~@PwkSZQUO+D-~_?`TqH@e(X;;WJkl3u*k`-*IuYT>JUFZcM^M-O;o+Kr7| z#lEB#5b~G3pjX0KcTkPY4^nBp?i_OU%>NR z7?ZA`!Rf&9?Ui^7ThDLDQ1K=p8-3#w{`N^|@@9}Wcto=2a*96wXJ_XV%gr?_ifr@c zM}9Y5kU<|>nK5ZLgmUTxplhS}dn0`ZQokl<@yL$*4k|IFZ~*}7pNaWn?!sNbU<4dR za;PtXAMBQv{$6K>pS;J0wf{Iv_|%-s9HZ=2qG*^c?IfEw?cJ_;_uG`#9#nxvEgkWj zkp|*r^IS5+J8N6c>@p``*S0>qtt)9^=b|7B`kbJezoq}+ZuriZcUuUg$H!b=o%-sy z#DvlUqd@-9Cz;vb)81_I;22qt-g=zm!g<^8VdCXc;(i~-{^S(|>u!0zCAL1bQ&^G6 zD1T<@^(RNx9^Yw1CNwngAO$5k*A=P1#!1fvGHV+mnw+xd)O3Bc6_@ug%et|qj`Ek% z%eXzH!n<87#Tsnq$Dc;AyGnc=d0B1jH1_T3`&j6>^>Suf0P*4|hH3XZqOXo$u`SK% zD@|S{BWhnz+~2D4OF7tEE~rDF{~$8x98h z6r5W{1_$bcNH>*w3SB9kY)GO5lMc&Lc)n+)6j7;LE9oeNdM zmMai52+9yvRtGx1!C-9{)E`P4peG_QqXoZ|SVX56=tx?WB4z$8n2J7-okzce9pC32 zzYI_f_lot7$M6Q8EX^B@o-aNS{6bUQK5LB0B5Q@WMafO2XvXH% zM^?_5tR!x=d-ds04=>e@C?8CD^kto}z=q`Ni&=>y3vqcG5XLVt&1)3*&jBJQ27_Vxfm8-uZtm`X)RBpox zVBL5FXK#`v&My{Ia$8v`SUNzfoZRZ8iBL{6?RI=D)+`_z)Pli#^4HSiXVo@x{4V7xs%jHH zF8~mB_9*@aoqe565g+|cw+=btptPlv$-5>+7=@`Zj5QC(U$lw7Wx@VR0u>XHu?X2u z`i9ryf~&N%HZ;63IDCBblxH$WWDy_TbxTkphs7XoAUNMDtuK9`8N1P%w>foTEbo=_ zvf4tMJ=^qJngu!rB9gjm4nMm!m~U@wj;LdvsVvlWtASSljSfxv|@v-vKhzh z((=CQ5?fzz^`RX zTEi>djzJSWWJdmFvQN|bV;4+Zx;d@>GR>F48=E8 zsGu_c2j2NvM4YqFSqTw0B0$)|Pk{OAiPBsNK04!g4Zf!7IDX`~HuE%#hJn#=Pg_z0 zT9R!ZDSF{?Ywq&evA)rscqKP7uWX@m7-s8Oo z>g77&9r**{m_##GHrAXkg?C){@p2NW@^QohUMQb>w7qs58XA=?*p%e`;Ibl|94%`b zyLgSbQpI0634ORT@QeBzGt#gLUTm9sDckFm4gM8Dmwsj0iLVUq+y6Ps3jT&=IVgC; zOJl?$X>Q$E0=RyvTubG>E$(6m+Uu1_JxDVD@ zZ3IWE1_ja^+XTsY;L+e>smvs1fAr*yOX_oK(VImQ8p({+P8_)D(QbUftNsIe%j(`4 z%(I7lCSlB1|BSI*P&Rp zri|KhDw})7k*krim6oeKl!XArvhPqVi$t+3+(0Hf`eV6Wk7>9Di8GxW+DZ_UMc_Sv z0uyG`K#YNbyph1H_pZ{D_N@Aw3)jA1QT!~?!q&f@m)hb*6`FG*r%l6C+Vqrd=Ek06 zPZa209x~+DS+Xt}pU95l1JU1;?AZ)Kk*v-c$*!IZTq3onCA5Fa!r~Tth{iozcki7l zyg6;x{bV~S2(yAwJ7(dGWH*k3f4OUt{=;toCMi;|d zL=n-$X&EtHValvmJUosrB`GCCN-xt}^X-I2k$z1PzJE7TIwD`J^}Wf>t1ShF`@X4l z8b*UYT&$a1HFC^0g?Fnvu<_}0^HYtmBeS`b>Qr=IE;ZKV<*YxG@4Q)d*@2q6U*>Cs zSe#GlM$ppr=*)%;`atdB7C~LT#gOC5V9KmrytRYD0L(Y*hj<=uD$wG6CHNgZs-jc; zvmPgQ?jOhSUL}B9E}SlJNgu{GLfvE4cDf)8cXX$hdI$rv?(V3GZM0fTe3I#6UaZ`qcGX=9 z_ksu(!g#;a5F6OY_d-dYvEK6KPTR}3J<`#cnLWg)hwS3r3_J46b%bLwX!EaH+J5N5 zAPkO$CQv)-rr>1yI2sf@%~jGWoLrB5j-!2j8A*6te+iOOE2esS$D~C5^=N+pkSwH) zx;ucywro2Kh;7;P^&7!@;hv7iS|qC^{u=Mc;?kzH_016$cP=AkW!kx zJ$a<;()A#F8M2C*F3}@+@48bYxV&=EA0$+X;VD;u&NxcPDWjEDz(OJj2~W1oe7xEZ zj>o>m6ZdS1e&=M5u1__VI_T%RW~!MA2+u0_klIjqT3_5Z0w{O|?;@Pa+*b;Sd8*zPo|C zm2ntXnb}Esb$BvP?KILt)8r_0dJP!3QRk=~LfYt*XE8>K(=qx#u%t!&V@aFIv1r4J zVq3}Iv+daw`HO7_PVS+du`SClY+L^q+bV9W6a?TQ}6^4S(3*vni}IMnqe z=+IRc@sz?Zv0$lu50ULlm}z;u>TOH4n_qvcQ*aNKAKjVXSOAMW?pE$HLjq=jIAurVzoAm(2x#S$$FR~aFzcsCUqSB z3K@2mNEHWxuOR$Of@QA^**bA`IXaB($VKT22etqYg%%>G2`T>A_lpK^p?zt1gPgc< zu3<;2y&!~IVIe_C!*6Q(`STP_ew<>Hu!#0NSuc1zR+u!=QyhQF{ z*17WfbR0a=EN+bZE!Gt+u4L3kuieXt-N&WMHg9R$>Zw<^xG8!zzu%g|z)BOA;>PG4 zxS#WeG)x{dR;8MvA>RE;0fErUh6?9R^ldsbzU4}DrZG~iq|*Lo;`eLzH~=#6Q!lnYnhX$;c}F?H;+FT+T8qBgH{sLOO-2& z+dj>7x?jgzLXr=l-lIgYlx(X!>n!7^Dv1nSnr1XFq0tvmasOK$h zPsyj4>xj1SIPf3#e%kw<{sKEJgWLSpbDBs>*gg20rGj^;HH&3?alo=^FV!B<>*`Xc z!OrnR4x&{7N8j`!QBlV9(m(>VgkVyVsD1ie5(5>#1cQOr=5aF1-4cbb93Sn>KWC6I zJb{(c2}c5Wy_Cm!i8kkyrH3^zHxd=;@VGIm4T>Yp=AOr|;oV*_UrMCNudl?@ppd?f zGXi^VM2yJgkH;bdf;mSS^2>&!q4pg5D>Rh@l=+t_Vum&H>-pD|*9mjKpwsuP+!*8F z2!Ed@)O$Vlpn+>LVg{n}m5EWjH2%m+W1NQS`}c98{uJer!ERUM`j2q6LQ@KeO1`-b z`KO2WEtjRJEgmVEqMa5-1z?X9N*AP@7Vz1OuiR}qilKPnD>97lRpwtVO3>M_c#taS zn@1V@F1Z+?Ii<^{NG;5un9A^R36S+@mnRQY>B`(bfo+6|eJNf(9-?$8xU#894#&NR z`zX1w@xB57``FrQeAc$A>6H}6=dQEDLMp{;0|k$ZovO+kR#(I**4TPQRvI_)0ya$t zo=^ngIa6Y>6QevuI^Xx#Hwl(2@%ij~i}O)xh#sc&*pCQr9r#6a1(m_S3+O`-_t2 zKK91sQ>CO+G6}X5rV+*#RyjP+0@rcKA!5^nyI${nioLeOov6_jOZ>bCgZv$KjogMH zlLya+C~!Z%dE!wQ*`-j*z!MQUs0B_C)Q2h*ULKYP(e-~E%eo;f_AbOIVHy_MhtRlY zERgIsCLv?0M30feEbIiYN|1-=)Yy(jYD{U+K4S2Pk6jUyZYC`HWQY8~ZpEI_eMtwB zYF(ZghdWmz#Hv-1XH%wtY<1P#qxYzKhCFq;t7GHu>!LGQNRv&3p(3fTAx z40K$(`^eM1ccs{FN5<^~Kf6$gbM*FWe8fk$B+Q=GJr+2)eY$F>pC#oiBf4BbO86;; z8;TayVz;MVE53x4ZBjuI7I*NC&Wiw~rWPX4^r*uDN#o!3l?h+(=6Ymm5W7S&V+&8p z8|oSzY%=ex$r)*fm9SpS)}bZW_N5`Ngvl>!9{$%n%n0juOS;~_GPADywv4#3BG8i7 z+I)B@gY!O2Y9gC6^CWs3V12ngK9Z37q2T46iSwEo0Qih*Wk7O0*_%cc3qRiaD4zc> z*Hiz!fd50}{h==ZRGoh+_>ztee@X6MJ}~z)$==Zc1a?O~i=e2DYymz25b&>a5n!0d zx$6ISgR>)lo#_vE{R`I5&yUYf=nNRu10VppuB~Nw)-J&73WX!=pbp?a@c**-x7`H) zC|}E5b96X!NYViYwnKm&8Bq>NBF_2?{ybtTq^M-10+bQt7v$&V7vU8YHWCn%6q1k> z6yp;R6_XGb7c##F`t$5RaL$1}Q0);;uK$n7;(Vy935tmc{tfw0Aen1tD*X8k`kVay zBawP6nPg2-Ni>M{vtY1L^n{{X2@p0v+9u#uKh|YKY1%rS{KQceqycyBzp5(Wh-{)w zDX=z#RnAJ&l0c4;`R27^Y@kG>rVW<7Pc;9+80vg-c! z{3V`OKV->?!ot?dy0XuIzmhN!&&{XA{<3`oIj{ulsn$DeFQby+8qyCU!%B&6e9nwm zEpv@}b4=nq-i7Twg^K8I%DGZJan*~ZpJwv7*c4sjlGVUfh;R5s`#v7zE)|sN zD*kvRMLL%O)9Gtz7OwBiC@J3yGS|4uu79`j&Ki_15nwuw#OZURIKk4FQJ?`DGt(Zn zy&JVwF3iv9zf=D@xgd|ecsvusbx*N6GA`uuxB6{kZUbiK^}tw!3#sgZ)6Lg&t{9WN z^t1Amvr#v9y&teA_iCQ@^3{E7j?D{VX`Y3-lbIpjvtT_+?3yP}rhcG6+Igym_MtTN zbHHKdprA!Tuix0=Wj)PHXyiZC>woA@Le1*G{at7=IXC`&E6%y49_r@)tug1^@b~Qx z=Y|xhhKP&J5Erd4>hR~*{iq`JcdGnFgo}#xIl>|;BT)$dpkH6axhUwKM7D&r$eMD~t;R`z^x7?XGi#XjJc`&(cE0&_ z(WQ$!O6P!n6c+){26nc#yNGge!F`VM0HwTM7}#$SF0L)l5x&q|^y6;>J6~yDbm`*q z?Hq6k)z0z5r3;I>bAaF11?K<*jQ+c7vH=hS4- zGc`2ia{qamkwtpCCVE=2*6-$eM1HUf{R$<_Id^Q9h8Az180tyutzT?sz5j*(UZGZQ zh)k~9`qdnxQ0AIi!TLKV_YDeF3r0pj0;9%=v$k~KvHr=(;P7->GG9Bx+#BQ&$G1Q{ zV$JA#F}giIA?>YUeZ&q0oIk9i>`j8j=DONK@@(-?8CJ8vuw81?KO+V>j2JGbcsiRH05~|P2@!Kb zBYiPoiG$D2O|8mmgsAZZBheTyf0POcDggoUAW^RVZeA!46;Ke?U0fcdrm74_`XaD| z78p;j01OYo1cgxnd1A2vieNCt)f4H5z)1K9AW?)f?*3>$1eWj5fA;*kdES4|%C&;aCrqUi7L?&XTq_IC~PL!z+15eEO-0>opEKzksuDj@K&Q~~iA zxT%2PNO?I~S!o%Bo4ll(w3|HP_QC&et|3FPNR%7WO*{Zi2o@Uag~a^BKR16@Q^Nlk zFd`t}AeVnSh&FJ8{_lPI_YMI2A+ZQI1Qr2y^+zLr@6lh@7$iEF5OvJI+JL2{B<1AY zk=^sEDbpZREnB$@<<8<|HfRDRbwX5fR=?7xjrv zH9g?{j1N1Taj-721p!!@tg~4Z^$y>29iV_)q$dcLW3ArfFwOYfX<;IRb9ZQBH&XR3c{@HIIne&t#JAKUFz8p!M4`nveMluhD=@60UWTu0&7tJuW$ zr!e(X!#Ueo-~I0LWLUn>ia9xC;q4+4LgaCgrZ@Cm9-`LP*q*rJiD5%^;!~h5ka9#e z362%-N4T|z=gr&c~Lx9~JWQmrGJ`p==(Zh5kkIJI-uwO1FHn{NZRtX|ceU)mF@ zfxnyWB;MzrP@KG$_oy%NyY0jt{R+viJ(A0=JF`IO32j1IA(ZEXLX7c5ppkCpuxLW< zz#L@oh3gKmPIa1y3i!fQPUBU5uO_=cWi>p;Qs1rMZ5DiV%D(BP$@%=UBma3h- zAGH(qT^cPsf!voObu2D*%(x6+8E7+@xTQDtz$%RM!5qiRcBe=ksqBo-%hcB^%842G zZ$jo^9A4EaNh2TJriOy=-3Yo+@j;LTR;*~xxOathvKCjL@JZU`x>{RS3%~E}m~~Q` zkIp4p&^)k~O{pZ?NI6u!X@NQI_Mm<_$)08A!;W{TvsW;8_`WggEC;(8|wAhrWu zXBt=xZwddfHB7!@pv}@6uuJr7Xt;aUw@`$zj8FmqC;vMz>cDite)(C%tU=~u_Xc69Imci`4%)b8M z#~1L83ZKdJlwOFRlWgyOM5fDwv4Gg{*GtVmvf2u7`Y>9?CjVvxKyGu{cl1J(k873; zub<|kSnZdDnMlOqH!60C%E`=LW^E#VGv)Ee2m*s$1peqcP^yMFI@@o*I?UhOVC(|f9<>vkO8G@hBZKplLr zr*AR*sd|s^jvc({L#2I-{G3j^UW%~8m^*idXv96|YIw?eQ`e0P=F_DVN^I2rJ^9kz zNt!fYtdM-|Z!!LGS`y4QZJ8>AE!o+?duPm-0u zFwA_(zIV)Uq0PByUK2_9e(&y;`9wQs{~x<3`9_ccXTyC+`zR`9HQX3E zsMvKf)r|U+hsU1%>Y@WM+jj0Q?xH6?{6i}r8QY3fPAwF*I7GcM*t4nhYhph4`^LXU zNKB;@008UH#5@?S7*8Y;iy@RX!WZbXK%JE(x=P-yV-m+TX>8p&PwIzv!pC!}~hcglI`b zU^dXIteBRPR^yIge2;r$#zzggv@8HQrHaL)N@(#d-DC-l2?muEF5s8)j8cAb&6+qj zhes(A$niS!n?kX(Ab1)hN$Q8oL5iFsvbko%IR$sn0=A!?+IDDrt~R{&LEd^Omwn=V z8Szw|xS7dfTCYrH%w!@*t#|zL)dj(!ftk3-b4|>V1>eM!IZSTE7;-$kDAo8{$;{bm z!SOi-hrQ(^$lK&8u7Gy|ZMHf-FEJRt(diE}0^AG2{5X;sw(33ss!e^ElV?a|CnX;^o-(9`>;zgGGr$QmW@0qK(l*;ajZ)yXsqMJ+nPLhLFeb9`C zHc3V?Of0fkDKnWbgd}B!$l$Gh?CKo_SPIW0ccBv*vEC9F7D9SW=L`aG@=ZNS25~Ap z<`aHjuC7qo$Ct*p+ZKqu$v62VnU~Wwn@{VFu_>+C2J3vcYJd?fW-d$~z0#!Fy1l`< ztz|k#mK9eju|ap{*%gC0l`~|Gd|MezH`Ts!JLZ)L$HANR3|yJ`&*Lr!#ht*sYUp5< zhF5tA)4Zb=x@B(WWRVBsuzbAin|DUDY;(^t&O$A36W`6%#AP#-t6j#rgtjHoP*#j0 zvwHk-tF0R~*?fb1z=31lF}sxaUQx7HUFeYIPDa*aYQ>jkLA|%%eW?{ZU0+?sYCo1O zI`1aZz}(6%QXX-J2Ed^H#sT1nKTo-VfvaZ6ek@0HSw+E4d2o0W&xiBch1~#X@{+~$ z#=+ql=Fq9Yb?y7@S#=lRDQ}H)y&AI&JaH@4ufyY0dJl>=j zn3W#DK|jE47-eGN(260=>@9Mx=>gpxHWA>h2-8mX2tGR<7EOI`pO*=HX-!&#E{Bao z5%p;ASV-|$arQDo#bF_YmG8e*o}UYcqxy5WY)BZ?pz46olfAefJw90y1$tS{AvXmB z(+_*G`=(yM10P)I;0q-qX{?;-nD5))aK8Or&#Zs8t$glM?d2zmy^+buwXbvoZ@Sb? zXjw1|vTGY9yzpVMR)j`saThA_kdF@wX}WV|reR+vfr^Jjv6_z2pf_`P+TA)L!&DhL zz5T1T%hh)Z(}(p1_9CEh8|rQB?|?eA@^qhH3EFrVkXqJphEJg)5jHdLTh_^bt+PQ@ z$&Pho06-H50KoY3Zn1>DBNBZ0d6++|Hpc!OI;?x5g)Qg8c3+(-wR@U4rFlyhW@MH$ z`z-|baXjZ$pL~h`JrxiyFV*{~&IA%-ks1byxGiWTNC>`1{J9Smj9Zy{onHbt#l3sT%5guL*K;j(p zC&ftknq`@Q3TxLoLy`e0=A4A)gFMll3GEp^XNHHig^r&`G>!NubmY%CEDm5{Dp9&w zMX6A3$W~n12+3(iiY%EbA(~)G%(o=_ZdJx5`bXs?Xn`G1?bAXOP%)qpHm4CUe=qnO zOuW#gG^$=*UOM+&N1BVI53A<8BqW)9dRXh*^12L4Duygk(pxQ#6)j$jtmZF$%jkVal*(2w8#|jCJZkaQ@^6~{ zJVr{MF0CX=`lR<(&TEE94YGLMN5J|--_r#&Qu8ai!WT)taM(!9Roe0nGms~jK5wF* zUUZ=ZFd`p#Mib!0xfP=Fq$gE*WBP4&q%6fRp(f>tUV-}Oqq<6$n^|0~c@!4r@O6TN zxdo|f_g!P4;%ywZ1+Zu5eV{dl040eB$Enr$VQT zKdOmK;<{OK)$pt1sVq+6JKJ(eyjXDT7;qVDC5?Tp71kvBzcFE_JAGox={Ue6Z1Axxq6?Zu&U zR^2QcpaAaKC-Al1A|bj3s9SKx9a&kPjM6X~;-m`ONxh z3$1`Yy7{(FOv^pEFkOdx>z2#(u=SC6@@t&1yQ0#qL22L zj7_qiUYnxxwDdJmEZ#V z!b4ow&At15MmHb!15bQ>ec!J(x>K{1OYBl~pAj-i(hQ|pcyd4m%<=r=aMpQgxi^29 zCrzNEd$2HN3up>%SV7fFo0Bw^Pud+*m85~msdgTUhK<44?{bA;hEL0>G|}E!M&LgP zItbo;N_5sI&9OW);l$f&DSo4hJf|{Ee5;q?2B%-uL;Sw`wX;qk!JcRP3fZ#hNOcuW znrK->W=xabN1WFp5~SjzVY+nJ?j||ZNDbkG>_Oy5^Bbi^EmC;r{?IqQcV2`(dZlFK z}j*7Om?B0SN0dqnPn+? zsLIY2Fwic?iK2*OS`Zt?HS)9M*_IW+$b`)w904?7ef>W)c<*+&;@Ltvzw=U?UR;V! z3l~&K;b{>|ea%{ZmVz-bYjje@bw0A2thImEt9`a#Bx&^9qF;!zpABu@dP(Q>3meDE zA9L9A^U#*`)~2m3Rm$l|rB~U)nR~Hc0FEcy6QgNaizH93y=n#gRp);qM=nHV=LBI! zJ2=b;b^iaHBmL*#@&IlfP_>`5?I*cZbaVY1H3kHseGgHkn=2UUOPGsLgcUzj0tyEG z-4=^P`yJ8Fe;OQ~`MYHZ#_Mlc91bUelR6Y8uumx1+SusaAtn{~LSe87lq>R2{l6{# zQ;Pbp*iKd1&GpbBMOQQufknFU5FAp(9&**c&R9ulX`AbUR3#yj5OIi%xTLf>R8A2B zRfH%=$jC`4NJ=W$Due%O{in{6upa>nyLfW_T%;% zw$>&jQ9bF;1%sWIKZ<}*u}%lL7~^oTCo4-cJRpCUD;PrUo}z4cqO*dDeDfLX+s0Bm zy?3rZ6JH&-4meZZHljhss~zD!o2(+W|9zXcRkgM6hSDU^?y6_={jqox8=|wJe)i|8 zj7xi|Ywi2EH;F3q;8%b?=csOI=6Scn=2RmJjaCcOV~eX!X_VIZs%IPDUDOP{(N-kM zB|YYH@np>#Y)Sq25IU(S*wX%65QX_uH_99{Ni$pDoIPUU3l1D)6ZaE}m=k%UM#hNG zOs;V@q<0xVtlY|A%YV|UF^zj#A~ovlL%bJF=~+Xye@TctpCckT0gUNRzln;W{MKmRAJo%9#CB{N(|7fg$nj%0@CIQo^e1qT#!F&~(HGYP zbCgWyAROaQ&Hj*dKGUQ3aPmr(vD=Ua$yaf8wc7)Ol6nQ*`!C*~G&Lk5W;&pF|MHN9 zFogf{I>ynDjDP>U;mA^w(3Ago`fz0Ud&YZY_?B-;F>$vH05OHK`L3L>QTP$&0<@i4BNF|(r-3X!h zZ@aeR3dgr4M+$?q$Nl*2Cgr%`@s?GDU2>9l?qb2g!6CriS1^{6=Rz}-xdjLJ`8FIJ z8XOUvlR41Q%J#W|mDO_wCku133_LiRw6Deg>rY5Ti{)){bU)pf)+Gf61$~{PtXt_i z2~=!H!Hkba?y)!LyH$~#i@CjQ&HpVVgpY~Q_4gb^GXsz_c{H zrc+{a4C3!*^$pSh{p00YBRHfZ4%hN;D{r+vhPN)C3K9okh0Zn*EH|_vN60O3;X2re z=|%f`kh|iRRx)9c$k7JdTM5=TyWjWaF7x72ui_Y>!nOYV35$F*)>V%*#NMQMC{v}M zV@uQgfJJ2i>tPf!X*|9pnqP4n%!qeBIk8i(CTu|@R z_eCv9mz>5^amy&uTc}oMQxG|&X?@n!o$A+@hJ~c2RyzA!QDLam!Q*aYoKYq#k9QZg ztotoFShpbEH1gMO*&{l!N`iIC*B3IZTXb!~<`5vm*Y|(cB|Gn$cm=+8n*-PuVrpf{ z2Vi1g1dxF(4Xr??md1Pldpjd~PJjSEuL9Uy-wsv+Vq$6yA%mG%LihkCc6Qd>Kp@1> z1Z<%XVX(3WTf&|gS=n0X+rd8C8UwBM4WH{9gMrM9jO;*IG=E?Ke#RtIa<&HlD~MJ` zMy7^fVJky>3$Uf#p8x}YE&(7@(zi7R+wlQ_zl>D?nK+0Kpa5oMV+6B-8CeWj*jU+( zSOH|f|FzJ-PIh2R5Ew*nZ3}BGTRT%QI# z0H6ifP9LOirw=r=vIYNnME|gcfNdRMtq%E18z4KZ^|;s>IhYMtSXsd=`kaOaMj#GG zE`1Jmb|z*HE(U9e1<26)_ck{$WM|k&Uz^_%qw1WDx%IY@a?v-qWBO)`o*yxz#SiR zW&&+yFgP39#K6JjRQD0{?0TbxpoK=x_^k1n#tHAhfs&+`KKqrrq;W$?#7q%o)^DGa zR9(Z}ZmV;K5c1~-7-a)evcwjtCU(`bNX(#CMSyKVrA2yQhm>cOGLqpY#Ln0x`Od}_ zSTe{y(N33q=D;dEIbZuq4twlh{^lbre@7n{Z$H5!rB#h|&27!ACa@PK#ae_LC$BL&Af-A$Wp{ zh4d+qZR9zLKylND7iq4EB!&Dnmkjf(yDbIQBP+Yf9?5m{x~mYwqEyanl%Gez@X1C1 z05$@4tKs0VzRf-m6Mb7SNYTy~maiaxHwA6Y%v(;gW8L5Va_faZ%dFj<;Zs=yYUCv> zK~KGV+-Yh)M+vbeLC7Lz6xdxaDz!Hwj*)mGKT_iB2?@&ERW#{L#E1|RyTy8Nsh)os zXzHJzQBBy+I_ODIXXhp|qL8*k2FJcFL<}0wolFcm_`NfziFDJ%=vmsVnJ&i*{;g}}IyN_@msyVr5_`-wyCj9g%}fiU?)8Bg2!OP!8?Iii zf?H+&aUE76XdK5q31rf{^RlRG%l;OW0?}jlkoNiOH?!#K_mzZpX)VuV)aE+>)0J}Axhmg= z?oo}$DC`3@@U;9~HTk%NdrS8y%VRX^N?G=cD&MTas6BA!T{RcV6h|zhmf6+%aPr_= zbB1~lEvRbp^Yw%)F9Dxxv!~iKORiM#_;}m)d>e^lU%a`BE@BZ>hHq2tmBjjy(Ll`? z^Ia>G!mivsA_Kx0PQJ z#e+5z#Y^(rFyb1cek6*&1L>wlg=X}IF!gzHF~+$r=`r*Zd}=u%@!xI1+j!rNmwNRR?m+Yy&e~hFqH7Vq8+W{J`)*4EQIvw{q4rXya>fU- z_?x2kdetst!b9YtGK_!WxZ}I=PmV3a{A-8C<^j=PdO_7!m#~_l4xswk@0knChpW!kiE+qH*DAC zuCX8Z8J=IKW@#Otg1VcUy>?S2jH)eNAWgaZ8FCxPa8cQ#x2B%B_n%vd4=R|@k83;5 zNR7t~BB}B zWo?i%rkIJiVrWM|8mFWv&ck-8zOOpTlBChacB>9 zX9g-uh)re&qg_!&K6gG2I3?$$odAocabR2Dk_U$L$3txX*Bh)EIRf6GLFixV?pBwKlP$Xf>QGJ-nMdOn^<~;RYBG1w16UeAq@Li^1qbXS z2y;!UOwdyPv$mvK5#@QD*G zT~Fd|2K&oxgp}lz2VD{+c(s;@L(OD0+$2a7X0xOZvwC9f)V2artRW>hc9+eX0hfW|0xkm zT{!FM^BMW7eaHQ>sWhRq)&*ZtgT0+VN&tbQjhLvcye$Hj!pC^Dga~lo)t@#)KOx**a0#ciP}y zZtH)(KDDa&u~*aNT&bnmZ9ql!gQei|%odgdUBh^wfrXoG9$ROTU+6AMvnnksZRI?& zw&3OREvab7EZY|PBD$q$^!t1x1Inol>l+6ga(q)bqcr6xZYz^bNalH&!8l=pY1onc z33Zz?Q|K}jMuYsBZ1l5ZTd~x46CRu=4o*-rx$%k3%;V*<(3EKT=g=au2%an(Y@L@W zC5#nF79M6h!y40!a>bFuK;{`-9Spt-?czqtluwjc~QraYmB6#B?5AUn9Cr}??hl&#JMx8gxwa$hA^sNx!7;h#gT0jYGRLr!oHdmJ@pm=JrL}~ zq*J(Rsb0N-=C6WQ*qqXvsUSOc8Ubu`@+7vbaaa$pAVL~LfaFf?48D2oV8cvlcS5S9 z#hr{jU3VS3nxo}My=US;kc((B1Qqc_PGFnL+h{4lYii@ASSJ%l6NhH*F@>*bM}Alg z#5Y1wvhci8drrj`g42z_|~mwdxKfBwiK^Ae2K#4hpiBSkWCU~boATUv6(w_Hc2^$XC1xzag;UQMO9J1jH-~iLL@$9mPaVZ+K(_^#>`g^xywU_4 z#~Nd;*~$*aG71>uel!K;k_%A!?CR;>y$>l2pes4sPnu6cd%JT2(?8ZJ#ca(+rz>Hs zee%o;FHHKZQHuMX$5iLM^5Z6-A0JW;*yLPtgU9fiNxk8hNdPaye=_L~99%#0UygL< zzZ>Z>vGcZ>>{y+;FBcor9$q2JCMBB>+f~n63}=08Pzg3?z15DuC38G_oDnvnn)d{d zhRVXGD!TM3_hGVZ*J>)Mhpwwr(W9N0-JwB7pPzcVhOzO;??OwD!pyEQ_XMMdo2 z_#G(?dp?q~&Wc)ID!g&P^qVaPv2EQRDi>{*$K9-06FxoFt zS!unaF0wk=%Cuy4uug?pBWj8P4-V7Q)t|lp$+KJD! zJ`Z<=_ttuu0@~7Hz@!PryM7s^r(r z0q2RoHMcWAFvmYlzGVv6%`FBZAG+J^jS$HyIpE)pgCUEK@g(I*Js`4ODAJjNtJS9J zcBFrv>nO^u-x4fu|oalIKZ5 zu~~AwBIGE?12QVlp@b;>2IMGbanFbEGtKXTS%Fg9qtFnWicY3XXMJ0%9i9i11U+jy z@tcJ3@lP-==dlrTBe_N<2=h$@!k3oC6^}Ki?9NRy7u)hLFO;th^1yYc4s917z*8S} z9vo<&4beno_Qpn!i{kT0lxNj5^|Z@FC3{jsnC+uIW3#G76KWOIBCiax+GCa|*Qp=& zX`5D1T$*PskYKkMjPll1N{lqxp19z@i)Hf_;s$WCRh$(=LYgI*rgfu8Q@W(MdcgAM| zx9mYQYuEGHrt!T`0vudjF(k(Q+@tY0qZ~?cg=k+})g;WW7sOXiwl$Mzeg19%tAKvGVNz%KW`}o4z zd9RM2?s6tZC?3w;q^@$#H=Ak8rE;SxJI@*SjSB0oMXp^R%7Y{KYzLlNY!0&*c_M}? zchf=HA{{7?$70I2gmRBvLN&(CT7t-5)s-8t#Ys>2bM(%AzEUQZq9n8_@!6Ie*J^UZ zis5dZYqePt+?HgKDr5kv%niKs75nlQp<=?K^-;ZhMSSK}g<#+Evp8Y z0NJtYMTZGgUzJzH0!mOpVgW>4>CLgp{CvnjT5KP>ai6aLsyt54j4wqGtpviw(Ccc6 z2hT0hlI4#$kQc;1n4#wi$`CLuCp^YXm+?&z#vlSmFRR-&B0vC}4G7{)A8>^+cp{uI z1b+j+ia2zQXb+(H_Pb!PA5;`w(OYpl zY5JU(nhSW0df-VAj4W8jd(=v~RN@vm0|YcMoGAiU2cHKqlO`)Sl$mU1t`nWV6~QF! zgAQs2@hk2W4^k+^`1HQ|SXQKW2bJFGtHJjMs_2BpL<`lye;i8D7o| zPX@c$7p5|ECzj6>e_jplhi>+lxeu?I4{sBHHV)}G+Cu9(H#K}~`og*}m4iL8`q>8z z0ju7DX|oz-#V{6~N|g_tGnG#raib+Z?Bp}m*ZIxKn&@jjG+_&wxiT*IZA2xIdGYR8 z14lQ_>vN|HlJA+0>xv6duo{Es)dLYX!NDr~@;jMRdq?8pUb=BR%tznz9jUfae>O9F~8(y_lV7?^-1=D8^5o{9Vf=JJr*Rh|2&aUR!KtI*jG zgVX~(y~!kKwCD*`W`*`2Lvo+GRCT2apKl*S!5%|UQ_Glg#1zK<7Z5Sc=ed`b9OFd< z%Tk9~qPz|xM&UTQ(29>;hN=ZIb` zJ)g}^JMn=c{&;ZSK-G@ukzV8(?}K62Gxei$@5<~F0ONj4Q-Hf||JB(98()`;QqGUd1FVw)^aNv5Tb{OoowtPTGwQ;Jw z)lciC^$OsU8HdUs#2M7qfm1^!x0p)OFzf51O3oY9R)DfwPZrFCiteL|in<87&nu%_ zRkDOEqt-9Do2Q?*`t<#P>ZvA{Ds!u_&I&ks2OIwJa)}sfm70uPq@cQye0?>MZ{SPp zffk%0L_ubq71sWfe4j!4QUK3{!Ml92*Uer0W<0xfK7)>>0Nx1$-ewLWc-H}u82CA7 zbcwJcF|;Z*G|%7qYxU%}yiQ1bmkb{*`Orh}h#~@!UGHWfI-Lm82vh+CCJY4hyqA?g zB1#?$m+)eX(b7E4NNSk#rcRFr#! z@f9-nI66%*PZwY5mvvlW5gN~bN|GAC@C#YHnEK5?&sm{K60*T)SrQtLPf2+d)rq@6 zts+~}_RONJ5ghwvp+}4QSy54H^jYFUY7C!jHw87A-%&Sahmh$5SePjYJkVgHPvC}s zZ8GW<7L$dD6Y#R8lL+l>4(qI;Fm<~VT2l44CuRt5eYo>^$@x_SNo*&{Bch|c-488z z7S>~S2O}SV`L#Jv#p^ZO<3}p|#~XqKJk*u^VaL+r7nhQsjtPIJF)j1%vI~sHZ~mIb zZ2uyS{dDiy=%RJ$`8-<4u)z2cNZ%PJzzS8);HOoE|)b)BVKDEu``r^gG zHh3+{7z~vO^T!g4{ej22`G>PxeIKqe`aaIkfidg#lTM)FRbw(=W-W^~+1|fi6Ay9P z%IhPe_xqj4Vc&S10CqK20@Alas}iAy30q*vDraU1b{QCtL0@?sv1&xx%RFK{?U?Dp z*zHPk-?Xt&wV_eZV*PXb>h_2RN7=iE$$K0e#B|!n0HzHmu^l}R_|~F#3||Tq_7s)?!<8x*YaJqYol?W;0)7}ja~9e6UUfcv|4xbXUOJrGZ>1fp zo=mNf7SrFb7eY`?XgrG%CYJ2w6w2{Xg~RxrntTS$CIc5+sJbxm)1yBY1|#jJz^AX5 zVSn_YFZKtuKEVQ<-}OA*GxJCcT)yfUsg;aBof5O1MBJD17itlU0lSyJIzuj+#Z?#|sNKYUWP-ML4^kdb+z0|5u z0;0+)ewxX|W!>m+WNx&ZkG3L{Ut#W%>nMlL)v$&%276SQ)ptn@-wkRP(((_DbBzkT z&>53;G(2#eR$u8c3AQV@*-@VN7;GC}G<=y!g6%GZmx&@O%^}-xk)Ke&3cQT^xM^JI zx;g5@>L6q0MzWQ7eD;O9YwP-FE?28jj#I!knMCgX<&@0+w_H}5h8-$DxWsPT2_n8@ zTAe07gdB)65uQdrW;~i>kzQ^hXP10Deq1U$1q_Z%%E7;HE(=Z1YikR-_}n${_CVV> z(wHoFsCfA7u`FgOrOFh0f!)G+Ti2nhTa{+0m~8RA1z`rY>MZ3c=93SPAzudnoirbW?PlzGjUNpEJ^0^jk#>h>1~e*E!nhuvJ94pLdB^Z9i3gv z?nKVgA)Kn{n)J_D4O-qU@@A4Jp_;Q5L`0M4k9q2}OyxITM4*op92zv%2kR@2IHF|o z2nFo)K3s}|*UeW>ARQvntwCIQRe@y2hS%7!$0B8hqnLsblGrGoYcV+aM*B3hZb_x^ zY*R5J70b3`FUSkF7e!=v!YD%Y9w5#Xfn`O}v7|fx)+avgN~3Jw(^`s#y+U;?pz?7m zmc&lu?$r}o<=O=gozz~wX~?oGa>K=Q6C13Am#+SP+aiZq^j7Dk65>Hwxf z7uHhcb_QCT(hJM#d3X5F^FNO|`?3g~0@y*yJ3=@(%x_zpb}-=#7e6A; z!gyDY9?olai6uNo&V4T$N0Wmr`Z5Vefq}GTW z!`W5pVUuCs$g;w8o%gfj2!-L0}_ z|7Hr1LxalmN%EYCmjI&3PpZoe8LWJVwgL99f?h~9|hib8nEZN4qD1nY8NZw8G?L=x3t)8~$ z=(!u>omML}SX`N)dBiOEmdsk!V$Jf%rHI)}6TLzO;l3)nMjxd&7B(Y+wCaL5CbXrjYQtxF4={Wp;&ykzDF!)CWA&&2>HM z%k^+O`tAH+a=awPRY#D_-h00B`gA;1px_A|@!5V*Zj*q=`ThsltJC8E#3ssJu`V=I zF^amUs6!-Zm|q?M-iswgfbjG*04=wkNWX7Hl6cPp=?!jXp#8F&;#s99JQvSLv;L0s z)$0tZwKr{W^kHpVDfsndRlvw_}_j?n8DJFZrR%+FgmzI3(|F%uaa^sVr8ES?q(z zo@&Ml8p!?4QfDrfoz1V!tDa_Rfuf)ON;qG7@KyoW!)owU9pxGyNwZO%SipWd zKkCB1unyuHa+1!&mQjDDdtYva3Wi1n?t(j~<7l85sF*602Z!boEf;nJeQ42eU1t7a zxL-ns#aWD_i(TIYnNd6*!yd2MuUbmFXDjU-s!2ZJ*1)TIKs$23wL9@nuJXW0G>H)? z$w}aoHAXTdEc(H2JSg3^w~8~w-ff(J);^&=q;tAQlUk*&*(m1839q-ZCQ59BM)G62 zl0kAB=$JOLGv~G%CSLslbFf#slm>>8`$!pYj5@^30ywP|ktS0#1&s_>6RQjXmy$_Z ztpLFpt-f{BQWMExC^=UZIV2%f2PGT&z-RGNRPBn`JRQvMx{L!~UFx~M5;dnfW;B`8 z0!_wCI7N@h;@sY-d`+oWiv~I>z1W~G!0cUuGv>=LGH$+|srLf*G$~_RY$f6ITEGfkVcYBSs z;z;4344{pW97UuJ9x0I_Oe(+5&b5ZfaD!Ax@N)}4EhBw!+T#Jh`=UevEGZdE<-)6D zdU0v3xvZ<+bc$XrXr}}wC@T)p8a^e@caEjaej{+V!nmz-+RUaC-nyZ6v+mv19ZtU} zB#Fkf2*t%RgZm`=eD7~7JxC6ZjGI!Yg(f~6tSg$1+dVfnE(D-&<=3QscFK3ImtWaa zyxUmYrR~!;t9W5if>T&T>^wZ$Gq3G>2UUauqK*{Be zXz34arcMV4ZVGmY{`Dmf%lrRvQQbe&zWwV8&#x-Lukyohvczu^Pi~OmcTJ|Xy{-9; zrW0fc1e?R=Elb#e91{Z*5b(XM9oW|54_WAs1~*T>mvn-deus5*bYyU3xdDcWM45nU z(o%{ydQy5*ONgDmr6Krt{O=b3s@(K1^^N?zAj6x0xD9Q=`gULt87v@fyBh)OKc1+v zJQY?F1@JR7GI7!~vd}YfC^52gGr@kD8Q7UPIoX++HF$ylDE&LmAHWtc{j8Dczl{tN zOtQexe?a~R5I^sYO!JQpy3t4eG02wr&3cw$XQp3YUl$jePpvFrT2njSuew@@_TQ~$ z|Mg*VgZJMQ02_XbiT-O-Ltp}6VX%?Dy}2Ek$X8kHH~sOA?DhB9zq;ZBz{IfTriM4d zVW5L0=oghS{WrBQOb&XZ2WEg+!@3l7b53kw&T#XW!9w5E^3e@2OxgP_=o!SzvJW=dG2>NvM|xMttkjhCZ}&}C!=oxYb)Tdve?&r9y-(WnUsoN@YtSYm~A? zvP^_4ib_NZrAWVndkg>W?f&lX{=Md$^BU(opYJoz^PJ~=zwcvgKu6C7p@nRQL>`kj zBx5Y*m1rOkC0YoC4FZ82_kjC&lH46VJ>8{`<2|BdTis}7xz5-Nt5pRcT50GT`NP6j`HV8FSV3iYp_qf}9vaPt z!t+iR^#W$+ie)77@F#B)>dL$iz3?9)TkPZ2iZ>nijZXWVjqkW`2V^)2Tp=95AJLCt zX=URv%Ib5OHRKiN&Pgf;MxJZAf770c))onf-dU>Lpb*bU7(9XEs2x%1wydv8TAJvB zXmwX}okXjC9>_L>CQ{T3IBEhb=o(L}zDUDYOSX4aKW}eRgk6bG=MO#+FP=r$^&~kb za7%bAu;sVIIJLLR@EdWAx*q~E?XO-i-=+3j`dt?8r%Ar_Ig-w9Px5sxlyT8^!?k=B zKggu8HTtSvjC;#kQ`4&QUT@Sj;yt?K7{a$jr1tem%u9Y_Fv`qeJRy+Y%en^CYkE@Y zV1$=97RVlmJqhq2!=;z^(43tR(JZc&OE>P`RoAI%fLVZg10=GmCqWG+D=hZ*qU4-5sog6!f-Btt@GHp~PQ+l{G0p&7PDTa+2fg{B0b8#LHS;9`e@D^N$;lN9=y+ni@Bo4G6JhxJ zD_~GF49OXwsKMYHN)HCr$Em>%%VQN}9dRfb8Ce`g0Z>B1pz!}U*MQ>`fPe#VQbZCM zEE2^PAg}Qc=ZQ52|4)Wvh{WZ4W7R>DK2G+Z`}F4tfa3uQ28W?w;8;%*@Nq9C=?cnlqQn#I4tq^m^;d2u>ev5 zCFh6&V~zz@ejj{Yjj1me_;S^5UMX9MDb_ z!_1x=X?})w#hnpG-&C(W9hf+@P2#SE%>B45KCFrZYe8yHnRif4McIO;5pYAJQ%ve z(XHUWj5? zB6=n_)y8PI^Ipj8aCYw$oMXOb(sA!mP=n8u(r>*ZskmCV(<(b96yw=6OL$nU*HP_m3O$=4bSCsNin#; z9a8K;H*98rG%3Aw)<9?`Je_(uj3woHfyrpq9CPG*h@sYAg*SUYvSw0F8x#y5w{<)q zO`H#-EXkjsTOWcgzvsPQ17 z>P`79ZIXP%C6V%%sa+pEBvBj|_4G`b`@u$t^2Mf^*~SkG69az!yqo5Oump|2=EgMAI#*bHxvM8G z2~1w_H%4W~{>J#FP!0%fXh`3heE#6u@LcMAjK+|ZXXHH>rM%ctJ8}G#F?T6l^Z3o& zb;KE(^ za4C-BgL3+9%HFs`RV_Vaq3PrPqyQ5vayI`#OShBs1MqM4@jIr<9a zL|G0!E*mX9k?_&7*3ZDR$fu!aSai6AW}oBsE|0JTMED>=->`FEYg^*@zJAZdE-CGa zab?*IMsuFM?z%UR7CsY_8i}h4zv+34n^nvV-btv1=vz)bOz02Ls<%F(g%;B<@@bLu zjzhQ1h;Ak27qSd7*%^==V3(ETp%wJ}_mgHhhUb)NLpji#wy(t=-Aw%U03KJy-hA6| z+GZx)qTr?D7JGy#0rSZvgsYOBe0I08CSh_X%q8_`vW~xoclqIKjyWx{iw8^!`zoH* zs6WwdaE_C(?Z;%6O9bYQ7MRCHz%x7-Mo$_)?xKki%hGyrPRnrG2X8<-WTH@fAu_~n z7n6(8{r> zAFj)mXrB~n6uK126EV)QpvsAvuOovz_|mwMNKf!()FA+0s9_Tjt`c53b`syA+N(2#p% zdPM0$a}?*Nip#Ti%giPFFMhItCU+VfbjH{CFPc^?F|04a9W%X1Wv~Q$>A?oJT7t{> zEZGGBC}gmYfd|=NHL&OelS2bC>`is(gingDu9)lnIa@;zuAG}Yjw4zwmkJZ0Nc?noqmJdJQlr|M^R+OI`!UhwMBRvqwEdmkJ7k_3c)pQ7 zR)|y#(L|o* zQFeTcm)c1~9mP^-d8xCI@iC~l|1I)$Y)!|Rpe02;gZ>Y|?zRl7-j`ic5@eB{O~GSZ zlw1oUku6ppQm>`Z{pY3YB2Nvr>(iR=p3io<6zZPE(fN5yXGu->_5Hw-LDqM%517=` zbWt7bX5o8I$M;Fhvl4qn3f+PTv+_F5;b@JAx}lk5eHzo{)y$3LF8wsU_%1!v;}2qf zR^z*ms21RTE!<TRtX)0>1X8^l0^wY(MG83U2H-3EUzXwIQKNGMIy;vn z1c$7f^wXUzjPi{TuGxd$WxLP%rK33g(@L7sQr{wwRKD2r>pKm;cNbUUmVobIM8NN+$sh-vC3w zI_x9r=;48?lau1l%xIXHXo*6|V@=EnXOVbozZ=mn0lxUnQ$`h=OM)*?PnOh&)eGUg zYt7yJ1g^w}!uG_)c=^a>^JzAOTuzjKCqI8S!4RP;^0C$|=U}X3lj+{ivE)81Ew4jQ z$-ed!{;e(AfWVo{!Ml0$lTJ$F?5o{gn;9NqcMmx|OV&y;iOQQxFrL4Z-nB~sS>&;U zW1NL4zy4(1(1Z#@6IYNLTY;B({UgnRH?M3IsV_*0{>86)(hTU+LK>Ox?!P_Yg?vaK z9h_CE)lpQIW<4jTc?(Lkz>g8;{0ilQtl3M=H#1rwtR4vmb8VO5F|rue$3?QgOkr|H zM$aRL2YjWuWUO0D8BXgRd1)KYPn3o1;{gg>La3@DoNsB0!Wv?;P>F#^rXB*|f6->p z;J&~cCZ7D5xsy@Z`9M$-4py+cH2aL2?=YjARmg2o_0nPs(-#BF9dw?hsENL*<_}NJ z5g9FnN(%U(oNcAs5QFFku82plI;}e?Z|c>e*rHze8<_7Qfn#v{Ox(lU zGNqzq#JQ7Vp==B|m? z=sS~~cFVW?#u_qv4M@%+2dn(9X@n{G+1_&Es+!ZiW#`soJxwpq-9m~iqF*|&dj@e) zw^~SlDe_K0XEOZD2Y2y+NrH`ngLP)U=^4z+^J>{qlle-5w}JjD;W0J7dZ#MAh!5H7 zTZcdB*fEWM zj)mwheR=1EqJV3WZbFhh+j}cMl)p%4AQ}0_SPMKpQLAb_BSvMs*K&a_@5p0n0-qBu z{kX;mkt2hAE@8`b3ND+}R*s7HI?<~>=#^Fz-8k^jdarp^y;I`8PpZL3tXY$4tuiFV zi#r5FU-j6s_@bsPId|3!%S8oc8(MKVourniCLSfb;o$=|u~`QT`(MSKx6~_(25vwN zJYT|roO>Zv1BOpC&aqxuD!sxNT|QGhj)5OYF%-FPx?SagTy>N4+3>Fp0pa^SL_W&6 zJhQ>|rJ#=|P!Dm_j+dnhJ5;ja=58#G@6G3IdjWA)yI$yAPn&7?8l5X)q*1N)8CiPy zSWJ1vH)rd(+0ggpvIieyWcW8n#i>qO+FT9P);LQy&Ps2{bxp>2izYr-DpI)k1}D%G z)N_y9kel@}8)&YW*oUctyHbL;Wg(_0p=E@y%q~`$#ws6D#$mq$9ikV> zV+9D|uyDWwd~OlI8I-KFEFAXzS_(kI|6odM4OY&4zw$WQ^}DQ(kB_vE{E9G0m}KFW zMuw&#LS9?PY(Gq0 zPDU0fB`YH(qi80JQdU5KA8C{#3W1bCTB*YSxcYaUAHsMLzB#%6_sU2)1X50Rjq)Et z>Z&V@=SPB8;L498+m=wj83|5um$&7~g|)UP0R&YP`(-Fcw*A!{_wSdNmPxDAL>Y84fNENKNM zN|T9TN^vU_d%TDA%267RaV1Es2!mMgCu1%nRv7fZ8T9vCczMbH1Bd?A5PzVve=^7h zw)cIQLm=@bx#9q*F@{7rh{1!gf^TGM|J~2p5X+yS&c7V|XJqJqa$sXJ*HEWlI`SPf z{F@%Ei2iEmpDr-}MK8YV|H_e#tBe21hZV8!Bf?kO0N8_QXt_Wt_-Aj5mS0xTK%mP9 z@NWaWUpAJ4{Agk8Ux2KdtnQt_C+C{iA*+Ue2A0^e^?JU!)_MtCto^K} zH!7^hgKHINHmxZ92`t>Gv!0i&)j@4u_2hd|Z!}%cIo6t1g8}|M@c)N;Y*bmlLS3tJ zfOSP>V@0hB{7B*Ysm@vf4Nl0vKk?Z({Q8IB+TnAzLw@#1G&W!W*(3xkLS{%kh>1jb HmcRW6VKjX2 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/AutoFilter.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/AutoFilter.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..da9b21dedf17bfe2ec5d112088d4775947525911 GIT binary patch literal 7367 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 R0*a6h)C91fkNY=%{Rc=jT_pej literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/BasicTable.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/BasicTable.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..62fbfa58f578e377bb0621413fa25a7ce9602357 GIT binary patch literal 6398 zcmb_gXH-*-vJJfnfj|f?0)l|_(2Jor=>m#$0z`W6RcV4Cp(8~)gf2yTZ&Cz7Dbhg= z2qFlA(xkljdDrvGyZ7JAS?8Q&WzC$dJ+pUawyp*qJ`DgsObp(>XsqE0RY;u zClCMt_&Evqx_UTTxw<;?`#C$sC5*e^vQiFMM2>b8WX*~(z76m2v(KEWw~gqz&R>Jj zJzNUdVEX|kZDY{Vfx|9BR)YG*XAZ5V+tRWHlgQ1xorDM;nG-mlnRml7qHOQ+L4t!R zzSWR@=-z8Dks`Iz+jJPaCAz_`r4S`^s2Qz|el`FH4%~|rkcUD~`YS$vPgHe6zG^G2 zh4v^{UBokZQx&5LVJ$v1o)ZDhzK66%2dL_a{D;ogpZ6yK10$v+vb;H;uW}RIcPjdB z-cPV9o4`Fs?Xu=FBs6l-9UgDee_G=K4SHoK<5cQW|B&=vr8C7xm36}BSGG&2^hXSe_W85S`M52TZ)0ROLRL()HJ zMOj3;`9__EBN+_^I{X};2s{+5WHe)W_)f+I7+ln;aBC7hZ#N+hLEr4bb3S9t`~1gipvHSx_xZFv?)Qlvln>?W>8$3d6St2;Oa^B=jaKir%* zh4DWTT65m$(P&79E4-Yg>6HvO7aBg9!?;F|rOST^*N>udZpA%+D?e=f=&HWzhx#Z^ zh!5ksk1|@XZVGA!L-pF3XElD*y2Gvher0Mm<&DD>HM56I5e_CJ*Jl%!tD3O6^{!Xk^HQfr049fU; zTzb7XrK)UXK%^bfew+^EKc78?{*5DPp28>si=!MK06>Yw(Z zlY6v#xc{E*nAF82lGI^pVN2G+ z_WU@xQ>IG^<89;zX5dMAGMC3J2)u5Xkr10+#kG@N=MD;`&@U8W0NKG0AJ-$4VJ4u@ zZw~n^tVkMnh(Bkx2whJI%#5twGj+SEA9SaH{Q(_5X9(I4{(5;#oPjSem*}Kx-%X24 zcr+m3OQL8Fr!gc9uVo=gqbIJ8n{y}Vb#3%%N6728TH#e5HoIhe^0#*!tOoMC%S@72 zb?-T)XWylU5PSRGAhu2}EvQk@e&q+WtnC!P52nLOO1FKP9EiFX+u)!NnNPa)HO0SP zL#ZyY3!GIq;^PQYCnSF#!`$QZ4xEziFU|rvdJ68VHauD|F$<=Qp#Bs_T0i4Y`l$0U z8n#O{>dvU?=upm%bHVgdexFNJVdAWx<@AvwIn;Ey1u^cyw|ySIO8$2_E^PTnX0T;A z#+C#t55I)K(+=T*w9)tSuy?Wb{8f_RHx}ysf|P{26)Ej)Wj|T;=J}grFDM~40)j;^ z>}xWnMwK?_f_Bx+d)_JIvvz8xpY|Tg%dE(5zFv*`2xe=Oi<7cQEteC@_q1V5UG?)R z6LW^&8P!WqQ2V6nc!%9XfTXDl;(5hgRJ0sI&r>z`eIwKmp_I8zS3s08V<#F7Ngm&|498$(V4#Bcc0XEU+M?vxk|9e-DcSUVM;wjFZN+b6_ahnssqKH;_5t z)g1Yixn7gJ^=EL_eu@{h(ly`H`ta_Nebd?YsHwO38;C25YA-NY06MY!X7~-nZ;JoB zF8+(|^4fiZl*-jsuX8kwbt83`Tv|Uje#cD{eq6}WxRx<-;KVBdGVI1DLG*`di8Y=M z?tdTH`}t)dAP`FQL*eny_oBSz3^e|XnajQmV-w5pUY{2-Z!FnYEN4{jw!C~n$O+1& zoReZ8H)Ks3PZcYAt0se{D6Hk2q~iY)5c!!CPaQ3_eC;fXZoaXpp6uXe(o@;)p)q!c zoa<{ObW?AOP)c~_QFR7Lq0-<&*6pl7U5VVpMZ%LRA!KA<-!qD*3EErHMN>y8*%dz5 z*j_uylEhVWZfEp{BcJl!WMbMbxBW}fH*{9~q!3G2TOj~|{9irdmb4cH zX$CD`3bie&>CID6;yBl+t5IhWCi{Hh(BAwon}|^uso1uPuQyDWO+p(~7MVdZMLQk` z2cXWzfirNK{H~DGo03`VG>eEtsF`%8^`rWrvj-UBuV8wR-76HDhPBRXw%EIX@@;puvFCsW0Np+ z1wUxC2q^8TVkz)6ADDVo`n@Eu7Rc(Bmwuk#7#UW)i8dR8PTLV`6fMNloK=>eTWadV67tf8mAcUP z-$ItiLaJq+zDxe7hPy96N+R&HP5PZh8!;&UE~yC4yy~7;s>GVhj+%N-CCHAgUf+GC zLJ0yp)@4{fv0RJBZ)!-Y62T6S2FW7n~e2{N?6STqYR5O-2@OR`}*t4GPbj7?Vr^`F(vjy zuO7Zcb>GdV^)ait)4AAt9#sPw598ZvwXD$0k2Hfgc`w=_Tp13Mdb>|rRtW17FN6hW@yUB2^}dfM+p419_ffC}hXE+$s>IAx5{n`(zfM-SL3Wgw#gcy;KFf%AL`vq>*`RPfpzc(-0I=!bnomq3wkS|n| zIt|on(cCa9qqS7Aw&osUd3tM=PJ@U;7q(6&{lEz{5}hMa_Kxtp?(#6Esz(Ca*lVn$Gd2f3!Nz3NR!jn*|Bo}80@Zf?X!rtl5w zt7MiI-L?2W4BDL)sJ@sS%jd;_ProR(s6uD65Y)55(zhACheumB=iE+jpW zW3YSOtT`mUQ5I3L{ji?Kwv>MrE*&%wmsx7WiHOVr=#;QK=$n=(sh-_TF!)5~D@Mu@ z!qj_()q=EgM$>`S=-3W0U>wEfB+;9Ou@cG38HBk=3_zis53UXteMqlon!N3WMwNbu zHb!;Jwz0S?f_x()n5jN?d`(!M5KU4ecm`#9PR7fvM9{rndoDtq+Iibw3&(`d>)ih{ zPo1se+%-c&da)suMg}7w%85|5@xIL>{kQsesMT)|ZBl2XrxTg(U1zkJQhX$~I{%1i zA%T(6!%ESGT<9xn;nh9nkz||^ZeW*6Ja?n9*pNNYAJMR={B@ZJGr(e7;%!?CZWOKQ zo_X@!z~zW~<&cTo55=2Pa(6uO<^JfVWSw7Q$aYrgy5ti@9w)}Rn>wc#nJ6O7ikqt^ z7uJ>+tc*^xgT{yVm-;$)+Cxz~*AIy*#hY)92MF3N1$y$Qrtf?sg+#i6?&>cc2KY~Y zcIj=A;u$^Ol~QHp(JpPT@|yJV7#P-3xz2s}%>--^jp-p*NLtkrit-^pB+d_qbAC45 z7~z=UG>AMnV*D70+fFbhmnqx&F#8jlEmN*;^Lwi`NZT4LpEm@XQYE6duGu1)Ns_fR zGSrUb9%UZVk(ii<0u0KHmRDkVV?&dQMk{!=mo~w z37C&`{mn1$+C=jv0sx?m5dfh6%`Y!Iq%%_BpX)!=+BVX1WmKj+=PB&a4?LS@FE@FK zT2jaoQ`fv5kNM%}yE&IVJt|S=S_;3$%1Zh%tUnG9m%9N(6mtX%y~d??j=MAJ;^Vuu z^e(>)K*hXu?6DbYAH_n5vTd2IY(Acpe<5c1l;dh+w>6 zO|R_MV~J9qAL@LCR^?&MauOoB`n@SuLXLC_AL518eP`#}+mkf}iP3jM!+Y{%-8@l* zp>SZOw_$hHherz|&9u6=JW~U^mY+AJ5tD*4dGND3%&R->sp$+RoT@0DrlhO3A8A?Y z-g?pDpy=ARvNMZMm?|R8gWorjmHiGBDo^l4Twh2cy2-Rx(mJjQZBOMp)dPC(>jSl(|L>^wbMt?dOY=fhbdS@ zXQ`O>p#4`3hamgc+?X+adf(29xqzQwHa=-ZVqz?5<$+gl8nesq|EQ0e6&~e`A`t*SH{~fl;P$dId`z8SD?yQwln4KX9y-EkxgE7m z8ntGONdV_J)sU)#;rEEgJ=zT@y>bOngw)rNH{L??tHvI?SaIE6qpumE%_j%PjH%~0 z39c(|P~`r=V;WcsnB?LLTS*ljy7%OunR_OD!BORql|`Z)b!w(QMGyJ;a|-w>S$TZ) zrTv|zO;5E#L$IStzOe<(mtw09a%nn~5+y_2i^52MqVYm_LGncbzs1yAZ0l(ZxYI{; zjLfad@448OzE_F|DMCJZv`-e3&|Vs|Ivk30B2dK?=q3h`S+d8QCs1S0)-z3HKtP0p zl1Diz9SN;%YtVR-JS8bfYH7*R6I^-H@Ph1mckTRIvQ4}Fl8CShdVQpz6n($;dGn_= zaqv3Fkmy>=HmU!%;YbBIh}4!AUlnTkF4UxpHTmj&n}Uv94~e+37FBgZKZOb1mbJ#_ z*WSS;)la^REI4(RwR>CLp_wfQ&C0}EP8){bF)_>Ltqa^Brg0RXr`U5_^hUewhTW&b zQ!Mj!9}V)e-ZOA`?KpE#_Zm#H`L4pbF`{3g9LgIWF{+7-7rO1DP)I%o7hrs~Ihh$C zBEI;*Ab#E>V%SUl<{em)@1&%Rp%N2*GMmVK&)Rr-&+K~3w-M^I>I@}NKhMdl;_x<# zqA!T!&zxqQ=`V4#9aGGoXT*^#*9%|Qtj@EjQaJ9i*Vt!ruB|)1xF4%+;pbzgJz7Zr z42Z8HrPD?M;eM|h|M6jfA`T}h+ZCGd5|ea7n5Hbk5jl*=kGQUx6t+&}kb9!0TN=Pk z8L?G1H8JDnsl#K_dQ(r^{^c-Dn){wKM^r@I_iJD6AQD_duhcim@JuP5E$N)W4x%nT z>EF(jwv`cEEdWt`iQ#d*mkrKoynZ(k;oBWQhUYm&8J#%IOZoL*dM9}pbW8Z^$%^g4UW8K;Brn3=6(_UHs z${Qo|nv+$pfHhc0YFFFQkqq%lsPy!+8yV-1cLC<)J*Wr@x?&;nZ_{0Xzjgkr^n3Uf z?AAPwJ#S-m-VI^xh_FQpcp^P~?5&ZW0?tS;gbl(AAzxL6o8_$*V>C{YoT-eH*BqY5}R>drqIe(eG{1(I>O^CxfW{y)jwCE&kWxgL?dEA zf)iq|yukC3Vtj8}`HQ`GH?{!$T)VeM>Bbq2@|}tCIBjNIuA0mws(?1+!%1=kM~O2# zaGo7JAml*$eC^0I!$^FD4oy;jTpltSqt$Ky!9Bf2~V&Na!dmZimfslrM%dM%?) zgrtSw*z?__Psa{M?P>0F0%P=*7;lpw4?OOg3O6>hwQAy}RM2VzH0qM@Th1j9lwYi7 zr2JmeEi((kC=2A;z71t$9CkdR?vm-!y#M8W1(?R`hL{zvYC)J?lDGTY=$!czy-{@X zpcY|evxpU&R6$TNO(sQ{N`{cqSbZ7Rq2eP;Z7|v-DBXX%p^!mCa&5YPnsRcOyuS6& zVCnhsH;R$%g4X3}=i6~_Bm-?l+>NUW&Tz~07o_mSGGyFh`%UFcwg6myl1lXTv9{qg zCuv6An3cR8*Xu2wr9ETFQ<6m3z2plbSeaZlnJt;*QTO7$5!g0A^NWJ7R87H0$eN{oWxQCn}vEg z@UlzzColl(&s_ElFGpWCwf;ntU_0hNSzMPhTy}&0WB_4DJ8Xvk;tgHSbJ;rilZTJ+ z_b>ThBjs}FQ~l55JFz|bABeB3L4ZXT03gL4-Pm5?qW$&he*hEA^F;sv literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/BlankCells.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/BlankCells.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6c5eccc5185e1372b551e84b3058dad1ddd48bee GIT binary patch literal 7196 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/CellValues.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/CellValues.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e73de6b1a14a436318e4694ea3d16d2a650cee2f GIT binary patch literal 6980 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 TF$MrA2*33NC>?Ti^V9zU=}M)( literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/CopyingRowsAndColumns.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/CopyingRowsAndColumns.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..003632024ca5ffb43dda8df9ab70fe3f04ee0116 GIT binary patch literal 9047 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

61(VO_kF9KA* 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 LmD6GQ`R#uIu*iti literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/DataTypes.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/DataTypes.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ace078093c1d9a52cdac7c713b816c01a27d5e5e GIT binary patch literal 6845 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 P-+tR~*UBo@pMU=Y6}RJn literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/DataTypesUnderDifferentCulture.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/DataTypesUnderDifferentCulture.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b68d6493b98bc8aeec87b034dd625f38168a59d3 GIT binary patch literal 6838 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 At^fc4 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/DataValidation.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/DataValidation.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1b92f80957c56dc5d98a805360e8fbee8834f579 GIT binary patch literal 11531 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/Formulas.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/Formulas.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..513d951d1a43727ed603e9de15666553375f134e GIT binary patch literal 8474 zcmcIp2|SeR_aFO~C{&2Xlr1r1UovFh%Pv{R%saNhG-FRflzrc_WiLC0Y-24;Wl6Fo z>Y^wjR1*D%?k)W8z5SN^_xZfTdx^PF>@@6pvFBWDJIK-8e2JQXd~lA#E3 z5)ep&6a-=b9R+z}pdKzbM;jLxM2AQ)F&g+ykpwjk)eLeMOh(ecEkbZh8OuTZ~E?(eqmu z9nt$%H~@o(3T@s0&hzivK{;q6_V;SgaV7z7MBBVADT&bDxfn=4vS3L-Bj zs}EohuEaO+cJ^32m?+|mhePaKU9mDyC?07CI3e&tE?B^s_yp~Ob3(Whzv676SOn4$ zVGBS-U@!?N(VCwaklmPILoY1w?;yIM(e_9{*#+t51US3?2{3f`8xXJ|0%r@j!XeN- zAqfF%px_XFKui<~NJyd)l7N_)xD)^ZL;v4Q13X;;XB2=E#Nvp~!nxW5_#O74T#&lN z|Kp(uEOu+pd^ZrMffD}jZTjm4fI0!L2o%B<0Y$ptfIqkB4{1Drb0>No|CcgQX-R1t zlr$iPL;#{}$8mn`+FX2<#gGQYeGz zU==ixaT?=-**e+xizv(5{ncKvsGA)b`+R(IX1HniraU+FT<@&4(ILH{9)XJ(eY(QiWv@R>{^Ud}|;BtZ0t zWT6;h>Pqh&d4=`j;wp9H3nQ^=4EuqD1}YR^ihTA(Hdf>xC`W1w%$;iR2T06h6WLfo;?at2H%rgGVcr0_zMpim}n^)l6TnzPao6 z=J+a$1DQSoJ38&!`2Kaz$IDlIyAM;fba5s)pT5y@Duq&u-v${Lg#HxmsN3ccR{a@tP!+aDzHSR&6Bz~X8FyCj*YZHz{jLw2jl(AmaO-V z*f7&}J?#-`q!xL#WG7AgBLCzB&(eBL=p%5RdV|u3BqfnaM$$wsknwH$Xm*}2YWmMJ zm=<-wxm~5ow< z^L`)}1$E*sVf*gy@0DO@DgI?usETVjOUA``%_`{eIAB&KoL@;rSSh?r(%K`Gdx|mH zVI9NibHYl&Jg!}sv*8^@tNi1nD2>mam#kdQj7#?zPLGfEY~_r-;lhMvz=TdO{jjtKua)8cTr<_R~N=N>*qcV5L=SY<-sSeL`W zn0N9RxjkOwTSNQfh!G3WfI#%WN3E+D2KZ&TjvJ3fK7}!EusnKSJO*JbOexLe>(?xz zs8D(JOoJ!Hv?CI8FLj}8shM|)?sKBndbzHDsIrwTUc^>ba%^L1etoXaQEK#Rzji2j zZyEZCe<#qQoG_WrZ`IH;^w#L!z)bVYMoL(xNT8)VO=*OEQsA40YuDxkMgqzwGz-`q ziVII>n^9EuMGj)`BzIfJT@&$7SF3RBZ?}toln!%$OB39RGdMBa&UDlnMMBdaTx@~@ zpVs7m@CNX|)L9|{T~55KnF*h!>A6kWL+;5dk#`H!`}#m9cM@&ENiA$j&sV7Lfl7bt zhO9IoRHY%8{|)__brS3Ph<7gBXH^ux!#(K~dk zWZXGRP>qD_>uax`jmQd03n-dDo2j8K*jU}<`5N+#@3XdO0qyCL4yHqA3}F{E6xLo3 z_MR_mOp0nH>4{ackG{En-tYCOVgNx@ueh)m;vH~T_zwKKZMTwYd*{qi8*8Z?x%c>C zIBy+pIxV>IgEZFny{s?)xk$802B))daJ7rxzS3;PvBYBw?mCnwS55pKfio7%YV+x~ z5l63#vN1BXs&Ug#@tC{IWxAhXOj;vjeo=!~A@MzE({Hh6zOpR*-EoiB~>Y9mNnSe(uN6~EKc_htk=&?N6F4)fpajQ$HRho<%(y ze2(=sqq^BIjFV{?r@+TW4JO9!E2FELOpVG-5XF4b@Z=h^D$0FKEx1Hj8}Bom_GaF9 zEsM$9JH(KILO7MjvA}b!MCDy4+rcvKB~A@hvLSeQn~U_{>^_eZEtx_gO6skNC!Xj1w$JAqELKlTWc1U04nn~F7aUau5%^*(2X$kGvOyUO zT0bf~hW|ruM&w(sWy7Ixv1JdYTRioSe8*x8sAm;BSp!$VQ__JeTvJrktY4_e=k)yba~=^=r@(05 z%!uf-i*`bFGV z<#WtpEQ)oLT4L7&TT8$6ny+@?zky7ya+;8-3t|MQgD%s{;GT%b(3&>Ayz`|k^s2kx zp++HxJ`9%kGY=?h(FmmYvL5V-_JCzjQ4Mo^9Oh7DQ|w#7S}8?zC{9uhh%r2c_4|Ec z3vTgFC)9W!Qhn{cx(eB>Yp65#m5LKh*)E{uDRIY58QT3suUF9`BO8UVBh%qxdwk)=5uX z*fIuszWDZxpn87P7;Cue1SBP~l7_jgx{bZm^{|0j+qJY{iB2gK9T?j}3^e3|iE)qs zByokxzK*Tr4yW`5m55sAYdq8J?&(bK1)>UxXZ3k)8ktve@=XWV4@=cXn0^twRXAIu z?;n8~N5o_&FWuSf?_(9|3Eqr95J1O~XJ|~}3$_<1iII~`No5Ukp~VFS#TvH`Y0pu4J)X>`aiPKNFkHW^PuDI+!kKbrW3A0+#_LM_YPOnd+#r2i)|pu5XfYcH zs;34uUz|Mx>rN&qF6zM^P+bjZsjDFw z8~*B)4!*dJ))T6nNcspw&#d^s$~^>D9rak{$Z6#n$h-I}M;Nkx3tiV6&cE*D-IJ=R z)cMVnJ_O~We!@;^uwZdc{u$kFC%9F_SQb%$K=te(5Yu-jxDt=90CfBQ%hWh;suMM) zd}LGL_=H)9MjF~gr$|S_K5N{)iapdjO^WGKN<~M?jdv1~1Dr9@j1(6YUbT~uBwPp~ zQ~8=41mWx7q_8|~c_}Tte#HHN3TA(Z?bn8hW4;~Io3lwpL&vV|<6z|CkCI8m*P^)& zdiiJ{Z$fqtOzDr+`OcqwVMszlLyA2id9i~wK2*}l%)2~d8sLnhUeKwbt_a9moUdrU z-h2Y(PB3;H;mVH*f*g&Fbn_6&;#6o0%u5h`FZww&URy$z=Oe)|`)rI&hXL`dP&! zOEHHJ&e72nHTyPAygg0P!R!xbD0VY$?p7F^oiP_5c!f*2R5ml1qD7t(*iPG`dT-24 z@*#OdKxVCCUuji}*{X=bT`<5cQMcZrC<8Dpg}HKmEfg>LQuW)>Kmj>)73DvWVD znZ{N!;VYrIBSU2wK9&k#w}6SpZ=Z*5$`_qE$+7k!>{gTfl`kJ2o!k8UF@&axdr`fE z!Cw7Dozng%oD59s`yid_X)&lH))ycxBxiIw8)-E=PvaklHw*EvFJ|~vTPwdvhV#wV z9}B*b%`;U3KE>rBWoseySYllBfxSdGq)D+cdA1oI&Jh0Ul9t{=uT3Y$0X0geuJO!* z(!WD4Bv`QvF2{Xe+2dw^>=lpOyfsryK??>04+h>Pb8+yCKGR`S^qW!T;F{xRn18Nh z(GyNu-KD@v%Mx%Sh9AN0@}gNZNa^mN6iQ}A!q{K$$wuv>W@Hj=zyedd-WBa!v4i6* z%drpd!7BOil<&&D&R?TdxuyEX>2dA;@tLQVer?0Wk`bgFUo+Aa+ifZzC73c;mfk?o zleFl$O}*F4?m7SNn65mGR|{v$bGFXAK>oUzx5ZsFbKR=ST}y{Svqf^zLtVJAQu0kT z_GO6-mHHDJn_-PUPm-WtJ~*EAnRhl9vo^a~WN-~J9SzS4pD&U=eh(O}<9-9@Y)03q zhkVGA+duh1*^=fBU7F?bmS@)uDb`6M6(Zw87lHP%B)*x0`FEni)GyBXp^ z9S+x{4zEY_Ylzy$m--ZhIh;5($TC#(q54%C1y08+(u}M3GC|gCnSX$?wJVkEmQn9O zJSQ5J<|+Rh_Fy_bDt_N$GAaxAxLPX0?edV^xLZm?MElr7GhXAmW^}@tPqG0DEj=(%6!g<>gBRI1XL|qo9Dg(%jpLq^&PgM!5h{-!KxUZ zk1)Fz=BSZmP0#p&bB9Rhs%~&w*D|11%fHU?7BM}31+s+~me@9v-n4wJnJb_pU$3|( zS($e+vbyG*ty%0!&{DPV*mlt!^t}uNoU1XJeXE9G>Jg(GdAG3mvoa`SPS#t+zfI9T@?1I%p$eprgE(^w zmFq^|OL%;kA1jTmE@)TXoV3UYO))Zf!jDwqD)dU^&nu88ue5DzA9J|aPK713zN@R> zB$K)pN2}SG8DsFW!iJLb1H6;ea9?_KY|^MH|4i!fzPggJq{T0`w#5*}`NEo;Z#@gW z8uX@@49FX6J1nlYjT?M*DmzqM!r|5b?BRrk&k88erR|18d;H@UTJXT9_V1@AXsqMA zv_r}^=(qCzPj>X#QQ&cv=>SV$NO`SGqRfOGmu%bF%eZ# zHdKYkiNJ&<1%+XPFmXd+DH$;d88JyAaZw3LQ7Q2Yvd}-?{vGEhuoIENM%(}A$dV$G zVj{vjkpBRZliemte=g8AL-{kvG(m+MHRK@B*0t4Km?^n96WLx@t1V_5Z}F=p>)#KP zZM^?-MUdZZ65Mh%o=Cwf189UB#ucoxMNEI60BjS_zuUg03JxLC(HMK=HgykmcSh~u z`31l8?L3ry`ui5%;Z11|`iX0SS@r5~RBvQc4RFO2?!` zY2NwsIbI)mpXa}K$FY0cvE#b#-RJk*x$FCxo+b`1EdW4B2rzn)s0AvYijl$s0Hm-1 z015yA;NvLb?c(lW?c(Ba)5pm%Mo-hZOO&!TQr6mhKi;l1{Fz=USjfys*ggftMPp4h z8;=HfZ{^(Gq`NJp^t!AmVxea3v3UD};@Gjilq0f_xZGX6PfXM>^k(SH>W9Y7A6Tn3 z8)C9{HM4fDP++B_t$R_XLk-^>wU~t2YG?hA=J_$pu|=OiO(m*?{YQC8W_ zO=`jHs_!vjEk7S{?VZT`YE3=@)F1|j?8Lxdg#ud9FJyX1he+mWpQw2p*=yWx)a9i- zA}JRpn7^g{xcc_TxJeTQ7l$7NdVfiL{aLv!D@NiBjKm}ui7nk>jtG&Pzm9JcI-RjO zD4$!xx?4%M-bBWfrdYH{_R%whLFU%6v1)&O@>}OTqywi(O@I;$G+a6cFISis(JP*H zGGwP;)j56)*Odw238HewTG3`+>Z>}{y#aMO@_C=B>RXX&vD4FUoWK{a4#Lfu*pr77 zhv=5N0Q@d0@8lQBZ-3?F=#$HknC7mzujqe5_K|UnQ(i`n)Mkus7fEhh#^I4<)~D-# zvE1dn^toct&{)WGz*rqDjbGAaY(Oktws=_pDpWO2Y&+msQ`zKybqo(f9?QA!UYLst zc^-Nf&Qf#`fM0W9-KAe|`e<_7KxXx$^P?jVAzT5+f}CV(fpUR6xqZ|yVRjKP8$ry) z!7%ejVD1no+rVtpW?zi0{Rn#C{kM!m(FrS#7#VGG002sij5aP%J$DyZgb2jd^_NvM z6FYUfMMB6vvB`O$)7jqva}R5@7V2>r#eL=iG3wB&{{w3264ig5vwrtuJYM z1*u-&Cpk;yDc%m_5xCcIPX#fe;6y8 zI^J>HCHSpljgzpS#(f-}GeW7i&aXSh)1N(9v^2{InCn^?-u&KqB&!>C0SF5}d-do22j4&73DM zll{FitMKzz9GI24#26ftEWa`YVFz)C+1&GRhdVz){1YSw{g~CEJg0LobSs{5B-BIY z0E0NgioP1SRgJ=F`n?Q9jE<$q1E|}dX$vY*+-!|T`wm2-k57&U-{U;8K^hzeqd3yS z?&#HaH_^|sM9&Yhz7~3;Qj)}jwhF1s^JfQrmkmC2>6#&Y!Ro$V%R0uc=MU2BDS1C$ z*dUHj06<6|&MuvVMCLWgJ9W@uW$`G|T%T9?f6W8>e$`FDh1Y>)FRLP7`UVCHYd3Tg>j zzn475>KeY8Cq$WQf9l8@z-6iQAhA!3wPhQxOK~s-sd41vZ|S0&OD~cd6{Xaf16Q&V ztwuofT=OnA$?MV&Y5cSgLDe_u^v#v^ts+KSlX~y7c*3o_^aLLd<`(!325Zf*e1GQt zsZQ|aQ}JgKy%!m~iapamhZmv1cT_m%SjoMc(Q^_jCqdZOl?TuA?!1x{k$gdFJ;je| z{>BuNF%mw^`m|Jw5z+8+?2F{8N_BXTNv03iF9`8<3bVgI;p&Uh$xOqB8o-GH|g zoQlv$+eD8Ro<9*ZeZ$Q&LBo2onsaue;MAVQhsy%%k{j-SKm3l`4f>IQmoDN@>kgJ? ze;#@+h}IGm7cCN5Jm_V>8c|d7eX*#MA~L_YHPmFu|Jcga635Pl;X(Nc?vz=5DW8Ea z8JWIG4xaP;3uP%)W+UTxd+s=8Q?u?I7)yIBlk%-PR^O?-7-K&A>r<;^ciHy`wBxO4 zklqb+cw7v*b~Uk}H~C3Hx)#Yk&$jLNM_m}pWoBrS7o+*Cl7bP|27ddy)>O|Ph;qc2 zy}>PnZ@=1oo`~PFmn@p5!L*wIOuBxSzCt;>dk7h7LAR6g5Vlz)RaaYx>;XQ#VocEc9XKu+sze$Xm z0TJP^ATiHd)~X0}Tww#gTutxSI;L9>kMiYa(;oY_H6HV&wc&kiCMJfPdo^sOk=ks= zV$Xt+Gpo8YvhUJloa-eQ{dcmF26m{oirWwFpu^dD_6hhh+_a;xKXZlTo$fcT)8G3( z(D?BkeWb!|r-2Uz?H{w-TGUHXRw4Er8;KDEte$kPaUl@@D0o_P&BTy2h{^9`n6 zYpSc5FEJT80Ko9up1;1r2s;?e1A&Q2%!Amke9SkQb)J>M}vbi{Tdpi;J<;%;L-BHgkFV07L3&Z3j zzP&6mupkYes}ApsjJpf3W{As=R(ut&+Z`2l5gFAi0MTL+%`Q5zzC+DF&;~b#bh(>( z`t%bsL^Yy{Ln`j4%EgYwY5Oz`nsR8rdlPW4DjMu+%ndhF8n z%f)7N*2~|Oo|?e9XzYA5D_oArwThRaeYIn*rW&uFx=@y^Hr?PWYDGvsEPQMjEjYcQor!7Q4lIcho`MuQ_eH6-Rv# zZLrlUmYq-%yC|qKe)={~4X^x(uFJmOOB~o#Zq*|Jr*<~8$nCa*&+K;@M*HHRq#IT! zqURoB%a2GmASnLl+tw&e(v2Ms?ec}#Xq~9&_Z24iMUg2zj1YChj6H;n9BIZ+-dvg( zq-C7L8(Hs6GYYzEDzCD;tmAX%MSjZU+gV?V%U_obElN7VWM7auhVjx=wF$M& z-e~i$I{Mc6wK?^uf_mYxQ2>4XcNRJ}m6`Ru^d^GRow|}8@`7*a6F<$ye^#-$9_#Z} zw1@F1Ip61w*o$3VsRS)bl8Ga}RBbQk=mm=B3wtMOEJ=yUoCs`&dm`|ri zxtOxEMGfAiM?G!ZGD;*?V$*oo6Md%8F|J0t{R%gLZYqFpY$wXIfOV_NQB>DEN$`_ej6l(`+d}edZmq-2N7i;xHaDL_j z=(kv0pSZYudE(Ig;IQM~(*wn}SFa97yzAE-Hs3yE^IIG`TTQetq=j=-g3q}`sc(*E zwZs9LyMqIXj8n#T72@GXJ*gc~fCaxN7fC#*U1h@Zr$?yqDBdZ!_Xgg4bT4J;#D)^p{B!CNfhIuFZW;s5Pydnz?!0GzZ^#lYH$>l#)tdO0>iX zZlHFLNw0QSq#!DUA&!eH$5KhuP!YG|DX6>ob$A#OGsY=#nszX#>J!5l$vM~siqNZ(1|2qBA+^*u^*?^>a!P$z* zgh|Zo^lPHU%uP^;BUHr>0(btE37+xV#F))jXeG6+%a|d*ftF^>;w|O0i#v%)T;QG6 zE>2&(;Md6s&iJd351#uDZtck#)i8a0XeP~|9mvJcUK|R?pVMzR_VNxXksAtK%(aqd z0}|t-BVQ`-oEutgtBTNhN4(46qDNSpREPibyUgx3Ivs)+>`YbZ^Lg>Zm+ zgmjm+4yw>o)B{y$80H|mW*HOq!R@PYh?C!i4Z6`WAuYt~v9b1zPY%>XW{EI?mLuI` z{J$^NvpU|Q9uEL$W(ELgeqXAG9n1+P^3U;~1Vo!^yD+OUTnOg2-t#}7;3_fijh$0Y zmjY|)BbN?+yf;5(P7KNvyA;Xa;NT$s8q^bmgDvounjrE>Ebs=O!3FltptG0v_S|H4 zF@TC~``BlG$9w*Gw;!o!+4zIqW<8Ej!*|^Cv!*9OJZg!C>G z>;aY!0;T0Aim{0vMJA2ou+k8uNmlcbdWjRwp!?+_t|f) zE+5zPj%4K|uIa|IDabxK>fXz}`;MYrB)27yvt9joe@pk`Y+vR3yRk|Og^RMFJJ*Pw zoPW!;d~#BYT^xy`&r&=_e@djc3^+TLMh@)GVk4uDsK_Ez>-(u@*0Sp=RdE@kBod;r zwS=iz0JWsI^a4X$T06>Ur#b5=c8K{%@=;p{r^#&ufvJLK&s!KnuDPcmCYN$P7o>w8 zbQbt7o1o|qZn&~7bsOxR=krmlirIK2=SfMiCztq>Vj~|@Q-ywK$)YjYaYs6tI zW=nB&+4WV#U^@Bxgd^@PhLj#zqOtfiH(>l9uVt#a>8~(W4P476ql+8{XV;6a zsjZV|9pbR`t@w@c@dYiskU-s!{?Q;X6+G(z`pLmAQxbdj5IoLEe|kDj@jg*)WUv=* zRKJN(&o!ZQ0A-t5(r)Ejx01;+m=~&=U|;5j`Vx%f%I73r=G?R#Ux{iui==Dwk{l*+ zE%&LABJF;!@*_#y>-Dwh&j|${n$x;GDh$BuDoNKjmjG#n`$Dfps^FZR69k5M1X!_3 zu@0(7;wxxPS_DxFQDH)3W4eLpLiF1j67G)bnUzGF7Wf=c0#vXzkW*A(TV2txx*|=t z#)FbvX+#tIqD=-$=>mu!UBkV5-D)z>yqzPF)z&7bHOpNlX1MV#7~e;ERIhQRu3^aY zabacj*1)V|TXBo0wGr)f3H7uB(rUsa*vR~0rqCPzbwXMP=^65U*Uz2>uDe0D3^*#q z-fn{dKG1zb`yq#^A8&@}h&Crno$5k*luND)1&0i3!I0wm&dRxD!}21`?>EQN{D9J* zpBf@(+(Y_3z;Z@n3EpG36iifEa1%L!wuow^5+bwK>SG9a8q8F9-3KwoDlOkkp0@=# z-r#-6o7#(|yy}+U#^6N7{6)aw2PEy+7Li1F7F)c-i1FRpC9m1`Z5VS^MpLL?HSL7!^8M0kG zK04)!&=s_4k~7eO_x95!yY0*JgoVU>zwynEUWO0#9=u6{^ME{KPWN2wN7&`+J^eJ< zM+#EQIn?A^k%G?Hp{WFgv^O6eDG)9M%1&hPzr2Xp1z3=E#)gnHmgo1C_ib zDggvS#B5~5AW&NwDIgRmAqv4fx#@~$)eoxh$OKjBTj zdF2zA`ssi;8}!LPJKj#mPiO%jDt97@11Jv$Ba}%INb_UsFck1%32V!)w}DPS z>m|QYFg7ROhfbR3j7m|`&+c7}bd(7V z2eVz90&4rbe`E>b=N$RzjdUjf=LP>zvLh-SPuQ*5b}K8%9c3(34WCl4Qf`Z6jpfpz z#r+t`j&d`#Pk|Q|>lkTn+`+X=ykA7RbIsnv_|^VaI$GFX{C#9ng+blCxJAVqAJ;ky zgwBR0UCQ~_2OR=!&eCV;8EYmPYrPcvjN^s}(E|jM3x7)w29%tGFtRt`{{D$IS8;Ln zfH`|u8v44z5D$M16y-@HzgR&Z1~QA;^nGI_QEFYH~W?}vx7z!5t$TBj#90G#?Fov&fc|;dkk)s zUVGPqQvwkOIV26zUNf(3zq9$F4irdkzf=?g)nb?Q0(>&Hu>F>|mwQ8~4aQS-B)xuG zEMt_+vaQvVMM;%uy!Vunj(S{79|*%?OZ9ImwE-GxzTD6B$m1)b(0s3|G;{XZqN}qV z|J?j&n0VU;`#g?Do@rUda+Mct!RhM)aV1czr8uV@Z8Ch#H)dl+&wH+qq~b0&^Z0&5 zAmuuWmWbOhf41cFgeGz@g73W|&>ur;u&`-=fv*38&@s0Ex7!tF{58)zv;%`OTj` zo%p{$$^X)vtEE@>)_+Q^Ffiy}!vCM0_SG&|r|>^r0x&!Y)8((3{A%^p!S+w}Bg~E; zQ+;*Jz1rYvV*Y8Mi?P`MdwyO${nga?bNcsm0Kk995Is#i%)0#gCxZlVfpMA={jXR5 E12Nj33;+NC literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/FreezePanes.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/FreezePanes.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5110cc22735c5eeebed68c6513b55b34faffca7a GIT binary patch literal 9831 zcmd5?2UJr_w+>Z0ND~`EKmid#iS$rKrGpfu6OvFv5|hvo5kz|L9T89j1Qd{7m7++K zjub_ZE>%$!U%-16_`TP^z4cz!I>}1T%r|@Xe6#mte@9!5gp?To08ju7U=Vfa+G?60 z5ddIH3;@srjsaYdAZIkz-V%+r7j$tza%8Xpc+E+8;# zVIB)4jjGONKInB+10+jZy--zhC5YEdzU)T0*#d^oU<6e7<>;$V8-ejN=SL-<96AP= zi(Gx^MHByApW;pJI<121DCR}A8xK}1_w*}@R#&@e{_1PcEPV9?$cKn^`9)*69_073h>2;@+K zLx7jSV3??crMNH*W+?;~LP!8PK>ur|AzbhX6dVB;z+ef^!s2ZaxLx+a(J*bo?>G{~1?Ui6T&ugt(GT3IH$=2)^G}f5-Ba=nl;Wd4?wQti|JpXoPP@pL`;>oWUsU z2A*@GIyyY^qFuZ5^6EI(Cn{8sB@x-0nDpwLxTyK5YuB#@ZLZ1$Q7zrepDF5tMk!lF zYZM>;I1t@^-fvy`jH&Z~sST89y!0(38?RcX!H7YH+DKU)_ zZ{6H%Nwzl^UQ7vV<(=+bTKq6b^iT^jvz2=QM;s;Jjd_09@a$?`xjMfJRQzgA%wrqf z!1gJshw%lyYO*b%@*36I)?Io2ZrR-DRjn|LL;iYJ6fCPL`~lSAS*}VskifEZ6j5Ma z82d@Za&#C=x4o^u@;&p0M=w|hfW}V~lvdu1e&$IAFf@52LMf&tmnt6yF%=lDnkPW!*K;%OT$o$##5V*O=<=b;zdook{M< zz+n_$+5j>!DJ?*!j3jUo+*V3aOn1xds2iJ0xVuG=qjOtj8a(7x&gb$e&xYJ3)&;bW z6D2x4>Hb{YLnk(mNi>%%VDH*`UWy>QMhIo$gp2um&cN9~u?V;>9!rQqxZfoXNU#E( z4+jIFR`G+`Z3sBzAY_BlJ2$dLaWHEc4Ovt9swlZGkZ^QD79yL@W2Lt(d zZu(%qgl3{FbEJm&U}-s^0S0?YP8ua9X?zHBsX%*HRsZg6#!9@q{-R%8j&hW8jqf187YWsn1+jPUUj-X)&)-GWz?3 z3PcjSE`HLBh*FrhC%bB1pwKdN4nMOjj>r>kd=Y)?(21~CAfvTMoZNc>XX;b;tvK$- z+enghMFtp%GUUfkyQvDE%8~~vGgBEyK zB;vPxsMa42eJRB7mF4++HYq2#Rz>U95qb~CS}(N9 zOIfc#hHJ}ht&$Vv1B)H+<($No_*;mIU#n*0ua#tw!f&ez&P9K?QthUOe&F2LH_kg= zL?my?(v9?s7V{qwQ&I1df8G`|D?fye=@w9$o0SqyAvZX}W3T+sFn^R=U?Q@@{~`Jj zD=nWMs0&pMP`R@BEPBX8vCdduQI${SfphB_r%2V-RbD!5Za(!GrI{Mm0+=N!%27so z;z{fpsk{ezUdA&rdPhMo)pn zK+XyF;pqwKi?-*?Hu@XW7*rX^zvPAcayS)Ozo@7tt8PThh!7=sPJDj1`q>6IY;paoM1SO$5p~vyr3uNTmSCojWm#+WB?f1PQa_q-#C54@ zT02y^f6*=5BHO#2Uwbt%QWGe+MFIe@eW&2|M#kA75O^GD=R^2+(J4f?9>pZQ%|_=6 zKJCB^UtLi4z*d#A6orU+?#EIfF)LAALfKnsSXavwOubZ%AYreQbjo=@-pFg_bEu zT*~Ld$s37n^`ZTP83Q}&m}$g`j*}?zxvJ($0bbE&~7KnN^(4_cpectp1cE9xnPTO7cl(}|2@}-lZ z`I)>4qD!p_(oZ%?WlKv^;R^LG+DQnEftg!Y?}wQdwg>4GWD=L>g8GdTZY_|!x~QE0 zKK!s>p7z>9Xn^C*uyN6PGinK&$e_xhhM3GIwBbh7>{!BU^w#x5mpdwC&S}w^Onvh2 z7r!=-6q$Uzb2Q+@5wccViu+oAa` zY4FGlrxPGAv#$BD0KWN{l|IWHof{JmTb{@L1!2?cxjRH9mYt^?Gq%mc&qieDl>&wUA z$va9F&;=glSB*Lpm~J|~dS`HR!o#6z{b_>~J4Z~iAyAfksmO5JmX$g9KuI}$JC-VE z!Nnts1y*(|7E~wc`ntp*+iH{I@ui|pHF%Tkq_W`ASZ%d3lC-&xm+BN!)Q_oA>t8xj zix|<$xIRX6z3W?LsaxL!r`zne(^?mjQR!!WCZtWSdv(1c85X2XA|^5H5a&dD&4$m@ zL5@0eZW56W))a>#=j6Oo+RS1_tO|j{CeOpEPd~9DOQXrpTaud55{Y8^POh(8SCTJI zmxYsrq$|HA)(lOH7$c!qK+?#6bUJ{zy-hA<G@ zaX!4KgO8f(cN*YXIHao5KC~t@pM4=vD=e%h&Ahe)OE=w~fGYmyuy#BP&}D^i)n>tsn;$?-qecJ7?Rc(W(JHOe%5BySWqP?~*D(sx?S_X#=zoVTLgx!&O}ul3<%)5R@4e2mNe9Ye0##K+TA7OS42cC^vzy$Pr68hq zEXJH^JEvp4k)S81w&nh^7WmB>@hPJgw)Se%F)_I8m3;1j=gwtcY3>wVh!p_O(LfG2 ztEFX|<1bo;g_cxDjsU#jrY6c_>$w&@xHw-L%Dh&vxX5_0NRe6NWet0-DucY3w$=py z^gJFC+bvAh1*>_kL@R9i!D9d9`oT4_PgE{TmKg_(5+H98j4{jLgDlJKk&GHX#vk)Z z9!G2HacZb?*}gs*lM?wc|ABbigHK%v5|*4c7azMy6UfE#VY%_5AKmemux)b1kLP>d zw2F?+GUs_A+3C#H%u`Yu!FZcydC zZ6jXhyrJcgf7ei3h`r~ttOP%(x_8#r8BWvRxxAehpF3~oMXpz>%K3*{f|U$--3AMv zNHth5C0OK=9Rs&M)o^&NdTHY08IQZ4ovk*KzKuQYHH$0gYQK>yb7Hx|w>>!YJ!bu& z*a!B7qt3Pi%xo=gHI%Lg^upk2U5~CFddMjsPODDcTKb7=;Q1Ot07kC%aG@l)JY5kP zyENF@O;y0;GiilA1H3oQC*L;49>hXB;yy0yA4W7iDywA3r<0(m zs}q4m@xClBTQPTA67LQ$=*|R3_M1Hj)Lp3&ebJbJu3Zjd9jkJjF}liYn6EdBs_h;f#hGPlmNc5F_XteN=+gg(#Fpzejj@XVCS z*`7Dp825syzC<JOR z*nookvY63}litiMLPs<%kE_6g7$)N>t;It&#KwnR1(}76pBIz)T-2X5^*@0T2FM>l zp9_ugeUca_}@bl_me?h8;nF5ES_gKxhjs7&bT=~<- zKdl7at(Cj}dF8p**2aeb%G#4l7n|vAFLGBX(RH!YGi}lUTP`L?z}YN}fb~T38Z9+c zsx8vEw%|HJzRjgnuTqP1qwx^lnaUIX2^pu}=5w6kbe6C-6>Jk5QGIGF_5xU|SQ9@} z2MMMRe&epDv)EzTg0zDVQD0Q)H6_2%EF0jj*b0$7`Q)5)T6g4i=X*S5Z<%}-b$g!n z%*S&c=M(MKIHKq^b^bW#>`D5CS4yVs!NjGl3Wup!yb~h$peNCzb)vpXkNPCwQfp!c zH*~tbmM^J>#!-1MGBxR3SI-19jh#K*s+CMz~s7C(&B9c74W6q@t{?*q{fbTNjS5ilr)7a;t0w)p&Hpfj+O;pY~WlnSd>f({goh zK_|l@w}TgQCAl6WhAK`@L)h!ADlP`B+?J&qUpZ$+IZd5x##P_zr$@F)6siy!6}W_G z8jj| z+Z%v2Y< zv3yxMa-_x9jZMRLSDOxCsvG7jDz``^Zbeb4)}%-1zAmyPXJ3J|5bM#Tgh$2=8S+gf zadlSY563Niwzkd#GA!ILOPh1K?^>lZxvWcCQ{HUq(>S90#i4*TFaNk}cki|>|T~l=1s2b$vOWXHv$0#kLTh#*!zS3^T{ht~}?SYz}Awr3F`_duA{r`IL`R{7P z|GW~iT`k`((|<4Df0sg};IJRs1;!DJ+|fSZFc1Ps$Xh5vsX$mz7zF&$7LUL>{FG02 zci6e}qooVZ_6Mx9v$LSH=ngPJOc4fM(NNdj(Om>=Q8+vl1tS#E|2R%S=e__;tkI>JwqX@$X9y9tMj?Q8pR zVXTBk5i}XR`L_OqGyUDE^`EE74&J}HBCzi^32eI>M-a-+A*`T|NIZw~wtVzmr`wT- z{;+*}CMh(A@Le`k<=GS-h_vpl|#~2JBzVUE0ZS4f#<~|8H8b1Nyt6e_2WWFIw>f z|6es^r|S0q!H}H_&Ho2OcK*%(Ul_9gkKcb}!w%RFGJtj>G$B0@5epDx$6r6dLil;l zYu_UT-#h=zE_)xt*xl2aaH!e!P{#gI_sZM5J6<6uiTk6~{@!~9)ZM+o1nuls;buR= zUfpsx!nf}Tf1zUT$Jwjd?Z#1~_-@IMc(cFjUae(!*LH$~|8V?2C@=d__7>H5qwv%I z5@lzz??>5NJ>8AsPyb7lot?TLWp9~mH_GI}U!v@6v;8Q0%OSf_lnAUP_+|ed`3~@t xlzY$By8)z+0RH=@?ES;zS;ZtmK~koqhND&OYbv@9JsoAz=gn0OWw) z3^gs?y6L+rL;yfFF#tddI1F%g0J)$r_EspAy^yP;14lYDfH!rs`5#~5`a{SX4n{Ag znswD|CoR~r^%?7eV_Fl>C2DTdQHlE~cobXAM7^iHWP1OCMS;LR&&k!7N%QS_O*5&Q zMSG@ic1W=;ePs5v4%Dh_d)spW;^GQUK3q_le?3;@5aY-D%?=R(AB@z4V8o10at6Np zOrSaG^5(PG64E27=V%7`pWfhF-$*dwy-jPW+xXJW;PmJ%|k24x3jyI2*J{(W^ zX5by?oz&w^Qnq2|;ceI?{{aJb7S%od+JP=IlNwiZatmT~?`qmoP@9E8_m1j>+PCY6 zicX0Vt-ckob>CNJUu~0Iq%s-oyzaX8;Yvf6o27bVS|p3B`E?m-Vbg+=7PM-qQuGU+ zH^Hu^&zJV<;m3lK5ZTSK&^x18k%S+I&4UU*7H2UC2P{Zv^YgF9VZQv4titA4IU_Jw zI}}n5C?X^b7%B$j z0R6AIhH%9pkZ=TC5RJhH3xl&mV7K`PN5S;)|6@T=GmkZEY% zSp5~tlVfy{gTizHdFkjBJ)vlzFq}-uJ5uc$bL+|YI)9daRqp7KFjAS*)9J^jm^7P$ z`2}u2cZMAHa$lVAecC>+P*CV(#3Ml_+Sc}XjF*YRbQS|UAeR5?)q-KtZR#}~TT(+6 z8DDUU$+aF?1}$ra*ytsCfz)45^tqlX(IaYrnVdMys6OhEb(+aE4%NAo+mejzdcEO1 z8uj=p+sdczT8Up##EP{dxeQ6nJ35|A9NWs`ViQn5}fy9sDHfiGBfx{ zS-i0P1Jukpwy^QMNurmien)=Tp;?BZI`yR+27N~*N9qqdcg#viaUD1G2%f)sG5BE@ zt9(nfOpJ^-WSMH`PPfFPDEiQ6lO8YKx&;cGP zzqd@26A%AIZiU`2JGxQ1KjSS*Zb@TZS!!7_vB`5d1u8w7W@#eHRe+wQ=H*I>Q@kF) zKRr(LOfpHXkT-=tI3UiDvOQ!mWzfGwL2w3G+Iww1qT@om=qao{e}_hGfn6KvP>oFb zW0m2s(&^X4zMZ4AJ1>Q#I|{LZzl^O*MAc^omtLhd&$)4F2s=yt0?;wp$ls`6<4UA-?3&gH3qZiqZ? zJ431#cS+H#w5%}Kk4nPjP~UvR?&AG)5_p=X&~(gulS+3j)Loa_o)O-W zd?H0FrcQ^;G2oyfu!eSrVslIEl;Qv?wo_1LdP-U(nar5wsJ&XjncNp#f}_!8K?SJ7 z{WN@rpblguK*MD2Nz8z!a+R5pvL>I#U6-a~&e57pi@f_V*|}816qZ_;bHEHKF^&=v z_Q!Ec^drmC!~yi03>K4otp%~4>Oj%==^7tsFPJX|oz5AzqCN{YKtey*`ZJc&VM7i{ zDP#8qy+zIT^lRAqP~Rm@w)JjbU@<-*bnk8b@@ zlnNDwbLA$JvhT}{RsXVsoXSim_1rPF&Gc&;L29(IXX65N0yaWfE>AsTZ04c2iaBkfKa7sK(wB8RcR3OBF2h ziPavfbZ#x;*P62`pR91f=9bqbd!yHewD*rLj7nW^3}g6ElCe~M-}u^-uZh?T|<7tCM-- z%g}|Xy?PjCw0nekWrpU{#&65)f13!RKZ)>@2%CvP>?aX^5@C}F;y;P-lL(tckoZZ2 z{|7{H%8#0+*rFooNG~Y8swX0fH4WaQww4e8ZePqq!g#8Yp8zAdY74_rk{!Y*)$WbV|tc{W2D2^Q$gbalxG{jqUq6Gou24hod8$ zTtw5@lxqDmV#VggRzhO5!LmH>D-F|iqpTVXj{X*f?S~Pwp6kh1Y)fF@*QA2r49xI5 z#F`!Fbqs#C{QRV$wh^7Z|D`3Ya)N$X)^d#A%CAYC2gMQBh=9c|97QmLY9m z^p&H{aWbxIRT_LVVJ^}23KQ#*H_>xVi{zSrJ!Q4}gFz?A6OwSh)KcZAckf>_TNYI+ zOy|*6svXnaaKnHd=;NYGC7u zq$oJ^Ia6RYk)lrHLrTp?8Ei{fl@QA4I7qokPM-U*s!K{| zw71Kxqa|Yu0dodjbzL(FoUD9e-8wAFJ`?J!oKxJiv(Hs5+QNv7o0JYxGWjJ&@jR0?|};nGWBV_*G__0k2+hzUSxUA+Aap!ZE-h>}Tk6OI#6TJMYdN+m>#`HU@6zP=jl5H}qM0r#B5^jdfpB_ z&vmSaskh`^@v9_KjE-A`8E5;&N?Ef-zAmzwrt5pMjM}?m*sS46t_q`Q`ef{t80v)t zcp9dqSTfw{Vz2y=)3u85`oSk=M~%y>tYZ~F$od(X(Zp4nCLiO^d&(PKg7COK!q zz+5pR8s?j(ZAx$L)s-(Bdj@;n5j1EXm8zRNFcBSTa^ikC;vR<Ib9jG(rfW>s$^FDr z_Y=9#mD0kO@2yQ8&1PtM1+bC3lWS8&oMJhtc~d|~p% zblaiA?Brq5va=@Uw|rC-LiSA2kZ3dB7S^Lya=a-R%AI$Q0ny~!Q?p-tKTSJr7u#}F z>eFRI4)T7Z#EdL7R#zHs%yuvBWgV>e>d}t|j@$Gu` zjS-6*A=iuyI{08JoOj&f_%d!QkQCX})(@V)P`?*lSu;~szOhF#@G7O|!_+8)m-$v? zZ13b6i4CcfBctO7&hSlKKk~FJcQAh8qm4}tkZ$%)Ny@bA9k&Yo@wWyf4@(;?F4Ybh ztU2cG&&g$V>+F6qY~i^C@JH1qp0AH-d7&le|IBWFY?$I)Op|tS-a5_Zz2R3u26(Dt zasXc>*gW*{dH-Lpr2kdH`^ROS&C>s-=CGwjZ0S1EaM%|i2JM7#AP6~d7zp8jU$>C> z5{HP82nhJ4Ee?Tk{Hg_QHz1t(($W=c_XXC)#YMD-Y)AebNM4qp&3qjo zf++HpWaQD%J~MnFbo1EUT$rh#ka&R!cXm@u!&-cAgZbk$A>jQ()epAili+5kv3S)_ z6=4l^a=>w@ZE9g#q9Z};`t18=S8_nS0_I=`BdCQSXC!==v?#bG@!>Tff(R&tMdODQ zPN=*&ItUTIg&d)FNC5&cUe5bQpPSMskmK)k`gsa(mg~RDn19v9?~>O)>13BC_obVY zc%>F&2S;$|K`}U8s3SgBpxs*7-@B|`vHXTa`InvJMb$s3GyjnTy9aZd^7CCsz9<3z zrUwMj?{)pn3h=+^#TWd)>j0@xQ; zf(T0mew`vB7R0N!-+opI|M!m9t_L%=jK3~(J0EV@ZW)H(U2S{RK%D>wYj_f5M{D~O68)v8JxgE!ee9MzBiEp>*PO)mc z=?Xr;p9B8~>FUQ(h-kivLdZHljzUTMO%y`P_;D15U%rV#nD0N1a+u+pD1^zn8)av8 zXM1$HnFuJmXWACPS8DIPP1p{=iZ2-b>o*O%yWhEi+}^z(D}Gz~dE>HeJE^BdiswE6 Qun+(4!|R{?T${iC2c_vL(EtDd literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/HideUnhide.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/HideUnhide.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f2d07a568b3f77da25f01ff2473c2e90c8238748 GIT binary patch literal 5701 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/ShowCase.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/ShowCase.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ba6e0517a5aefc7937fcc1e3aeac2ff72549260f GIT binary patch literal 7586 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 B=wbi> literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/TabColors.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/TabColors.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5c5545591b387028dbd6c1209dd6a68da48ffa7c GIT binary patch literal 9551 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 a2Aa&=awHZA9D4*l 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

ggc`*Eh4qIwlceTxo$A45JCu8U z{~Ozr|JN7hf46@A=aguVB3GxeqfM3UA5or5wXz8%Q{*kXE-7wZ)WnEoe`CWzgg>j%s5M-pGuDj2q z_^cf;Sf~RG@kRfu#Xm(>f5}K>q~WmrfFxmP1Qd&av)}@f#O_0^KaLm*D=6w+0?G&p z2#WCu3h)Vt>IsTVihw0W#Q8Bgn-8evDM|9S}nt zQrc&V{1`{vl*0EH2ljUS`=9*wP-_RCePJ9O{Ep8((h6kxPn>?ag!iz)H!AvfF8&~B z|BaJli0`YLD>(3rwuU2Ew4i9LCe$96E6{PY_Me^Bv0Q$Kc>b+(9HadcCHkKNI6j$& z2-FV)`3fuk%?S2If8_eRi`0KHim&=V3gr0e;(v-^U+k+#(0&`h^&mWaJ{%$Z{{KU` zpO3tbG5iDLZ!PTT{~(7g^>KI3L;s2#_j;5sA2tNzy5aFl;<)uu)_K@^4!2nQUQHiY zIEok#D^%j>8BXCZfa7tUqs;BF&isjkNWK>Janqx$BX#xNKgU@mIM{k0M-KWq4zIRL1QX|665CA}id$-_F6BEPU GxBmmS4QIgs literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/PageSetup/Margins.xlsx b/ClosedXML_Tests/Resource/Examples/PageSetup/Margins.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2f6805bc82261be3e074db0809534055fe2d1fc3 GIT binary patch literal 7205 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/PageSetup/SheetTab.xlsx b/ClosedXML_Tests/Resource/Examples/PageSetup/SheetTab.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..30bfbccdcda4616eba618654fd56eb90135c7a6a GIT binary patch literal 7269 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%0AF1IpV`5aT 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 pk0P<39^c1r;M3$8oZuc@gL`mGaCZ$doqOL* z-eunWo9{Dl#sv4Xg*m0!G%wMbQ zg>=a?!KFIQXoaH#NBE?0<|{FCt#`9!cL?pYO3(=92-QD59eLx!b@6L=-r*JLT~Fa z?JeJpoVmWIdhHFS_i5s6$(DCNkJzM&&oht4iaNvTjh{U1WLmQLLn@$q)z%|ZhdfgU zl~TEus1!z8j)?j}!_u<}AY;{zdl04yE+(Z?n#${E$QafErr$M+km=KZ;hrh>9(sMf z12}Xsip%sRoO>^B2~vzco3N?l!myv6l2B1x+HuuTA!Br1QQ#KRLdQx*r(wLTal-*< z8T1$06j$P$Z~E>1gbaxS{z)WSro^Bbj7Twf000L@q@}Zks;je$8=IMn%kSJvk8fA* z5W@*G$vvRZj{#0p(;5Rm6BJhU{-OUmM#fqc_?>H=cq8uanm zjeYr((IRo5XY zT^pYm#l!nKibZ@ucDaOdzc;pNMGLPLA@E6Dl67~yZ?tY?jhzPZT%7zt!s}{9smj<^ z!qmzEPkRmpB+Qlf&)Pkw2osWC^HLIDeIo2E)47^AF!IL&?0*5xTl%Xt)wB2iK&hCgeg~H za^JW=51SvYNxLSlcsTE=Tgwmfjn)0;r9r0`(ZCrWyUFV!O+@ugU&TB%H7x5-b`w)> z-7lm!Y2*d;i>c%MqrA_VX~}-tIZaY>YU#W2X2Kg^qdu<)#>S#8X}9?dCouw_U9VO) za3UdCp3`E!r=Hs!fbg!yxFd#-%ihZ zPGBYP<4b{jE)nr-<>iYaQi9iHDNA0Y!{bZB9iCMpqo%aWrqi<84c%2p40sthvjU`; zI#h8ZA9-@dDRFd>OF|NH-;%;Ly&_G^|fC%6s8ClULEA%Ph{39X9;= zv1`Umj(J=5EYjNXC`7F;r;p?>L_;!m8&P{RM3(R9q!I)uYQR5_jPrxWp^K1HMG-I;0oaVV+=_i58U8boQtuaE& z6r%oFtWD7C^V3hnWg8^2UYdkT?{Sb-{5}+fTMkN*{!CU@9yu=l#I`{kYV6`8oU2Jw zj?>*O)TL2!iax@e{d`F7SZYJF%_~BaWQ<+2P-pFZTs^xL$t6;Y=m}>B0?*U#7i897 z#bVP?DSo!U$7$FAk(;-zk{kCYg#l>}jcZJ~Z?%t!-A{J=BAm~g*DZT^V$J=vX*gMq zGT*GeAl!;R!cmbE=f|&3tG-(65?4i|?#q>6N)PcCy4cU}kmcM-U_-UW?^bv%!P!H6 zkSZQplG1F)pnS>EoTo3&NNln$K>`MhZQd^zkink}Z2(L&M z)iu!DZTf#E&2_7aoD0o{h!l)rYmXsgj{dUW3Jw;>4#tAMnR|JrqBEA^K`K0%Dexg+ z67_63GRay{YOqsWRLJlwuq4Kd_`cxDy;?r;NR={F^zdR_^zdr@O+ee#yYwYS-t32% zBj4pbb}fafPYza}t52$P)Fm_uXBgVR%Fi{J3aH6b;q8a0eP7tci+|uw-^EtP-$dBB zDUb_*mk>0C({(kH=4V_SBU08a`I5v$@8rCeq-E8W7V*&FM^qNI zSIj>zTAkIHv5$hFNr5`czSZXx=^&@$Q~8E^cDK-5#nZsDQ#p&Fk)@Jqez$Llcb062 zv+?lmqMYpd&A}ZHfw@oZWv6H7R~?nh&s$Eq`McLnEJpar~R5szFVAb66ts0trs&-d00X>Xe1)aFg7wuXC)di3FdD+Oo34DFS?Wr&NUFd z70+*>zdSMdr(E)C`X1xKG$9rh009223BQHX%?1p1cY}2i*n#7B`}mkRuRhNX>*(F9 zzk1%y44cUTDf<$VJu^q2PrqmRM(WT<^PKj`uKD*943N|-46sQ)`1#aQI0N4h5cZ4*V`+Z4?kdZ1_$E$y zg2pR%rW^U(kD0_dCM2c|PCJqI8&_f(nGzW1of(mfAq{G9#QW-wI;Z)O`iMje%`MuL zxulojswTPl2F?vWV0%6M_s$IrQ=s6hQ@YYwq?uczP6|CObzX#ts?3Q7%9z3wbjYgf zPZOzC={&IZdE`pemel8zWI787Q#~tvz)Z!yr>+gTTuB?9{`5(-V~cqz$nIO8UWs7a zgnhU^!Lt3RwkU5-%=fNm=h?J_=37*2Zc*n+*ZOi(LclRv+Sih#ShFB4-7v43_#iLW|c_8e=?85+{e4<|tIkpj#b| z76X9>E~PfuwQ4@AX82Mwy00>!+8|6a(tOgN`@yh3S&^hM!40bEyC*j1B~PrK;*ldS zOKP(KzjM#A(?ZiZDZj67rMx4#e$srMeCahg<&?nh5qVF=xd@`&+rKP~x0s9w2Cw9J zK7XgY(4PEY(e@#2h84Uv=$aUiBDn90-AS`h7%6y@ zBq-P+Jn~iald$cXuHL0}C2}vB3Gh1n9Q)UPYs1dLYC8C6L&=Um>m={{`cyHHf$f8W zrinO54|%FSVvR}MEyw~fl*kESwLr+w&0A1FKkmY!|Kl*c4CQL7K4h?C32@a=2&Rwu zve?X;9O9-aUC8lm0g29neNUNqZ}70fu+BJAfAFvmoxG>WM>25-G!#C*;NqxJj(MkN z<^xaLf*b?Lb_O2xY3c!6Wv*8dS)MXc5A_+lwaXb_BEiwg0Px_Vqx{WYWNUW@xj9@7;IWB7^SeMTt}%1tm4e z>bbYq&TRVkLB2xg0%2+@Dzu+LT~Y9GOf`7O@2@xlsTtMp;SL9#JiYc7r?LtGxX<>k zy_XKXmadQbAfhG>7nGJ;F(~q{Cp{JvJ&k-UFmOaq@FS&bG#r_a!>zy%~#-g zuD}8{FAAy`skAN;1r0BS86maVxUAV0AE-I*P=ezyDOj=}1~OHZuWGiFbZ%Te zoIybP$Suf>&^eHrK7|)3j`%^Qim*P~;b}Go*ZQ8!^8olGGCkI{a($`^Jfzs7{zjbT zO>-0gKKP4G$Rstr#@>@sNM}Xnj9i-m0&(6rhe~O*?JGH-pq`@LCSnU+O8$+t>pF&! zjO_SLmFQ<8f&o{Z$57dC*sW~Pra+ojx$Bc%mHXQh$+K@0WyT`+UxLJlPy_A`pe6w~ z)o_LHdx%J zm7^&T3hSbbxHf6xxM#3OBjHnnpN~;wl?+EXnKP=blavn-WnmJ&A6Ce!W8akC!pb;@ zC+}JJnP6lLTK>q@tNY=io@qLG-d^UCijuD=`qoHcl7#rzuSx9wcVRV-g?@}I& z&VI>@1WwOPq7MskdG3lcD)f>-ZVJf+ik($JO8&`35xAEd!(U7nQzSC3iu&+G&j+H7_Ts^MEjO4BYQ42-(CA#=fClaqTRPLF6!wsE1W|QrNXTs%Kn&v*zxz z&e8m_wejjo1Z6o;@O#?xnFthl(@`K`Fk zdAay3IXNuZEqM6YVZU;+Te7;iIa*q{e2fLbrc#2CGQ8K%1eJ^Eb>+VTD&SBf6ev9t zPvi8vL@SNdhkJr(ULh_NfW*x^$5WD3xJFE#Wt?wh_N-y1eUjk~|A|4D8M>YGl(ZV# zUq1_EfWErYPJ+%VcO*Y(Ga@jSX@ru9Ykuj})q|OXk07I(8O%VS5k%w+$iK}9)YD5t zW+R^F26;1CnS2H(2rVxQzo%gQtgsJ14X0d4_rrR2RaZ+kmsj~1CnMIh!FwH^T;4vL z@+cZvIeI|7QAyI#zo+n~P^;a|aZR0g5tUZ`3pchfY;Yr8F*u*NZt5?pEn&g7aUrXzw- z{QZ19d$_88oged?@aRh)t~6ECo7F)%BHJu^K5fL5lSZZ@*BTC{0=rX#ay=p33l^lM&I(B7MsqY^SGz31Y~8M<^1UE z*i^ajRxjrWZ5Gl;7ZGQ*2h|7}(S01Y$amC0a8N`n&2*7;uY_B^K`O9F8!HvhusVLk z@U=S&X$dT;iD4|${I6l)ZyV*$Nbr}55;Y=@1|uACv^ZpTzA%V-yqb)6QGpF-!j{w_ zJ|;(fWTS)TH6r}i@|BMD!G}}R&zG`lL#u72Yr(Z)odN@av9Yz^WnLwj*Ud?45iyWT zDMgLi6YC0a1WG=G3Q{7?PB2PXQ6wk0PeG{j#+cnDj6Pc>YgaZzvPvD2(R6( z&VhcMkfXnU%klnHtc~;sp)?jB_ThI1J!^Rc?K*P5MW;YBy_KKMCy4)iWE1b2k&=ep zX+6TJMRmF;&VPIh}nnXBYh#qQbwR9;|dwO%rX>#D8<3N>tTx!lG0!HLpuXzRP<|$-l zn{nlMGlSd~q(Gtl1@znyEwBiYIrbMInzII?P45#Gg`!>phX3gxAWYofh`{=BJF}hW z)V^RnPqBL_TI5pK&bnL6#7j&|DQuL44nMbhYMU))e7Z(0vw2R}?gx-sE{a90l42y* zz;=NaJ<>TDSKyZH%wH=_zzwsOenlnxt#=%_)TVro~AF{g1R284V5&W*$|Kq&{EYbe$ z^XM(ctlq+zT_VS zBG}jfL-;>j%Evg5O}sxi97um($^Te-k3%2N`hP;D(f$hkkCXpnl*g0KACxGVsR+A~ z$8*nPfX6NL4}b@3a{7O7sE<$oxQ+Zd{Shoje_#LOrt%o!u}uC!P$zoK<9`&*$AFKO h=ntS6F#zx%bV*ea5w_R>00!)<0dsF^e_JzKnS~Gs+T1Q(DX}-y5ZP zbf9D*;$4vK6w|V2$*~-Rnl(Xxd9Ae+-q=SGg$4dBL%s%Lb0846%F_xKXBmHPz0JApKLjweHyt%=5=kt^U{Q($~BP&#gS7 zP7Zk$|2imuW+-%apXgzpDjQt$bIRDr#r>uwM{{q}UaCh#@>%&DTkg41iqeTyFoZAYy&uI#<``wo$$V^H@hErari*b7ty&?`15yg!O3-FX zJwvmMlL1?7amAkj`X z@=zDNwSW{ z>k4EY_op^6l(mQ$TuMw_N*pC6h7gsKmXxp(gG)+?!i5l`;-aF0&NxRT!ufm7r6i<; zghfP^|e^uo-W40Cz^@2l> zFhgaUyGf_PAW&rO$;{|%@1J&E)BzT~T1EdjKR$Sbxgnm5lVHJgvn zv?y8+#2ve6kIO022A6eOo%L0bVW4QY%~5~cCjY8{Qfjv3>Wz&lKU!Z+*2%;Ojc(f% z27?n%y1Wp5r_W5{1D}j(Djn>)`8DaQ{d<-;<2Ol^4C%7jA?2eat*i8LGquWftF3l# z!0wC|wV5vbIYRf8QcItRy6Jt3IN6Z*4t#R-T`s2ScEbSLfUYqOb#>=dZe zkE$#=Rs<(ndUNXjkV~D`2|w95LH^f=snnkDUpg=z zi!W{mPX`%R9iL(yXP==|&=Htsn>HRRkdkS1_3q5O<#&;A_gJ~OhKTY2W7W401cGd@ z?>JjH7KJpxV}Vr#_q#>jrL#-7RtVBKV{+CLHmG-y%&#ZUe&FGm)S5%RuLtOd+sK)l zO|GHCLz*|nljm2X7rocKH_l)RhNL}kshfn6*M`gxo8E2G^phe3jtl zeCCV%^#+2`T@MQ~_%=u%+IycdC%+In^FZ_YecAGSvZD1jt8E9?I>l#Pk42)(DDwM* zVsM4BS#$iRx6Pk>&a7$6z9@@YmbtlNc*(l@bQ(7#!b*=nH2JL)H&{L62qX;p<)nq4 zW-M4e%@*QkrT>m-DllD7EL6FWd-mW4L#A4`9z-)DU7sRUJ&IgA^mMu*H#k$Hi<`6| z{V4~hI*&dtB;a($wyEgu_sA5u;hpGgtJB)zG1em5i;6k|^=)*!(@yc~MA2JdN2mh! z0EX?fZ*K!TH`m{82_@0rCyP~EiuO6Z0KFlnijSr9gmI!F8JwkKiQS71{8EQZYKY0; z^}ae1rK?SI^Nq9LJ`H+$G45MX3HdfE&Y!~o@i>|^?8eaEJuF}ATBOiXFwMj_YpgMyzt13q#QY2J|;hOPx287O^NOui@= z9j{pPw4L29g=38DNKe=8NHrphpa+I1k-HZ&SSN3I=}Fy+dPTaDCxQy7t4lr*e@*vu z@a>+ZNW~EWOjxb0bXL?m3tq=NAM6Fxjbrv7u6CXy*qyfNBiv?QK+2G0AQ0vEYQ=jv zpnhAXFN_DBdW5LgXrF!Q=^uj@4;1^xUFS6->4MHou*cN*6tWFgwk`I#kH##Kct1n& z83rqby`<|%Zl&*NTlCpjalF_oer!?+&8Z$r$3>>Wf;}swpXqMjVpA~F|FOapUG(1B zfanO4UZtP{($`qbr-HXoRb2>iP=1NYG^7+aHlppyBRpq&++OM|XER^79_Rfz?$Wk9 z!VF_rzVIPW!u0!Qhj~h8h=blgxC}w4>GmO6WHosjKA=Lpp5{rw<^qc}QyIs2+V7IK z6T5RsWCnp?hYvpGhzDo$YRy>3ELpBXZHb;NC1c}w4$nkOgny}vM=_gLdsSOMS+pdj z3DAQzF6$M%FAI7#a2lZ$5@Dnti}{)-P!z2ERGt4Bn(40nau5Zq@gu!49J|6Cko)!8}FUUP$$42?3V@a3Guadau2(Z7D zrD@3VJlsW-91%5nEJd7(o}TT7bbXDp#>HXWOL?ve>{xPe)vUC$&s#YkL1xCbd~ffv z29|*;b>Xs5u%l^J^{@o}-H2+i86VL^lA;|(-u~Uv^WMt|)C$~a7RlES<_JoNe9KzD zq)s=A^MR*hsAHyDveGTXyI}7%ZXM(C#J-HH(z%qOYVHwh+%>%a#p%L*N8>9ec&Ssl zo2F<*`M#H0$nhWG}C&vo)?Lwr>Ect?9}_r&-{K1!8;_xP8(%WPlU?<@@% z#huDYaio{jR*N{s#6S6Brlb2K)$R&jKQnS77}yu{sX?G4+ZDVy<#Dzs6dniLdJ+EJ znj4WYq&p}CX|m*KSxcH{%gnPqxMr52!;;Wgax%FQ3e>C(PtSZbW$H^vwP=9J2q!h%D`VziNO*w8?*&^ z-+sw>yn0H^0Ns8%UhS;d6HU(BmRawuF)nL&OG~MvN9;Nro<)D`1Y zHyiFq?v>?gxvX&0wpuqGT(t4&x=MwbmIepI(y;Dr3FdEg#+7u7vhx9j1tf0voTdn) zP@Vbx`=_VJzK@Eey>{9TIQbB-UCK8`#Z zMXu&bU9N(pi?UZ+q^4&Rk%1DK#JRorn4F`#uYRI#f@PM_cwZFJ8Ai1Oa2M+SKn6r` zX-8j{SB`=?gd!(J1yYfs3~5PG74vlo;*Kr%FX4 zIe=TCg1W(mE`4cQWj^Nl(VIE?{=Uj@4T4qPiUJK6Tubvv$(C-#Oa-!HrVKPy$Vxct zfGjNglICe<5J=eDbNl8jR0sNolNt9zj?slJiThMmqqtz>}>)t>8WW*dgptJ z^riQ-=}TW}fxiy{4V-rHkDfS-?&;XutUr5pzCQ-^Al&M?R7=9!X$XX^zOA zV%Ie*Q-vHDNfZi$=_E8f%#{K$S;9Ae!x&jR($JDA?BXZzuKSS)HqcYDd=j*hWm7P9|HM=;Z21pwot2 zOOA$mCQH$HB^5R$C4QEW>|u(!Mon@-`As7M!S!JA4&Y*rtQF#9w~uYZis?PCt4V5DZ{xhfNfE4OAnX%o|CCPI{zBi(>B+*Hpc;0h>tkd4e%3ot0nlU7kuGi` zX-vv>{+ZWBzlbh{#%fE*aV|bKOxKOFYBJzjj>7dL2pP}!7AmzTFdt}EMX?5E`W|J> zjq~A0T2|VMdm?chieW<~z_Gnjk03t?{WI`6Nry1i2zl zbf=jfaCSk}bp$zNzIZo%tn6rVApGE3!xQa&@mZ3i43D2OCYn6j98Kw9rO@{2$?=BCh?{mYVnE%q_3x46r1?ycA5<5WDs}y`Bw4Q$$}7ceNUNUpBN;<((;tPfS!Q`Jv}IkoxNvY~uD`D!#oI!e#l?4| zYGbMImSV0FFXQrTSXQ;-rIp!dr`DGiL&&N*rcX3cp--?^s2=EIqN4dm0eyNRISP5? z{5j|o0wtZNRbb7hvbfgp8bO|K(3R;yGce5{cVrwV`LrKLaBVfEC(4mm)6;^Yf+(ko30A;Bum@(LXFYHqi>qc6GL zxTX=I!BxrOnFpU|QeAC>}TmX1GQ) zK((k>3Mn%$VSGiuYpr}*Gcq3RJ4Mr|e@Xkc*r6fXx#*UMLdD!T($Duj&IE$hvot<9 zww50l8h>tax$fmX$p}Km)s$qFMyujy*UwT}C237+V?y!)b`-hSpYv!0?5mloEB zQ@6r1TQNw?)4a$UQn8?3WMS89I!!EkxEULkPrQEo=$u4~dL{eG^{^`Mu6WqWtUa&y zq?4K0dDC0D27&OgYw~H~leyAt4^aaZ93SMFYOE_xgv_QX92lKdvmpCGo@~MPa=6h#{*|GEY z()N|jmcB_Q!RmNKnzD9Wd@N@=$J0Yv+kAs4%c!F#mdP5K?5_CM`Or<=)mVz@1Y{bv zwNxs?F|h?jbdGhUUnl zQIYT~Y1-!wS^M-9%3VK;vvY(Ennk7R<_(NTUpsT6Bm#AxMGG?qL#5aHR}5;uym^)K z&U*13rijwHf(bb6c!D-(y#cLkgGgnQO=$4idGBBi2hK$y+hH?ge}blaY|p8~gcBu+ z9OuiakPG)$C%AHHTHkA`NMk1Ytb1?YfuFh0$U^t|Q^r7@I0WzOU3+-Fm5#?*+PO5lQDc47 zJS8;A$e@b{p~{-$5yz96tw>yKQ`b0XccF2g^W)mj6_x8mQh_mG&8pNWgV%*tq)fB& zPYDevZeELyA2`c1euJ&EB5yE$dd0@(9+Y}Ar|i}z_Z*K$`eQQu@@=6-cU2CI$* zhwtSvdUU^N88P>s2l->_673peTZgse{hy=1yc;1qAKR=QQm{t3x$ghOd0&Me`3(Rk z=*^}Nto#2uhxsd9^7o zu=u-#@=uYNf*caD6_5-9i-O}(NERR<8T=Nr{Noc7QB^fV4XA>Mkg$}1kf?x=q@j?6 zjPT~KptO*bxTKK8IXT!Ly}#@H6m|rVt2O$cD~m{rOA3qbQ2s+mL2ire{T!ezr1rDO z4#w8(mm~&(HrwXKg{dmW3BZ$h%S{xEGymO*;qRBpmfnBKj1k*032des2QXtblr`MN z0nehoNm93w^%g1p9{Z*%c__e79ngp^)(mrXLhb?60^5KXAc$KCSrF$83@LK!nB?dn zxb-UN2uC~dZ3zP~_!mAm!8(-XpE&(Kg*W-jPYC{3F8%45ga1=QK z06XW7n_zpr?!KL{(@+dp4fjroz1F({_fG3k;IQ_qn%=9ho7L`AFae-BpztT;cCXHE zc)3$2a{qQDKZ<&<>27MY(^QXq%k)Rl>|{uLRd%0HcdGDGZK>?7sBM9tL%91=XQu#^ o7WD65`0RDRdlTI0K8OzVt1VGai-dHu8yNVh*}U6&Z1dg!0p#6XR{#J2 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/CopyingRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/CopyingRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0fe825b7ddb4e5e929cca9f54811d8b7ac664a26 GIT binary patch literal 7265 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/CurrentRowColumn.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/CurrentRowColumn.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..44ebfb8eaa5cec09e4c07bcd7ec8940ac5b3f53c GIT binary patch literal 7633 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 b0s7G`(MWd}d4xb92J)w#%&NX{t^fKzp9bI4 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/DefiningRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/DefiningRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b1ac96fde1030c6a52d779536d06414b197e7079 GIT binary patch literal 5844 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/DeletingRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/DeletingRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1289e3523b9379c0c0572fc8a58f57f3cebaf7ea GIT binary patch literal 5787 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 z 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 VrvgR@1fm7r%>az-Jhb`i{{TQ9MG61_ literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/MultipleRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/MultipleRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b0621bcbd1d83a01b76bed5c44b7d3e572da6dc1 GIT binary patch literal 7397 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/NamedRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/NamedRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a4a86dac7835a2b41315e1c2a9786477320e312c GIT binary patch literal 8992 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/SelectingRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/SelectingRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2c89368581ad324f1d848b1e9f38e4201909a524 GIT binary patch literal 7001 zcmcIpbyQS)v>qCUj-f%iYoud9QW%i#lo&#qp#>EL=|+%-p*y8RN;;$)6cHq(q(tHON_UlxfvL1PhQ)NXC2>syQF<^K3BtwKC|{RU~&(RsqSC6TJ|x+&}{W|$hU#t zTe>23t(xjgl1FZ6k1~U4M04&T#(4l*?4y^2`UE6rsOw$le!I8jL-+rKNxdUCPt+&2L^F*=o_{MO9M>SBT(_z7q0!mmh zg|aD?mYR8&=jakBk-cWQA~$*LL4`gjo3EQvu#Xc z>RI&u>|s1k@xn|-j92pH;``Rkd*ArO*kkJCS3NnV!g5Sg3^X0ExG-K|sd7fEfu|BK zWu@Ck!q|_<7B6Wu|KZ#t#EvyR(z%&P=i(xrYvBQNg7fqJy1q_);L;;Nq*QI?r;(Y= z5)%2Qh{hZA0W~RYD2|~KMgyIgQ;eJ8o+&d1amANG&6Wh$r!#8T&CMywr<*D6dp{9q zO)*M@c2ncyx0Y`)HY7o-Qljt=8T$y<3Fo3H-*u)0VxOCH#zEpXNUejo)by4$CN4-5ZuRbXCuudMejq%)6HqN*v54xwpN2Wkyn} zT~V5nK{5pdaP!#3>wsU%-DFVbpgLNm8&aI|;q6a+AKb8RzW`R;kb61~|M=p0jWRQc zf{n@{6kAObSO{serakahvc#a85btg0JWZ}E+Thg3TY0FZxyUjX7jh2YhJO%=@p@#d zC!GVjb6OfD(-?sDPdA1SxMC+E-ROW001zSFXyaEY@I=eKlo`<0|w$=&KSV4@cm z{g(t8sB%I}Jdvm*6wqXaEkpdZ#l9X#lk6dp&*f*6_jkEx+Dv*#pi^!%69GSdrqzC2 zmw8%fP(Bq7M02piI+<3{05%M7EsbM&4D}xuwhwC`-MG8aqdBq=R~zmcNX6sYu4|BJ zc8=tyHqGbBts8xf}GeguaT>Irge{ z{VPXCcGwzC<+Dwv#Vq~q1a8BX3bJ&e#j^Q;1h zza_m{u_RR#la51``-?%z0>&|R$XPp@k?iC{BjA+Ghhx)5!whGu%?SDPjUG~7qO>WS zB&Qy}<(M-+?>PW?0jJT}BDc>}?alZxQB>4Z6P64k>+iP2VDPk4{Ff*&`V%|h2WS&f zS1Wu)&W|E_UPO9@T7|szTs{zB14c$%tD`#cDUI`}sfCR@$_(Tv4j5#A|zUt;5h>kpiA!DJP#riLkzhj2`*0@lv^x3c7=RZxsek;6H6Nk zSkJMP*vvCG6l1A#JHX>$$w|4F5z4i+jd-c@s74|j*-j!fCd0i|Fzt| zcJAMq@%Jtso33@~Wgx=bFpzDU7gHxy)KgC3Gg@v3^w?SVW1^>u_%-7B6|~Eha_e=J z$y2Br-J?C)L+d;6Fmu(A=U)>j8kfYVN1z9dU$(+4gPDa1xffjK_!k_9xf2iMNc^Hy zfjnBiiFc`@o~wrv?wqJ?Zsu|lT5~@a!CFOB40~{HPT*~%Sv@7V%u!eu%IdarjYX6A z#%#z|&OBF5c8Wt1-Vw{2i0Zd{rJIl>yZ;Eo-GKkz;AaKTFUO*=3UIFnw6`rT%!W8Z zuyZ8mBBhOrRL_T@?3Mi!EQB~IM4c1SPSIk^6Zrajtv<6tT~6y2;Gd4_nUaZ?L2{cK zCIEo{zj5{SbAtU2XoucdfHIGK`a%2@X6-Ut1Shq9T8lQF@^z(lE6iTcjJ;_34Rq7KQdy*YwygkW zs=cjs?mUNJ4Bcg2D%ZG265DpSP$YZfNdINLHZ<{uFKsARo73-0zwDO=zxOd4uUYQ1 zX{QUK1*;yZJ3;wT%&VC-Ir460Az+IkwFpEweoma3tk>k$Waa%4uJRzg#pU^U4n)!^TYCo-`gpbhF#>MIp&^>Jr zeeR*Y`SH|1ZJ9DVNh)qv&Rn?<_ZcxSi|bgs*V63GMJb3O-HW-qeD94;*M?+iKtjPzLpuCqp0VY>lqTRcmhis0r*;GP6n`l~a6#A$W!6|jUR zQt^7j2zQ|C1$oaF%C`!TT+sWQ>u0T0jB+3iP5;dosjQbO;VOhLWz%{>h_uJIuoarju6=La7>9FOMVMuAJWpZGR9Q+k%KYgt<-_-M7tb-b$ImGBD0K zGCgnKMs0~UcIy&5-90I;`HBC}OslzAKAuOG0Bhuyr2H$>er-m$Jq+dvN0JHh2L9cz z=q$S|3*g;=WDlcOQQH{8bs9J$@fYHA>00gj5zdTtC0ZUy=kw<^8cY1qiHR0i)7DzI4OK$rLT%orRZ$BKFI0qDm_@f^+8~r`Je|tgdyW*sUAaX z_4Tw2cmT);3Vz+VtdghJvr!HVHM28r?)Rqd?%%DeTGvC@SL7qd+$Lf4=AKII6m$s~9819*P_GaK_sMVNsUCc_}t^i00PPaJ|3 ztL(tRT=sk!I6p2|Us)J`q3-I$>)AScSZHn)P>8H#T|!*s4u?k0bIt^3mzspu^f_Hyi|7&EMHoEJ-v=e znih;BRLWx#nPOMh13qAr^xS!tnu8sYAkuAehWCx5Qn_m+U6rM*GBgH3sSuUKoeV=% z%Z!|e{xcbtoW^2kkhC-T-^p+5L-FuCvbYU331nkwDf%Rq zk>!cHHrw<5JM3o^tt`$IUrO2C^+y)dR<{mwx;|YD=+_zu=p)9je3LyeTitJrgDm#9d-d z66#RJ<9J{4%Gt*5D(&D>#;H+|VVD7-mrw!HhV%0)_`JPS>jQnXKxKQ~2>R539*X9- znffNFf`$Th$SQlql#iA3tm7eOS*A>M{TNR{R(+=`KR~qJ1My9!zMhJERj;qv#c3H|=;-moT`0TAhZJb&qrE{_gJ>dHPJQL(JQK>J zYk|vd6*I1U&}jCG%W-m0bVj`dG)9XTl5z=x*IlwNOiDSta{|0h*rK2|RY)+LInsM& zOi~>j8BmyiQ82BLL@c(?Hvo~)J|ITXAZRE;(GAx?<3gpJ1IIs(Nz+49<5 zPk*Fa+`(d|56V==nP5WprUylagsfyx5Rj>dpEx2PJ+KtxR=%%xz(9*#d>m+ zEB_37o$A-7U9)|hYsXx@q~iB(={|oFY!b;+sF1isluVC0=E88U_90QZ1?(tsn^(>9hwj+nvJ6<} z1=z+4e2>Q;Gd=~##8~MvPdKHYn&p7Q*LFZQdu7E%?HMTqh`>^BF;5ZqJ9&6KrSMXW5=0iBm{PE=IL7&5cKnTg zf)C>D5ZkcOyVR!oOSFG-jaO}gc@qWz&_)9Qkp5M8Jndo5F#g}y-!qreYZ9!;OK=bq zhxQND!%-J+pZ(Rjyix%1o&77{wL_n^tD~Vf8H<*42AiFDY!$y5uN74__r15<%L>`ju=D%C{#ZaVqF=9X`2=T<-5n3LDH1N$QOA z%@1ef)R?gp#aPU?$33BtV5RiJB=8-9%gE#zGxPdvejKjO1bxOf>57@rS|qDRRQcG z{h;UFxiW6>Sj->@VTG5$o67eumPeY&HC5m*A9t-)HKkw!Nz%E|Gdj$xI~+(Ub*G#v ziJWF6D-T{gc&MpT-|GqG$@NQ5Eap zuIwNDwrsDR!rG8Q{L{y)CiaOOMAEiK>>X*zCzrj)`S%A1yZH0lgP6ONuTJ(fetbWX z|2i;TZ7%(zBKRIT&Xb!j`4&&UHK3M84pQXETpcVXQCI|gzZQ)fIa)@Ii@GGnk5FhD zB3|0gYphm4r-~9xj7C-CC7}g0;E8Jng|>IRsUTZmZX`Sea^MyY?wwwzbYca);x>NK zP8CA#kqV#NM648LD4BK_`F%7Pq&Q`AyR+G=eSA~MLHG%5ZKVF^& z$cdP6^GUq zRm})_9zG~?9Gcf8u&ua5kaLDc`*zEJnu8;F{iWcbVf1-3*ZlKkN2Lo!2C=f(?`F^$ zDvImt8N%Tt#fi~=2fe0UxN^P$$WbZJ*n(`Y(5eGplG3DD!2tDVeyAVTL_P$O^b^5n zF|!rb`aKfV=`B2t>sIMoC4$#GEPtMS*E^RydL^;QQ*}XuO`cMSPCl7#cN36ae8Q8< zU*o{sJ&UD_frSz)8|$cWd3WnTl?;xPic_4}(vqPqupa%o9+&k^?b23~O}oRYkf2i0 z_6VY+$hNks`O}stXq#CAYHS|!3M{UU-WyqV>MU*dveF}4C?i>rj(a$3@LbQtEQ_b^@eVebqv#UB ziQ9@-k=s$QEhUe58s7A7ogO| zbiVLudQnIlLBXEo)n|4y_E-HV>W<0gRcSFeYYl>|YSp<32p|mq%d-GUJgwFE)9F309M_bc79A=7q4TB?fO} zJ<9o}tXbmEMHI4MIx{uz2G`)WX_eAecjzA?OL0GuWD5(4`O5Ugo^ucSfP0URFYEV$j`8OIjJbq>6r?QO2 zJ=RxLzI_*rxSCIPLXrd6#Syt+2HQzpZ`fq_dUUs!zUP@!H2T9Ima;E)=I0BgCcgKbhP!`_BKc4Nn z)dFC){!qb3wg5}WQwz!SZkE=LmUb|HILyP_!5RkVcZPXd+E{v8@>{!lz3D|(Ggkgf#VlYdXm9?<2jffSW8{FB(+U;e+n0kl+S*S&* zr^eG~-9do*$>yoPJ{6%a=^mEh4e{r((G#C~?w^46qel4n}-t7(lakDYpi7j;9ad88IB(WB^^-`GWuIO-+ReRw4(^2J#LYq`!C zyd(Qub^sj|&0~&UzM2zcWR!_D&s*h?zC$+A84mBxK0KtKC1}8t+|;DTD4t1ltKToF ze$+mNr?2`|LxZx=|0OT23g`5*x)hE@cOx;rX=T04vQNXo3MFV390M1`P!Ij=4|^F0 zyroQhb@5S}6^%?|n;aTd_C50siMITq7UxlL6vwBlMb|RoD*Emz-x+db^}rL&0h(vG zhP$540Y*8b-&K%x_E(KHk#}|Rgt>TH==!@A!{p8t9twSaX%~%gS zqAyw2#0h24r*3r0kwQJP=38=FUhhqAb#bDpkw=XePL~|Z*SUgqS+!Bk;?Z|%1Zx6K zE9LtY2+=IJ_Fn~zAbG3u{1-*@ozHsZNuAA?jOSfvKZL&9IJcFrKR6Ji7WQi;|EGi9HoYxn{4p)Y{%!iN!p3cs+cWSV zlm_6xqWqqSZ=>8EeEy(dAoaZeO@hCREWgK~+bFktklw-3!R1*MCkh2Qee->)QQz(OX^#}L^88ZCtDVh`nK#Ihydv?ec!%^(8Lv9$k%*c0F~Cldy(H`o9G2?jB954aOTfdBWoF7csD zw;)il!pcvJK^_$OvJ*w`4PL>f3}CqX!g(eFWw)K9yaj$*R7MO|0qef1Uzcr5Ke*VQ zvl1mI@PIP;JJJo*ya9=f6)$>{L6jgxn@^jjzhYSx6SgekCEn!_@ubNOu;A@yBnJv_ zf6k+Ez5)m_27O@Yhj{j*{LF-&4`;nnuMToQrOBCWesyY(c9)~9`0KfWb~WCTr4tuD z#m>xmkmIh5n!f6n;%s`ZaQ?=$p>JeB3%14fwV?=c$3(~j4&<7%`P#sVQ3?$Y70yL+}i_ML`DUs=zHU0~tFPbcPf zWXmgvX}%Z*bUR;qtnW`_TN^!gM!KRaz*Gs_K=gPT1!PC z7-;kJ37@$YQT;yQW=4}Rdwf7fc*UWK+XKBogB-T!w78tlP`;3%#bI$ezJN@E^Nu4o z4X*ox{{GtuqVG73X+m(C<`UJqVyn41_XCHjUR<_48)~V#zsAFApM*;`YVg#mFT1k{ zmb9k*#3}9VV@euAFW-BF)=7mql~BzAUkZz=c5z!UEmmTh-TR~f3)aCsJoSfz-&P;Rq3fxm+csd6&4FZNyehVS4o$@1& zXpce(eZMv6POt9xw3rR+n&JJ!BQ87)6b$wC9WocJWyX-!BD6=HHHMADF0%mQIiA z%3i&rbD1>-_sfPz=q`!6q>s7a5Ya9h3(N^?9j;EreHDtNxL%ft!b)Y>|7j@M{Q8)U09vXvgrI?jIoj zq4DSrSK5#PUW}WKiU}Rh;9u__zJTH#u=sQBsR{uOew@>lKE5)i~_G#81hN5*R&HYRC~^Q7dsPEOaV>n?l9(?B5}s*4yyxwgJj%>wl-qtEnC zJBA*rplBXxa~sR)=R&?0C}hLej@;9BrlP5<_i;J*ug_+-PA5A9by@jAKiH-+4Zij$ zk$^&khk;kdX_3X$OW&Ecni^863P5QDZRfa#WjrIZj+76p50sF759d_OoK^}3cNrgj zJknq&ixex~51`ziEg;U{oPYO3lH&kgGFUFUS~kJ0^$l28RxyK|X-PAU&JIP@UjIo!>7w?y0Qhg9}73qZ{5+^))$i?wPj*sd_Y)tlwCA#rM^kScmSKFa{R#Y zUBq-RsParZ#c%R+UooyemFG{(#JI{A>NpB`CAH0uo${voN)CjE!WmxA@Jw=cu_N<$ z@ovk#H^JeG6R6s&lN0246f$I0xaXfy4rLPA2#DSY75#jnwh`L)umU%7R2D&YRik(u zR4`g{=T*-}q-NGNtZ&CPLFk0w%HsJb0SafI|8kk`G*VOG-MVJ3tardBlXUyB`HsM^ zxsIB1&3&4`*G04WcbCWJUZV9$P^XM~-GuB}!k8xJDdJZ$okM~>*gAzHhwM>9QB_6O zEb+eFvWO@rpy(7u@Jo_>5p2ts?9xTpz%yqe}UC&>XZLoMb?MLj2!n_$5q;mp>sI5QvIDS;9Q;@EQS;KzF zN!QP*EnsfVy(*o%yPtXzRG*&;J2#CQr=BrAc-BESg~my8fk&71mk;|;BfST8v=GhK z&)W^RgMYc25Xx?-nof=&z9>^d*)3CSdc?b8rY~6z(MF%ko9I4fZH~3@0G4t4KvUv%8?Dfw2SH~-l}LK@X)#QWr&UM$7<8q zBGMee7#t)Io29T$qS9&V?k1~K&N409Si$smHQlW(9zUsoo=NliByjd=M1Ymy)C<|? zec-uJ@$2|T_Bq`xg-Qt$sZa#A>ZGwR0}bNZN&@zt&Q?d3XfaxItte$i@Ml&?#o0WC zbnOBbk266Yx>2r0b+P)24kk(|t<}d30X%EVDAYJ;qw6A$4RqD=FdDwvw2&ZQB~&6j zGqHr&)l();p5R-Q)=BiGS_iJF;Ex}RAfwP}wVq+i4h&W37jX=m79KgsUJo{9q^0j+ zNM0(NGf|YxT{hnZmbQE~wgh5{xd1n=yR?hU+yEK1-Mo6-iz!1oA64T*RRIGtEmEcz zpU*xh7P38{V^LnC360?$%P>eWa77n4REwqPlz{BZ_&z4x`N-|s{w?)ewq8wmAEW(R zNco%32_*jLFr?|{x^NE0jXa#I4?gp&F!T@cnVgqz>&b+7nJEjl#XOD{bQxA3@1oLBFuymgs)iU8pe0-ij~y0cF&^DxbKcQ5~j9p#{ti z<>NdPx8LL#o6--hKb2mAVYh<$<%}g%zDgj*)is!n5T`AcAbt<oRx(l~PBK8snL zJ(XvX=<)-)35#dSW?A%w>o|q_*HGpoJa)p!|n!p7wBOxWM1%znQjcq~S`hNc)Q?w@okL zYLcxO_8z$aeJ!S{t`oQV!`EkP=I!L5M3HMD1XGELS3-JYaj?1TKm;#Og@W&L>Hfmr zA9V5d*;)9KT?Dwrv~%XWxbL%g_Wfg=ta;Nd6aTy1Mw(k%W_XroE#}6&d;<=nv_{wSlsy5Cw+n<1{ zvl1vuu$it8d#XZ0lrr*@gqQ?RUnWoB+@U1M5Ut`O^%h3_h%@Pzq1*u0l;e1CT-qz# z;UW;?1*?0$Z9bDI^!}mBmupoV(kLe(lBw67Y$fbS3tf)8uj(^B+uE9>CP;{S930w} zCF_Pj;s--0O1%s_%a$YNJ~dKnKSHDgbS#!Pq!JQ?GI(%bx0zM6IZ)E-k2#eAohGEq zb|W+_v>(;9J(YKDS=yh*#ZM8D=E3dx^!n`=Q1C;%7^NC;Bhu+k4(WaLj?%qnIN#}w z_}40pS;j&53B>~~z@>F7LI5Sa)IMzDE{EO@R(V`cRo1jhCk&ScH72B0j&yKW@ek=M z-fpF_e!?vIZSAaqb0jk-X{VN8eA3!B*!3F#u{wCAEXYTiZHIsis-$DfWrENb>u)k1kT%34+sjj3Ziahf#aH zLVQ`xnMb`=GU-D3tr_;y9Nl$eTJ6z2xXS0E_$FlIoth^m#++IlK#Cm~1iBS|%#e9Y zSIH+%_ftp91f|Jg5%h#>%hGr+?G|H+M=`xf7=X`Bae|LxcTo{Ctctf2FHcX*gIlAE z3Nu=4MXnP^qK#MM!PyO!#HwJ(6T%UXR(+snrXUiZ@-F<|C}VcnaFmM`mk#=N7ZpVtzJqPle7oDxI(}OB5q7O;smu(_CCk zPz)p~jtstcFlg99sN@=g9hI_;&8fEYt=h<>X<-ElhS=A+;eG@oxsaTs>l}Xb33PPx z8NljjNVnFLJ++oDoAWbyyI&uY_9vlv9YZ zttxN)h872}bM%X%n|6u)b`3w3fCGu`sBx7UExrW9I#`nK*xKZ@WqL@&4mT;Q;`>6! zw42cNjYD2R1r;&dpXQv}i(0*`45+4yLDMpE7L$gd1~AjNyww34gj9~=v*d?v^Ij;o z?;*CdIPyh4?t_88)`$8}ha9JVRu6%Rw!V}&*N62&iy3)C!v@vial$$-&|I=%hyeY- z)_8`$i1_?-{kU0=u#cXq4-AA7ea0na3>6q~lUPM;5mj*y5pQcPM#EI6Rp|;CeG%h# z#33!@dE1s}o1CVcY45Q#9h1$<(_@JiYwxqGS7e!&LC-oI)Q%XOtE$hgZKE~KeZB29 z2Xk+~p}xds1FBmjI40z87PPK} zenwt@)6>b2wv!QC%K?#ZzvOYj4sWwO(x{VI#eeg-0vsIs^PJv|R6s@L`9qe1ZtJt# zzP%?bB-+n5!jc0yB@>z3c$2=+)@l+^x@SzyL9Efi{dgTis}5bOL)>vwKh~XnA2=J4 zHyjrAE`2sKt2|%x^hXP|rF68Mp2`p|1xru9xtIPc>N~)UtP2@NPMa@Gb}-p-LkM|i z(f}aCOx?4XrGv@yZkE=LmUeIf1l+^h!5WSbaE5zY+E{v83Rt^(!1>%TA_?5X(*bis z+}2iHL|o8DR8YiPL`>Mq%F0GaLQK@w(nd@|TvW)K-wokxW9^obpn;iFslqBieoWVF z*+h>M`Q=LGpgEuyZ_%xJ)K!!-{P*mvyAm3)T_#Y9Ry|`G>00+kmNL!J{uLJ+jHP;^ zMZg{^MT@o1T;m4z>vN5A+s(L=aptC&d90_ zo$QXZV~&BgN0F1~fk(e8vbHiu!VenN<-Pn$2lDZjv!kFad$LM}pC9>Yy1Iz_6l!wu zSSeYjx;z=U-$(h<;aS^&$GLF?yhFmSl6=Z}vg4xzwBqH17UoPjFUb*!=h{~||E{sO zk~;|{F}RE4{!?RN@~$qPa2HQ=eLpui!t{4HTbBGAJzzKny=bcjULaJX1yHX|#BVW^ z)K`4HmY)32ly8xd69UYUYdPpoPd{mkq3n?9P`BOwS^}o>yeDSGtDF;JpXlX2`r_T} zx$Yn;>4OG-X`_f0t5i;4K2-*Jh*G++!f8um`Su(&*#ND_o=L)+>Z%ztFEM3Mey4OSwwgceul~lN0 z8*LX_d7f(2xw@3K@5c4+?TBF4)H|-rjun;Tcsn@YU-sJX&IM&1m_(rT6r4VSFYZ8P^Q#%8;y-j* z23pYsT*)iFxK^Dm`w&2D^HV|81ZP}aTMY}F>bI8kzevrPQ2&qL4dMBw@lDnBkEJkX z`~E|Ny=iz;X8dF5j}droijFs}Z>nN{tcfrY^WQYGn;ve;Nq;ys5C5Mx`F~2xP1Bom+aFV2;=fJ*>lAm>%guK5kC)dNEeP`=H=EO&4sPbTKMq1M p?d|{ftatPAH>v*T@zQ*}3jh#fj!sOhI8guo_dg^H9$x?e literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/SortExample.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/SortExample.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7f8ea3972c611cf13fe87308a1195c21b46fc7a5 GIT binary patch literal 11994 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/Sorting.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/Sorting.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5227d406e21cbb9b69a4aa7bf4492f08b9555426 GIT binary patch literal 19982 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/WalkingRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/WalkingRanges.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1b82a8fab4dc8dc3898c1fe819e5b2df22362651 GIT binary patch literal 9353 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 NyAIEdfGpd;{tt(we&zrG literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Rows/RowCollection.xlsx b/ClosedXML_Tests/Resource/Examples/Rows/RowCollection.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8855354929be0ea515dced41f35119385720c688 GIT binary patch literal 8363 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Rows/RowSettings.xlsx b/ClosedXML_Tests/Resource/Examples/Rows/RowSettings.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..457bb99722df53c7fa585f38d851200ce62baa71 GIT binary patch literal 7312 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 Ofp;^2Bv-9r^4sA{@N-++M;frEjefPsN|*s!?U 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 I_v=^xAD=&Oh5!Hn literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Styles/DefaultStyles.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/DefaultStyles.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9e9a109e511ed1ba10a58fe0218fd8bf5b5994ff GIT binary patch literal 8757 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 bQNYg<799;z99sYYYTR2BC!;-Q$N%~tcTlJ5 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Styles/PurpleWorksheet.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/PurpleWorksheet.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ea00b0c9ea666e16888093140dcf314d6bb9ff7b GIT binary patch literal 7306 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 Ef7{(cm;e9( literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Styles/StyleAlignment.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/StyleAlignment.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ec3232fdb0324339efd81a634cd43e5470e7033f GIT binary patch literal 7591 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Styles/StyleBorder.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/StyleBorder.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bc0189809339b31cbd500b3ecc56417d0fe23830 GIT binary patch literal 7625 zcmcJU2V7H0*M~!IQltygLK6fMT7p18s&wffNC`>k&4en5NKv}wjzEB>?-iO>+bvR2fv$k=lti~Gv}U}d9JP|0Ud z@Bn}&>_H7U4)AdXdAp&VY~0+OM0{MFId3xqPGsYn|L0$Htb%I`m`0_lVhq5 zx%InTla2)^Db=q_N1nDnD(TInlKDg})KjOcN2wiU(e4{dX?B#aK`BLIp(`TQY!p*c z8Miq-`}}s~BcX^hI>QmEUZEWxc*PYv@)ggHk~6Th*^g0llfQW-H^Ew#$YvGV&QcXk z#$kfT+=r?0hx$-$-1Tp+xJ3g!W~uZW0awnc*T(Z#MSQn7R%727i$d>@xAifOJV{W* zhn#RSQX-2IOdvNaM7K?ll2=~HM}Khd5>Pq0YTh6B^#yv}uvhg>s^2n&E;gd%yYazA zlw}p9oPiGj;0_9GM6J*$XADRL_xe}S{8ZN{E02q~7YdDWaC3zLMMc0sPLwOc4e8)& z2LpO~*a}Ml<>h4cQO_BBxuaaMXKdZj zE^rU*SF|0-9gc8<+o3>WU@!!P_2!2L@SrBAp|3mY?0lx9FqbtDX^ZwrAyQE&-c35XO#!UhZha)SQfTtoSIpj?qCq_8_0 z8!WVk0}8XxKcpK%7yCN~1b27G-3NOPqScY2|GiItJ^&yWlm{FM_ke>CZfMlcJ^I5M zgF<^@qmKDg8xY(EENUxm14p5tQWBzKwx>{1rz8*%Nw_Eq1rd|75pl=3AQA4r$6Qnt zfdIq7QczJTqy$1zeE0f52Xagfm*782Mk?V}9tvA7vWJZub1jUCl`$i_ZT*xT_H3LEOL{&w+u6AxJ>lbln36eN zwJE9)vXr!TMSZF1s4<}z9@!v?zZ zjE^#L7A|$@=P+GR52mF*7sZ}?&2cIuiMCRr4Oo)ZQr0&#Y*zGf+*k2}-SYE3yvLpX z+(W1Ym!Vovtt3qZN3&8MWa5O{fBBYZSID^20iNTG%9klOn*gFz% zG#`I(^(9#mI!s6CZlHFF-<4odN2LvJ!Yy+zmqktT=u2Mnt3~o$lYoQ66@P{6J^^;P zy0P_$ey_q~?BQq>(!c|aEi9N{mHEneZJkyyO=yXY?^!lefJTC$Mjg^9iAeKg8jrEd z*;0N9Z$xukHNLuDz=?RiG zaoH7Z+R9rSZDP(s?b}z%JMO(Cu0l*H+@~H(HBt6F5z;3J?k_1N9`hxV<}Pru5b$3( zJ=cKGnbU4TGfu&sH2aq8UP)rES_q#?N-#oH#!yhEc;x)V?T*P&CH8Q+{+FLN0lq;& zB1aP-0R4$3+Sh?=yw-_Vw<+wS^LSe(rP#q&?Dn&CMvHKM8B`Dwlg^%`;{F@{Dm!dpR*bZ5GXlGz+B(SA1U* zB=@*XUfhhO zpv&ENPQoh238ajT?yGnQ^AI^KHZX+^*(y5#K>2$fdiXk{ewly^=O%Qc@?)a|WXBXL4@`b%IBaDV+8Z6nhfMtmC=!nl$rfrbMSkA9IZe+4CmOYH3#+Q%4I9 z?%e)(L(_$@boW&urUxyfsSi%yOD42?(js`ZBj-8ZJ@D)^+nE=F1r_)Osc4tlfEmIa zuekPSOUq<^DylZ5c+xNhwqZqdb4s~sO8t!s@2^KO9v_D@wvri#=;@rN70)I46m$EP z8WA1sV;kC5o?|s9WnWhVN#lzJM3=F9KcH3vTcF@2HAAF(HJT9+qtBEQnO9=CHX zKAIRlr98~fAVXUBpw!}pu$Mv0aAnUXx0Ts4WNU>n*ju~YkV-pCkh!{eWZuzCJ4|c* zYFoYN+scniHEUhB=9nMi6_8#g+!PGuD_F-~NB*L0VEE@`q)2t{Io0upCy&&2y@YcV zHOq}MufHj>ZLAxd->6Fex?@}}KkT@EjkS$kSchm~V2QC@F=0at_6kCpsMt@^`ZQCD zA%rgcSjAiK^t+2;PkRbz?EBxjDI&7kK6`>LTtZ~@X3JvO((m$g6HdfM)_iLIINOErq;5j!@RHQuz3KbRE=^^`R1>qM>gXb=v z(&rV@6a;o-(ptFhY7>pB21~J@A=EIP>`r_Dc^&Sx&5>R}raY%@crVmQ@x!x`)j`S{ zE{L%@B`dj>fl<(;arRPEedybkav_b66wlG@o{VSrm~9e28=okd6SX6 z(7Pg&COq964jKVQ$qX+B@lR2iKjmbKe$eN$d4wO@H7j?$g`A(18joWwu>PeYYbJzs z^QwV~WlgPH2wum_ji6%V?+?tb4?FIB@&$E!yg}PC#FCz;yyQ3&rlI->BauIyq1v3_;}O&G8%s5MetPEc zGCAsp_QJ+Gyu!!d@t~E*BGl1%m+{616oehKnYO50Bu4JAw$HcpoJ;6L`aCP)eJANn zOFYg4oz9}(8B`71Fab_Xe4IZcAiN0?qn-3(&dnYmFkakxO(p60Y9pF7+=x%RsErlL z?^LwL|EZ?Pw9KgVC{jDtCTBsV`dh=br}78uv}akIWg#~E>R15)y1fkaz-}r~pxxJB zCf~w2?dxO8%sVH!r_4LmGi*(?3$-B*w~XO)L>CmM zJMi$5%)$v&wo^laC;E4YEM+YHGNS56ypF0kQ-#}YKbqnQ=sdOaKBe#_$JHZjG+YAL zrIRr=wp_Hn{#x9Ph@OEN{ju7B1;I%}JTfwTcOK}4PV&SEsEhf<(&$+fdjjdAb~R~P z(4D1)vZiZIJV>v4W2X_WyK$kwc6 z;NObFj3DsYtcS`@_oi}Cbt$2^uHFe^Wh+b$5JFnjIleX2GNN$`3I2>xOx26ZTT9g4 z%*p6KCIKyWW}^K-K~~rl&^Yx`hNzSN3XJ-`r*Tt{!r1${^O6J8=p?_AxuJAT!t{_1 z@@CbCW1i3_gwa9SHHy!QE7Q%_#1zUo-A!EHxvpI-61!qfQ(;U>YyvUs;SHi^0JCVD zyi!L-(#)ok*+HW>A+N@KMd-oiPb-Lm)r@8>!Z_ST0jF6|_w7RlWcldk@rtjt#$`(- z1wzS&Tv2|R=O;AVxZabo6vnItMBO?~-n|_8DaJ}xsS}jR4!aoe`CVsD=k@FCU#)LH z3g@=U^Iz-9yL@Tw=x?hdFH180EfqLDgQgn3ZNAKsFFY;CwzU$O*C>Dax0R=7cQ)6< z$r^c=)Hl0|P6epQ#kF>;2Wv^W7cuiIpkc&JkOkQ7q-GsO6c-t(_DOByjL1)?i$}Js-%$Eqo8N1Mt z#e_R&SXUvLDs?>SJCP0k&r?9ZtvCt#FSwqUur|*sG`I?%jfLHcS|~il{SY-;%li(- z-eg;=7QS*zj_TElvL)F&iVREc=D}-*L|^b?6k-x0mQWpIDJSM=spyP(S3f&zG;e$K z^-w1QIvuZFXZjM|uP$zvSnOXA>Bu8A#PG6urD{5Z2(9fKW6srgsb1E6RbYU)rRxSk zo>AXGBD*az!$>|T*w6MmNETaDb4 z+VXXZThNL-7hf};$;_1&*uj!$wv@;pd{3yF97QvQE zj^r&Vr9*XH8ERqFVx;V&9$;UK%YL?I$Vob4ly)c29it;AtE9R7+6{C)a`BP2L9vxjW<@Ru|a z@ts$>d!n6pc^47^LOEmSEm!QiNmN7>1pMCC1BG_^fz0+B?4J4F(g)-4UDn&%Tf|#@ zR~QS>L_wz7S_ZqUP1wN|;{kU?pnli?Zt-_f+@G=^IawrP*CA;H8U^=2Avv)QNqg+V zxj)XBh$|@@ssiQ2z@k#ZU@>7as3BNV8Z03#2@w$&gNTVrNSVok{%HNX&JST1EL*g7 z_{Yjn$SEiUDz;Dg4xfOgr@k0d*q*hC5?1ORXcZgF9*S{ZRNk{#drN*IdXV+@jv;nEB3ud&~6#P z)*w85VJ!Uo`9rV6Pqq#{o7gk{QNj*B-`Q`hkDWR9J?%N%>p^b5-%uP|4G-TEhpi7{ z-2K+m*v;C{a{92sL2kKUL7Ze);ZG>$VV#2@Z@-Qs>7FOwllrjfLAtTuG?rr5^n23m zXB~%C4(?F*tI$&IsvOR!J%JxXcyOt+Uw|B&B>(!t=WzE2C&B&QyDIcBx<= z0SHu!KWIQlK;AA8FE`8?J2$s8BHpep958UC=$wh@Vr{Z#RV7Z1T8lK^2-XVsqEaXfCHN?~9wXb|JhZon4e68Fo-OntnLr33U9@IDZcOWQ~#K z$m8%#^(04Y(`d=`*Zgx~h3~;u&%bQkekj6`RI0AqYt<~&NBw@Nh9s_LRPbJ#?cnr^ zyDKOIC<>fo?)=CmKynio;$+->cuZ*o{FWZ|8Pz7Pvr&I38m9KL1QV}F6?e#$GA5(; z3Z*kgMwcAf8H;E;8JnBk)WF9h5D^lYn^ti*8c)9KH-@q_bS=I)WPr~n#a4DU^C{7p zT$@4&0&O1q@%cQB0bH;Uk>jor2P4zC8g9*2xV81&fJ@f;j*b!VT$!a)5$8 zaQ4EoU?oKbBftfY!;io^I-#)~coP&B3Uh2!vF zF%A$k9B~Hj06@e=MWrG5XntydcWZK(_@IHmqv&RD?}Px<+z=kF01EdDVaVeC8sLosP)GnNjK<)Tg~2%i z*d6g9-4F)&|6?I=GHDLZ>fq!?K9eSXU$h{VnH!6d)xbijM8LOxA7odJDQ*_{&xY|rXY3>r-z+qUKprl!o&t~RTJCSHm~raCNF6*9DmcPz&}~Fp!czD7(?o}+&$;uVt@$eI zJhG5Tea*T-t^PWrrA#8D6ejiIWAU zMrg|FQXT%3kG!o@EU<61B3(W4tfQzv@yQZrfN1>f`qPvAUMn3=(;)WCa@>Ul z##VwMPqU3?v-}43<;FA5@lmhLwej{QeT7}0ARtDxvY(MM##; zyq=$dy!3N-pTBSB=d&A*o>LLm>%n%ZvfCm6Lw=tn zumCwsU00(S^R9o|5SbVG8WlL@oyc2%CzW2EFT2~;8;piVgXk_0Kfy~2|{ zRQ+Dupmg~%108>UT83M@xbWx5p%Fel!oZw+%K*m(A5zsp*&^=AC_ycyqKSM zzk)V;mMK27_;z;~6Js>gmdgQX{gte8&V3zkM!~bN0HQf$WXg zm!w|`#etxvrWER=82y=$te%x9rD0*W@J2_uoY*lN0oPkoXN1+w;>ixyq2~#9r)|J= zm@yWgvf%w75Y@MG!uhxWzpbNLvq4mkDD79qCv!d3u&`%&{dq!RCbCX03L4 zPvo(|thyGW8_kdr*qwex0jl&ox-lM!R&0yJ=*RKZKDWt3t`F;@G}TF>N7j&}1g~@3 zjzYjMrq-Uryi4WXlC-@dUS0`wv}Ljq9wfVB*{2g|Vi`w~Pj5(%YQb;{7DNi{&vMp6 z-x4aca}>K?qs(~gh-LJH+&9{SF=4@HBo@ht*S!+epEZxN7O881$p|b{GcUUESB|vW z2q8CkA?F@BHZ)L|k@227pdsh3ud7YNmexrWL&3`(qfXZ#n^p;lKwBMfd(aZW8%L_p z$_S*gTP&1*?!PpmniWCCSsM&RZbTjY`=w)gfgwbn-W9YgL6ht0eWJnWRKI|l%$FJ5| zqH*q(@e3&5{X64FLW@4-S`5S9eZ(pzZ1j9~ogZcG*wxxR1O&QSusFHVIQzryskCvZc|MK0Wah6k zJnH^mj51GL)_X3~KRi_|?SDn1spi1Zpe!0*5kFIgK>EH|6vqyP~XSGa!-Ol5<6+-F*|+u*m{EGF%PX`d z7%z9eeNMBxt_6Ho9}(c|nur(#V%o0j%|?KA1OOZsvh^YMyH*)#JcJq$WjN0$xXeY+ zEYF$loSUaNKl24EdkLd__TUD+)U%gwq_JP0BS~zN++G)-i1X&4i$6E51FMFol5-HAzMFk$D z?9#dJge&J033J=;OtT<~2S!R(5X<5RjeaF`>GrdJb)-z2^%Hwbw)k^9`_ zlQ{A7h*59|vsO*UN26jNy$k6#z;4;*pR17_g7ww?f0$*36|WT!IZaav39j(w8b#!1 zAmRN}!6$USCal(HLRr10pwgVz7DtY&8i2nj-oKi9QR$LfVM#Y3G+$8I+vIIR}nvYV?P;DZi7Femz^FdWm$! zosQGpMgKA9cf?UI}R;?6!bG>{$X{U@K&vKS9-xOJTziXwf*RIY; z%k;3t#?X?uE5B(WAV{d4FVsDi}LUi&tOw-3d~NFn3GruOVE{8 z;9aUQxv3v(*J{l7ITqWGAY`@eEj|7;nVtHPD!>_>9l*kxf91Ro@^rQHq=~L6?U}$! z3s{w8!-$;41cQ~#lhs zqF?bu?=>CbYk@5k4I1|bJ!BpeM+T%hnG%a+vb6*^5FFQQtEJFxJBDqK zs2Aa1{g8H{!dC57GW6)%YW9$;H+jbjIfOX9WF4$U+NFoIA38~Qfa_Fhli$`uBWNPt z_~{tF@3d=kaYhd8*VKA$O?t6aF*HQw5mb?=~*S z)yr(0dto1lB@RBqgclL7pJ17nPE)Vu)>;p*J=>K8`SR(Ez}Z=pm831~M!s<{d^`r4 z5iy%D$8`@FsN$J|venyHX@-8vP^2FDq-H}twLis%tKs=&6OvVeDCMa5un$1XVA9bE zI%;||p7{kA?S?g6X9rCJsMYy$^r6+rZY>Figrc*#;m+Jby^MYLKUKU*A;IYRM8P;a z&($cv=J|U_8y{UK$}#QiNno=_rg$rjqUlnx(Fv3vl93sh_6pfZk8^#BLmt;2M79h* zhVhwI)!Qc?Useb(g;8Cpu}l>bD1OFybfVXKzmM$uQ}j#^M#Lj7X6Rbd*`MzzRYvwOlMOMrgPs1T6l685T zjTw(U6t8Y|2n+dYdp1PFg?CBR@s$;_KUv#5q37g5!s+s>JhqiI$ide*Z#cl>7J@!ji0OC2McK(B;uL02S>3*%suV^v zO+~EBkSl6HsqC619L`f*LJvH;*xPte_aId#O%K~*Z2GfB6ArR|)2rDzXso_G(v0nJ zPQmCH#S`z3$H4mnsp7#X9+47*n0txshxpNQ=!)DHjr9@hw6JTY#$EgfRn9!0EBx8H zO2l^^npy^(-COpdYZ_;&s@I8RgX1Z*Ytv(mUzggEvVDTK5t>k@#>6EJSny9==XzFE zIGFU|i-SV}n07Yr{*8Cuc|H#e$3Geq*H*S#UuqgMUUMxzSWw97)BXJMu=UvmP@r4W zRp*w3_E$R4z(1Vk#)ipl6CUY?7JsGMTuS@|K*7|fJO}W*t&Hu>U?r z+C&YTjANU9Y;z=eB;p77L3?0aw!je*0Rdd__bn8DAtWXu1_A#VivuvOKiShxgRL_^ zMtWnNe#m-xd5L&QYzgB@lo;fcp04p0v=VkgVR3L20{Eu?!{YBUtv`h*iV8@?RzUIy z3;@RgNDh2J^0+O^_5F;wgsPf}23S#CR7^%#OjKA@%0x_7UQ$|KN>oHlR8CG#O4d>V z@_qC-ou9(4ct~gO^v{*W#pUE=#C9lu7gAK%VnIJAXbZypEV2U$^<*;mwd&@vxwwF- zx}oqu3wL@G-eIkOw^aT6WwNEWJ>&m)MiARE32&wvi>HigfIZy91;?Sj$=T%NT$~VFbQ0o;LheDC!rMp@&z!cPqX-s_pHk%3`rOq;Wb0GJ74C!*+!Ds) z!(aH^M6qCwf8zApCA^6Peqz(Va`7Fp{WnhbFu)&fPU6Wh#t8{<7{D<&eYh(=SCGBz z?VtUuJ-Pe^68%f(c!>KSDCvI+VDDt^z*N5tKtcsum;dKaLXru(Q<5>d(q*7cQTt*! zgp}PP#^f0FNJRqd5NkDO5N)yB>x+5|ES`HHa4UzP%{B$!jpbFC(^@?sNQ-PKMJNl0 z7p6KMyixh=z-pI_*#6}<<CS!*T6RwuD59JJ7}t%g)cJxr~*MEPCAog%k1#CT3?VpHx%l zt#V00psj<3kWVKp;EjVyY<>P!F5foaR8iZ?cL0FJdHAAX5Ge^s2oHdE^+kH1-Cz)Z zJW5;fGk1=1<1%sxyV3xp#N{70mtzG8VMl9F<3&fuy_vu zw=F)TuPdDJe;gEn!ED_H-vY!MAf^8MnEreMpgsT|fkfaDP*-0p@bifNu*Lz{07BMr ze`*6&kdp=!KOZ4d@p2x z3x)iSz2}ox*A}&gJU6zD>#l#}F@lw2<%kiT=7$d-WvpVq`P+xN0sWwpp)q}>*QrFR zOg+<+G}QP>gbHP@&QaUAOdUSt%8Fwuv1G3j>Y&(Un!N~Sx~?v}x5QMe;6=q->e=&+ z^#XcdYjM|>?ZJu9ay-nM8z;ub!};EZKG}H0U`ZtsRpust&>%I)#h8~u z?8Wgir3VHsfJj2w;T=o#nO>(i+7}^8wWC$J2kpOJmvgIT2vix zm-vfSNM2JfsP7;PgugwX6l>SdlG5HU_?07>)$8FUiFmC$OSLEQG$6dxqj(`6ys>m-G~u2y%IH}3%8J#1iF$a3B=VIg>KmBah7 zP{=K8oZOB2isFHAvI&(k^!bl-bwT!%3P;#~YiaVDiVX4al1gQp5u>-f=*cJ367ynk zO8(WUl1>#KZdz-+INqGx@Yn^lP3IR)#i0^4Y#6|J!n~eTDty(omP8v31kv5SH0IV_SGMd=lL> zU%x_{Arn({sD3tkc+Fc(ai3K?IW?j?(nP*~qi=bo_rvGc6Tv4q_pEBhe4dsQyT-;G z#GW%1$Tm1U1?vo`QN8EP|J3=Bo@HZC4W;0|e8w?lHaaWbl%aI_;`{olm*|VC1t08{ zcpV%)FGyy1NqGwL<;;Qc`Wv-0Ybq(3YVEfM`91RlW~mR1+%HblCUZP<-2#xla6^2~BkPH3PsM%XI^C5nC%%X7VDzz1Ugre@e9kHw{*=DPuQZhJ+7rgbUYpw zA9bRmo$h^nOTHf+TF&sLcvCYZqSc_pHr;!F%*krl-GkiRRVrkkKfkP8zGKsIk4ayL zg5mwT^Qpb>tohU2cq{OqmYAI!bB6}g@?;u@NMxm{Dh5%!gLM)^k?K84%-Wo1_cb(T zfNdCkPD|5R2uJYW?gXlQsP;7N03Pqyl*y$9~OI5TeC>Z0A&XrSr6z8?Mv62a)o zY@fS_rYgEPvQqm!qHLfZh4>VEKfXw?Q@q@3HQj#*a~B zlr+cE=SE@##8*wvj&Oz{;k~SSz2pjqCNi|Wl0rOBUs;-H<#3Vk?1?N{cGAe^Uw;3> zozp6iBUS%a_pPc>s$f1tp?-3~H+J)h9jJ8!6`WU99_`VDC-?1{yi>*BZI0>;i#-Lu z0*&g$VcB#2K8g<8GEabDoyu~rrzj_#7vPqI=@sUxl)Xzn-EZenYm!C^OpI->a@ef` zPnHF%-%c5LdksRW%u-Dqpu?eQp7&y^F&mVSc*Vt#yIbM9Bx55)ceNdMT^{Mn;_Z}%6%;>16{(Er5loHjmn&(P<~K5gPI`eE-OL+{H{NR)dyw(1%|3Y9V;kv!RF4|JP&%1X zP3IX{5nyy$>B?l|xcI^M1pzNTZy?_h2ao#E5(lGYiGwVY#6gRKsPRcFg(8im!C87% zmM`N9Q3(w4G>5NqU(yV5D*;5W>#+biAA*_7ZYsgi4I5ECJ)%2%6ED+!+IT`=>Z1gK z4t%@Gwz?9|9RTn+DDfoqtHmK9eFA-6o$<62g`X3ys=Aux@NEq<(K^F4i-A>2%9`8P z;{r0LR~`o6*IN+9X9>i_fCm!BvM+p@M%9s8C;@a^ND93LiL+AwMysg9h}ypw7e*jA5G@$DdB3K zHfme#A_+V`9XqGtqr_accg?aczc4d(<)pNLaoDPegn@exJ>Dk>eW(0po=zO*;B#u% zdgA2KkL0qmtwaXGL_D$^)Jw_e2C44Zh!0H(7}ZLxSZQ@QE^ml_ zN)M8vC$E8pxCRd;ix#LOo_R+fITN7!jI?wib2jSw`fz~R%yhx$0{HDF=X8#ax9#$E zRyAxZoL{L2+0B3(U^5*nTsd`Wsbwfs!|^$P+ZnAHo)=FWX2obf(`3N%`ZwBMjE?D7 z9PHQCBH@*=c=(%|sZcukM!S2ttgezmo%2xA$Kl)+(cw4J88E5_#5fz&JfT)^?$alY z@h=oRtJ}Xi*|C%Y1ZrjnftbEkH=eLH0-(gtUl#VFjmfzQ?E{;ld{6EA402IcCZ#6w z9)*(ub?mXhxr$6Da;p1svfs!njBq61tv;B=P2aBt@SZM- zWali+2o*y*HG96aFh0iUbt-BFr4`@ux&)Lh3%wW?`RL+g&7?J0k>IHY`-k9)LxJ{lASN zh6iKi^9sEhTrM49$5?AgMQJ5(J0K9r%p%EVVl{1mjANY5qIOeASeKuk2$Eoyw7XMF z5v6}@*5NESMhc|P29&v<8c{jK^oFG3OjmM&VtTj&^(Y!Rk!L??)Xh6j%~qPY8X8}y z4!-+7?roxzidG*qj|&zYy7H>8sPEi4t}o6PTVnW}E{CiRTn;2G-2H%o3TMEQ}EF zoobhf)~Xp*L@KYyTSl1O|I+x*FfkJxxy00K7G_*5yKj(gMJ z%et?8?l#g-&OLAp?|NLOkU+}0k(aC4>r#6s-G;%jA{$9Z(qZQR;;q@mLF+f%a5YIm zBdpsY)2867YG-7F9coa_O{+RJj-I1-@5p6X`>}Bq@Gohb8 zc!`88qU~j!?ea^_Pa|fNV1@CErAmA^fbk}QS1_)2RFi(pheB2Q=?~hD)URlA9r-#Q zp0S|#Op>UPm>T;I=$*(En%hUuWGS$`;%(Tmfgc)RNCWkGo;kPwbHcEJj9Xeo$kjMc zez8%OM-3n9XL2d9CP9gIyhA5jRqU39M<_e{&y!s~HZ+pPg+k^YS9^}xcL8@UjrLs@ zvJiW>UNOP{Y`YH?I#R8YZiDmmflk;b7nqih&!r?;>(?a!RXj$%vryn-=c%R%aqo#8yS$RRT~R}rA&8cKyI*WFYKztdo3tKxa6uDd97Pl?}Vpc?;cER=bNVHO)|yPsbIslf@Je&)h?7= zA7HmgEod(!rDTrV2+y78yVq1ck@@bEn_C%#aq(J1{_Eq{f?CXG-Duf^&7`jexcjy`#R`KEvDMJX?V28+iH#@syFS->DnMAL~t|c1Tw!;7wS!(1d3) zDG4bkhgXN=k|fwkps+uKr!;hp-QUkfJ>Pxw4$Rq@<+mHswErR8@!|?#BcX z3D}P!+nd%-r9ch>Z5>+=7j{~{XaY^dJ8h9uoWrl4n*V;85cU2`#OwMkCh@IQ;|PdX z8$coaz41IcTj28>VJ3pj-(%l$1%nW9r?-bI5e-8F(8ygJS^OK%B>+Dn@s+?~2vdqA zZWVmIC5UGUAA|>5lqgJKw?FZ@#layw|HSFI1fZdb1jS>DbkneEj-;97L z`YYEz-Ln3RQGD0`RUo@}7ynZXM6vH4p~N;o=s_f;;sl2K^A~r!-_GrN!}87eM+@8e zmTJ2(oUn3kduO%V>rVQ=-B60q4R_xXyRCQ9=Gz`9&QW%&?A)PlR~e-zs_d?)ZvsE2aOb1W uc7Z`ck^JiqKD*uTTm-kfm)Q^c*^&r1q9C9q5C}~8Z6|=I8-%Sn2=sqVpCe2F literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Styles/StyleIncludeQuotePrefix.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/StyleIncludeQuotePrefix.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2a8640263f7376d0a8e15f378ddbd2d962727917 GIT binary patch literal 6475 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Styles/StyleNumberFormat.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/StyleNumberFormat.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..23184a36c294e453d7b7fae3aff4529aab63a001 GIT binary patch literal 7432 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Styles/StyleRowsColumns.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/StyleRowsColumns.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fdadbd38cd1282910645df96d6771ceb49c57757 GIT binary patch literal 7585 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Styles/StyleWorksheet.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/StyleWorksheet.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c7f06529117bd4396aa46b63149a7aaf26a8dad8 GIT binary patch literal 7511 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 I&dp!{2QzJ!Y5)KL literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Styles/UsingColors.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/UsingColors.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2d49b85c3118e5324c9bd29883f6b6cae1216d2f GIT binary patch literal 7855 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 YiF#W5$TquC5ngo!Zq-jXnu9?92V>4Ij{pDw literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Styles/UsingPhonetics.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/UsingPhonetics.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b334a6d6468696c939c33eda462441932bb51161 GIT binary patch literal 7443 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Styles/UsingRichText.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/UsingRichText.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b83ccdecca5cc7eac00a4a77078ee07820a98c9d GIT binary patch literal 7686 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 b(9f1c4HZJ7?PjF7za|_fg5r+mAkhB-8KC#U literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Tables/InsertingTables.xlsx b/ClosedXML_Tests/Resource/Examples/Tables/InsertingTables.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..929b38bbfcd90172b13857828884ace6354ca10b GIT binary patch literal 9141 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 a@GmL_mV<+A?w=xt1rUSK#RKKf-~I>hq`r{= literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Tables/UsingTables.xlsx b/ClosedXML_Tests/Resource/Examples/Tables/UsingTables.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..70bdab774d6008b82ddbb62554589278693c62b0 GIT binary patch literal 9299 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 tBaB@6iSQfqU$nl+u;poLu?GMEfLvit-m=`3 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 BB60u# literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/Charts/PreserveCharts/inputfile.xlsx b/ClosedXML_Tests/Resource/Other/Charts/PreserveCharts/inputfile.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f2c41f26cd8a6b5a6526d70cfc7ce17ef3ca1a3b GIT binary patch literal 14252 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/Charts/PreserveCharts/outputfile.xlsx b/ClosedXML_Tests/Resource/Other/Charts/PreserveCharts/outputfile.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fe5db26a42ba7bd7d30e0756102f900fca8ab89e GIT binary patch literal 14236 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 IhPS)_2mY{^E&u=k literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/Drawings/Comments/inputfile.xlsx b/ClosedXML_Tests/Resource/Other/Drawings/Comments/inputfile.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8b42ae4eda359022f778795ff46d8ebb384e672f GIT binary patch literal 11822 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/Drawings/NoDrawings/outputfile.xlsx b/ClosedXML_Tests/Resource/Other/Drawings/NoDrawings/outputfile.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4cf9beac40d99d9166f5d72219ae2618e6653750 GIT binary patch literal 7756 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 E3)%_FqyPW_ literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/ExternalLinks/WorkbookWithExternalLink.xlsx b/ClosedXML_Tests/Resource/Other/ExternalLinks/WorkbookWithExternalLink.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0f7532f9328a4b01185625f7d7c1bcd184c8aa95 GIT binary patch literal 9618 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 CWcn2V literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/InlineStrings/inputfile.xlsx b/ClosedXML_Tests/Resource/Other/InlineStrings/inputfile.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..976629d11e937cfe5c70cbd5d63ce20c01b85100 GIT binary patch literal 8671 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/InlineStrings/outputfile.xlsx b/ClosedXML_Tests/Resource/Other/InlineStrings/outputfile.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..20f73ca28231288f40356ee78c2da57b9b3fc3ea GIT binary patch literal 8679 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 JS>ngL{{vx-BeMVi literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/InlinedRichText/ChangeRichText/inputfile.xlsx b/ClosedXML_Tests/Resource/Other/InlinedRichText/ChangeRichText/inputfile.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..16ea00d5963fcd393501f361875c6b75d1102291 GIT binary patch literal 5629 zcmbVQ2|Sc-*B>#GELq1=F@x+4vhP_Ngd%GOF~&MGX2vcOkzLsV);spJkfF zO~(MA+E7gEb86YkGwPjTUE(y`c~V+G$(kXhjEsLG zAo)F~kkpS06?cs?MALvlO`J_`&D-YBnuwcb+&;Tcdf@YTw2FQLCkS` zTue?cK%$be?LE{2f`k2 z??^tO4rnYw9D^mpgT=cba6eh(h;}e0-^cwn#j4A>NLb*G|<8r?57!i^#EMvo;KSeitk{_91BR!ZY;4O}%$)9JIqakUIsZRrC0t zKimHLFs0*^T=}2~BM3SpFQl8(t4`Wm;@(SlIN@*MT&kGn z+5w=b*D7(oV9)nfPbSkR>Gkef>=ku8%@kQTuM(enk5G*))~-el(-8Czk#$Tx9c6se zh(K9^+QXS}m_%&L(4dRlf?g@p7sNbU)!LU(r86BA{9~0?X3E)W!Lz#*v$r6)Ia*|2!+bY9UdRLf&2z+2n zDaUHM5guM`nbl(0@l@lh3$yj^@c3Jfp^ta2cYCU>?wJhX=!ta+*ff_1G^XyO^tCD6 z^_1ZG?WRRtJr+tT9KGa*-8iCpcdvS=faljCh# zZf!6dOIxilq4ge&%1(qe>Sp8|t!SFfR_SEFowaI2J=%RbR{s z^r*#w5Sk=k(dX3V&Z^Q#t{%RjKp|U_ zj8s$6Nhiy@dBQ4%Q{o+d`UB?oW+K+Kdu|Cy^Ehsh)>V<^M9X#D*tu4QxpF_n2;3%b z#uJ70IN9MquwKd~x8&JSp^ZtxH=tC()-*92bC=2-atdT~Zf@L>(<8JwVY1LgkEk6b zS06M#d6(Z(XM(`itpIc8F7v{~FHNZ|k=oY>ZbybI3@xM4RF*?ji4CGBclOLaPXZR^?Xtk0FQ`}nM&DBJT>jjgUlzSQ*hzScT zzvkuMXCR512iDh&tyx5w>3v;oEmJHAqqoAF&ORlqpc!;|e6F&mx&a0W!H(G_Zg^Aft7i=_nj8n81uQNNn@HUg7rr`?JCr4ZQ}ZD#FT>lk6(y(DGC6Dfhe!eXjCO(N@^Q`s2pv z!^&OG7tMewwqG;KtKCpvsLfJVS4-9onudFZZX^t&b83}u3AlAl0yo%XW>qSz?7Hn@ zFejCse%6$UrJzDlMuV9;8->5Hy3)LJbLIcRNAmqD@J^~Nv6+P++#11yLYkj^uiS9Q zUV2{c*3zgag%2Ok#DuIW2cVbct({zhxGXXBt}Ex%h)qINifjCk@RHObL)pBn(+ z_?>VLs0QbZK;UuE-@YXOtwec~ZjGLjW$kH;A`~v!-}OyB(xVOSm9+!XIyzVDYCE}S zHwYQmy_$Wsd^?Zc>(#B;qjdK}x|pBgi1Dn?)Z$zGzkaNWH@xgq?}~Cra`fcCujldE zDS(@&pJe2B(yPE-_9I+oP4T?jJXDEC3T3e|Da`?STtE5uE{)Y+)BO1*Z zhtX!>lMtEBQQy&fEDv%eaWnnT$`k~yb*1=QE4thl;LMb8dYg9f=$T`h7YKoNnUAV* zwU4Dg`sa_B^YR=s* z@+pxdeyFeLyKal<+g{G>MOn$&SesSlcHCXgQ$1g$=2&cA>>)$o;r$`#&$LJAa}q`8 z1ec3eoZDA7@7HpcA&AU;{$P86munE z>ztd)Nh*zo+JJx{`hYKm`d})eeM+?FB80WM>c<*jafWMgrbYhTopYI0k=@6bL60jf zRFuo30p3#^-7Bgm*jflNvyo}ztV3(U8!>SYXb|AV<1d@qzd-KX1cl{@z4vvh$+ctB zhHGm&vfAY5sxpTf+?0r6X|yO*JRw%td+Zb~lPNwqXZwP*?gPFHu2{t}3a-}_T!C@t z`yPonZM9Z08^GWRw>VkFDsKaMoCj;#iL1@(VRwRn?OR3(>&p}VzANd};(d!JTaJfC z)3Iq&f8Xc|ioYqt9yyJpw=$bhz=LjM41}LYYY~oZ*hOmltxQmhM=zdybX=>7ATjT! zQRoy<^&$tdYI-+9X zBuT6KW*U*4p{W~`UUTwXiomsN=`$;0Y)5%eD>aXa+0E)y;IkKWSY)dWB)`Y)F(t07 z)5Fci6auqAb99%53|N%!AW3%i-O{_xp_P}-cp}wjkGhy<8pQ5en)qE7i&s9bHa1;~ zAJK(KY$Ryk(MmWL2rZlFZ8^Vc%N=kklnVK<9K@gjX1wQ_!2ky}el&Xw{n~(f;Qho=E_CmEOCxy88Z_VFZz4CY=@vP9*bF84Qm9%D|iabwv2oj%Szx4}LC zab;G1|7ubN!eP-!Z)G}3_E8yqSJ)a7$hPC-K~I^~;S_v#a(IN$)l-EU6OHggM&@8` z(f5t&C;R~WQP^>66tu0he4pwtDMJk&hMXd&^$X+;BMX_7tu@go^2QWzd(aEO+58(H zmnW(iQc9kkeKs(7?*l#&xl!dGP`@gqVuO0%ltW z*2RKbS_jyhr|*li;)T7hi3sL|IN$a19Eqg=x>RoQ0twxr8^^eH8PaKeHx!npq>7b7 z+`jtBc8uetlHkdhzK-vy2JDUOH({@9ow?)8z&%tOa7osr*#|E|0A zvt%FHeLwY@e*M?O?SP*JO{f3|{l-6<1HXzM-Xi=g>QD2V=-+G@e${ihto~U~+%dqP zi|k*;50{=lix-pe`EQN>pF;Fk>BD8m&(aHYzfIyVi;!Qn99}0sYq`M;_^VZ8tPi9< R7)C>W?U6n7ndRW>{{YJ+Nb&#x literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/InlinedRichText/ChangeRichTextToFormula/output.xlsx b/ClosedXML_Tests/Resource/Other/InlinedRichText/ChangeRichTextToFormula/output.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cbe3495c4b7467be895829c59920a6125b716d82 GIT binary patch literal 6481 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 Zg;fO^NT7T8l>(xIbOIR?5zb%#{vQc^ictUn literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/LongText/outputfile.xlsx b/ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/LongText/outputfile.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cc72fc3d300416c65617048a0e0a6a617bd80429 GIT binary patch literal 12135 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/PivotTableWithNoneTheme/inputfile.xlsx b/ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/PivotTableWithNoneTheme/inputfile.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..915c374121f18ed2486874d6c6aa114457a12113 GIT binary patch literal 14952 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 b{;x4m`vEG<)%*&PL)ZbUaQOG* literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/TwoPivotTablesWithSingleSource/input.xlsx b/ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/TwoPivotTablesWithSingleSource/input.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7ab44e80bc43fb88d743b5952b36587c42a0ec64 GIT binary patch literal 25295 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 JHU>La{{wb&7JUE! literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/TwoPivotTablesWithSingleSource/output.xlsx b/ClosedXML_Tests/Resource/Other/PivotTableReferenceFiles/TwoPivotTablesWithSingleSource/output.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cc39e974b8469d239d0fe3fb170ea8773b5461ba GIT binary patch literal 30015 zcmdqIWmsLk)-Jqox8m+n+})u#6pDLscXugToKoDqxVyW%YjJn?v*`0|dG|i&eAoH= zm9BecCU<6LMn*D5#>$eH1_MU}0H6T?Yo~NMz`y;21g3TEjVv7)Rcrm+@jUE)|*^|-R zpW;%DRL-qY)QVa&6M5T&C^-kN*=ivs2|hS5sCm!ubneVxwc#mME&b;yAhZ6zZdF7U zmU-lF2CvvG&63y7eysUmJZ!~(-gFrc%&qUwj^|h_B(uW zB?L<)yxxzWGj!2>hfZY0-&tDXET^+GsY16n6h0;?vdkB!RXyIhXTGW;)dytvT*@G@ z1-0!qenBu1tXq6$G10(LS2*_`u8_>3bnCCLk~YL0HB0DEXA;9R7|iSpY^5mAWZLIK zN;L2kwVkH*wfIqhKgw-L=5!7Q-{f6g0X8ZWjnDdK7PY7M`AC6~V<>v8UE0gST$I_2 z)t4X7p`S@$T-U=NA@YMqDZ_+5wkJeopHJiF$(5?8NI5${Rse)bDh{ivGDxxxRs_RW zfkd;F&-vx%2NX>B30$HOXWNxZmzG7Cp30{5`^IG`a@CKBku$bZCn!g88kef(gJ!if z+8X_Ymaa9$l*N?;!ga7c^cgsowPf z_(A!1JutAbH+okDub6eIZbqzL-Mnr7x4F^9Xy?q$pJ1JSRn5`f%im=+Vn?iPwme*k z?}gj^)fc(ZnG)8y_7cv>GHlN5>sXvFLB~`hMo}o?$-g=&syL_RSgCDDv(n^Rtq%997^pl#(-85)9 z3y0dU)HAUkN=;c_=OipjRnjM7yE0+|QOTD%lqamhhFF|(hpDwqeI=Vjr;l+f@iT@e z^}SlS;s^2I>bS~hq%myE$b=W^U2J2;k*eO1Fldw1Ty^%O@b({{Glg$u$9>d1LH;4u z|DJ_lK(V@7{&Vg6Zvx_91Y0v_8%Gg615=}aa{n45?#4FI72qO>hywsn{ulRO)kKYq z&8*EF&1|fh-bb!BY1Mj}9j#wC@VwVuk&-`7pgRB4CadfcE5a^ot1%fjg?H`y@?4^{Z-dnc6<}mtizz}CfCNOzJ}sGPWFWF zlZ?z#$m5j@+Z*1Jxu>%i_W5??SFYD5%HX4yG2Qlh`g7Uv)hNiE!7+*3;8sai97oY( zHU=_Pq!=WP`WlA(zE>4p)p_Yw_0XY{%B#VdQcDHmnaXva&&O_kYpBk7VUFs->C^^1 zMmk%}c`Wspl^DI;2Ddh2>na|_HxaYPdWSD#St~p-ttbV*v=+}shI|su?rw@#e-A_i z8{{NN(r@DU%)npz+)~2%uZIP3MOS3-3xjsU->n9i;%|;dv()?w=ti}Ju z#o{8Jhth|5Ov@9uOs7d{WTw9Mb|-DcUVo_dx0A>ChJ9YI2m1Q=Z{;+~R?tX|+^vN# zyZTL9+Vu(iy&CFvSuIjB1gY*NmRXlwo;%&c4sfW&w~yjGimJRWr#r%7q-p4IOgkkj zmRDoUdtto1=PKAtDc=0N3*4tfWkFC3?W!wimF^8@G%N)Vv3p>J| zjn5{lj3Zk=@ZJuswG9x0W|UT0Hd@;h>dCQ2pP7g!uR^g@>k?3pZhntYsq#1j+8?+}T)VUu4q>DLiBXfWS)IaX;cga3IJb&{2ZB9fP~ zwUyCG_OqMdk(Bl4iW8l9)Hx-l^8$6LT29*O=P;>iU8VtNj6;kC#4V;_qt0dyonR}k z(`Sw}Oa^w7)TEhn2U3arWCzsw917U6CEC<_q`vj<^+xV2Kfg?Xk0IVDjrl4EgqNA8!yvE!S84#SKiU!=+t%6`qL zbZfbC?1ldRWoW}TDQ%}hCZvG)<-~2@^2gYTT;rDq|Gmc|KKAC$t-XsR6~5whPkU`! zo#93)r%KyF2c(L}N>!84c^Q;#tE{bM-;r&-BX4flI7^(qhg*JH$F}=HHGVhxl|~PG z=tW%KAfZ;B8RubVLQC&oFvr9T&lo5R&!AWfKPD)=4d9O-Yquujzk(5h{Od0RoFB&X z!#&x#fiuxBR)s)vw`*$`Hc(uR~Bd+%6WvZ4Y()iZyFyh2=;&6 z;DW7V-S>5HK(;ZRNBEh*^BSBBfV`pp3kJr)T`4+P{GMfm`7sPDMEEiAfIvV61ZylH zK*Cy0_<+7p0-=?1!sGu9yeKDJK=~*q9R3qtC?;$`fnWjJ`cLqpm@ok4`x|sYU&tpk zL0kU@RZu?i2}RHsvI%KWKC%fy&==yr;nfww87m6>B_@+&XW7Cu_?3J=44f|}lkmf} zaM!c+J_pPTc~%D5by$FR%mm?wM<(G z-W!`E{O%Doe+XA9TivCa(W~i!_^>r@RU0aR#=#-ew`CpG6ie^X+IomoUi1_^JD9or zV|6XFcIi1bXLoh8-Jo=fS}QAl9pCCq7mQ0cZ+=NY)IRUtLgL1+p3H_eekwGMCl65P z?e0x@p4Wu=DsFy-TH}lhIs z1lz@k{Hgqdv5lg3NL(HLHTW7)?hlFyLt$eLcMeQ~K^m+Hu!d*eSC6y3;`UQJ1zZfo zI7m)*Ix3m?{ODZ}6}wK6lT|Jm$)x{vK`Yj<9Vxi!xdqYbt}H5rt5( zL)vPJJ^x;wMK=8pUgpcy^bJ_Q6mE%Go-LmQ*vBA7dk7RZFMobQ{XoU%4fsdL{@Y6c z?v38vh<}-ThX383Xp_drqY21l0s3>y|A!j?dc=Qt41cyxf#aRufr5ej{nXValK8}4 z3Z)*OPk`20JOhOlYldsdLX6tm*2+cQT+zR=_vW3y$``M``Z09xYvwO=c{ExcLNTy} z*ZUg;DQ3uE7AWS5*p9NNXVY<31A6i#Pc-E?BFOyIt*AMDN)37HNHi&CTMfnpmI&_b z)=dd_#d*y%9fbWg87F(lsX?~PN4EH#H!A{2n}d$qI{5(~nf?8<)H}5h7Iir}*hsTn z%ipRqN`X+TwT~yWr!fC#*&+R#B$V{@Esg$tJLKe?E_a3`uW1QXrdAFBfZ)H$e()^T2Zm%&Jk3eWJ)S!^Xb&j zH;33WlVx+WjZd1Wj5k5&1T(g>7;xdd$WHPm~YnS;uNnlGkZE;R1-Bh z_AzC;duYAx*Ha})%pT4yT%@P)QRL3VBHbjSBQFEaF*!ZMnO#Ky-ThdPH)EWGU zM%r-jPL65f72@vc;Kc%p%N8J_mP2d{If9fmJ?8>6BEb~TfIoo97&?*UYoxCvs4+|; z#n*J-P*7u>ulXPsi)8xiY zJu(SoTD>v}iDuzReg6eABo;Uts3+;Mzul#>k3Pbb7m&53#{x8qNz#dlZ{vCv6uXiJ zp`cBYQ6}PicfpmaO;rS^L6b3~djJx~05Uc}EG|G2(bo`4a0-m*0VEn6L?Q@4_6ZP6 z3XuHZYX~Da1y1A!8Z8PUkq;nK2E@_;Br$vq;RL53h#o+r13)DD0Axl05;H+ogpfiI z1va88NYQy;Xk26?FcK@l8ibGr5CsmROGwdmUuZn!Krj+JK~}_&0T2Z)B4#MjJzr>i zz0O1wNuGDA7A#XhP&2FcL4p8l;eW z5Cs9EODNGdUuYs^2yhZVL004tXixOpE@`D(!j~b@_7}jNcTE>7udt6?Yby?s=ipBSy zErGWFf(=X}e%UnTopwC>PWxc;PD=om!vV`Xx!=nt(%#F7#*Z0*gpxmmZ6v|^@%35B zq~y};j`i!bv*I@>-1OQF^}nEv(#jRQXH<4+)lxYGgiN`HjRZ29wjQ1I9dG{NEEy#7 zoztMbroKL~MNM0MR^h6Z_zWz;suhf!cZ|=+5{zR77M1@YwEn^2Ke+e@_w)fw(?4kI zdl@L8;%Mvh7~dZr$n=gz%bu|?p(8&UPP2n_H_&ePxfsLl+X5k3YqJ$xC?G~YSA^TuV zH!h{jh$vn}#&2bTeZ<*FJ)pi8rSBz`kiRvo@kky8X~7y)@V^ zObaIa_m+_zOT{5kM1;L>5j;c))FVZz$A|OYQqJm#l zc4=ooi^b8W#o(UEi9LW&zqF^tbkfJ5eE3Z1urh_uT!R(E*WF^ldj@ASld|HdE%}mW zdRw1Q({h>OHR+<+TupD%#HQ)oZ|-Pv%Wf8DWgz#Y;FB$mG~{KcUUQo|DXQT*E30vyC zApFCrfd+&C!{Ys~LvE%(Kjjnq|A(K#{2l@NAAZWrYRCsp=Wra;ADJ*3nKm^wRWRoy z(Mq&A`w2H$88f>3_Kh@}4#u$cLMa&MVWq1gF(yIVW2x9DXYH@Imp5$#Ipg`(RYh8T z*ZNrE`C7_HB`xZG&CU+YQ9wVXQDD_Lqxe?QJuL;UdT^+uwqM*xBhl!213+$9Bc)ou zYu*}u5;|v=l3uWUI$`uIl6)qEDn4rEbXQkayoCS7P}YFKiL(*K%GZ zL0LQ33fH*)AmX7?uKtv4^>=IS#&qdNhN9*vS>w`={4?r{-a|_(tf!iRzidW+Lab2H z%;#IKb`}>cm9MC~H&7RMInlA+VIw?X^Y!?R)@ z7dnnvJ3pY;;)43E`=oJ1rp>wpqB`BPPfMSfYvhxM%k}RI&S*G;Cs(`(aZ5`+Th{c7i?|3AOJ0*Lh&?cH zE|E>NPzN%(SWf9p*3c_5xj4@002bMfgjBPxB#QqDk(|>gCfxqZV@ZFdHf6+94?#C%^AR19?z|RLDz~R^&o&H%{Cu(%yB45j%)g(3HOdn zLFxh8+^2u#Y{{6U9)z=`+2ym0Irb%u5kYPLo#T-2Fy=UxG{!Z}Wx~BDvzK~+H>LcZ zL(e%4Vbb(l1~c`*pGDg?A8yRCGl`z4x^D(Y{|-6!h}dvmM4~)6S{I49vrZvqT<|+z z0G5#{l>6-PdU1|<;cA%%7WXNn@)M-k=ouMkJRg9arO+9rke0){a`v^E} zouj=QECiUwKg}q;=Vem^l6Uy6(9>l{?K65{eIFAo;-5xT-iy*{-iwaV0l*S4IA7z& z@el|>uWq(suVmWy5;KhV5@EQbFyqG0g%E<(D+TjVnVNGphc#Nwd5#P|2X5M4I;t7- zvwKcAz~p7qBcM<+2SdS=P6SXBvPpvrn)wM$cMlnG!gr^P1TsN;$A%0de`PdkuZx8O ze6}tHioFf+!usb%_z%jX0Fd&VU!KjubXy|i5KNgp7&0mVnDNuW z^!ZN)Z*Wlbd&Z4}DVpRvLpT^R*0+#^n>CJ1^v16!MpR6o$;v%G(X9m`$cTzHF5M<)}Q>!~Buzn!VLYb3b;TVHv=lf^* zQM?l^8CmE45Rrp|Qr?LUT@xXHh#FWpjvulg1xMjUw&aAbrK%3W*m&S0_+S)(?Sy1) zP`+2kV`2p*e{Y8(2$Gm2OM!~md`El~RRl~yxbJg`03rbnKYmrwwvaw+P$% z(yfu#%!Xs<=mnAT>Aw52g9^f%6xHL*74(EpM;uGntb`JcxU*-%dM@L#Vn;9ePsRd! z?!hLtk~z2D76kNbX{TOE>&-OV2epGwG0Wfd%P+IcSLib*`btLoX7aVLokzPp-)hD0 z9yf5UU5Pfu_-4fkQ?{%m2$!E$w1EDJ+t}-K(>llW*~CHq@!9M{9N(dVrpdB3;rO}j z%+^O~OCR&wlX}@BfxuOM)}R;uPjyAb`AannmM$*xR_u#IzaukxzfPV#ggQIbh5P8p z{HRa(0mq$`nn6yvHLLH)?Bl`3-{|VV#YHIBm(%;{QhJXIXSlhHm-q>fH!y0kd}J$4 z+}T6brLF#`#71o0*kbx@6qYCaF~vX@=`D?=3qc>~qx@gK`$GTkSjzt{Y6U91f$bC0TJ0(E3|A!)ZawH#JNCAux@dolIt~iUD4&T1uEWj5`X)rBNh` zoaXzAmppmd2WCA~X_RAxXbjRfDm@)WI7MbxF<$q_%_9mKPWO5@*`zn#_AVi^1`Ms)ptio|MKkK4>SBf zir|lb_x~Fa{CBhy^=~b(H?wv$vR5>6bTqRz`S+;ZyUaFsk!Xj3#B<;whJSo9`X3c+ z|K~juy}p_CNwg$vmmu;d-C*DEnn=H4dej{$zgsAPWBO%s5^}il`!Njtdo~R{fp(56?x;LbbeUu{ zQ76aBKf}d;#lefMsPbzd0DvrF0O0R%v4g3ey^*1!BTx(`4)1${2=&P?%baL0=&}TL z3=kwqJuq;N{$_shbtB;W)#h*|o$*@g`P<94dIDxXdgVVln0Xwc++a}4ysTC|PA9pB z1bkk+?l*pw_2j^m-kh3}x%89jX`R9yokodiw=5?`@Z%BkVy1|gl_kX&N6sTSRE_H+-y2dRDnlr zopp_O^ohWh-R_ZC^X!JsTi)9WczU<0yD~23CoBB}xYMGuEXIwLy{_RY_UwsCTTCrc z#d?y*LYmW9ix)CbiORw!oKP{%Te^hXw(!lFFSrfTRbOFo8w>HGQ0bkE2vs+$UGlvs z>AhY7=?cluAiVk+bbjT%U*2?*CK&vqNtw-Mze?L%Xd#SD$?W|M&$%y>U`b>mUe#_7Z#nZ^?d?73XcHG$*hZgWM!^buwX(Tc`tL`rZn>Q#>x6At_GY zU}Ez5Hv3!haHf*eYz*lE2L3QItW24N)zk(Dq8W33}d?_88z@O~j0{IJyLauLC| zOo+s6u(uWlmvH7!=K77Z*m3#0!zye1HSEI2TXiBW6nKXwRm(-kR?cXuPTXfWi|hnF zloYckkE2!Ax$2)^#XbTgkE=5^ z&v@HCwp)*h2}<<3sy%+KdR6cwJd#fWJSlxuC}5>BN^^U?1F8VAN$>v=Gkodg0A4bJ z9u%2;b))LlWc`YQ%Zl>rA2rumbkUX6V>`e7V1n35tJ+zGwXnkp$rS{xgG!2Yr2H5^ z>K(;4j#gtaqzO~+uzGYzhx!f8Qgs}D(VSGyedtkSel)|iBHt!?VziDC{0YsM1R_&H zU0xpknj0b~&R;=F$Y#nh(dh}ne2*WCj8c)&`D1h?i+neB;RgJSEu=Xo7+b0z_b6az zq~me-tCxeb*ShDu)zbYbL|8&y-6R?jW?_G7Y5$k?7}wPW5|q%3gaO=9p_5(O*S3Xo zBK})VCDi>EKw&6X;TztJ4`Kz!o`*<36j7f+R0|-avUY5L!Fo84RYky)=(XK$R?t9F z(HBeLy2p{I5Az3gU;n)bBCKEbIVEbjgo^`J&vfZ_6cQDr%CM&U_lt>`4ln67FGYBz zP?tHhEi-9QN?JeE_zoE9-vQ*dU9m1*Z&uj#eT%7>lOGno!dO;pTQTuvYE`cjj_U$z|FT@93v)-Up>V6jvt7kPOE733O(DFF;?6nJv5x9zsR zYUldo0ZLj0ilTMmb8AC5giSsgvgCJ6$*?7GZdM0PGoIhx=*WVw&_ocTk)R~vAjCPo z;0l7qR75anzxg5VWkC=XeRa?>F(If#L6YTtVbQQ$Ao7*`B$d8?Ku;8f(24~;6}v$7 zlrA`Pr10W#R4VGoq+uL^Vf+ZgNCJZu0p1}1g8UiKg9_LJ7j(MyDZKSra((`f<3L;N zWlM;_RsNn606_T5OgcEa0l(9FU*1FTGUhIu1t#|K=Ssqx7_`d z7F=tBB^GiI=XGzLX)#eB`tA8fc>T*=a8lVPw0p#ko?tjHB+{3ct?pC)Y!7$=8=_ns z)D7{w=D@Zr)&`F7fi*!S(K88v*XI&^6n-ST%#8tq{(qs$X zc{@An_}=i2xw3LKbx26H#C}C5JN8zeyVMRjyf*c0fN873Cn?apWO*rGb!TKXRKl-$ z+~{^hGU3y}14lDd7MOl}wTiuYi=sDJMrQOXTn6%H?CNhpyW^3X84azp9&70-?DDZ} z?ogGqRno$RAP!~Wp)#$H&xm#%GcXIkq{ImJPS3@() zl60mg+*mwfvlDTakhjLQuFI{N1yW%lcsQ!xIw?9lUp`V_7ptS4PgYNvYt`XJ}GR7UURP8?lDs`#RBK7kRxI2XWFfZs zG$m8rs7_t4jBt+G&E>=Z^8kJSI%49-uI;N*(iD`hYV@*kogXqygaxb@D~P&EoGeQ+ zoG_LfM65UukTKW`4&dW0pKBs^=DgC+6i9ibANasKQC9|el_3u~1G%|joO-dS5p*IF znSLcNUK+FE;%>oq%VljvP)ik9QMJxZkzVCUaW0S)qH^XVY$e8@TtaXTk^4&_53x%| zAm@(?QAue$ryTBJmCX%dX-=5W{c_T(i)rR-GGgx6&J%28_t~pWwlcLcFT_zA5T7sl zXr>w1=Is9a#CZlYiRq{m+obAQb}!qB#HTv{@RYX6Vp1O5Q;FvM%yM!mxYj%2Rxtm? ztjn$0n&l~3X5>fZyesp^*1qH01#QE=B#;U_m-U}IM2^erfzFPj8QZ@cbpl_`Yx?3iz&Bw%i~Afg2;~w@CI9>(dsyhYo(*C z5}UFO8OrhS?r_G}Ru~lEnbvpa5j)~zXUK}rLHmBuKnXWLGaP4kbTO`TkMtutc4ABy zY?HT_q9^zSAuhSg{4BZ&_1RXeox1$YD-&cXAo7?Yf)3kiOJh4cLDeD`D*ZYr`!*wETZFYrqm>#KdL%sx0N8vR(Ut1-(VqdT1B*-Eq9!bYm&7+fp5 z4gnWN>w$o2uoV={#julX7kR`6{Uo334Ux{r(#)c6(`@zy#N2*hDSiFv?fJRS;bF+S zXM!Ci_OjtXi9rQVR6pv86)|}%ZFDS<3raH3fRKgYM?MSDRAbfst4G3xKdhuE@`t6L8ny8+SpdgwU)`MGd8U(!>+I7ZaAZ0zV9mGJ*0k_ycHzo%r{Z_J(2tIf#a%$6G2_@oWI6E$ z$6yP)r)pPs?E&}`C_A8cFskVCqGoFvF*lyH9DO^$acOW!*(4;8JOt~*bILN+;CkS| zG1GIU)A2N?s$#CeWtFBMh&n6G#G(_R1lo9A!*vLb2~YUAmY#0*H@b6LGw1^5ZSl}x zbUoh|*L4L1efVB?dvh3$UDbQuUZ?xp`Ce8Kl|KExVz_&At$KSd{`~s95d+aiW?K)v zo{JK*kFh9p#0$Di3o4iU2=+Q;FiNbU0KIhg}m(h$^bWGHe-|67K`YuA+~&Qf9M3+8SFwr&jzq^jwJcjeKWmTV^e&2Z%;O z%3so%2fFQdiDQXxB{6b}W~0r$r0NguIu7zi=RZ?gB@?0dj>;gz?#teev=PTh zFfoOyF`vOfytJKibe~Y~WR&vFn1O()29*8a{h4&RH0rtX)k8yt1{HxmR3bo$MlI;$ zPq#ST(jL+m3k2IEb?o15zc6kZ58Dd^J$P$!=SkC(E0~jw$6a+%Dp4MJ3Wp!{@xQHc zD|ZrPNO6joKY*8w)YOlbv|Lqd+djimF5@SX6OWn4u4Oj{eq0F;=1x=>;&bsowK0`? zftUT5f5Bt?eN3x?zwl|d4sHq5FJ^2qzdI0?ODT&iS4UisRL{^)$Mys^N=UrHpS|7R zGU`xeh?LG=sBq5A7d%j^Kv-xXdFa>^q1s#py*e$1Y3Oi7UOOqbUAszlA%Cs4ddV9q z(2Z>nPtUghn@YOL*gj<1o9*6@{87o}Z!wv1-Wqy=*}9ytyPpfXV4{|4^dmxx+4A|# zQ5(R89|_T{sd?kQM<$>SDRhJPbM(YRiBK4FBcP@sYa`x>Q-PP`}+VK+wqcoHSsFO>F z3N)q`t$oh9^=Hwbig}Udd}@R$P$)J7RbnKJ;t6bcF$?FP|!H#E3h+ zd2UB(tfoUZ9P)E+zK0+MgM?1U2vN%{vJU9caPY2QKDI+1z$SISfCS+3mlrLcm-lnp zUSP@k;-@-f?umQR`f@cB9IdjbrhFSO9g=aBzZBviyhi0*68>ofB9U;Q7aKMj8{WIO z=$vkKd}6E#+^Nsw(zwW1g9mA+U<_`wF$UUS{KpZ>jI~gUPGIy^75Hm~zfa4#*w|a> z+t^tAi5h*8wq9mLZiSV0U6zPH$weW7dI1^ChnXN!XW1Me5sm?s)Euho-^T|9-_I9R z*oHlnbPt68$P`Et0uB);D=Q|wcgXtPQb)M=*sn}zqh2`WJ6C`)%0V_V zm*?a|73fYjStJrESS(k|N_=*mW9eMmr_nh`ta@_aVnYTMrmR92RcM&`7o~vN8xEDM zJC!daNlv$x+LK95$tA=gHfvPaN*F z{xX97X~3RR#kSYFk{B!G7B9fHjxyW-j>tDao~K`rlGBa){Ogz-LydF;8cnN+1Z2QA zn=mucy(I^DOKE+RQ-2mRY(tbYVL3Vje1G7S+u6(N{+4NMEF12s{HYZ($XgFaT}8YbwA}j{ajqNbgrjK zS0ee5`fJEKpSgOFtv}mxP9j%$a?9@2S=T_j-&nM=3?V8;pD>2Wud*v+S+(tb@?Twd)4~wcJ}6J`lUU5UUj@+ z^ws*xcELth+h>Je_w6=i{rT~-d*lAsOP>h1C6V#q7*q}_^O_4Di9+vAhZ+m^uVMMj#9K#Kt1 z@vWvfZ@Z7@3ZB5L_ml1YZ+NX`foHS3+ttCh?yxJ6&nflGgmnczKK8*YXL14rZ7y$L zM;SIbcynBM?heL;%OjVcROj0*biJ3yg5>)heAcW4czteXXBYQA2X~L}F|;*%IPqNx z>`oiEw?5tk7X+t0DXg6B8r+ZHJ{~%{K6c-}IyQT`+OFp`w=K1Bop>*LpGCSly-aU7 za`UDyzm%VCzaG50-Y+|!Mb#4;JykgMH)LGd@8`{&Y5&@5f6RD(&cJ?9ihJAZPfoh( ze*}6p89qBc1!G66x87H;8`lNh!8Y}s-VW2Z8^Nv)uIK#?Z|&|YY2$N8#r>n@uWtg! zr*daH+IJkI`uv)lJmUpXNSfuxqfaJx)vr6C3pOlsrXmqcbEd`|2J>T0yKtX$JRd`! z3tU^dtj2WlkO<3G2)iFlY^&1oU+rr^6Fwi(qzY(rG-JD4gb^;jZLX(UJilsf&)#_2 zx1XrakGE|k*ck8GybSL^h3wOb;s&&}WxgD<)O_0ikc}^_dJdIH>WEN$3;lwT9X39J zx#pJLhB{MUowA#ebVi?H{Cxa`IPnZ|k}^Jlk{rAbJ_=RCwrAC>CU^#N>^a){vbju< zPH`kSE|9awp~g?k_q2DpmofN8<`@~key^2IDvQ9M#1uBZ>$Xu7{7Kc}x--}=AbHMV z8_m1QrnW0^CSBqrOX>d3ZCOO&9O;_Pc%wk~wsFSTj{%wQ@%YLP@~vpDm0p=fOF|p@ z7aSG(>%}TPb*?^!_u~#p0{5BT5$LeI(Za|ox22=hR=U!*bIB){m|vLn&I5HEMZ?by@ib)nj@bv4g;@^5I4 zyU)~iP3hWlqZFVz!k$soqh5oTdzCZ6y)YDX9r%8pf$=(Tqx54p+9JY;J zYpVDs{i^c_UAQ{_v!o4JNn@a8uz_FaFU|WSZR{kMdfRzdtA=eA8to<{zhRCzYdcQp zid~E<{I(=)+J?Zz!h_xGF8P?|?ae&h_*PGmgM^j&ui1yc@pst#?7lFnA;UYw;vSge za=-_otL9dGzsxg?@AVY3t=)2NU|isZ_2ypxYXgZ2El>u;qa1N2bZwy! zY7TIVTm)~-YPN8SN*rH3{~@G<5sm?Cnkj7K3&o##ouQh%9hJ#6uR?+X;*eSYmnf;BVG$#A=l~eoQc8UC)e+fl>=Y!s>GYM#X+0YuOEL8zE)}^j_ z)j`{_)Qt~+m&?OGV6W$E{)BNyG~Xxf+`E*ggE8UxjoT6Rs{%uS2d}wxMJ8r`q4nBo z$B@Mqd8_`(7Y1Ojgz(+qE7+NXHqsqkhZBQX?u*EoN|R7p(V1jRwf9fdl&%m0*C5({ zL8wiKZ9sTmTi9k}-bJd4?IKYZ;PSS8ZOK+G)jl*b8|5g>;Q*PV@DXzM<7tL0a2|YS z!1|T!EEF^vk#PLIR=SzC+=D%8 zk%HrAr#t^!i4O6D*e)d|!KyAUedDZDg1x%b6~duINEt<*9@hAc7H|$}|7OA?WdSpY z^1uRisrkK2!@w@3^&x*fDFUeTikq3)>brEjFp*X_Bep@6N5rp4{gkez&3_20suq-6 z`4p%=uvu*fBsur6*hGxx=f@`5I=KuqxdZJc{ z?mSh3nyEZ3;7E#m#QZ#gRKb23vH^030WY_^KYo7hAM>C|xIGHhP2Q++@P&TZq%A8h z>-}1)*;oZ!_++$SvV`D2_VNWuF4+5TUtz741w>y z^k;5456YI3(l;mq5zYNSui!;(43?21TTYA;7w zQq5JxjA1cK#Et*R;Lu2Ylw%+vC`;cFzMIs0+rTzEp(Rk?(Amkc^^5&Zsf2|&a9qPI z+OlTCbYr0_7B&LU1F9=JLv=iDfGb{_9)9{|J-b#Fa9!M~s@TQdhO-&HVujxduVCej z8J+@%R~qHaVR%?TiPdd%&$@4k1bD~bK-R(N5`dOCc`)&Alzr>WK)Z9z-ya${zFkW{ z6I83jCvH`sQ)NJ}UI30x?>#MI#f(=6Z8~}zD<_i-#V6dP9hH@znz(d}KdBRp)s3$Z zHucf{W_yG&+94ZRInl$;EX9m{+QUHBS%7oV95@%X;ukzc+?GBxqlY3?qn>hLr7rZ^ zAeD!Y?Bb4Kk||;_ETUT^IIHVlA(*!lcWi#ZKu$lm{RZsgGsOh(wZKz2j<-ugEZ-%e zO$aW=Zhxvm#y-+y*0*4dvgrOiH1tk7+GSaxWBH?gCshN$rEwM%wB%-(@fh;Ca-F35 z##Oi%NP|yV`bFApnmJNq>Eegeis=lv zHeF2l%L1n{W0+-|Q0qOUS`+`*x=y5?cri-%i>=3>F>X+`_(8b$CiQisWS#amUzmoi zfkbd9HAQ%J<{URO$0DrHA*{@VUIzmnXnoTD@5^BPnkQI;XtZJjNt<5$h$66u_vEOV z;Uhsh$#zVY!0gV0S?PY-?gz*Rv@+MjphZaCssu60?-%#0Lj#u2fhDA0YjRbKw2F)# zfX1YNL1*ofePYu*0IRR{N8aQwEnZ7w!&?sC@cTWWT{-}cqyK?MlxwBgn5RlfL;`qNt#l`C`vasMI7vmeP8Auc&B{@b}&K9<6_x(G(<<+3{ip-h;CsK_z3O8fn(&+#fA?M8A|IFwi2=_5ZaM!P&M6X{S(iXmk)Us)H=<&(Jrr z{tjnrKnuH3+2*KqK1e8AiOOh?k+$i*;sEyE_FZ2v+waW{`C;WwE!c+dq<>1+(zZT8 zPMCEtfPrf`gmvTUq?(vHZeqN_7lVvjrb-;@;QpDb-s-MEYa~VhGIzasET)pc&OIAe zT^aLm4;Zuxl6J103S5aXVqed^bp@jx?6v&1cMp8$oz3C0n8jvZaG*)E63lvEusVPX zRsn|JTz-yz197nnZrWjQ=)yqBw7}7Y6eQ57wZG4XVGE#=7elCBhh5?5XquZj9%8z< zM$qmC(JfR&;uB-X7birjn*-mcdkbKZgw>6}&ypYp7im{v?~=*oR?r(6jW_(R;tdgO z!?ECMj^W>M)dSY{dzg|0%nYslWHdOmK9u~VKdJf+Tr?iMKrl`=w}X7_fP>y_m_YvQ zYssJTnS%^xnK)Lj)zd7AoO7M1Z>z%`A0~DE+{pv@I#^Kfq|z{=wx7He-~s$jG#RQ>b(0;lcs?v>48Wyd{A0|4I(rF`P12z^w;ENs!rT$F3K}sItUDkD z9wcpF`)>2rJ-@B^6o%L&S`9#=i&5GS!c~gxZdDmx=Kk@ch+XtAfb$XNo6HhS4ZC&U z*Q&);nOO_N3%PUFsuPQ2Fc7$a;(1$Ko;D7N-Rcz-j3Ag`}5D`JRZmOyr0*)@B8Jx zua^Lh?F5-5jKiO%;NV3bIt&P}QBsyS8TvHiKdm?pt)rq!SrSyAsdsmXC}wogYQE&> zH_)4Q*pj^;`TE3~f@>i!5EmpR(c9w0qrSUdR^nGm#D7uOa@GNP^JMA_%&~oOu*%8I zndzyjfiVA5@pale>_ZVz^Bacup9WUsn3czzQArW_5F@_^B(-C^DFx4gNSUzvEzsn} za>G)-k!Io~yBqYaK>dS}fI9twF_ljx;@|?|dzv8$nC|;_@SpgMF59dZ+$a}Au zRY9oCg-W)sHIsC>yI`ABNi!w|SuiZQw8?^d9KF6K+P+%QyEd@ZVmVWjKXfU!+oUiG z>JuXw(=WliQyo_CpdSgUAS$EH9QxF7wj2KT^9y+|6T31Y>PE=tQP+yvULo%Snx2O@ z8%edAvdttkvWo&r4E?s=q zuKg}~`7QG@OX@z8zBs54zvQ@}c(O$uP5a<@i(T?;;_IsZA8!OkLq{rKUKbDR{4g$z zmTXS5`)-4a=(VUE(E?4zm&KMe7o5d8;DeNSO22bu7epGe3cWafU3u5!0AstlmRK59D zhsmyoY-wyYGY5ufn_$j`+rKjICt`WQ#8xcID6w$VHa>>9PsCeeko8zYZD&7UpcRj` z>SZYSCEo$Y+#z?VCdkz4h-Xcj11zlSIuHUm&?fgd+a+4i?rZ7tH39R=SjJ+VX_@OL zQ1QENWQ%tBIIV0hfnzVS?|Oe7m`+63S;qIZPCV-c+j%|=(GZI8HBrojvX!)pXAr^Z zv?CYEl~f1hu9S;)t1_qAX}B$cbw7rYFnkecx9BAKnq1ev1a5jP6tkYoRG=JZiPi!> zyF;$;(6TChPS|AiC6q0+y{RAit&k$zL^8nLm-Wso0&w5fjNZphg>da9|M*tiT+uF% zy`;*m^oZ54ftT~F{F@?lX&&TxXkB2m9dZwQ?(ST3)!6+Src`%Ul?FvHD0|+l3ix*} zVo(phSHIxvu6&H9IE6_G;d^FO)0pJX#hm(p_0evSnb(ZB323B^nWYEea@MP3Op%u8 zx`N@c3_~nj6CoBQOHIr$^yP*D0+^IV2*@(iEL7W!lLLRZoDFx zUMk}@f%uhGPHn7I3%WI~>21|4GIZVbFpCl{{brIb_xBmAcqAi(6WgrnPHHryFtiRZ zKHwc`z04L3F;!uaYvLX9G}c4&__C`Fb5u#*q>FzDoo65?bbik&^rV>OTT8#bog1@(GXFoWTi9t?>Hqet4I>#AM~Xw7RA?~|vV zADkqWT}|MS6}Z2Y*>WE|up@k?!h#jBdm^4YcSBFEjcP0{A9Ly;>+X34u#aD8T@twm zyiA)$Co2I6hq!jqo+~hB<#=0r3D-E7s?x@)eVhXX)ZSSgJ-}(z;%5pZn2JThDAw-f z4iSQw*NV)kx(GWw%;GG+OM=xh@rFPA5v@04l>RfT2?l^1p+z%EyE|`(a*#uQ(s)E# z?A=(5mWeC;`2PBE)^7>`xeLv^$ztvD7o2}F$1Im5lu~&LL9ifkEkCXZ;6JLDAGI5S zXb5!rn+yy9rJ=nUfn6M2Lf!~3)no)f*i29 zDRcKkl|YtW38Qth^c~k#iV)Mi*@6@^iHt$MM2mgUnGx`Xowya3`;I(#WrO)m&MF&0 z;qJysoO<*<);B*HLk5$1#ATfFf2KcK ziEx;pN3LTX2xjaVttC86T}}M)xOqy@vYgnRx?!8ENH-#Wi^5^H$B9dXjLs`uU49F7tO;U*mI$YYbZ;2BFAFo zTR?it-Kq$}oe{o7OMt)tm}!T6`y%{GUdn~N8pfe=;fWBN5>{QgRVkTZ!~2f8R{R;d zwC-6{J(a%85dK%B_RFt=>|q0G_NlNa5jM|F1#p9n+9>{zuNYlM0+2leVAdUSujyD1 zE%j!=9LwSEOr9ns%Si!?Kbq~r1eG-k4c{+XXwT=B7^ju5QUe3)0tRO3SS|#n$FQ7n zUMO=9o2r=rof!i21Eq^tElqw%gl}TNAZ4DPFJ|AIIguyc&s;^MN6pt+RkOg-k=5I5(F{ULQo2tv8Y`GG1m*!hTQ)Und>wTK#o0rvH)D$%H(0ag( zJLLNcI)dS(eN%!sGu28^$<&EyiAnUfFPlPlOF8>7BP{p<&*6s3+DXlP8#{ zH>~BUWJ}c-_axr67JvlXZxj-0_89@==86m>*P6Vmv~fPtJvVVmMz&OANB;WEvk{_1 zi*ktzYO#R(6ytVsbDqcBF1Nf%;EuT$=`-F5PF)yU#}(qWQG{gmue<@n1HJUQ@v0t# zv{px1chdnO14Tn~3R!J3AE3;rvFvCEm7uah~WpS!}Rw(6>ic z_XQdnv)jbzm_rJ-Fs}&1fjq0H$JCu4xmR=1vs_W482)L651a(*#$#Sk8evSdM#RSaT(e~S z_D=wsV61If`p~q~+XnLNqwkm{p7(-DI8s3R`6B{Nf;XYraqSGj>DwUIsS7zh0t#2hZW<&Eg%X{m;F@Gt67q}OV(Y-&P;Kd+H%a=Lm)_~9MsPS4q7%3<@_x-Q zr8(EG{gdcAS8PXM`nJhKp|X2*W_LJ%83$Mqys1{@et(vN&EBZyqWBX5;sbtB=kVj6CmM)n-Az!GaDd0< z@`F7$_&}fIslOwl<**7N!kFF%OSg`1!br(g7!m7uLsW_Qo2s&1JcEKmhxyR@>Z+i6YU z*t&GJL+%hU-$S4C$ck*T#`WX*=owg+gF$j^9mL(3num8mwMnEhUKoGL8<;MRsx8kB z`A_FK&M!pv%URIxStn9>!9Eufl)0NtRzU^Q zZt1tmm*Bd{m5K=WBpIt|0|C(vW(Vr*n@fm@Aa&Srit9*ww^79hCK;!DRL(W}@B=}w z=Iw`AUz395$C$d7u**cS{lAl64|S~XD0`P00!q|Z&yL6`2njWIFgmnF7XfaW`_0LC zs8dDk-B!7}&cN6(;V1E>F5%$=EWmtkLVW?q9xvhU2^MPA%B_}5=GAym_Z&@gD!WUK zS^FTw()DQs8#R!J!_~M&B47NzlM@?w+o<@*w8Q+JTFN$9g;6khu!9bSL0&6id8vNylV%gPULGx;z zIEs}8R1kyW!>w0ZqJr!g(`FhPmq9w;!p>f^3l+igP1{bv54N(8=xczpP>qKRvKzB{ z?@4OdGTqKn>^jHWIyhukV+W$?jSO}_jCi9ocE6Yz++*nhXp;d}Qp#AmujwaLp-&|p zvS6wrU;E>M{S@@&97Xq*O)w-E5&ddG_3~fX`MYzilJS<)>Yemin*0`a%^_ z5`QAozkEi%{4TA#+49fcj8^i@a&@}&5sXe?S137IDweSgMWQJLJV^-icum!FxeZfE8&Auys@kd`j*@9Nwer^QhZ|LwKf2DG)8e zn7U_vMRX2xg;Ihp-9ozqt&fw+K=)&naoI*$RQJNUwkJ@wtaiOkU^Qp3?>q1;r0&}x z;th8TjTslpeE1xLv-sCE;^mM0-T}Z4uJ@A%9!Wz7@$c0?ISvokN|Q`eOFd>pfV(({ zc}-Y=$x@XI=|$~wz>Z8o{NZ-t$Oz8!9xG4VdRKscBQAsh`zV*rq6?4Mfj#)tm*0MorD&> zUlUG0i>PgKaNC*nPFQ4e&3sv)Q&)`qiqDX9ru(wh!tb%+zm>eGVR#_zawDSa9&%&iTyd z!c^k(uyXWsHFehktg>x%l-_lBVVZ+y%3{@Zw=ijPBqeXR=(XEH*IbvOA+4L;SPRc* zwzX#q*-hV_-PeA36x6!VJGxE|FA)ac+M5V`vVYI>!7u0aG6xy&!F~9UL;9?@+s^XO zg^in^B}p8(X}8-l3til{iheDRy8cq!R8D?3+36Jp-)3&8@fM@G-UeTs@(v1yCq472 zY}oCn9c}M-em1#SwJg24-oGvE;_3d-xve^~%FVoWy??`9f@bu#TkTACFuZLcW!IX= zO}%ruR(w-*@4DwUFUPM-1ww?imAeh|>P!A{*9+8>p3zl|*+pc}liLnz})?3K?5Xj5IX4ua->N z_g=UNgxr5}`vwVF2&Tx+HAbt9p2u@Kk1xW<6{c+P@3vXQm=vQcfX!}`*=Wx8xMrv2 zD4e^*8ImYklz4-V`oYH9RZN}p519q|4HIMiTtc-4-k%-K&9`FO6fiP|O$P@*QmiQ` zlZ5i{Ob~RUQ;=4Js?Xs}gOl;u+@386`pjVk=8Kh_Q`1&4in3zo%<8ed*xV|zw9M}C zc!3N}_2&%Lw>Oj%=1M=ZRi0p!TJwvq4pHxLu9e_gLce!igK$}@&`(}2ek~hvWw?xB zqeoLrOvkD56^}W1Y|zJ1COW2$Cs|vlL-0H;sa!0Exo4BGkqO3!JCu_c<*6~}IOqa0 zg8I{irU;3#a7kUCPiqfnI#HON-3y#b^P;zcN8GS;VOo35-%F?Gb=`IW@7^XZyK)Ek zvLjag_#<{&PcNrNYrF$YK|w=B%8w>9VoJFB>0v$g@vO1}!VkLc?tA1Fpd*0`^v?H$gZ8Od(PhH zL#md-7iRDYvS?Y0@t;3Y7;j7axx=!0=e3pdyyKuP4d+%Kk$t@_cZ5SL+t=sX;XZFo zmIPWN_aq0lFUddurM$n*5;Z%YLOdbdD@;~Tkoav&z{NhPKBp4v(o##7~*Jnh>~T~Az{1?@-! zTQz@Tp!G0^^bCr9E^waqABhS1e&-Up*_r}YE&8ZXl_@AnWyjwofluE1o1yrFC*KZ@o1BgH4zrFNSg`^zb_E{Gni>nNucMlY6M z^I)KTdlzt@=^yzffH;5nL~}$P#0PZT>sT69Q937QeZwz9+fp7~%fr>xyp-Hvr2Mt@ z+rpzhHiHJlG9aAP`DORcyKpZHd!VFN;Q8p;u_}q zn?+y1X7@@C7+=PI%78wh7Tw&1EjjA6l)w2RC21}S9q*-oqRZRS+yenTzNvNy{{_w` z*h20xal0!wdrMqIJPoR|(z2DMIGTWkRn@J7r&{s7jQYv=B-`i8bkdaX4|hYd_SOSzIfFI1k2WAv`kARBSf7vP_q?j| z@!ru{-j?SYLDHAL$5%B|VWHha--~dld$>OMb#Ef8_^J+-fmh4b@S8?yL+9)HN++Nk zX$r%4{E3n%WvawqG}-uT-6BAH7$+gbu+Q1Zo%ckh@KI44Vw9e zo|Mm;^+REwC{1tVR`vVaq*1?=|2E*~_|U=nl2Kz=>2uALu&Ck-Ba#xoaFM}#`V{5w z>((eIBmdUtK-`93r4~3tDFd9eWj=M5^5`#)PgMTC-j8U6?%0tsI6M60D-aS_~-w)t>Qcpq9kLyX?#wm`| zAe8nw{*~>;ts1zWAWWtGm(7TaZcl&irX1@5^n!YqkkA&*rJPyMP+}3o@&OLf>r&8? z3rU6@f85smik+45|3&+-&i(GddV;nM7LmoUd_ciX`md^mHbrVO#4s;U0qrB&?{_4x zTQeTh&W1CLe=#6r189G@F9~9KMVeNyQM;l*0?<}CqTNb4dIy@OkjQsP+ipLM?}_&X zf_@S#V);1Qz%l9@UJ0+hvutH`_?71!(%#hVX~`W>J*3SeRIwG$o->OD&>kzRX6jz=hgRxO=WH!2&hGOlg1i^a?=_- zgFs1sZ9hIBHFqeZe>-MU6Oet0FWlD$oG{h<>t^@gZ;RNkOwH(c|97Vi z`wYYRALJf)by}7b<#)7op5axgymjeo3fF|)6C5c zedF&slJOQpRf3T`#AXOBu+*i8dHsA!KqULQo8B2ogCXW$JOwtwR`<92e|%WsjQ3xC zKMNInD~5ZeP2sX+C~%*4n0c;D?@=`deN@f{kqXfQ$&8dbBZU;09GuV6I(_bYe|Qzy zvQC(<@Z35U9Vk4lI0ysNsxp<4C>HP0Qz|cmZh|LfSKaR2z9Fxwla!;wz_pqar^g}~ z%W@ghVnSJ+JH3)1VC~YGZ+9RmOe_Ofa-nZaeV15VqP8b>p56=7 zi`RG@ZNk?YZV~&Z+HYNUj0#Ij zdxjvB8a`?1#r)V}1u3=bt7Z?R!a#)KRE7_nLis)f_F`c~xph&^i8`d@p9$TGVz7#1 zXiU$QqLp8Jq1n|j-n(1WDy{u)--oET>PgfJwj0JM2I!V$;I%yet;=L}EgD0gZjN8s zh%N~1X{jAy-B7N65IiXIz3}PFi;ZLFlU2vvFXq9De}2*WRJZ2?`33awID1YS(XRt= z;ptc3Ao^J&el9Q^ir+87Ie+HpBjQNDp1aV3@~@9)|CGmij|%X~*X1Df`T}YZzaORD zVXC1jKcfV#3z~WPKa`&yG|r(yK;?ZDJo1$&e}g~{9x0C@PTL3Vgnb&&56d2^ z(s(MVL(3rL!`34Y|1YHkCzO6YQhMC!n+H|@F4~c$k<#qBl(Dvk<_bO;g{DgOjM+0Y#om<#XUz^Lur|AsnTeq>gpJVrh3BhnM*#02^* zoTPh{E~qH39Y;n)%6}R4WQTTCZX*9c`KM|BnXSk%Am#sJN_c{)3~(I?$@F)pbX1Zn zF%pN7f|Mzw!lxqVbU$?@Nd}-K*qsLWqp=q%p1?kYLdQSm4! zP7ylBJ6vj_;tkksVP6CAko=JH81Hnbkex7KE&VCH)3NfMQS6WoQvS`1r<;NyY54+X zT>KZzF}cHAS^o?XBs5YUGd#-ull{n0p_c(S{t+Ta43D9Ym++{@MP@&eEm9sspEfSZ z3FEFY9zmaM>UE;Fy}WXiX?A4x<~Fv<)89c^^s#vwqHOUxhJaX<7Nz~AjlB=zd%l2cSQxU7d#w4 z>i*+z0O1QqQ!-K>vp8*_lT)(+@QMk*{wPlhQ1wepA5{jVtT#SgU=fw!k$ zA3sq*MM9eDy!{a(QXVt;+aqx#5>Nxqxat1M&0tbQw0suP05koN_IA_oWraQ}Zk|A!G6NE(;zr$-QZ68|l9Kx4k)?1x}J=0A*tkocAU zv7t77CHaTuTKA8=RU9JCE9lwrb|TQ?&RT25(3Dy2 zV?iVFF-#RVh#+;4@bcZ$QN0FOUraGBYGDZ!+CpJ%!AklkV4UeluL{%~!_1MKdu18^ z$M#K!(oSOAg~Li8lhJG<9k@66lObAqSChULAkJmnmq z9Kn!ddQkjMNyQA+Nly41*uUou63tFIN+Wt|4gmFB z{*dB`T%an}SE)Vypa_ahWZSi6a*yOCXg-8&|4fYOS{HT!fe|2q`I*&R8Q{ffFSXqc zox{Nlo2uRU06V(uv0iPYIbqC67;*(5=I19Uko^BpH?mHbF$h52+W_&x0MxB(Z*1v6 zNBigdKdSyeEam^!^on>HDNqK4;4A-6!ii3<^>0LTmUJQ~GDh#f3~BFrY-zCtZSPN_ z0*<*&cc_uK5Ta&Pd53Q2v=F^X;mAQtvG-5Qqu(qEYAKeSSoiWoP9N zOi|wsb5|aC!z=dk0%=Jv+l&?xQ^ghuPsM6H$F2(gx?{;x%`GJ9t??c^4IO(UG6cmV z*L?qZa%C~As3=Mrln$D8^m5J)*3eNP;(+Y4ktXVSOy9xywOHMnZZz+Sp_a#RN^P1A zX=IAV^?WOS->R<6>iPVPIop@uy4tF9iVu`bEIK|F=IK z3B9s`^Z*8tbqO)KQ07=qn2h6Xq@JrRLzwFMn&gsZ*(EhM+XJx?x)SQ7OBcU?+7xAN zew14cfbn4dKqXOt1+lt>HlzZ(Do$x9M;KT`YqLW`y%(>UwzhGuUNMDFDPhG8%Q27; znB1@`Ea(_gRXX5oAXMVqHiyrxHY&cWuaYma>xlbk1~*bm-&3c!9^S(nD82H(+g_`p zmWhT)@o6x18xnLr+I!Z3=m1R~O8*Js-}Q)E=TFJyK_4baLvYM6&%(f$#itZCg1p`$ zVn0$KML){dPwi|{PX@cVW_UBi`&%x(&7rY#A#GSizs07HJ@PXo*md+nU&aGoC^+E_ zVN4%)TS!O7>=EwY1!Cb?zqKep5S9l60{RM|3xHMsolh0YGB)eVc)LuFWO|5aXBr~Bl1efZ*OMz>%DR_X)vgq z(&#@&4B-<6i|e$=&&T)d=?$Vqbc(c2k&qsNlCxyCy0NbsRx28|*uTiH1s;Z~oVTeS z$lH1pP*I$c%opv5f3J78GWIQIh3FA%^*hFG2TLJ6Lom2QgUvEl?2(RW^F`u901YQD zv~kc_#j8ZH@uO;4U0CEl$s-C)Qbxkpls`ft>e5VEyH3ihd-7f&PI!TCi|sQlXW}NJ zXqLKF>Fhdw^;Wwz%9H?e!M%X5E|cpp)lryG*x2Jvf;8)kHY<0z?$iJED=#@*_MIM< z`$#rh)6Osxg;9q}OCH(X6*@9l0D(D9d7)L1o>VOL7gAWi*yCqXHJV4d#jj`wm~9I) zU*XvqR?PX7h}7zHxZ#b`D9IIOouV3T*`%ge?|0XC^0RgSZ_VT1YuZ>rl7BKl)OW;v zkBTUwYL4|ItnDMUGfRoFjJKUejM7>Zp9(0tSq^`WXtJBVK1TA>j>~%IN=vX~LUKWJ zer%h*n~I+fa(r zu`q?wxl$#&YF@gQCzro2y^b12suvwbih1I#2oiv2b~z3mBQeQf9gA3+OBQKOzY z#~Vf1J3^I3JIx-;TXNq`DDJ>qu+*P?LO!)k+ZcoP7 zd;xY&IPiR14A`Pw>QpiEyVc)BuP;77;vKP`x*LneGO@KVXjuy=k=DVQne%a963HoZ zrq?cPWV`{9>|civBe^ZFT>!>11FXdVWUhm$v9Y7WKSJYQe=z)ifiWh`g%6 zX4YDtH~H$1+y+m6CElNbk?!7EM$4=}CdR$iL!^XbfuRHqQMeMxOe}>zVqE-WHC8s9LOHjdlLFE0;{5!iKpyn5M&&<1EZ+BfIy4?{#2jiKmiS zVwp%M1*OW(w5QcSpVX8jGtsq4HRlB+e)i6u9UjX?WYxx00bhTC%Azvc_u~68F$&&b z8+V%9pRuM+!;N>5-n!*q63lm+OqwZ|idL3StZz-HpW3F1bQ!r}dh#2xb_P1;rd{;m zl7IddDHH9{ZeCX+-$S@Ux%~GXP@(YnOMe@aYK7*+8|73WcTGq?c8BU5)(>-h!ssZ! zu1U8c6Ih9HkwW?ad1r%M+EW?s?kxExE!c;bO1)#*N0LMj;|aqS*AmIGxSbp@OeAuU z6dF&zCK35?xi z=<6uxT(Lg!`-WVDm9GNP$Aeh7{Aq%ctI%@=_Bs5wry-D`)-niaDaYtlLr}M9k$E+0 zXwYOYS(;1STBBZWl5=-wSvqO!{v;tZRiZ{+D9F&cOaLKsS zW#@@@>l4Y%;*aT!-ICb59uLDHZq5+)ep3f4)Wr}+*J)&uDCu0cjMO{6dSjB|hY^PA z4#!@jU(TShrwBN}5=l&Z4ntwDSD{-xlbvfiMK{QQMOKnG7>?URyzD&f$3fL+j2t#& z&&2x84f04BbFE=+_T^K1By$~~}Piq#+ujTNew$C(vqui?ngt7)|h-F<>= zlsu=3+(a-)gMF;=tl;&BhBg0CsMg+I1~XTsK(9_MWpph1!~B)+_##EN3p2$BE|Mbi z^Pviya+z$EFvLaN!Ln}5F6ZKv5eE5viNFt$lv7c`w$_pe%gxi1pQ}|?mAUy$F>&ng zCGuOm+MIgcSK^h%Z>S@lu(+gfin1Vl^@S6hIlm+)@6Y~ppZ^L4fjONrDxmB2mizzJ zDdV32m8hj{v(Jv?$+z$V%!*R3NK>m^FmQ6TjNhIz`t)JD0sppc=FIX__VwMwb>;G>b@AuNa*A&H>4B@} z75)-ke^+L2Y7&U|pN%OTUYurV>~GTU$&HtpU%&?F%r#$H74 z!^anAHxo_kp2615yq@omuj3{wok)Z4kH#LarxL{pn@6uP#qYN2+uib;e0BDn91d^z zDDT$o9I(T?H;y8X^#sbx8&hkT44a$WmZcyrYvdsxH_or$o!>oJr;F;_v3-I+>MypV zXFug+&)$3<>E4eP_-2CAWjDZD@Pn(X_VE{(U1rkyyl>EVruz?aeYAW$INl9i-@bQy zx$`1Qh=8@WRpEO(zuO6sCz@8>jxksTqrX1fZ;x7^iGpXvKEzx{G=D8VUN_^&+ISkC zPpLFamu20KF4lkAww*|^>phAr^x5va$@G>|GFFl4KC7n&tDotfP}E6sYcyp9g$jE# zp6QmZYbis!>+2JU=Ye=1$I)vwe~N;qyF4Yn z>U7&S17_#t9!b zer34OXhI53-X_;i>G_k7j+42F;QCgQ@CZ}+W`i%`f7w`d2`^O zAu%S)fy@+~A_W%xZ5&f$wZ9uJ>#(|-N}%LhHkkP?5L8AmP<+3RLRTHpQ8%LNu*7JW z%EK@Y2v+e$p|9Zd>-7j@Pi+ZnIUOmsNr+nJNgwdA2Gq4?Z-I^lu`bT)$+5Px#nIjK zY)0FxT!tfd`eSUFtOOB;L-rHcyy^99h?vQm4V;OUa;U}`purs#afd&477^3-PonSQ z^y_1wr4*YNziE=66g=vQGE74pFTpbmiROG@iFWiGQ?`Vjs%59#PE5rVD@unNpiBvf zMa|bVy(;0svXboDkydA6GA4g`yu*-|8)nS*YM{#3WN`{pcs+-i3N&O=3RkqD!*^Jy zjl7+0j4Zo$CYCop8BP=#Yc66hO!8HW@%yC;xgRKn$(DoFVwA;ynn1^{G{rJ#jwXoY zvlzcd{4&-Gytos|pR+KEo=CZ$KF0#1k*43J=ux19nSzW)4h~Yd05g_oBZHX{G%!JL zT*{+Z?KwUhS?}bh_zTQf`DXGR86iaXcK><00~49+-(F3mm2H_iaOMX1DNI(FotNh^zm z*cSF&4bEf*UaXYp*Hic{XA)?&GJnR#9#$~xsd5!qE%TU#d^=2)GULY(KPnF7sYw|> zsm}M6-X16F{ZX-FMoE!m;oZ>~%JM`zfF-7)!yQ)ZiQ+5|53bEXIlw{2Z;n{kwkXm9 zdV^b-e2Oe(0dG`o2(AQd%K3}rIC>@k2_&|!t7(RNiXJ4o0Q59TKl?>052QJkQCi&~ zr*Vi={>HAbhzq1}8sI06<-}Gu@o5~UzYUqKzs`M9Tm9>0)tl*!X&)Y!1}B`T(a)Ar zTO-YP${axor@9WL|F${b<~s?EXbm%tiJdV*A? z4Tx0nQ$F}J>TmQtda?^!=Vl{Bhz*!(z2bgAf%4+pb$dv2j!@gx$UZmGlLCJ77!P^5 zHu4zHYrI4g?l(pugtw<-+-)VLeFQ=)m?&*y%q>HPYNWYc8J)Z)pam~WD6Jxp(;)bG zN`N-Mu;xf+GC(F`z4$X8eplK<>(Cq=D0~#}ytU#lg$nqaNkc58*1a)740feF@zs&z z6rQ|9e?1BSMvKVE6bSNvp|n*3a4x#_y=gVpX5m`DE)ES3{;)zbMS-OX8SIaz zpw5zuCJMK7culJQRC1c8n9%Z@y9N8v*H(COVF{_-;YWu%PJv%3C8j-l5+<8--9!g3 zDz`Am6*iaHy0HG!b3$v_ULgji3^hM51LCXK4KLcZg!ojVgG}0Ydv}AQKLp@N*}mPA z6v???LCmB)P8V#3y$PdRO8!Hdsl(<@b`3NN7UwUuUFhBQf8AHunz{|Er|O%}lIoWM z38WWFTdtF#-ZuCBt~{6`Gv0eLY)7V#1lo~yTS4hT6{7^FZxll(P{K38pzZh~eVUR< z36p`;0*mAp|qFrxb+5Y^<*cp-M1Q6{Bwf4?Tx^f&=&O;W#3fdqSpIR58h@&l}LZA*PppDzl?Q|{^7BiAX0yram#-pyNn6;=Nlx3 z4&WWwTUZMLwy$({H)rZZ?rX?>adAgQbJiYU&9oeOLx4C3ODyB5q5`-E-QSlaFSsI++= zzf&B>LVpT zEY8OX@Hi>;Uj~f-VZch&r@>P1o9VG-u0?S6F@JjDlgy>6hZ1-XJ|$0na4a(f!>MIu=w(B*n<^N zLS!(y_F^a75lUa!0gv?pFYWD{`u1`HMHf+9j_rs*&V!lIHx7eQz%aq$i^HU13HUQL zUX(G20K5l31nEqjAF$X(6^!~!BG@C(XG?~&kxG>6&h`GRXmR=vIz*`<1vkqR$f&n4 z7z1j7>49@4mjE@;_b+_l0|Owp|5J%E)!pMgwKtk{E(YF2{kJM9cSHia6Bvm_UtiQ8 zWUGOcR%(S&bAm97Oze<~pb-j6Y1IF+(EYJQf|c;7!z%e4km{L3N=zk&$WU%v>%!^- z{9d8!ma3$_8Ne&4zay=&lGq1VZORbzx7V-Y>@bP-&4DE5{;q*%BK;SG08)}A{!7RJ zq7>Tpx2OK8LCdd^s@6wPn?SGPOCWPGXfDG5aBC1lFz&diej{dt{xf5D0zEZ=`FPec z9MYZIz^+VyezFAUp1$7^7^Da~wg3vbxd`Vk4gPu#V!3%Qocf=sGmJ#@)7L0*E zYLS_se_)sGp$GG2+TC43>Hnh$j6aIF2PndV0a)o3?1#CMs)giV{DJ05R_I*{xf`1$K=1iS=BH7V1b=fRK!#!C79U9;_7653sZa9zRHT1XAICC$ zH(9L_qyJA896)4%fJ$uxif201Q-W^BDNY4Mj59U(qmEvSKV-v%iB_OGdFyy*5H2f?pL!NlQX{B-TQ2V<_s z`GgGeDTHRTQ@eL&yX{)lXT={^XZ`ceKA9c&F(fA5B08LbHpMTWd~nrWNtbp{{b9U5 z&L5{~T@K6hA#F!$iDohVww#|kytB?P_FJ2u|8^?nyiaF=@C68n0~QDf?_Xz?|7$)O zsk&~x&W_-vtM@6e(@uP5K3=26?i>XU8J;84J{>8t`h`Rxwq&5!;ImU`3>}w?=5g>A zHsr??j$(S64`*V~-M4hrvTw#)o2eXmYh}`^?TPQMTaiT*W-Qf=Iwg_?=h_YD^Ltm_ zM~$8;uW8*V1~m2>5;8#WekxXDkDAL&%T~=E3b&84i+OoTS}df?Myy=TmDs)Y&UAsa zFw6KchRp|c2C{=vW4DgrPpS2Xfp@Wm)CTa?XM67!YF(iw^ZkX96yKjZ&Fj8yV5^*F ztdLhVnwDXI*2T7$q2QlCiS)m#c%5mzw6){wvW!eJ8OmfN&}r%imDNE5K?HIb>sTKOReL6UCsYm!Jk zrMKO#LRp^}>)~<0#h{Q=Xke z%7kb%U*Y4>7QqWMJ2}ZWB_C4}bjAiWe^k=`5m&~BK1w~!IJt)x1WbW8TT@bgYX1>R zQIJz85=g!6FQH)KuuI%M_xprQU+IN*PV>ckz)(S7fEf6NAqPk)2m}^)`GbeP#J>=b z0=c__2=ENl#`5B=O4<{{|Epkb&NF4NXtVhvM1ibI#YU%L@b9N%-~D7u(~a_VgzG zgtlW0><`;{L$teq3%mv8lj=M3*X7Y&gnVrwL-gM4JlGr&jfv7mkZdb#lPfbnEQE*j z@8LhH6VRCzf+kj_W(zDAin}Z|C#Jm~HZWz9>z~+5Y0R7pq@%~O3eBw1mWs)iJ538Y zSnRjN=#PV%d5DQ)8>Qif$O;D;+oT0T?*4eCjCMKye%8OIJJqD9&M1`ezMK3VT+U( z@C_*DE1{sBSPkrpb|YNcFm@71hQSbnQzJ$NCV*&@M* zI*)tZw;F={q+^nY&m|X-meu&Tt|dvM>VL}-E-FHNtJN2zhEe6l*Et9 zg!645Zov{8hEYSQ#TU7X!SRl7bxTEV+PSwEE)e;~k_~>hI19SUFpvUcATKLIlKoZ) zR$H@(y}ghgKi4AV|E7Q-?In;pz|$v)(hW)!+GS&2EuTl0T#5O^d0AhdBz$mD^qb5Q zPD#^lAd1Ji^&N;#jUZM2HxCfouCi~cGbz-^9~%$_)TN0H;HYJBtb>UB?T`^3rCnni zxB|cs)zl0zCw{gyfh*JTf_8;*L1RF*Q$%4oox@%NfK!PQp2!p}R)E$fUfIzBuqXbb#OBkvTz+=Y^Tk&?~R`YExNT-vb|lV+HCjM-lcpF|V1F$VKt zywMTrl-mNyHkY@OTG@=Dij#t{Oq*8Qe9FzAwW%xwW~nJLS1BY~sMbG*YJ44`$6hKe z4(Jw{&YJ}55L;{1jKg;&TKun4Vn=GuZ(gJN@$(;6h*vNuJ~^n(%RxV4tV4RPoD@UW zLl;=KTk&w)uHdBQC-D-sS>^TE7&6su1kO^k9Gc?%AMfkF;0bq&d@o!jo^hrdh1zTs z{r(;h%NC`sl;tvSCZ3OsK!W`+SYO3{60xx_a}(7*p$`j-mFv{sVtktv4Kz{5^QgXa zTVpNlwCNHGQmHx@&b+aO3$Ns<G;$_KlSYo_JfT5?a7`rFHo_*3y`dQkU;rV2m1WBH32L{{+o5m2!Ct!1aKgrXskc^ zR(}b?(bU+=nC`FdzgB3^HKrr5*-*OBU-@7iTz*@aSkm2qdszNhKPMwRD>x`=G>)lD zkHZ{oXCRc1H_Vk!Pu79%e2`xQM>-*Ww`h_vQyS@>A)j0!t~|6(w1{l2xB`E=T`X6_9|4onW-)Yy%HbSafFV7tfGK-D~CI*Xm*R_Wneh zM}xSF!8OCT`@Q5sRB)nc%$V2TWPq*)Q+8)Hu#f@CHbZuN9|bpHGd0;FNm4!eJG7fB>Wp zGoZZd6(NV!IP>T7ZUBpC{@ke>9B4H^BI)QZR@)xLgDuB8s!`ubH0suEr$Bx(Hl2Jd zT={vtkhD4x>!D`kWsM^c5LAJ9>;Pf}W_AvukzFVShj>`MR1qS{7A$F`kVBy=rt+_A z-4AZ3LT>*i`Z;$gou0sI771Q>{6ZtLwaXB_#YFUzGd{?zq3|9x|ifgaOUv)>y1`4A%K{qo|#g+TV*b@wGD#>eCJ z`951E4>)oPNAfFT@9m45ULhPxUfm=cxIV+fER3uVv$aMpjtE^O z6|&bOQJggk89+!0iXsSHyPn*lDIPDeTH^6EBH9h&Ul8;TE!`a&H>H)gWa1EJSj6p$ z5H=!i?G_i~teOTBb`Pg?cr~18t(d7caQ`-@l z_QFeh@D*jeVBwpX-zJy?NfH4zRXc`fs3-XOOva(z!UkBk79?1S+2^^^~Vy- z3fH@L@%H7XPB&ZU_;K}GkbFQedbv}ha||2pCVAkTS8a}KO8FvJ$SpG-fBu?kN#~(C z6PMM|RoD&Xy7?!4%+m_{ zdaY`?y-Ru+gjk+w^>exNid85qE_1l{%2>zRvh1R@n*{&kJ2^>1uQZYqOxREzV&1h2 z$-=}`kjQvn9_1vRP-EoY7%IONDyljkN6jzu_O6tyFFi%j3f#$dWAI?fvq`-i%i=cn zWQ$BdXvpKR6hxcxT5Pg%Q?yczYM~7Rf>LY=fyu#$So_>u5BUjqkxu21r2=wo1~05A z%vh6bh!&JY#SMOBZHhAk9MWfPm{b5}>K4lrs*cxJ%2t_qTTj~#6(mX28U)G197qmZ_*c~^6Ae1!pKAjeM+LfiI z&GIxBq=i(B78@c?GpKH{%JV|8Di}{y*THp6wJl1WVoR33*@-TC1^MSFP=Pa*NDQ4Z zQnPT`u#{%)`}5xk*Yw(yW9dH(oT+-BxNuq+`>9t^sqB@@;lD0JIom=ETN?`XdE6Q*2h`<3^;h+RHaAMa&vql$w_5!LP6)wEQdm;@Z(ydU)X3 zR`dn%O80W?M9qh(oP&q9NkuBywn7~QR`&p%6SnUGZ&eNjJvzmB?gHH!&}I7SxBlS; z+m=aKI+aT|SXn09XB*Qg4D@%>y!N`j9;nq9|9((+ZE3Px3rHW%1Z;?-{9{mOs&8*> zq~vICX8q%@v7M*Jx;0>*4KOYI@Vg$rwH$7B+`A-@oi=!lYBG($4!@UI zWV~ITrZn~iRvzGOnXhddFwmajQ1N;h$1g;^;#3}LFBeFMg%E7-oQ~qsf$Qqt`ryV6 zEmNgcTjKI!F?C{jK71|q(Na~R(K{!iH~!+|49D`~vJf9|#at6U&?%+ECQrE|7?+QujyzKV{@!AnDzF8cL0udAyg zN0+bLedKL>gLTPUh4d}O1%K^ut4VglpHFbQzpa5$TGSRGZ&Jn9?GL zN4ewd7knHI%}Kj{POoV?Z{e`ATW9yK5;9rhkm`5}+@_t9Au(*Y@yd|Z3&a0-PvJRB zDD7-v;zCvbHD?xYV(ZN=z0zpoX_o1R3=>%Ssd&qi)#D7k9$7rXkv}+Bo&(zLo-7`I zAItk*e5Uspqz8L-5R2b^~tJ{f4;VXTD1gC+M9eScer8<6V zHPSBTJcL>jHGjDv1aT8t;_m@RW(l%8BiJ9LTsLYenCs!#G^*cR$IB222j6WkzdRW& zohf#><5LdWB~Sc-8YD9?@{-@vXg(GfML>s=V^W7#(&5u)RP*ls5l!?)Twou1Eluv# zkI&f=##OoPG&n|{yIv@iIXrPyoL|NO=R;DpJrALHF0)*V`3CGW{->^b~JSxd45HnpQ5xjo8cV=Gl z&9>@u=Q&hM5w0NKTlUSm6YblylTuhAylDm-nsFi*eUv-1F@2jtlFMEdgDD0~=I*TI zF5M17C9RV4W0PtKC=gf*{FOKwglO9C*2v-)8hWG02zfRE%d;J9c**@QtdwPT6W6=5 zIVH(sqW&Vr;tWN3Mvb)(OZhT`^<_~W`*E@Y>`0jb{Pj#>76^ni)&ZOhbGi2*-x0py zY{u+0xA8B7IXQk41R+k1o~`A#xvUxO1f8u+_Z6;%&$A$^J8{h1;(Jg9E7z?3mJU?4 z50Sr&m?w8|Y}LSEvqdC-(d)4Vt;CO96BR1OSh0c@ifn6gh)PEx3}uuSeLNZ(;bow4&&pDuxAKDQ8{?eVOIU9E((#f#9q10Z_9gRh}~%=PV(~x4MjD4(tDA@!6*s{ zI-iqd!I%4z?_*Dh$~tNt{hi#D;2PamG&&8Hu?$rGU@PPs$UY!r3Kw&JAp^}$)6F6y z{sme=S};m!nhmn*bJ;fQx8DTu<8I`O?mqV~+d|$)naS(YeCqg6B|&@D0So#D=Yo!G zWv97{Wu=2e5NR0_F)b1lETfmZjIs#dT9Z;-2=SUwl1o7;;e`b?E8t&jGI;tE=hXv> z8b4smy4IV@nCAj(quyk``4MFOicc`HK$SG##rn=fNypGNAwHHMeM)X;R-tZ)6$Ytg znv2pR86vBZsaC*>-x%SG9TYSYFaRY+Q8EZ*7D=L396Sl{I4(OF$E&y6`oz4K!&rt@ zFsz-7kXd3>l4gW9>qBZn5}Hd45n;{w1(7XF@PLn5TdhJP#pWM@vDD>MSN>zbhp|yO20cmg zD|bdy7-vwf&^`i9U~1sXjb@BtZtb_sQ`x1Ln+iA3BsyYH2C!-Lj_wripUl^L%}*mO z+qr8c`$r!<;_A&VHZb*Jm3#rsC}J1>Vx%5X(ET2`Nq8)xE6DP zrr-_!tnkA)mzVQFP;UsQi^<#uCmCB#W-ywRfRI7jJl%#kTNxRsCqi2utN>5VT|7z{ z5g1SX#Y-SWK%AM-KdYe|codkR#0z*R05}oAKu)=2geS>dwmZ*jIV2-!Lw$&CE=btuFqfLmf{go46pz8yLudB`{BuUTSsXDS@Aeq)WU# zL|EtQEIcnjt99n~&U_^}c}zXWfrnrG-_=VLH@<-Bk1_-q@wFvAhHhZoH_SW9DEq}5 zWIKBhxrW2385!x~x7!)YFtKfu%-QQpdf<;hf3j@RCvUlNcEksOE%03vsetEY7e??0-6N# z1NpN-^;(2PLL}5-RV~)Nk|LJxVOH7n9gPsqNwoyH4>?VjX) zp6KrGy2Tv}sGV=oeSnTR71MYKexJa}s2*8!1ePg`)_e{KJ-_<|1AlqihS%EhL9hA* ztaSftI?*1Lk4GGh?h=p~+Oa+22UkT}ar%jWk!CVMN|F$h2TdC4M|u35-?$QnmKaVP zvJGFM<%G#H=5$({j^m!2b z1nsh4r)dTcGh5zoPVV13zoxvfN6Be?7$;N)-_Y~m597C=KQ)3=axoW z{QmH`e>m*Us~h}&_nQ-Td49cZ#WMZD%m;^w!n5-?e$?sVp(}>>Pk27Le%GK8W7lYp$v-8$RQ+&Bx{8;>lt1H|^~=T_l}t(@%zow-o9A zR3~(LI8_t3&v-M8`p8sps`@r28PM{mKcy}vnf_F`!wR>vdGF$hqbX*%iewsFP{8dT zKhnWdfAjKTR!BD)VT~`wo7FJ7ITq1tg^*Ga;fxVX>?z6jIhAK6!?5)nSCm z{%XY{Bv&0X_F`7*v~9$-%xf)Ef~-bDnP|0Bhv>J*{kt?gT`g2b}#X5H=fs@>E#du2HA)^t?_SN3^^ca zf#$5xa|~-fWR5@o=1MUmFs*+$pbz#HjFTW@-%UBJUy=iw6BgGtc$Iv?PACi}5MH{E zDTm!wtf*hoL>>8%7Er>KgtXo1OAEZGAc7fm+un_a4-8bg2jN!*vqZ-55+^&4H^ zil!Q=i-f2+V&G|SK#0rYsNM+Y8YUf@Q;Q`Tsnf72n52?q#3oQu0-)iJpXGsVu~wG} z5%_`WTLHTfmxeh5%+Wzcu2fglZ*GF|yJo~{r;4#X0Ny!c(pJcit4{0kv?hj)i zq9lPqW8Q#e*a%m9z_)#_0mHGzaMloPBTfUfOK@Jn7F5lin2QK40-V|1&d3{%6SB61 z(N^rJlo^&GGJ8+})WvAY)JR(N2!LLLx==(A6Iu&#J-7}gBB}o2{X-m@kUb%9{yEs6 zmbFOd*c&13L`#R{DiA--MuJ_AII8!T^A26ymc%1iwDyQrz2-{%DY4A-1|V8t*lIhE zU*^=qGE~6=u=Ja8>(KAPO@p^MrFR349UB#?C`{384HdZx=+QRjgyn3q?1-ceM*ZU+ zO%rweD2YEm)rgZ|?>pzfNOl<1h#Det3Z+Hml82-7Fen_>&*?uS5Nt}VdCQICNe#nfoe-SuA9RNRU4bBF0Io5a2_eT84|z^&ET9dV&H#X z65)Yf0)-S%S@#Unz6ymh^IBwW2#Pj+* zxMVJhryNiWZl~v%1{m%U41g9{nDRq@M1EKT{SN4q{g|(LL;rUXHc>fkAO_Igd;_HV zA^;8^8QB=h+uPVW(CORS{@E=79N7EMaU(#_lNm2#vHvI29_9@{@-iy(96~BqCD}2B z)^U}8?y+KQUwt7t(8N6c;}v(E#A!_^xB11@?ZMP!;jqi94j!p(2ZrJ2ArYvJ(CP0g zgy!{abUxu=BTuvRom>P6e!EgWAH_2iA`*LF%q6Gy%ri^n~wY2F9;cHRQU`oGg$_@7ksj0 zfQ3X>t2={4N6nNNHo?!8>>X!XZ6N7^4)ho=?Viuogl%_ot2=-1GT zSVz=)kF0IxotuJ{c|y*?V&>5(9D|ZMY^deCkb5|+5|Dei6-Xukg=L`Y1>Df~xx1?<&)>%*^^*A|Ui zIKCWB0j0v{PK;v_hN67}%^^30Ia|bm{Ab=AWXXJy#FU%KNLCeYUci2Wh0f7B0)4rRg%8CM*W(8mx;{RZpjlJ=I zc=lf`0|JVS*Ouz1M+v?H`xF}W%5a{a3~CCXY_}(1SLlElT}89x70=uJ=sX=ZH`ak{ z9d+BjJKza97|*ZBqpOiMRmq{2Q1}vVM!V3(Pq*&m8A5biy4NrV4ebaLl6?4}G6k!@ z)|apdUV*-o$FCSouapz;6s&i?0!-p0VOv6Q*^smlQod;@vsD<9yV5_dWPEksWmc*P-Y`DN zOdRa%F%YMH8HdsF3w{IkYX3<-5Ws)U5Yjx9Z6=l)QGo&iT0jE=A_qVXNNf1#6zIPd z|JTHDP`%fFogJyuX7K}5GKD9IOh6Gy$*zb*!#Q&$Y}}r)(IG%Wd?1}fnZWFO_L|T3 zaw2hqvm#f*Jf2YoT+U6~+k=JXmA6|J)lG@Eg{1>$xW6rlW5RkLbH@Daa{C?Ie4HuQ zB1&0Z6ff?DBiHNU`}XIfwFRD4v%FjB^!*xhQ2;3L4;c^6Z|&A^j|T;V29;|))=mLQ zjZTffu1{FWFP6+y8VZ-RwX;U(aegk0G3R%NG+$Of*PJzuKBP^)X|io@h0P}skyx2E zU5K{;a`JIo$BFv3-7lD}sgK&{XIqs*=Nb&G+ZAgEnHCAhNbrgkVk5~l5=X^N3^|ZE z5M0`xA9>UmxCWyd&8(lCopew4FIt@j`yORNltXq;-rF;gTIxE-8&90SYrPw7_Q#@E z;C*;+`n}1D)t_82LL<)9*mHsyuyDG4UIxCnJ9%0=sx%O7Z>L7LXfT%zIi(DWGkbaI zxTK7r2mlT{M2yQWJJy}bCp#BfI9O#n*+E3oT--@zVYl>2|9pGZ$q$TU(`L=u>R5}- zu_^oY@FBqC&$P!=Z>;Qu70xQ{;1K)y)!i zCrcJ8`jJj+-&NyCup0u?#t1!2)NBr!fjz|8Tv`VT%#Su%x8{1ui8y5WbGy=%R(kw)(eeQ!xVY;IcmVX3kwx?riFB<8g##DrbDw#edms`p`ui`4|mXWnCt z+3xq{mh@<9p=gZebq&2yh2wVJS&qBcWy;@OWH3)`>buhSd)cW{J{K& z5^(Jsag!$sp8NFLtGOn3D%GzP$%mUBVG1JBt(NJUZYVHo@(*a= zZU>M`v}vmDM5-r_^xjQ3WivC#=rph$*ZeH-D=aXrs$8zyYE%}NyY@^c@yYJg=GBEe z<>lPAUx;W0oHyk|bV{AeSs)-jy4>WoPYEm>VEJ`rwEcL0c=byBZd_}u1Q$2WceyiD zqYPxXcrCm0I4(kx3dKkW2W$K!-@I;{n%#$g1wOxMdJ1~clh{L$TF-5o7?oU{;d9&y zUIfc}4=oz6M!muS67n>qH~oT~OKt&Ux3!O}XV}uVI#ddhDNv6esYc*O1bia7ga#wE z_FM49jCE`nup8%NhI0Hf=2cwF8EdsV)vhpmAjOB@5aw`o)iO9!S2>l5F5K<~jK{_U zR=>MhekcsnY`3$1$z=-D)GQXtbh^{nvy1*4TWa23na%qp)gl+Yq4SlpM!mA9FxKq1 z&iz5YZMnc!`z$M6W~|4-VWIhb#5kXx$zKu|+zT9As;-E$P^OutRjbdDD~_Y!7}l^DzoOv92ktygiD3U)^1-!!L?AM@^hTuIhP zeeiXyOT5g}xlq0TM&CL+IH6auP%#@SdGDVtIJq@ZMR8TJ@wxO;3}zIcBN&S(NFM_Q z!QA5r_cvvPsyo+WV95a)VPmu9t-;AK2@(xRw zAv#2VCu?rkG%^SZ&ESX)o&*^3bbs=I(T_$31k+>L5bC*Rj6l*80|~w8-p}W>Ix^ml ze##%knq(bkPc$cV$o68=4995Rx5`koO?=N2mg%GV#aa{+iaw;pn(+}4{D1|zb`iU< zz_mEBkRtlC98cT~ni}>7Wg5vPFMNYrbg4LjAlL?twMP*lu3#HEMhKpzP*^Mz7!f{y ziXt%bw>4%z8&Gsyp=}@0SG`aq=xuC727#Ps4X9o=s4?K6ZOKrDlEAT%4l?>;aVFFL zc;Jv0ys%+ReB4cxtF!?|bQyVGl;ltfF9{NBP@8;a7$k6ZaM}ZuhX}>)G$8W$$MG4P zDIGduSq}^byKpRsouY~=C@tAJziC7vo>=D-d~lA)$4N2ZXfFwhyPK{RF&e)w5@9So zne@}Qi;>eLJd$`$FmYMCsWUHrz`*Sa@XEbIwmX0Df;DssB?3O8TIcW+DQ};q4upXxz*0{7no8#%P_UV1=2p)Uhvm)1>cysB+xZto z+LA-%e@&@_anB>s3K#tK6se3aP)9#Q%r97p^u`@n@a*w0(ZV2Js*U+>3)@PDKdP{e zSZK;^OCwY&&grGBcVcvMV>;2EEGQSEFge+;*Ka00MqG$bhDJ%$4+chrFmnf`w4x4Q zmN6(6E+#z$gvmZyIy9Qzy34Ez7hQ^EJO#FOL+%vQdokC&?Cr5^5h zoU6)tm!a40<@`Ou8`*VUK7Y6BZQK1t<NUrXQ0@Be?+Z_{7%1Mlx2Jb7Eb zcDGLbv`(h*AN z8c~mqLDnb;>@4FxNCw>;^ut0BCZz-0oM=afple1yuK}T15xAZosu|zu4d@1NxNwaCB49cRV0W z5e9C6Kyw_zq2NglbhFS`JR{7CR|1=bSpST!6@6_eLTiC4SS$KUQFH^)7v>-gFwue7 zjlN6=-30V`FN6u=rihRreijVfeDrA~g!vj~=;kAORLGM`=q92Ln4j$m`p7!^~11YQBAOE8%KGfiKarVLURp3m<-E&8+(M z6Xn-@?GupPKYT@Y6SM&b7zl_E90&*p2nyKEit#UZakX`@G_bX`WN@>#`j_hf16&92 z+yA$({v=76UM8fFDuc0XE^)~pax)Bv#hQoUUiMbvCC6oE!r5d|%@j>8d0gn&ucP!FP(Cs*~!Jxslwls#s2B7e-|;sY~d zm`=b!aCJ4gJy^JiER!zIM8~3aCSZR5Wr(o*d5}d{q`a??RWC*~dr<2LkE9WNw3305 zqql)$w0T}K6v}~T^??`@SrR!i??fa1^T3%pMevjgr5lCQ{xMlRh?XYSW{os3lcLS$ zWA@221E$qiW1Y!E5QnD}vqbyCBK6az0gWW=T`{_Ko&~>cG3P}k43~+N@P$d^Rl3o9 zVRZ}<=2VI8MhfG>r?--psL@RBZ&>RL4%QD^^0eVsU2o}lvfqAer#C8)#={WcqT}nJ z<+!P6=cW}j^^4OXZ->b)YfL zH!*FUpK8)3#o=a*=Qx3A38l$+sLx22Nk)rBnQx@mXxOsKHX=B2?h~7~rqx;4N{nKT zR%60)3vEXv!lX_J5#k~;q?lHFQE<-Z9|Rvkmjeego91b5w^?R(xLRiIhk@3)SWOrl z!ZD$uX8LI_e2vGyKcs2b32v)(8^CAQ{Y>xXo3qQz=urNPxbl}3E<<rxqrt zS8ol`qQ$U8&Ewud^6n$`t=@U>HO#?G&`O*-z8IepX&uU!>TVuQONlAXH%AFl(!1UZ z_XY2ZwuRpmYt=KjnUGmRRk%)H+U=R3pA&!YQoJnvnyA~7ZSMZDWgregez0yQX)S=| zr?A#}vP->6*zp4U&vA1ouj#1~z-l(Ycu4whb~~CG8#_7vJ%s+bVg5e@Xz)ZkOb-(h z@GP-Xc-F`F&8L6#zpRuAScu*#9UxPRHRvs z2#}m_$r3*zxQVnSZ{>x_Kb!TUTUI6ee;w7*RxntxoNOvixy;%Yr-va#AGS)s<2H>r z#?~03+g0?L!`F??SGT;??q0?hr@OI@X@cwV=GZeAhGH9xMUzcJn6rUEqIC z7>u|+I8FRZn+}9LNr=JXEXVE@dl@f8sYhTyhpUR7RzgDQyI0ohEVxFTXzUnTqbctfy zj0~@eO>CkTd=P|pQ0)(CgNI77yVAk5Wl_H0x3~4cHEtsYV7-NP^oYkD)hu;}IY$Ec zN$GzUd%>2~GTxlvP@|OffpoyM$_14X$Ks81*Ntrsv<}j&hp-VInp3zabU}>JoXIsf zibO2KcpjQwI``Aa`+KWYu^Hth_c5<3Y$I6_ScweVS$Cl85l|tHQ;ABD+DLd<_@MPK zd}gSUx>KOqkg_rnC6m6E@V$o^tv06?5I)IpX>BkQA4w{!U;I3;V41cdIubn)>U~dD z?kZ(~?^$En=W{#p_FwsLlE3(!$ykujFv78bI5PvK@Ajt?OPQ*!QXpWt-ak`+C0pz`qtqfFpTZj zui%v`KH5Aqw83?HzMrM8OenwpzEVpW%QfcGwmEU_9W3VFi20IwX6U}EWmD?tZsF^y zJ2xmj!(UGLW$yLWM-yZ2?no^=eaeYfC+hgB+I(5HllOcgb&GYyKI60N>MUW-_=Z*4 zPIJ*iwZLgc)#slCuHeg({MlM1>b}%y z>on@jI+nd>RTg+z|BevzY%|$FVB4WZe(E~5)4J7$>!{1qstHdxB6+>@=CQd_BB_Y) z+nKKuGl49f6J8u+w%l<}lVKFu`IXC)BJ*~{W`D-2IsJvNQ3y z({GH9UWt!mG^6{G4gPksos?JW7#SureBa9^0`JPtV{Y5HwU={j=6tPc=NH3KJBwbf*l%15kJnP8=>5SOQm%P`M_YsXG>o!tO-cTP$O zKHe(}i>GuGRI#bZ1JEEVhCA!qkdO|!g4}01<7j2&OMgl&6~1!R!alm+m6M$y?hXC{ zI0oF7<>dj0Qd`r<`dLKers1yr_yq3B{sAZk%$8P_0f@X?=YJ$7HSILlM59i!e_DI} zXl+%GuRP;iUI8PLSvHKQY8zT2EV#U;ABO)j$g@1uIUp&n-=jPVRXEugK0YZ6r?vb; zw_hK+DPp)M%M$D=OX>fStdwsCKC;@>5zIp?n4pHIPSk_Avn$F8lbMvvA1Pa8Rdtws zQv5DH&TSH(TGKzvG#r6K!py^-qTUUeZTIcA+NLto5W`(J+%+3(gw8T-_jFdxsKwbwg!noV&^pFcM+?07TSj{G=@J)7^JwR zj+jpL=m7u+)ER@}X9`~Vs}A{kgF%EoOA33R!@Qd5$6K7|ds{lsskvJv-j@U0(y6}_ zr_>Gbe>8Ufr!fbN=W-SWIPVm8kpLHy)4C6|`A-07BWUbuZ$Z(;sWJ!uA5q7!L(Xlr z3=$;$m4gcUP}z$-7P*Lni%B`48t>Mpk80!UyWY3p{q6}mrs|)`OibsEL6vyiEtv1C zWq1bZuCCH((o*?^%*c#Q2RHy)p#H&iJ4tk1HE`9Pg%b?Wr=s$jaTtDU3pzlZxP;oK zB)<}cI8|0~_CAGwcj}Xn#0bhonLClG#M3IBupzaj)gL7|K9nFgPCY^={EI>WqWtL; zK(J=OOb#$oClTo%vhMxC4r#*r!w?eVl{2ZA#D4_4r>l#9O!PNJVHSV#;l8BhU&U1GZ?1111#W7sqj%u{doFS&}9OX;%K7{Eq`iP)H& zHh#Ry=Fh8|#mawmGyjo@R^FB}mgcqP6Wv$0laM>icsj;oSH2p+*YvU9X?8OzzM?+0zTT3*xY8(w($XHp>3=VQ`^MhsoVtBY})ZqD-mm^ ziVAlR01ro3RTHMOjYe0!G*71e^A_709$LeGIeT>E_%>}U+RDwD^_kU=p4xs(69|b@ zYi>(o7rAoLw`z*Kd7S%860i2i-`B^hhK3y9rHzIA=QUd%i#o`V45+k$yL{`|&l5E0M+Z32N>R-w48L9QUocn>ri5T?k*R0_hT0}=99RH! zs!f|8&<)a~(AtmojkJfUiO|{nX^#F+b7J8uHz(6DWGWD_mSO!BH5(tTJy(RDp;OyO z(h{PnPE*>U!`C!5tPjDa4$%C(>aqBtB^1)f>#NFC;{a0=rnZjrT=Bt#jXz8XfeUv( zlI-q_pr<3jX!l$4_n?!#*r-Tn;crpJV$6<;GW(p90oF!k5rR zg~@F98e1?_DTd3I91vG%x7)O_D@hFv_U7H_NKl$+4LbptFTDLBie0?gH}B5|#?{p! zi|}aCuK*9HUA6sV4ylm7e%$W`162QD zSA0T~oA@^tjcMGNM8XN#steOH4wYEb3c8P5rayxi< zRb*sItrI@W-zE?v+Lp~>Gyv0Ty`UR32G`Vdv2$p3LmoH(c?n7rSKufrJq+_o&!X67 z<%g^I(`(s(*cB8rJULN}_=_f*6`B3QKn#Gwv5|i|Y9Fsw*FR~GZbjzs=Q#k;KOBjV z>|1?-2~M-t|078N)KKpS3|OKg=q6(2FVx84kJsu`NUfSpHQOI%rLFuh>rc3^27B3C zN2zJle|JX~HOCVG07_F+i>f$AFA2D)2!Qt=UYwKP{87cfRm_%NtQ-zN`%z89et-!I z4L(LCiFKStBfSp`e9!>k-2g1NJr*%V755}qDfTaf|5fMY4o*!Z86L+j5Nz)=E7^W0 z8M;_GJO&2xT5-3Uebqbhnf92s9izlbnSQ2^Hm{;(D|>a+qIX~G+JV*jWeogC3OqrJ zYSF3`Uh`ZQ-Sh&j84H)!*Qz^Jo`q+{>udEpemq{4+qc-`St|tB3O?htv*CqlADR=B zPVd`Y!{(zq)3%OF;r5MJM_-z%SR>!2>;1f!g<_w@pKYO6I=^gosyognC*gOy5!$gIAjmH-5nWDHtu}uHGer%)Z?_~v`kIw z`&0%St9tXlKG*QRt`ZE|O%fP*V%07gK9`*g_@A8+a;(H|W!|zM&Kq4O)}Z95_o&L z{82@Fko;3($Ykru)p22KOa>!=iE&jXweHvJ&2M2}U$iO(fx6U)DtBs}yy10owK2@| z9j@Kh@t89NFHO4DMQ51er3n1!qn_7bWqj4j0)(rxJZs}tyJ1!OBoftvIi|PXTylbi zBQ#wX4I3j(){2Q`(v@pQdY)y`s7utdt;ep61~1EU1v4Fi#{8*?&#GEW>iN`e1(1W< zMg29~xZPz2q%_jR)u3pxU)Jtn?{jZ|uV15`m6#mM5V#8)7VQz$ta%qrqwh$=`1lt^U5c^c{Xu1cBM9#p3f#ueH{-wq7>1VO`sOMtLsw z=Ek?8bM<;lLVfSH^u4Bla=jJd1bhwhTGEttb;MZIlqJUlo>9lsGq}z2(M#k##p1b% zE+U22dCa7;XJPB5`Tfj|43cQ3zdfEb?uflJ9yLxejy2A4_ZtvNUThdY%M;WQX;Ew% zzrz#MF{!y7kPGlZX2%SLjQDAYuh-VX;1`|gmla6N- zokkN^{Hx$}75@3p-B=u(@HCt_E7{+Ly5R-1kGpubuhV$qj{i}hBz$|xAsfJr4|(=1 zjkAHxA>K&laE^ig)yl#vXbYPM#WeE z)OcQ7HX|y(7MYSRU(pQ_nfJs*ev)93FrYM;eA33m&eianGhr!wO@C%CLn8x0fAt*P zqTI`h=XarR#X}?Yo^yeIa!&tSt~3hg_zywck>k7}P8ymVc~KSF7WA((Fu%T*Sthqf zw=Lu(^Ydk801KqogElNSC=4rXoEe=B*P`+8TSGZ85^8{ySRR%8jwWvEqgK7Dw`oAs znWcu-o$8~G&2Lz5&+*3ec;Ua;AoRtqUo^=GqK(*YZN0|ma#GALf4e1sVP+G8l)ubl zvq6pRd3p+F2gzqu`sjO16ZM-Wcxx)U#!` z|9kAq$-zD0L8_)i8zmXeFLjvwIwZF+^tL{$tN<02H#E2Cpz@#~)}#P@i>|%?N0;>> ze4%^Xpu!R&HP($UJ7`vg;}ix+X0_{G#XU!_8DqE!!(DW9Hi+r&-77%7BJJT zBjeNgeT{q^OScDh%)c^2@_gtdegttdAf4;iqaXWj)fVtms+8rNny+;=iCV6q!B0|$ z2Br&^VLWhMy;Ug_o{Cgdwk}hE3iV3OEGkIJEd3>2aDc{dp9&@wvy0y*iYnv zXzH!xWL%hwN3>$hOG}B1M^Ye}?EN&__@n0|He*?@?}oX>Uv!Y$Oy)U4;YrenFKL)- z#uej?^B!MWTeE{vt)`fWy{8N&f83NVtCMuIG~8ysRF^3mq~YunOkuxInbU7FL?j9e zP-0PVV-|TxAgoN%G>FKNTN{B?ampmMHGUp1+MOLC53w94vgdS0YB#f?MIyd`LVwc2 z5ALjpY0bXP-#!+B-Q(!C^qIPN)zeN~)0T83V`0@CST=J830>=PgXb@Hq^fnVEtL(B zR1$ke$q+o&*+JIfB^fmi97U;#X_OdgWEu7O+yZvCN8xU1(>TYII19SiMir{hw$WQM zAgjfoF~@nz=Eq1|fUI9~$)UAr8eBrD;Ck%?EMs>a$zOX|83W1Z%VyNRJ`*brbIt~_ z)H|UmMP?#QeE-}pDET_*6jnhesnne^6#B*l9{7Ts+*D+5dn>-ss}6rvL2zfbJrdY> z)fg}HX{$t-)()mahmrr6%7Xf-Y;XT8VXWNtL_+_F?7(QhMe7Vhh@-wH2K9Hrn+Lkj!Pj0cl!);w4S^X93*cc!BJ$9|BoXC<2oCZtU2Mm5FpU z$YhS;KORT9qqg*Q%SMVCtG*hjDx#Ak5V~M?{#UR$GQdXd60j8?g98MF`j=ZdnHgIf zGyeJh6I(u0*Nj~Gg66|`BLL^&YNVdPDB0GXa#lEIgHoH3#2d3$!@d+hU^dWd`8k&? zHu$r-#*@OKCZWWNAc(iP?^q+XHOwO{AI>97Eg%@m6*t|`osI2%@XM9K(S%I9%?XFq zNlHP;eY!pq))+RPY!@^=Dt*49SLcTfF|j>MR}^KTxpa6n!&%4sx@a3IDGDmsRrq4J zG;M-Io8byckUky5CA0YEa$E^>%B1wyJEDHdTuu|0BCX10=Hl>R6uiLYlU`zY=uf|t zG+G_^v>^n-(Ut^C;TRWD$mc)FbtN?g=hdRv{c+ zZ#QEMN?Ro=8@`=2rQk%x!c$Jt`gF_)#y4?aS`q96uIGTiP~lv*cKkU9WRnR@GK;-@ z!=|3+4X(`ps#wUiWZpgtL}%ura!b?aj(!uJ%GSg3L5ET8Ne*;RdSf$DgZvW44SXbH zj@_$b_1LWeM8}`xOJV`L(^6GS_v$jZ(a;h)Y1@`(yM{4@ZoU(%>Z(CVHf%oH?jZRM^zn==L3tORV6d>B9l!p|t z-5kAOg*hGBefmM>LLguL*nnDDXn?AunOV1%3lG~?sL`NNFRylO{7;0EWXRZos=n9* zH%)L`UeB71&sj07Ws0+~$Y#qptx8A5N;^W*=AFq5#GTC+vV@8G@54h(4Ui@vh1XiX zgdqhk;!D8#td;1GfD=kMh30bwmGbvV!*2Lq3ROvFP3>+2dYau1m!AGjy`w=y}cU-}!S zGfiPq8HU_G+NNb&CId3fYtHW z9m;V><1h}Dqu4BNe{!BThG z(x~inyM^yo50&-15n|&K^5zh?HLy$4b!34=_#Ovqi(pntem@;ayJyje28%eBB8gUK zA7siCq4UeJ$%66F%!R7BOa=X!)$plcox^2K6}AFx3?5gk(K7vHaAjqeU8V9{vTeC@ z^b@U1IOhfun}stg`+}79%z8~fs6WRV2|MQ*^2$2AO5ObYcyj5_JC}g_i_iP6n@yke z6?P|FWVf&pkw*HjByztT%D$TNxsZT$1Y4|fNT`nuA{$3$xqm!Zi_?Wi`)Ox`3x0cP;N4BU zf<5xjELAG?phYaCGqkMdS(%xcc~}s5dwg3UbS{#iV4H76R5fR5QW!Y%(qG%^RbDvv z{igH!^!qi|ReGj0>q6^!iw0M!O6lN~FiZVy;hiYXa{cwePPy^y_u8#<9j$alMjv5x zZ(TcLgUxSCE-lVMJ*TOpfqG}>EO>~-6Aew*xp!jPjkCef5_fs98Mce6J=I4a&zl@@ z-)z-6-NoL}0KVq4(&NZVcu#(T$*;KAfqX5V?3I^uOFuky*(+*d-n_|*@_k8gjfTxK z3+v<)WLO)IT|H|x*3vgg{E>*I6WJybm!c}3_J6L_J=wUlPS>)V^Y`l@K?@96O_{DW zs(9B`{P^{aKHX&4E%R3b9c~RdXXD)Q&(VG*^tA~%=IX2^q)^;R!7NLSvsubB7#s`y zX6Rj;6v{+%5W6~d*?lw3s`FD7NSG!z*=b?~J}fdeZ_bX!@s97@m4OxUtR<*@BgmFR zd0Uz67F*6t{v~#4Mh*p_kJZX$dagwp5G#%88zDw!L0miX3Gn8{`^g%)mx3%-{bZmr z$P|*($o(hUljB))$6XUC#A}9+M9SFG54CLFrP1*08}gsh$r9CB2DVsQ3O1Y#%j#N~ zEq(-6nW1lu#1Woa2JlXqm1*#K5>n^=X8In6JZyz#JRVO=%yZ(GB;z>(dd|})U`Vag2*kzlEewYMlB-o{ zJBmvgc8xwqvuiZ%To@lzNAqGG*pp|nz8U^hfst&kk$y@2*+}dYRQ6X7ghPaR?1p)c zfB+|u^Njsrq^0ftX~Q<^8pijLXXI+KG%41{Z!^)!EmTqq--DrZgE2iK)i-E^3KW(* z=39QttT|%@$@%BF-zjDyT0_pJ7CG5ws9f9=>57^&1*OoOaL+wlm8hyO8O9(R~m!#bvJSz)%Y+ z8XevxsPK{ax(?VelG(Y%W#OZ9l7uQuk@m%+A&sEx@iu!sDV_jePjtq#93y0G+eyD{ zDcGKpZwZ;5?73k+nYL42ZPo_U!1Zy&SaR{#qu0^grDL!Ui-QA6r>0C^4$ByXFwteK z$KA~uUn}Ky(U-w3;x{%GTne*+e^B&jQXMI&VgJMuZ(Tp(Uv96AmHwgoNL|!ypc<$H zW*5Pfr*g7ZJ9F1X>|ab8*Tt?UWi-nFXs7aX{!AhQaw!tYk)v4Nj|z42_QKnY#F{;k z`*R~&2K$1kk;PG2Y1z>d6W$0>cTuk@9MC&r_l*OtGS#s^ZDFUzfjp<=Ys-no$VEF? ze8hNB-E>7o?qXD;_@+GPS5$1ex;GGG&!w=)k!eA^*Q@*$mM#@FtU+9)79R=?FmeL< zYh9^e3eOpI|T-a03%$V+wjD4P_%Op2QW#ui-@|!{;vW&qmQXEzg zFb>NuG;6vyUr!Hzd7ik9;G`I^R8 zBWk-KF|lN+Ok^yeGr3W$(T9{myP#K~ac202Qk{0jS!>A7-+JzZsDQLK_##kwCHi*Q z7D3DYMbzFoG}HsSZ}Q+*VQ<0LLRQII;u3R3!(=WkMVOi=B+jP@pIDB<{JF%L_GPJB z1!mtaAiSP_Dh7RhW?(*Uz*$3mnqTsJq#-baG5P8mCLSB@qpbT57FjZhw@zZ}IjH|d zkk}oFTJsT{WxeqE8BmO>w9 zLR<4^b-vrl`xK{zo>&JP!nkGE=CI%#1ZUF= z*C~7|2oe-6&dXldtl0~sKrqaOc)BbokH|nU*UP2Dn-vc8Q+-D>mJ|x6PCpCtSl<=s zF|}BKKX0DddA!eS>4cXS`VQtjb*Yn>rQMdWf8nr`7^4GG_C|(~aM3S36AY*up&N4^I1+PQa}D_seUu?yb9p+U6PQBL(m@tQM;?8em`fn z2?CpmPBL#d*~0QZ6CZ;b{jQ}o^C9vPsm#@urh>>7KqU7#l%B*&;({DqglkN==jO%Q z9hk4LsCN;}rX`AJ;KE)95~1sy%OgBc-Jbf*`N_a!f7|ja7e1rYh|UDaH^$y zQTU$x(I3h;KMt^RE!LD%l--oSFXwm@%W_RqHP8#!C5T_3t%r!x`o2wZJPQKJ z2eo@G&`&Cmez(&J{LhflHm$E`3t-B^3P_}4`D^O(C#Wo}Z)j%xcgp0yABY&6nA?~; zncLd@M@H2|cLX4#3S#rQr$adHnWF+yJ*Aict-EX%5-Y(R*NT-G6_7*8P19OExOMRE zQ@qBPqP|8QexR58!$J;?j)(9IXzJU;ExZH^L?|mHOLan5<@1Z#1e+lP`8O{#4A z;>?}cc>_ufIhq(W2^KpIrc~DGPxrd%o2&}O#8y!|EUA&<25gcR2Lb&&OY8uk=`1 zKzeLFZDW_bd?6@@UaH>k@?b#Xk=l29XcR-T=Z^&0C)mW@`P=E@wYx6_1o#9~Nw&Uk zBNL6%S@mXFvlasb1ySVRgBS`mCKf|R3OMQP!Aku!Xftc@Ke-GzGR*|fLC}jkg)hk2 zEKf%%ijw&X-%e9n|Y`NDY}Zx5vCEc+ zF?sKq+0C7PySWcJi*L4p`;M>c6BhK$mc%dNywmY5`Od_?ddYX&{++g3?Ln1!^_?K{ z`9h$uqPN=}oudqkiE!au=g9c}>-Nqt}<|+(zc*f&J#~mVl!WWlI!De$l^$NH@)kFD=w_>N>n&(QTYgM1j?q%#5gWG0MGCTSHt`_4{rA3LbxBW__$$y{AB%?tQM zozCqMUHw-i;8rB}3lo54OaPW4|AS?=4#xk>v41fP2q-#U+NOsIEvO2`op6O%kVqmx zgjPkgRH;y9P5lnEe89yh17dt$GR|o8|HVhcJq=Bn%K{%3M&)4jngyPS~XN}!INsUar%r#Fj+C8vpf1=-_@rO z?T6~l6FTI&u*&mDfH`I_UmD`m2O4Q3#K!?eO0dopAcO(SX0KtQ$FKtPlL zPyri#|DK@yNAbVrYwhaViYpQ*ue6FjOO!^IWRHO`&BnOGVnlgNoSL2+5aw26Bx6lq z5&%(k-A2Uc#5=}QbD=N|GUcVx3U8*y684#rR@oea&5ie$h1Ly%(a)z1RZ(@6flOHN zL5)8~qt>$F(mfp6@WV<~I242Ho{a1!=Qe-dUl7E)np_+gNjQ3!at@^9Ktkb}lM z@ni2gxAPDn(DKTa(ojhsYwvM5$F(>da^NN&>o;6$7%NvgYhws=HmnrZ_C`> z$lP&R?rF5|P-5?RIvdq5VX&64w)|wmd($Ep^nGNk5(moHsy5NTbLg{3!QGS69L!Wt zE~k#_Bc|t((!BQ6(zYE7*EP&AQ?gpqCslk>1VNTtmdgeWz zYeUF73I=>Iv>Qen+gj$)%veQTt0P~(l>o@g!0=`*D)JR;+fg2~RAJek0-VUTK z)j%x?t(vbgu}$KdSwB9%if(P?2@`Ni-!E=`6Q659<}98M=68ZGDOTCOFQL>%vuduH zt=lGjO2MwY9iNrS%;4E$ZR{mh-q-mB><8K~Z#GFd^;D_9C!HQy#OYj-7U@omA%-@z zs?GP6bSY3Rk7;esxUwDDa!2y*K~?$NHjzw&8qEbvN|Z9SP1XsyfihQBUjsj{J>)`5 zf2WiA2*RWAv!{LKErG+ldWW0Gr!ZQhItQLRF8l7CT+N^I^Ul(i4V)_BqIqR4tv)AH z`2!aAMN)`XxX#Ijv7Vc4O=HR_M-Uzbd?;QU4cb3oU_95c$bJgyV~1&2b5K!dKJslk z`a0@z>g0NA^}2Yoi1mC%=R>ko<(d`N5*9k+`-yD4r3p*56Jvi53#Opu+0YP?Xm8D8 z+I?rdgA62j|LrRHQahz!0yx6)Ls-?LEVYe-kxEKJOswg?CRj_!emnXjbNfiF zQXOZT*)I(Ph^4DSvjlFX4UGNDEmlcOF7Sj|0%5F%Gnt&46?{X_-H#Ehm&ZVelB#IZ z!(5=s59<5x7UjYkDaXXt7GM0(pTsp$LM4^Y>d%S4IO469eY&4q2WJ3_f^GpqmCYz$ zAnwErEu9ubAT~Yl{)7etowic^eJLiGx(|kB)Y(#;=0<#lfF5HK8<9^~Y7W4Nmrbz< zWE15;oR|6r8sa&#d-^JhLgQE&*(#+f9)FCff}%VXEqubv(LVJ+&z|`kvPJbOmPy2b z8SPH6L_4%6ii6jmPHdXlRM9SFY6=Vz_pZ?iZ`M`M91W*ik)QgcIM1P{cW_pj7GtEa8TZLnT-Ukhzn2iT2{jT$xHfgy<{2qj*qI}xO84Js zl@0{zU-MKsgh3nfJH#|vdBqBuPJr6vd7YI~!Z*7as;9npANRP+1Ko!Yb4_(e~-soEDRr|BLEBvyXek#Q#rFxx`0PC^)ExuRmJ%GSBQYH-!)h2w>?wPFN z-!%Wp-kPK7lqD{Qc+*Lm>W)vlzfGL@^Z;R}gpzJPjN7LgM+=ytUf7G}(@$_y-r`!d zR{U0!azVHuR1|gZf}S{SSl>Mf?v3O3dr`HKoVB3D-;6pz3s1jIUG*McA-qDKWxGq= zZqJ^5bG}EOxTkET79FQDY&ehwazXc~;{_=$1rvQ$gXty8lnPiXw}hrtPpH(V z2_%Cy@lRs*^a&B=<&U&m3{&sXcm4%2X)enrwpw1ZWdx(5{zG9PL*z zu=~NuuIhF!6vk7NkU(38K#iq#VQ zfFN$@4ACq;L6baexeFno=~5ke_rwjSpeUtPe=R^N@uU8p1-C?i-Hj+08~+Qr4v1;~ zGa1EJgNOta8hKbMAzn%@vt1258Z-^u`(htwS3)kG9+4~-0wmEa43GNhE|Kx;Te$HDsPz+@8AF}>#Bj(6E z574{~{4Fo3g@CI>yeJ4lZCHJzPg5tg*pgI;R=*eBCe$rP_rzOF5(|>= zAWOGQp2GdcuCbZX-OP7GKO-7%-hU_>QDt09f zk#9_>{es|;VZ62h-#+h~bVs4$%Z79}`NkFAeO4i=H`IAa`7E^Bh?=2C#rH62$^{%u z5l=JG6#Dx*&X0S0m|WWOIr6I@DSaOhasNKGNKRvxRQ)E|XMV9Ru?-JH6b~d2kYTP- zNM+Ezuf(1#;Z4GQVnAQoNAd~%qnB9>nsKIXJXBuPZTY&)d3}kcWs*V>cCaZ26gY?q z__{^EiJz zvv1~7tkYv^v^sFblUi>a?iN{&&hCaNl zB^#pG@gVPXa5mD__u-w7y){nUyk##ek>)T6-I4vnc-g0h3-8#fuH>JdF)WZ=qG!=DAb#}_phOsqk~6i@;o*W zJc+*sJCO5y_Z*29mhat)^YwYvS;d2_@&O?a)&Egt(x8HbQ_tWe$>;FAAK0NzA9D>l z&3_A2zAG%|sBxUlJzhq`&Id;^#`HPvCx$r_U0e&y$~?PW=opva=5b5qhBDZCHJfC6 zqH|ZQy#L5$H%F?;~ zmItdWs;o9Surr0Ks{IoMm(r*6%{Yd*^vosVbIQvl24`;}&&MtPSkh^_dXt+Mzff5_ zh3mTwe%BCb|9GuU>0c>72!{C#^>%Fg<%p=gkaY68a z+9KVI(AUD(U~Xw{0`{y~6Wu$ZnqY{@k9m9u?fc{P2BDAl4~d$o4vz8co9*u#sLLh{ zoG#AOmOWRg_7@AWggP+`CObV^#=-n^l7`YOozyftV zv@vy0qZQp-6Wl8T#yfp_vpTG|Ba>_HpPg^jjyWZ#J%it_SSL@|+xD6?LQ7XktCDK? zBqYCJt2YgpY6P8W>piGa@Aru6IC z{jj%oORZ3q&O+Q!RjJj@TcpS1UD1Zl)Z*pSvk(&fuZsYF+mS0)pJ#-dpBaGJcIFL3 zcEgxja+c8;tf6MFd0W3S%8?vx zKg<2aLOALh4L%h-3$Q{{4j zbSlcXjkMBM)vLYN-N3r0y(_%{37r~gBi*TpQx`$UvcNDU)$QJ;8SOMh?TA7-ZV@_m=L zrU_LU`vlK%t$Aps*&YKfT_u#u1Mh6OSR6|f%gSzglU#PIL6lBf`Wl3=&psbe3m zZLOzwHTnN*?#kn#{J#HK64|$qWM8v~2xVtJcCsaF#*%DVvhT{y$QorQB}CRNLzc)+ z#unL7>C@}``SUmaxX;YCsr=&Y4#YbX9HS=vfsoj~CI(*1K=azaP0xb;xoUw_54yMc*G6Kx@~nJtosRQo~3EI_r@5mXzb zP<#&t!*shqDCw{oZJDBjLG;A)6y-E?B#SWiG|y^dRmJV{&B#yi*Lo^_ZoJdp{lb3M z-nW$l{OwZ(FM8)|SuqrqtBt3yKB*#@wZavZB=1mF)Dv(J#N7>fv%P>DA#5J*r%z~) zK{d))6vca|ohGJ$`>cJ}6KpF6oLRiE!UoN$P)U5hPhc^lg@Y|w{SNxN;DIUitHD$| zbBYe8Keq6<&#$D%>3rWD+d7cc)Vntz(MB(~p)OeuF;NH-3TF@ExbRLEw=^bKGIBk@HIt(lslZ#Az|V|;ZFF;furro zkD+*bpbe7tDJ1}upgQxC- zWL`MNwWviul;rb>o+15**qEe&^B_0iGJ=Mk zyeDQbGA7OqPLdcg9-Jy)Y;_)6QKJIpQMb9wj2m_X+S{_aN?f|7`O1}Bv5K5#IGdzf zOeQ?rk^T0M3N96-iwd$_%EQE>I}OrlB)zjz**sSwO&LhY5-W(4Dx#eN=@`mo$<1J1 znI$} zSh|x*vt59bxtv#>uz*(XNplia{30&jV0Gb>*_;HzMQLMU?x?Y=(X9)wp`iO&lUfsM zB+%sMfLGD!8G{-lB#;gj3M@))#?@MUOM;YCIdV0Z<;ZNaEhg}nkU}Zz2esQgAz9L6 zYIg!N*FVZ8O<_|!l6xjGb>aRlBZhO+L*++9n^ZCW3O6D#WWu|&L$BJ2r&u?FgS}(@ zq4ln;2wB?YdyYKTC%JufZR+3G25`F>* zrp^0{Y15rx+HMG@U7?;B4KQuMD+GN#!L*tGVA>8xOuP1wX}4T@mfgrQynY)Dv$=3a zsf_*x9YD36aPdB`BdPYzGWnXxlj!B8iM_f5%O8mqd?2SilLY`ncs>{64L=WE_Ut8D& z%g;Ac*RtpoS-;(G$?9vS=Xbqb{=JF3FSEoKSIYA%s{&5y@@rko1&UZV(~o1BAep7` zulq$uDQ~~54=B>Q@d?m{}Cj$hWy$^owrW2>%uPHT_gD2UQ zm3|ltu?u6fT`L`Vv7F6qZ@xRwM*QYOrnk);e7%~CRx@6e^S$?TuFS->qN=BP?HLV_rLw@}_r_2o>xUl=K z^uH1EIlq_1-|$tw%*G_OKwqTVdREAw+Ir`;8Du3_Vq8qE*mUt#gB@{}=8Zl#SFZOZ zV`4uu$!#W9LSkL#+#}>?2W>`%v)?`I>Tfq-4^ODmW#{cEO1kz8OK!_{_ll7%mtA~| z!BqW=yg=vrTVq<+JscokoUjSM*ap~tyjA2day?ZoHiAh~cXeT#+b~7F(zb?h<;iZ>Tw>ugdkF(hc^^w>s-!I8n?>&D((gQOU4)uM`B0zcCo(Hc zY=7^LH$&Zux7rDU_R7mq(HI50K>OuYsKku0U7>@rS`Kb}h=v#}$+8jq>i{~asO7gg zjA-b=J}euD2UskGu|iV)rWGwWOLkv$o!GlhDd139@)BZnB^wZ&l<-I zbqUK+W-($~AOk0r=}{bhfXHt9o#qA{NO+|(0ZDI1xo*Fc-U4&lms^U#bfd+2>PdFJ zRh&ilrX{^TKct?pPrps&cd)tO)As4d1^gJ3A&-f$daJ0Lk7XY_S1pagmujcfG+JCn zD=Fr~Tn1-cNqQe7%%nGZdN|ju*7!QP8o`$=jN$Jf#_;Es#_$L$W4NugF9p;@xo&a+`H7iW|W19AL0o>)XPifl00=Q|;;X*h8&T6D> z436ELtJFhm^Jz@6(xypb^J!U7}w%g_TH0>PWme2aY@Tr74foCKSG?r=jk#>>*!x`W*K8prLA;=j{Ni!rV9wR)_Or zvbCQaH|)%!zPvKOlfxOifBsSaE!QG?LswhM&D56{pO)@BkK!-Z@vK|dZVOpQZ&W1S zGF)3;Y;yiUn6e}Hvz)Dx%se!mzP7ubODff;Cz zia7pR<_@_`bT}r&AjbrS;{Hx!90O`$3K9F^bG#bwKvC=Lc8u;Kh(M)bRyN+7-JQD= zvtHLsAa#pjJhMTi_upK77XXD;Xj^{dZ}YtuT*Fl?6qX#y&qbvlo(waK?0ZZabRHZL zYoN$xl84fqQk&-*?I1f!&rqdS76)UN4SUxBHRG9-~73Sz1G4mYYUIBJq2JHP0#lDV>gt5|ykx(9C z^%?F+0Sc;8GutXD?Yvyl(L5fxo=;889;cRw$j6VZ>n5f{h~^`BlY+1WQfAVki?VcjMakWQF3VGt=Fa z{enF)gT-_uu5n)%zR_nVXyM-}OlB8yQdD_te5ZCb$6DidwjZ`qTV2yz(~x@)A&Eqo zHeNXOUm^x^URLuka!spFm(pZ*-(`CUxVn1XjIlt>O zHp=Ja=d(nZ1c7qHPTQ%byY`DH!<3%CO4%GaUp6F6OXT@5At+X(0M93pxrVkos56s- zv7CsY%VH=AbD>|on*1(X9_;m(P0FMp2I@Ozxs5n=hHsl|VYBw&O1M6;ylK0&k^aja z6;VBF&e%^snx2}(53w`mcI%Vh{nB)bvLqPJG(DIeT-xzpZ$$q@ZpfE;-a{wbscuu7xC_awqfa%Sv7i8L#2VCOvGu4?K!8K%BC7 zgaeBW{a&v|?rY5Q%Qw5RMpsSuZ&>Pis=6CLVU?hbEA#p~JAO9xgL9kZPn@e^FVbm~ z+e}ItPirV+VDbQ|A^%)uS1fD{N17po~#UfTndr*3pj#9+2b``{}l(l4lD}k zK9J~mq z6eMl_pA`bpVbSaCprpJTC1oa!eW(hKLSuGN$Y} zz$ek;07nsK2yqI)*ZeJ3=n#MbXjH}j{yb0<%imu?1n93x8u}g;N-HjTBq+iI9T5^_ zgQOzARQrX3zVU%Vp;i2E+aTzO$2*@91qU4IX#557`0@Zc9QsTgg?Lf(1l)g_m!pHD zPjpe>oLZ=kIr3L1m+;%Y9PbZwN{GS&it(a3sY6{+z4Cj2I1Y%;xln-O`hO^Q%zC7{ mCwTP)zg4l?*hIp%~fxCsmmqs`L+S_Sr@&uzjx;kM{>t6&*PKNe>8zGS3Z z>g7WdW9cTkIxuqRD|CMpBeTmj>v8rdTI(4@*38bgY3WCA$~_iw-OAI#(W8AfVT(;KQfh6)3hI9^e2q)#aD&4a@Q_sz7@;&m=z1=XAB#{C$%qN;PI%V%Zd_cfRaFUANf7Ka4VOzRa zcFq~iu$eo1E*w$5mKVfA{os%9`ck7OP^eMQidQSq318<-2CbA@FL9GNWaXLCFjvpW zD?|ZjxIE#jmg^R79{EbEAurHCAths6k;F)x_Ep@R*zW1`JdNB!s*Wn(!JV+dTMAP+ z5?YfkiE%&*t`yzsRx1(MEKev7G6K3i-p9B9Q__N)VWm+aL-rX!l8 zJeVWPH8=lAnE+u(@+tIA6O=N~0EjRiwyb}$#vSBjV*&!%{Mgn0%^(=))&`~5fA=U? zk(cdeLvKaC4`p*tcf-M$b77^}SKmWJ9H^yVpdsh6{P5`p>13(NLM03I}aIt+(sa`28M@FhGJ=Kk(p*#Yv?G-s?vVQ@cF7B=tK zD>`a|(EK6_iL=JfAzaoYY_1&E&SS)b^4iNowHy97L8|-j0&5!@$kOP|Hy;|s7cL%W z2YQl@pAsNR3!-`g#5gHT=P{{lWmU4An z&;mF9YtpKR7spoKN)o%~(qa0uNl^rrGdTlk$*}O0@|etHTU<1 zevON=u70$eLa_c#nQLNuH1!AEj2=Dn$aBZf%(+$6<-|4Z4(gRNHtjkZD`XbPsj3)h ztOd!scbV~>-eV9bnoX;>Ov8n(QBR=z>V_2&kC*NYD;Sjz!(vsMxPkdp%(+5OywjmXb7^sKK4QSY(!M|7#AG7#QUrqlyKCsL4>2k=% zT*Oh(_%U|k6JNH{)gTzXg5lrxa9^LYIgEX#}!= zE&N()p2iA%*Ae>CKxD6x#9RB71Mf}u!(q^xlGZBg>J!bRp8bkelcpD$480`7NyRTM)gB7}%fMNuv*2gH~dNDkZzaRP5$Pe@dJhuz2k{TZZt&Zq=Mhco=D zj<4ETx@kL$$1kCV3ICUwRNZR9EZ+9<{;Qj70-jPe6{6Urxgl=a>S^;A@^@4ZFa zXB$z%bf@r(SdS+XNwPB3?`;IJ)+MJ|m@~o*nO)B4xTYRrJLH+C&K(FNw}G-3O`5hH z7|Q$U1ujVNSR5x_naSh~2yae3Y8)a_+RJVlN5lkXCBI zj{F2`6rCf*;-$!Re%?pnJsswy zaz4wAAeNxMX9uFSCa`ejRq19II3n@x1oKX!8h0?-`Jhogwx9hboGy+l|N6TP&6Q|7 z=zJejr$hn9L?!l>!L;5=By~xve--NI}=Q&Fq zwn7m0(BT)Zhi)F^=@^50a)lfYDZ5z3;Wj8u|1OhW-F2eV7S2CHKG(456R3a<{?fWi+_`_ChDQM|K<>cWh7l8}4=`8ZR2^R+#A6X5iCu9! z;!4NE2~Q>7Psc@Z%nt3(e{*}#BoKgsDj3Aa$#)g^Vyl6WF|Wv1n@Fy7h(P%!TqTZ% zwcFKm101N4gaM?-ew-S{HSA%zKv{%NAeXHmOJ4A5+=a9*!jB!EVR95kYZw|NeYEmU?-0 z)HY#>$}AH?R9C;Rtij0vZXv{irRF(u4j=hhUjmnq1d;3UH~r4ylysM!>%i6lQ8UOFxx#aECh z3?P#IH8Rt8*@bLhCk(p*#J*X$YYE%jBvNU<1qR$6#E|$8AI*6KR%oL7UUgDtaSa-Y&Bxl}_Bjt6jdDglTI0?qI~~@a z$q?V@co!PNmFV@I@7?LN*MBaCvE&L&EUKU7-%GTQGe%XqnaXX}JW?ORT^=*kf8R)4 z8XG*5qvlr?LWLxX#+W zaURF4b2|oW8Rd;=E0}&%IS#dKUqw|;i-KoUC+d(x7~l`9LM6R6(1W5lhFJ3x01u5epmxtvfWPCs)No2BCTHd7QuF#xhB$YjZ`tIl~UF4i>6U-`0o6xrD;RQ z#|~L?O9`iq;mzS=@ivDnGUb5FEzTUxHI=#OD&SYt2+Z&z-j2_z?bYH@#AVImVVg5T z9BXn_;b({Fm2bi(sKuR(s8v{M#ZAJ7I)P+C^C!d0c9mTvHd8`AW|YRz=V0>5VB+y8FLP8 zHI8di7$p+#%ak+rkEow#7{LI+r8d*_PRWRjz{_tCyDAHiW1t5vT{y-{!SyqVB^iC* z%?vfK%$TS0tIuIKNjD-V=x5-!*}%>1(tFW}+7`)PxQ9Oa4vfB__kBi&%R&cjj|hCM z3CJ!QE{4&SZ2|?2LlB>!;4KA);oR#$u%$Fwu@W|-dq%@+XurD; zlDNY-KZcLh{dNoCPp1QJNd&w{x+Gucvwda@#QVY|Fr0L&-P@EJI?18fXwpdN#JL-d zhG8Q~LHi+qhDLR)TfqLh&Kj|Sfs)JS8fzQBYsTYoBjuznUY_a)Hv;J_`zv?jBm%se zPzeaXUV_5lWA^wIZ%8+@A+uj1D%Utso*kp6Kf18adfE#{(sW037lD2cjt)wzkR^QO zECtelFRB#|_oY26#N||TM4hdq(Xp*?{98O21zK9Hj0iE|{*iB-c8A#m(yMUdH?Q5- zj0P=dS|UF4L1HNRBbD6pQp~bCpNCg`8dqc_#aEn5>&V?>5lktCyJ%Hh;vt^If8qDpqGOmZ?Vd@ zk{BqNlJ4d+VLyc1C~`4DI~sANg^!l`!I$0^VM%6|8S>1y9bN5>N-joyS+EjrbQ?cA(`&Fh5d9o3#{a}1{_1%av`H*&DoDLMqy^_+Bu?V2YC{x?O zO1td41>}nlz)$4GRT}c)g%GY(jou;%!tKKBZ;dB!8Qx@RZ8Di^3SPdYh}|e0 z*O)nc;t*b8V^EXqvSp@V=_v)fF+(nigtQ(xFK{YTfW&Uw*XqNoX!9;Zvd}&ejy<3R z)Ul?$b5weq-QpZJsCo-`Py$d4lFmxfv3x`H3L$e(C_;u?Vo?QJSi7xClVQ1dBXAL8 za3G$sG3I?lmDOil?GT3SXoBMnyV|cBH_D#>WH#r`T`h>LHBg$+=;ni;1PEp6r6ULb zi<=EBvA#F$ zQ+Tub(Q1syJBMW`T|y`FylG1P9Yn_=(S4-(sI#CDN&VO1XknD|cm;|(@iPKl*>|ou zYD-jsmICLCzq+Sqpcrb z%xuGWbe$iqlnDk$)>XlhAUV@rD6Or}C4U(=&siCz8zXVf?wdF^#S9j8B$nzhldY3l(mqBm~=L16^Zejm}vzoh7TR4 z%ocIiK&`aN?ueKZozeg8L5AA-k^qgoTiuRitqOHqZ}0v6wU8+|)N~qDTS;cQd z8J0M?aC;Zx`=G(gDN}2#Kk#f$R7NppNBrWOxKo^U84nd)C0)8wUtyhNB2*n9DECe6J*iJ^*QyV0U^>|V9<9IT3bmN84=o%u#S@&Xniz;G}^U}7(m>*#*#w=Mh! zZ;K>{X54pJK~^r+qb=P_rq)D;68d1l_ty%9bHWR{*OyVtpW<%x;8-)FEgBn~T7cMm z%32!=8Q#@ceb*Ey5k^F;Pjug8O&zDc)p1GVQbLU>f|R@mf`Y2!ThI9pv*>>U(Iv`z}PET#ZkvglR}7vINqZ70qeIM6_^% zqC8aDCp`&D}?x9(A&16Bqd%(EP4ezbDlBHjRBHbvXeUxJ) z@WPE+QL&rh1`v;8l*B}YTTcE2c|@6Kj3J}2UN&>SPeWN|J><5D`QIx5)0j=)fnocY8+dsQZ-?o z*>Ke+G_FplL3FgWXiT*kBgw8_iY^B1CfBRbuuWz`F8!e*5Tw%h!poJ!Mnm#ARMu{y6rCY2_b90N3-21O@0F zcWC6q_!YvYASdAeFboCnzeW^TS+(#$J|mNg#(=kF`ce0c*7pK zURpYD>Auyfd1~-t)%1|>vU$q@JaPfV@Oe|MQijrlAqqoR5v;a=(prJ{1si^vomwjw z$7~ybJAATN2GNArz_Chc8f82p^Z?gDGzsSUG?k;6S40PFH;4x#3GHOQexI;)?75;{ zfK@yHU}&l_X%eb3cM#=AOK{qcxOllZ1P ze=l(j{89IEYeNmsv@7vcK6l6{>H6j7X{r8mNNFPu0;D)l)!v`a?j-ozb7niX8T-D# z^r;EE2m~+Zp+N11GmDj1=%-zqNzUonpIN4&VKJ^!YIS!DTB1ovW{@GYROI9Yp;X!l z^zub#Ecccw-*-SJ?!hN1n=9Slg21;h-yZd=`dp}=kV04U?{RcMWy?nx3PJ}c2%*jS zpK;XG)!7AP_dgi^8-xHr0a#J7^96d(5sh!?Fv*9+rKB9}c}y#-wH|!QHP`n`VhMK> zF2#uKzU~bs@MwBxyq*awEuNg?K9yAS;k_DCeY2!0Q9)meO3r9{S<4pFjm!de0;TgM zqtH6nJe^+S2yqwTqN;ULgpP6d>iT=hgl+2PrV#UM3lwrio2(9+i_2+i=$VBy$XJrW z6!HW$;6|P7k`f7@6bW20*08lWTg;S+AMDeN^L+Q0fmg>^zqHLTpG%2pH6kd=QoIYs zi|N#jRiHz~6-^6uA3}@Tt>F9kigQy#u{}c=8Gsk_TK#jpJ6qy;dN2*atCaJ3Be?e! zBl2B639E7^8XV}B!)AN0ni4T7ouF!=l}o! literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/Protection/protectstructurewithpassword.xlsx b/ClosedXML_Tests/Resource/Other/Protection/protectstructurewithpassword.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9c79f85422cd63d54ab4ca1fa796c93c3c73f16a GIT binary patch literal 9603 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/StyleReferenceFiles/ConditionalFormattingOrder/ConditionalFormattingOrder.xlsx b/ClosedXML_Tests/Resource/Other/StyleReferenceFiles/ConditionalFormattingOrder/ConditionalFormattingOrder.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..84c186d58d1f7ed01b4d38d6f8abc4cdef95e380 GIT binary patch literal 8915 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/StyleReferenceFiles/ConditionalFormattingOrder/inputfile.xlsx b/ClosedXML_Tests/Resource/Other/StyleReferenceFiles/ConditionalFormattingOrder/inputfile.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..28a7fcd1e32318ffea14791ed5ad7b759c6eda67 GIT binary patch literal 8448 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 Vf`;&*pWCN6fE7d_N2mSy^gqSGN)P}5 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/StyleReferenceFiles/MergedCellsBorder/inputfile.xlsx b/ClosedXML_Tests/Resource/Other/StyleReferenceFiles/MergedCellsBorder/inputfile.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..721e67c0b0caaef86baa9a85c51a7880c10ae7b9 GIT binary patch literal 10095 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 H{_DR0bB;}u literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/StyleReferenceFiles/RowAndColumnStyles/inputfile.xlsx b/ClosedXML_Tests/Resource/Other/StyleReferenceFiles/RowAndColumnStyles/inputfile.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..584241e3b38549f1077bb41b6a72ff2a41343efc GIT binary patch literal 21635 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/StyleReferenceFiles/TransparentBackgroundFill/TransparentBackgroundFill.xlsx b/ClosedXML_Tests/Resource/Other/StyleReferenceFiles/TransparentBackgroundFill/TransparentBackgroundFill.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8e76ffd761154e8e3daa6cf58f12ae2768ab3841 GIT binary patch literal 9138 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Other/StyleReferenceFiles/TransparentBackgroundFill/inputfile.xlsx b/ClosedXML_Tests/Resource/Other/StyleReferenceFiles/TransparentBackgroundFill/inputfile.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6d6f1a88e2e1bf6f72f53620dece3ec023e0fada GIT binary patch literal 9334 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 F^gj@lSa1LU literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/AllShapes.xlsx b/ClosedXML_Tests/Resource/TryToLoad/AllShapes.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2c5b324abb445640f3c623caa162d16d73cc8b56 GIT binary patch literal 18773 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

a_<>D9E>3gCB=v$Ip_`r_6ijPjjB&B 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 O{|{ literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/CellWithStringDataType.xlsx b/ClosedXML_Tests/Resource/TryToLoad/CellWithStringDataType.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..eeb2e1800704fe93f630b02d1dec4de758de7221 GIT binary patch literal 11437 zcmeHt1y@|z(stvnfe_r?HMqOG27}IOuEB!4dvJHxM&8ccJ9lO>^L>Bd z-rZ}R(`TKo>Mix`s$EYh%0NJ30H6V|004j(AoMnH%n=L#fP?}7UIAdibwuoJolR_= z->Z7qn>gt*xZ7A0jg37Yp-ZB+BK@XL+5t@DfDM*2$@(PPivW_|Cq9Yy57tIrz?7 zL15A>mWaA2@fz8&3JfEE{b^ah8O|S0gJ)Pw3`4J=J1sZf0u)uAN)>BAf375$2&q_|sl6uZpf$X5f0uDU^kA@H4P!f3dOv_;WGCD~(g zV2fBoX@#taXbHXW{+8(><|%I|1-m;H`{RdUU$+Rkm9SJ;e=;xu=eNIN4L05J{-V2# z^%7;yMrMS$uQHRNTT%Xa?!bKM8>{6C=aV>;EA7UyRE?4Lve$OumZ=vG-K+o5&XMz*Z7Ax3EQ4vV~Zcpo8p$uK2BL%Zw@eH|ci!0}q zUclfw@VlMC1kA~IQshs_nV&@kM=iHm*{sK~E+@1wdX|qyf55@iXU1Jr8$Se$6GP@W`DN7oAmMMWz3~-tlu+Q9EdH|GxaoiUUK7pf}ba z6TtY_@;jLuIGPx%I6GR{nmPU4F}%lxq#>D6p~hR+@P%(&7nN{h$!gx5gGZf+xN+f2 z(%5{_&RlYb#0p1Xj3vbuLKF48f7!Ha(-Y_+A|Q%aFyC^Rk_MYE>f9XdPd}cSXu{}5 zhQUG)jP)XFs{aU+7Am$(g3ZOEfF-RYAnZI{09QGvJ2>I+$)m`8a19ybU^pDLLjA`goAIdXn$@_blkuTmzB>k;%~t{QvTrTe%Dfs{j%8>G;@~BGhTTOER)Qr@4;Gi~ zbURCFh=_#*2?x~P-GUcx%!EMgcd;a$o~4MMS$BwqV*UtU7k2He!Jx#fyJ=oqOC|OXTcb2+menLk6aIo-vrT^gkVC;Ez1oloK zWHlPm#!qz?!;vIiHb-~(fFShbvX!CfD{ptD>RHZ7;&66DrK<_pR|-+tOu_VgtMv9@ z2I9Tw*PmpWk4%Jzj-`(;#Cul(DQSIm+U2ID8Rx8kBcOiM4Eb2iq#pHKMhV92uf;p^g>S^CZNIP z`YZF$l;cwnD^bE$x(yT*%b+&Y0-Y3&;uv?6YOTq9gpAZ~S0b1(Mj}^-x=!^7_{AAf zP@-7vLMH<8M4YJO9-V(l?_dr|$HyPjaKGeQpyu5qg_OiBHl#KzA zn`er{_j0s0M+q|~@N(8*M~K-m2X(T&u8V^nW*f&>+a*#t!r42Man*fK)eQC-84B6o z4eT%p9&c>~&Qz=s+9A_TLXedjTn~5E$@v)4u*^JQ>riM9(7C=+D9XbNQ`-L=L>9G&ocbPEh-FN=9?3q1kQE-Rv6Ijhs zu0My+dqPC#+kmSvw~MvzkK1wA-e#YUQ_fuU+-_^peqbnvLFe&Gm*VBUB;wDBbeRs0 z#ho19K<6m%#eL0A=p;|RAViP6rmVpM>ufI)fP{qpu2n&89L^rm$$Mc+_5+InUjo$* z`e?jqQ%pl|mzLndl(|~AiZx}drpQ@zii6ZUfXs;*n++27}|jN37R&CvBGkKx)rYynkI>0WxiR-i6LE^#bR zO9sg)A_vhtF3Ad0R%JsbFkv?p@yjo?E0{J&EW_+R5jzgYfo6CNi zQK^aT_i5M}x_xxW_LH_QVV@JN*FO`RaHq6nc2g(iEuzD+;09mgSnZ~jL}y^kLQ_-`S-!|uEu*P%+hNk$;6>%H`gWPj z0s`8N_vHt$Akb5UZ)@vtWZ!sU#mZ{!G|StXIY`NtkOM;Q;6=8_nm6V6OVUbAk(b>H z>XSZ)soLZhfI(AvPEx`X?HBve@>$n1t_ZBs5=Yb?j|c;1+)zXJs^BYu`Iq9e)F;8b zx6=%(0W0Bazz?R-77$uK1IPrDZzWsigE|Ko7L6y%%BSvGW z&iRXKYSxD_cc(YRxOvViH?3M+^Gb=U`(!YZp!Yj_A$z^w4f#E8w0fcLA>BnXnM$V_ z2P$ZRcOfn_y8wFZ$Z;m?1VDcL?-5S|#Ez#AC;`~V3jiSfJK}Nnur~QE)H%}8v075c z^CLXsf$bzvS*XsSAa=EggNE0owu1IjvtB@(>5+8Abwiwu(#;8qY_&$LukKu_sb5%h zUTzD#`gFsyyXR;;a8p7m;WICSE0yH?0^ELdsr5OYuP*?8*iEmPicQzRsW#^1Yp~<) zih4Znd|v!OcOP(aS;cGDK2ap)R?P8ZK$0MKSAn$Wl_LL7|f#Ixz$k_wrGzRw~rRsbgs=m#=5BR1;qi zPA+4abnGt1KqxmQ_1o)qpphp!R4H+GDUmLZi)*3^DpoU%X=?g1dBmJN>AawmS)Qh$ zk(mEk`8dD=x6OIUoyccvv6=OFjqV_Xb}QlIM7_TtgEbs7!bt)<7M5{rJpup5Y;9TD z#Dt_m5bd&!^Sgj`E+A*@#%9m}Y->``P7Kr6O5p1sd{yfg!2oX)|R=onVWUP7+c>+S`m< zrId!E`!(7@jwQrDnryClDTx_2hjR>%Ahtb#=ljb?TU7nViRF{@hjABYgpcqd0|H@O zDB|4sT%6w}KUbm~^L-JP?8XQ_Df*_U9&8IU1lK2g%eu}$gR9dSG4y(skw(Y6rPBKR zDX+RS%jEU$)m)24ty#ubbr~|`t?dIdVNhtCDVKAGb(qquA7j zX)9r03OpGWa)XAousjf~)@+Q8Wy5HAV;#f|4F=jozc<}tZKr#Ag*iK&VkO!LosCR- z{O}*nN8dFsc+4`;a+9)sHjdfxkqbG*M6d!_3f%>D{@bSZLOgYqoYI zCn-YPs`5ZoP5N4ewS$jqwCz-|gZ1wY$GY zkZ8m>?pxPUluQ+R8RI3i4?Uky3fQS18F-`H;K#ndoiI8ZbSJqsu+|RPMsY9lkVvt}MUgeo35hL&XR7c+=--w+dbUoU*Hl^2W1al%4Vk%_1H&=8s9 z2KuTJpA{@J4Y}MBnzF!6$b{pIS|y9dT;sxT$kth=B06lHiGux27h|J}*J3vxDt&VW zhqjJUH`R=P9zF6^*4OE3=ekYy>ii)K%1-oX?p1E%IZD`zx20A^^8gZEI>&y*mG5rIw1Uih{v(^7`sJHe|Z` zvubS^Me_SDvkAB|skI$8_PYk}K?|z*?tviwj68;BP@6KuTOtN|k zAF$o%0w8+c1>!d`ZcEOWpm_NrU01!L57Tzc;Gi%x@2};UQ zA^-qy{+5mSBM*_OKIE9rgt6@Q`6b7I5CS~%xGLUaLn>X2C$k_r^~5;l6NP^<*^-0X zvE7x#1NH#nHHn~mMmLK3p35lTZGdwh7K&E5x~gRFW!Ux&9>N6g2J;ZstHZ*?-rGHUWuM>6L8){Rg%5sE{ zpBQe1Z+6D;*{ND~hW@=@j&&?mOpuoWV1jOwGyJUz4QW4x`2lu2X%sMszFZ)C^J*RpWhjc3dm|DdWWXvRUI^jzox$77 ziYbiFq~|q^z+SM`1>{w@1*^evJ6gExgy+xR-e2>Se$HS(M(UYGIcNpPU)sqk zXE>%-Dj>%6{uJECU?Ma~Nf7OvafL+i%`*r_2Sr8|{aq3wcf7qI&BRGp*vx$<`nZk1 zYGRJ(yDx&4D&tkHmIFuqyn;kF5{0*U((MVC7d$nj7ePg0hOeefH<#6F^0!Yz-SpJw z{l7BY1}sCY5du5h1>8Na(?q5YeQH<07MFbVUliL8)H_ud8i^1dVnd;Z$fft+?Lr@@ ztNH{I(CY0e-HSUxvHuuG-zzJoGRv_TZL*|r9rBTwsTPEyE^ahxFZOk5)K`RRHp$S0 z!jeY)+_4iXq(f%Aaj^Sl>2nX?3(8*!NBfBmqg&AVK@)^PG!T_yY-gnCXlL)lXk_PT z^6$!k|1l__ZOL0j*J@f2!w2gTMPwyDRjTC>Jr3iM3idUm2FB`#fn$zFsSl|W%RZ%; z`$3E(ZSW5$(p8G3BX%i|q;_%3>^+8(M5#_E15LZ5-Cje6@+*NH9%>W>C@B&-32I5n zHQiqP%eRyS%<2iLDH`NtEAWvG$t$g|WH1M$yHs?k$2nj`6ie7*Rm0qj%fqSIFJR#f zz>O1N3DlcWUkhAE(h$Foz#fmOVy5p1m(>)~5qfWf*;;2z(GYj=Da#E!wSeg(xU>}& z3g^>MT@HeimC#4T6fs*3crWcGd`q)xn1-XmfrjoLLo_;9Zrr`>sbm<1ESK^Jj|Efm zPMJ+vapj=OMET{n8ZE0Q!@93-sfkWXd8}48g^x##xYz2~vEP(9nKZwm8i*LT6e zrbA}H5O3awjvz?BiD>50&u8u`ox+~2zf46iLa|Ty$Yp%1Q38zedkh(i-kH{Iv~t_F zWDAzTI{D%;_aL&D(#W`XT+L+>wM;I&d*_QY<##=9n{2*HX$;94{vi6cKOz$br3k1O z-rL8&>DyoAjZvl4y-+%P@#%r1#y3|p{keUk+l*A;N9M(H=tnd{6pXjv77cPCAzFpZ z{$nG3J0iFMSM8SU?wNUV(}@h{rvap@a_#J}rH|tiZzJ1odbK29KuiAjGxebe;(7~+ zbi9KH`Ky2VDti!p;B4ZkV&d%llSg3u<(Zkm(8BgeeZ=+^GwO4kHJSj7r)WnmI!t2@ zbb>lmH*q?fjel(^ry%mXA7$xf2W1+1b{1TnpUedD+z|F_q6`_8K`RomN~u%j*CQT4Gc=2oGh5Uw&bNBMjH*A+)qlO<}`wMs7st2MjFHWnyVjNnS0UFQ_V@pahXJ0$bz zmC0FOmAon4c1#g9@0Bu5QH6ds_&!yee@}d%MbZOSuS$n{)}}u}8SwV|o809_`iEIa zA>PQ1XV3YfXrTsO73KXTc&K;LF~`F(9xyiIPhc{^uy8l*NV0U33A5uO3~*L`a_VxiF=hwbC`3(`0QHtwGF)Q^vO@(p1ua*3 z*KQ`Xv~*bn+3Ukn+JY9L&aw6C@ii7q^Dw53C~4iJ z3t1dx6Bg-tLD)^hZ_DPgMgdWVtm+gK)|6{oSg#yqA_WyGhpbg>Qtw2T2Zb}ffmGqpDZWWh@IEO~tPK{iM z&p$MD30O_gM|-4eMC!W%u% zS>4|XUyCL!?%R&_KpLjWule1uH;WrPCnq&H`)_I*7>|y<;*^mS}<24(=(*L3P28 zTn@wTDmC6+El*z>d58roL+eKzKh`_ieC0#AWIRW7=XA)Kk$`MV0}VDZp||8tqmFM# zndP)>{UKYxxxi;rIE;jGrD=G+`0Et%k*?&}h^%_`AhJ1R$OStzMPSjEd_B==e# z@Hdw}l=*68#{<>Qcj-dZuXT)5lTOe^cR zafzg(`S@}_0$z?rbyOi%RmqitwI68#gz1CU?c-?HX|5PfnKSQg=670U7FXeKLbzS=;+^la(4q67*s^kZ*K7Hm z&N_PCHg=fxGjS(y;l>ThG1x8V@`G^(bCbVuMANFd{B6OLfQ8>Y0%3@IVkQops~^eJ zf2z2^!0AE6@;{ec{%#h(-~XWiQ&Hxx3jSIM_PgNEdnpKee<}<6Rq(I1F@F}E01=-5 z?@F0p_54~d@rNcT5T*J{^~A5jzq0Lr2t$HSc_87xaqqus_?4snLjx+}fByde$5{WW z@K?(B4~6KU>^P`PzY@T|D)=>@{)d8}Ec?$f{U^KrQxxO3GJ}6U;{Fr`0}z3(S$Mw= z=8psKuO0YnsQy#O?+uR#0Qg(r{;T+}vCHqm0Dv^fAc8&=ATxHL{`vHO8c-b5 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/CommentAndButton.xlsx b/ClosedXML_Tests/Resource/TryToLoad/CommentAndButton.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3c662eabe9f57adca0f85ea95b6914bddcdfc45e GIT binary patch literal 11802 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 IG(TSbA7ZFnm;e9( literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/CopyRowContents.xlsx b/ClosedXML_Tests/Resource/TryToLoad/CopyRowContents.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ce9e7b13faabef35d101f8a94eca938c42acab28 GIT binary patch literal 11582 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 A82|tP literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/Date1904System.xlsx b/ClosedXML_Tests/Resource/TryToLoad/Date1904System.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8a7da48bc5863f47086526cf669a73f357e2f938 GIT binary patch literal 9731 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
B2=+_tu22wbh1(1@WKcu1Y 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 z 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%0D(8T&>_l3j3smZa7~P8 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

=^-j_|5P7oR)Dh}ZEfSS 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�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 z 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

|Z*7~B#k$dKeCF@kQc*=(_3~HK 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/ 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%0Dlw`TY=5xSR7&FJ;>3Sjre0{DPswiPu51op-pI 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�T(hb;DG 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

-I=~NgYpjr=!WGn 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/DuplicateImageNames.xlsx b/ClosedXML_Tests/Resource/TryToLoad/DuplicateImageNames.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..29df50b680d3aa41206a0112ce91100e2a2f098d GIT binary patch literal 63764 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

ptSnKnn}{KUVqlDj=+lQPUSy5V-Ix`28Ra0_RG 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/EmptyNumberFormatId.xlsx b/ClosedXML_Tests/Resource/TryToLoad/EmptyNumberFormatId.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..80ba48cd64a15d65c2801f986c200bd3bdf5514e GIT binary patch literal 8000 zcmeHMgW>^1Z3&g^rpIWzY;=RWtNs)UA43cv(l0{{RZz(fIuFaiYtAVLEG2m#nA z=8k5n&W?{=xJ@2EzU^smN1ua^!kPs@{^NgpOOKauM1b%@cF@l0@MfvOv#NMOC8qM) zhvgm|kaN8yzNqwbA2=&ODE~PW!gJI@*b{X5D)7NnQ%B zYk;S{cFw6iA!fSb;VmJO@Cr=C1gu6yUPr9^3ycep9dDNsY6d>dt@fc^+6dkn7wQ@S@AZN9Aa@Z#j`v)K?ii-3oU{1cY%+fn7ovXD8S=zKc zszpl_0Ta%s`r^W8wd}@XrJMYG#>I+n;?eDhu(bJXGk@4;EndKaaoHv^QW22`F4eG3 zipn7d*_Bm|Z>mEzYoIh4?Ku`sKF^#o_NUv63k4{&q4>fI9}+fbZl;g3^(4`W^HO_- z?Jt!H#)FNXi@bvcRER93#9|~Zq!`C6l2NS3g=4;4U{ni8D?-DL$wtNL*HLDSylTD< ztJbD-?eAh!@)+|k0B$F6d2+{W=W@xJjq^X?+b})-LK;wFG}oxvsa8|B6d0+zn?P+` zCMXkH5F)1EU7~kEy`xC@l;yS28qQqz7LXp5j(%%7Gx6lZ_a-ASjQC!on(A4&&_ZTc(5ntVFS0A#NNN6E}*JtIv@FLr;$4;a`&|3 zcCj*XwlG(Bb+&eRYPM{vxRdt2e7~;D^7J5o)jjehGN0e1LhZpP1ISA_y^>&lNSe>H{EcbVrg8Wj3)5D(^TI`J! z9Shm!*|24kHn3zS+0qiP2TPgd(P7(KNASD3YbH^rfp}BcpO(J z3UcVG^`y%23oG+zKv=k#MSmhvz4bn;&2*<2K=>R}P7D#& zd}ea8*KY#J@X~Rfbq?tsg~t}&dsETyED~GW`sK>|Mvb~Y*87j`eMuf!B{LC(o3Srk z9%BY7A2u(%3sgLQvjPeN42H-?V(+Z9p$T`ZTefzPTY{C%ynx?>li| zSaPUD$ty!&M}pjU`OZh}>^_bF+7R4scZ*%#zi?YHP?y=?@TyR=X$=atv3k35#n6C;Q5`5pvdu4jW=vMD1SJ1(()&2Da@ zsn*Xh0RR{k06_A``*5|gu(#m;e&qQEvrQenD1_afG9P5Rev4QV<#D}gJ=<;NqAn?iJ^Eayb`@` zmU(46Z}zEJW4OC?u-Rsy-y08AM09YM;dTzy zm3c%v0VYs-6!|^$gp0>|Lh{?`Py)f-XvKn60la2ZnFOXV>d%pM6P=S*Q?YEh+9kV5 zJNQ&JGhRVZn}^!To2LE56{YV?U6b?B0P^%QP^OrNLwlsr*^yGxa8~9a+Ef`;PnQJH z^}$443)RBTfU|>%#7OMv4*9C2=0Kczt9V};Q3zbWdRC>QxL6`n%*TCycMaZYq(Uol z&+F7>uFl!wy@3Q=xz6XTQ#-)#q~Tzdd%n&0i`%;+YvHLqZvXS8ZpXH^ei2wbcK3l} zX0zw{$Fn-4%e`f@s1rz}>^)z3)3+J6r|%o!rW9ErVzhaVmOL;*9!^#CR<5!O2HwD_ zr10s-26myl?$_AO&cGQ7m7BOqIMt0z1_?xz`f}~ zlFg_$4^)JqpOCx6YMZ)H%D&I?dXgiZMF}Z?{E^Q+yu!lO1Dj{5QKg4%*^WJ3sB4YE z6dxW7gGsW(%3>+@E31iuHK;2-v~9Uk)??P2dxL!k07$N~}o1=oGhS21bU9eWLZ^M1TlCAlI(83SB>HX{XF>!TII zV^Hl=oJS=R5kEPe%@eE3qkz z433Y-J+SijNTOa0yY8ZmeA|9!|7^f5dxUlFHYAFzb(ECcc+2#l zF4n4q3W)ofAzRk{Hm5Eb+5I*D#3D_ysceAFMoIe{c+e*;#8Jy84WL#dd@16sx;s;O zf0^=7gQd3~sL&9lJo2HYc-&gj$3{0#XIGuV7TJ7!V%>&RrfOc;2>R+|AzgaZ((M0I2Atwa>x@dZI^l0-I#AKczd5^{>Yyg8hhwrX1 zbriqP;=HWR3LCjdS1#v*qARaJctm@ll){Yrr`@SZagsb>q+SgsboVv$6spcyUEGtG zX$n2#Y_zx{Te?v&S9jcNFRVk33V8#3%B#(B>+#UD(nzKi)REO`dYiSokKW@yaM-G0Y2vc1nEC4NWh?sGWK zamJ(BssbBI@O}O$@VM#?uUp?8>M4PtT^P(wzy_5ua*s)eV>UCKNVm!cb3BTRuk~qL@@Ot!3CmL)-$`z6)MgX- z3Tc_x`|4e@qs`Icu!W+`$q-rWe>`ddzo!)6MDg4@W}a3HAFEf3L)FB!Ck}<=!O?SB<Q{*d!XXz#=x1bog>sf*>Y@adEE;<`EkCPSvsL>v5f@U9 zO7YTG(B}sc^FYyUaQQ0yNDu=55}pL$FMwkPc~q?Y?G%l zAzxD#_dx~4R;uJ`)y{mr5b%zQq#Y;Vl?KeYbfeEn<9Stl5#NKVYr-5rr6LpdshA?> z+|+)`af`)ziZFw@{I;L`691m=Q4p4n3WZ}G86Rysd@NkVU(A|6N#UaTi z;r?y(tyPNj(2qj#_6_jGphUd3K6YW_5IGR^iZWW<+O39IVz)J%jHbT9O3+{rI(w35 zJKA_Dqx7s0RR=@UJI-mak|Nre-F>qjP-L#og3sN)u@n~;$0w9<5M2$>;`3rWOUn1T zOVTsjZxy~9okZ5my*gDsz%~0OGmF!Q3(g!!yi=iQAx-<@tGRPf3#bC8gAqZ;(v=yU z9F(!J3*~&{#M^*pNYBX&Qan%bKfPT5fBy{^Xz$@Y`+<1vfDxd zURjuPsa2O-w6v)qXzuSSQ?CvRUDZvq#!wW^S>+-G62bTe_-|-59YJKp#sRzq+&&4 zmK=#$iXWJDv9hpmbwN^nu%91KZV=m=xTr$F500-rxlTL-GYC_rq^zgUY zDq;$u0=g2Ar^aiYOJAGL4AY`ZQD`KfmEh70+bY(|W=!~|YF*Zdx(#Eh)VM~RJ$^ZZ zFjE?9^m3CtZ}#Vi*wi|ZtIoCSN`rO82|^Nh{BKPzYspHttm4}+SW-XOAyB3&Wx90v z-`qq?Acj}1Dq45G!{5G$g;BC#J!vD|dBCzfWyGP-5nbEpD#i4|#lPjN4u2HIj>3wd zGH(y+X0TX0E_+Lyz?#k)hF~L+`&6fIgL3T+8Aw3ys%@ahQdm9p?J2s(6mnFR_hQO; z31C0v%7O&hC@;cOpt0lYm9B~-ZL2^b@#tXU`Apl=J9B3+C7$ljgbNXPSMIwg&oMjd z)h{+)5~1g0dZ!vqXl46|Qmcu>Yojl6PUs{wYNS5kFlWQ!HWvcb%i45zwZQfPxrzcKqyJHtR&tV1J%;OyJ z!w_@Vn#m;1-H230RwXLdCu0f3Pvk}hGaNeKlB)@E8a|qQ|H8OA1YZYP+htj8t|U5N zBaD7!^+BQu$p=VOH6js4h14vN-J_ASg`Erc&w26ow=@5VZ^*}l+)C8$D|I1TPu$Be zkVl&P4WbXO+zgwV8wA+!YBt0zAfNx?JT-fx!NYe-+-Q!WUOR)m?k57*m(WO#IyhcM z5~F*Q*zE{mI1U~RqG6kEmC{1xFi40u*Efo{aIZgiA!!he@8irQy}NSC%1jxSo6jJ9 z*f18#Z!-jP2S8 zT_rF2+1e2MoCAkDmLK80lk-S-e*FaYWNraQ@hk^0D`I8!N(EwBacC1!sh+TQi7r^rk% z)7ttfGvb0!GW&+joeJXN86V!gL90p!`&wvtPm>y6R8U{LrXlqm?(W`A<~DN5cxPRm zoh(vnaUMz|qiD-CK#Egcry9TXqJ&}zmDLS0(ZJ=5>0T|O`JM*6BHdTuK19a?L~D-d zZhzr8;qoZSgpDTr=^`9~W6D|P=Dj{nPX_^0nB@%L3aL3p7%@?XOGP9|q#2_=<0 zB;=cb8vcO_GXyo!xlGivZ7ei|8dOiv2^ zPHtH2x15t?ok|wFh}VFszK(hOPQ|`Z65c{s{|C=h#^rwM9V3g0aJt&v{?(0{*-@~v$szCGctF^QtX z-;C}#8M2W8 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/EmptyTable.xlsx b/ClosedXML_Tests/Resource/TryToLoad/EmptyTable.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e9023765fcf79819de6030cae7e0d95605433d5d GIT binary patch literal 12774 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/EscapedApostrophe.xlsx b/ClosedXML_Tests/Resource/TryToLoad/EscapedApostrophe.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..29d15ffd0fb3f9c45d3e695e5bd0d6d59a9302b5 GIT binary patch literal 17852 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

atM%fsl?i`O{MJpaMW+?$DP%?YZ&6Pj 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 SxQLFx|F*!8Hg!RI^nU;g=-=c3 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/FileWithButton.xlsm b/ClosedXML_Tests/Resource/TryToLoad/FileWithButton.xlsm new file mode 100644 index 0000000000000000000000000000000000000000..da6cfdeaed43fbd427e4a9f48338e2903bc38919 GIT binary patch literal 11795 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 T{m5?txS+3Q&<0T8r@sFKOk3MC literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/FileWithDefaultStyleNameNotInEnglish.xlsx b/ClosedXML_Tests/Resource/TryToLoad/FileWithDefaultStyleNameNotInEnglish.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e94bc6a54999c7a669c153ae8b1f38277aa524c7 GIT binary patch literal 9698 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 a@jpU}h6)0d!9VLu7yxUi5!loG9Q_Z5W}`p= literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/FileWithMismatchSheetIdAndRelId.xlsx b/ClosedXML_Tests/Resource/TryToLoad/FileWithMismatchSheetIdAndRelId.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..23c9a8850c01d8ffec0b67c40fc518121105d9d2 GIT binary patch literal 9045 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/HorizontalAlignment.xlsx b/ClosedXML_Tests/Resource/TryToLoad/HorizontalAlignment.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..319da4355c2719bc718c98da09b7224d49cc30fd GIT binary patch literal 12100 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 z zxL@UJy$FMkHeIi&8I@1K)cVPY?nRGhrIxJlKD%%H%wm)IrRa8*>EW^A*_zBmVruhDJ(NFIetgv0-~jyyvus#<-)SaC5~Y#L&y? zVpq()#x=8*HFY*EEHkp5t=T?OOpq*IWN!5qEbA`8VPo1hT6oQnSqjJ4#t#!~bc`qL z(+RCv8FdqBJ@q+!SjP9)o_lN2HRG{6NnXt`dF!;>X16Ml?~lLn7DhYXWF)QA@1w|b z9(vrPgX}=)Zh_lnl}F!ZK*5PzA-4hC9r=&Gu6! zBj0r2J!2mCDB&Hw2*Jd?-F@Xv*eZ*RcCoc2#izNWpA&gQ6Y1ic6`EBHpDELtlhtB5 z8Lhw8n&{#;eoEIGlZGQyXwU4~o{|ZP;vqFbtrQ)FQBzd zbsXtZhw7E2!I5UqIcE~nVQK?^-!*82srbui(!>1I5XRy5SHtyrSGTZ^JRSPw3m%R{ zyaUvPOO_hzq*KC-zR`0sgjaQWafXv~!r;S6v0&2vS z3JW=xcgK5Z-|9`eX`N>b`)ysbNjvg+Y{`QTEJ;Ay0|{d%JBiHAIzMEpWP$H$cWtwx zi-{;G;6kJD2^nR1c`1P=E8^A@UUK*rbH@cF0pO&z3yhx?#Pu5dP}#iJ-Sudq)%6I- z=`+36p!>7!T&kBOThE9eI>?1|-=t97VR4XIhz*4Xe4;@}z(gPe;GzHZg>T0DrNUtrwgNo644 z=f#?-fEiG`lzJAnNOo7W5z+AU9V5+8(kp0>xX0nHu;`z+vUA=L%KQ%>E?@SLaXyqZ zF!NaW+$TKdu+!{JC|+3GOwe#+U`&@y@{!9z>Ckdp%`W-$P(U3+ew3idfI7m=(p`eJ z9MW>CJ(y6G60g^Fv-+NW50B%KD&rVU=W0;8#=#+aYLK5xZFe;4}G$Cxd{}14RgbuLS<*ll$lXZ*;+mvi}M2pBlw~8veE~0EWlE zDHeY<{7>E1zZ;GK*^U3ZitAULU&TCsBE12{&c8@|el`A8nenHw4cza>f6;0Ditwu# z;!gwt_<#NU|4SP2E8wr%f`^UZfqceX}x4)wNClB=}1^_UJ2LSwqmHO5ESEk@k00+X~|HS_fZ}2PVf9C8z hAprmZnt%IGe`Ih)SqPvH0?7*ChZ5+<&~(3@{U7Mbbcp}} literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/InvalidFirstPageNumber.xlsx b/ClosedXML_Tests/Resource/TryToLoad/InvalidFirstPageNumber.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0f0ac6d38f429431a077b2f3a9852ad49dc63ee1 GIT binary patch literal 8916 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/InvalidPrintTitles.xlsx b/ClosedXML_Tests/Resource/TryToLoad/InvalidPrintTitles.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..86bef09f81c272ad990d8fc2345df319cb4e34c6 GIT binary patch literal 426597 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

YqS<6$H}_ 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

jE3@q+EL3# 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/InvalidPrintTitles2.xlsx b/ClosedXML_Tests/Resource/TryToLoad/InvalidPrintTitles2.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f9e609d9d40f045499a10832d57f51e0c1ffebbb GIT binary patch literal 25314 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/TryToLoad/LO/xlsm/pass/CVE-2016-0122-1.xlsm b/ClosedXML_Tests/Resource/TryToLoad/LO/xlsm/pass/CVE-2016-0122-1.xlsm new file mode 100644 index 0000000000000000000000000000000000000000..a86f92fc5ab9bea19770593137b30caeac341a4b GIT binary patch literal 1837365 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Ϗ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 ?#8UKGcux_1BoQf<)yYoy+r zP-&RCpAJ4S5FNqO}u%0J_FQG9Bt z`VSNe!5eEwgwmSx<%f-M!Q_^9K)d56uZ|0X$(+#{nj;M?^6Q&n?jsXafRj0f- z65Z}qW|VtOMGVt8aRp>sma|-MK*SJ6>E3tb(Dl=2q@FZD)yw}A+>!psfyijBd>|f| zDTUqOa@(J(&(NmRP#ynDtA{KBR|amMejB7ab(P-*6YY+}@U0T#%0?v-PuSWd{cJ5i zUEE8p;gah04!`z?dIM^G`C=9T*oR9Z8`a03bG;H?(4_F@U`yB#?m5tEiuGpBAaplN zVn$1$9OvCWutq!(U*^cyh1}ev4Y~~nu$MW3Co?LpG#!bN&xiCy!iKBcPO|ImPZA8X{W|N4u4yuFpS-iM=@!B{%xM99L-u>uXKdsy3CTNEe~sM zYA?vVzBuIOv2T|pJ;9o=@{^sDZKJHr##$LSZvOhfpM*c`vc>y^VtbC=)p{I4vj4zx zFqMuELbYxQ%7g$15vvYL0=#TcGUD({G}?(`)Ybh?h8kMIK6VG2RO6BH-@t5j+(mz(!I$G~q}0?{0eJKlJwi|0 zI7p1;abR5zZNCpQU8p@s;m|d+TO69cAKS-Oq#0DZ+himCb2-|1UNu@V-Rov4MuMw> z+&a21TY5*^LO|@A+l!=-JY7l*4A{=pZOEr7hMGV>Pgcl}_U7A!r8*+|r?AsNuGT8C z8mHz}AQsVmB{$9vN#yrDTwwqtZptQnqiWYT%jV@*-2%q+`^ zDr=hL+b&VQYp;QUI%Q9&_P%^Tj7sxb&&USDEWzJF_z~#!AS2R-a#oR5Dsk)jW}2v{ zhP9M-_j0S@riaki+UZ)@6kwx7esfpYUCZkRz~SQHGXTzSb}%mnxa@#5?ggTR^J{L) z++Ti8h$8a(p>B;r*NP?Ve?!1Dpe7RCTsW5E+vEdA$JTQ9M|H=AEuQ0hl~Q!PWD}g# zY}FmY4fOQWW23zthSj#P%cc@FWgU1bbGFx|Y=W5?GIFT!rCW+;))-&X&9CPB(1|vM zVG@;@@nx&k)eWnh7*&s! z!G8VCD#A+Z!g=mwY}WF2%$R}>^Z1B?`92tZ_do%5-88Csz{ zBVO?Y)cFD8mk7v06d(TLR7%oVqw2`5zI=rZgW{{!s49P4jbm4eFupg`weL2VbXak| zbmURt69R{;p}O*0%$eS|vZ{gb`tN8aX9q5)h#oxE^zlw(sM$AeZJER5uryiUfiuV7 zxV8&TNH$T}vDi>Nw+s`QD{&iffWQjjo9-X|*-8j?{G2ILU-y%0ghSi%vU?L33Fm9! zRhb3laLM+)bO(Y&AWCiXUjyxV$Bc`Jsg(vYag1>_H0s6^x`I3;SJk!?>452B4D*KN z(0x?AUMfx$&hYe`*JFSM=e(D|7}aZL@;1gbctgjQgF#GCfPKr6$4G!QA8I?>k{UEi zP?uWIac(kBxqS>lhgH=`;naHH!Nj=ZcSN(s1gAYqI8=EqIOeuSd7$zmSBV7T^T07_C`$>n^4QU)5bq z8XMHu{Q?|do|#nX85sae);+v_zN5lG)Owda-u9k|6!yI;j~iOS2k43`Q4ZKT?`c*f zDR`3;t%LHm2?rW$cn!u9P(Ji_05CB9wxc}fl=xk0Hr5cY7I!V`L0fIZt<^bG04nYP z(Nq;kRN)32H3JQ2N1_7{TADKQcuTQll%Bq_fuAo36`IZ8F1{;Y)6cjx#U`N@xmv;i zlVFJT93U{?CtK(g0P~tPLNK7r%EfGzk?Q*XNAXJ$Te-bjUwyODdjj zAlN18`^*q`m1Ry06Qb-8)oT0o{?pfy2$H0x6KLTij4LcQGi@~3jzpRjYiMtby5sRX zI+rjNw_^pA&t|U3Dwc(S9LhgveMYtB#| zM6sE=`l_P7EZXCO&S0R=LhA*a4N^wa+BBKv%&z?xl?R8b2v$zzRjAQ#drAuwgvCu3 z-ShqZ&(%##cvIzYJ5Bk2ONkN-!UDYxke6>~cL?V*Q9v7Ikiy=y*zVc1GkziD2D`?L zmpRzB*l2HA9x{HnWCHkzj10sI5rY;>OykbnKXdK!C16>PeQ&> ztfMY0{~yIU7tX#w0mC}GWz3`_p${yAY@Z1P}Cgm~n(Z}@DNYyILKF-DN? zB+W{sUlDrF7eXsh$Y4+gj?~X9n9<@MHCFx@QKSM>!Y@sQ+|w!|8Ev=q2-#X1m@S?{ zyRa%atL~#Gyk9iCi70gRWzhRAcIDNv`7dROp-f0`&Bi`cUU}t@VKEMZIfKc+eK(J5 zLSZ}53vKm67X6dG9e@$QIKuMQOxwHVEVh2^&|2Xuv3NUF_-2(s`pLssKV6R0MPP|; z1=(V?@Yn|EuDe{({s6!;0$GHZ^&2(R>%+w}kM4Efba;nEV+oNQ;s!gjQ;xtDSYlrO z^UH7Gyvy+Mf$+$oLA0wBWE=_d zz9KKO0)8&D4~s~#M|}M64*WSosMqai+d51@U6lIS_+OP;Mc`2bL65qLaXU`Ob^f&y zVGL4lyqknfL*L&g^SpmXmcsvO|0e__U!F*9@gCC_KkW#RSm}t~ajPe8Ex3GhbFwQT z>HoPA1QS{thY~4MhHaX55+~W%@H0Idt#Lw^j=uzc`0L-}rBy+PL~N6{?6TW3xv9lB z{Qk=uFS1{w6p+}q^_5W*q_Z#Z_WM%r!*peb`&G3hZ~Qi`s)(61h_HZ5 z7%nLtQiH`W!YY~2jR%xh(~~J4c9~#!;Vb)|-@8&B3@TmLO%p6w$s3blN_sG2ja5OL zD1?&Th{(bNTH;Cw1T40th%3~(VH!k@D#?Te-X+LWkOPUOb2OqTo8Z#O!fQA8a?*M< zVi_r$oSbhZmbs|9-F6)yi4yo&>(bEJPjyA+2+th>p8*8VZ>79`*#}Nft8l7ftUm>Q+vrNO=1Br3}+0zKviB*Y?-YF3f?A^*k zc&hWKrC8=GK=t(*W>i8?=exYyqZztZK7YHOt?}3wiD&#Bc3&*qP<&+q>hpW9uosEQ zlgpm8t091T^XHA!#nQkHa$UwIF5T*iIJ0pOGTSq$HoXIZY|ZzH;Y1fm2;u7iF$c-M zCa$0DDpIYaZPW!57+w}LdLer(Fhz<8;qyRIxNI>x`7qPgm6-Mz;b{UTtduKTKcSM0#a-Ul}zspjV6K+Ai&_z*k zNnnFHpO~mwnH$^&)T*?F8t)Ge~MSYsNd^b`8L3ZIr! z^)hQl>1N}2zT!^{e~WDo2r06N_CjKe@I>WHHH_t&_T}do;s}axp__2>Y8^6LP5!q- zbEgZ~&v_lwT_FxliWT}eMJ}_TTbL6IMl#nleku{x&p{jLEdlFRe$aoyaM>*$L5@Gn zBY>=6qoSN_d~W@q3LbrGs#=iixM9_NGB9oe7^ zJ2PJ$1IQiFW^f`RM=wT}K#kT0qgg?2<9zY#oqh+k1onUG@2bF`lXfe0T#8XKi5ruR ziP%2E6fdHf4zJ25umgNTS;f-oeoB^Qs$!hR-nT!PX)QF*EFVI~@&|E$8Jo=x2bMXM z-Vi*o=~};au<-z5yEX>s*C`dhol%Mm}^6Cy<6XTijgkLk#!;Ny? z3(>VNf_&>IRJd&l!!^_rXfgV)IZ)Yw$VtYjkBRCFXIS0EMnvXYfbBXSuHg*Jc-Kc1 ztl1hT99Kpu;IzH6_WXypsq<dff|lb6!e0@Y-AaT2wEE1vck5kv-g8IP)8|$#K#Kv9rht@c1)- zJ|3Z7IjGv5il_06|JWR6Yz z`)1*^so&5sypOKNpW`>)J6Fsz_%B~HKRAPZ9a#g8QAR;WZb=ZPu=DT&d9o%LghuOEgrJz~gk>JB{eAW+N`Wkf%w zxYWAj(EW9RL0^{8smb6Mu*Vv<&YQ>i0&2gs!VBu}Q50CPeg8Bcv|sVS#GCn`Oy>IZ z>?fdM!Fr6V390npDU_=x6OOR^2@|*yM()5R-FhWl8Ug}L4VFT83_~hBTGg;0yC3%2 zg$;9XM&h(1yukNp$bd2mq%xi25MIS4?)cRlE%<~QC7^KqKp;tLnYijSDtn=&S3v@5 zxfU9H*x3)kX6mFzZ7Mum6`X?icG-oZm{hyp#+Xd9)Pi$Clz26C+|&k}f>7tJ_*lpT zl%*SC9Z_mS863u({>CzC^hWiQVe2Eqhe;J_1|Pwfrxc95VT}@6Ya6xB3CdG$tHSA_>%X#H<*>6j2^U`f?=D2E2W4)Rd=fDFRjcQZf>EscLr1zm6PZ6Fa> zP)j6r@cf2SM7_fwuaV+l40*Nd=loPIezx+#z~Bp*6Rq-N{+8r65JKu-GAS1Oqc4%T z*mITt@t(lKJwA5(hnUrl4e!_4_$lIBc1tQ|?}dx49*b@sPGNlpNYM&Vq$V1)lG)iSN1AehZH7`Hbb z*C`_RN2^r1YjG0{NcRokdf#1$x%sA-gun>;@A2WURTqVNXl^ zmgVl*nL8aQpZKK&M+~vn*~z<V4sX<}#C@p%H?+G$ka8omln}c6x@oW@i;rgI3Yee!n!+7+xBIve@!4x7AP?+xxL@p6W zROYYb+w;xv2OL(k)zR%C`N5z7bgeXxP-07{-7?)ogDz@ z#y!;XWk-sD&@-G6szddmImu;>rT=mW{A#B~Lt&QsR>OZ)0d46cizw7qBiM?YxnKY< z4UO9$BoRq0{JRcC4jwv;UBo=4sMC!=jYa$hp(r5|4+7(=+y=?|VD^OJJpqjd!IfBF z>(%jZXZc~RZrVqsC4Q;Ul^2jSbydeywj`O*Y(W-&IaGaC6ea1}-1i6q(iiI*o^gHu z5E4A8<>6*A`vLE|Lb$)a2CX8+>8$g;e6{Fai)?Zy@AzN?iUc2pRqdM2wR={GawwO! zQ&cQ3sQHl+ZDL{kgrJ^gI_|87swN5n3TnB?N+N!k!8ZAXUffpvdEV3((PFvL?sLevB(TAOzBcx?vkWmaLY;%Zy7wUK5ux)2;+!H<2Ey0+gD zuMi*I^j#-)X0nlw(k_h{P{rY?I16$XQMEO&k^ShSQc!s~c734rxgO;M-~Al!SU+&e z#9_g*7G3y052W0fWT36WDa^V4Fr!xL*4Wx{E}7>|iAzo$se>_XypY@p_&kbGx7G94 zWM2;DiJlhT{@=>W!KFn<2My;otGzthNNVw|9vFd49Z^5}T;9?wo_sJ!r@mg_CDd#^ zwP1krpbRYYlZHr(Pr<*gBb6mCejadCE9xW-_Y(5Gy#Yj`iZA7#i|8yVzx$ouU zt9EPsS5Lju6^jyD&f_(t*(Xvk?yA4cU1HoB;&0Oxj)wO4uNSm6b5r)zh2b=OR)4=q zJ^A%-pvR`|K=|0!Ar9OFG^5;;Qy7-3_xi^}s|$A_=k9)QMNTrkJe{xZ5e-^(Urzd! z$Z4uFf*S1OiWd;cX!Q3>kZdyS<0K)p`nn|}^A&*ZzYvFlKf$<8B>f5TFD;(0Gn#=K z8KrYu5f8M)5QXGWpl(c#pa69;gtKIFlRbak)=~c!;sH9MMO?_z*Jkw}Nw1qyxo<#^jOCUY zqcBi{T@il`>(zfGC-;SV@zHi=u^(_k)-OU>VpFZqRM26@L288bs0XC>>$HLm{zjirhI>35$irMBFI0HA5>G5cPz6BX&@Zaw~!?wm?T|!7OKv zWMk=UMdwws0Tw{82^FbF%Eujr;;GRTqt?uUuj4tOaxbUCnT7y`HEY5U@Lq%=@JzK{_E$JaV|)g;z1CYiL5bPtbnS?3_%XjIjY z%-3Z*i>!)XUZ$q_nXr38i(f6(`dfz2HQMZAh8A-19vIEOxkf$Dzq(x0x=#xyrt(B| z17kHh65Y|AI|dM}XB4@w4HWF{>HXeO7Z{JAWWbSO?Ll*OMGzu0DB#L!m=SuqxrZI; z^;;elgq7QAu5ix4FJt5Cx+K@e+u@(cCNqIoB$#HL=7G>p3wM$Zq;H=$N8PMa?W~4p z9WH|C#SzCeIC5Q_WGsl^4obd(lXmpj`QjFI|IYk(Y>_6~>KNkO@+a>%(?`IP_-4Sc z5Nz0L8Z8W+SqtqojwJq-D;G&&KWi49pyWNHa z(8EymnV=1BVIdr&k8;aVjIh9$>!7Rh8aNSrrwF~{GpA`=pMu!s>|C80q@U5g_YEwl z6YGZnd(Yyv749k#ONweSjO1lzecnS?#TB<9?9`>F`OiZ(#e}#~z0R|AH)*F&6ZBsv zEpjyb>l7$WAx1XO0^-jv5t#Sbu2`tpD21P~+r7xGB#0@0jeeR}FSOWP zuFzPsv5;rrUR&$q=_lzSRy5GpxaFdbw6gxQXHzZuXqK)f!uu!uHadF^(3e?9rt81@ z1miWu+QT(GCD7*<-j`}}4!bYwP~akhJL2a^Sm?{`QWM$$F>CM52OVP(FXch48rrBb zvAP5xQw;675UCdy{BLg1t~sVDPF!7d|a>psS6*v!+kqtR@)ep(vy1;Jz zJGHfKzz2WR#{*8;=tn{D@^F)TYwf1IFtl@G>fqEP<}0tR(pb2opoJdjPbn!Yh>AYvC!k}Nu=l4qOr z_pt!meYcA34ve{-p}rnSFFd>!{iiXLH;8W!RwRq~QqHM`sk)Iu+ESlXz&==Yh^K-)puS6IoZLg@v=cvX) zJT)8H3{sl&$lSc(;4MbUWfG_nPnfaHv~{G-#8GLR%ElndQ%{G@5Tts$)sYmt9O zv{tnfSMC33F4)p0rwlpjAPxP$Bv}8F$7D?oo)E>k8JuXo0)ox}Q{FTr?BBNLaT$)SZ_wEQ%j?URMA^xCSUK9Z zqTmM1pW~M$h|0GdzWVg4(Z8~L#1^AmSBv1*j}P6OCuzrV&W*3W>H-ZNN6Q^SRn0D< zpP9(@Lj%SyVUdUgYs*}(x>XSLo}kS2@H#ATlbh-a#~0%dx&)Y1I$ORv{nNL+H7NPA zyW&vrRf~P0v>rY0!0=O;YOYV0m4m#|v#(%i6J-R|ic>Tsp$OtN*vWmfRi}XTq`?(D zD==_27WV^nIP`{23qNbI>81jbp2WZ$Vq;ImA;2U9WgilQ!8SfbFTlNv%ki8nw(eoy zFlO2p8(t3;;OqQI^-jl8P)JNxgOHaw^mCvAYPktVyDIUSjyrJ2{fENHR-H%v8;@5D z^OFXeNh4=>o_HvYD~+;HJOCuiNZWKUSY!`AOzUgTv3HbLg45+b&I5hNzR`W@+Z35F z$QygRiWc>>3qO?(@gpOM75YE4O6pUY4%6uLCHjUq5a{;}uI>8sDG1^D8+@mS1)NO; zp6PK^F4f|N#EDM;PmD7Dm-$R?K!hR@sNo)E0GQN2%Ix*I(U$j3r5vrhy0cA@JcON- z*(j3Y=|z^V>FmvRq4w=)mTOmS&`mq6kR;7eVDswi)SgAx!kHH|CtGHTsTs8(2B2o| zW+%WtD5My43&=VGR^i|;1j{f+Whdmn9+iZUFOsDz(NnJx%8V-Cn%HgUcRt#U8<;0Q zuz?pY&eXB^45OEi3v{&~IoPukDfdgY6uLOgx+6WGZk<|A6lssvx@-&xhnKgs!|~<2 z`XwP;nooI9mfbImq}w^K}u%2zp!DthCaTu(3k| z`sxs5m;b5bc~|0-K}la9goW;v1o5a;;1gVEYlu3VomNQUVBSJ+v1~Qr0^Q&C<)>ZH z5$N+J0dxADL`(Y>*TQPWHekKGll=tl?*BcKpi=LnUqJASw34S3?hQO*A~|?}%6For zKX}zQT@PF0p$Zc$8o@o#{d8eP=pkrAN(BQvXL#4a6X|d&EtUx|?pqW@>5D*M;#DAJ zkAE#?bbHTVNJ;(>oN0B_3J5yYWKdt-qCYWPnkuNP7ak>FM$OF92qqyriT@45w05FL zFMSgJ8wu25%(6^jM*RVeB(KWYy@|L|rKd28S12{jK}xl-QQz#?=U+*j;a%!d!Ci1C zO7Qdj-8E!hb=;2jHvn&JH<9=6K2P7&S*miP0&RU;`-1O=#$gq#cYf>M&|Gp zU>Wb~2G}}=HxVV8v!2;}@VqKpbSE=;*Tj0bD#Et zct^A`GdOjR4nMdc>R}^aTi{CbVs~?1jqFzuRdR@wa|1p7>^*vG&3dK8_(~Ma(+WJ( z3TRXI!d0>zy$EDeBA)pNgq6rh*?uOkLS?}Gw-XADr_dq&OUu5j+8)uA8fw05y^F|$ z_D*dVhy+EO3bhsi z!$ttM|AaVj^D5$pp&q?&0PKb+Z(yua4tx?&*jDhfyW9N3pC7IR9+)*Q^Y+_2>cNwfRuHHI+>-+l z%$vnBX2uS@Vy*kX+te_c{$S47y3tZYgjb{enHZs|wT0<^-cCTSF7)EK4^1J<(pgeH z|1Z~|M03@tp;-V=W(Mn1HD>Dij!jVScV*}m*}^mZY$Q*$u4uS;LN}BI0fp;@Im)ev z6u%oclvkt4tzk4vG0HIdi{B+PlZvRYO=T#ak>92+YX;@pr?-9-E)gCrkn%g(0}Kfx z1W57cD&5T@K)NJqWEP3F-6ryKcR`1JrtjoW@WX4kkr3#x9BOeJ@=%H*58KZV`hCg; z_F;fMd|8b7_=wy?x6^MaO;toN5*f8oLzyKehxv9*vV!p8UtqyGeXZ^0`7&m8;U_(T zP6Hz3gGf&h;hbu~dX2@CaHnHIh+AzbgdVHL$qwglj)*#9uoZ8FbVb`JiXX{!7zP0s z92D8hRs!tmc(m=AINmH zQ2)(GqQ=;zlYt#ccwMxT6vD2f4k6DB1H2v_+w>H%ihmKd9Izi)0WfaTG|uPu7ZRT~ z+DEhU0FUHM!W*3p0=up2p~|2g_;+nnwhq|0xxy{AneR}wh2Pr=n#i^q)GV|^xQq-8HN|1wTg>usN$SH zb_;R2mF0f=WL_cr=={y!`M1tY>o+icZemhzn>~xZN2x?p%Gm0 z7X4dV^Z4E*U$hIH-K?W(@j;2)zFmFEmWf3E|6P<;4`>1+A;zAfwFA46L<%R@R9DJW ze`l`KsTMwd{2~cA`~-z^3|Fkz6ASQp?qSjU`!{luOJ`U605+!=nMs;n50fU=tQgP7 zRB4C{Y4uimCO?v1sPE z9f<0g1{mH)C%~k6)R0nbm5;F%QM*)G$$OLnL}nZIJwszey%qV9KN*?q5N`z@^9IEr z2HFFl#(xb@O!{HA!$=+JU7_&qh<{CRv1iEilznQEjkf@l)|O8_i?3I!3NzdrSaPZQ zIhAsfCq8)Gpx~xRW09!9HiO-Rd>02dx>bqhLDN(JGHI+T(QaglpM=Qq&o|)XxPyZ@?nANSsLPQ@?1`ClQ`~j#J?0Jjte|qr**+W~cN;RIQ zGq|f~Bn;pojfUm7w3bACZ($$VH>6ZWPc8i|6Hwe8P)?vR$bm{VK3#G@--cM&jvzgVkT35a^qt^ z8Z0ebCGLj_d{oi!6;k3^e6IGM9rG^Y0#Z4K44f+8^_+Ruhg^qx#GN zpc2DSEYO?yZHAj14ua~P21=-!ll|Edu5;7=|Hc>+0=&)azABKmLhKIr zJT6@^HI<#bP#6%h|4xGx0x&x@Rr9*PomS4<6qoxht%?S{EqN^jV@UIS4(@xIhG1v` zU&#)T&<=)~dFGRQ=l?bq+Y7n>$^8l6 zV6TpnQ!I(SZ!7!c1|EU;c zkTXFBHt9rwg}WI9Bi8Az2KM7>q57E`C-K_>eZ3mtG9K*Hch5?hvQ*M(X};wrBEOPC z5$5exXYb&hxROEr2}d)5B(4whb&o~l^~3^ui>Qkg!pLk}X2 z$O>9IlfYBpJVN=BunF4f1>_tG?pB_>wr*hY2~?os_bl)5lJ;8|2k7*;MKk1xp#wRb zv-vezwU@@yEd=_*s5}2@!lPd3gI) zs95$gY*aXRhe~`j9m21vI^3T-Kh}S^w4EniWD?RDZW<^jBgD619-sne5BCx$V$oOr zz%$(HT}L%?CxC?kmth+veEX3`FB6lM4oOw)n&Am271d`x@i$X4- zmh~xBk{Qxal(8UG&OCzVtEDn-UsY7J^o*vz2Hi}UAj?Nm35Z5S0g94NIWc7RUjCx_AfQ#1#~?|-E~1pSkS?}YwOV1%VK=xfKABU z_%Z++Ki16Fd`VAMbj=5mLK*?jTxylqdBtYuzj47D=!b#ve;SG&vswKUA&K&b+LiWz zHbzlNr0^gkl2$&(L&j&vbZ>q%Fu=i;Sth9F1`bPa2wn!dllT}?M5Q&dz%~%ZV3QN& z=t-uG56sT}6E&i~>0b9*b)>OUCzTHNmq1V0K1aD|+BC}n1F`kT(E{AXM&UbLRZf6W zcBy3Jwh(fL+J^KYMp9+M%K_F1l{@3m>ZTBk9S&Vw-qUw|2_Dm~Q!-V0d#{mtXT>BI zy!(ZUb~XCz2lJU=7UZw#gt>$Rhyd_qd<|FflA667V3rH_qAO`bQU2eL(_FIcY?-1Z zhzpbsZW??~RV1umf9A`$V6%p%an$L)bIxo%3D&kW6ksfL1P=H=7<^r(IQf!MU)F!t^gQHLK9=yt;YoMI&4Z6Cm5ruAMS z7A+SxOOvD~YM8}H_bf2CH0UBC6=F}b1~c0+jr+)#m&63fQnCm@0d%90#+yupi@5pA z?|A({Y||^inG3HbQ|GEi86`^1>+9<4~E^;b@H`9Y)l6u08Dt%TCVJB$Uo>^nT- zqGd2W*%B9wfEq=76b;YWR{nId5BYq_0eZ93Xt}_$-A2Q8SUabrGV4G6-oq6!_}r7o zLoT6S2#{i!-Q>y#l)hA7ScCcTlDAhvKqXw=5dy+H;rss+;^iW$PUXT)2gGyf7%5;~ zH*}>W$*)T%GiC^SXQw@}K1+oZb_a1Tr7hATg zXExC9xHb`}BtV8TXW6Z~TJU#M1l{hiMiWfFbZGIqs5^)6rJtRF*<=3n?8c}rUKzQw z3#A&!&IaS16huQh**3?ZXT|fl{nuVQ(5%Zth&0MaNBT6sE2Sd=9G9_8AU7yr0$pWZ zr_Kd`e)dA9Zy8l0TDcN^b8Lpt1?nl50axMuL6)fv zy9Ii%!8GYIsf)gT+CL?^yj{R^EtP0Q(Tjz&9-9gEDIM$}b&2{>BmvFu8pSv8g|Hvv zSr#bxn}quUT!Yp+?2|0 zjRw*R=29qdRK8>~yP6o~Yy=Ea_Wq>S*Uc&TM2NigF1f6D=Mp5~siJIZy0)VE!51cE zDq;_BhdsDn8#ISwkSMhxJZXVHkjUEF-JBnn`E-KhfVx6IMGrtkqrnpng^H@}vosNV z1+G2M4=j3qMWm0VM0tR+Y8Z$zxq<152cDfKOu^@+*lni+^{BT=MK>uQN#%hI`Ipui zxtg)h)9`uTJ|rjq8RmLTPYz|=!F)=R35vI(VVr>PwLBAVf~!pDhjr5T|Z!uu4k4VTZiu zm#GP8ex6=dI<${2Gc;$O@L!jyI_;AP@w-irh(nu-l zK)|Av0KJ`kat`xnInAvW#4Bx~C^A|7qA!VGVxcM(VOMc_nNFpakk~$^4^h+KaabWz zP`(F4gUt%|8&j<)3J&pmT!}suj>@4LXPELt>GIGh6^eSaJ>t{uRrH5$W|3x-0cWth zf^nTlWq#`Ezm-YPwsPrUXucDuS$Gu6iy25N?6{XJDPAi-++x4S%!EB(1#QP#`xTjR ziSn1I+Pct@Q@8ua8;mv=sAhq0}vSLEgA-j!vEE2I{iicCX2(0n)oKZIn{7s7U2a^k%Z7 zgRJ32dKsG?NzLfRk($A{2_BsOf6uZP?`UW`BlFS?h42)IkO61$r}-FCFL1H?y-SyQ zg~+*q=0dcjErC5O&$*ON=fGl2`->RqE1fHjN=}GcF;%L^9)DPiQz5pWK_65qNwF9R zWGbwa>>63kqhh+R^bWG|8I8Q#m*)2gbr1q()D4KG?7v9i9F)t`V;=2r>tEnW)!5c?hQ;gGJdZffr#9aS#^_NK+|Y}81;ml3mo6+&BR>G6`z z%p2kkZTe)=y-(iSVveI~N{p(EsLqUyiPUMWAv@-I3))}!w|kEdV>SaPxc$l1XmhAB zQk;TP@xKuf*gG)XE+$1A$S7P}bshX5$=SRh#DQfSWv+bSJ*G}nEV?oZoE}Amc(dmj z$Xul@G-EooM>i_K(kB#G={5JczIKE4?#Eu{J?+Zz6`ZSJ0WsvGex+D;Sm`OWcNkC{ z`tqc_n%^I(!!`S5E@_bvC_YSgKu1J(ygmp;)#u!!DUM5*QmHDfjdMN%R8DsbgSRXZ zVD>5t2Q4B>EV_a$*5uZm8gn9Rt+I+OX~RZ)A6kH-3TQv6NtNIfY%(mWy9Fu5ClF}k zQzKzMga~P7fY9NGV0a;CQnUE6#zs(8WVU-?0dSFgI`Q33A}HX5&_;1_lD_d7fsk25 zpe^tG5d8C1Uy4E5jih2D{Du@m^wa^w=`J&mxF&5}`hFI0BfpX#=-YUP5F>3%Ni%UB zMT_mzEj*dYJE6=P$7L0^&~iXSv3uk4BXDAR_CHj?$cpaIT9B4K9f*xpb6aioSc3~| zHi}K4dt~~n0C(|G*41AKZpOGMMwC4?S*&mRo%l_}ZSkP5ycPxf5DxZAzv?Rhs@lpb z)erbCxEev72RJ~jMm5R0g4Ho-o78f6FUgG@U+lk!VCeyvhVj(UeujOZh=dJ4|L2j9 z*T%mXW9TUN>m3&tZRewQVcySslC6&?2d+GN0e0tC>Z_M1E`I zKNRt*!psyT{Q@*o9L6RX=*f9|%St@u}QYCLCO>6o#m zt*#YfhfD`(Hb0NrL*slprq`_-#(^?p^}Z$-Rt_e}#O6(kXQ`pOTYy%=kYe(>WCtEh<~Pi0JNDCjI}u^Gi) z13ufH;{*y1RU(_QIOQ05RJuec7|qxrK$#uz2<=QL5|o!y*7S^fFoKsQ-A&UNwGCbI zV5b-$4~Y|$GkYkpb1<2b>*m&uQWM-4!bB;stR3E6BqAJP#h6?SW4^L#aK#WBujpKn zqH3kWRj>rJ|2(T~C`tL;)AEF(90o2tOus;%>^HE71d3I)?2GoDdTO+r06rV<^yPR5 z)YSl4MdS`hq_N7)yJ@Fg-~^1@3?r4Fnj%ONUSq9?h3$r zf|~V!Iwy@0A>(NI=VnAJLyrh%`9Ep_zMGJFA4*u_BmG2;)YM} z&2CeyL}VAIjofJwx?kUwK0)q-$4fk3bpN&WAgAo|Qj=p5{Q*S(NeSbl6@5Upa#;ES zj-_I=K0?dSLE2(&5iSffp=4=JJlBdrFew|#en(J=u!AiNgHOBiR_|l6A!c_X%2A{b zWyO?*1`w8I8ImFS=%70x^HNxa%N$$GbMdy<18%}xLMu@p{{o(}bjXBwEE4=*@f>~C z4C$mskt7jG2=qpt?v^Xu1Pd2M@v*`7ApmqQTn04bPlbF?y_8(83{SzEs!@7+E4+&# zNWy`G`1pe%hA;ioPE$|@4oe@AZe)q7Q)f@USbYj(du(;|-q4@lFwi+^imTxgjh7yA z!=^SiUvKfyQ&@A{JebDF8Zzm5@jU1Z`uW)K+H2DzT4|EXU)(9}m7xhS-pb3x8Ws`w z1wQdVTB=i_Yjpow)CZ+5JGhmli+86u3hr}udt(JVFXPL#4zJ{)ahIK!USCLoz@|=& zRfr1G*z6z7PAjLkNzbq5pjO`{3F+3S9B+Yr=Rp3&QR)T^o@_ceD0$<3UEl{*HfP4U zmWb0bixX^xLhVPSY8=ogSO3&83~5!G6)RcoI1@;0t~m%$ZhN&5Y)H?@{ZwazSZ0p} zS*SI&Jnt%yp;I>S8m#F_Ppr}{Du0;gz!^bb1=P8pbt~}{Y}meSIo%mP%R^&8UkQr5 zuItG;r+-bK;I>)UUwZ5?a#@--zgqAsVbdNTm5=ByFU9UfHthv&xlCl{7955!;w8~) zzdF5(ZR>St&}22M%iG#PNlvK8Z!}l08qjG+I-Z9@nUw3eACN5~D4(E}UNF{#(SA@! zOl{_7^{erK>wE{E5V{c;`dSX^J;OGF>7BQ`*c7o^`fluXT&xhT;(w!abOPhbS4f*Y zHoJSI?7uS_*nY`jbij_tiyiiA#Z&GZRkW_#mc62YPeZ6({Px~y2%;{mUBFM@aMGQV z;DXXjo%&dwzM*~Pe;D!dQphDXy<_Xk$3rvZYdrQtsW{>vr7%Z~ubR{u$q$1Q+0wQW zu_*sG@_K&PM}5wxXo6ib`%`%G!s`aME`i?$0hxd7N@_xg(v!Q$swC+iW>mM%RVUAC zd|iVJ92ga708`b)bYc($3|={PSSH9wYVQJVv30sOaStdJ?QuXsaX6|`+GpxMAUoWl zZpHSQwsy70#GRQMyDY8=7t#=ZA=^;Dyr$4A;pimL+$K`Q~ z?o=Ioke3g_eWYi4cY9ev#Vej?d8#;0Tm~Vbi<_WrYc408)VsAGrm`?OP^Rm>iYj)| zYT*g7B-N>MBpB0pO_(#6k-@~sq7q(0{)eydl7XG#qv;FR);&yfQD-D3siaiBd5XRv z;RP&vZr!f04{L-6*B)fTgDeN6y~YtNMOj#m{ZIG%O%lr-UwtEIs>R(L8Fw#O=YtY%^lT7!DP^aRFo}nDPm;%F zZcf}2KZ}yPTk~$?A9pfVgf_{!KHv)b2)o8TLkgLvZ?(Iq#z1N0y-x z{1Yj~`=x;M6P-a+4|wk+DL$trzE2?CtvYh~x)GSD1Umkw&9tcS-&5gCgnDGD2;c!D ztN*AQ+=Vt=%ahPfrXgr4drEf5@7^6BP*g=VnEsEy&L36wuZwm!|J8S6#RX7^ zgKx#)PcqIv>{PV^i}JZbm}A0Vkb6apot zh375)4AQ+R%qOr1a<+8HXVV-FM~Fz)a30Cf<~JZ+wBbC7+16Io&^$Atv`MN0CzBEh zk+bb2SmqRG95{>1JByiYq2Cwb#ft66y zbc_mwz*13d=JkFa5a}1;$j0mApL2wJ{x2b&TeeTR9pBC(9b9g|=?v=sp@9_x5fsIv zzZGFlpxz5!0`C^$Z{Iw~+AbkbZE!UkrT-yvMB)=-KR?MspkVy1)PGoL?l_|;|Jd7g z4pn9i&<%>dZx0%I27fY5s6v5O5&P^~d>%zyN<#{`+w+|F0I} zT!Y|dui;O|kFZ-Ys9fK!gK%zVgk|?L2)a^#B7+_nBn2y*ixRGv$$qf5Ov|{7qT3>du(B|VA`y-SOi05e*Uugt@F?I*q8HFWMZ3&4$GeMLi43=xOT;^A zg|-KLJQ6$HQ?ZfY9UM)Nt1mlg_G^E-A`qMaykyE*2nNnxIr`nP1Kf^V_eSAjc7oXA zJzJ<&T1g`HwjWxbz?i$<)BG9ZGSM1;sCj&_&dfM-b}q2wOub1&#^O`cU_@IJB&}Z9 zq1Z>O^|)C0&iC%9MJBkdnI{EPK~nvsAuKDu+22q0)4*= zlrsD5Pe{n8V;q~M4A&zzoquY#Jh3t!{uGGW5WZ{S&T*-#;Vi%w?-n}!REON{`39Wm zeW9g{leAfOu(EvAeDGr(Al9}$vZN~iAi>)k!})><%03AgfJ$YrF;^Op_n(9&x>BR2etRy}HA z;YC_qxyRbBrO$SDuMHR3b+nZjoYH2nmGgf_;Z8UP4Fch0qEd;4FLhb)1qQ0mQ?3== ziJY2Q%rd56IN(LKUSi!ajLGiN8_6?IC2B^hP<^SRwI8uG)R4ytq=^a^w(__a*D;f@ z-N5VO&feN?DWvWgTk@dKty?rcwyyQWQO~mg4c%GlB7Grd;``Qu`;dGaN^Y}F9?eau zrAEssmtII((nc#vJ0kCpW^eF-UIADvEmS}xyjRP5ax1Nf)TmZlI4QxLy;Z#mu~kMz znnnV~hbU4{n4~&$VHU9&yc<@NV$oBfzFkjH-Y1f3m6q4N{|he{Y9bt{w4Z359Q<2v zkMFs@DOU1IBtR;w;FE8fOU)@NQ;dIXv?3*dZ2S1!$E&6UD8?0EcfIs@#pQ)sjE!|| zpGPe(3feQ0$I3$6hDo>ijz2%Fj6qG$UV9WpB8EAIx$lJ0w=kL-W8E!4>JRB~6Iepy{%%A`V{yPFBqD-YnP|9q0pxLf(+e;02Hs* z*Bc?fsTBe{5ZIXwV0tWXa>7(!=qX3d6h%sb{KP^uOi>u}d8cpQI6o|C?PBdwlPlch zpT~(8LkKp41w|;$fNzQPOlQGZd0WMdZB+jlQ6WJYHNXok+fyuG1E-y&HSE! z9DZv2!MV4|UoBfuvvDhhu}qZHUf$35`II}Z7MuLHA zxq-KJjyJ#l4WF%;QMHMQjMZ4NJis=5}ct_@hRPtRcechIq~E7IFDlECgJf(L!Zd zx0>MhQW!jXw~1)Y8zgQ zzI2j#IJ@m5#0D;H{lkJtP-aF;F~W$VJEi9iSuw{Vox29vGUj8NcJ6|;@Jl1#`{ zX^;wZBtC@JaeyMD+F-rHP~cy(FZd;3q+1F_A;fy|ORU_ua1AG++}L@4=XrkbL!A%C zk>GF@&eLJcn}gVwbaw1ccv>WrVWZB zthB(EY7F1XOqoX$dK~oyUoUgLm(0#>(5peR{tx#MMMd}EUKKWl#|Tx ztvknRg^~S}mLkC}h6H~j#PK+o@6A_Stkc1+;=6~&l)PYcKfVP6@eF!eW@331#Pn89 zK>>$t>sZS)Jo?Krv;xACmiQXO8SqD>!LKApy0#+hAyD6nVbVvT(nb{P_DJ1H{)|NJ zfBaSK1keuWN9Y!l%P~Q1J&>dW5p>uT?=tjsU2q>p77Q)d9nC$|t7+R$kA`eSp?j}C ze~C$QiG=AfK#o303O%?L9s@fTsRwz~`%%twGj5@k@{l=ZuRE9(5-0N_zFkquEW4h& z#N^2~Nv(5ED=_G0EnVJtFF+x#xK8$sOo(0u2Wwy|k*=>>j+pF-Iff$_pUuf<`Z_|7 z15UKQru7J#cN2~Wc=MYptX{HnZ6f?IVJWgUi#zM-e{zdQBsENaes+xhI1aHEq)Ky+idS+nE9ghAu??KTQHMCOt7kxa;k*^IOi&3eqqduhXsv>k1@2N)zcRM z;vm(wX5E3G3-kOmLMN#{QH;SSznG+GjfU|fG16gWn|%9bSW?^`$mJG$7j3;3fYu|c zj~vYm~f?x_F!>B5Z7=? z=TzaLpzOZ1Buo_hi-l=?m6R92364;2H5+Z2>#}TT_)`QK32&cc&Qr<>c$b>%{*aUe zbT;@ORs3=ocBAz*tp*aUqNE4ppS3Z6dQlE?I>d-Ee+jM=z|iYExSp|G1gw~VVaIW` z?%)X!eFA$2Ru!P$N4CzcoQ9I%N9@4zof8%_z1|Po3=XnB^lYO$aV3mJvU-im*&j#r z^RaylndqYjlGl(S=LCk(?t29<;gGue8WyAW4MF~dx(_cgAb+NFkc?&7dky&T4-!=L z?WBqQ<`_HCDBLNku|cenV{?e#Jv9R-YL_mToyOLfW`RkD8I^9wKC^JE*Jk+~7_E7G ztOo@#N&utiyc*ctV=gZB-_}qi`=A`T-(c3iF6A~?RFQTU?~%_tycGwrB|-u)%xfBf zhIEAeNqK`G`)iD~3dw8-5l1Ig_n@`?MZSv~Bqu-C7GO+-!1bkB==uZVtc(hu<80%_ zo{ZP%Rb#dMQ37Q4hkVMl=sFY)U5Yd-{yjm>%WBvq26+x?54$lPJJOm_xFG!2Xj!C| z9ZW)<_{;V7)!p}K9qXoe;fBQ>-w$&dUN(cXy;~MH_J?);1fEm>dk`_80ridNiTMhq z{oGfU`lpybim`$CKL+h?&_q6%Rk5}VpRlQYwj&86k@!hq#-yFD?nQ=@PN8!uy z-TGk1TToF)ya^+X*nGPa?K%)CnQ?rA5xfS$cgTKc!Rjph8%prIY6c?u#^T)vI9+`qRQYhVb8U3)#~{fcV`ed8l~8ASp03Nd}u*F;qzhw+75D!ZIsA zNBvo5T%HCDY7oL6k%weW^XYt6>*@1uAo->Wvukyj0A~M+ajt!O>_H8#1B9^iXCU5> zkz*>R%K^)eED?U7B`%T78n0i3e?eCJ1)e@WHUF{x1yl%&l{!ceUF6&Px;$ePLBBKM z|C4P&1~|f%5SYQXH|BBbUs1K&ElR82liG0S{=4n0!X3S(q!XPb&m&aF9>l-$E$o$Q zd)F~Zvuu5%b(*#3pAKbFWxw-Y>*nzgOjGh3Fuw%3!>QC5nJ4KW9E-sxVV1~|)1tTZ z2^P)KL?=baeUCN`5!wv?Hw93|b|n5rH23`D3Ar74;k(%g6Jq?<fNoZ^>Ro|Qmi4oV^I1RT0r*Ys+3073BPcj-;x;oH;I9M5Q4-vn{=4d5K3 zZLYKvT7=ZNEOKqPydM8>EdrYU>|tHc2DbP(yrm&F;2)2ZKLV1u-zKMc1#H$TX1E8y z4Qy>PWrdiQPG_TOhVmgyu$ax9?7GIBA{AkB$A*7JM87!CVuqUc;MtxV7izXCzhP)< zI@_P_cj4}B6j64ziDU}%tXc=nF5C;7N;mK;raLK)!yc&W$e`7J4<#`Sm+x3^7QV}8 zk@|S;#g*N)LOaVRC!~g~IvP$9KKGomk@O8n@k3OFiA^#>LM$T0wws-lQ=-Ut{G2ys zZ^u4);pe)FBE6OQtN8h|zuXqo|Jr?gwTi=2;XAgNLs1QX9lLT&)Xys$S$h9QVI5EW zkPhiQnEuvJvD}kRdr(B6fnOC5&Ac6w=V0q#OR988IwcBhr5PbRPrmr`1L$zLNNefTd#nRsMR3}{O;U)K8 zs&LO)pv|EL8yhb5`dWNo82SPrkPVU=X5j2U(dX>ZJ+V*7(ewI8wk0{3TjwMflr>dv zaYVE1wR;vl1=&r!yYyItiHMOpl+rlk!8ae==V0%rIjE_c1rU$9sOLQA#Fk34*+@L1 zG{>7JXk}i<7cp+NGx2un?F)NkAPn z<1z3L!POdK1J^e%1mk5jh@Y``&S?!wx7)3IAxU`u@Cd9Hl06IPQdOE!b%T75%=AFT z3uzLwWU9H=<;vGxrSk83Xbn!yPjt8RT6KEz2!=q;DRPJKf{2~{y!6h(#Ci{Rnje70 z7b<4EtRu&m2WXt1oBRc^zo9F7RtjVRX@)CR_-v6LE3|%@B`ga6E=)-rt@IqvQ$sXs zdB%C80M7)Y_G59X|0HAL`vV3WVXb3WEZdd1{Wg}Jej#wFjh&$PspC1EI26p^N)dcA z*P*AGI|wDVEkKD$y4!P#LWDOMDgM_%f-D&tYSJ19p1dh3^R(B zEvXfT>SL5)@w^t>4P%=PziSL2xtVawe*fqaQ;Exap+GW&sc>h)NV1zRJC{-|3=vy> z__yz`_x?ydh`81pC&@Adu^+sBR%yx5p2$QohztAVk-FpeKl+jU*MTNQKNwBFR2@FYcbWU2U3m z$|+7Mimx)SsFDL_qM?vH)Xx5WNPOweCqpvvXPr*vkF9f*OwLGpoWl;J1NL(1c9nEN zY$48041kox<9acjWnp!IGjS@70|JBt5X4937)>6JtG^7aQ|)h!#8vWY2mzRACC^fN zghpnlC)ek@2avG|iI$0`t#?*UnpAS^LXtK#?%cy`fvhZ>JTbjkZ$29bv{^6Stumnu zMqE8&nJZhNbMuksVX;6|O5jqab*H$ED79iE+PpxkUxp>s<>A7k(1=}Wvvd|foA*0p z>uqQ!OJ&v2X3Smp+|}>oag;tYcGu?J4XTm8IW=d;H_&^nvMhz}yup!v%rsvMUmvsB z^Ya&$FI)edz_KJU8(()6HqDqlgSG`_QKvP-MVjo1`?EM~ad~D!pbg{_aQ?N5ngVJY zqoDcck=QMr?3UTWg-kmi4xT0XmaZcX)R)i^|9KIqgE|E0MD1YL_Q3X1y%0jsyDV{0 zcP>zdlgvts_?0n`O3s*4!X-iTM9s2u0nl?0Soq>XWVhssi&Jgvok$$!td%9Bz09PG z-Uc0p(c8xTNQ5Gn*e4;IzSug+3mYJZ_d)jhT>B`Lj2{%bVR<7_S0VIsIT!&;61s>B zeIHLk01Fp6QS$L56QVZdB8>!K^VvB1HVplKwPI#JtrR+aP4_wZF?duaCnUA6^NP)Xbt>^ z_b(-3AsnbZqm%uA_;{OF-o%iUgYliL`0F~-0Ck7j8tVHbb{?5dF!za)rq>V~QS)3i zx2;;}2NYH2?4X-~)RK^L#T$1V^|5pjMs`~nA>8MEizA}j&SUvWVhIINqtQViucq@w z>pb!zU7C-xj2A_+R&gbNifx!S$P`ZrGzCLsF$09JoM8HmPh109MkRY4)&eoo`q;$K zskb^G7H~8gtI};eFKpx)Rz<&F>&9aKdtQgFT(%p4X7Ed?$?piBO?evl3%A&r;DAR{ zax(XK$=ktSh^kd|Fv~$yz_S=~T}>!QF_R-X^QMKOQpVh5Ltv1~&yzi9N^|q|aG+_r z$yIfn9_TwqJJDt0vk$!FAwiC1^JPLBlN9_sEe(JMu>5_EcVakO7q$gjbrFt2&Wde; zU{!ed(c)-XVNr=dVS*mNWh{;x%m4lT1J;>hO(INQ=7(l`!L7Pbjs+V8vX{g0%dUD> zRvf)TR)IU{8^?9m^|6*s!{NVyq3r2_?qNYiqdZ{~F8xH?swJ)=jBh>i(3|_BQvrOK zU^y*WI%X-~$OUTeX)GiKT!o(L`^%ByOhF@(trrGs9!)lK`_Kf;fen68KJfmLb|;2b ztGUzdIv5Np=N?c?{8|oie;V!o4xnWxmzlauIsOjoHcr!t7T8h>>aRW13>!18bmGz&XU|%i-VCaif?JJ^N0hEw&lWpSa)VKHE)x%0pBXmY5iI2_x zlFA78G!otAf-%pB8oLnkv}0;MUx{Bh*x!%a?He>626_2h8R z1FdlL&o>rmrdnIXmh;$_i7-9v{v55ELN|1uX#j*?c`zOUROJ;|-YRM+LUFlp-6wR+ zbRp*xNm57e{|hyu3;c{)5N4i{05odz3uu%GEKH>jC;LYnTcnFU|90j#K8wQ!X4pE^ zuHn*&AM!4e;t(<|d#mHiVNx>{K|4e<&F}H-7!-88Ji>W5>~1PK6MMo4QvaTZZ|MF= z230aGv1i_q0cQfg^wV07CyRV4QaWJLGi9w&%7Y9}X@O~*qN44RNFoQzOM`Ju6u`xv zB?wup+~xPcXM0Gg4+rcE5&G0{o*T+B8}tPsGNJD4L%Xx)yZVsWZ!AtN1ltV1hR<>|N8dslzy*-ULBNy#Valr172<#e%^R6TN2}b?1 zYq8O=kimuUtQ7l83#iH7J0Hczsvu}^5^J29@iGmHYCjfS*l`R6*j;}U&m#Xom4 z7pt;8d$FBy`o}FdyCKV=Vc6H~o7CitgLB;4NO@4@ae%EuRYZ{zhh#B=mS~Fie4)|n z26zidD@~^el=B+V;!ptGMEl}#mp4mm8A@=lRPPew?`(O4Rf6DZGDLf1XV>i*Wo*FXuqQqE-|<|H_uq!SLfIVVgzLdZ@tfW#hf+J9 z$*|}?{f5{rAUt(>0On*rTl!xWi`QqigOGZxPcIK--Dr*JkeHsyb~-nTr4}PKrK)_{ zof+~+Nh$*XWckt>8(6agUDUV+N^Sno5!M>00ZK`n5}bRCsfKWXG=~2n^dvoc{#n86yG>Mw#K9U61q{gdGM5{mkcA%^p&~KI9Z= z)M#forwoW3-aCw|@0aj8_*y(NT{^w;JoYcX&`=O}G6q==7b(rRyIRo+S#+X``?vDj zL&E$FYjcn+CqJWF@9B=>OMzz3mMWoVXtPte*zNdfRW@4OVa&cL;@w&;mk7IlV!C|& zA&fspt)$Z1s--uu{&X-WTR!}O`qa!TmLTwKllbM-l>OJT*F413uYGHP_=lkZ#4w!RR6^4*wnud-(cI9%uKj8f%gsRKTfn)BYT>@KAjEbN z?hNG6;r%O92PK#|T!;_tK$i$q!gCW^24sN&1cg+rDh}=ubFAQBWo#R5?`ckz7z0zf zXUUxw%zInbqB{vm>VIkM%d%_52MorOq0$r!Pu*kWaLt{lHYI^J48rgwrkM+q^}wr1 zSI6P(HDpl~o7(K7C4}JtXMYrZ0Bg_Rd5<4ZpXz4%k?k0qG?)#Z;me~~YTECtR6x>F zm6mw1O%olJrk=&e&f`#>7hU`!_Oo0y_H_nR9!kdG4P&WxMQLD#w?&ygx{fowgaY*< zuTOZ#_Fvm>B2(MZSx(AE?9Ra(sw!7JBfO`_q)#NNP2H4HmZ?JnTJ*4WQJj-n;JJP1 zm{Drv$l*WXDlU!igS}j1-Eb#u0`U2IN4)+s8M)YOyc_6L;+$9x1MXTv^9`)8man|& z_w9K`P)6MUU5n#FWLKFsg19p-q8dT8NHHK<;ay9V!6m0jo`ETnR4&%&PKZB5G~a4Z zAH90(`@m;z)-V&NBvSx1eqB0!*=fp}ixPS5()u|D`~jgXG@*Jf>cFL70sRFcjet zFczxElSPNocgB-ywDHkn0t}dV7Jz5wIrnx+&)Lbuz$oO+QHvU$s*NnkMZ0Z;_a2{# zxt#XCAHa=i$-)s1NWeCi?g*?WNNl0W#YsGn>3YQoEvvY4eG=P`RVXtRA@Az z1TE7AesRyWme=!CK3%Ql|KHa?{CFB!PV_rtq|uspl<;(LV{fW?hIm%YJd-WZo%EfG zF}2LrhhBUf;B<5UC$p`f&7xRPrYB0sdv`Zti|_6MlNyzl8mRVC+1+4Y&x|ea6>8sR zi^28j%`hjv?PSa~Va>)ObFg5B2m|dIZ5ErTI&UX-DbGXxn-eFqKGk(-t~kQ8-?5NB zu925jJ9{V5Ty?%qaoz$r@tb3q45Z&(h`VNJ=EP2Fg7f`%6_9K)+eaG`V2N`ELs?FY zP|yPy&Za_Kscfoi#ZrTgP&K{RvTGY9`4qrm9??>LED>k3SYg}%&lmtBFm4Q{{DkG24BOW2&#~bX;)~AiJ>>_UXr?T%h%cRJdur5C@ zGr&*fadOhOEKd?VvF$gxsH9!-? zx7p9X1J@fSkc$G05mV#Uf6CT#nof zrPQ!{fx`o70f>17({!=9ZKqp6OE&E|YBzO|7~6Sp9ix%+6gqvo${ytLHWj!R=9~wX zSNQR%UEI0HE(s#gwctzA=I<9O=c9tM#|Jl^N4oyy2@`XY|L)JOdBJMB6?M^B46cad zAYeObPzo8jSHSRAr;#6Utm5hxsXqIpbwhVV>tFZyEb!U#o71pA2@QvZ}tT@OjmO7n`4nm9#7D5UWpEH7o`&L z0NJZxMY6p?SC9UKb)WCLza%8^c^P>>OTp=cUFzL2)nptrD(;Vg6g1)9?cImbD>3LM zP2L5S(vB-%logLSC&pJ5eb@D=vyWljbiKhHf4hC~(J=}!%rJWM-jTD5g6^CKVci#DY)G3<@- z``_IqmXzPO+p9S`ZHmfb;#7#}kGcr&_zm@|W_o^#6@<5`JLudytB_LQPEF;}AjT2J zbE^ctS)!=!tG~Xky5&k}D7CHlzNg)5GDrL|P%rvxrq;?Vv-njmlSJ365XV<^hayMr zv(%o&SK&=4XOB#Ob=ea;_V;O7+0XeE4#7ygYX3YZuP9&%4i~a97-c5TrzMp4O4?Vb zq|gyU`cPjvEysc0!bhbIfd*}MEJHIB{%=R}78;JRRsUCFV=)vL6^rD-4#1jnyso2N zu;KDC|0@R5hcF$D%`Kq>3oy1p#`KkSBu%3c=1}VXYDv@;_+e79Qul}T_9GW2NaZk` z)5mXPUVe<)j+;JFCle)eaR8AZtH2co(<~4(CLFFvq;OlLfmB$d$-^l#W#02wgYXZV zfpWbyFAquhK4%{wz4MMQAzgy&%h@{|?+NhQfBzB%;YrV*!*WL-|W z)1Q|@wZJCnWA-1x%bt&>p@<&gEfZMprcvOMGh5bAAw=b+w+*@pg7-%N?z8w;BJ0C_ zRxOT|`0E6+-XItj$uKS&4ty}hkghG@&9~{dq@9)CId(1oow63)DqQ6q5 zH5^rD>4t-*J4;gMjNv20uw{i%lhV>KRPRhFXl{MD*ljrJU$={;&NjNK;VPwmYc84D zX<76jDtZ!(D89$pZ{RVySd;BavZFX-<)Diu^MiR7;Ez*C-o4m9`Qyx%_R3o7l5dr7 zlvo@L(Z_6IevRc}0c%_jy2=c35Z?2N^*63Ws>v$uTP3PiouF?TV|Q>6R)&PWeKj*F zR7)P1?6Is~=qB#}nFxtnVv!`~Z5K{O=0ImojyGlxRti3~Mp&LYA!35u0n|2j#FXwg zQ7ocrGmk@VnvUng@Z(aX)C(JJE-65>0o9T&#}=9fyW@M1%@j4-HH_e5VajCO65;-y zQ1eG$pM;~ov__ASctG)FmDf=Iz3C-ka4$+5*%7V=od`Lyuhe58PJCT$!O<>g{C;Jv>QG8WwZd31?+(yRuGr|-kD08bwa4?gqLF?7b!lu`o5)_{l zWFj3DGK>UHCt-9MufD_8;%>zI8@mRVM4Ns-EwMst8c>tP2%9dBMB3+_aRJ)+wQ(1y z^<|b)Y;~V#tRl7LNWHeoqzg}#k_O|z+Gt*2>Mn}?b~d0meddCF%DhL3-TMDt zIdwVy)f%Tj<1ggPGeg3lHc;ke>C#)=7ZO3nl}lEVF?{Cu)*#XSbRM)5F&>ptoTfcH zrnyHkTq5jjhQQ8{!Xd5BZ@w`a+<7uVyIbrwhh2mv)QdFyvyeZk6*(J~ARatzN`XWk zxa%vf8j-A=Kw~NKEVM9IaF`!Mp1hD&7+q=EUa?L<1);5?r4#LW$-@sws(zmc~`o$8rD*ju>*dhcUbp+v3E9C25;`G&Dyd;|qq@x_S5A#!!oUZUc^bLi zBFqu<^=*Mh6eWcFB3JC;;4|aHyZ)TFlS~snO|_u9fG3h!{vj@s&NAkPC1&6A&o&7-h2}q~29=o(xPFx`Srb{6wj8_uOV1 z@!m;Ko`c`QV!tp0$mheR5@JT}hd@HatXC`Po;NROxyD^fs+IP>^|PcH+LKMbP3KUB z9S%XD1gv=XzLO08YnE`$95$f2yEl<~8(6m?XdUd9t}WEcnWvvD-AWV6=PR$Dj%mN= zdA=pg4Ik;5C$zjhplk(n?8gdGUQ4otR7gmv{0OOJIX{E)7f``4LiGN{X(_0H!*)!> zNUG2%y*5od5k)sFUeU$eu+mc=tO{vPV4+^V)vn1d?C`?j;}mxY8Oy1cY6y%b{CFqs zw&CDwp9a4mJCb_2m>h%biFbO&KZ&U8H;p(?0mDCpV5zs=7?S4kw>M~`fC7-%=K)qe z?C1Ndf3c|3xV=I63j~qdfc9$5c+`{&omG@bM9?n;=;L82w4V={j=Sfu{kO+o;;BlW zP0N9or!WM7C=$exI_fu^GPzp_ zP9{^A;fIm#YV0Ee0M!jjHTDLRQj}j7GSv*Adr)KFUIhwqkGmiSKS&YsF~z;%DT#k9 zISev+^Q1fC z#&7^5s-yhYXymXv0#>8~k8zub`(ZOeMrn%n??&QsR=AGOlvBStYF2kLS$Tq^+Qp%< zZ>L0I7L1HxCMC#J2q%vUP3gOH7c92!-Jf=24z078p9T+zT`o|ik|%1($G{wPOaiX9 zR3tC;9_?)eIYOZC8(|$g>HzQDT7jXvc93<7;QI!oW~7;FE}_g^=TD>E2vk_{_K}V7 za(nlkfpZJQ6b9Q{p8kcw{lwM)AMa^&QWqKGtdmNRC}8%kxu7(uJV}ovmyamS^es3T zNT7PGfg|MPw`uz{Fnf30>P(`k{WWc0@6Q|ttQ1nWW=T9)v+|BnbYIa8Bj2^uvNxAaIOe%|vl(_>Fb!IV;+v;Z58BjTL~LkAAezoETcM_(RzzJPc9& zj~|Xj@WDY}F^nCpdHlu+EiT%ngUviLb8b({O8~D##u?NOp`=Z_m0aP6K#_vcuzSl^ zo>LCD%V^M+K7rU9G@V+>+XUul4FTnvk|Rcz-j0Vnvvr4 z5yCx&kjuXbtCI+$A5$KLXXAZ7#-*V`$zir7ED8M`roT_!coy|=4b>uDX>lf%eh};P zTQm%={BIC^V*4Q{9~D=KV9ewGgLb-=i1}^Y75=?+6RE7?mCArDSW)`>b?%qa6mv*l zXP3ef{H9~9w+G%9gJXIpr(@Y|ntl`zb}cONp?DR7O$<=vWEW6nKb z5e{(lt&!U%WRFtCHA1Q)d4z{tSDxH<&*7t!PUau~P+FQXMw2AFqATwag?yUIuryxS zK<7Yka?rZQuhWdy#oD_4ZjEuRfm>WV*s;MO`j?La9(cw`gm+d@35`}ut5fcfUb4s` z-7G~tSUoBcb$>$5hDo{E8(NL$p_VlkjQszlk#3?d8d%)3yh9t#a8r@!%V`e2;&!5T z=bKsn71!1Hn+;bNfT+=R`8B@~*hSkH)B!6z`&}c%KbO8;eF-U6H zyCBov>ezd3e>*JI%u(|WmezKK_WeyJ^C0{fMP{$STh*GMHK89MB#wXRiIH&;?iqjb zlUcoTn)H!s8rceS%UFk4RHDaGe1LV^s!*~70#rtkXD0zMFR1f&9|fz`3{O<}z4j#1 zCYSn3g39E|5uy_1Zm(mkl=1rp1RoT$j<_1nMAHvV1&iPTz}?_Mp!N#{A~`-+vn5YB zS)rJ;Ge(@H=n$xmWge@Fb`lX8)63$!?4z+`A^p@mPN#9Kr5*EU-}}tO|AmhOX);>V z*zv0=gN(A5$L?=`81tFj1ai5+3+Gz$n3WKQ+B8{Q??-Z?9A1-%=Q=sb@MYcDeSK#9 zoKl&mEekPOK9_t(FlDL=&}z&I1N4c66~{|88>=>d*N(jBOi^eU*xgGC z5YNz!x_-V#TG6|zuRCU&P6zWZkg=^5`$LuXXf9?b38L&8dIkbEoMS>PfW&Ws87#( zwFf zIaauJeQ-Oy^627=IPIciC^0n#{Lh8r)f|9rhMCMN(TY?p0j;j80I)py@+Ubz^f2&A z!YNU4E0jIlHp5zCC;`N95qz}PcC1jcaAMaNNY#Nmy;z2$1}boz>mX~HPM7H3?c_qX ze1#W(*aeOe?`IY=@Kb2mlp8fpRwxXiN%+v^)Q)JKZ%RAz z8|&E7%7<`i28|?~QFbUIg|1aJl%%NALUP8qHH^6UAoRfZXKhIf6KX_iIS5cRvkF^k z;KB)m;E0v1VO)7~3IjnEqWwQl#T@oqOJ%NavM1GNh?S$ z5BKR;9UHM&)LIzi}2@I<4ShJ(4BOlEej_+yL@+D5oTregS$YY?Ov7P%V_xrx&6 z57>jj#04gUZDN)nQ{+ZmBZ39s;D!|02Zx{(j^g~tO^KXSTP7YSuD6;=k_u3Ner%obb~#_9QJ^*IEO(vIm^WQq7YBA@0;E} z(e5OjL0G4uv_^8sCm|cJ-BkWo1npYa^5Jim*r?`;K8_Ls#^gXH806;oIXkMu041+1 z?wx2u-J;(q$f&i;*n4Q|RB1$YhorEw#2&bfK>C1E5zigFWQzPb_w;|TI&9R+Or*1& zoLG0Z0P@Ul?M$Yzn$PLh{bfbro_MMVFWVoWH9PWO)`LGaj@-rFi?}CSTEX+G4;|9@ zx2F<~UBsBgzQ|FaJ2Bk@pbAV>q~cESQ~e0>_(PtxsyD*xpFf5}H7fswLp-IvE8>-} z;#gz-dP#kJxk;BZ|D$4jdx~t4;YP$(Bi(Rr{?`7FAI6wVVkPog?r)V^z@Q$&|hpB5DSfK4B` zi<~pfJLOhH9y)Aru^uTDDlR=;52WiYIXvcEZpG7Z$AIKu+7L#1xr)6?6}*=pux{T5 z$G1mSGkc*fL}UT5NUFEc61JI{bdw*tdy)QZWaI~5-Ct$2mQbN>7OQN8Z9Kp%aB3f) zRh^+^WDBM!u+>J#&Y%!RHdZ_caZ6NxpnHac+3L{i&A{hVy~zDx2Uo|eGX$M*x8%z- zk-bwbJwjRSXtu>%SHsM1vW368Cx<$%V)~_W%YNabVdD@XxCrp!Z+j#&8LY{j8i~bk zjAbxMMLjgT7h;He z{DWVU%k42frAq>KOF#0SfYI|(L(oYBKWKa(R~13(3&G`g_X1Re?;aH-$};A>ly6Sj zIj?1gHRI9?>6rMuJqHCH*IN zf$jdqR(m5%LAml%)i-rXLnS};^Tj+w_!BI*V+L0mZ!L?4&;9# z`|Ji8g&(ZhXfG4SSur7F>POaC>JVF%@X62R6mI2c9?BE=-P`#7MHPq?RUvXVRKR}n zDgxs#l?;m}+>#4){~_uwAaW*QaOVcly*jOEcet?m+K+DY2_^6Ik%pxSXI$ZoCUhwX zgFEl3i!58H0TX*(x@Vo6G_Qq99uZcsIl*FS6fHF*A-~zCUIJvNT>Ym!Qjw3^n=nd+ zWkSuRX$kWhzkH3A9ANRHbYt3yLc^0<0A1gUh=EG6uK_ZAqx$`NBSz5tBZh>QI>YW+Vc-gJBS#-O1anV;6rWDZ((7i=%ZWrgzSvI||s@Hsa!Q zgAqj1?CtW0vg+~f72hX_(Cc^fEE(r-yX%XNY8LLK2KmvK?TDcSLwN~Ae_&@cj01Ui6wucRqXb;CaAZ+e5)5_9{~UY?ncOj*$(i5h1ieWSs%XE zKyPm;sVPmrjwVYI(P0Fv?7jLm7JOTZZdNd*rq#b4U>P4G5}_Wf!>GyRU=ha}s5LQs zNqy|d1jHw}imIFD)9U}_qZfzOg7*`;bzA2Do)GVE^kKSM^RFr0nX&*xXeK7zn zp<7?O1!**M&Do>W+P4u=SMRib#D(Wfoy6i+!j*F+ZlJY^u~%{FIwf!}HBy?`*p%QM zt&swvdnfLdF$${_W8Q2WdqqzsMuWB81ojA{gHbI1+256LUv=h)V(!wq;{xSt@bb~a zSvEZwZ}4ot&RE%y)%%QbbLdgu!`bSJ@Qxg3kp&ISXHW_j(x9Rym?8JvUReJ12_}l6 zqNe50Ot!qE2xG-^Zf1A<7#-1iBg-IzGV2&csal260*rX$BM*LfPExbNm)>a4NsmYGM82-dB9+77SoQ7k9@%OxM9s!8!)Pq(lb2b?zQYX1EV z<&P!2-qRIW_pc&muheZK)0lnz1&e+mK656uE2QOjGK(Emwu|@4)tJm&=3Rj3i?GFgDpmRRZCkP!eAl~y2Qx}igAye&b5C!Pk`wt z&tzV^Sd-8tkKNjeJ_+j`X%Ujrm%~Z`bv}{0J67D&0CrNvcc_OdyQyn$Q^M_l|Ke zmfw-{d*HM{#o>zzPDcFpk&5!Rc`vl zpOV%&N90{S39Ob?&d#Z{4IPW4+$`Cn8;1UK4d9CFu-U2onf$gKF1ymu-KbhL#lE;A7km zL|br`2Jgv+zZ@7xru>b(8Pw{`D$wqX4(W`KF?*Kb<8dO+eHTX-A#F=GySu|XUKDjF zoZ69iXxmyV?~@E0=TS%L&z+k>C;8 zb+tC#=b6Pcw=MI2u0|S(-`H2k%s<$``mouTWvVC0hI`fI=lCUmLBVQOZwDD-X)yF+{9jcTM**{N$olSG;D?wT990L9gm6rWdq5+2- zktJ1o;o|<62?1+~+oP@Hu-C;$K;n2`M%_E)`^a&Kuhtb|b7LaUM>|tl_nuCsgpLVb zo|`wz)w=kq5T8rngd`Ul^t!S`)H&tTAB;dqb{jYH)1E8WRx_Au(AF!u9a#bh$Yw# z?C%zXPP0^sy`(9cy2!2kcz50j5GF0bRRJB+1Fa(}#v zA=&^Q&Pi8d??tyE0+iet9s1*z0f^1RPli>;Bk}!>B)Dj^Lhf8^UK$$=@JEfh^e{x) zTFeYkqdTt%j^9K4plyc(2uuSzI!MDO+MclcX5>RbLKk{Plj8Cx)~P0w_vGIO44m01 zl{rw1(_4?{J~C;Mfxk%qd)?XEY$0{h`&O-{2*K!Q#Zb<15H5*t{7Rg-7UI?nuZr$A zp8!todC{P6^aH;bdkC(;kZj%pli`P+p`O;&sAY1MLRK4*cJ~4VcO{@xYq8OLvDGvo zOUII^Z7;;0(Fo*q@pC%k^zEkN0{uT<)U^s!HZQ_}TB#hgEWf8=!Ji9Nkv_#movBJ8 zTpanH=F!z_CaPVh+kNm!h_wxyWucp%*|a=AU6>1Y2s0}6+Sifp{F_m_fU5xFkru_4 z`?eI~UI)RpBdD4lv8&0Ji@}Y^2LLxn_0v6f?vLy>oo{1{Wrd33K?;%Ei4{r^XVrrY zA%yJyL*fnxf&sSl_R}gNuF?&s|$U26Codd?|ELbE$5`Ot{3Dy4Jb*C@_5` zxFHD-YvdsXGJE7!`afodt-o<$+SoZtRYFU2eMy{^A`HqJ6zL#w^95fyc4jWKh4m@? z=)b|N&AkH%K&88D!qZu{QK;R-p4&W&=cVNsU<}&Bb7PFCJtCWpp2(>nZsWbXY91AB!QkksnMQQ+jR1i$* zf=2zP#&Lg^+~8`A*>owbr1CSRPX8-5jTY-+Y>Bcp2Qo?%k-!$GAhI-f=PLdNqz?Bp zP{~r+rG1Vomw7h+Tz!lE?iUrsgSD{lu0Jy^VzAdbEafSM+W7o= zd0MAfiwiwc#llH1fG{jT0Q@k$;uzn!lqlP@E%Q3Lzoa)+)T&-gL$FxEAZMn&jp2GY zcb=8N;zcMArc?_jE%x4er~+x_f{fR1PHFVUawVj&ek%3TuM1r%n?1LQpB5N#kA2(Z z(*A-!5gzQEkuI%~v@J7k3<_je=ESXn(s6{U0>)mrw7@xlf0~SY4l12 zR@Y%$7VCE-g3oqlwAcxg`>&MsKdv$-6@jRkn#ah_h;!gn`M(5c?U(DmUB}yc0Mda7 zzs@?Xn=8%K9*pF@Etjm<3y*h$4&98YIuPNoo`&d>Q(`mnY*Zv?Yy2Ur zwtzTt6!O@+E49e)uyod1F46vr-B*m}&@19{=PeW%*@#*agEiibp<#W>f&JCl`apLp z!+Fs+XN%ED_@(}Es9*oVqhjwqkWQQd({vS39>u(SD7TGr0YQ)O`|fqXg6af0m7T~~ zI)eSXPCm|yAKz&ZHej+EBkEl?k5A?ZAi5W`U(B@8z$=7_$3Jgbh97x>L0R=W)<-8) zoUTS0bf63@6Bg8J5Rs_bium&U_151-)Pd`uDM%sMHT27OxJh?d5x}sMl8z=vf>-sv z9D!^NcrgSVFcoY|-UYqsVP*{0gweH_xzi(Fu6V&N=j{3H<^mj|u9b%o!XreZ_=^$< z{!qDQR%qu}!Y%uz$;l}7H_BRp-#xd4Gk3+TMjy)_)(5dsS?Y68r~@#K)tjA0#qb(? zZVz0h3L{T+)3FE$J2yq;Mk@`y%baUJBrhey9oHU~lU|+Y{Y-+#n*fcpkN^0ILTMVg zgiOig(C6mp`@n1&o{eh3XlDGwcDAOA_UQ$L7Ie0>&}nY3$Y>Eee=Cs5ta$63hXuqVVN>n4ynJA!>$b@epHFx#cDJTSgbSX^KFrkN&t${KF z`KObSWTO?1D3?e#{PJ0TJZXMwgp&>g6{@@9!k0e7Oxebz&vdD+H6kuHU@LxHSTt#6 znDrZuQ!fP8hkt*$lL_mP<7;wE&OdA!*ax$$+)Qpe?d(c>RiNJO*}#}EE$10O^ASrR%k{dA>mg%2R!Wvx7oVRSCDOL%c+b$@D@W+ zG1{}gi;V3Y$d%Z?$G-LvTDSfLrqu$z0H@u$MaxMI)1)-LEF#&eR#xb3`0`Kcx_Tws z*SR85&;z~5teMMMFu&2=IKt0q0Kui5@5u_q}k$5xN z=qjr}xw-1M?+j>rW|fP~A1spuaW%;JfF?~G#BU^_C4_3~N~a@pgJhH6dL)BG+Qrc8 z$N3xntik1#td0kc;=0HAUiekSHs}0+?1RBz2IiCM)zC#RyQ%L;)W z|9*yL=IIh7M18w~Us;URB#(q|-&&282}At{0@WNw2)W+(u zw1Y@8jCM3-B&pKW2x(2hRE8G zm<|RJlwqBWmIXy2P+`f0M|?WIr8=D>!oTx8tu0 zGeff&T44GB(|#O`xLx~WC>)SmGKc9?ej3G|4ZCE)KuUo{!lTXGJ0O?0{{eO79Cqt3 zaScVEH-sQx**|8!;_R#9ns~7&dG^&N_zyQDPrU%@ye#fUhY4=g6!*XkU*8EFjUixC zI`8<5`dlkYgiHnv>00$1-zqZtRiqz5>o!m8hYl`6AX#QtZ$5q0Wzx(_gCr$L0;gS` z_WNk@k3X8=5yVj&_zc!Ji-c@rEYi!NkL|LN?!oPPjs8I>x#)>GWl3W;J?;YXVk-yY zAbyR0^TE~*-O}G0Mfcn6A5sx)1=C(hxX$snXxoQUu=wg&r3tytyz~QG@clbb!LxUD zyz#hT#|#Ag{Tj0YUIWn$x0IDu;V*nYz-@6%%?@*tAUrL<0;S*b|#`qgna{N&78aqlF z(x(lGQoe~taz~~G#;$w-$6TaTKlTw;$1O8Ab!U&5RtIj{#H?~g373by_fE9LU5Eq- zyx&~&9D}hCUVe_U$Q8b#;I*f2MAa)9hEG1U+gn%k`8hNFdQ0UR zB#pp@9~^{_XNq zwZT*($<=mpvGdUinuV;Z=ltVIu>nxOZ=tF}e*$u#a1bHF8*;&Y4}+}kqJVvC13&M8 zy-V7Fwc0GKx{qqU$*#Mi6jWB7WTPI(Q>S6hr%stJDvWft5DEk@K9syoRKP)26N8Hy z{bQ1}sj=5SeUri_nCo(Z{^1*^f6}lhs_NBBM;G<75MMCH3nA8y)$05&y~BIs{>!#2 zyKcrXu5;tHC6*x0jH&a0gQ!q(u0nByVOqqjN!q5RYLyiW_dse`mwe1+zb5UI_z(q3 zoVl`HTH3`Rnl5*NiORe?LU}Z(OEZ;%Rb{pcjKVAb^l~dF%TPV2FV?F#_(|EWX>;~p zw3E!f2s2ep;#jf4l811E5C?U`8TYaR`1a)*($GO9#)HLUC63k__13USL1s3d52BLR7Ay={g(^E* zRBp#JJ~&2Cyz~5>Yqn|KtJ`OCvXe}6?I&m3yR{b9iJ92X>$sr0Q}uI2>c6La+8Bd` zDdnEgV}*d3^YY|2udPkT?CwF+ud9l+Zt#IWW6#Oc+WQ=}g33|{|5ke_|G-j7`UpH9 z$RpuGz!N+Ohq78;a?A~+|1o$iWiiAw>I)3$HO2vsV6sixA}{nInJs+C*{objcfrng z7*I&4$A*mN^o(T-@556xksj=N0rr{`0HtRMZM@h}u2IC`&!Muz%K^pHYKm$y8i?)y z8fje@=!>4aSp{7`me&L~=B)Xmt#8iTV#hj(bRNow-_6TS>}mN=iz|6V zT20CZKuG845ny1d59RJ34y7P@ zQ;R=ZbD>kzd@ymL^eObjY8Xk*At&nPVs+X^OhZJ+dgHR7LIh-y-4iLjrfs(EV~LT- zjkIT;uWCND$n$XV;3^xh2`Cqqtv?nE-4|SudJ|^)z0Wh*Ek>jz7sW91Q?k-RjZTQC zdbq8d(Fsmp=Z%7nuvSLp}RY0#i2@aEar^ew0{0X<}BK?Gq7+Oa( zETAn}tKHUo02T~1MEUAkrE#0%Y*1p$_MtYnLG6DG!H_1vT*5jLY>eQ&Ve~3wO4H@v z&)aYWK}TLaxLDJ6EJlyn(0nU(l&!!ovx07Nr9+o-m`FXBg?22I{y0AwHu`4lHFk>S z6)6eY?)5u)H(!F%Gi zNf~HD)NL9}Kqq}p`x2%0h1*)8{IKXF zuu3l?_E#vtGHxzR4pJP@m^_`&>ZXUYKL#Hwk5XhApu{j)(ib889D_KHd@y;1UvEfaKevCgNm5wid@>yGFDZtd_1@d8#W9W@8k&{WZAEly+3rFY4Qi~8dK@E2 zexuVdb{E|bPIFH3n#W8IMu77`vV7=Ok;yUBNzt^*z{=Nh9d%^$XIWG#R6?6SegEqY zV7sti6HkBz_{cWpKkHB-GApUio5)~Z8#2!*#j=1o`ng>Gf14u)6jwKF&27CBFK^Kw zhTmwsD&C&jOgXFG+BThi0hiv-i3L&<0x7sU%WST;{Fx=Hdl>#iNR@MK^Yz}fRY8JL zaG&M3>?5+5-oactufkX>yTvsanfS$_Vxx4i#XS1*tjoGCTK0up)PHq2Fc!@cA*R)k=Jt?a|)4w z@INaajs>}jD$z31q4SXyP*mSrvGzd698bRTvNEMYNh3c2t!0b^=hncZkt|sG5(`-M zqD?6Yj!QdM{CAg>waP8J);didxTcKf{nZWdo*kzxsq>HM#J8M?``fs%?J@SYJNYGN ze|&1W2!3-XKg(LhkYpa)#QOA#W4^x|B{Ry=YEASLr9?@?&z%0%gyM2Vxlvb%M<=)- z(F_Sm3FD*xLC?5aObbnu?+x@;v>w!Ope?f&E%w&9c$3gfu^(&1V{+d zIZHHyxb_~JY8oD#Q65)vyXOmXu?!0Glhr z8-E2}%-4fES6)qEBR~!Iv3=`QE5HVW5m3c^!-OoSnX&2rhe^8tm<>QSC1D2{?e+(= z4(g_G;OZoyPP;K?C^h@c@ELS|xat#tjt-TQ3Gy8{_qm)AkIw~Ux_UZ^M79+7$k`b* zW4u^B;%r{%^S&>f2*MEB69_08IIPAfU#0UQFGbY%`-PmRB4JeKPu&7<@FTd-%PTW4 zA=P8FBbEy0fahYocV64GSDK`P+4}-I8iAR*q0*V)4G-YL=j4P7K%gFbpZQM*Ty`K&9! zrDBGEzEOd8PvUBFg>{F+6ChPQa6;etv}##IV2NzUR*fZX8;>Xedo=h&t(?yZ&Pq(} z7~;xMP=wf#ELlJTzgT`8RLzg%xUgL*zl)RmzdOO)s&6!8LKzECrlPJZ!8soZ-ekRC(>xHai!4^QC?N|>$BTDH0I1~2B!{8=p zSAphjsgwPDAbrK*p8_FRJ8DNZYM518AY-<95$`}sW0WB8d>ZevltKC{P4l~VB;*MU9 zsCCY;D>fdD)pU#4!*y^AyEhe zW)m$bqlK<8{eE7JE!*wi%`L2=;2A^3HB%$JKC_nir(DIUm#ZHT5&}7hd)b>Fmhtif zIa<4t6U8fJ?lWXU#nC&Nax~~v@lqjM***hB*SSC{tCzQ1_%)YiSkdUo{Ncu~tEPrs zP>Bo7tWar%uFwWfO@Q)`8N}lD%T`B(BBIfVNY`1K`o*YJ>S1XFot@`k^is>hb*b2g zXMv-0IsYkU?jOp3u0B{!l-Gu&y6w-X%P+1uXpOQ|{#_6(l#wuBoRqT&}s#L2Wf8x(TbrWIb_;VssvyI4Og%iR^wuJEjO-Mm(CG zXf~M5$U*^6t{2r3(7As)MFs=vR zysf2~(fB4CEp@mpt$&4H!MdnI7*%8sOV0`cM?Y0|)4#AY?GZ56b5W5hQpwJcY-lx6 zTDFxd1_k=O{y`Fq2rJ+F*_KO$zX+c`MHBnnikPgZm|cHI7TTXA>;H4gHF;!$XXFFR zuPiU(`k$c6ZzkMf{K~fch-2Ia;htzx)#ACa-)%q|gHWL7bd^29rO+;$@(vzmAL%{s z8#qB8O&ZP#Dakyb&StHbTiZsIbn1a!MmE8rKQQ?%EtYHw*TPt-IahfCud*frg}PUW zW3UZCGebu|CDvWPaFU&P16vMgUmA9}=5H(z(P=pgAhya}JBnN2$)rrfP!d}8s?%w- zKs{s{c7T`WsO|>jN#;rPZ^25SO*Cd}du}}6osjz_TjpC<>*`dywg|OG_SWDY(f897 z_FpxTNE0=oB~749*n#R8)?6(LM+`u_k&%D-ObJ+*g^}tl%%pz{z)1w93U}QwvJ0bO zFbcWg=mlLpqdj=$m5r!$UB%AH>?}oun|j2TBB$^KN*Y66x|ATCLv!~R>!ghUTo4E3 zVZ{U$X8@@jMO^F)S5GRd62sUZQM)!{tZo;qFXJQj5}RlX6~+%TP;<4Yqr^thZ1DQ+ek;N{jgID3mcQ2;A?m=x2eEDm7qw3*(Zu zAmbsq5DS^x$%ZG*XpJVnA=OD4*>qU{R#TAQ^gJupLXjcp^G|6Mu$K+@)Y|W#YYhCZ z>c^VYei)#^q6bxgaOA4M{DUpJm&O*gHx~%P$K0z=5CIC^9KhhzgI)>A$$qXiUU8lE zO;GhupR}Kci%&neR$BJVKi8OAFIYPT$JXS79fl;k01=B9Ky55`zR1cyt;*qmA(q~# zkq=MgAs|b`5f^5>Vq`=_1B@eK$(Qgi$?Sql7T~i`jy3og&V$amYoMMl8Kq54l)_+5 zYj{6mRtH2p+3v%P8gV$hO&}E4g>uM{w$U=P3xZtknCa;+b0F35GiMJLQ=*&bjz^w* zL~et(IQ481zt=}>a9+c(J%dwVhA+fHr>BPh<g897?xna`iNGqNE<~?Ry_vG%IJOW@0;pD~0$8EY6n9-9(4{7$x;SwJPXyHEBG_%C z%X0xQdP0pT{OKQ^irDUfYM^Y0j8Apx`?cIxPxH4Pa zb{~O&W9RqJd?rRGA2y5LKfI4@YB;mUy&A7seI2;d1>~onKqZxHIANBSVxpdsz+uI! zxrF%O^+&t3CcP!y6CX?5!^>+EoENtNc9IFz%TVcNV|4Enw_yyA7^ehkY8w;iK@=(o zsvhufWVM59g)5bXyxuOn8kdO+8tJoZb}@iYHdp|B8gC32d(au}w`@5rHt3}(A_H{U z$ggF|>zt{20naI8LX(4&b#DQMFp~6_Q_Mo7Dy1bWbCjMu>OsT_2^tMe%7HoJ$lE!k z0&J3@>@?md5w%E!jE5PSVd?*g&N{!V;pz1An3lYA#ELw=G1@P~a2yl`X# zfoJIS@FXRt8OkOp4)upL8|jDk34?9KNUqVvnSP44pE*-SU6!?27m$|m{p-$Z+E|h; zVHHs+*F2~3 z&m_}4N4fB2|9!Ya-YEg6sX&X5>2bYABse5DAQJ&*f3t|LPqm%uWI(`CZ$Y(-tW~+R zW~dkQlH>&excY>ItsyciDvw3$mA&{8dQ{Wa)IuP2wwKG-gpEKVkt7bmtEw(*lJRVt zr}Iv~k^$;()`eU{$fRfMqbR=bz(Ee6}Mn|jh89mL>p#|BI*oqES|QS-Z+N1{!1 ziV%9R(zDSMYt1vJk}X$~qjXc^pBKISA8YQo4FLSCaFr|s@+>W35K%4=)OH{6=1*_; zPphg6a$LcW^otL-wv%P-HbPFSg)P0xEOXo$;F{47zKB?p`?)P)&9kNE&rO=GX@mNH zMf|T$=ELuMGUD-xeYj>stScpJ2O_R#Dc1`Pti1(f^Ps&|yXZIT|ETU*JZOg5%bEBw zE7W|2)5-`0N@?)UF$MQ)Bs;=;_tIgd^S~_YtSjM-FQ@H<+u$SlX|5jemMtIW5Ua5| z=XJj@A2wHfiX3ANPP@eO#TOcEK$Xi}lp#Fgp}SZ0J)gGe{h*dy35HI1>M^y7&~^NJ z`Am^O2%STM+Tl~^GLntq|7yqPZ(9I59cadxciSpTYw^E$85IpYzFe}?vx5;~z=!gM ze?;eXTygYP?N}}%%e}!BHv7SWT&(!h>X-b4AR^u7(8jNXcZRQ%Z~NQ=n=19(@?wP} z>gJJU;|X+n((zPYT~uAqLF|l+_4LxYL{*0wNJ~)3#VUZLyp{I_QH&s+7LV6&-$-H& z;R_Qd|8Fc9J2DCV8W$#xGnZNMTKs^z54r{RNKwK?(FTrrJd%7xiy{Q%IUE@>`c231 zMQx-}TWHH3nxx6~1pLt0E5JHoL0CoOeZ8|yXdwN9u5EUpyM{d$M0KT;$REh;uZXy7 z3{!CSAUggR2!&1xqgEcLmd2c9N39s|yscsB58}EBj}v5e5n_40h|wW9TchEQvY;Uf zCbeC~NAW5;4BF~--j7#iC%=$)ZR|O8$GK}3q<@AM!+UBI((;x=#t+<~evQ8fpUg=W zW6AZ+l6V?-J|ma*#_>Z_N%6-WLl7gJ*KHVshpv@bwe4MN)Ib`2iA97bnTY<{2$lDI zE<$^O4@}GFu+8n{JIJ zfZK@PT`2QH_DKOk6`ZN+=dXKdJkAE6Hx@dc^J*(8e{T^Qn+TE3wCy|O?Q zs}|?LEz?UP7JI&G{(AXvvM!2__8T58j%3aCmao>tlpTzb*k>Wc?1MEx&FE^DCu`HK zss<(wxv_L0dea0tc_~{3Mu>?o%CxRKM_Fd7;%5x;ibLVAKdE4wonh*`SrkgDBth_egM-J8Rs|LbYv}KKmgxg>od_2)J&&_W2|@GGWn8Is{SEK zH9U@JgH?G$z*atSww!J%v30fZ8mOZ!{L+21T%#gM-yE~YdP{gid~T*1#|z~M1B*3< zdWp7LWp%#P=H*WiBt6m3;deuiDPGww-G2sk223gf$!A=m&;msY)ygBJv*#`Ugz1nD zN&7EeNM#Oj@k+-Ip;a(_e)!L+)HGrbUZ8_y66t`%*Qy*crAhiaw)zyU@!v)+sxApu z3C$y`Ag*rvH(@nn6}W-ck`T#(9%pN?t8;Od$$Tjp=VM_fnJZ2*US;0Mcopx$mCy-s zNp-$>ukD)|_2PSHR|qhKgdBsEJLNst%!5O_Zh7jCx3IPk?(4N5=x)5R*)D8d>Nv zTI&|F>?^iW8h?YA2Qqc%sbRn!>W#OGZphFpYzZ;O^MC;;|Kz!mKI|Dn-nh!ZlM0a5 z^l+cqJ*OH#fMW-M2|Jl%yLeTz28-s1It;+6m1>((0S}t{+53K#z~rTF2`0e2_ZK*( zHxP0j53eytXsg1YbX+4UzXG|#^7VZ{t+3wHB*_yAg~k-ehU6ftg8qT!hskXA z^sZf07Th)m3$rTc(dcZ-9KKr{X6Vw_-Y!+#p|VPWK&P!MI!%M`B3O=ZLiGsfbhDA{ zQNU>0c7Cu9%3sp@-gm>UJ}rf{sl|JP(!2s`6Udzr2&2B75YHSF>M5pc!#mV zPOQ9Aogaj%;$fS;K-=(Si5s2`11Q4J8&^y#2k|-09Xy> zUVnrd7t*4m#}sFOCs5H^@9BZI*_ClCK6H`#SDu%}k0bMO*(nK$|I~?F&*jIB3V>@8 zbSOoW*hJ0v*;c0l4S3j^nV{L{z#!FR{8}{s#@#;|In&T z*{i4eM}u~blj*Ko-{*YuhDrZ27(GD5?wDbKqHi`?kEWy5GL5+lgaw|#rI{Kfo7%fr zC=`+##_Zi}u8;wqO3<9$hi%TS8=YBzAqD?Vt@K%HG#aaNu9k3sL^ z5&;I@+IBDSRxoUepGBI<0{A|qGMry%<#v?C$Sym92qw33$WYJO2qcQHC_DOjpdpL| zE7%A_91adHV^^kclp_1g#@Mq3>w7kcHfbiM6L=hV&Ihi{AQoarW#^=28Z=Fs&CEh; zWl$fyYye9b5G9!obise$=q|rWpGn?!vc4VStmyXrsx>-ta*#1l?%|&RTb5{St*Duo zxKjGwuZN{5B8vglqx>(RLW(NgYyVk&rt>6 z(7T8IzE4GiWF;lFrxYTw?9n*nhwkY^fs$)H)~4SH^jmeXpD}g0XoS4?-+#(~Rj|I+ zcXM3eMy5DkWpeyjLMSizj%1f(s*=1^%-u`moNHi(ymcHjqJU;wA1Kd*D+Li_W0fj5 z%4!dwfttoc+zkk8R_) zj?J{5`Z0&FMdyAQ?~;!RN?YNKPIB&$?gs92!5fFrIq#X}>{dED4FVt19FxsVbKgHL zIV)+oS<(Aw21-ED`8z8bq6NtKq*`qZNNIaI6m1!$J0Qj3`IMMfv)yJPy9FN6*gObqz~MyOrOS?-um+o2a8EWV0rU?Y?!dRE!o0i{Yw zRcLh4xeZZZay<%=4Ncrv<<*F<&gfkHsUpm@9MU3%*XmzGEIsAe3_h4tE`kuQrnt@< ztN9Y-<#4$ZdvUFgoV;r(6jMRgwdlDvScfS}^%Pj|YEAHm?zDq>hC7`fT#RiGa^4W5 zyL%_!dHMa2jyTaqw-?c(j@or{`#-Hl6C0V@rK?4k%^c<-;non)mqMef^4um^|3qi7 zVMvx6D^>ZwKl`q)u(mTxQKlAeDRzEh%$??^$bW;BLs0@A^0J}^3r?>JKwIWv`2`@P zR!q3uZ$ixI14>1h4fjE-*}6XsMp5|HgA}0QY~)D!Y=NeT;NWViNHXgdE%{&`$3j%1 zr~*+DZEerxYVfxevvxQf`p9JoPXIpv72@@X8#TGnydj$L?VVov%)78HW$325hhC98EhQZ2X8PYTYs)j=EsJ!Cf~P%(PRrR0AxZAk}g5mP8%uVo0) z=51<$`W`!kWZW^H#@F!pk$;iD1gO1V0kf^H6EsZCLg9;Uxy${+0GM{a7K4e>2TDA3 zJ%xxt<4@O45xP3%l3!*cPc`w@mly;9rxVQmYTeo#ue> z3MuJ9gY{cxmU+jF^=?UvNs_L=aRz22habAH&U7wEz``Wu$ZSW8q6q@Rc)ji2lJLl1 zM4BdMx$xCwZ&Hu@IuS?|0^@?U)Ol8q>D@+sAK4AO@1kSxRV8>2(c)y)g}ckhcPD%W zX}Du@pxR!4iF8v%%qSiqA%EY1GE#4jkAbrm%wX_GnSTI%JFOPEUgB4oL7`jKIIf`N zV{(4s;!U91Hd7HBQO6U=8yDL$&Umcr^@hT~I3!NaD<0^?w#-Fd!l-XEuO?P`8vxdk zjHju)qMME#tPQlB#yDO_nTQY$H^ff+JVTWypwVa09Hqxlng|W1@PKq^=0Q8?2s|5& zJw-u(aIsvDrvSsK8%@O4-1}JIs)JGwGVI zPsn;d9IxON!7GtEXXhKKSbtjoA=Kb>iem8k8T0a}lzr|w%3a##NLYTR2|aEzi(r1O(EqlTt})EoduT!;a=NP*G;0U6 z^cuHL(hxC8TgJZ1krlUkdHv1~>6f{Fu;*hf?q*Z0eVF z?gdQ>nb-)9%S>vn8fKmrwxph+nSMK!ifkaA%?kObRi3H<(^chHlFp(|r=#kmcEf1} zXl@ucNCyS~GxE5RpM~s3d_B`~FOM!3^aj7&PPNv%w{CtgAtO-SJ-I-d`53m;&{4ENj?+{*qguk7ocv@JKlD@ z8R;mvKdYLGD?LN3kf~{@Omi<(bQk*mnN94P10{n>=Ndkbq4|ZGrj(p=&UE*|`1(O% zob-J>nMi4aNBYr@55H$AGX3V&U*? z!Z|z+(LYEf(ArW{z^r^}8t;n6Z?iOTjt15y@T=qr4c(f3-)4Xou0i~Mp4!5WxlPEO z-^PX9J}vGOYNXbhhnFM3;GtKM! z&zt^AMV;CiD#9FqSs$O^8g>!qZ97AnYJ;19fx;f5a?5Kl*aX758$2`x{>2>B+R0sT ztU3(zMU?VJ)YCjA|{3%2J=VFPu$UWF!0xY(4oo+Do>jHf`t&ZqbQnR3ntUdD&>GOPHw&| zEWQ8R#7p8rHspcmSd48~NWwtm(0Zx^;gMe#Fvm9kR>{&+DxI?!Jc;wrV|S1q)Qj=; z?{wnBr8(rgyjO;PXkypoit0m9(i*ou-}cft(2pzk=+BohxFL4{UaB~y;I z8(GXjX;3N*zPyiyshxL756l!(8Lp%>WcvkkEkKFXxa=b|I!ycO8MQXWqLu+wE z$`aLR6F^RVs+ ze#xpmYDvz2SJ3j7bbAT(?KjaXggm6t1JccYA0yJ}V173-i{?ex`DchQE7}3I)Vu%J z`|Agd`0S8bnlV#VK$@c( zY!h52l!p4*=>$7^g0)ouJ3z$0Be>&($9`tE>T7*SU!W9Rp1ADkI-N5$PCxDP+Vjuc z`UKh70}s{E6MW(L;mXCwxqd&`{9A~fDEwed|gsv6WR&UuLlVDC>Rsaxv#H>-V}CWGF}gQ);)>G^)`MkoJ- zC5+df=M_*Qn5<)5u>~v$mNu;Vnc5Lr;gHD%_g>kTUl<$F2ree;-dwYAc@X)`2*q6H zRd&M&>bd^*VffgOZx{9^w(nVLm)A^B@|$xo#*)|(TX^Re$v)T%K9#~#aI z70jq(&z&M>gdWol6X_+V4QQX#6wr#}6Xd*6sr^dHUv3hTsT)A+j^YQ!xbIdQfUuk$ zW_~k~eQ3&d;oI~@GgY%SZmo`dzdta~4$yhAu=C97`Wi`ug+)Q7Avb=|VN?gfKfK?hgr6P8&0@dp6=g@A==SO#q@_0dr>D6H~a*b`O7P#OPXGyVGSAgwH z&6X0YV`>GHSdgoQHl__>9Ii?`BTsHUz=D&EMAkz%|M+H+-L3aiGbYKI*dWSn!BAE3Y zN7D<_S7K!UJPeO4CX+Cneb&tSE@+VwnharwLzazAzqsr^{+_v(K_)#$J}+PwAYL8U z#K=+30C$q4uTfC>x*aKF?NBU!8fz9eZJ5 zfB;gA8Y-XTR@dvUi)#DgBhe8jtkC7PrR+DE|E^M9t1=qQ$fEsBtpMCoww5&B zLt~|$KP`h{C;5B<(>SAcoIIdo2hh*J)i?ed#J{k2FnNCq-|In%Eyy01l~6BUH#lxl z8?8tGO7vkHsSgqxiZ2BB2S;DkZ&usi>mg;m%s?L+*}wgb$XCUPX080rjzCB4vLh;{ zH65t+eH@B$J-+{PQrh-IY?$0q)HQ3z6X5|KV!5lQo51-OJla3onYO)Lu72`VJlI<^ zW^35dd0Lo2M)WmY7WITaoIQ17T#5}PtIgtUd-iSk_@+a7CS~*Ku{+V0rTXp*z6q#QE zY73acFps6QY~0n6>?gRxe>1>hO(9(A6QfiPYZ(Oa$VUO&KsEzsKM-m{EYq@jIhAy= zlNLu z0w4s88$uXID@h41)W#sG9{X`yZLlRm!Cj8vTaO(f@5yJW7*K|(c+w4S#(DSk)CA+Y zvk}>gnlDAIb#Q8~KtI#4^ciN=QSK5NqWdP%Z(FMYeZ&VRaP7dgH8wQrQ1sAG$SNt5 zL4eG_uTrJX3!0RTN279cy%aHtb1d^VbhYO?nT9zclCMfB)p|$_GK6M)|9&7|Mz#qL zl-ju*gZ!CUG9MLRfJ;ppAzLNaF|YF-F)@XFT^L@cAJ5NO&8f|&=h`62KqmTQz9$*Q zoRaL7q1X}6^q`%r79DY6mpn}!ag--K!(JFIkTxJ{Gq_DIvIbZ4oqZ4W=!_l=z%h_p z7RgvT?C4J&Qz4w{^`gRTSQv3cK+XR}wk}&1Z)iH2*rG5V7=^9E5&zf&fWFpL)qTp> zGvU#&x^CV@{`0e!4w(*1v=>iG^T&4zjC|_NhkMAkKQD=Bb7Gc|Nc3;g`@1V_JPUZj zS3~`)J;Lv&Gv^8K{^>&audgdqA2}|M^AzNPxc2)KWwU{bbn-5KY7Ukf0slct1k%;!#4cqt=SrL;>( ze9}2{cR+MZ+piGY%y6edVw^ea?<8XnN=v0PFfOP7bMlGwGK?8dTzp`)KngKWWrB}- z$i}O1`EWpiakp|V7TNS>SRLF}2m0B)YVMxBY%|X9Y+BAy!&jdy+?bA}6%|xYq&s7f z|R(~hRy`dF6*Wh zBBL!@hTHSybt4h}>>1iXp950kV-w;N5;rz zO4(`#ksz}N@mE#m3oRInttBx&?Ry&*j{lt z!a1t5D`BeJxG)BF`kKapQaL!zrPo#GPgB0d*1BE37G;6&>LG?mO+DDH2O7nu3=CVGcwx z*qsVX=+AjJQ@XSlav~}8Ce-eB+u2zd1>-ip*mUz}ucB0lZiO=wUMz7c(c3AdxScef z>TI)zIIY1b2Nxi*SRYELI_Uyh0ivb%99VXfGtZRyQxu4C5e!Z{7)(~1`ZB<2EIt3%;6+I(swe8c zI|P*gzFGTL{!(xP8$<$<@g=-aLov?^BpGSg3>dfZO=3Qy87R4>gQ2nf>E}buwl985 z%D==9WG(#l&Y%UO^jK6^%tP#Ssza#w216v?N4V$C4a&XIY4bn4T)08q8v~;2rA<(w zDDu;G^)F+ptrZS0P^pB^WS=P_Kj6S-m-136K;l4Ho(+*2=))W*B&$IZ3QXxKLT23^ z;mX)1U`6FKijXy@pH8Si8!oZp4GOkgXS?td{_1_fd6L-c(ad!cio@E{AD7a6-24{^F#Y2y zju#Y@Q{tMKJ)DJ>2%q=OWJjpC`EFT=>C;Mc)l)@z=aGmn)Y7)N7Tr=$X5FMFkJwPX z;Pft&n<#5E$yjKbgt3P7U%Or$n@j%j)W-iOEaiIum;IA)kQ_f;?2j(O@+87<uG!|sEg%3^ihjZCNth|P=ka5o8f8M3I--t1E}x}nXYa7%ZU1w zkX3=%iHHq*k_}s4jMQj ziOz`X+(xu-v_J9>71v+foZ8lNcNwB&K*#^|=p~?Y>$qy|JU{JYxC)_u2%$XxbICne zK=-oYg2vC1l$de`;bV8Ss#Fd443;3oYe8Q?h!ob#>`8CtNv0;P@ZI@hoTcosli?&U zJBoo<6;4;^SN1zYJzSZPV+uJzmoRhSFY^M;5C@sVdxTgKqDX8J3|JSX7@g7K#7qrw z#s%niRuPw=eFqtK9koB zRoh8cJT+1NKKl-)oNqA0?^S_%y`nC=u7SUD=IdTsE9{o+xetWEFnLVkScB8%xObCM zV^XNv4lGBa)*0_07s*rCpV0P-0|v;V)DJ{4brz$UwA?$&H45Jf)nXI-3c5~GIe+1g zDmF7Hcaq${=8*pRVsX*B1#PE6E-Ol9OXNGIx07QMWFesTfQhYPe&@g`TaRhm`-yHkNFBp`;KNSdmuT{Z=C5=CWLSDSK^ZI7OX1@vIoA^xP5ctRE@xCeHxy?=y4 z`?wHJtu@Uj5tl-fxP>;Ph_WlYA&*E`JjAZFR(qb{o~KA8bq_j`k| z1H$lpd8HOVbs2>LoN@PS4-(wO1n;e4U0{geD)Fauh;>C0b6w2j>~q=evY@d#_AJOt zzU9Psf7|+a7?p`it}+4YnE42nTa5!GmiM8@kSDh3|ROb z)*%zyd6};R{fhXeY1X!TAu;@3WejH$0SIUkgorc0a z$h0szZ+QAJTa?L*Omw)fkT{DOYHmHjg5LymIi1WHzGombk&J6*#CybRD!t@7jdZ55 zB+iQ<$mWS+U2lR`^4133IXOGGu@E4IN(cfYbQ=r47@~;DFCJNPkXa#}&#;D|m4_f_ zA2LWFNEc-O>yR)BnlPxEF{5F#vldrRuFC%5E+bt^Mhx|inyC1REy_dQ(@Afq2f^w= zHWjzgD^) zA~NuKwqptg(pAs_IkCJ&Sb%RO(SIpceFsIKD`1hOinudaME>(sgc~_8`()!-k(6y;yEu+b zpkr4k@Ls22QI@heT<8UniPhqD$j_X=1i+r@%!6CiC!$LQgWx%-y*nOd?kxqP{4`gCk z6oqQZ=W+z%mI-#Av0)`;w+%T$G+{%#QzK=;CVV`I%Q{#m4SW0;fbF>g{DDnv3?=!- zhfz;=N`Ic_RermU-h!%;{`(?qPk4JMjoVxC$iFtJP&GGb(x4j)tb_Op($lzHFI9YG zhi^%hfzQXj`msq!l3JT1OP3PiclKo5ALmu|?k@Bk#ZO@*uEB8Srws=`9+vNU`M$%kyT(2$IwnJ4Q&e6W8TVoP@{ z<9oYfdg}<+Z~{;KZ=D)oxGwU%7$$pzlcjtD2|%^8Y4@}ZG*}*^7-VKeYQahN8X3yd zvQ3nouH8KMv7^rk6B_VX*%2yprC#A?nu}H=3r#D3EgG zwqen|uUkyfQ2V3f>YsSzEYSQr$h2UCIn%J z#GVr`wey*=yD#<{P5;NG&b9J}_lPq2be=r~joMV;z+y@Je_{(>vrN?G#kRRCvTKcc znr^n0C)LC^jvn#}Y0}VJN^~Us@6E^LH)P*pURCjUe_;ja;8&t@{!v+#kZ=BF<`9zw zl)FSraeQ;RSRh6riG_*A3xj~&V50%k?3k6||ax8vfCGftwoHS4LZQpb6 zS}p8eW=gz8UVOzBg3tQvUMO8Tna6`a2$v=!6sM|II|kwQR^v1i1=x3=inu_4d% zGZkaYhTswtp=)8i@y#hPImBs#^s7Xcbl+_$|7b9R&(Y_?*9tZU4nSiD>%lb?G1~=b zVj^VC%{uWYFvGT#rqAO1$FHSFa)dwGR-pggv*U;n#Kj|(V{2a{O%k2pu;4$0nM5z) zf*!5Ms>k;0?${J&(v8HDY7svC=yVxvn5Uo+I%qJ<-GKSj>b3VB7bB$*R02c4q zen2*`39)d#*D4iL#2%>BRahgidba{A#*#7>H4;h^yGnW(816IJA}i(${L6~DCdY_! zdbmHEwUEiZ)J{P}!Hn+FI+*C0VZhz>IneL-)uyzvc7h9U`$ETQ)6fSlSMWBTjj;sw z_P}M6<~O$yW%iVct*oP}O^lBdcqrhMOOn?eWz6};WB1yLrMf5@9ue{?!Zno)`Run% zal9KWvDPuz9FtuFy$V--c1%Zwn$8Wkg_XQ>4`*d1LLP0i=yjz0CGRv*3RGF0VEMNJ zn;>BXVTu=x8de@KM*T+BTV?kb&|xbykHQbOO*f*u}k3#gH_N-5LqL z{W6u?x-8|^87lllEIJFh@w$atM)Lfl$9b==3NwS*y>=P>dSvI*`p^Ebfq609KOr)$ zbl+Kd@naLu7gTZ~d#`frnW^IKH@d3iJ^m4FYNraXBV7l)jIh|VOArI(*rg;Y{M=rkj7?bMEbA4tr)s@r z9~@owKue%*v33R8nS(8)t9#~&lui}~%X;G-6F9LB`yhVt5^5(f%RwH}$Pak+PD;nV zHR-#%7jN>z?hmPe06I-0(WJcY1lfh(QA&ROXZNuDgX13d&T&SDv@WeT4FmQygLm9_x}db?9r{;qE%Llnvp)1u?833qxZch1ruB7K@dUdy` zLSsf_u`D-2q^i2h7O4*3RTg&~cqy)9aq$bfF6Mc?bvLeV6$@|{ja?k{?rZr3cy+`e zOm7f(NF0Q3lyQNmoKi_n#Wtg))POGTFgYE{(>S;h=$1asvB*D=7r;)Xy-Skqq`0+U zd|(7l38q_yexIcML9XPxSVnj4jb?VHO!*j41i4X}yPGglVwSP-Lqs#$Q#6U2^#=t! z#nf%VV`r0Kzk-(Y@P8CkV)elY0jj!WrSeRNYokLxR! z*F3(78k1n}Y;HudC6*x-P7 zCYItXD9}^bqGHHSb8u^*q<{eb7R1s;44W_*^~mI$lkKjK7ft|yBL1r!aWTXYShfmS zKWPFh^a2IFmGR?`WgudbV+8!aLM9|~31ho{#ATF8BqAd1pV1bugX||7oLfF_Bbhcz z>BeIbJ*n2h9t1ZEUyo=Gt}RND&n)@|^V~%0bNOfhUqm9Q(%2^E9DttLo-6JUDMK|h zr{9zSjA{CR+uud$lIH~Ls$DFaB2Ibl(J{Mlf%5~1NBcCo){HoE2~7y?mvK#p^eSO1 z3*D09zG=`Z_@hv(d@X8d>cs6r10-lSZS?a9jv-#J+7>%qFRM30^$gmPtVWf%y1e+8 zP-D9}B4ot>-8D#uIr_#@S|YY{vxPS#CMK8B?BT?-ackJX^EjU$ecC3+ac#K{J@CTC zZ7x)e_rx&iM-$O`xePD9{<5~L#i?;;et+B0sFe0Hk+M~^0`}^CgyRC29ifHdJ6CJ~ z$&gPT)Wuu}bcB_d_e?fD*vp<)x2wdl!_X@c{1@|pPnxcCn9HMb>`C8I^OHx%Jn`Uh zF^kD&D}Ai8k6p)F#crQiOxOhU|AojTT08LLeHFHL(Fk%vBkTcUn+$^WIN;e`N*p|| zpi$aE_x&@D;fQNZrx;oto`gZ>6Ww12%I!QYpA>kgtzfT90d>zNpSqc^c9Kv zNjEF^FZG0TEd}GYf7B@6#-^V9x1In#kMV<9)3_2r!y_M03(mSE3J0=hOX?z#Nz6oT z57oBj^d!8TVx{4QQjO)GWyG3MFiRp2j=ay#7pm`vKD}cDF+KvwB^VqBvB;KCN#Vzs zOIIF>1m0?Wxs&6z&SXdo-ocCv7OK^X)&ueGgKFh2fsb#K97vD?rty~P1?)%I4c5#z+nLx*dKEd4WW7=uHK)^@daK}jHq;`!bvFSiD+V692u zNt7cx89cO5*3D#_@f+(hs-U&3nGWCtC2EoHd_8uy-6wjxI&RkViF3N zB6-1p=zN0}qF6=~<($jE0GTPu#gE3E;d&;h;-|M+SaVf%zkPGsWG^=^T=kjJ(KaeN z5S%C)LYs*7qUvPx1W4Tfe>YGy+cqhm*I_5E={2eGt_PulTaTe?pR#G=GiQ( zpx%K`{ges6le*SE7shK@;o1_&j)9g^D_W8X&gMkDpi}hVG$2WaHE-*LY~vLHbyNg? z!a&wxli9|#FmRM5X3_LI@T3lGw*!SYA?%cR?o`4`~ef!J1AH9c;@FGlmZ z6)u`&sN|AD&DmK{Hdj8%Rdu=?ij6J%!ZRs~lv*vd@$qT&@1ukLG|@`}shQ+%+nZzh z8h-^KFhoQk@claSxU&Uphiq`bUI88O2v>?QQj+23 zNlgn0U8z8pdzM_KEAh;*voGLPX)Xp}r^c8lU?whoD!FfJ3$gSFZMZ9xa@bK5w&_*< z>e5kosW8~Ws~;Q`7S3}<;sYz9x_av6kk-59?Di`lpiyTc2@bq@o^#ldOGxagbl*(q z*d9Jzd8H*s!bl1A&}Lyu=e%*8OTlGX2PW)Kb)7B>uYQR;AfvB~#&#M{sEhcyQUo z*y#cTy8yV~(={yHsW~X*32p;AM+*X9>jp=>)+)U7F7qD5ALPXLv>sTY`;60&hll0` zT#=V~eDqy*526Z%3~hxd$C(ruiOTCkHPE7=Cb3-H+oBIYf`f<%o1O>1h?Y_uO_6@YwR%Vt( z9m#@OPf*R1MGVuok~1v`pci=;e}zRxD$0iwh4+`CY%Nh!ReO+?;rEM^exmx|wKUGY zoP_V8d;;Qfo}<`w!nu7}RxZpLbtMhVd_k1_4EwK1AC1}4gb7%6hHUo2jv*ZK1Y3et zmgn7cpYW8bH1)4VD^$4acOkBi+a*rh)Xt%Cu@t=g$Aj%IuAJGaKM4o5ZYM0NQ z%-dm^LwY#{0q}<+*(wrl@XJsmlv4hHi4gZ%?mm@=w)1FHJTla?iIjJ5kr^pj0Za}H zeoCZ6arxBKlEv=}3J--}={kCHdrjO9(`~nj)Z7trRB{Ca+z&TW34d6K?7}6RnK78~ z0K1bmc}E@N*{kODWK?n&$8_>|3qti8eUsy|JnO{UEn@%;2;U9ITC@!H`4phDG>xGc<)rXM#j~G~T*DZAHf#(Iu6f6{akgz~8 z;yrA(5cTuGYh^Tm8P`kp3B@neQIo>z)49ylI!k(+nIS_VHVum`zvy)PTOO5xAp;7!d(}4vl~B-qo>D5o8cysuSyGQp+ZBf>(tMthqd6E)X64v z3OVdsE59`W_YY0bcG$>D6j`@O@UYKjS^vwyhd+1nh>Zy{UUs+V_hI7froc<1vu{x2 z`9ZiF90fFM!jmyNtMnexj%hWRoxs*BuBJg5CjCqPAp^t1P-iZ?=f`JAfIl&P(R~md=k=kdIJ$=;3m?~Y) zPMuA%;Qp1Xl8nT*La6T@SU?HOQv9-2U^AN$pa^ijU*Y4%!9Q*jlp$rtEtSW^@DMu0 zTH-tpZ#>rjxrON~k-lAyE_4Fo6M!|TnIi7a4Uz!nk+tn4eT*k5g6&q&EF9QHd_*W5 zFcWEC%arX8mz;iK>WO+IBMJ63Z+}ol=(Baa1>&tceM39Xm|(>c3{zE7k-N#WY%GBU zg@*oYpm7{Bt4L}GQc~H2Q()nd8YOHw(b@Nije6b-!W8{U4o%u&q-n@qL8KU2^?QW= zS-w^4qkk55O-&x3CBESxLyNFR$x4x*!N06p&b zQ7fA$&|E{954|1zQN@9@PABzP_<9N8#Ln~>bWQix0Fe1*c0PukdX&whEMN|4!(PML zGsK%W(42MErP;nOv7st3ufIaEE{&nZ!N`X~t6C&)&d zGoekj#dMaOpUIh;;u@tHESoo;Rf4q;_KeM^4xP?PTSf4Vp2VA*a7p&_dJ_XW zxB)xC^A?$E3O(_#OM*PIkuf)39wmO+AA>Yd=0s>=}cn?zBshu*27rx(!0XGWWP`Q z@=no{(LC*X@MXv&NlbM!BOX8c`G=e*J66+aLD=N&#Xni{$m2VlTCcIX$7wByB69oL zdcJ84RT7vcP*y;X)TKBK4{B`Tz|N8TPL|`9*GcD)Pm6P%2h`*c2xjv{xM7jhm*@SM z?NHAP4gex|{(G>aH;o*LCehT3o7I{{#nC+)r6KO<6PL?Hd49q}J0Hvd<8T^hZ>zJX znf!(vZZInXDUaTfQ8jVHnbhNcxp3~nM3)L9lqWu6-aSeI*4Q(D?}J{W%J>6 zFIL_V3*(R+IbE1rn{=cdB%m4?bQ}U;vQf>a*k1$-eupDy+k4WRG4O;`SDn85qnd|N z5Q-}@(g!iX!FWyi2)yw5H0YOV!=`*U2BxF_gaQI*+*x0bdO5JSaPwDIdZ2+YkH#H2 zomc}1_z&mfo>;0~m8omdNT#}F@>JyDJR^~YVP%(^vSIC@xMC=Gjpg-jhpc(}L?jU^ z+A={lDqN@I6Q*58yv|fBlrd*2C4_GMrVI^@gMW}VyQt0qAZPFjqT{Q+7^005wkt*L z6Pvczq`cCEh(kQiJG)($TNNNBQRvu}Y?3Td8A^flKhD=jIvJ||?ILIj&Yy^CN1XTD zkL2~#o;~aB>msUokqY*b{L3piqeogtUbobB$+$H)5%SlIHfu_Cz@*Q4-@vvr%}ec6 z4G-I5wyA%DMveNcAM1-AC16qDqYd~2Ae|bskH{5BL%)kpb$h6OFyK8(!0El%9wpmt9@Z36vtC-~ZQ zKKnUAgsSAc^w&cZc>IreKb9Dh0JG3;8Wa*NGTq;hM{X!rkBJW#Kdq6N-^67JvD*c-p{(W@WJ z=aK)Ka4U(lP@duhjC5(QB01Sp+N4kSiV34(?XaxUndl&>ICIy0SLEySM!Y< zxz*N>B(xyoI!l;TgVmdJC z$Yh7760ofur0x+#m+>$wfT3I#wB1ovz(xz>003$2WnQ1vrvD~LLne!(I4d>8 zAx4|$HI808*v&@T_O1*sdH0}(&8jNW=$ixjFG6{Yv`z^>6w0JpC_rAb$ij*O) z+}ckn7P#((B8;PpsXw0Z5?oH9W=q|^Ge$Dhp5F$rWOP*o0R%VuTDiVz_MEb{mFDLv zWBTRFubqXJ=`tYYEpiVFtey@AI|{oiDjn$VyD;)}egs8W$@5Su@>FmLi_<$FUt@Q4 z>m2VxR0Hb$1(3!Z8&w@_`}xADWW_)zI@7~X2Q!|w0i^;zNOIKvO7b)lw4nrx0-TZO z5w!{OdHN%b8E&fZTgiCobNx9YG-1jFxyr6Wto>HX`v2^qyYsj6u~)|kD+P}d<%OdG zdukO>jBy)idPB+~qm+n=2*lk6dK1$r`9gZk+S=%)FJ1W?r`q0alasqNbP($3u8 zc4PeQeHGndafPu!;G^&i%LxKh_9&%3M_{CddN8>aqsZOc#dU4Oqq1G6R;aX`cA-br z%6EV)b!104=3}A!l*02N5u>~~v_?xqM__Lm-UIQ zQv`g&l7?RgYkFYdA~C!+GOw$Ai7isa;Idy8rhO-QbCSM`2xEq2dJ){9I+SvF%bzp29oBuBv<1z zlsRA%r8C(Xt%zKdu~}jtpfjLJ0Vz#N|0+1@PTeMc0GMKUKM8k!;hjy+akri>GPO|^ zxyRRb?}FG1IZQ~-hZ`)!X`f?EY%f;gSt0_lU@ueYROi4gfY2{sM3Bj6r~i(yj4T zck7!It$QF_1xs;#Zx=82C@U<#Bp4SdlTv`4d~k3AM{#RWd&=U8{>bJ1mK6 zUZQ9x7;b{otQdYQM?FHi_ZV!YWS|8yO+!D+cp?Et=;?@mM*e}S;YbGMeG0MZ)$)scmQ~Mr9n;p{UNK4IPjFwO<7)!QGAT!HIXR(P5Qig~>19#C zAnO%J)Q<7?HZFWJzwSs{te>*c!ki^!)hgMp$B`x&>oV|ch&y3em5LFSiNpVQWGb8)`9Sbo?Zg{Qgo1D8y4>Wa^6`78WX|MNk55*QwedT zSwJ~95sFWjQ57_L-W&#Z4X_TfU5x5JU`>w}4niwy4O@6sV;_$kd`CIx!+Ua&KG^Z^ z;TYXMN_^wfPaMcP#HK(!F}3#QlLkTPEc5Xrwmb0l#vl&~o`I+tfT4?1m0As$=)@WhAsT)xT0rI;N|dw9@5UN)5>lAj~-^tpjkF4gctF`A|Vc z`{YhTaz7n(rRCl(fhvHhlHjzEVwnm*d6mNUSMKE<*CLl5 zI!C}!O>Q-0E%cQAWFTnxt2J);Zt!ec;Ip7M+YHV^)ek&GZXfolpPrQO1$uCm?aVW# zN`&{VDhxrwh}&j-TKFxW7$yD~S^ zTW@EoRlT?SmL{*91w=(SZ#QZ|NIH%owi9fZ8$Y1f$##sY7D&X zh0y|$JPqUFD7+z4emyG?`^3ryU5@S&S_86cPv#;_+)+N} z$%57(GX*>aGgiTLNe+6M*@5K(8LHo5PT5vICH>`{Jz~Y*=KRUWXo^tyWbH8AqdZN3;M3E#fz& zWyoF)gOm<79we5$rHlsYN1Q|TRMZ3n4wqL%Q&x{1LorFdinSEi)etxVXH{#8?gEJ{MlInk?JQrbHqYIV*TpJ(W4b^pgN**60t1~~L zGlZaD#1fTmjhdN+C`Vl29I+lfd7CW`Mu;gzzJD;-U)bVyjUWcQ9!Kys<*uz2&tI%K zct0YQ%2s85*7+&ef{HWYX#=d-iY4VerH)UGfki(W#I5K4?&MPFY>PO#u0ZVok=%gn z(%W$X6e;i-Kf2gP644GMY%-kx$g#W3jPlYBAc(D5L9-PwfhdQwkua8()`t3DasB2E zS1-)#q1bn*W1%vZ zJZJO}_2o;n)4Y|QWpsd3!JUMPA0RbotlH(KgvuBR;_jo}A~=xVxVwHhJlf_LgEr2} zLzK&3gxUmaM$={kAR$V<*g@PpB5B#mavTm6twL*MnPx;+2tIapyM4w*2z2k)Vz4ao zr|twdT$7i+EIBd1GXmIud_TRm8Kz&d1A*>39U?=#RN1 zhLbeDtM{9HqfzPTg&y^Mf#rjI^4aBclki!v&t~NBPD^dgRmmm z)H=Br9EDE?Od&ORXSyEgILJEO9aR-VZw7}WKgo9r>Oj3GsiRTb4i2pwe<&fYqA^%4 z4)GY|L{HkK6TkbjwMaZ^ND&LZkvGp1TgJ!qFjS$h5-%9$W*WyT3l#qABIkof4ATyZ zFRKN5yBUYPqIHD6cw%Y&f6MKER7Bj_n`DxX*u=vh0*;f}<#t0JCvw4fo)01?3E5OP zh~#bmXvT7eC8_Cj@?wj%7M56?YQP=zZvc)#h~#}&O7VM&Hzq!I#BqeEGJXAwdhbMf z;O0VlxDwhq$qUo9QKMysDK9q(TpJ-rSMCMHx{p#}+?sgvd9$zH;Pz;F)i8GG0yemab*m|AgN?Wv7&^5E?*lZ|@S%08?S7>Pp|zS) zlE(A*L7bE{Xix&?Y28()S50_8&PdnOULO63T(Hz-MTu$tI$@api$2Sd8!W4KS_U>_ za7}FvabUq&yU6|+njW_H_JCXxnQ6pL2IXPh{QLRY#r_7SojVn9Mua4W1e0%LUo-OF4Q*)pc60@(k0Z!Vb8i) z;C#xSp2_)xgZelGJ;><`F1{k#PR#Wscm7hkQtg8w#_m730I?L`Oe#dQm{?O@*Jb%- z-nlS7p+^n|lMF#XLJ(6NX^Wg>K|~5Fnx*VGc}3DDoD>wr#-N-;XU<*-YE&;Pf%f z2&RqdGA0U1X(1IczsT-)GHbm5ZaHR6AxrgF9rr_;xMAF9F0;Z~bxUL4n~`k=5g^>&~+LwMtrFm>&+hJc7t0WN-}m3Y~n5=`-!zy zOcfUG2FRXIHYy$kjWaQZd5+K*nEX7#XiSR;j0bm{DW{ys0=a@G$ZX#HzHlD53M{kI z^Aw2OZSGP>itOBZ2298yMl|q%^J-wuPyDBtKj0!k@g4NKyh4L|khn)ToP4pNNY1K< zl74YmYezI3XCA);Ltq@s#)5g2nM<88NP@aOBo@fF#OnTn%&M`ClZ>O>g|TW5>1;=V zed1?^%;BacR*z!^i&>n9AWPENsuAnY1&ZodJTStRf`5f>Fx&%hwt^82dQRn#fb|H< z{LmyMHIPmN{ovElEhIw*Wi;`Y2E)Ng4!EWs;xx+pBwkNsKdD_mYJrDle9wK4#9kjKX4rSqjiZ4iV84RXPr!&id;6POqEy+5f<>V`5pa{N-_W)q2itZDVMD_T)ds7t|+882vaI?>T#!>7S zQ5coPt;^d)0iWmVI9{Y;Y`QPRTSJ%4o>8|6t9cEpFW@+Gumwyh3_u05ytXp^TTXyG zzXvnL!Qb*wS?UB=cdIz5y6cQ;h>s(=@0whn!WcBv>xR9mY38Eh!Os*CxY^4uVBWQp z85`GBnh-FJ@V^yq`4$ptXoyir^q?K`*Muhy!(J7;#f1;L*C4Sn&({W-%_x#@y;&*b2HTNOfVi?)L& z+3?j@6gQ?feqC-VmOCSd_P)~=ZeuD`B1OEdW8e6;dccj=3eZG|Mb-CI436B8sUKr* z7HL*d)p2?oM_9x!_2hp`gm5~R6S3&2kI&MQN-m%!n2VJ#k9mMIx3Q|va37+af~N2f z!_Hu!T|7`2@E=n8blpEgNh1^NSGU;ZM?FTJ zY)YQF;co`>r2sIcyiB=z62gx4!M5wQCth{{b8_v|hRPoAJ+8oJ0=%>!Xr5z6r+E*p zx**XoYRj3tm255&QaN9@iZ4KP5RaH|zfI*jo4~n^@^oJbe}6c)MXyrlv|6GhauWQx^RhAa>RMJ@hcYF&TqezPtIu zB;988gSL$C7f(&Pd+7j0g1dxBb)B}YJo*=bwxCa_1bocZ#HX`?J63SeJLLYX_SRp7 zxMKbk;GMI;s%5_ddBjRTPIB3C>rPBvP0UdW`>(O$B$v=;=?*#Eyvf3!bNY0YO+1nV zM#-3g+4xB%af30L?8U*|jOO@4K1&F@*W`t874c#wpec?$AO(E;L#^W>BL%-$^sDnF zr*V|pm$0U5G{;QLJB&v0i5D3T0p>_5ztoWm)7?o5*&pSS&%5|h*Q-MCvf5hrU7ICC z+;P>q#|36RGCYCQef{2Y%fbsy2)Kp;4L!N$?XJ)+^=e?&>=|(M=m4hAP`P1vZ<`O0 z+zbUvH$t{nu!Wa9wg$@M6z6sw||IOU^@5>>8$Q4w4qAd#k zI}rP@R)FOV?C_Gor&&m} zqGw2q>JX*^(8*zqZ`u5ziYA6Lw@kZL#53=%(3sld{wQ_yc&RP@ho|iqR91tJawkvB z`-*|Gai4l)@*zjWSyqMu#Ypff*}K5B?YSq3z=-2oj7G!!=Ukh6E@oQ0lme;~D$x6@ zV5L;u1PqTVC_KXc^KTxx(%>>7@oH3(BO(F1Y{|SOmTB3~F=rg_?c&(U5mKlY=JtdI z+?P^SsYb}lmZhHX?47`jG|qnZbK7R#>~O-SqvLJ=#HN)v8$#J5n9Iti9NPk&|1*lyEv2OkzLb9 zklPG%>{)RD^aaI=4*&#B=(XLdsnbI4ylZ(Fo5{Fj;VQp-2o!6Q^M{!|!C#%BoMw0z z$maB_s7BTImv$0z*;l7^~=It+x zgT($4Nk`c5v2`mwp7%R`j9)p%3CUA#DFzf?Dl}CLOU9L6X*%`tEzFaFf2|l*gKKrG zRy3lm0+BApTbPXCR|nV3K@XQrADWaFhq>A1ULXM#x%VZQGBWj)X}0+9;!%G^bV7wG zrc0xE?2#CVk;L~$SUKA6;R$_yjg$M z_SsHF1nTi&5(A0n6%VWnQ0|h>+5njnZH`$tT~HLJ$ffx0E?8BC=u^B+b%lyAspg{k zqfRKgfGiaRoZh?yB?dt;)xSZ5uF~7BaV$;JqHXo0PaaepV?_41FeM>y(DU%@ce$*v z^#?)FR)J9G@I2W>K~$fU^Ala@bo6y5BysydRr177#icUlyYi7_S8Eby9`cE7yH0dQ zd*F+_yJ(=_6-sUV9vi3<%GyL_QUMHfUA4*A(ZG@8&n$cL;sEEdmydOX|=9 zC*5?ejZ<*~@SefJgwK#4VHH-|cr;KiH(QO8ytA!h;tO?n-}}kIir#v`9~lVaLom2c zWe}jWjHuUv4cvn)oYxf*G{UjlgX`(~fVh}_-#Qj(Hx*Dv3#}-IN$QGkZ>RKJ^C+*f zjlw&ulbu6u(af}}BDgr;wPBJYOK;LiMtAft7wD29?hO23T^_Ea1LwN`=*5)C`z~;kDCzrDH&S^V$f_kL__2s zdso5?(*_%PFE#ZrW0Ava81L_TVu}T2)BkW5#7qKxm}_d0cVsU{RlbE z1)|40P~$<}grH2vS27D6voBWb$@5t!O9PiH#^zhB-cmZ;pf>kiCPPAR_^e8lllwYp ze@Mk1t0jsmY)5_NVzK)|!8cJ~kLD8KBqJbmR_mPKa^Wf>BX`GRtF>3&;^El=_IOzZ zsK$oR_XAp*0MRuLm~&V;iSMGn$r4o98XVadzD);6Y;R)nWgbT6SV2JCa@)kJf24Qf zDl$(L^Al16(ktnY^OhJ~i$r29JGmXmm_uHT8g@`*a=ou+emHZ3Vj_^hLrRTwMbKW; zKj^yN<@_g(-*xd49{fC=4Vv)Ug;wp(g?V`u@B>`VA}<@u((@acYcPt&E8M4THHlyabW7)<2!P zj&>mCTrs}@lM0fsYA5QY{ly5}SWHE%6Dw!l-0)7Rg+S;4A#(|tlbn{5HqN5OT(%0v z5wj{E5|Cv8GF$_uk-7{fFq-7j;9qzo%wZTKh!-jgu<*eLy|)d+o);fu7(5~4J8IRB zdNmd|9<)>2xc+KYhvTt4MfY@<8;61!OGHy|}0CG|bHvQLE=O?J#KFYNls!e7oo$xOjBg1G$3R=4Rp zr(HjQd#!sAM+OrSL{8cZcODP>+iU3j6$$6Lj;PXqq51bRP&zSdkwHsRfH<$3vV0TvAwk9?3!rU&p*s2&|F>{>$-xes4?N%r{WSPfXmmj&JfElmgVe#@uZGTzP2yWvZ2Ie9Lx3 zcZs$e_f|w>?2Qp7)O3Oza?K*MH=<1f(BZJ7F!unrSm0`M|BQ>z|xtoJ02KH{A$R{q50Cxv}H+|62Xeve=ePq{1 z4_~EPZ$-X_0qy-0{+aI4a~xm$nxSV{4wODpquIwfI9qMHbwT841J11;Gf+q^o}uY! zBFwkdE5h+-iS|f0I@=P^8xY!dXCAk+Oj87n# z&IfycQkpHi&NQk!)+bgXB#mOc&NY)Fv;{>vsTR?6Jf1#yka&sK+9=7o88%{GSIBxa z*!K$;QQNRb)3X!Cd!4XU;TM7hvvtzKtnKCe+}Y8dc-Nv+NCb+Ss+nXA|-T7*YEJZ5_5G-rW_d90ZOF;PHFs1-np|a6IPb22C@xf;tZ}y%sb|U zV;;jz_v%T8#@Azxt-lN~h!rxoh!P%FuNWz11Ru;^q`^Fi_&XbCUuUayGBfmQdWncMo#bP<&oL8>F z0kIHVo_lce8jKOy;KQvXnzR^KC7-vVT;~miw zlym76Fs4#gLQ2NQv3?1)`@oO^u?@-Xa=QA98oJKkGK^#4;VAy1{+j4S)o<|JlxmO~ zFWn4D+uH?1jOM4%)bKL4sBLE+OOXsL2PLr8uTnx_J(=P#&cD-@s`H5z^1C@@?0U`$ z1F1=RxA(yK^}ucjq$V7P!W`7GpKopR$mb0HOOA?Tsl>d!K!Lb8~X**X9s!X zVOYWM1rVZDr{%jdL|86QtaYZVdOh!7LrA+Iqq8{n$PLpz1a$p*R6>i7FD>+ehh%Wr z!9L;e6|Lc?-*tdzN^c51iK0&1)T$%hwO5J<36o=?AF9tUTPQ9m&<6N$^BXX_Ia38(j40sLHGf{~*Yt zbqx5eEEKtD4}&vQxCA(kf)>Ml`HUT}+enj-Z8$xHn?Xrtg}6D=&5($ra#U%wV>4QDf4yA z>#wEVoQ2hZYLCptjPQ%O^NmEbNS(=JpjyTJ)~Yb{NWDBr}01LQ5TEXNN_ z@gwbSs(V&qtp)$XW$C{SwF82P5f5GmcbsE?PV;!bS#5p=0SJHQOo-1piy;mnTW2xT zmFA*lQ}z$!{xdjYjv;nu5FHG`upfG=2`gQ~AJyZBxfC(9a#(_>e#C_^h(baJAki+y z_21UOzvx3m*$HD1?uiy49>`e&ncjN`*esW6fvXBIlcI%8_COFXw%@HC?q0M>ngyg@ zSB|hnLol=mq>Z5D^B2V>wrp2cyXMV*b*L1N9lR+kG`!$!?Tz`WyRTf{U@!G<6^oqL zaY48fr6B|CAE9$-ZMD|_EA2@}XZ6`tvwVb7Cuk=0ONz;6G_kxpM>fF}g zaS4=1V3Y!z+<3))h&3mC3&?B2x}X&(VMiWpoAUcsO55n0iX_3dD!lWG-?&#$PJsdE z=I%a+)_wv;ZoqHqvHA;06t~+gY@AnMBsh9hCo0|hsL+-a0sgw^S|!j2Lx zhS~OiWR>ek>Hwrm#H27M(+vynZ^*ex$utZHN4+&=>!e&Rf4ZOEc|0nXT4;iZ%RN41 zrU!sZc#PTxQ4fv@|HLG8kbOH#HA6Tq$_MK=^_y-X%^EO5%|x6iK7jyfT@QX{xpw*& zcOq;pgX4LHrmUku@!BFEa`-yJxG%06wf%dxKaQ{t@L)dxgU;gtstgDKZQ*ebA@;Xd zgX1s^;xowb*3Hhmm&6Be7XI&wl!odqQ@~7z4}GUpQa4xsyYH=g!lkMh4A09B#y6}! z<^GjVMrOS{ZCe>%s#4l45I2~3pVMduiRAf)i6QJ(t6uUZ^<6x~X4RgTxEJfaE|kf$ zGLtjExowC`QXpIYSR&T_#e36KZDqg{MmZ<7f$B~j{_~kUF2kV+M3ajtydS0a zF1t2mT=Bw|*K$yr(XydBc4zippKE~^mo|Zmwql>-m$WZjmMj0|iKvU@R*_I}Wk4b)Zg0*6u&Y9EJr`l!jT}%IGNR_%DXmn>!-1wwx_Lev9e{i zv7t{Hhq)!m_=WhhJes)mTSLDq?=mZ_pGBrG9V#Fy_A%w;x0Y8jaf`;+(n5XEZ%wf) z#Istwi3yN9T_Xkj=T)CsMV}>*e;gkFx4%|P5k*mazCmZwvenW(m{Hld^g)H$M6PQ#3MJgn=QT_^xalzfIjn58dnY;mP@K=4)C!ksWYT= zpJUFrWjG>=4j_Ki`9Jl;>O_BJ7PV0dD_NU9Wfh9ruY7(3xSuRWSzU;KcZJ zov?8)itJ|6#`s>FJAj>++Sp2B2i2@=Az|?pENhoAUrDMjsB68T^tnfz`Im#OuD0o# zW}-6i8Q(-90s-ih#EPqPWz4nX_i2g2xkq!T6_8~e{#fKQAfE}xM%BX7C%?^k!F?~w zn~={l$Lcw^^jz3s7M9WWrbxYy!z)+1keKhQsV>#+s0SESK@y84jeUp}x39z_THr@2V}8n6R0akpqK7_57QRJ>b0SiKhb6 zDXqs#}Gp*iUv*!}V?>GT+e%y<7==PcQh_YtF90j^2S?gHfd_~+CPiy90lRN9K`QI8h&kjVYk!~!c?lf&h9o7RF;MJe;bCUx@r12*nDe=_%Uq@|&T zAbCOl2n&Es2o7W$w=I_>JhimgjsXe}WXSnBpDWYe5ZB6c90^R61BSA%TmifX%L2vY z7*aRQVrNC^iaFWQ6-?J~nHN@hOeYlQ1ACJ+-Z4?VtVeHb(tHjDa(QL+4v|4%ndQ#F zu?o^vd!lK35>G8s?~^tbAXCjc6nfCD=+=Ks%Gf@<^N1F+tKx>cc6Nq5Vt<$h%7jmn zNehE_7)}&EV%+C)Stc6`L9ZpP#j!n*jL1#XRObXoa%w{1XAUnVJqV>$MjN}~R;az( z<_&zqaFs+q{2=cy&J8*~lM9nAy?Wh6u`5BY!h9H&xiQO4fRJGXf8aW$s1*hUXVzyd zKvPIGUG+6^sOPNx-8K{TDe9w`aIdAA6BwE@L5Jq0b&=kWJbo`DBOGvrMx{ZcMqoQz&Kv6b&s-hkaCwKmh9w8)Q8rn=e+SBhWCWG zW>7+Ec-5&0;+fFk=_cpg=4}^IW}JAUX~xK=<)!YDP~@|b0#Yyu;yG*po)Q7WBo_Zm zttMn%P4$=5Pca%@VC`(O9h?T3#CT6l7Y$HTw?Tw;RBhELR3x3OEGCE+_J#5Voo(I6 zq~%T{uLZ9Y| zd%-$Ir2B%D{(>EC0J!w2nRkY0hXnTxY06L|#7ERhbb0eEnU1N^|;vNoZMIU$+kXb z6L|?qb;zF?=8RJ#{q$M6mLyhru(DAk@1iF`rL#%gUXeh^vFsihaQgDhV$fC57Z7&g z=n?cF&km2&jo}p2}mz#z*Ca?ie_N`kpR{am;iNE9OZ+t2b&8)L%gb=iczml zW;)%}TAxjJIK*E>a&QKR43r-ZWJoQ0kkH3o2m$z^&K%9l9m|t18e{Ca@gnC*^wyj! zP}KwjbE@KI9IPUPay)0Mg8SX{VYSY8dmpjH>X{-OIBe^@1FD#wNa!3~@d`V5MdfsV z2Rk3W20vFT)R7H_=vk)_&R!Z4)N_w{ptDTwD=`XB)r_6ts}-0nuk`(iTP;ROrt zi8FzMJ;UBW!+Cz$^5F{e-yFnI^v+_Nevuv>UQ?194ZT^5m*W-pYDtBDBmBctzoZ^0K&szgi5Ydz2Srup)wDy~36@MyNpN zjH~i66AR@nfBE&e3^a{^cfhhNv& ze|hXwKy+Ai5cT!+%L~I2vgma6wJ-_XUu5OY&1XK6$8HPe?BGm4bJ^gfw=*cIQdfk0 zJE+ulEw*`q1DDoT1%)7De2M3<(@XwSpIlP_J<~yZ`?;o9YTYur8Afwu>M?dbFL=F` zSc%(vo>czWI&jF;KX1H`bt7&*<9V{#7OW$BuDeM(*j z6F<57zLQ*{Os*4H(*2(i;#K4u?P7WCAKC0Vs8zBIN6|wV93&Sc^2O=6T;_#s_o?0A z_j_s@XI=~EVR*|oc_pVhp2L2=ngd?noO%|&{6bXUl>I0m!aGF-VBwLChIhjh56 zSVJp$oyD@EuWl2<2~&=}-`g|GLLcZg+yqrwK&Qi`Ho#d-v$fwnoXToGoA)7|u@}-I zFiVw?eGePs21eK#yAMPAB@Xvfd(z<$(g-Lb9LQQ%ob%%n_>RcY7YD>&J?weulmy~N z=S&2MVx~uHX#@XGFEc>CM|y7$N3-V5As8Nz9dx+cSOwGX2V#aLEizaC+7mY6GM+#H z!dXWD+PPKP4{)%NiP)63e8{)Xpz5es6hT;R^D2t_+sH&5zF{%o zc3Iq2L6ziaSGKdPO-TK?wn`y7cFJ^fFKBHzI@uaJItWVz2kB&f6*@ccaY(4fLPEPD zT%%2NL(W`>WCS~JRB0=MZ}NprGu0xQi~Tp%$;urBcyz8>XwHip3ZS-x|KO z77UIq$q`;~*T+IxQGW^4w%cPemG>y8&J#T3Sd3-+^@B#l9cS zJcE0lkllOLYd4FVf-SM6mFVM)poo=iR1NSc8%&vD_&+oeCjoOL8BEnP4t=<23BUqG zx?rso+TN4sC)L@;jB?)C;;SY+Xx$%TBJ2uZL413eQ#qAex5$6<1IpNXKtP*?>wj*5 zT&s#{{g42S*zHnz?ilu#P;oy8yimS2O`rI#brmQjr3x*3#;R!rK;z#vQ5Wzv58ihq z8EehPMc_s&O!L}P$=e1rlI3eCM4;w5n7|;}0+K)XU|K=*My?Y)nnW7|us8>q<@H9| zAOtoo)E7O2v_kP4OQb>ZPFKz96m~a%- z4R8mq?RQ^&P~R#M(jh{Kn8DGjz6ubbhyY7KrBs;e6`)PRQxdPi%ufI;hZe{eTbH<$ ziQtZNERVJ#K`3EokbFh=2yb!{+#?}%#h^GdlW^wV2%hYWqXv=IFM8k6Z*sVwM-P^IYC9*=?Xl(1Ou|KvE7F zd6KWeT`Ow2XVC{@Aa~{iFkmn3YNV;Hc+mgCGVz0k|1wdEYw9Hin_RcYC?Qmd-V@09 z)^d7h0A=-egs8o;Xv_v{hu%R9f4z1B?D=K!w8~vY8y3H6*0KyvZAI3M(MC1k2)QtZ z;O|K8^UGn#V&bSA!H4C28%eyE*+OdP8QIDK`T%yy%UL9(qV{dlK{rt(Gs)_h%u<-P z-6Ok+qO={(gXBh7&u z@{9D)E_OXcx0?S7cM!cmX$_@nhyqTJH2wx7NOD6DeSi4#s{h!EYunOAJ>nG|yD(62 z*hFl1Vd_x^-!-dDk(<{FMIQ|KDaj{ z9drKK&r~IE?D$2%@kAg@)CdfDl+B5)iZV<&Guw(__-lU-Yi;mYzaP`H)vE&6sH9IF3kyF=0<1Z0@ z$RpZn+|U#xLgPjdX#@Ha)EZB7rLTSHM25f^d>2`uK8#-frzP&rj9PXgJkz@j>LGt< z8C`dpwSe}}6MXwgj`$0ErPdiFVN6en`fp_uMKi>Tj)^|GF!53i`MS=^{GIEEKxd6k zs|VH-FLT-D8=Yj)v5(P=k_F@GZ+9Ecirp|Y9J1ZDXLdH;3Xb|OQslA|Av06w($H>a zf|mh&H5`=0q6MJm=C**?nVCtxzxCc(5Y0;}Z1H`N`{= zoeQz0=2kPoA2BO_+$oyb=!cum=Fx!6-By6GCr~jRWVo22F>&f zZDIvZUSiWn9V-R_vK0v0X!tErG;j+q*E4|pP|bolY6d0Is8)*DVy2YTUqV&RQP9my zS6LT72mXhZhsBOyCsFCM!=?ghfi5%3*ip}uUnX`1OMWq7JcB?g1LA5venQGD93Mrd zOPvD{#WK5-{8vpm^|HM0i=()E>B9a-?7kSEzW%kRL*+ky!&W;Ac0pK87B#G$3ltvK zDK@oQ*2J_5?#z*?vk&fnkHpk!WC@R)GJ9BVU#U`EEr$VMs>xI!UWn_dM;Pb>@7BZW z#=p$GlwE+}ySPf~k9}W7P>FoUXObo}0kOXT9$8XCzfi-Pf(FdbTFtA2iYu}bU$@J9 z;g{a%PmQ;b2=*)?4oT(JP&E@vT*8Lv%`WhTBVvKhcke`i!HtpkF__c-muI#UkvxkA zmFCa+C&%xs-Fq`m_WIb*8w2Xzq(>DCkh)0sBx%PKr8Olp`htwMmzL+x5C(z<9*Thh zbg>d|6wJ6(VJ+;^%^xG9&B!8FobSWp< zyTXA21W6fKVAQPEaFZMLdaXF&>e)Y+6~RvToR3m?;Z0ayY@4wTQ@;32iapgMW8>~+(0 z>{1M#s`r!ANpI?@<9jJ)q#Q0^0kSq;yo1;oD{A~oWeYS=Qv~jb1?uba)70 zFta;no$iGLSdc%dxKQmyF$a(hFs)7|@NEQPS;CcIsubQ`hg7 ze_4nphvumsB9^GwaQ=x$UVk<|&+S6r!B&E15p_SrcaM;l`PI*Q@-`9DwCJ#zQ%%-g zDID-fiwxmVV^LnTBJV#s{VQ%d<6Fz4-SZ#l?1xIM0r2FNl*ou`xn}ZS2|68 z{2SQ-@@noW;ZWcfcE>Mf#%-_@gZ#kD7M+h-Wr^wpk6}Lh2BjW#ZrmFIFRq#=DlR}e+lZ3qYYJ~tpF5fQtGmZj<~UHm zbZ3P`9Qm#xd~E5Ps#UIL44wJY-EI$@jk9!MBw@9^a-qo19hIo|RH$Uy5UwvAP@N_u z;*unM8gHUlObWT1Rm#8=0h=0k&H2@5@d*c^wG%plmzM$!c2_DTg~q_5CE8_g=zc57G0*43q*Uxy6}{td`)mX%(MI0 zuvL@Ktql#%`!q}X*AayqGOHaq59^$6?`9m^n)iA?5!-Q zpClEgk7$->t_!~2oJ*CAkB$&9s+0TA2+@e{j_TRL;mV<2 zqL*)}AbEECX_am_71iJiZ+;~)@g;Yh8$BN$cg#t+PMP;0N7`E+lvvt&k~Le|v0C9l zGt4SOYfBGo(CK!t2z^^f@lTA5aqR=E7QtY)jQRvLX`^|VJ&?Y-2XAlRd*9fh>B2Ux z(IGv{lfQl-UMy+z8eCyYAD6L6ttXH%G#+uy{8quyvxn60l*m2ZF`8ThaCSp0znYZA zY?&BBMhr@)z(G6_Kn^Ih^aMDm=*tp){id-{YNm>!wxSYCUWT_nX0%f-9-qMhl`Z65 z&YO0}RQjVM#4`@7%|H}7h+SfaVtcj9CRA%g;QMsaE-wbhaS4}OzB4JG^ZWb0oRrsfg zjBc#i%;C|KfNDGlBO@z?c$&6E&v$pfMi_(H2(ti=AmU0WWt`%_8phsd{xP#NXFq%M z4B?RG;!Q)smRrFJ*C=kl?tf9n*UDYB9n?iQLBA>r%8}Xu02+R*7gZS`Ww0eyEbwCa zjGy~`FZwvFf8nrVRU&1M>8grrW$!ZWtq)!I8l7lT0Psi5b$TFU$)~ zqLh@aJNF}UF2+UpSbE>G!h^)r7LGxds+SRxCbqY>7>LF7p!}#-5N$)?Bhlr-7%8>d zK-+ksb_GZ4QamAOIfKW0$K=pJut}E;RWBbgk6`;SvZhiJFpsiJB64zH<){q{_~xX2 z*RvvMV-##LEbBo?F%|F(wa=L(3~@|Zd&`tAx=C0pi(WkS`{^g{q=U==7Nv#R#zLma zj6f}hMC&R##ONi8L%$w-(&6?;(tJM@5UbJbO5=exnF4$24R*SuZW0aQ_vF z+U056qW31*2Sj+HtK4xAwMlvzL_Fl8Kckt*_IlYOh0hM;6o5V4?QTT8G&w-Ip+@6* z0zmF`Lqu~hvjfCiP&O`V@00h*I=0G3oBw1(x9UIaI+vUgo z&Vi4lm%nQHBGjoeziqQ#9>JwL^jxY{2aS-49Mq?(vaxq z8xsLR3raw4?;!4M$U2c7%b24-PJ-BAi@{}cb8(kUeu7TEe41& z%N*Ps>P!3D<4`4XB7gE;6J#Z_BdiOkUq{F04dq|c&v{Smxgxt{+2sWNK2usg$Hkz& zqjy!3+7vWi4j{jA-j&_OT!yw2r0TN7=zhfY>FPw7#N@UmYfu;lc11}7zOv_&HqdA~ zT0?(HMK3mjcLU|UhF=4oqKR}~ExFJNKvPo6+t)!lgpEt_J01uI9XUtXfr%*_p&SvD z4^%Sg+MhS3td;q_1LpqcHF$L5Ub)#MHIOO>uK2bhneyTaLFIHm7x_C=Yd0OlVIA-2 zjL5{M#&hhm%Xsx^;*4-B;o50=O`9{HQW>Glq5>AQ){23P7GtPh?=L&S7V%|!ffd3) zrbZ2L@JR8=I0PNvmxCRP9D%K+Ck(-ht6OY*Q`opfgkZC-RcxiKYc3R=^s>$93OFM5 zA5Ki9Mj}>03-(lxDCb0Exz*%?uT5}~4f%e`%Oc!VIG2Z`roKN+n#Rd5BFo*ZP6C?1 zN1O*~r%MHGe!W-a1zX)qb~^L1j3tMR0s=LVNbsF~A_SGBz(oEWzQ>-=H; zDmk#UzpP;}BtgDr(uXbWPR;CpObQYStB9Sw{dK6)$rD{hC@av5gffCLX(4TdLqa|= z9^mcdIB~-t?@ry1d&qi+GN)eKLn&3`Q zEthdePaZFzr4|2IG@Zh6R5WaN- zQeRjr@tZc^vClX> |yu=NA@z^^^VpF`}*rb>zUECG_YQs(4Q$Jk)1Y7meJ!z65 zlxSy*R^oOJSZ4iMzMsw^K&1p1JgJId^9rQi;a z+?_@(hnz+md)ib`GfX4}n1iM)mx#rx!wvze1YrF|{C%4rhMQ5wmx zzX-WocE1Bp6=KkJ|xO#52MZD!tJAO6<84vR^9Tgy<*7V)+_UW}dONVNjSg&>i4Pd} zy&ujebe2D&P-Jh&N0LzJ%Pu6zp`drOl_BX_2g^_JEyUMn!bq-F?qk5qTW4Y9HtrIr znh{p8%g5}X@6R?_=))Q)s)8AIwM4)H))rPyL--Zi6&<63^9}>H25g=csfLyJ<^TW4 z2|~>vl3DDn7OYW;e2LG&R6|Yd9GO`@0B`}{kh%R#@`x#c>Xd(;*01FC7j^|XmaE-Y zE=ho4?k?#Fv;8Ky>?e-=O=ygPeY4a>M8Mh9WZnSaq`@8%f&a%yQMW-)Mz~c9xL*A` zR;`;ZLhT!S$2zO2MZk0s3UWRciWB~jyz`J}4QQNXbK{HgIM zu&JV&TkvLT<3lfTRsGA>^&T#wPe;Hfxun9uLX6vD<6Z9jiZbqGv**_OM*H=e%djnL9f z>+Y>hcUrE`h_oditZ_|>xZBY8(A1@TjJJ!yCOGEY5*ED)jXFf6iVqPH!Op*F*IoTS zMIq6Kp*%->oPFjHLj_A-9aLhdlO{C_^wpB2CW67r(j!`QozHtiemrItQV%d_BjzM| zh-bZ*?WD5jfrw2El_fDdc$k$XQ~VaO0^R>icy72)N@u{d=V_*+ZC-MD&1o_CTRw8= zAEkpdL%%@*;EB3##3k(}g<;+tBccHr0CJ-IE%s(E%1|6O1fxA6JyccQ)QPQfflGfM zc#i9Ga_UI1gsC4hqe5OF$tAPPgVGgZ!~nw8fl!5CMhqK{pA9!=1K3MJM;PR89glbz z(C*PX$Cn7;V-`a|IUi3!)~>;6ClW5Xqk5Rh|eSXPsdskg` zwh0l)zJZr!V8&L*{W@*V5SpvcC*TF~&Ul11K;B3D+m=oLMyOI4qmz-IJ0k|1R!@-E z?n&JGNQboy>2gQX5@L6ZlxYHQ?|?vn=Y&RMR9gZkA{68^8k~ZZCFhC{q?ZjcOvKXv za8>+boLA4e&eg&zLx~y+=2*KOt#j)-3;HLD^+^rMfHkVOhyO@yH3xNB>9^UMTxV*I z#~aKMh)A8q2apuhwEet|Do;T7$UOr~qiC!o?Es`UkxtT|WJU!iNp=h~ib{4EU;M6| zrcH3Lf2kGMEjnw+ajQgL{>=T;ffvK=amRXG_kHLhXRJ$d64 z@z`~$F<=Rl@tVMDf_CHE2sk(^=V>S>b|+m=VtSb-eOH0PGTNuofBkbDRu4HrB4e)B zF_j#Lp0n$E=skLBzNE(2$Uu;;L!*fVT7GzO4!MGa6eta3C5T30XR@MX>v;hm6d*nh zsCs`JrjZ;Da72io35Li@c94tW#{CG>N@M=Bs|j!eqf$U6hAHpj9}}QD1E=LUNRSN0 zTI^9kB;&gJLy=<_xi@k^ITuPb1K!v4<`!qqcQ>8|9CcPsS`k*u!_xzPO+gU9WFKr6 zy$_33x!VVVI2CC&x#wBzj?z83=Bzz1)nB664E)D7W5OE&Mc8klF+yIU@Gy}(S5^{$B%W<-J1Pp2Zn4yq-V)8ermKF%qtk}% zr%~xb2G4dUcV1>Q9EJbNy_C%Z+7qu2*=59~5A3alEvV7}jJpW5y>cD~w1T0(_yI~I z+=CcHJ94OTf+YKzpcEv)yR1dwNgt5l@aHgH-(W%kF7J@H7K~ z{NZZZ4T(LtqL~(K;v2Q?gz&395{`nC1e=KzHnu|!s0xF zDf(`XH1i3608Ptx$tpt9z;dKgeww1`A$vg`WeFfh9s4Q0s(`{v_WvG3cAw@sRRJU# zx#qoPmvbj|@b})LudS(=G{tXZ4NCVtrgsguOO$VeUB&#oEQqc-!o9@}uQu<|7YrD* zD{xk0)-yN7vtod(&~^YfK*+zr&vqlYj5`5IwIPm4ocC=@bA{_0>?ftV@*5R>Sd&ER z^X7L)bXS{gY9y!G-NT=?D9DBh*n3aI>e z2Fod>MM);3SDCz4UqUK!`-rF=Onm_tWA9Q0&N&b?fDJB$@}7pzuJRdlFvvufi5i4A zS5r>a7%SVF%K-8~t^C5l;|%7-zG4MjSjha-?RshN42a8fZ{r_dTa(>sp)4<^WJBc2 zLDm`?b>jwTWCmR!rwhO39$`n@_mE(U$M5qOH9khEy>b;(049_{aOkRO3Z)<670ES* z`o;}y5$*t+Dc?d!+izcNrCBwvS!+euS}xgPBv+ubXQS_D+d-Vvn>&hhZ{;XZ51D^v zM3J|2qpTtglKcqf2<5;j=r>N2(kYfo9rJl`a2)kA214`Ga>+1o(7s4J3YNV6>;|!LZpd-)-e%t z66LG#`7~<1lCQ@Ksq64zspJp3uGlVi{k(AjCr{_zTUD2YkAXT&Q|_aczCb5!{LdJv zxt*c~TxjZ9A|a)4yjo5#B^Yp;DvM_wmt}W;FAF^W*sc-CnSUm~0DKBU*lF(eX>eW( zq*$TDl`yD8i3iwmQ-KpQlwAIH?@JLgH-+>Md1mU|RGrxe;5b_9U8dW%WiU;o))Ysw zJt?yqmuC*TMbXnpb<^;(oX)qVpb&kwFE11sz!b>7?!J6D^(h-gQc8V)<35gJlR@`WDLlDB=<$ z1+7Zz3*Kfpm>F0Zh?(aZ76?lZH!)`{Db$_me`U^AZ*|3+7r} z)=#xf95;hB8{GjcLldxvhTXa4BT!X9dh=);{5?miln@&wgwSosOG~pw#?Isia$fBm z-#mvV#5%0wE+SauJTQNTBe`jFeE?3al(V`CsWj5{F+DM``cQ6*>L%%m5ZA*{O~!xr zpxUZb=5k-X-%b&HDcxz~pW-nZm+B~{3z%fCnX4)7JC9fjRcR8>h6jrxbmM?yu z(xVSC7kP4*KskU;r%y7H-T`vj*ta@4<2@*Wg-@IE#ENS84wg+(Ny(-@144n(5p>9I zSf=TM^Hp|Jsma*I0n(e6z@VPj`(JM59TLMu{x6mbhiVdmgj?udI7D?Z?k!{{VcQN$*H&pT(&+Y*|IPZU2&{|W^JZk4mJxvk}%AbU&KGTa|=P+Bib@5DWfr& zaR*5@6m{>^3p8ON@^GrgaXbDQwvG4I9P!!zX!|q?P}|SR)aDbzFh_i%YeGQVBDAAP zY*Sb_{hIqC0dU|E&nF+wXNS~pV|EsLLnaYgH>|tSYOS+acx2f039oO^_I#p+!ic)9&K%G*IJ2nV#oj9T6WhGL+WJBQ(4O-P zupOgdMFS=OEm!^1X&L(UE0=OqeR_v4EAWS|AislPhylQlyaq=s6mqo`?K8Nz*)Z8X` zTr@coFz|dur-LhE`n=hzSfTbZi$*e6Fpn=S9>-c#IYy|OG z_6{k#IN0T=mH+)~$H?Tq^#>HzC59301cEa$qkI06bNwKX(sbbVlQp&T*`%ws1g`S5 z0~P3LC%#t1_DK;NG2?(;25@YH1p;`SQ>JxRSfLIWaCe;2?z4)}Tqtvc9;-_;@F$LK z0z#nhH6qOc?o8xquIK{@qR6pLr*GbaMvorc{-M7bq7i!a!kOg)^STeXNKna9SHlz; zoP+D6{?~jKU-w8t=CUqqTot8`V9u2L@n@vOP?7ZYQcm7*nnkC4p$=%ck*O*pUSj-k z=1ZqU9vCDG1Yuoi64a%xDGY5s+9_aYzW$1Za0HzPO*h9P0%|`m7C`+0Ej3F0pbQWa zP)-h;G!v?!TtoF;u5cj@8qneAviu>D-8O4=kXFlqM6c3?#n{su8eblyboJ12sVeZN zJM%m!BDX@H`5&}o?d0{R9K@AGy z`q@*}KmGCr?{3UyfGXs`Mtswm5)?HHkPbQFz_!BFMAo3KlI3rH>yQ7t$>ar4RhGeD zfJY+N-*2pu#7R)+aZ5rBA44_s*5ACW-8h@fw=9hXZd~t~)$eZJ(2u_Ff?gu>O!+jg zioA`OS}nl&miX``b)dq%;guon;HA2B5j?+$dc!-lgp_3-H>9qji>Dcfc~CZu5d+7u z=ART$(}Ap!Xz(Mc!f!AnVWM{5$#srE39!B|Mr%~&mq*3d+}>V)dz_wmg`gh*LR$wu zH6_xQF>bB~GTR>SsYV9KbkKmj;qrz7qT2&>hDEL4A9;EVhm$j-Z9t_D(GU`e@0Jy&;m zb=8nv?kPAPUCEp>;|hImI|(wATv_+nZ+t>rEi};MnV;Vb{uu{s<+O`(8O0CQmEnwL z;XSvk?VNu9P|fV@?Nit^I2MAZe_QhVO~Ia-(O`$`d>3QNp0W8_BOPe@sCEHZgT=LD zuE9e%Mk8H77xHo%Z*<<-3VkfN=dj(7s&9?-?4`Ld@$cy~AH^NMzN`8Cq97~w>=F|9 zJbvFJPIr}ZRZn_b(N9{AIF_LF011iYT3i3T!t(2cxGyA#U0U6dHXA__R304sKAj>h z`b|B?gK+Z)o~-+Gb+Mz#Boy3ozRm|e!)z7KZW;v7eXyTU+v!4Ucqw_!7NIe6&IB%S zck#&sSq-gi)fenM0)T-|cJC=S;3 zR)8|L85SH+yIGcd{;)76Hy?Z0GLID+w9do_meqbqC*}|XK zjyJP4+$arkknw>rlb&NYvmnLna)AXoW^L_7J|A6WD4VXvzKqx?l_^P*jc!gI75U|ek96gf{BTjq=6qZ(-)$!3yyR;d=SPyMiwixw zCOL)(mV3~K0A>lTEbt=X2NEz0GZC`6$uEvg0ba1-PG{oa^s=QB8sw2o%k--Wi4IMwE2-u zPuwc+La;kg5VDagxFBMLR^l=yBt8CqA%U%hhm1DrKxWRK zyvy6Q(MuQkesZ0w3_>Z0W5+k#zctF@iHwSk#_yw*=GHkg%da^+3S!)+rK0qQCaREK zV|{Jl1P&pGOnClOGqri=t&~JOPMi&nZID||2H+X(%ahvd6_)1BS zEPaeF_Kmx3Rsg|d^ly8$oi!2eY%Ev2=#^5jgiP8}+ zc1771Kao@@25}0yDpXk0Elu>sVr=;{NrddnW&tl=us$;nIbo((Oiyus%%%Zx(P z<1CTniuLV^kpEI;MX4P@y^eYu{k2mR6tFgz3=vUW$z!Dh<^AXqvnYrU>*Zgi_>ddXGlyE!!b;>el*h6O5aAPDqp^L`|9 z141sgEev$0x4`H#lL4!{dMED|Pka7T7<=?f!M(1*1+vE`q22J=Ak!JVi zBAC43+OOOc;1V#=k_7jXGV~+d5{q&%6J7EwLernD(71`>3|@&Mz!XgADeR}wTvutr zg^)*w*6HwO3dETu;D12HoEk>mgq16e?km$yaP+EWGpkk>$evMTB|@~D0R~bxiO1f> zCD#(k)gT_ngUyYKKWt5^qel=L3dl=eH(j|>%QB|SreLqKTfZSG*=Zn0flMo|QCAok zPgTpecXl)tfliT!C8R*&uV7pfD~4-hPt;J;V8Gb|UlTe~3=@ zVg0NoVX%MdAjE3bpi8#~SC=Vv()Ei#I0v;-@P+w%mG`IwHXz|)L3hpi$cb9$-}rf^ zUsTv`k)7dXo@Dc7l08KPOVW_O0q=PV3Zf>Z>RiAeNRx8@q>^0mt{Zx?g&}p)^zKYU z2`OLp&hN-3`Eo8*E%}MRl;(5vUpMi&gN!pU$8kOJMPU%2URaCv8S!F}%1Ib-Az*9m z>2=!ZFJ_6ScIK~yK+qM*{-WFjd{`>`q9;SH8Shs(f)${NI!+X#kJ1f0T;xlp_rZmf zsv%te%r9wTkUi2?q~2me#enM@5il5G#9Wh++_1>>#QBTD$9MB0G8yJO1gaP1TnBOR=3xd|$$ z7Fl<}AK%=-wo_)Dk4iAIJ?rFg9M0u?&2!btzo`~05}0x?Q!{6B7ke){?d?7>_vlyD z;Owh6cz#zZSWKF%qF=2veM=o?+;Zz~coeC_Jx(e#Ni_M-JoCJK@fC-ITtI zS)urD6~BL*E#ftOYg&Y(b$3flDGkWNj`B^zg2f_CQ{Rk8y%Xc@M^T zPYvZPFnBaGn7AVD&b_z~%|l1f*&bW)tHLUsfI1BDmAXMX9Q&g@Es$em77@eeYs@ny zwTpLjEqFadiGztlLe)F4#nm_BSHWBCKHUG?V1kb2cf{$SYj44RuV3dPNtr2$R@b-% z!V$n#f~~EMQG$cEWHbUz^#tJof6bc5__+l$?Et*bA*)KVs@hA*Yi`}r!3m)gtaMDAKB8<{9YwjD6|_IoGgKP!%@sTj_M_*ae`^0YjQ9nMWUBq3x>OyOIqDm=cFt=p)S$79@`MvB`H@EF`B}F{+bt zdu|l#0mx4uX1mH;Zr{VV5r63yxef7CWsYfwU9VM-j0+^7j5Odw> zq%&@(o~jo4{1c&`_Z!XKJjAk|=Et6F)WhOc2vvc^7fG0^>pF!6mZ&tm19b-&#zIK- zxbo`QccLLxka}ngf2Qvvshc^myW`zc#aQX@=ELWCSRKvXZK+VVSD?5bVN+0TTY0|R znocf3m^QWDec_UKp`~Quv@UW@EXVz*N&ri;;ZXn6qVGdnN z!kYoF#=WH1sVKkUGx##3m6+wrh)+PG9`FO9j916ra$EXdF4z8YwyuyGLarTqWESMS zskENjS^zCTi%WRvV7`y%_oNnj`q$rE&Ggi zwasnEM<^QliT{k0e-o)KuW5#B!>sF1{k5WE;Qk%Y*A^8+HH$$oz9i z5~3+RjI5)bMY3BRDaNG^bki0zml93QP{y_^@HMKtZW5Rr2>?{7J2$GX(S*!Dct!ht z!>|o!`Es3(^XAp0)4IL`&Y4*&(HGp`YZ-+Fwt^0#cc4TqFB>|-@45aQnB!5J2bOOB zJrbrW)w8dv{ceE7ybtvdd`C>tWD?52phWP42xg%1am?{z@{-&^Bn`>*q$8y4EhHH_ zjB7NNCnhS=?{RYdbZAWX27HoMA)eXdr(}|w#izgtpFL|?t>mlcy!(3`7E;X_g$h@B zX{g`)3rmz@OaDnWEpTl%ODZd}&@%2yyP?x&A~x6!&%TxRE+`b_M6W=*m56W-48bTo zvK(f+&2D``X#`r2psQ*wQwM%D9s6&%azXuL5_HN2lzF%BiTO`ovKC9ghMssz z+s2gKS$a4q-vN0CJNO~i2{Fc+jiLToyb#tPViln4WmaMF(6RT&Nl(_Ngy6D9_F9#5 zz?qV$23817(oZiq2m+t4(sSc890G^M2UJCxrW059Ol7-{TjSQ2Zdk|o}Y^#(EHCX>T(+@LG&M&I(V}Q7kqVb#Q*HEteB63aVSRu6g=(2YqrA_j24;OFblrmAiG0;wbvy z)1Ykk@Ew64LeUu@bj)y}xfw({y$k;H)d6}0ggpn_iGhsQPi=+B^neB+81lH~9Nx=5 zhA^{=(H=`qo}*6rTLF~`G)XS*5;2(iDi@A-u3)Q@#6{oJPT5346xL3Vw2UVg^ zFw_ZvgF=727T6Jb_2nqhxI|hE3YRZIS4<(5_Fs|_oOfhXyD5V}bcQ%ftWzv&WNoko zR)oyDGH$OCzyI%?BpkfVBR`kQ0~Y1@-0O@}7DFl#Fn*cy-3M;bNnM(w8_j%GAo zy1yZ%{F2qL1C?Yt`HZ?_m{fZ!fa&OlFZG##j8}$a7nc%o&;}6^-{}p;dSmx8-+afn z9757@d8D3V*^R0wbsoY3-dBl^{2RM^-72@-`$2*yVnbRZ>Glp`U;RLRUFyPm87+j* zoYU}&?Wq|qqv##ZkA?rw{i_k2#lYyvGv+0NE_rb^T!eg=|6&Yq&bC*|M7gN0HB}`Z!l~zG&lBu+F}h9j zpf8=im9E^hSok!N!w;+~4xE^m4`8B5wcPM(Nc#QJwP>GeiIF3rA-?5XFM#En#%&r6 zZG(Tfw0C6|yueUey-6D4JHeT|;yF!oeapTsV3#*}74cf;k>jQe*-nMITzK*8b6cW2!|}& zmQlseT+Z&9hX>?vlD3mh{>W?9PENYH=PJ(8PGY;Td-E;PGE`qEKMM3p(z3_HyT7#a zWE3`aMf@+D9A5yjk4o?ZF~1_`6%xtwUYtvSdGH&w+HF6 zJEY@RJ#>Y&*ANdo(Zr(i)Sdzbm#=$UNhZe@4*wvsF+>0bs%HqAtH21hKT%i|fAw4w zt%?WsxNAxKF{q!|E__F;)EdKrpw!wx%Q zCDrtTh7#c;q?Zlw2znZTqMopHcbdZP>(?Z#db+XCLHL)sshr)YHmI!l?vy+`WD6oq zcec(H2i`OL6VEb^_6-4${+k?45*AQAqDH&plw4|%S+lXyk!pWsCr4+zx(_v95+V!8 zpH+&u0HUfjP3NsS$DaL_F3GU!KdMLlAxYPHJ){q$M34WFZ5;Gdq8aWtj2#n6W=@N7 zR~SxxTSg4emGWrQ68|2CD^w@d9YfO(4&Hc`!DG`uYWk4@%)`eLIG#{*L~WOZMDQe4hdFssN1G+)Ac*l(D6g<-EFTRrkt8BYNYQG-1LSNqnAE$ zoK{LO)|w1z+t1^m0{tSGdIO4diQpZy4pl3U&TWxM6`6qkT!0tqp-WO7MnUnBUmaly zqDt+UhdQrKYd5O8T4UU_7{hu>D6!6AtsFW}<8Anqe;N{-UOWExc04ojzc$y=0ITIM zrHD@uUi^{jIY4wyX1VNODVMnU@cfm;&-B7^EG4TQs~_*czOIOMg0K8XXk8xo1>*(_ zdhhoItLH)jas+LM-K^1C-#xl@@Q|j9=An9SHL~PPM(jZ?Flv1}RwAR;AJVzc{bj=; zX4YiJz(1`&>T?^MeBpp1_$(@O&*MUxuxdx`o`p-xNSps;)(RTu7r%0Ih~-&!xT3til>`U(;1j z5jYT%PurwO-c$K0X)e|5`1;tns#5@L0wA6b_p9`Pjg-1q3BDqJErQ7c+hAc|PBG>p z{Om(F;yy5F4@Ang(ad=n6Qob;6C(p#;}6U3Y%Gt0caF-`R6 z9M&nT^nZNL$ECoZ*?Mg^>>SRu00_b%Pdo zziZT!#Zmzn5P7_Y>Z4&e{@8%xGebc&n)my1uhS@7bYU$G$Ph2W4lHyR(h0pR$1&Bj zVEV<2m|V7AosQ=b6eMSInp{?gR`UY@5V^yc-6Go^dCoZx{t`dAC9Z+?R>g7a6pORC zAVnlh-z*385h%<2Ht~{K8-hO?Ze<@BEomvUcC95dv$kk!rJ{48XwIr+$%NLd)dQX0 zRFXm+uZ&I0t;?lCauAtov1~B*>{9?prZ>A2e$hf`+?*Df$7<{NTWVdjG_Vh`vz!`a z!V&%1SF#*`i@^vt+Gq0>zJSaz9^G^-GcnqCti8B?p0b`r=3TaXr+BZN#%V&^wIeZf z@I5`ly;Nj~oxgN2ovs+}f4xYzVqRG2Rp$!nNOUA9w-&T!C)xQIPoovDy|JtO=1>L* zV%^^k3>*a@U5q|~;f}u3d*Q;4| z=rU92Le*%IHEvo1Mx$I+`r3+K{o&T_ejST#+M)++;4*?6nrKbt-md!naRaLwr^g)Z zBx0WL6#PcjIC^}1kvGHvvMXFdk4`x#fCYN@8rhpl;%}*q^-Ho+`P+aM+uqg;_AXAA9am$4_f9CcRTa@QTf9=v({(tCPr&J)oRxIB zKr`Ktx-s*>l;<5g-to53TVu{wV&u~7iYRALh28La?0}X9~x^2uAtQUtJK3N-j zIXm)4Q1f>_aj!zkSdDOk+UL&u39@=DbOtT|=8)QJ1ez_gL`+_m@0w@bR{r2^h4_co zPi`{>@pYiXaGBN(4G2$&cQ(z#3qG^i8DEc54ws_$7by1F8T zpUy!B%*nR;s6pHC@Y{_}?T8sty7peGjFmL{jk??YUkMZm%zeQ6T$L1`sUrZ;cRHz@#(73@GrhZQu-xSA)Ii2Bt9j~dmV zNm`1FS^7Y4oa|1kH#!kx0LA?@@i!niw`@SX`?|5)VTa6TyO$c6{f{4XLS^Rz4T8rB zD@kY*B%x)zC%vd(vYqKKE!^wdsSr+0r~6TlQ1)P}gy=mJ-R6PhDK97bb!9diOBi!$ znnCN!>I?hU(nBq)Xp!gNl8+)Ojpov!oy32%8IntW_vHLy#b6Pf@O+h}HN2(4ifW>< zES7p6{5)qGxyNn}wI_iWf(iv_Gf9X*7_~wNYwwg3QiDBdR%B&u@t{89ORHj9yIhGa zBB%#%H=$Jv!&LiHx&y{zF{1$C*U3C2v`Kh_(tLzzj_ryts4k(5!HF<;*T;UZz8P z6A>=d=o-xPkPp{KmTZD}0(?a9dZbwGhWiz|5W2Z>d%6>JexjM0IS1f|i|HI2OKrUI zSGq0SR`hNqP_K0QDYy_rZmxci>VWS;P~F)NmQlvL4qqNaW3klreOESHT5|o;#Q$uc zJ*m#t=>jhNFh|^kX*WY}5KU^=#bgFYhzg+8hQh!2!|3$Mr`K>vn9+}B5jky!B&(_1 zh?n|9g)5QjgT)7FMi~x2;!4qwPjmmRQj9{tyV4BZsaSuNd~L=GTyx=1i(3p+KN;qn zymCsRC?xufdUakV=OM#dnNz7Ir=zm8QWeY{CN(nR-zaZ!4}MD%UBfxpz2t)nGD)@i zO>1-cK0T})JqGN}Ppr?EBi+;rUTiDEgIphl@R@jc7COBF>RJKAGs}n;TeO@0R>4t1 z^N7iWjNMj@cC(UDxKVr~(h((d`G+C#nK=cx>}_`_Tu@Bjr|+u?&#?PJZ~% z3E%hH<7>Lz^j!8U~(`ACh`>Tu>`eTaF*bN*YJCKA5# zkF=#$I>S=M?n&o~jSS*UD$rXDc5(;EQ_vEpZv@vzr~=m~6mr=12-|tGI~LO!zdLyE zMU}_YC2`CrVTA2LBZ8R>uOQn)Z#jKsQ-vcH)FEDWSWaT=eT&!Ag+u3Tva+*Sgv%$U zzv*@E+lOo~2^EwJ;yUhCgC{GvZ|8`d!>qvqzl?_uj`YsMT0@PF?oK6D zFt&N(?<2s@Y=v&t%e51OBSo984O&7O3?{=xW#y-&ojhLBLI3t?U%Zr@#r+&5~t&ncwcSH zAQZ-M8+d#;3v6Au8X&y2ezBtRtaAXkUJAiWHGC_(uN$Jl8E4^F$!P~i00=^S&>4?V z9XvmbnpK9AYJ)Qs7seWoJKsrQD_VXIU`T7(`+q8r zCKzT#CrJUz{IVCZKh}rwTf5$froMoON@8T(yAQ-onz2@TnwuFmc6W7vK>e``&ow~+$^YW>McQ0-Ev5N;pd)jZ(fU60EGhq}*T^1~jp1QMbiC3B7 zXn~GQ#4nGkg)pcMKCm6te*m_{)fmCqv5sg1tj^qm~+A z+T$PQcb1XCbKe3iT4SKZYU4SbtxN(WA0t^@?qTo%NGx~Ft#pbTnh9&~I(z%&DHSo= z7mfPBtWmKvWbEvb)UBie8Ml2bfMWKN6PR(|GdR&r+^IATtZ21wKV{d;xGo(k+BE2% zvX=SUN;XzX;|PARFg-eNYET#yo3ZY23XO=7#{hM~=(L@uD#vL*ay{rv38q{QsYNy! zrNn#AS5DpFfh`P;7Lcc>!6*c`3Vueh1usDN+xl%5-h2D;$=jVcN}hAXO<$J?l?g9| zY2|K4ehxQ+g?;C5EB2dxt@SF&(zl2=USN2|yU>=L z!DDStflV*N_`#&|w%?km(pgHbId1SN1DbrIbB2$GEshw_xoXxSY@m{@HVxq+91l-^^{JhsysFlohaM>roUvZ@PA zy8o=5t8mOFNk9%x;4iS0))=eQ@8$ICiw395q8jFz&^Gs{l{sO+k|CPg=K=(LOARxz zGx<6>d4SWZPtM!Zv5r95zshvv*BNgos{fz?a^LLrEk;8Q!&}uSb6qiOPFRg1S+r-r zS+FUSCbDLXyjwWlL=l^Nmnocnn zkqK-5NR#oay|DFphMBgx7IKwa=j4he39lu@sW6taM@`F9W@7Q#;jc{O>Q${FN;H<5 zVWCj-@2nw~hcue2CNS3TLD~BkhVkSwDX1ZjuAhMvGh-^;*02H>Kg}YU}OSVS4MS6&hhX?vBTzVua5_}kwZz(<=w<| z(o-g%@NbM>qGP>=M=13E^l*nNDy%zjj{ty)@CjTLczS?u#C1m{#w@kOUg>4|R2;3t z&4e5IzGP+|U&71)E$x#g)8fu6`y^o{d*8Oy3&x~b>_WN~2@4}_Bh%73fsW{V+Xc=4 zH1m@y8}!CZd%rdhn;1;gO3~GRkk)$D!wYV_vcBcsXrbZuOikTfRjgRH&FYi{k5#CwpR-w zh+b!BEs2z@l=xD7fEhSN`!=w>`SgS50I!xQsA&j_-keJ3J=_vsXjWBt;F*tvgTt|5 zi`(Eey71uE@lq07a;0bH1{9fxBUbug7WObNvDQeTRZn-c*b)f5Q}8 zymKmNY6_1m$(!9a1T-N1P#tI5;0~GxM1@dM<_fl9Tt@s1|q7Y1;Pv{08Us@md>h2sR z`661I^^}72>YvY#v4f4UuGozM%Fq{ERifzGZ5(7U0l|hQ-co@ZoVxt#8X0xg`0-4m zi=T#B)250NDs5101C3i{Z8hstDps?L23*a|Y*!t* zZey50UslSeP#SZ|aejO_ROyam>}VHut6)FO?&3}2%r?U?yPzDJ)rfEpcej$H2R)q1OFdLd;hEy zsdghn9#1x!_SnbTRX2I0JHZcWmTuO*d=MTl9_gl1Ox|v`n21i{Ip@GY!(OI3fXij0 zVU)9OM!8m%0BW?mHJdpe?M$Xx4uXR*Gkp5LnMvIt1^0bYkz&v39$@1 zY&TrJsuHA#NWi6GrjWZw!#7zt^HtPL-j^B3HaPqShIxdy&xiH$QA+qFOGKxH> z8m&asW{NSYmlbs#a3KMGXdPBx8iPhE_9=%w#k`mrvn-ds4eBHDR=PRS!s|%+`cY@n zs4-D+?7*`ce0G9G|IhaajV@`GxEm~KkhF3w?V$+InhG)}mn!C=zmuM~u5%uuB0M!g zLy@2phG*3RXQ>LT5HGoG7&Bu2$(xBC`zMzFG&4(Y@8X^E%*W`cVG*!sdc)FM`llEF zw;J1T8Mu}yV7T4?TWYLsCo_LfEH1t?CpeCti2D}?u2_{1S( z%)}*&B@GTrGUxy_hA_QIiJ5OK|NLuB;wV)s7xr0mJfzQY<25 zfA!=uJ~JGdTaTlQj>9f85s97nn2{wyQ5&+Q$bd{}40F+8P|tc_eO-0~RWfU|YVNv) zeH0&P+iJFM96%>Jbmu^7Dan*9y$xt{%F|Z4uOe>r{MjVNt|or(*+d9jRxvRYeE}!n zxfI4U1vrfSdE}sZS=x6COLLTDDORJQ&0dQjt>7@Vg**&X7Hywp!A7;rOFfxPaOM@n z|MK!P5?{9q66v6Dm10`co<6UzHkpdOQYUAcUzRQ^m({ag@x&RG;cBgeCty6Gk2E<~ zDE;0ZT+qE#s`T9eA|tT+??1@Xde_m*F;3%3K@b3T^udSJGT3;0J<^}p|X}1-svwD&8^ztJUP%$r3{vI{G}-Lsa)Dh#`<=crHJt{|`cLdel{3nozkS#B?EffFtx$xS@!RdMBkn0FVRpZZ2x2Ban z?}w$BDNi{M7|e33^pEjJP3OFymWn4>+KMa);BS!z(VmNJ_cd{8nt-0zXWq-9N~KgVg|pcunc4}>AE3k@p~<(@!?eF?HkGn~s+t%AKFvA`^iT}n5WKcGU69pWUJ za@tlLOJbD{SvST@dMO{5Rnt#wYcJ2oJfNKFaRCnW-ZTqw=J|Giv~$lcSY} z{HyWH(}#-b3KcdefHexWXKPBjN|yj*iG#lCm9918xzu;OJvnFh8ni`Y9Z>!!$h~rS zaRXspsAGbrm3Pq#&4;&&A(9*gB z9@A;oZ8q0@GFuVodvTV-Er(UTS3z=m2*k)DZk!D6JNZoRiY;d%&g;z~s%NDB_63y= z!x%ntqnVKK% z?Zqu}Gri^WmD6UxxANM%)^*2wA}M9Spp9CWVh3AaL{{4d<;fv_2_RWElRR9M~le41k={%5fTtQotuY~uv!nLsY!y>>1JlDZ1 z7#nF3v=KtqG`(T6h$eigX3HnZsW!{(7e0wm8)MwZRfR}B8P=bF%WVxTx>c=$6%gin z4PU_x4M(rF-n_Z3iZ}ALWk@cnIizOZxn+?4S?8haI#)jxLI|%rhs&CM;F5j0m+x6y ze$Gu{>swtEdf4xmm*r2<)x-ZEFc4>cLG-S4S!P0a4HaPKV|sLk03L%1q^a$#BzH{e zn>{4K`xnUYMGOjFrz3li zcho(*C7#UvHEIp=1Ay}Ylnzurf8%n&r-JS-*}>ED zAYAQzP)3yx$-oFzeqj`)`bf>u{+MZg_m%Vq$B#XQRvu4!vHr&Q&iEQzgh#VIgy(|t za6K=^vWJ@~KY$h*CAlK;`DTETUu((>o0*E! zYJggu;r^-b^p^@yOOeBcxnI+DNSa4_$jD@&_HBTOpfrIjlx%ek(kr%7t<(MDrcFhu zR=|#Zql8{WmlWaVd^g8F-*N>#1 z3)*+Y#yedwoIuzK6G-?@VKlSY!x@hFa%qsQ6RuQHhNgYzxu`t+{@S^wNN9_=_!opgmO&^BjacHKLJpzw61MqvLmD>XSZkB zho!!>lA!kry2k1cc&?aX*&qfO6~rP^=DGMNd-#%1p$_|5Q+A1OV5IXR0H2XcLgOwA zv91~YsU?gKC@7eoWr!vF%~k9M7^}-+xKqr0 z;X<#u9%cFwzeS`&qU_N)jo}o{9Py1x*jWo1IorQi19Ooy4bkA-AK1O~uQrjkq`D32 z_LN`m5&zh5j5FLS9kg>_p(xN_N;-OwdEsdlLL=DGEq*Dba0JgqG@Stp8CRj*ZxK5| z8ZD8!+iC?h#sV8s?8J7VApo^S4-Rpmg|FTaG`gIPfRN_@AK1R$`;SPJuMfPrrcb>q zZN6%Ih_F~CjyE1%0=2XKJdwP>h9-~tw3N}G4Yn2vZlqtsBo-uf;lAA{b(8`}=r3g2&3AaMf(pQlnlVEoD zQwa<05Lm))>Q+}g8YckttnTV314I?69`g72xO59d_Jk8SD z<+ZI=(z^Wjrfy8)aaRn1WEkS~T$UWeTw~7J4dV);uu+cy(h_bMv;J)p=#k08B`D=! z69QLnjUUdlY#m$v33Y*qiFR?vYGbn3u+^M8zwHo;R<%O4SO`M#D{u1^`d{uU$%oX_ z_x;U)S^O425y;B$VlO^cj0s%$x; z@LSE`wissHcbIt`))3wwIe%i)N|^5br9Czj0eOER5Cw>e2kk{T*q3N5>A^B(hLs6y;Hm*bKVl=+d_(wKFmm;MK|p4r zoh)mvGBbDP(|I_0uCjPdKn?A&!wm-i|5P0lbpQo{^Ibc}$(zSOBs(0a^#hwbxWbX6 z&D-ZvbEzia3_MeI)4UG?fl&;$pxZD;XJ;dR8(*okS}v%IpJqNe_{^Y(yN25+LbUmb zAB_FC|53g|PHA)mgu?yl5g`^K?|~HpjB1?dDbN7YRi;sKOzlyJGw9vx)4Moz7k>u( z^!n?RTsh0x=S~1x@q5if|G>E7XGRSBsfHTD6?&faYt##ur79M;rPe>eA0H741zz0O zloM1`8z*Y{Nq|*7?!W!Ez~1wwf%-+n>M`d5m2-u37>dv)4k_G#T`1qE zR&&>wZWU5Tq5zDBi1S90-7zE^y)qo$Ph-OTsVei4iaX`^Ix%s1U}R9b$d&#C75H4` z3~qj{Pw~<2V~Su6ekTM(X=V%_>H`+^8wS{sUWfq&c&zN&!;m&RDK~gaK{#X@gGsq& z9)J-MH%D2z$elosqPr8ZV%j}Gn#shrW;=#>tkd6i`S4$T2iG_H?vF_;^o?GXA)c@o zTsbdI#rTc0by3Gj;qbgaNS(7h!0@Wfz;y-Yaj`)(lgq}n&DdHP=BK~5$hzS$!2XCp zS3dxj=SV*4SMW&vTmwW*rQr={=hhXHX7C+DbMJlEKGmzlSSEY9jt_=bC@jktguqv(o+JWVbBI8AeFCmv0SxyF$v# zIejHDktDO|vrBU?w}XsX#YF}541*W3T9X58buY^T!_Inyx_)A>_=~p+<&(<^(M4wn zgD?SN@hQ$3g2UWfa{L%-3-6*oCWrEWHHu4ensFs1Z}WmkIM0-Rn(;#R{oa7d!f}PL zzvVXDT3y}v`M2+;#VFI`q06{Zf`vO5?Zq9ajt3~e1H$KA7oy-KSOurY$zL5$_LnaZ$A*jGc27;ks zw_=2wfxKn6{jeUOlNSO6+Lc`;M;So~@Q=2Tpu~s^hZ;^jm1dkd zf>h9lvQV!{q>L*G`^2@cpQ?G9(xgFOME>={5{i6JjRK6we5qP3kTtT>G_GDmiJbtm)& zU>^T&VB8rY2noiQ$fz=cxYg9Z zjURIAf@x-XPlVUcP*i*cXDg@~M`7Ndas0#J5BH?jxl(tNopq4JFno)Z`HX`14x?4A zeA}Jm@ncYY8~7j<6_h%p#IWl&-Ce>#Er>5#0wZ;izL|!ggkXV~cBX2o&M*)+%tgaY zyX#y;VnDlQxdB6-A%myo6Eh>XfW>Z?YyY^TXN1+waJ9mt?bL29Bbs4O>2$!!NTDf1 zV&b#4PrLLgqQkXU!z+Q~S#uh(~@hR)?to76+Nf zT^~|8$%k`Z(|wSI(VI6)8l05r3a!OTz78k#bw2}+yU2=G2tyDJdPx%@mih%%5f{jhS z?pszmf}${Ew^FP>ni?zRSC71%hAs|v7FpAFj|i1Xb#TeFMdmJ}px-%_A69K#N-ZPL z8yIr8hpn$!3kP9%5xL5W&f$flH_7Lpz^ETn9$N$a`iDT9)y_P7i+p6CneIuat9{%>G~gaRoM z!mr6UR87>6-&-BgcQzg=rnl#Rk{~AH(aOa-@8it_B^-A~lZf3IK>cwZG zyMD`l&;$PP9<=r5Zo^xp^-Vv~^9xkn1-;=11@l6V|9bTai0@UfqJXS!&J zvHn!a1RQY9yFcP|&ABy+w5-?k?>MhHrxV0!CRh!$u=c!LF83Wc3ZX@KDU3`rBILl{ z;AEjznAm%#0eg*_{^N%vI!U_`9ZjmO{JuUT|MKXLG&Npn7jJka!X8Hz;dC2_-PMV9 z4%}T|sgUxICG+>Q6|4?dt1|MIi4)n9<6U>{xtyOP7cNu%X!LhMrhoT9xWzGc@>Z~5 zE`Ko2zgqP-w(4xEP z@>u;4UZ8n)^%Bs!Mys6hwPDJ*M4ZtQv4t>$NDTLg)Vfh1`sZYp2wff|yRjRHgu-3U zSXL|I#+MtDoWlFQD!x~a_0EGK`pXcP?Fm$}0l$_U19~dBp6=?B14BKV{ zY_Kgn$a7!bi#FJfYktp30w&O@>Hjtw8q`K>mz8)I2^atoF`H5S)(bCcF=V-0R>h;c zqJEdpWr7RV2Q7$ZGUilm$$~bNo!46pVa%0FtTJV*Wf-)#aj(B4^0){Rg1pKMkg=zy z)*NJ!(a%;SmM!gB80QOH3adMHqCF&o*K zC{&7cEa|er@iq-Q$j$Pvw5ySEAt0fjs9jC?o)-6yE&qJM1OZ^JBX$Ve87ic7K|_w1|=-9-noinoW{DJqyjwtBZP zlvL8f-4d?xnIK3b1b1t!8V}&PRm#`*$A0Xt??JIIQd1YhB?C6$R^(bl$`aXO@`fuR z%&5op6PJsr&}YcMo-?}EQ0uPz`j@RR-e*;N9XoE<&pGUfJSNqT^l}q2P=YTCD0y-s zRzmSrWx|US0i)dNG6pW*7(SZelZ|P<^M^&}1GsG5-cyExJ;go$h5(sGuLVq#o8Y&d zIoEv{#8??Tbc1C2LT!`X;naeSBMR7Ql~qP9(52bF#gzwJ?RySvPhSqGP@;x#e-Fll z$pPj$Bj*Q?#aD;_Fes4CFv3!&D>bu!2Ic!7qV1i_;+CI86`hpWX28>V z`Uh_gkx>Pk9Yw6mu<8cih?@T=!OPp@)90T$o~MWs1w=DfsH4I%JfO~Aj4$V0uI2j- zzwOdAvQ>6gHAyKkY31Nm5?fmoBjnBmJ@R;k> zpos{MOEhk?qGM_h~*3)ct6kAa6)jnce zh&6^DC_qN{aOBjTdHVZAXjVJ{EEHE)mtHCfOwR`AULrU2yvE5_0WY^E-nCj&s6ltPb_ z<}=l9wHWASn@VOxHOG3gUd|jf8(FKA9UykJ#_VM!^;S*XMwjP)xoaBgv40x)hWjDQ zLU(&li{+t7^2D5Ru(mWHWV^ry@mfTU_QOZ_FhJxNUB7lx0E_f+^lDz9qVj)Gg{jv_ z=RT(T`f4)aBRrsqYt6HxE_s4Do^*8Sk=}>NHuaj%0}8d{B!VGs*QMXgTPRPCA1%7R z*&J1OosuOpz|}rGpIr(ucj_&y8Je~$b$<>8H3&$OcIIbX*;5OS?Il~7?Q%`Rkv}6$ z$gk|IvM&_d25|upS$$gy)_Eix?TB-3Zj}%Ere5-sYakp`Ot!uvBsR%@XDU63$=>{V!8)ROo8_cw_|30p*1oe0+#-|PGQ5hQn z`nXpqr_PgAt!`DyB)!-ERaaD>J_$q^j--Cz)+zfz1p8Z@v;Bi0Fm*Zw%S?QBj4bTsw}iYX0g3q#e&iG2Y`q% z6;eFd%sfUhobl?Vs zOz(O7ZXJUR=)2>zSBF$}A}h8T_Y>!)=wSB)f@)g0em9AQV5LfZ4nJZcogz?kPfu@W zxW~1@=*G-fX|MLGjzPj9XGZZ`ys9LCB~)AV{)1#t<+%LiOND#`@ybYlBG?xUaT>ET zBBb2a^W46G+j+oj&4Qxk0m)`*M&iuYm$gE~9y=t^lLj5dzFnEHh7}#KwhUWxEz=48 zeG~k1Rsoc$Wmy+kqh@Xu3$R;0*NX8eHik`MRQo+n-=C@}c<5UH4?VR>xMvJ~I#vEkYeXosRJ*Ns72{ zO|R&3QERcL=x~8M9)~tqdOqm$3{vwg#fi;Of2lm7&yMVpEqq~=?$>;@w%hx^?0M^x zmD@sh zhDNQ=p9`xW>aMQJ@B>9-Xv!+7)wwCvnTRuFe&v#g;2$4Gq5@*n!X;Xv%~k%c$wGaN zVD0!t$e6Q|GYQD7xq`icGkL2u=C0Z$I==yny@FAqrAG2K36$y$O#PBs^!L*B60ca# zYP;uA6+CJ|HfY*{Le9s=f&sW?r85OBdg>&gmOtJ9h@)a~!!>V*L)#|ymZ%B= zB1Eeevph^rp4e_afF@7gja|R;W&bx<98=zPAc&nW+dHDTqO05X^9#Z}rLH34l(0)- z$28-Xtrw_GO`99qO;YX5To}S;m$KN3QXqtDCf+pfBP)K^OTYNfG?vg`2Cy{oqt&}{ znS9muDDRR7GGMXSra%?(m$XcMP6xrm*)K>oK|k!4^nG#I8oWshp-5i>Q|;mDK%IxxPVwAHj^x<*Sq7pI_j9Az^)FR0zM9pgjy7K zw*&AsuwFh_aj2;j%=wJ$2WBJf;2>jQ3V9s;|v0A<3z)<5i4v}s=Wp!-|1(WY5`gsDa#o25_je=n`WZz3|$swPX{q3G3eeK za{`#OJ!RO@SjZkyiSf>N)vx<6VrAKFyp)tuLs#HA+smu;@=_{@Q1YxdE5i(v{PTxa zJ`Ptv1oAEG!WT|rF_IMSL*}XfIm1jWgR0doP~~!_Rc%QZ4GuJMGd< z>ztj%Zk4Bw71grBKDkjGmkm?Y5li&rpQj*njAih_L2gr-r@fos zdeW_W zv5(FD}Vzko$NujFE+H?IuD(9wJH-z{A$u zJbEtYk(v#gjbLiRMQn5zM7A0t4tM&j-YVkvXA(=O{UVOj__mS>H(qI;%@5$NOSmtE zk!w_$I&T{c){cXO_&pieX(MVoV4XB1oq?)EBr>L9oxF ziJ1flWNos{IFVHmG+4Cs1YWx~TF(Hd+gVbT2LO3m*&Sc#GGNxz;Jcyy07yM>Jw8dk z)G)45Eg1%>+*<8a4nk~}Ht}vi??1K4?pD}LleD@{1sQ!u9dSiv#_*N+T8fZ*#i6-% zuf{m*>C&yddAY|-)|KrBVQZ5;st{I6^6`~9w8sg8jGH6~=iDxa@rmz9g=X2CkVkc5 z6{>f4V~2^zsV*VMANgRp&>XP(k$5v6{Qt@q_a$X~Rg{>%IJjfo+?i5#UD2Y6^zg zKE0@`z6FMJh;melnr2~iXf12Q6w!cig;)1hLj8Pw^?%08N(N6_=&x8f;hn9^0*4^c z8l15IoV169c$qe=P+pByizwuqg<7YIXJ>M5+wtTg!m7XwM_gYJy1s>U&-e$8vPQr; z2*n-ujs3EW{txD^D&d}%;^_Pygjzlwy9l^~`6wcq;+%=P60Kuw>1)-`fL@()<^LpK zZn*bWE}WU&%I)=T!A@l83mdUc{a{@r`TI4aES5nP4V|~RI%VAs)yL&ZU4w{aOW`#F zlWf&a9By?z2bEp0S_5XPs`~_+D3=>>j~hCIrZu<$FTWbi2ck7wrM83nO}pWuIoVZ? z;q0m;z`~6>Z=aNN5Zyvo}V>Q0S(%5F#9ZIIEQ6X)I8c^O8DpM4UY3pMPaUa zQQEY2*}T^DsIltoeB*hxGRUMnCU*E`!^*FiQQ;X1O!kS)8&1oZ{y6Tgmakc_MIxY+gdH=eUt4>w4ER#Txbc z+hEqb{knT7u2c=jP-2c8?ir6j?Amuw4o#_{%;`fZr}j7YXy}6Q{?nxO0yI5h-6MSp zq}(B*F#@P-NJH-|N_D@)1)q8g{}E0kl$%|?Qm9#-&5#?ZIl1~Oav8e zP3!B&iISFZ;Tn*%FA9c^at;oF&O525NcaH)35}?P5AbNVYjnOu2WbZHL(t|%j;a9E ziEkyJP&(ZqnZ)q(XXoZO68-^im__} z;BO~r_%q+ZAL99LaPH5!KCV=W$R=(?;7QL#%flXq2f>1JULWXBQuYC2Zag$1o+)(| z9O3GBeHYs8cI9J}(3=ejKMjkS^#bw|F5+plb|G_3hh7XPCt?Xtd%H|H)b+LYQn}*Z zv_w5ywOH(ZiX2z$GIJQ?lq3frQ+Q|?UB+Lv&+#a^tBn(?x;=cz0A z$G#W)xr0(@L{|zMYH`oxa1;QXHSoiW{-0{a&Pvxi^Jx@dGx}_SpIj?)E?M*Oc`mH%PTp{Txb8Ur=kn0iEsr}E z8}fk^Qd*(TwiGfC7su-Vl`+zj!#D{>sRD_n`Ul!~WB+F_m;@rg0(n_kh*vTnmrTT^3u^D@X3tl1J*O0+x1?1Aod)TxJvhP>(+W`wiRJLASX{MclvGevKniFEqw;HN zmXEE&B{e1G%phmx#E66JLpLr>=ETrK@94lU|FpiZ`1s$P+!95DE${r=+ZYrVAZZ)U zW?eJFk$L0bTpudqz;|C*xW<_NWXBBu@pTfeMP(aTZ~sbQqnpkC{a%Q;RuFqAv;U4DdNGOLL_ z7Kh{{+Dy89Da&-TzbWv-3M9|W^T2Q5?|I0DPLSCgP;$5~ma1?IWY}-eU>~>6*uNHB z5EJy?O1X0J_7qoSh1oas>unvfiES_x1%X8T(dt!YWg&@cr7MaP7TOlj2lC;~M}Edk z)H0Fs6W|k{|G^&ENvwXoc>y%quU+z|(oPC$z2y7!rvNg)rX+vGO9k_7s`=G`P4z8; zS&OI49Qfa|Kd1Be?W;(p6oSyzo?#%iL7Ij<-eNY(N*CFy;bPmE_w=XzdtJC9LJF^) z6*>EKHM9Ta5=zuKa{FY)I$iq)RXTu4!RXJ3RVHIEn|NK7JLPMv6W~MSLwl0lsuMM} zLvJ$MhvI2bd#1|a3t)E3#wp2C8Rc^&TP@Zq2}gmdA6Fb?|9+pDnThUqXE+|D`MLb!gbhs~8Ihi#?#*Xd=| z@+>odr)84oy^&nIY@ejhEVa`%8UUEZw_3&nzhB^^{0rcN8g7NG9!PW));cv_<;Pu} znx(nJ`}p3=4qBmAMr(xBwG_5M9z5cO&ZGP9SA*qdt)7{5(jJ)ARO0N-N9#3t39<#y zhzRql1}1gf14Kq+LPK%YL4rw6t_n+6b@11SG|T7jV;les<`UkPVm9?+(yGjOyU;! zf6QY4r*1L3Of5`h?Pp)Ek$5I;R1P=OutenYtiI5QYE_2o_6df0Pa}aiNRbFN)$Cl* z7y0c@I+nu3&-cE5-VSfnR^M$Lu*G3S|4v@lG6>`RRtf64cXW#svR|O=?+qvj9w5GV zug^B>4K1!|$QYbj721yy8s(*1@5G4Ab0>##-n&OsVD2CA^#B<4W1Z2SlB=Oy--zf< zKlIpGnC|XoX;#4Va9ewL|1QG+3h8w3d;C}A1!9-dX(yw9VHV7?+6BY_zD{vG1m~bu z>NjcI_Gx6GWp&tIsy-YZ8x$LPKfVkO`TuIsdCqmG$TZRzPtoZt?dFc_r3hLlx}!PI zqmetoQ6AbBrmm}TstBzRwTI7(%`JX!b0nO-78)}1<(_& z_9CbcV>C!G7rga!M zSgUZ{k!sK1Bbh7(yvr+Bm6<;)DpGQoJW&UYoI#NS8C6zYoOFaIK*B(YY-yab*y_3k>unsG*Vi zc1yl0wAT|`<#39qFCN#cY>N`ysr&$*yD0gCTT;Ly*M^TG{sz)$#r*U`+9G4^{5uuS z1phb0g`-nQEG$`f6@n$`hMMS!nNkIXtk;p1%&M3A!QGHl?^kq%>$jtIk}Z#ohI~4Lu8Zi@EwNz?o1+Il)-uhdV9$`p-gH3P9fLkQ_iRGhYWo8uV%8YW4=+Q}XS)P$s zLSYP88eH7RtK07u;aRP41Lg6av*<&^=utVPh8jPBg?i`bUR48g5IQz3bH3&q&%!tI zMg<_0ov&YDT&tSc62XW;r{PE7J^+LZxAnha!>!Xq|kLxtbkE_mv+yK>F#)j`or-y$9OVlrFHSW0G8w~DqbR2?c7r>l5&Iqr6(WpTMsFk@f@{-hI{2A4e1vki?t)5#{xGsG*8 zrrrYS*3@JRTs4 zCcEuZ6{4AJDvXbrlbccl6xR~DVMNmc^4e_J*@qGy!!biWqHq{s>isi*C?PIxMWg2O zUp4$bRbaD|hMl6GfkH1TOUJegsMDthXqRo5b-_4erAo)d5`q&)9(vP-g z{lHvZSyoqWEoMY-c{*&nfLk~yI8R!_dZQ5MfQZTzJp7}VbtR-9OZ5N6|Hyvd52GN= zotI-nPK>1$)0@28DmLQr7)ALQCna4x&2N`tGUy$KJxg$c8bY%Cx60&OEo?l{f6wNX zu5=8tkiM9K2O0&(0Yx>Pa*Kv}2t{oMLIaw`l;|mnPM?+^`XH&va&Z<(@Kfrzr)|Lid4A}UE-+(t9Lf+2M>(q&+!=z{!ntT^&_&DVFP{Vd}nl z@hgCDL!}4AhO(ab0P057uS;Jb*QkF6d~zZ!RTnCu6=nE43fcPEFt0hh@Ua0e-`0u; z#v0r@+Fg(Dkl*IIY0%Mj{Y+r7C)Ro}DOon14*jYrw;Sod8CCZ%d0G)qCh z5S^V%!At`?z!&c?nz!SwEnXAOQ<$qtijTl#zbRhW5rypwl`2=_Cz=?jbFcu%X>;yT1qz0K!D6|WpL)taf07nmCgdh&r4)pChN0f;8+-g!&_jrnW_Fk* z)MvQOKX&#TKS(QLFDTjmSixcUr_LBtUPL32u|uv5l@wPs;HV2z-cP3{o~tJ-ZG%`a z3{~KtK(*iZ2Xjd$-HXgFkdBTk+cWaC_A@xK8IrN!5v3k<^@cXW?${J(W=aj6Iw9!5 z;r>!LWc6!V-NojJukYc(0HplYavFZhXUt;fwqK*KphKff+i8hB&VJcPD;1@a3(}}W zbPR}>=}yYHNW1@*sBOjmm};;ew5Hcfb#5BA0`xua0hpE;EVO68@Fdg%LxBqkv5g#> z(s;q(OGj9LFWQvSp_4hDA>x`Po54M_?g^8gz*W#rw4GdChZE0jp`pDWI8MXG1w3c9 zfxm_u?yk0Xe^?U@q>uIr4M}2#!OiTKrh`Z03*<&koH(1IFvj{Un9w>LJI`4Y`&~v$ z;`PmpKZE#Nk3I(_{)@2UD*RrSd&y(w$*-}7`;jMzpE4pi%|IDlCBC zg9>W$rwa!ScUGLZxB5`i()smofkv9;y8^{8Ke7bWT^$=PM~>Gd(Ks-uQ{_crNP4IU zrh~zVwp{H0oBFIR$gWwnYw(i(GLMV{KU zg;a5ylol|5D>#WtGA`85l|h)Q!E_Su`v74TRSiQKfG4#!r5SJ?Vyk~ zhpF8>$6b5yLzV8lw{S@-VKsT=M1*=6%Cp|BBtyk#K6!i8LDptw^Ha=7IrvOYxJwN0 zJas!3SZdOSM`)bvvEH=N{_i}cR#lV;SnWvmx}J!TM(9<|z$Xcdao6R)4F)9Y4o`4n z`V4uypSSe0P+rnpre{aFr_x*Wy3dG)+8_eNK7Lk>bK6Fbd4aS`>UBxN^%zvw3S8ev z!gGHt80~_+iSwAE69!ys1k3m^L) zaiVOj;Ar@Pbyi`*@bpeJ68RUV{19aP;hf%mZ;jlOuzJRUk2AG3`aj_^F@m;G2Fndn zcHxD(Qk(uaQ}XPhjfB`24|29xkdg+f12k+63zWeSETXhY3b{dmWW;Ot{GbS{!8*{| zOO~djqcFPV5AC=M<$^!WJrM;~weSCC*SI=Idzc>4YDDajixhf3n>#RaU@clW)7UIZ zqm-1JA(Sf@TL3GHD`}8jWK?#b!q?g_(vb352`R?GpN4YMUl08Ct;>IyUr>0IBW^(e zoCu!y#%m_z`a1@(SH+_yD1->c?a5o8HgL?^tSIFk%Sn=@4Zxx_?L*Ud{9L&u zFdL{MD4d%z8I_(QOrLEb|LMn{m9iB8C_=*IF3)=Qpw?660u~*pW_{P!iDc&sMMlCZ zWhRTm&QwKe`WFfFFSK>79K}nI?D)~szRS*#gli*cj}DAC zr`(R3EsGWG2!*zwAn$#(&mQIC$= zIBmif5#_t0CX0Mo?hjW%!VjqEA3HRgGtSJ~g?MoeN2#R>6ezH9?L zT+5cycL(9lT--g{v>CnieY9P|3daTJd}BM)*AmWetkv86s@Qdb(it8`xj~c`5XEZp zp)#u7UVVP}-Vx;G$wz}Cnp8)LAa{sEP;$UiRL$PD$Q}+i%F%AQ5{=wSj-NT-2-)^x z!)hfXLD2AVvIbfwSgst}qX;VX-qxV`ESIZpV`nHhU+>@XI#~!%B&5oKc3Sq4gI@oi zQ=6O_`mb8~?*Eeyl+Z{%*ACSJ&%U>~NzmU$+7R?K6x z-%IQ87I0Rd7n0undxnFBuF0 z3gF_o?S4lR)mi3PMow$Q^!S1Hej7mN;O;^qs)9+Md*Dl{-hVYlf=0{1R`bHn>Mr#M z{fsRz@LQYN=~>bgord@8a=TGF+g0-@>UyP{U#sAyg0u2${bl}A;41l&h?7SUX*$>5 z-)gfXQ_z-Xw9|U492`2ENduEf;G6XtIwaPoVN6~jg`1;`p&ts@1x*-2^IM*FX#d+)tbGE@yF zZMQuxf~HLc1xN>Q0f`?Ub`px3*SSB7pKfuWNL`c4p~#)wCY_gkR#5;r8J|F@N*)fV ziiJe4@2$87q%I*U+{P89s2J1L{!KB=;9cNM3rrVl>w6p^>KGfn_-g$M<(Sds5Yji$ z!Zh2T_>GbNKG1>76!g(`q0L-ZDGDr<*u9+kp@j9Nm0ff&%8RnkoDhdcH4M#V^$HH5(m0^B3S*E~shQD4@LqHg$;Vv>P?dRCjM<21EwunwEI zTL||vH-u}G06##$zZ3T#RqCiZ8ruxdJJXh#00QpS)dOrI5UEOgkzEfBZhIY4SRWoPk-$Jk{(>91q?*Q*bPO` zKpQOQK#jyPUNNlV`d6|Z2uZP2(5R2(Rx=o-a{`^Uofq>wn__>T zyfq}!VE-b;iQ9&$N<33{ao|L4ePH*LLQb{U^{GQTw03!otbX`{7ChtNy!toN-M_Zo#zxCz_Ic_T!8&-SL zG3xqlZYa#9=&~y9j9JQOg2Vheh`xFGxEQ>`a;1FRF15h*sqoOE@;0X{Qr z&7mis+*E1%+Y16TjjL0nQiPprE|7F~3nP3Q{3z2B6-Ks{L&NH&K@N*Q)1FwFzx$CO zvi`J@iBcjD!r2J?{Lha9b2kFXy=|%$qY;G{!7w>;n-Z~xQ=oY}nH%j~Gycq!8q{X8 zZtU^{SIr;7JE$V`2r67^O^Du{>X*5I|CH75p~MIIz7r4BA^5E}8!Ft&ChY)yC-x|8 z^A@~ZIxjN`nYYQK6~^4iEU->6KtPoGP>h!&`hYyZvbZwbE6oR;0)+QM;+o`eAvqXi z*jxBhRpvNvUTs}I$qC|+2tk@${%CTo8sD}j!Vwg$MYxZWe=3bz2}6(R z3CjOkTERK}RR7=kJP$QbI&|w((A$<&um#b3l5tt6s7Res6~Bw*yS_7~&aUt&9uIx#-aIiNq1o5HD0BYh3pPJS-%rJMA(EXY?d4 zYFzfs(frRTS+75x}lV2l#xw@8$t#2VG!a**e45VDMdh+ z$4no;CMZ9cKneGladrWaMcyyWmIY-o{u*QwOzs;ndtLPoa%Fa5radV(8Vj2U%lyA;oq`t!tv z;quEMBo6pZy9!zrL!kG;=?3W757g`k5W2WBk=$ctFQ52SMX5_%imcLrZU#qx=l&*q zk{NANOtYYfCeb3}Hy;qH#;abaic9`U1P6uuA7V7IlU$R}6-1N^wH?YNKCB#EFyX#VQa)8W< zOU07WM9LnqM=!H3m}79Bg0SNV~lxt}kt5?8-{ z7cp#Dq;lV92Is-b7N|Fjx(^>W6DzpC<_l34cXw5OfV(A>t=4LMJ5?K6m zRq2&BA82`6FfdM8%1lc_62d)e0Zy=>d^yAbd((A>0Sv{!(&?q$x;y;uVoqmR0J;|$ zYo8yfH2Wa_XTo64TdQZIfNTT;)*zUCr#F`D7#w_(kOd9vnNy8%o))vG0)2QSW9$zP zh1+Nl+y(yTx%sl38WpntM_`iWo+W|!IT7LOLTfrHm2qrR5vWVjj2ZSX#WUbLGi^vS zyhQwJ8SLQCn0s^3PO3x`m1?7keQMJNNG{X0;cC6n!WD9T3Hx{(2#=>x>w*pQ*ye)C zR6Z%FmDRlAqURgD2p12T!-n*fHzMSgSQP{vWyfZ5oj#O*l2u9g3p<*1{i^8XAggw+ zaGE*RgoVMYl7`VwG&^xX z#F{ih@eAOIoq`Q&Lbc2}!wk}56Jm9Y`{(tU?zQdT2y_~o;)y&<)%Y|btt9KG|5F;LWgXdIZRMwPDk*KFoBm)&@mC#1 z%ya5a7ueR`385BA8{yHE?3T$PK6|Ej5!pfq5m=Pjvg}rG?wc@jW@XN-#Q|)4qcnlH zzsx_jcJqV9%I+<6bIfo5+4FC0m9D&ZQ>{hLwveis_AV3m-QFBgS-)~Gg&Q?qejS#` z;grNL(d_^(QPr-olFXHFPcdLP;H}fg!LdG9_{K`ZZKZKUFM+C0AF(+RN>uG{UBJ~& zF-)yq5@*cq#&4Buh?qGevi$_jd&>D{HX9m}{}XuNJCcIC`d^-I@t#=yFLzSo_g+b< z=v~}Hjs+o}G)ib|{-8IUF6q!~!x+o8ao=GBqZGGZ8aff}x?(mJWi zafX*c9WbW{KWxSUu1S!dEeGA(RXU^E@7+!ufkcIS-6D?;=~f7wKL6Vit-JmH9$Y{G zH*!`Mtn{f48Kdl+o{io;^0s>`w-cFFje1OMA&$Cv&j1z zmpRz%7PbAFxNIn-f=nShxZ<*f42@W}M7nfvBTXAiM)FF8Lqchy!0p3~0>r96jJCLm6`-==j`!DZQ)3@HH^#VoC44Z#@5fzI0 zzTA%rqUIsV(e}m4=y*Bzb1l+5a8aJS7qpZ%?CI&K}?EexHWBJ(9@#Ny!xpoZr#s1-x6=rAXf}S#9X)L zc|_u8Om%L8nTFeWIgI%QT=aDgXe;2iF}R5?v(P|Q!Dae-C4t0|gZ5IeS07mek0xEN zDqY&%uXJU=y2nj}3yxgr<+y$HeA?z*I0pJQ$}vNr!-1;DFXvuU9*;+H-YKvscXc!i z8qozzDI{+A6=opA9C2)XFr0T5RFxk7cDHGX+*&^V=R9Dk}T!}GD~qmC6mLaZ3;JfF=< z)AD#hf%Jp>8Tg0Qd7ByQ&Fx>So|v#BSEKT4T_OY&zCl({Dtg0 z6a%CT&jFyS0;Uc~`e0NiaS|!7cv=!dsNkbfRG#kfdPTBh^E@=+aC!OIJyL9^+m@|E zZc3+%F*U4NtK5r>{II6B-SBo>ukkNSm=vV{<%W7`)e?ooxE?wPP9H6{6#elWUE;wQ z0gLRL!n9Aa^>Le{hhX{m4+ARIZ4(7Z3}2nlryrcHhHD0s&#TgP`T;Q5#XP^hP9D4^ zx?ic*j2Wxb1HB9V?;vpGD4~N2I^7RA{=ikI***uY$?Z8X&sa<;Cwy$bC*!GgCirNy z=)i;LaLbZH3Sc4K;E)_Nu-JzvwHiA`qz@FGLGkT__V|S)pPxjfX9*OQ%+R4PB2B1S zqdlw@&(@vh3DjDT9a!T=3VHz2pXRu%w~`!1l#bViDFvl61D|k?i^f2rUbT8%$vDAc ztutBM$@0>V>a;;j0Bbc%%mY23EWsR50`l6veIo(xIXMfv4w?^~|5f#wupu0I=f0sP z30mLMK9(@Bo>>BW4L8s~usR#PhG$S{1RIKSDwl>%N?i$e5aD4BjePN4WF20b6<0qF$lU21yJbj*8R5W)#M<+z4G*UVWAj-*hAu z1qL^$7)=%bp4Z$oEU`0q^j$O;W=r|1pQCe0{<<&G{(25iG`z6m8fiIeH(-c@MD3^! zY`wSA(qJC)>A%`4nUJ1@(d<5=kgnyDF0OFRVXPJ-w|)=^kO+$@p=WnVar@HzY{T=) zhaen+k9|R2z0G=Q$D5-PXD72wlg{2{9V?3Wj+1DA{`2L5ZPs+04i?vF0%e5b{Nr$E zEN-0+nnTv*!jF(ZAMUtm<&ClA=&T()B01{hGQL5?#w4unAD!Y!s9n+D8Bq3;zzUVO zE#r@gp_^toM))NM$racB~hKS7mmV0`gXPI!g zz#4-g5w&RAZyl(W=!+z7N(K78DQ$3B$b{tW<_gefzNX{ znD8*27gwuWlSG4wx3bTI;mgzk(JN^*j1r_lg9RcjZ4i8rm}d1Lyx^5C`c4gacQ`yd zK{UZ;&Qt_3N4v41>5_x6WRI-Ft&T!+pboqJScNn3i;LNXA4C8#vT`edpew_;f+34Q zIsKq{Z%gqy94J#HY8x#RAa@I`9q-|o2it&2#pjh4e@1vWK~HD0HimR58JdVZ&2LO_ zWWP}Yg{d3wGC~lIHL;LYjjXh+{uMf1RuXLg|LHom>iE_a&spq|&b=&5DwTgCKHIhC=G^-Z8Pf(088zAZ`X*sUKEsyzezM1@K8kBnfbDaQ- zJ>%8(iLs^240SrHi<^U-{La|60L-oY@I~gn3SeOeei~u@{{Y1~mtT7I;meX@;89lL zG(OxSsEXicf9jXCoIHP46EwBEuR|veqYqnGGgPhAxm%731E9Dj?*fZS=yt1j%(dlA zD?4spiwpgLDtbxZDLoL4O5ev|(6(iAQlAKl zNsAmUpuDE_b+FXy%P?>|d0pi!te?Zr!i#6dqB}U;0pIq-xar9Zz-^vzwna_uoOd?V zxo0CxRA=CQpRLUm0a*qox~pYk0x$C*KQYU$g7x>LRTGvKS=Q<%TL?aCyP}LZ*{o^O zT!7SoUa#zte;GW>tl>8spVI6EzpVgL*FApk(1mR2f_N-WlZ3NV3}IqwVz_E{?K78223ELI441UniqAaBAiY0 zel82_#da^?5fBSLzUZUbs~{^tN2tX6D_;w17B4|4s=?xXL9JXrdP$PnEpoXhH|#Ur9RA+AW98+5MW z{RQLdafFOLHF_^_bPHFnQH=iE$n2iDMdrl~VnP&_wUkqXtHKi#rL!P~d5+^>x{ zCXoOh)Mco$s=-T)JMpP}UbH85a4x^`M}4HCI$-BoV=0Cffdo8es|`z~O@D(oImd#5 z#Z7UtkD9(zCX6WCa&j}@HXK7(a@440k@5YKQ_zxBwbjbOYt0(1rf2s8cigSBn(Ulw zr%|x#Z}6JL-vPdFFri!}{G(jT9x<#TObL}X6!!?27X-$emYN04-r3iRk&7vN4^RAm zCCl54ID;^xw25|X#pBex@g=<*5cj2U**A!d9j=+FDU3w{#7ilQ7mKX1~Dd?LAm7^ z<2Rlf%yQn;%{*tHfhLzGK&+&yHF8DJBN7GYYxUg1ds|pOPVY*R{wscOQ3G+Q7Y$*` ziFaszriuDuIE=A#CHH5wqW_`Xws9mxjYz9!F&DNO+FXW8!mbOD(qr>g&!D!H$|(!c zr>;<&e+DzbV#0Agff1_vP=nRjupmW8@nCslos9J1)=TL~kOC`4ndu#}W0-=O$tpp*S(I>+h zt)v_t9+m=baXlKGDz4&8pihJpKA%*=vDW>J3kAU0!13B zN3humDXgMR#XOk|C1_$oAPJzB-naADB5Jw}UqGDIHm5+rH$(4(t_@wUi;*qm(uW2^ z^zQ>A(}WLJN69ntWMoM7XkKv*8e0_5wi2H`8V=IF(;LmFsR*}6a;f`(;t6ySQw0`@ zqgq+M`z|uhALUvI7hm(#O;h_g5o3)m977<(0r=q(d`%B6ERKDvkjAZ5Q+y<)9Ixzp z1J>Kyf@bnj=5&9%O_oYgz~U~|(VH+r_Ed$ncRd_lP9vCGF#9H>h`#mWvIRZwD{hTi zLI3!Ny&{!2kFQn^igzLyRr>=9B%!m!Fm?tR5BA-ay3r{}GeuPC1w#SK`bEW)?-$!= zSBGnSec;tS7ePp8ka&}pgmZ~M75<-E@9E*R2E;p5&v2RMxF($(SGa;laM~Gj&K>x# zGJfLW68YB4h=;jc#oOQ$cMo9**Ro}#p&-m5i0KpS(XEvA#p}sqnpC)UmoFMoo*0~R zWh7q^_v&nf8#x4qf3q5IC?QgWeE3RLjCK-O0Fa%8VnRcrL5HMDua-s=R8m9s4n!ge z5OYCdUGkEC8#66C)%9pdCYtQKS*u6Tid4P*h3;y(Bb-B!l(-NZS}?(Zy;2&nr0y%! zn6BK;?Lbft1i4*{zutJN2j1TT+wLbooF9bW2_A|UtaetNQ%XKw z=~O6PJ_@M8&T1@zBe>E)N(n2wRJ^?S3$VfkK>3^)t|O(uulPs^C0*!!n{Fv&^?DKT z+c&+Xgy6aiq`RQSkjrbG?=sMl33;>l7{k=Y%Yg8+=cYzdDoBa^Vz{TfG;zs%;_uF0 zMY)IGZBXw1G1Zjy$tX05$JN|oAu0vH;9Ht0SyX_z`3bifLOQKhoNil1q@VcSK8D>K zhd8&z8=yGdwBNV_h0=x#0P3HChjzT_fW`4dw)9T1kdiu$m(Gsx^D9?#htr@sVE@~} zN9`t`XF-byZB@ld`})WgM_A@>2wROctviLC$rJtM$f9o*A{+ppKQw1_;(I5jP|i~| z;z|QBCAp=xajop_wZmKvpdFE2u!Bk-{7_~H9coWi=!T(t>z&D9N{gJ73-4ffm%r`i zb-)~c&EgHaT9W@;C$n3lBAcrgrS$08-Q~+{c|YJ{mv9OksRvczi@dWD#pc{bY)=AD zG%-*ubq!DV9bso929=c+^Y{UaB0t#D?CZmIB+BdKaar++uW17fL-rOFmi-x^vJWu& zUwO80fZhxC@sC?*a#Bwh=L?+BWPy9a6$#Iw6zx=S;^%=qJ0Dy&PFgssL-HTRy;LmT zC=#|F#{v+El;Ozg*yt9rx~_eQypN(6Nffcd@^dYZX~ILo-+XP~B=(1^up?8oiXM_08gVuBhvJ;eZRTg_5Ae{+xxvyDX` z1=SNSza+Lk?3lOYSoY$#^tTt<3!TkB^K$`AFf(M8iW<#;QCsP}aJoHcpB5-ijA%z| z;(jzWD<3PR1j?V4tp>qpldh&b8v#I~BN**bFeMHSi_G11bw_I8Ct29<5Q2l2=B5o{tk zR{iWCoy-|dmu*~%;5xp$iqW^CV~$6^#op3G#K;h>K-QK+KT5Pgg=(mh-S;lxm29( zqm)zF_lK~8A`GRi()T;I@84P{^&AL7W08QsE^q$WunJ-aU(%C|8~jF^1jCf1mk6B| zc!1_xox3H}6ki@JWSzY` z1nNl1{kps=lzEV`Xz811T@Z$~=M!NrI!0oY5n@+6>gkdQ$uNP^_Kw^c8LFCkpa!On zg#Zqp2Jatvj(Gu$=N->=a`~Vde=2#Ym`N*Y&bHaJcIcB_oq(vn4~0tgH6!9w4IYY+ zuGwMo8iRneSCI?a5rMn(rS>^wkqp^pYQJa)-2d=!+W~{{SJPZ*JQc6UoOmaB!2+#e zyn!|{>r~^`dhIfWIir8D@8)e3#vOr4d*$mwhrUjY@IcJ+E2(2qcJs(rYjmO8N+v<$ z3M$OlI;)k5?k=ef2LX0v9C$EQu)Y+;+I2}MXG)9{cCi}gob;5Mdz9Y{fkhB&gKf7S1& z%6@xf`jg^+5yT=Al~h7UNjwRBG)|YF6Bo+5XI7Jc!{L?;*}sop;wWX4R=02ewf`mj zd+dq3i38}zIYzZ%I;#li@CxgKz zboSng^xDkNRxp9>1X;iq4B$am#P~^k0KtLhH>%M36=^HSaZc0-v2WiievFyOJ5W_z zGHoPf6Co1fcuE#scK-lQom!S6J6&DkUK7WfuNPP8jk*muVKJi(iMwDiAs^h650q~L z&g41Ewx9%twV839sKH3&5>@c=v!3`HBd{uoLsUf63QQ#RrZ!Fd?9qU1Cm5UPYUPIV zZ~_LSKW=i$exRZWIk$CS)`|r$|MH8(vEdGlF4#LJZz?i=?(mfU z0G2Bz`24}P7~N9kV@8Q3 z1P?efGGDuxXk2U0ORQ+hplJfssdB|Qjw^Grx!Dr?TXem`QXDOL zz_5?MGS;dxHj~zFYa{5Hq})A;G_W|6e-q#V4T_GT5rx0sR7t z(;@&COmQdaiX^<&wC%>hJ^u_CN=sY3rkJgHA5=A_jZ^QLyK+dsI@FGAPEiSu!MsB?qD2T>#xEhyI9`h@J_L&vCbwIb=o z>ysz}^3TYS+-@VHCrq~U^OPYVDg04kbX$Dn?!*sh(fj9!IucUyaOFk_MGh*wJk1gv zb4lb_+I%pX|EvoCV!k2Jjq)JV zzM=E4Sg%A=aKc4JpB9iE5>!(FoqB$vT9kyb zSqc8E_NdeY25o31Fm%Ft22Oy**GYZY3cwXgJzZ!fUcwn@G`yji{tY z{>*j_ALlj}TnAU40umcJEm11Eo~&{1p*^GvZ$I(g+!{X_JLWjC6K5>5v=PD7BEeitlqcrj&B*Gt5qmXfRK zE3%;MP(vtk!ZY=29j9RKi}DbS3d&+o5FB;iNPF}H<#FNAuq)Cy<<7gqk{?!1ex=xp z#5nV!yc1c}y1Xbz2+rH68_8k@(K5PiIpn!ITNE6VE1Kfdsv&a4z+&5+d6{jAwdYEm z1AAQqD?%lG zUDX%uArz(HS7YzcnJ)BY>+3SdzCV;F?36>e6f2a#hL+xxbrnw!MccrM*-vxSO|y|D z*;~*3>2Z%2L<&A$fx6ekBy(~Y7^Q}cGWua!>WzI?ZQG;cl=S0c` zpuRNh#{HoMR;k?q8K*3Iaxh)%EQkB%qhv)iE!ZvYw_t)b4A?;^@zQN2p;PmYpZ%z+ zBsqq2-+nILB5d45y2jH8Q`701Y)pY!2UmU^3L|wbFZ5Wg5BPe@eY!XaK0N9xZbnp# zb)Tt2MM7%Jz_?^!^d+8!)N@*a@{SkiC#g%3ZZHK@S$lq3)HNH6e&uKu>>P?}&FS%t zCd5|J1+JU7Kgc*l270X3wli(zgp(aXA0+WyEM<>^5jPUo@CCaIBY*gHu&<9OqCgsK zQJKBh)XoPica-_(Ow(oUf@a2P-Ny*Ym-uDVzomS%D@_*s?`KPaWT9ODSep+cN6?J9o%qK; zr%;L}dX@b_vaDZ4&2`>L&2ysfb?CyJphFwEc_9qCc>x%{-O46^Xi(*Hu}sWM!gHAz z`O#$@Hto+JK%;$kb+Eeoq79LHgh4@#*t0`g#LXwdqQ+%yVu>*rmF3@|nu^O8{(w#n z`lUXGUT!e?jx|KqaCf1Lz6$`M;5qpJ@6#MG$oJ@{Q#Yea;j}CRAbdIkV*lPnI0%xD zgg+w{Ju8p7W@tCW!BZ;e7dGBx7Qb?$Fi62~jauF5*MZC(V@q9ZM%1Sel`clzbKtP@ z?%WG*G0#U!djZ)JhO5CVHCKg8dz8s(Z+IJq%YKSR1?rQ&2Bd8gU*=I)^|w7&Urg3Y z+71&4K4H95+te4ZU5-j2!r>FFpN$V&3I({S^7&2CoyVz$Juu zgKLFZIyxkbo0f3W$j9tZi*Z18V5c5OpmJ>egH1=P_CH_HMv+*oQ4X^M_&g6Y4Zm^a z!CIGR_Z;+S>|WCnV)J`7vQxs^Y*peYmy@wxZ3Az*UsVRy-%ieV9GDEr!;Fs9aL-vq zD(Zo#^EvW*iKZ2PThz5WgeFOUYdZfFr~JogH-3yQbdpfQboM&*t@qbd|B}pJ+~2rt4mk z1vJ7R8mB~jJ6YQ7B<*k1vKn?gOxytq?BU21&8d%Qg^3j>=lS?l0)!Gl@EpDt0cMs>ju4IGSn%0YTxk1{h6Hly zVV7XZ#(MfkoOq-dHv`aa(an^n2-J*7ky2b4*t4-oo+>P1Ey(gIeXywE8jSu10Onx( z9uXcU?=#5c$m(MeNx#{>RJ#{)lKNxrhnC*GmBk9)8xBl91`(2mI5sdp+DJU$bCnhk zTs=_+_t?xHsPXppwlZqp=uarq4CpRpFjO7+x4vmAIifv+{hvX-sX37ODm;UZnLrTY zh2GcH4O7FN>|SE4Si8!EZHv{f4g7yN1l3L7L^2S~`iwpC+&v;|9toFF2(1&#ibg$^ zbHLv%nwZRKM7@;B_9SfksgshCPuUBo^^@XM)2+pvBd&XCh;qY z8qv_&z)B8r-^Oyu5iE0YILChZR7wt1vf5UDW^EG=Jzaj^d%$f46j6=_;h?HKhz3&Y z`cj0O_;pj_s)a{U9nIsTiMXH&8vs<0kHLE}?J_y?_65_78E6N$|B^E){ma1e-I@<6 zH_zpTB~lQ0&fq^c8>v?HJ9Wf!$B?#+rr!m~Z;V_m--hW`wNA-F>|w0wS$0Nzc;wWc zHK_y?K;2`~*7md(cQE44z4)20S>s_Kcdrw!MoP}*d#|rsm-9;4A&-U{d>+OO;0_TO z^kjjhl~7DIveTg&;sX&@KfT!M z!zsW=06wyNj`8{%*_rQ_)DypyMiP?t9G<8dG=ImUs20O!WliqZ!|=gfE~|WhK)x~t zx{oJZiVILe?qt0*5vTn%E=jZh2Mvg65)|9pApd+~o7cbfh*ZI&N@F3&-D)k@z2`*N zA1sT5OqhOj2TEeTtK{HAhX0TJqYQY1P-subQw?57dbHDcnE|lx=y>GCVDtDoBE3Y} z@-(~IzbE+tp=hl^_;y_#kl(FzS1$*hnJ{Pkmqcb-<0J%lxSRjds^XUxdl%CmEA@b| z1Re?pmtn(_Tk@tU)lU=jKU~j5>Xb6$ayY1k-VfY?3=)+R>akzX9q}hN6saO_WXd)u zO$93BEH8Ue@MV=@<*ZA&y&3BYgCv-F1+;OX!>55yIV4?VJsau|5EGo!B-d&`Caz{( z`Ip_R;9`E9~8ZQ2z zNFe|qN$t(e?MR*>s^|W3cgLt;rwr05xmSW!xW=Y9uX~+r7!AHAsdz(UsuOuzfCCD> z4j}Ma$2x%msug;?FVpmsi{6LEcFZSQPhE?bi&86Z=*;RLCp>Pl!e13M& z%#4hS3vezVFlZ0qZ3CHeiN-xiaeb zG%agDmHUsY0LG1SYH)!hR7O}aWdZ_1(bXMt1D_b`rHdOIoLwW~aKi&FI#i@?7bY|i z0{?YP2X6b2h4@*PT07J42iZR}0}bdS}_V=0j{~{i5$TXOFUDw8r{Gu*wU(+c@d{hZ>IgdHdc#G=Y>TB$$EQBWFt^I za@<`FjG&bkJ`J61^G-*s46lb^S`PPXKfD?i?*yIsD=n|ZgkgyQ5=IP5Txb*7G+%zRehGfL>?!Jr*SA}USbHB%IXrpp?pv7}OR{yqhP_Hb_DK^i_WCI&$_X zfwZ(~m$~{pqJ|bN`w|N?e;u9ni!?`pa487c%-On2uE03KGR8I!i%XL%Qg^^5#+i~}MMvK=@+w(XBV*oCsiPB!ow`rd1O8^Oi!~Y*qywBj#=y4} zy=ZLXyU7l+ueA$<(7#y3#ezcLF$Ai9q_aAdM-JcuH;X5gFdbq$#@lU)riWTj!KjZg z%L-Cah*RUvwOq@@bp6d!o8RPi*oF8bY3>5IpS}+FMbMo_KU+HQajQSLi_$=bXbi+q zNZ4qcZzIQ2qTM_I#!_fbx?5rSRh8PN2=%;-P2UxPU2(2Lz2_D-{93*B4CeF-CJLj% zO718I19VJd6yMviO{@SUgvH-}PLrG+iz6%tsxz-0Ismw&cYM<6S`|4}9s90e*;PP& zN7Ea?3PdSa_6e_ZSphG!f_awLti<>sUUWm5WU|HOvuDUEI$ofY^rm+G0Q*R0v-Pp1 z9;7g*Su5?nDn7DI{0C2%|MJiH`UR8qhm)fweI0(KZ!1@zRTwxnT^Sbq7MKrjc9M6SQ5Pjl^WGWv1(?BJG$8o6ffCTh z{l0r}%Jf__m?UJus7Rx)pmzas^Ud3S9*CYh?psCo0NZosD%hma8pB6#P~)V}7~`cc zWLgT#>?vle+*{`?L7x_N9Z&?STsI-&0swCaj%&-($!&t%J2W=+3PX!=-E&?49DY3x zij%m^LT9#DF_D7bE#3A@fM5;U-+<15QG5)RY^z==KlZ;0^^S(B5i%?RD*&MD!1k-A zDw&|6r>_&UR3->d7q-WksUYf0=-cZ+{WR*zKV_pdIvQ&omjYp<-h7-!m+n_AB2@_{E;4p0euB z(}ySFlSf!hW0C5Erl&R`=#IM=lQ_5=a8q%B?_(fE1GcM<^+z=rwURfC zy5vz(p?D!W4jaY}{U}vg8%E|L&Vyq7Bv>@{z(7b~Dk7+)j1O zULUP35_fsj3TmGVFDE$4qQRmpthO0R!@u&Gs6TO2Q)_Y(9MxEASUAPfCh`G4YLHJ3 zYMUycJ3AicSTarsSaI|Y#?U}S?%^&0^WJ4pYKX-ZY2c8s>KrW7Q}ZD2iUPnYPS^Qt zvciD6wW@WK9-wVbk$!BgWw}X!CtcS9mp4gdNA;E80OtH)-14*Pl0S6hEhycVQu2&@ z>RxW2~7TL08O+~hrX=Uek4wx*4(e$4mQP!@va0#4q3ku$A|iDj*|=mwV6_b*bg+R(z0_s_J4- z476)e=0c5gQ=l2^m|cxyS?i+VW$i#-;ZZyf! z;BDTVp)PD>VUHHTaz;$k+W&0WNTCp*)%wAxqbcXc7#5x@P8;Q~w_6opFN(vJLxsD- zqJ8_aQe5wYuTbZ=(EL@dK&!lsV*<+?nRLjDSDbwf$9*N96q_#@!He2>B&?F-`%QV0 zOSJZJ8|D)a|7-r~Km~{z5?`QTGJgHw?|Q_;k{a4-_z6111)|Lj*5!1?L3j zkAs8dSXe4`d9Fc+k34D{N3SP}#ksTMT(K5`)f=V2knoF0@;razpqDxK^@BV{BH%*W zn4<<5p^*v79lO>xUwdqE0S7ZtIVfE~w7Jb-F}w%hH|(X1<0quWe@doqx(SHeT|X_O z?gA(lnrSO4`K6y&8Xn?A<>jw!>#0eLO?gn3qL-l>MFU*1ucn2TIn5P)1l8cdh@l>b zDN~xGGDsf@!i*yN2~DS3GkxP*s{5n5sZ+UQHstnIjP6;cc!xB8@JMr`35v1_7`lmk zGGao@!5l_?r(IGwgyovyt)tu;ERZ~ywQgQN3shV3K8AEFdZx~H$(|&H*z}%@vW&O) zmOoCluL|tIC>m4~J7)xNjI`khVodi0-sAf7^J4hHp_G`1Zi{=n zT`-E{|GWdGlk5CELFxLr`MR?2@}N&!KffSAvK(!AEY|r|&-udLSR2iTMLqs#xo#Hd zFmc11a_pJfzUE8A$3>BL%75p z*Vj3i!gc&qA(l%}nMaPyiJ9Qfs&WG8ZX*U^uq#27fCYyYU*KOu+9w zrTpE)kHYj70~ZkakO<%S)}-WwwLJWyP23N=+MB~zUCkp(-#3X!Ik!}A&x_Vc%$S$p z9gB5HTD&1s4K>>qP(Cax@-Q32G;S!NH5s;f=kBvby=fW+^c7eR&F-N?jhtH8MA*9g zabF!uRtKQn(yW6_Tv?6(EJ()+PQzDY-?q5;5~hI=2qomdlG0a=5ij1rM6uXE1lYHc zQH9zxFFkeSyr#fnSOvfa@;4S-S>gz#J4zBcN!$p`{!|^b1Dg_DEl5T3db^q*=u8{d zLmpb9j*HqR-uc+fCg+zFVY4CvCwEXiIw?WV^lZp3RLzZiWD*K$>jh~o<}Dt%W( z(2@X^S_-h0p>dp?n#92&edBgkQuC_?0%KozlkWvB)T$cRKOeU#tI`c@!rREV?C_G( z_JRww+p8IZp2kw8iZeHySH`-tc9LEg-tT;6_(6A9l~MaMz&BAODaM+0j(!-~v`FI7 zMQiZyA>hfkGuXPzOWEa*lbYzEL2b4mVBe`-8(nz>@uO%3s4}T^B*O9`z0vs%9$zU# znt0jz$ar7Mw*A~3>jo+X7RKT2eE%I#IN_ks_fay2gjc^P@^J?M@|XQ88EHEBCb@s_ z1XC{fIdv;_TE;7BGV82hC6_rGGPXuCTHs-nPW=BmbWa*g**W%wB|11|jaRmaG#9Op zMFAW|y$}Vq@fww54*9isKD@gdz_0d9GbmW$6o1&?csCg4I{gpyEt)XwR}hKQmMmN1EP zNAC9#BaSLnGW(D>AT@Dc{&9BtM(L@L$h;?se|pZFazU}pm!B&>uHql_$g@$OpKw|c zAFZw)JK};#Sc;yT5~c0Ycu6sZovcn2bHx@K#UxN zb~^URg9VnMng#E-#^4S^U;pLQ?GE+3RWH{6F?xE@T}t$&S~&OvD0z?GIRN;{!~=gH z!Q>E>EXxc4`)XqF&iWc)x zedo3G{Hzb`6f38_0hGzp-yw!qTA5}Z);|%1sYV7vwhAA2K*)&M${YVm0xYIfn=T!K z0IQ}BpwTXV>WtCu2}Kz!x=xNOoa$TdB7O<*5~X=ZknIe`myWlv)WZllyY+3#5LTe- zUfH<2rwB$ev3UR$SK);iG1(|i^_baR4OGn;R|a0i6 zo^VL#yfMdlEcaz#jr#$1%B38!U6zpf0rCX)YRE1R3+82VFLlZsDIU3)2R9=t!|Uw< zavXJF75z+vb2ws5&W1voC7(GM3N2@cU6b$<^i+t;9YI5TOmYZVa%Isp9HZOx=_n4i zotq*=Ek@cY+K^FZH%lF-gJkJsTuf5V7JQhagtHYp_$Qxa)&>(3gL(ikH(#3!fLcx< z>BGeWI8Vwn7vx>mk0Go_qV2~Z5^ok>!7FS@F&>FUxge5YRZHobZY}zPVH5>I_HDK9 z?I85U(VGa9cn~OXNUL~xK)d5&*^q1rI%bB$GqUwY+oHgNz5$uD$%0mW?tFq6$=n-2 zk1Q;16NZTZ&Ryf_CWFK2Zpvrvs11lNd-}ZG&8|Ntrn82%%dxnn2xKO0__AqpJ*^K~ zN=lIxlxRA;mOFlB-GOjbJv1@rojmi`lpVAE_j$=AD!@1fP;xg6UQPW2KCG_VfZ3DN zFHBE=6y0^QZhFTi3jDw`DO;jk;8Ee;b+{-^q2&t48 zS6K&Lf3K%26?#G%EI-noVx>9IqTUs3zwv_*1{d#D$9tJ+{24Q@d^+Gly&-7cwk%q-} zRygq~)bS*A?c@KlR1kLTOK2je8CCS>dj!@a6*Glq)%xgr@qcEs4KZxjN^?Y6usdr;*`K9Kxk%TBWU^nI$#JND5%cAd=#QDekSs@JFph9*gKg~CE z74)qKIN7j(*HkpInNH$C+(WglQi5wE z|AFtiv?9d05AO|F^*BbjzALWP%Z8A+m~G78NYBZtAZAiH zLJOc#nUG8he%Jqod~PPMaOOHKkcNJt1~^PDnApP;OkEs~b`R<;O2a-a13ilzhNSxW zIvgNHPyykgc60*>@HUgXhD)5lRvN)9Lxc=Yy*2P^h@j8%{hfUcD>gc+z8HvGSaBn` zMz#S6Ze+a|LlJpLmf|n{5b0t4qK-n>Dc7K(mU}S)g-1jWLf`bVj^~n|lJ99m4>ve% zp{zJ1Q7t1PVF$5U#1E?2-h>ENDqHx_fLE8@O%w|*|;(r#3hq8Tr!=>V}3EC(E9CyiQ*Z2^e`sfOfyXvR~31v2o3O!5Y|B4r^mnt`3}JkV*;S?4;&T|p5zH` zbLY1zUak7)*9KujU1l~Z(D1y;ekggRXeo__!-1<6_J#wqm3Tj$>sIk@Yl^Cksb5_P zO!7yLoLczIWJ9AmEnUR{u1&Xkw|-0r^?d5y_o1a!V-?m3@x==AY@5|AlO)dGysAy2uFW8qv~{? zAGAj`nVBt@NK7?5qTS}8AQFqag=r=?yy8}F?I^Vs0BYEjXyrCqk@oiYJ*&8$NwESK zEMxAnM-swxrcau3W8xfflee~)2gC8Zvo$5H4Adp}IZmGJgzTMe>Gf1_FC>kwzz{>% zNXj+&WWsnlFpt9yU)7m{b?zZ4l7D>NrTpb=ti!HaOdn9l=O$8jSVG~NGTU#lonBeE+oa`>*R7 zCj+bVPcPeAPW5^jvC`pp7*e?{2`g?jZgQAxe9aj|5VFl{<<%Gtny75RTj`+(Sp9E7(gdOL zoPN(wgN9Ex4`l4Jk^ltIJlB=ebb~tV?D#WtA6d$BDaGa@h2gK(A<9MWb_4~4o?wU& zMVl9#AJ~gNl{zH!nlVIS>ppv#eN`A-)Iqs%xgKw|Yq!|1jpbs^$clY?0yQ|2IWluvU-lgY|4YW-M(JI39YU~(-^C{TE zskgM(PXLM|Oc7Lwx?qP#?H4?AfiHGf5C-DClzQm#)ma`(%G@&oey&zN@j01+fyRi@ zL~ADtXO%;VDP@WQy1S2q^;quaR9%&1=Br4&LuWn zjXxZVDJH$gHc4`9vZn(%4#4klHD9Y8p60Bqn5Rl!ooHz5kjKc(!)&b}~82+n$|0;ZZeL%ME->H#9IHrP?7T2SR5 z!i)ksEl^U@D88{7<$W-95YrN5n)Y7_&r!f_vTo)#%M*)^4%k}%96ht=d04aAb}@j? zs@~e8coeky5qvs%$b}TkcU`|{r#tg?%Q2QLtvlA0z$5u|&L`VKe0> z5wq)jrii6=wQ9kuB-T3pS2JM31=j}&$_rYLYC5N z%8RMcDhoI>`YFdc4OZGBNkc#^$&*n;++gh?bio~7t<{bOHGGZFtM=MxZ5q#1P>)02 zV38o=Qox@AxDu!}X8TA=!s7vtO9ZxjIBdj}6^6FnE2?_$L7mY;@NO zeYf_D)5|WUTj7Fl-#0e-BEYl6l_h8lV8vouJ0)_Y1unI*2i^O<#>>SXqAmg0#l4Y^ zY+tN(X|2yMm%nMn*8TO|$}~vPF&CssAd~%boNWLIHMySPeF*wG8qJ^fyGG&cD zBNk+K#0p~E<`P)!QWSqag_7uo!P0@vbTOMkB8;mBy?0pHE}k%EMG_G;8xrFD z!n@1Xn_5clmD$s~{F0V#O#u0J`f6$l6AIoJq@zNRahUbeKc~L6Rt~t)L#B7V;OY@F z|NU4pl^P5dElvbvfZOcUb_jt*2=Jsogl40T!YVf2Mi~Jpi1Te3?QzjfZ)Y|(vEzrY zKSXVMmj2?<<~@?zKt!op!)*-^ zB2nr9fc8X57sl0*l3ax-&3V-STw*_o0d~*G)s?z;5y)H}i-*XgwATVFp2h?$qwxuq zIa`r=<8KS{n=6JvIpOqZ{bpCqB*c~5RUxozhtEFGsAut~JXMUB5ZE7=NV^=4+2p-7 zIzO4dt4_NpM|Rg1E?7m}$n^DR13^|s5;O^+Z~jL*)uG;($c-yY=fzd?6XSa0ZNTO2 zer2eWr?NiW;iV>mKlv<=(xeQl^>I$?`=f=nlBz-z_^z{<=aD(B!%)pt0Ogv&PDCi0 z;Tr}5)a#XB-Yg(CFE2~jsr!4Gh&4gs?nl`8k%+>$-0J#TS#ajhVdr*J!ym95W;o0P z72<<%duJ9|6c}afUP-AXoJr`g^NPUxr5MEP0-wJwwRzlPb<15EI4U33xyZVMU!SL< z->P<O5}_^6lJ3FXIdI-bsGg+)Bq#%o+VZA|UT_y1Aqb@g&sXlm(nv zWkUTN|8}d;0O7B6e<*T}O&Do?wAaE323O&nhp^4P;5IKJDy(^fxx3K^yAm{vp}(Zq zGbIsD7FDUWzflsKnGnf-t(HvtTxA|6J7i*j)uxWGgUG+0?7nsbMi-gZm`QjZ+r0@$ z3T@J5F!*2ET8(n+FDQxfQUI$gU#GYnz1e&4%eOC`&Z)*XwVZvdYMg7(WDU!4H!i7z z+C=3)Qo8bmzh;=jT57IuKIGiy*Jov!nKMZ}dgn$S>^!8X7G5%g0w=(*wi>f2mM}vR z^qRH|BJx z<;axbI@;@F>@TnzyLF(J$k?xa8KA${PSWc5GrvUgK!h;`MZ z={agHl0@$>$VmD^V20D-jmSYlzyI(>BzTv z^#(sjq|rt(c^LuHoyU1mVk_MzJc>-IA6hl^@!+4!9`lvs#VAN!)tf;WMy zG?I?Rd8wg@`5BC8C)|G1DcsKXoL6czri;2LtU?pVUC z?)tfy01s1pJQ6mSHnLECuepIY6F-F*%r-+eF12d!^r{`+T;*b=|1O zp%35rBvFZt!&o`M(d)6>Dtv?w(^!E?ABT?%)-gl0Rjh;Fz$+ud_=tJ^Tq_46E4I1} zUb!7vBg3)}szd8Ic!w%jY~S-8+*4L9b}NSMA%PM57M0dxuV@;~(l|xijjnS0ns?K< zuSPrp*5+X@AtJHuo;i4r{KiYXncxVL4_9tRGk$Kv$$CxJ#QW@a@F#NeBJ5(xTVlu1CS< zau+QCkVz3Rn?w4`^@5yMU!|`q2ma!#0K2!)mj9r~dXvmFHmcFH`!BGsE%yH@b&cIBH{nBg0kWuCu$!U%+sm+Z?lH9`Pw$^zHx*Vgt zj`wbs7__q=I@Io<>(xD2ta9Qo;WA9uLH$TS%CLHTD>pt|12Oq3lF*4nx?9fV7XHLJ zq$#-jidrd))4AK?S8>L-3J4@RYo9f3uJZSl=I&%b@B0`+Zp`MIXDcG$Ju|C5ShSQt`)xFPw5=*BE=$p(ka@m^Y^Im9EdjP{x5yNjy^=V|mM!e*I5ax6h zP}4ma+rmen6wFgVN6F;t|F4W9F~|z>rrx3|w;1~VXRS@vkb>~31a4!RdK1mdNd$}Y z29m4dz`c zy9Sb%1;Jqcw1wzYWY;nLgYpU6+1(6@8TPj1;Jm62_JUnj(=7g^rO=on(#Nk`(680j zSPj45<-yg?9a|?cy-tBGS-J2IU*Rlt6Rw*MfL1}IE|@)6Hm#L)rY;c${131D9|jeT zc8lx4v6H!2JO$76j%2~D<$@#<)eAe<%c41fZ>69De39@K5qA+?(qgUXs(-LA5J8z?qVO{S*cAxp!;{$AentPxTo>Y z?G~XK4f3bj42#9FAXgZ18FDT}pQgX&_gbE+byV)Qi6UUCyT@_8d*EyrVokVv#7Pw^ zMp0vOWcP{ai11G&8&duD}E&GEn~nd6XF8 zOznd?*Ds9@!vq-GPV)l-96SBNxAJw`{lC|Dk1YQISCZ$D%9#x$h^IQPM?A7(#w2)( z#B@=mZxg-nG>n?H4)UuDu8rh}QOKN^0|H|ci4(f9v0LzvJ3#H$V(M&rbHk$ zom01^AOr3CsTr+G#wlbyAus0&0W3}JJ5n+cuS*N$c3r$HjYU2f`ehIV-r1uGv!KLzK^(5kL0J@)Fx6ar-h zC;&E1QAH}Wf;z)oH5ua7TuRN3m`<=Ef|j&R z62Qyq^7Lb*_xi#kEoe$`Nh0b7uh7ee?0{OYKLUjHERZX~$=m=_SUEuoVH&y^eVtV| z!xK!BmSZ<8O!>FPzvsQ4?sp9e?h!F?T2HA^ta2XN_RLHApN%JJI#E&HR>Cv7ZD1QC z_$!`ao&{QOT z4hJz;VmiC)y&S51@gmAdE%l!Gx!(20s%UHji)%Dri@*c2fIJf232Sh;LgS}kYAdT) z=%(h$@Rn7_Ne1Lm3?}Uef?M|oH`AJh@CL!?wH2OeGZCoit^B#^?ni1?y|vpDXQ&|} zH;sVIfRI8F&@KsUR1m{W+{?7`6C+vniQ4wz4c03b^H*f9t=>XJ#S%KSQRu`r<=IR9 ztV6c;9eBcFXdBy?4$vAO^NkntR%C6X0j!vq+fj|eY*JfZ_G>^c&U)I48KL@4G4vo0 z$=FzbxzrA8)aTYTHk;zGoG+8a82m{zyK5wYVbUasx4y`Fc>Kr82!u9W3|#@|sM8~5 zGP%&*g&I2{FjBSLJ37hMP1Ury9L^3apghZiUs0~;C$hE@vq;wQRO$)^(wzauoJMDR z8WCO+tS7@*hnD87{;2n*75~=crdTfuI|PA(EwX0^%gQr{1aM$->jtNzNAb+7!^v0Q z@Tp6_J=XX`*Yq=rCIlwREWiESXH;2S0T5+Li2b1~PH={&Nk;YM6}1FaPLZNvg7LTcJ*4nVl8~8%0)}E=)#)#-7g;2?-fn9A zpGX#)g%prL6~;8)K63k|44|wM2~^4fG#4Be{pp4i(`UV<&oEzwd9ZTvg2*%5mWV+( z2F}R%5mhwnw^RM;$1V$x`>lKc_?(COS0h~l6r3(O0w{5@Oac$CT>~x0*b>?1c1&$p zc7J;f{uLg7HDSmq8ScSI3*inxii`tu8bZE1qXK+HlEOr-Rr`K0auBGEZ=#$!U-m0u zg@taKuV>CD47qh%cKM^<9+xLa)eR%_46Q0POfxvWMB3qyT-iE9#%Ei>pjBU0J)T=x zTJRbf=n&C*oYQ+Q-3IuRfEGjtXw9lIKv>GrADGqULPSkzY5jAATOpvxjNK2<3z2h> zw1WKL^d>GvXsN72BbDWgd=j0vh#M0V*=)*l`NL z=Uv!CkYolO5*1M-MNsv4?%CwH1idc(^06{TdWRZegQ_+C_u*x4FLQwK$L6ZXczOfP z6VW;V$8H~$^R#o)dwHCwderBjf=`KQT~D#%$iSOl;B0*w?8XXM z3#bJKU~a9OOfnABQDh*ATzek2}AVfi>WaZn$uodwttsq1`I+{Kb7>QpP)DvPwN zCosaZh6!5uM8VXq_4#}t@#m1X6Fh2>=#!ji3@YI>#SR3(7$A+ zkPd||Wwq{uS`7GvgoKbZA!5r^cjryAcQrX)nEt%08WAQi_Fi6EST)f{q9SJG3~VYi zX-h27>RKnQxB=eRChFSJ${skv$nak*9pOb`_x*rUQlZbw_B9CmC?+U1`^jRIduOCV zIVj*%lV@sl?6WXUp8Zazr-ziWhl2PdK|p@@k=y#q-Yxg@2}IRfIh5$gbrRKhALN=d zbS9NzTi1v;c-~6I!H>TQR0cV0r-HXpcjbTd!oSeVnOBBSQ64rs%SGoOGkUvA)~eRE z66$rqvZ>$0+GKh{LoifTe;|TK3P7*_t$BVlMnLnu-%^1LEjxV$E+9l1(4HX@yk!!5 zRCR7>0a*B4*n*(@{8Oq;T*M&)((6bCnwFI$IDB~>6Cnr;V5u(1bCWN?C@l`4PH#2%XIY@j7$5}6B1klx94y#knWH@CP(CC z{t}@{3R&l7`W-;*kpHyhQ-)#&`M=;S@@y-IFLjQ$_w$N@bw#gfxbOGtJeaRP!T-T{ z^rDZtFfClwpGC(U@(FMZIrPf@`YEdkrDA?L%TsTT2w^zv(D3MDTnJu3YS$Xt0Rb7~XBja*lXKj= zXYJ-1#Ez_7WN?p@uOefw&QU!B%B{t*>K0#}C_W$`4-i*~1%N8@w^;;QFy#6W@oJ-z z&9g{Gd>~@A!-~5muwB&_hbeDw?U^Np-1#fZMi8~(dUv&JD|B8rWEl*Cb=`PCDs}vv z%aojFjahIM@bwEJU$6OBc~!BAtXEar1M6k|<05z!H>1H*KyWqMUvlML0aDsY*1p@r z>LWsz)08k;q@m)Rz})PmV! zUO7<{upbdy&|zb{mA_(DnV#pS<$sMLZBn zx=e%8L6C;a(GxPq9bwtPg8pfNtu0@Ev5=4fjtd{8fm1_UOEj_ke8=YOM0S!)R>5%{ zeeJ_iiGiVPFPe@X8G8raE@I;SPX&g zyf{MJeWhu`HbGG@MTdf?kWosOx=_76S>;6%;q;pWM5{#c+XrarfvZh2b}&j8)OTMO zRZfj>Z@ge8W{JRAiz(kTm%Y23ttv1!#P6v;@AfaIp>R+uEkrU1zj8GsMuGKpx0Vyk z(+#4P1wm+-pBY*yvgpKWuIs+l?erjxWGbfEoBO5Gk@4!)Vj(8K+O+85 z!E`wTS1r~^9``U!FT*V7V&DVnA3$j@@WI|s+%C)<#UZM(J`!feZv5zy!Ug0JO8k+6 zZtAC(N2T3@Xo2lGNbg!)mzfU}xOb-8e}RND@kkJQq2sY&R`(M~av(!BS4QqueklhD zt(p%!GuX(vZSM1TIxvG%MCxKG%kX(aG6tGu)qS#40hOL5)h2w%geqr_g76UZ5l^Oa z(}&|_1>C)^3$y^w;e!{gmSa-tnnw&q81UAC_w|gx5MnJ*J2`^G1+(?t7r1_IwEh03 z1F*kY-QwZz7IK>}i@9A@t42NH z2j3|LwX&=?n=bfZRLr&i!o>|LR8Txgt>PDqY9E^Qa5=#Df8=1x+z+fPjzxOtlHGoC zT2>II@dz^TS%LY%7eVaMz+Oygm>YP{*8!9Re=rU%jiflQ2h$X0W48&ERkvvouSIu> zi?11T-37la%XgY6R+f9?TvHR177ktb@BWdh?lWZF34t1(kQ`V9RTM)- z(@zoRsxCfL7>iLoK>Sg-L`lwH7g5ch{(hc9wpL+{w_1eBu3nC^ib_KYbgJFB$~|i1 zhn#4&xtn6Y1^boM?WOVe!l>R+&1vmURgPl*RJV}~f&JTn6Z3+q=yj$30MjtTdb&f1 zrW(VK^m?&qRUnF6n#yu$I!XDmLaKa#-CE=cnDi?~d1R;Zk(wbN`U#t~^>dY{=lW8( zgpqw>reW|sXTxvTwGzBbir`jc8P{tE%a!nii+~C-$=gYBez=GCas0Ctep><=titJD z(VIrP@(;}o1M@B-->~5JA5uOe)`5Tm$UUpdKU6F+b!``TYQg~QLiRJaQddE-=gt_lHsCns#!yV;1imCMuQH(uH#0{Hmj_;q zGe`~ZP`jT?#x_Gq(&tvsfW2Dd@V2Iv-sd@n3!T!is8(>2dM~2fx9)Ho1Mky3?EO1# zu(fd-NE);kpFl5aC4b0r&6Vf*;b}1{C)o)8SZ?mmI9WEsTKXa7)8~VK z=tc%XGrveAuC$!n9qYzerD{fvbF~}8jwPrd9mH13P_Fd)?tDGP&Sv>GUnDQXZnQDGEUY;%nqECR(wovuYVIOl||U!S`rK^|i0S$ZYX|MCwdW zct?y5JbQ9!zK`jQr7Y>R(Vy%?{5cx<_SF-$rwn_!CGWaGwoqy0s)ZXgUT|CCJ8{Ye z3^k3M7s7VjJlPOhx}QHpjaNB1p=3zh;&5G@3&hW`)hFjO^e4QB=!oNUORgIP?P_h| z{35s56vpOKAup_Lgw}yHA60}irEiC$cqUu;JBb|`AT$K=&0wr!gWws-Sh|PUI z8Lx*^?y`Zwdd_p9WUd=_>y6Ni+w}2~ix!90QK#vqmCqA~lTb{#8?6*EY`D`nD`@Xreh$v-=AU&`s&wEA@y`^Gh>Tj(MRi4gyI^xXwiI7vr>6!2|MZdu;_+1(T^^b}646D8V7hz7+C&7w}~% z-gqkoDq!NuG?x3N9cWtE$n)``BMk|~QptL_(kx?Dkxpt=&8p@aYB&9}JVWM$)L?9f zl`DKxhOr*+iN2Bu`}wn|g|jlpy-`qQT=&|*VTQd{iQ5Fv!)Q4z7t~w(NYFgXXIF^m z3I`I=L9@_aaZuK{s_xJ)3mc_>2fVUfYt=}g6X$S+g*>l(T3S8*>pXoC0OvtK4(O@q zUlJ1$rB@9jfPbJM|1~BPL@ydtr$tC8XV* z0Sg2-ofbpPM{MA9T(yAOgx?>uNn5`U%g?c4N^<^l!Fzi83-<{uF{EdzJJi?i5tzXC zsObNQt8M2^jqlMz4+6ctDuN8$4H7NK393jo0`WJdz@#SUC1t0dW!1{teceQ|)^qT4 zwpfD(j3mhIMcz8|q-p{$a?42BKTy3T8NW7?f1zok4}zgN>5G3Yna|TXCs>R$2;KA< zX(b_+5&z=kS0|=01fgDq+#dG;lLLDc#>-G-Ii$_i-tHgHvR^hv-~Sl*xZk?P+N)XC zA4;INPLxt4{15-(==TMt)E4Wjqd>JkKnN7^M&Kn&d;t6?P1UnQz77b_bz+Ez2L`v;G-v$7pdf z>vQ-I7vd(^PH6b%z0q&gg>|~G7xie(DW}abI=0-B2jw#t6FcSioQ}cyceJf4haq3D zY%QXaCKapm6jeEv9gtO8RUg zq^23Iw9zb#gA{vMqbQV}`ZQKFirvWs(C{U>8T$#BheiiiuPa8ax`{T%S`rnuBqJZ{s+Ki^t@b zyAFGc^9uBQbHjEhr4y+6J?P#924-VGtb0AO;w27nGYpujjWAA#x1=V0^;1YDZq1e) zTwc2SQcP79{1mzZhCtt_oeugqhRSRpa0nM6dA;DcX~4ho8gA5gZ5QhzRKpOQO#$?T ztK3D21pE&-cEq1s9)a&(BO@+;8uBPqf~b6|%(%o{SP(~{XmFJrT5Dyy;uV;>HAgp; zDmd=c`KcQljmCr+=@qXkYi4Gzp=}LfchurDWULg4E0w~MKatMx6ENx7tVWEj#iE$X zt^>T%hviw2b;b6AAGZFyXB!i0d6tY#Q=Avp&CVqMcdEY;I}ef4nq!>1shCk`aO1LP zNLHc3%OmfOduOGL;&Is6{J);y<{!xvMx2vF%|sJs+-Y$q|3cdBFPQPob;w{%1Nb?8 zw-4SjLTjR_$?h(*!VS<|`e-&KkPK&@k6sp((1s*bthzvWSKR}O1RcSs-m(imbO_JD6{2S39amg=J<1%ZiHgM_=3>)cj7TPxk4jEqMlrJG4 z(yZ_<^ZmWQaFP{LadcwbmdO;nWWM;D93fTfRkchROX42i1xtDvBoou5XOK|fBsPOH zT^~5|=ba>@T>12J^Gwa(dMy9Z%_kcldwXq0?+o^c?<5e6lOViR1wj$O@r{DkIHkaC z8a>7ShcTL3OoB1IGH+mTH2tsU&h1do4n{Q;h#rY31Tc7B4&R&nxZ9666vW(4+LPvc z|Ef-^6lPMmWu;(GqkcUd9o)SRWk{(Cb#?xP9`@~6&_7lnU@%yW9N)2m7x{o|dS?M` zx+QpLQO{hiGVre-Ges6*?DV$p+qt@0EQ-mpEBun4)lyJw8L-~}MIn0*Ul+II1}=?1 zx5|+HKxh3p?1$Plo{FBa-{Ed?A^v=}&>+P3jx$bceIJ_xP(`#q_7;CCA#~lKqiL(ODCgO~vHsbCMydvVhjcu{-+&}k;EZXwD zQ2^rOZ5+#4!3rgHaTpffTiFN5b}%OoVnmd$@o>6s{VPiPTe4*P#v@-#$kP218lGqX z?i+CA9rL{cD{j#*;opOWHr7Jhu(cgtab}GnS#cJD>VJ)4ZP9~tpHL&2uq8t9ud;OS zq)qB4BUE6KlNWB=s0B`S=8`_db;8FuegPz%+mwbzEc_)`l)tg<`aj+;8MBydc=6A z^R4=c@*#BaCBfplbB%D-WuS3WNkOEs!|oA_u4@taXY|UI6m&1OLR)`+D3HD!-e%Tr z@3G?EJe&qtX1G82q!3Fd$BfF(*cXKo1=!(?eCe8wy#DBFtl3e}Mu#Sg%^gxpP7RqHnf&|cT? z28abNAd{KUyg!n7*@%G6JeZAuV&8L>+QqL!x@c)SY^itns#Jqp(2U6HOX} z==C(6v6x@Ju0o4UOWvC%w6W>^(}qvTU(SgR8MQNHvm?y-aTC^LgU7vJr-sW3QtJ_s zIOKnr#fkOdaXQGu&RpMJJ>pfin8bl&SQjt2hm${ls&6j(u%cD*BMJ0S6K`u;F=Z;B zbXqhi6rf0~S30nP-Q4+7ADp%)l9gp+t2t0>MWnaqSi3B5Ac{!jY z#p%i>^2VRO5N#h2V&6nD;DNPdDLb}TBlZHj$mWO`o^*}$e@n{ z?!#lQF1%NcJUcw&nzF;wCK84jL56n+#&+xU+22=f?qDpa{H~^J8yoH>V=i285A3gPI||nNbf;Odm{6 z<-`t(Af+>7APvsq-`vC@SBbVc6={t7OPp#sSU2&}0r^`&N61i9v=nIncHV0`q~nyx4Z_svEr-Eqwf{{Fk#-s#gFk z%&Be(8DnQskCn9WS3QJ5#T_S5%|Ex5UfepM>q^xnum?L8G146OqNCCk3aZcGxD0BX zf1IB?<6nAs5%I1v$Q1w0{4gD{`LEv!Ce6cCZKp{h0)kNPS$Wt}_sv&b%}NVtQHyFv zcr))s^UUr-(KG>>EchD|P}7LO+T40otdy+t0sx{2n3gAfPbOD2Yulen%lcSrESS=%)KB|BC}L^9T&yUaoJLTZae9Q;XpF{QV^;PDWG66_9Lw1 znCJy2rY(}@?@*VMg_2FP4b`p*o z<|z8Di$-U+DeQ$$UUX!K^N?IlGe%J)x90UtVDqD3Z17;WtI+8J50jM{>B=&T2N7;| z#W-=XP&kKIduD^l@2Bfda-CdaZ6a6c0(5%s;Lg$*5bq|pW+p@GhfESx&khFrzG-)X z-LGslIlewU&$6RmPSvf;1#G19i-hAjF87z&@VL)p)16DhaRQ_$Kw(^i1%)X@E~DaH zUF+G&w&UmGt1;wvzuqBNMBC+XMQ?ZPxMUwg#K|Gd<$ZUbayUnnFCU4)FiE=mPs*a* z7QM0C7~-*F9MFH>0&((`oEfmFX`)barKFZE6)>XPJmNX!9HajGck)8tmfKG~TW78H zB>k2fMiyzn3Reh=3PKU(ujP96KR^JaX3JfsX7#i?JH7`crxmb^MLuFDzupd7i{l^s zvW7BZD)6JZ3+7NXhtb!IZ~UPn!4+aLl;n~o%7Zan4l)BFmEr@(g6{RkmRFN9V)a@J zm&==2Pn@noJ;1^#XYk5&`j=J`pLzMu^_R~3v9v%fR7BS6*z1M(SNpwVDG;u8QiD-^2nHr8X36iNCA7lFedL`afc;W#U8ntH~>+KbS8<4vj)=W}vf zCCd+31?X7ayAMV9!aKC#>_I%^bx+QBA+hyYBOtK=SOih!xQtL(<9hC(pD;R=LB7@a zUKN|nnq1|JxMzn2K1a{3K-K}o#c9ZP+J5qU)mWaK3=Vjaw0GvXOqxi;)le?d2km-* zAUxf5C?Y9Y%IUe=w^K@c)tGNPWE#3nWJOe#beB^AAP~=bcVI5T9QbB_L3kCmS6U(f zuAW2Q=ah8$V54Ji$QSdu;SlVbZr*kG(SIxbE83>a%rvtUcz6!X9~y!cZGHInaFV(@ zEFelePb{pTs}>s9-gW5WN9PCmDgYhyVPUS{&H_SCxG1z>W|AI^!&o~A+_)qNK)%0-j*&}0JGso%MYBW*?|$a0y3%kp5j)sX4zXx9vh{c*I=NfS z`Ky*mg76T=GaH>bQG#T)(!nvj3^b)NhvKuZ{G4=RA>g!u_kb zuXK|~E2^Z@gBv10S6^CIY_xNJYY@YEbKdkUjD1HKS;Gd?&d~r=^M6hp#jvv!hR%FCmR;lToIo2Qt`{8F?&MIXC^e=FO8!{V zFh!UCDQ+y)HZFa*PwiY<=Q&i-W-&OEPQixrz5&BT3w}rlJwtS85{d1G!8z06@m#mn zv$>dDcu{}53_&ApyNUu15(D}V2rhbzV9?WYyNJ>;|Ho5xS|Zze{scl^9^q8+r3|6q zV&a{f89Qc;t@Wy05E;NBQQG>J3Kn2azKm| z$5PCpiNii0YLIFCgO@Pe|J7;ixl|l%MP}#7cmMNvNNjM{n<}~KkWxybRTTb&zG7ki zscz+7VcP549_MwuwFv{d{@+z|(PU3Yd6`FIW?h$vqiazV>iPi=`ZvR-Iz>wdK>>)g zNc;A~#U;yxtrtWG5$=k=+hW5Azz;wJ=14ljDh*7MAKE`6`f^sOyYd?w=6s-(rI04| zul@I}$ZXqI8j@S6-v%FKr8V7uaVH1J*B1Y5V~6qz4GkIxs$tRG?>1E7T{A-G&lCVHM^5f%Hw-xL8#KG$4?;uXC`@t zbK;b|HjAd2Sk)M|kItBwhYx5{^ve~+L80EO!9bGLbm8JHnz`Q{+GPhYrn9QFN_1S_ zME1t)a`&ER0!IctxHH+w7_+jV-rNJ@`2%Ep11EprwXw?sM!Y zR)ECAEJ1kVh)z~@Zwi|b;JAB$%+uewdPi@So4jM3;s$C~Nl!enlrc2{ds*G`nACBu z;CWl+pC0t^YJRW!lmk*5FY`xEtumN?gtq~;jA7IY`ef%PnZ{rd0!Z@V!Etuz%1r(E z1`jszH-bO}3PB3_hGU>zZ;tx6+)olfR&h~+Jb9l*qkdZ;B+N`Gg)rS{k{@>76lYm4 z=i%5Ia}-nip@H=nTGE`e%A}WZM*Z~HUskuNehHFL6xgER1^k_#@XQBUJo=qX166vg z3j|8PBN(=zs&%D`QBfiJ0#JIb9{c1qtZSin)TjY_Cmn@|mgfVG_H&F|yAT-8DgiXr zbK25uY=_SOa%S9QvZDj#)c)B=9}UEb;rmmd*(y3?&%mU*ZXGy>Ift|liLR`{yztDy zQ*ZqCV(EI>3hC9P<`Iq1#Z^Y-Jl=r>r)^=1i!@_#%83}^FKcz$;LciVeba2?6_M3c6@}c@m@MfssIhNYH=fQ5RMm7 zxIW@_j zEh1Z}dgbOl6U~oh=O=gwC}K}{{w!hpog)pK>XjT_dx+oHIn-WeRqFU>O@=r#$}O^QE@#dFyp$P45bG+`MJyaXjTPdTI&5y+5(3* zKp=ZAB4*5x88x>HSrEh9D=2jNM#EMOWAkscV#SBj;Fpy@&9@8DeN}ZnI&j>5say`a z43ZKA$J;1WkXf>BBIzXttw3Y|FevGpX~HA)QrUM1=eim=<^49K#kUf9Bzscg6kI{kY#fd^LhqBmh8ooZhVpcsYUrLQTcp%e_ z{I}03|3YYpG>dc?z5h&ec}gnthzHBmS#G&V7Rrc6>cb>|Y;&@u1vRyWVNeA7Iw{CZ zNUap6&fpW&qw}sY8MZUtj^;9#_1Fc=0q?sCUdK{kOTiQ1ayp!k>pr1qhTrUf%oVT`@)l?n}x+;grvDu>r6GM;+TWNmD)nwV|fmk z)JbG>dFO`9U3l_RufqSZOijX)>Kjo%NrsZa;$X7k{*405aZTIBrOqfqo>y(hgjWGK zK^v_*w!Rlx8w7Jxv|%0M7DWoTU%V5v%><#pZpVu}Y=1Zqk-%jq=l!BKYnQ*2C+vY0 zu)U1r&fWP3m;zT!*=9&LPK+*MYjD(An&-(rBsx?PZa-a*zK5}?O!yms;~|04@%W2B||2OW+ebq(@n@l)NC1r}lb zC@T5v+?!=>=3jmVF?n!UW|dKEFfHnISc`27rm@pLEklT8h+(Ex2zRgfN zVUK30qC2e5GJ{OUDg0b_9sKw_$H_XE4L4Pmkz~=ln_|awGQn&{cJY;YO`Ux`1qlkr zh;}23$+JW#m=z*W`a>1iN#!d_E8oUYRs2*h>_0~#4OqDkDK*g1p~fg|-KEt6mPy$W z0$=N_xxu!SO$JEbp58%9z#MQncv>QkEW~}{k|wopnWi4SCQdAH`JKI$u0<{0grh~( zNP}XY6!VD8zaAfA;Wuz&PkR}Z)_0H=sygJ==c1TNsw*c7g(|mrN(xn(GVlHoq*6E{ zXUf|3$xHGx-)KMb7dSQBO5Pyf@^!#4?p^;coxnO`)ZQvndNTxgw@-9+TY5F_T`he4 zj6aEIYu=NZX{{t`r}2wMs(5Yr`+i^vgXYa})ax#b2I1#P(lfJw)+O;Gh->NL`R$=+ zy@k2Ia6y<4{lMUv?V{2{0xxn?fP!=V94!1&r6)idrnoe}4?#*VQ}PspxNhXUOs4p> zCeC>{KuX6lqXf6&9pD%bxH4UpuF`i;Sq6diT>+CQZp$8NX{CL43##IP510YdQRwnC z>Jti2S4Yy{OK%&;o^??~P~MyovNOTY-T7n(#_uqoO#3W3-9g-a6!icWgPz(Tivsmz zKXvh}JXZj5Hd;5UW7o;4Y$(tl$k3`>oC|-~`7E{A8j(R9%PbG#4RwS#XG)|f*&af-+YyB8)oe;DScqrv1PptVQZBA3v!p-L~4^1lA^L7uB8?HUnyl(65KeCR@yJQ}#HK1fb>rs4&>S*}`IMxXKg z-x3^eJ}x%t#xw?K&ycpWY5<;K}gRVkWa>1VMU<5&zRPbDuC%gjWeR zI!i~0_3#+YOy-sbiX=1c-b5$=a8Jvp?uQag<*P02^zGnETi)CUM2!sgDC*ctjx?aa z2cImQqHp$X>4MRqhk~m_rsRy_^dDtBFietBOzQTZy`>lTgf?2WEONnDV*jpziW)~u(PegiQ@$9Ce$6cIz4I`vqCp|9OKqF z{dUL;Vh?zyeu3IX{|2+0rdOW7e^tw)dNrw^Ub0id+YXTJ5-_q2raPH7^B$dMK%Nv^>h_cB#r=-wwV_eFI zL5lLJ;#39>?6q#ckaLKJSJJJob*^n^Kj{G>WocPj&vOh43ScB z^11Dl48eTMA+DM&E5cE4eo(<92?64OC8oXu^e#y8SZJD*u{FC4TuyyhiRwgq) zPEZg}*05fU%yQ5%!%->Zo=Ga?3DfSbT^~jz=bU?j)y(QGZGu6oR9A7UoI723y-*PE zkBrLeLmN6lz%d;fz?IM==>o3q7e2RnS_O8eT;O8)A-DAN4OiM; zC1VM-7iNgeg3I0Kl0vW+8jOr4pufBcG*YgP5_V&B&`xMx&{KbIF@gy02cqqKf}hNa zuC`VzUwxsDq-Q(_Fd7bK9_EwODFr!nnIrSdO$b|ZJNoSBq!9JJS6sy~&N${%V!O59 z2k?0?4!erHp)pBke0%cr|6gNR@s8oX;k(_%8QQ@omTb2%?APXu(lxi0rm+WfC{MPj zUs|ZWpw^C$E9v9gUuF}}vR7#YV+t5G5MHiOF*>VAwt^u*p*i~Y4uj6_{5^JH@kO!*PKLejPYZze0U^IGMdk%?(T{L7!He<1dHJ6s3lc zS5i%fBi|_AwpW4gfsSrS(l&iu6%%C6v&;_s{A#Ry4dM`4f-T)`H48pZ)8%Tm)%}i) zr?{$2L#mLLvW`FzT(rx~6a+HKPUOFB_@_i!XzXqT6<8#eV#D0e&=qyF2AQtx;MT~y z$Ju;hTV@qvz|{Tf-}=@zw-m^x!|Lhd2jV4>0x5Q!!->Sp-Vtg)f@q%5 z;t>*K7NL`7>E7#nmzf zHbDMyy33`vH$DzL!xD)Kz(v#B1_DiWtlzyk$|hCh3lO?H&u*aPCHp)F z>iYoLnXfD%PT(b3`Po*7bRLKxkistE>3!-AEbXD-;-`={FUYth%~g3*D=t@=7_H6# z?MedDSV_Zs{?m=K$9r-)b6ChDBa&oXQg_81YoO#4PU1!vTe}DANG}Qa-%k%y+1#cp zyyvzG_?evMOGrzFJ#pVky@-VV;plrM)$iopbkwO zE9`cZUBac}yJoQwJ&4cdH>g9aBJcz-~zti=b<(X)JI?mpPrH$$*RX* zvk2`rTN|(nts}927W54mK|KXH@KaGYD-Jbrt5%KR%@#$T7N1x}sP%i{aC#>U|2@JY z!C7RAR*`!4A(LVNt)MT~Ka|$|xH!r;ndtc=Zdt#2|Ax1A&qbt3sgGrDszjqy*)v9d095gE#uNK0}*U6ANMhkg1=Q~eOZdT<` zc8#yzF$+!#F^mH#`sjq4<%ka`HekTq;5L}`5`4i-mLf&t=5zIDcUJfB_np z7MiD$XA#c;p8!!H8=9SWY)$=B_U0*!2O-O`t@myiHfHp4t6wLS{=*kZC(;1e0aS>o zdp{%I;v^IBJ0JwHHN0=NW?nmUt!$3-PmH#Zh9q9T`zHG&&2L{NUD$YHd-(FIbLpCm zYQ{@0ne!33)bVd8)B1irI|t7&)R+W1gW4o3tBOK|AIuFyB{o%S7H5H z(tPPw;H6~w_-$3AVxvL777WP#?o2^HtR0ey*|)4s@KX*aA)Gpd*2QFUeO+sHmSXr@ zk2@K`md=7UYAr5CT>g3ZLa|HA*VzC&6fn@0OMH%IQNz)HRfz0l?#}o`cmM{gB4?JR ziVYWs5N09`vTWk;>DWkf zDCjm+Oze;*CpNhJGV)r|V~RInGWdO*gP-BU9nmjBqC|%2`K#;qhTkGWPvW91Eg*szcND=ATWv2?57PN%>=o{ngX5oNNW;_&HY z!f{!z6oP!SUI;58g2ynjMuyi?YIE|(-=HiI6_7Q-V>xisML1uhMBRz7WH!N=?T0X*D`>!-@=w-01*l`bB0Zgfy&C02DPfkP-TI((c$MuKV zta0793X@v@&7?T(g^zXiJQNNM5O7J7enz-{MqnbD@+6b2?lZ?u4;y8mp1!uA)_Wvx zUCf?=PD^4{A$r7`;}`B8v~@oHr>rYv%L#)qw3Q+Vse{X0=wU722JctXbqO7<=5 zW9__FikDf~J_@_RmbTe$9k#JlL&vU}?HoH=$%{}41{&6Z{Ew6GzbwcY;_#v8C9}wY zD*$(R^+h6=?Pq#AU-!kB3h})<7rn>v0~VKR2=GYz5*&U#3pwV~paafujQfbX?1M=^xiZ6Q*`__x?#Y@ybyg!~Mj zfp3DTX)7Dy$loEqHM-=SuY{jMC7`2!68DkFT3^Kuh4?>*fW8s^)Y!JFRtYJBm`M}r zCIXmfCywYFgr(Isq4G9T9I8gYmhcgG%8W!FtYx2r!o_MV0MMMa$LUDYb~1pV&A_>I z0^>$vpyC`7!Bap&QfqCY*VyjE@xVSq(o4kf1`jlB3JFg$lCLsL7!4sCKH-NAPx$a6 z;Y?E4FDg#uOtzxm>%EO2G5shpmG3TGQD-II;?hsTyG&CJLn>EoR%$B10s29=)z&wYql9B31smTm}R+yW1+O zfTaKQ7%;FU5Q90SxW~%@|BGC}J{>nrfj387?dYJ{cLlB}IeIDZ*B2D4n+33yhp?%) zL8Cft-g+!`(_2os!AUX&=ntqe=XVMIf71Q7B`5mx&xeZHl3={nM7nc%g)2i|1V;R@ z&Xk_Oh1r?QZ5kdPJ9q0mAgWPGvAoIdcCC7V>UxIS^MgHQ33nRj}*9aMa@ zOW=1)Up+Bfv`ivd-4t4pL!Q9O5jg`lbe7uPQChpPnS2s_a_r{9r0}PT z=~oxklLv^lLDW9g@G?UH>{a0F14LID>LpR`8sC*@)-Aq!L(iVzgBjWndiMU8+Cr{Q zu;}VMXbtIct$s>1f##ne2H%3?YvmQc&=xknd}Qq?1EF6reF|AQ7!KW+H4vRTRY-y$ zT=~WV#N=yd&;mqBWN(xlo-)aSovq(2+4&N!=#b6hiG4o7Ye`2NpO2~VQuTcKj!DjJ z4IHx1LSz1QWnzH`7F5z$jX`?NnInKgwQoNL2~!Vfz1k9jlsI-845VEv=gVj16Z^>= zdNeK;@$*4|b>%x3D{Acb+=D&-QRqOQg{tz}*erscoX zGdKdFXDAO9+K)2;_D7E#4`-rG;%_u6xn#PT_Y}merY816N1VKee{!Aqs6Yjs>KjeN zt8+w$W{B%e-MCxrq=$)lsaHjtYhB6CV`B*E=NI=vPO4C{Q){ zD-yxFnNA2hIO#^Pa+9EC1NMj*u&o&w1=ka8gAF=yTt9`*c;N=91X9UuN>z1gZDUxb zj3%IqX`X#f1VCBn@SQ5lXXwb%HtQn$$6C8{ z0EoJ2*crNd>m$v+(#i9@E*s4dUZQ?~e-T#tZ$PeAU)CNAM%QA9f*+{Fi|F&1Fo5Tg z#kcB(x`Z++N-Q@R`A}hx*iDY?w9?ZOJ;Cpx>I^ z=0c}#G`E*Ex{2lIh`G8*Is~$Oq0Y^KvU*}zld1%Ub1DBFuyej+vfKyAl5lP??0rgD z&FQMl4AU4ez+6+x&eL`5^7phjuIYDO!xLkQKCxOzZbwrSUkzbEfreHuUDc}dGO-&> zM}4@gUFjQxSLr&d&;1gzI8YfgoZPL%x4#% zW`p&46LHVg7+pm147%^#i=xSKg-Cx5)52aY1;aeL+)s!{>omJFj*v7LB+MGJibsuM zkthh%E%j57gV>zM!8Vz6(Mau(igIW6OSAufbA#-eXjS`OwYfa;pDqJA+^~~cb1OVu z^^>T^0#e7Li%oJI^rxND{}u4v9sLDw&g|yld}#5XoAB}}fYjk2_6~{5HeVDCI)k+A zibI;IzCF~y1sMC{HMS;_Nwitu9kMTOMV6!?k-Lp9=lLQ(>7{?5>{gS9WYvEMI{{yw05&LC0@3ys z_vGXHfiXxwA2YVdd^`61iqk#?*&r!yarM?hA;7cJMc#iRpbw>HTbY;M!l|4REopm@ zuw5z%OW3ePrqIGwMN~x6!cyO$mKf9*fKalUbe;KA-S5v43bb((?vH!D!|hXU7V%>G02gdXTY8n>g;T(lQ=NSZ zeow$Qr}!Gr2cJZWVnGwC^b!A3yMr6Q*g;k3cv7QL9;;m5y5wi{V&j2!W@8 zAblTWb|RjnN{-8dke=KekzcjAsOHOTy%K50ET*G{;p-~@a|Zo?KE=+G2s_Z1E2cvc zT`Mmsdf6x`&Pe;#Dx1Luj55`988n;HZAtg$G32q_6SvkU@? zIo*rOeM~z;eqb;{4g}kmz@F3(|P7j!hqceMr`r$b|K3^%V!fw zEOi7$e_4v7;1z1Qt3aP;u$IdDo!zU;86IpYLGZ6V4xbBs z@{d`ZoaqeN|EDZ_Z%K(#YfO#NUdK-Ny{@pZIWQPYt6g{AHY9{Dl6r;YmVM6XB}ZB{ z%hVac)Fkh-Djd0)ix3?#pj|;QrHXHp+#lBUs$BO+`PG6b26?CUwhW-7i>zT3vx`Msaw*cy~m zlBVgm+3#m%?RAY!es|6yuJni_Di)ap?cdXKEPB{b@9AG^RP?VtA@I^!! zUSQELaJBeHTcUpRr9+&Zrst&n=be1&L+yW!f@6!cJq2ecAe&IijW$=A6T%#p2tpfr%YE=b{FSI+x*j*pWh;EJb~SLTEyKp znaVSW(Fbon2!fB*0IELduL51b5b{vS62d^Mm#h_kGcV8i`++IHoXAUTtLlLC(2HG& z*P6v9op&}i@?rB^*$_Cqd{%3{C~xzNS+x`_)jRbhTI#+~pUSc_)0AsAaDcv)=tL+% zOpEIG$%CyFGb-d;WZFpx`DOXv2Hrg`{L}mvZ=nB&SJ^2x=-3n#`Xs+~ryMYP4jl>= zx;gxyLOpuZy_!iVF@Hev4b;HjVa)ET2sx($>Ee!-b$PvOnf@MCa?pK76MPf#(mvs% z<#|T7Gh>u~$6O-MD)a$qM+gW1Eb0dP8$jp`sl4nM2ip%=Lx6N9$V~Rtk6u6@y;>v# zaIt&*L)3a3E>ZHeTSY)kaAS$Qu^q7J?wpryx!hg4J0dmN-2a0xP{z8wW>UbJ)SZO4 zczscXVWTP+_*=eT;P1fZ6IA8ahCn&qIhK+!TvjU?uneVei*vP8n*LL?IwiKqjH?F= zIEeE#hD607TM*qU0?}dJ3wK7Rm-8{7uiOX;{r(BDU@9eF`lgLmj@RfkjJMNoxgzpT zo~f4oV5+xP6m*uEQ!QHrqymCPuRdIX&{Fp$$r&y4qZtzh!BPkmENb%t+C!7*NNs$u z!-<{%#ZpkzWB%e3qW_*p4GLY|dE-`6^|fCKyr88^)&uK9fp1tdVAWvEFy4u znK;7MnG>+shzCGB+&)R_?@mL75EG2oy*!yNo#;o3dCk_HjMgpqFT)zyQ}E@?6a0$_ zVah71ai!HD0TXZ0L|QEQ>sRFI>~?SGhI>^hhGOjxPnJnFtohAJww+A?I!47z35Y8w zXa!8#i4{Sjzq^jD9lk%w?*deIB8`y}O=q7#CXJZU9Di+N661Kf>x9MR8%PXV3rlGy zJ^`X00@lDE*9J&%(>HW2Wa$@xTlILvriF^>mPcF<4z5RPf1A3C@CdKUvhgd6SM6x0 zK=LZQ(}!{Nz8|^ z={c5v%qDTXJiGMcZjmAHzi=GMsAdkP1yg!UUQIrbWQd!b6L7K#F>>@TNp1%6E;XUy z5V!Y2LRA?;=J!Vu6swBZtE7vqZ-HmDA722lbk#ZXcG9?$==ve9R;ymKP^#un;@gr#*Xvu#fKK}DhIO5$HeNdw+xRlwzdgZU zHB&=GZaH3uxk_A(SV1iLQFct=FgS?`^=1r#8<@DJ*$q;Tf3&O29^-*_wGqk(YEiy7 z*k+{9F^GA^_TVx8|G#^P{5h?I2`F*NrPe*okFDw$F%ZGue3R&}sn0X)K5MnxH=@sh zauw+CFS#@1#kIAqvP>5aD2alK zOuv|^gDfRR*6Ax3lBK|K$#N;gZHx3TCV(1%?it+FBt>gefj@&%qH_nZcUKufMobnD z8D$6IK^9-7`0iw)AtJ=VPLaBT3`dKOSYXz|mq%La@xu2A);Y0y?r-$K3M;9u!4WG&lj~;pjDX zB1MEW)JP1@-fen{^9AYPt?$jt?Q~6X%*gD}B7Yv^5kxl4p?NC$Rbn$zbtVR=fHhdq zud`=ODjmYg+0!;!l=aE38#JChtjV7Ww8D=(2!(&^w8=I=+$%H}KbG-$hYHrfxh@sv z`OehkA{b=`BcQg`HMHP%qs};)N<`Ej_8ysDv^h`cWf*oP<{-|K2FtNmQA41=$YGwn zn9XSH0h%-6ag!aEPODai?sq<;cH8p=$ozmIQTz;nhkFykK9ywG?(sQ09a9>I!!M<( zKZlXC8_t;%;k(#aia35Y@)N~(&E5q|y{GmB$G+>URk!_WEZ8JZU5*nHw1L#fGVpHI{f%D#2=)?PG}hBr0K|<~OIUInpBZJh7XjMa0rb3lai}8Vk9o zQLPp*gWT%yzR*GD zXd340SO=&E&=7ZGZI=zH+C3F24C@7Ob`#}kDdA$CG&Y+Lx zG;jS%aH~f1cMgPG(-xyBxhxM zdNp)z;3q#WhzE?X#$+H%-h3K!ZGd8QEJVGS8-;D@uzw(ysAg7c5%0^)1cD{!s~JRr zak_U_e*+99%;Rn~v6aWBtF~OpQtBVXj45K9I|C!<-JxH>X(NS#s(FmS$8^3|1la!! z812gkw$@j*NdeX|pAk|DwCq0b|KD)Q$I*O+5i-2wd7K2%pTuliJqs0=o`|DJ$1qYq zbMI@dahP3l74_*?B37uq09+U_gvyTAV#8&$Lr0DX{)(dYjdjg5tWMd=#>Z3<6MvS0 z6<8C-&-PR1Oxr|Zy=`RO>-nHFa`=>L2*vKbRH9zuL4(gMw;|oT>Pe!nis#q-a zw^B;H{Y%BSqwO0IS*31?;S0a?bsX-te4&E#~5C^HFp9KmD$UIMX%vEr5?9i(QlRaeKIW6x203Bk|3Tj z&+puO(c|xE^J3N%C)FS|86wFm5@NkKEoBYMId?ufqQQ@bp*L+nM83UEBBX$l7?VNkS$;q1`kUo zw5-aZ7UOPT)%7ul4C!+P!O3bAaPZKAo|=AKAivS8yM$_1-DxgYrJ^)br<6*1f)mFq z=Eg!qKTi8C7J$7JMHPi|ikT6dFJLF_zJ~lZZD-tF3GM{Q z`u-09(NMT=uaPbvZB>wX{2mu&W3^F>!gmO6Yb^k2@Nl zJ-eKI*5wBv`GKw#?Z7*b;W3SwAsmrba~bwQ82_Q0x6(zN*|6b05|n2aU=`_I=R$a7 z2HwNqBHKE!R58{qKZ2Q;-}x&#DM4yIZ#5e2rfrlR_oJ*@;whQ+*djle5YnB?DGP{3 z*k{x7XXj9%!;U76EB1i*teTZ0=bWBN|8;dPajruz_^w zws2R2r%^@8mY}|PoD?&9pxp`y~l4YI``5mN^4IsHz8Z0@e=aH;*kD53 z389AQCi`QTTmn`z7nnw6H??20kOnn^(-X+hsUzLNAeSWwzo72P^2Wg`q%|L<01GQ{ zc7x_UeMP7Q#Ef_bQD)NOE9&Nj+Kl2~#{q#&4wV<}Sop{)?p+H4{u5L?W(<4kJm~7) z9he4bJx-Pngc@!cBW!N+CNPl@s|R$8tF~M5x`~)py4JQ3dubB|{aL(aV)=V1VHbDT z(u7ByB$G%%M^Y7^j)Su{&iDnfs8lZ~WpV2}dB&12d#)6^p7I(Hj!$&|&zyRNRwwA` za%g4&GJjv%=9@S)DVc@e0!k#*#?F8Gw~foubl2M989o{FTl}5{?XuUM^q^w$h7hed zH9hKdW=h0tpt|qlGfzzH$W6O@VT_AFVr|2ih6#pnA5Ov~&U#(r=mCotegCfRwz@Bm zwe>&Kz#RE0w z(lhFPgR4F}Qc}@hH#ra=tI+Yx2=8|k$)P{s43nqHs8o7UMIvpK$V?}Hnw>#&uQ5nhkK3RZy*y4mJO9w0=^xa9kpze~zX)E{x z*>rZmjl>K@UI)bxKivBz9L6lg4R5Z)9tUZA*B2;qHQ$7+J!upm^q^LuyAWMTlao|# zh-)B5tErb0b#evV+=Po=K20fYIXj2Ql<2UXEggOQ>#9uMy{?^L`B(X+Kw z<8>X39l>>0U5#6uMTy{fb(PB~?ff=h?f;_>+ql%>|LG65IKdn_6bDr&#cBy5!aZrk z>qsv+`0`^eR5Jq%S)Vn+z7jS^0;xL~d@Qk4W)O>|)92*(^+qVr=~xEAK& zQ4E_(MJ4>y8eQ+jPZnTX?zCqrFjz#C^y`P%}mkdY9oX8wYSDV5?m>_>i zZaYM2f>TnfQJYjb^AtYCMW1FOk!nVlDDuH>n^x8#9#i)NlXt0At~r4PSC72GS9Sc0 zEML+k>@w%Ej!)(KrHT+=HT*{f)UvIT%V!TKrY~6LDUlP#-wg)ma$mjs_!%XQmO>-K zRuMN~tW78YW5t_2zVleyAT-*$p-E$B4R0|J%NaZrZ^JSCPX~CN;juwZ5t>L2!Xam>>D>v znvqnF8c7bn;!G8)Ne;2_sHnxcl;G);0ii_@163{YVm$x2I=+(K`VF!9w?tr9MwBgH zJ-BqFRHq71Wi3aaT{?z!*OUWBurDZS4k3-6iO|UDo!{)0njXWgq^=w{uyEKvuY#Ny z?W8e3JmMdN9*wC;dtg2D=O+XQmF>jr4aWaAG+0#SJCa8lTC!i-704(5J&Y8l!CXqi zY8Qwf{iS=?q@Z&Bv)!LO%sKfc++!}cB;<8SOHc8^Vmh+aAB!ziP$hy!(kxFflgECy z2ntGbU)*qkdx*Ba^&rbtZtQ8M?Z&B4lk*XtQqbbV+#&|I#O_7BCZXBE$LV9>@M|1K zmyJ%7!;p-vTw{Z;2bcc~TMlsqnJ8{LI*+)4q`iri}2B#~iro z3hxcdX@JmXAx>bwMR1yG$7o+d-PmGK*1awoLNP~q6bK3@^6JfKo;KO0VFfV~q3@!5 zJ7gCbbyLt=^CKX=biL4(^UP0r#^#PqQDDUGQfnAiaDz!=)r07Ny4l`bjoIcC>5t-J;(oq5LkroIW<+Hr+R916a z1UUS@!&TjhnFIpBeQiXYbE6ETWSToG$wIN=*lu&%xn1MOKP1KPH^A1vtgamUQc5Ja z?GEUq{>sIQYc#q>tD^Ii39^aeAJp?>?+?($Z4U{3xf{BYk=XUa8vOHRL+^H4lS6^s z+)zT8&uaNuA+b8>+sM{)L^|DkY4XK`KFLz_e+(226X!kA(?Au-F5$NZoQ5?lJLl2F z(;~A{q7qf0Pqi;{J`Wu9^G99#nxy6K0n!*}9lSk*BD$y1;o44`_>4N-C3OQ31%6*& zKcPxw?7sA2YIV(;OF$2xtS z0NQh@&21eGNEMdC)iKU*xx)k*E;aeVL>YTQoMXF!F*@IP_ikAr_pNNi#jF z%oGrx35_?+q^)1--b)SpysIe@GzRl|iJyZr{icDOf1bP|UbFx@` zA-dy*m;9e-9872;8vbktW3MfRwjN*#1(Gc1cgDs(2)vsMe4UB=M9ik+=jC&Xd$|En zl-RQBm`r@IpZLZHr5CZYs(*<7dntrf-m8JaNV5p5po7>%G$OvbF{sXWFEp5caPc`Z z?EoXkl=k4W`#&ZEaBz*-#eoKH5HZ8(m&pW%#*lwm{{T_SC9+V#c0e+D4%#5;5M*?G zyX*hRj2o*jlX6#bM*S@0IOnX?(ePo}k3_YyZGM`I9Urz$KfQfiDTB>KqYtR`az}=Y zwAMvT1V#Ym9WLwKsVp`4DW8jXbpOY_wukU91Of63^;hjf*vqzj4qg?YEPUQYk(dk) z1?iXiR@X)j?AGGWuK;s;paj53SKzBHv1JgJ*YoXZ5$C%!5_QaqT9AB!q05d?$zxUDQa!-Q@d#UL@Mv4H< zf;~5eX;E(^YBwXe`?YSpInc7`lojM&VMI3NdHQhksG#n%X9JQDrss2ffAp}b1&8HfVtT%jRh|-0Falt|&Z zXp2@`hT8FxMS|v_+IF-$ApY%Og$ttHkwSK0e{P6Ngta6sAUn2HSEN$P64NqP6=V^E zxmn_Y{gseDcNv6)o3`K|NbefMnwbd)MRXvR?Q%=Wt|uyuMlLo*{F5K+AUBmj?RivN zW>^SdjrH<&Off~@Uc3HULI)RtEz-qBs4G|oRweE z9$Cga7Kg<`?yAQI2f;OSZc~&41}j+bg8utkifnxnT!4U0M_?%)!q$QwuR+649H6E? zdiq02rQ=crzrQ6LV%=W-~D4m$jJS9BiASJX>=Hf=t}gy|;5$ih^ZoA`7syT5n!HW_^6IlKQe zMf4jsi1~%N50#CJmTzXo-c{0|SSJ;_WSd6mcqOc|QAf7>zi*Sz8dIxPN!2CNAA+jY zf6^h~J8?xk)W4mpNp;&ACT&;&VQ@(@)RsA!1>kVkVny?_5N%vkBG&!oW*X`lZxbV9 z?iDBrL33F5n?UycpXLc%oryv~MH}|K_C-J=CU_>2_yj&aD-4|s=#uN#0TPLkDRw8V z3?aGCqt2UD)yRV{01J|dZnZV>g%JS&%3Gb7?{3dG1S8TR?_Atm`q!5LYq6l`1$BuN zj4I&FQ<#U={z_PLh^4=DJt0jSFOSG6+PV~ry;?pzJ_ehgz7=#$_0 zZ4}ruT`H{VH#)fxmWoIp=mqUPgl7%HfGN*B`vMfdn%kCNeghP}kFRw_Ra@zZtB*1| zGhVLcMr}>ZpXTA8hhM|t&w*cJOMS>GYl#;pxYYT$H&O!iVpE~$_!tRFlhk0|I8K>m z4{&He1DHpUDWTsw0ZCQb$<*K$rztTpAe_5W;>&yNXyqtne z+E~e3YLQ!R;yFFi2zKDWLR-T3Ykv<+mAC3u0PNbbr(P|~UmX-FX`kVbSDPZr_odtz zaMX4g%wf`iEp155OR3%W>C>V0d(7EZo(gnM)PBc(;DgMYr7Yrw6S>SQ&_D7eV{1I! zar@TT8RR;*_P)8D0Tn*O5(Eb+F)~^0q3{v{CPJ4-R1vlCq5$!lcF&5LTNcZIhEQ?O zGj-Dg;tOVngF_buwefo%mW$Y|zD2u)>nWE&hB|T*o`-_rL!xC5>YNAg`hu|BWM-JC zGNPb!TsAsv=v#;Fug(`9PHXruAk0jY(rrP0-r->PIuHHt0vK%-KP86i zIAlPJhzHOyDj$58D3`g{{uDUpa-956m}F_yv}gd2|7a87%7sf6+B?YF z3tICo8kc5&oc5rmaRbBPvi$mt`7&icL46HuFX+eT{__8TER-NMCJQgVxrB_E5+mcTAJxt2lEoj43IGYneX&8$vtx zh_+Z@*6+sfjnACnUMHBgpTe-N$OEve8Nz>)CDD`ct&z)&*D90$iC`;AT}CAx74f{w z2mHKvDqik6Ktb*IgMqGE63%7uzajt8mWH zJX|}Fzce-Mw>U?)2_7-5j3ALeAyc|bSmFoeHG8wboy=$vv{dL6z8c;|@i+(T94h6^oJ zUxA#7rLi%Zh#-%!&rIpfeUt{kpuGm~37eQtcs}SrtegM6SF!y#kYS(h*_&r=Vd=p8 zk7gQ4wq_!T*?nP$J?LicCQ8! z-uRy5vFUqpGFJK@!qs+MqHnRnJ=Rw!sJo%}3?Tt`Djk=4TbCLk*Z=@Whzp~Tw0rnV z#4&y~@fz6Se-vJvBeytQ#;ZUH*ck#oTvPaM=LE5(rTcp>!80|MMj6-JxIHhat7P+L@tV|Y;&IWcCYP?zE2zjXdKpm(IwLi

V~Uqw?19d7_-Q6XO(Ma9eh9d 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%0AXzBt+`7|yNFC-v~p6u``# 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%0Asr*cxMqQYV)suH zR>G8Zk^m)gqeTKW@*;C~$lsJk06StK_JNO%Z^4Rc3=7GDE(O0J5 zx5Tn-q;N^=&KzHSH6%*`dJ&RcS9s-fGV*za3^p0SMmMOFwJ=8$Cg$9CT}n5*nj_k; zpFZE$>mlqD!1b0i=1SPbNS5+2GWVenf^yzwifkin^3c7(LGUcDXfWQ|L6%?E^6sURSeb4_CQM5u){juS&zN$d!OLclSWNpmy%Qz z-n>u-n#CJKnpx0y>AQ}CaveCg{FOAsv*!xUy@rp+2oX;X!E(Gbpq29$Eyi!-lvks3HA>hrm%RMB7W72$<(eiI6yCrwwX)YkqRau}M1<`WJy1 zEA*rUz_0Va(=C4TE1;6eqyC8m1x%a#3LHdoD5hf(00WOTRTc)5!*1X2!#HQh+lF)SC%-tPybwTVOG5z$sLqEo43lu zK<;30a9S}mZHT95tyJYFel2081u|a;vzzSxL*I7_2fZh_Q1nwRiSJ-6gi%l7H3y1t z21Zj}ZHfhCuxTq$T|p|9u!F$}9%E!diMX)OcEXHjED*H}Z2}P~>Fg@>HwU<(Gj)|G zc;pF+E8V&S1Lux`@p2ns$^$^NU4-xYMN9jC$^vHg>@1KU?L~Hdeih?Thkq`?Vvt0 z@1EOJ7)VvUTW>fLfe{ow&O5tZPzi&Ux`lmpyIelSpN#&}~UoEDSmDbGiu3 z3!L3$fZm`jLkU_U9(WVOvG@;u{n~EpSIO7e5f;fKVr|geIwEhskKdz=%E!DH2wnnR zlF`Zt-2iJ>|;>{m_MHn36lN=(&iIvkhmW8qj{ik{;)>08md~aWA3$$SsacTBwV9_R(LZ$ z(yk!OUtlwn++d$+t{Y)3G(1|DUX7fh=>A6IDmeUtZ6KvBuL~?1-*P3a0c71*Ixpz2 z`GsZEvQ z$vU$>p_ke>_-BagXKoOS3=SF{>1dm-^Zmf^h9qvBlE9c~$RBJAIXX+xZ{b8kUdWbX za}%&Jg${DRT2L#*o~WU=KlLWER&g&NOUvSKx=5dhvj%3(e+{9upz^)6`IP z3ABhlEn<2PjPmN$N+ddic14vcAE`MBW#4akITqpG`FL#hVxu$l*c5fRk&K46Y?iXy zpu?aaR_RQ@k@Z-*v&H(ol*QS+@FyO$Z8S}y7kSvvBLPDDHuNP0JSRSw3H?jo&djifD7mffdml=MuW4&ftwYW^xN&Ar+M>*%?4>}z&eE7hptQfr<@M|F~ zf=yN?7_w`A6whXVNB{49nJK5@Jw&}enEh$l)v~WeOJ(HXaCKW!L31~j$a@Bi`1r>5 z?aK9SOqAU6ao>SHFQEvfL}r{kl2OUU6)|02V2Sl(2B@2L#}U z>>*9tO_kdliQ+`4MS`E4!YyzHbkcW;Qf}DN-hZ$!rY-;IoSfWGgVBTR6h2q<5?m@5 z5F1qTj1vVOh5gQf_l=$VK}H<5&2RcC>dM)!%D!Rb3jkJ6TO5MEF+zwNJcC-c$PGHZ z?~^+KuO9N34%x3Dqwu?g2SCD>&eT9!m+0jsLk+CoJ>j6>I}yAPqg3mai0SUN(VNJQ zJ1l3;A=({*TuA|(9(vl+N=YUBZnM`Sk6w>LSiNKvvF=<1#iJPUXG~M9H3!%<&!yeAa`XJZfpwO2b zZhrsy$+&U*jM={2wWPQLjMLrsj?(x@_8S(C#&AWZ;C5P?*uBeMhJE=cr7$Kv)a zk9}=lkrequ^m6y&j8?re=C&r008LyPHi^kH2t&|6brn5}Hud8|Ar=tri!jEOhNSZB z!}7+ypzF%#6YXtE0gXY4ODws>*oi0GPVML`ilq$$&2$WWih;CPAmt^g9;K@uqjjFR(0n+#HL8|(KV~EE8Xn~A$q~jN!*$2-l6Pw(s1>(*1sOI&8_L|PUsfuq z&&mX$*g_gN!K?I@+#)Y3_)~1*qyT0Q2Kefz6c}-9hz)PAyg5mrjxsIlQHN+k9^Qk?E7@MdxCKOTm?h%D|p4x5;QnTN>vYR zm(dNjH+Y*?pUu)DoTG(16SbN&8(MNbHOO~fNB7@a#-H5ql-%iz90@EMaUA}g5xJOm zABF(fRA+*9l^^jT4BK|73jX_{n|m-5#6Qx>atIpjsc#DK;o-9nj4s4_E}#Az9ZgHY ziytIN*-~IslK^F(Hsxv$&_a5;P#W(puR^WoXwX%ic~=e1Gd;lL=5T$kp9nLd+sfDi zQgT*IWcK%;9_mWdemQ75*%JjUJ1LYJs?Bv?s+bR}hOBYmll9Baw~aNl{?mAv<0 zxm1-WxV)GMk)Ui@b%whbMA56i2C9f}y?#Ga-ube+j`FMJbUMBtb6Yd9W;~j4!g4&b zimFvyT4K7z`}JCAaD6__xR+Y&&E|M*#ZDG$^wJ}|eB5!+O|IO6d5gj9ZpzpBfZ-TM zx@Y_Emwr2bQz1ubj{uz719adUqxvg)pJ!EI3KArHr~{KJg< zu^Zz^_#?WC+QG#)fM4#-s$SX>E7~ic+g~WyRA&UYlUeWj-TO*9Jd7jMK0Xqc3wnw964Jk4c~hX(6`Tv{6RAqK0*MIg_ z@^E!p_VUDB88BWBgoypK(C6UxxYVUhIbnDZ`m@g42Vsa9NFA+)g?t022kizW{A;8P z=V!#cGQwTu;39-vdR2|vD{>{E=?OSP19 zv9IjMek;)v94^*7*;W_e)iv4T^ae{zJBRU<*6L9DKAKed0U-5bG-I){+WZELk(#4p zRVho#c{77f=P{9YXkZ}Mk4(T46t|1}QRF;O2a;^tT6kMoW|~I%iS~0<5WvQ0#fVdu zD%;y*D|i!CPhhNv<3DhTq9A$*+rz|Ohfp@9YY($>g!B-uBA)?>O7l%om_lQ-^(&ag z8tU8VCZRLU>+3-%t5(+rFWHAj>eO=%wX!>YMF0{VT~HJId+M(OJI>1B8*=jj#9Fj? zl$P_l-r)ly-|G<72dTz3eQd97M;Id?ZaS{{jb^_C<7ZRQq;Me#+7Syq9Rr$h2oNpKHQQRp=_bn=g8l#X|zj#gT3BZ_$pCf6Z>(k;gMi~m0^T`!H$F!p!rIBF7= zGSvj#%sRpZY=8yRHt9BnHSY(7nug_3l@?rXbrdrs1a0-mlNo+)50oW?6~^rO3_kmw z;tUK+YLs-xXe+HkVFP`{BWK8};Uh!9UZ}HMBGdu9EDhELu89lWq5{de*PD=C`SFU( z$yKJoJm3eG8%p@kx`8N${302r+bDbWv_VK$uArb~U1TF$4Lw$0a$UbcPph z85U&!ba@~LID4+qtzfI-3tP%?o6t~4FGA2lO2Jp@TJ5oj1r8}3n5ATjZMcbG-1b=d zI#6EoBRFBcu2l@&n@FY}aSu`c*LKqJ@#i~$Uy2qH=bYHjbsOwso|yAmxW;+vpkcon z*t(F$$|SP@V)0Tk3bJZtvP0V_w5_u(W^?yeTjwUbaeGB+SCOofh19?uG(JLBQt zV_HT1)cEkc(-uBE5qn~TGI(#Z=+ogle|mgp5BJovj18`=#iFG+eymqULw#je;SB47 z`#oBC@!AeBRDK(;2}HdY6EoaZFh}YR%e9EhA-j4}a(wgzx*Pe=-Q4tMC~#PMt~T3D z^cgtj3ARsT%ZiT6BFq`4CzV{P_(G>%$lRI(e?OlTovRBIj%O&H$|#EIAqGz$mqIx* zJ}^CU$;F~nz?s!xI}AgAf#QdXSSro*!_n{EEidUS9O^~giB$ch-=HZB0UWceipQmHcfBwM{HRqxJq`jSV`gZjkc{tbG zDTXN)^7CGbho7h{+$qgb8qSe6Z*nl!-Vez_3n zqAAm&b$1%gYkoRqJvzhrp)@?u$MPeOUu3vo7#WJ?5qB~9|GaVQo&PLoXRQO*Dt2Q{ z8JDGHqZ2wCGVToP;SS+lhJ0foHIQm4j2D7+W1vaDoY4m1LLu;*r=ee0l-EM8pcnH> z0Yqn4xu8OR+juTL96KML4EjRsk)WiH{D((q%<_=oMbqg9*HJ(6bVzqxPvXtHtVOB*;AQgN_Jp-Yt(b;pBZ!cW7chIzM^f^ffopnODo@0ux zK)#hX*!_>}S!<+bZ#Kzo=``AD;kN#@=+REn*XfoJFAwD*_$3(Avp9?`@z4bcC1ZJu z&K9HvM%+-WjWEeGYbtchB)x`Yz=RDUY)^(exvlwCv9>v+c)Z=EUZPq{T~Gp~=~1R{ zcw>6UzZM7lm-6z=AA;K#C{%&mkRA#$J)o7yMoKjvGHQ}xiy$0)Gvh1mhY*E#Ag^DZDT7@>=*plkQ((k|?gk~b6D}G=Du>_PI6d|nvzzEZ=1Nt-?N|oN8PJOl9qP?c z2y6eleYujG2;R6}+t)g$pC(ZtX~X~S!(=OIT517CCJ9&_iT#N9Rlk1E6pln+J8{fM z><*Z_!#fpTK(a)fTSk?kFtS0dI_<-p{#kJJ;3qr{U=)oHxqFIIaXT0gbzdrRFn}8C zefa3&bkA0O4#l+D)ycg>AtFCf>?Xs4BpR@t?($4gEK%O|blwdLrf_6og*W@k20aJ2YxccXXb_|Sj*&nQ zp}v8@t^xz6+U%^h@T1w5Zs)0G0XtK9ctT$*9psknYLqp2lX8P;pn~V3cz*-7MyB;) ztmnGOftYniiRceQOo1ottojCcN!^!T%J;}hk`41I&c+?o_21y70 z04!p9Dw}|HYM~i35isji7F2?D!B~yVf7Y3*5zQ~(Ho)O zdnB_R##gW(bax}BEx%MxlTHGbBiS;%P=joypX;tD?$lkSMZn6Sy^jm1&~l zN2;G>yY?$zhwl#@N?DV-A5N2^wvSNmp_*dA1$@3`NjZ!)1dQ)Cz)uOaZ9r7sLVj-f zk8#kqM%hD*&2&EkhUWlC9iC%hzpVSHb&kv^^8R?KF`~gw`4LH!-!Am8L)n-2H}B2C zS@=Opoz>(qjog8D8s$hiZ{(qd%RRh9mnXZMSq2=jTb z5!Vuz&-Y-E{e2Y|K(E}UelvRx%5~O$Oy8`-y7*?1^X-zPJxKEnX{BbHANSP1W`Q;R zniC)&u>M47frdolJ^1Q!Dvc4j3Iyqd(Tc@CmMw)09qu6blVcQSKxMrXYsKc#oApnjw1y zBhoLwN(|THDkk}6t7KHbkwRmRX}~?uk*wwW9Rv|wubRoVwW>_>TWnnnF4-aGVyS?{?@vMK z%D2NRoVDc341P8!Ttm3+64=hoUU*w->Dm%m!=7?JF3Fu<=%{`r zEi0QWklTEH?3yrHvV4umm1aXtZ(qw?e24aB7Y#OIim|qsj;KrZ!y*CnA9SO+Bmbt+ zc49iAZX|hb#|NtRRWpxxRj{?S)O39O-8*yBX7mpNKzu-!=|WTI{PY0)302P1X?iH$ z)2GRkovM^tkY!Ho*5nvu?t!C0JEn??PzA%HDBDqWsW_uodJvUt!&Z9E1jQv!X+VCO4N zqC1&P#BdV8$mk`VSOPSet!p%9Y>c3%f*mn!2mXJctVpkk;+X#|%D#Iy@9F9TjbuDV z(v>b3d%p;Z7sY*ox_+qu*H1wPi5R~sk!-1c;*Pz+nlAeyTX{|gmXgbJ&?zjvwP?Mj zFI?WHffj-KF5mus_t<96e3Q{Ry?FkE29Ma4G$m^P%bTS}FRSB$NpZh_sXH5C(j&P& zENrO@B1|7cpF;o<(eW+m!!=wt*!^vt6g8fA`N(JIh9%DEi|2vT$t!>fr^^u8Rw+4C z2PeCBWW!iUcTHjPA5>jcyZ_S!vO$503Uz~Be{lXFc;qJhYL{;7>9m&+De`{!KRL>W z8uotSWrq0F)6@f>ReI7TpNf!Z*$5bk^wMXg2-{fdq|wnovV9bJl*OE7J`6o|$n zIN~yfAQ1!BM`U5L``A+<48}~PwAv{vWZ1g_P41>wa>Rm%*j=9!S66%#(*oa7ItI<` zbx^~4}?Q5%xjrT#%=PSpDxG9%hU z%QhdRsEqHB0`aQ?cCo|48X;-60d&(f2WMiQF&>NPBzn59Nc9@6r5ydh9&9m>Ocrk< zU&Xf|A~wJ-iXAcX8{x?|4cwXWG=~_X+5@I9{W2f5+f)xF^!{;-CJ}diHjp6D7)9aA z-9EferIBUQW&ubvBYT5@$E&bp1Q{lZBT#_JI6b<3A2(c zX~sAi38E2CppNsI^)q0sdg1iRXQ-{QUCzf<@Yd;}DJUF~0|+XvxU*Q=^6H4D1R&F4 zg+EGq2kXMJPW6*cw5)}C8v2*I1N`Rau^ZD@^LS|g9=&uj8dPiPsEUK@%DHmQ9Z7|b zW1R$;-sk|$yiqfSeQeH$4cJ<~bj_z51MoL6DE$k7P7d)Ffs0Jf*6l`2WdzN1Q)f(e~V=e28Lq zxQXXPGOI~Z#33~yye$P4D%^`E;HRIde!ZMpGpD5Xsjnwzz8sig1RIA&!0%vyuDp;j z_RQCS&7sF-dcGpfa@J1cwA4^KA^p+FU>=bI#`GI;Dcj5pBi5jBc#)g?<#%b}e9naf zv>_CbJX}fJsWum?A;}ZaVsm-zHFGs3DgQWJa@7!M<0Z`LR}1kBGNL^HHg6iciDgk8 z&dy^{jd*XT*R0Rm@Xy@FHS*PdpUOC9Emz^FC^^Dd%SP8FugA5XO`qlvVea+8XzA}d z3|KIjs2EIchF@>mVnJ}+l7Q<&$wLJ>!R!J3=qcyS$4B2_W!nEbfoqj{C+NeI{$-c( z8)(7`Jr1-Z0T8)~k`7;dNIHa14y0rfFRcwVaviiDtGeGrt*m=;JV?M(Vt@gG|g(p z0OhIQLS;qDw8UbI80e=nKJ}L_s!sttjM$PVL>NsYd9bvb{=4e zBsh{IG-1ykKGWFdT>`$#f6V&a2m~y345T{#L*vFcr99cN!Tz%r#J}sM2840kds%JX zP>Eh*8fs9n6+Qe%D_%sm(LeV?g>MRw5LcA(8qJf63<#PN1H^PEe|g7=+MPE-?-oI+ z=%T1EP~UiBplm+~nB?W`Vfu;-ZS6^Eh$7(4)R#ygUM%q9X1szr&V*q&+U)K50t=tj zPSljcvtf9Ln(Uy27WI^^cOIoL=YKH3yErSl)oy;wytZzvbk=`oRZfgb`9)lQ zys&!LV(17O7|RH`sO+wHv$dEvcmW5oZ=aH5!Y5d(DI}Lm=+XIaOgd15_P_hQM5y!$ zjOll#%kXNg4OoOxtZ?!sg;EYi%Xf`ws2h3q#^qz^)7SC^)AXe7nU|!3aey2_RzEnh7XPv+KW0dv&YW(c~sRq}N2^OY; zz(}ug03_-jkt;2#n37bo#>@T(#z|*D( zfQy#c?{!#Eo_DEy1~7t>XaEO_ULwhunql<}c4OJ(1@>(6(w4ZlPy(%&V>4QAJ0N%Y2iFXmXX%>Trw(OY}P4Jvb0 zywwsGWbtX;H&Fkle$tq^@m@}W(SQkrK9x$QlrJjOSGvhsWTG61&Fc1v4kzf~=D_+Z-D~RgwFCV499pKhJJhjDKy3P{bghs_zHu-)^4mm>0S_tTpNtPKn-P1E z2(YbM6)NuDnPklx&zq#WXV zEWJFL$X*GD+fAO=6+5#JOXj9wIt3roTX0&x=0Xyl$qP%;e~N8akH{f1&RSbHSnOnG|26 z%^|M#S4%>W@~Or&uWx2kQ7pj>jPrHenz0P3*z>SuFue!N<3;)qJhb{GN`PocBci*= zx6TR*o%mxdHvn8S(u;#`uSrFF^6eg%`1V9h_1hWnRGDKfCsLX73gALl)%2*s{WlQ(IyrF}HhwG)Vuz9sl%(uWC zMtiU6M`+|ez>s8;L}Y7pM?uX^YZ2qk7rNIj?dwIMkZWh(zuvCBTMXmcBK#orxwVo! z9vQvpAA>g5MkKXTeVDtK#=X@c{KQmk7CPya8RvZ^y3QZx>uvl@uJLlYrj+^JBfru9 z>@uAm_fH#NzPmL*7jJ+6lAeCE4DS?l-f_c{5CaS0>_cNrSckhaCAfe)-KuFd3!-!3 zr7g-#-(#UcA^Ht25FA)UCA-R+!$gi50E`@JuoutzCAC->Dplkp)A=t;lz-N;%4TE3 z4eAq`PgLp`&K2h#kmh2;eLHGH6mFNji+u2%XlvAwpRD$#Ov_`UfC0evujcazv?t0K zs85WH!BVr)O4V-({?p6j^W@?8s-kD@`qA4)RfEWe4Ph!s5tW(5o&qNGzHlpDA7uhp zbd|oqVfBoYwT0lEI~>yu4u%2d-^<2*BhaW*XQoESBJ6I6Lsn^h_jUDi%wqeTfgUh% z7BM!`yBahkZ$yjnaoK(!%M+N&C=7#N2=$%Qv+H`I^7UxP1I=zqOzEHs1~MD-NCUUyG2?FOS9xj@;r? zxlP?3>ma+{*{^ROn|WPRi< zz=@qZ-O?_(L+1RazsX0(abXZUt`^zRBQ6|N8iJfgTWd==_$EdDRi<_0@d2!-|0Pw z3$+?S?Y}JiJVew*dA-RI&FBSnD3$oW{uTHdl{Sx|N@3HrN z_WiN9bM-rL)o6Q}&UYN)8O;RHC01Yl{;dfB``7yHEdFRZiKr4JX;+8TM2nTqvHHis z6Wy0g^Mt6PR0s(7;CR5^A-B$3Q%+{Z+c_V4?0$xJ95i$K{CIKs#2UU%2;{>Yww8;{ zZ1WjDlrkAB4j`<7T;Y4lK2>oG+6(VUaiu{b`-%}QRy6qI+%BrNv*azNUiR!P$f@r4 z-JIgE&G0Fd$l68H*meIz)H&hqII`l;ra-kx+Cuo}#FWoTdZmChY7;ie7rarfIMgV0 z1%L-c?-0oWAj`Qf^0t#V1$lr;tXI!{`G)?1osY@6N&5svUI52R4YwAk)dF~)2ZaG9 zca&J~z{;oxrY=Etwv>>tu5sI2tk2;aH0STJw;Oq?W$-qt67D0&bUN0Bs(l0=`>?Bz zDazQW;BA5eGW=Z8NQLgkcy~q5GhYUxGUv@x3Qh^w>ahPFl8w!_JKEJSUmS|`ItlyR50|)pgV4l zAiXx0qddQ5qsGtw#Z9T|i&EXu%bM%omR`%{nnDh89Yqd{2#}s~e$sPjyAz?Lv*qMr zVnZGjr~ki*#yFux&~-a=#8#1=x@JW$nz({}qU;863+R(qzu^o(<;FB`yfCq|>NsJg zivP;=(7Td{e3~w>j&dQxAdk z_q%Q#fE2Q%&Bh`+Ib7Tt6Fzer);T&}QVO;X+2Z&jdFRLfBAbE^u?Vrd1-Ja@5 zc#4l0pc(x>iFss1%BkNH3-xg!@)w}@!U5)8dWb`b-D>$@tEkI%6$>FDuPS5~8`@nm zc?75rN5oj(c8jD-OWB-7YJuFg1|G_)r42{F{9FiP;%CDq-vTQl%=cBBJgh{^6q$WB zW!)7Mjfq+-i6#HZW!gf{jy=c{JJJvao{s77Rm&20Zs0S!;-?w&R-LQQEn5l@3h#qZX+<|VvHrpW|+ zzeQVZAz9vjZ6F>*x-gH+fwT$0FG`nt==yAj7_5oXRP)V$zgdDOao{3|$l}=52gN)7w_%wfJ*SdH*A^>0-gzA^&W>STSiaps~zSz(*(=EWN|h zOfKe8;DhB?^v;CZkk}e77B#Dh0cDM61YTc_i)p1Q(+ONmF3?2et4%2;TsyzY*KV!r zG221->!n+k7Z_$tgc*t=g>7oHwYHX==$QbE<71RbfQz6nW%tozl}mbBqUa$!oX<5r zxT!cBz&dUdjAq=JhnBV6bK>UQ#H5?IUBMj4%@V*UH4S=e$0=D1O+f;F=T*5GS-IpN za+BVo@$Ky%UhW`5>GV_Gw?@1;aG}^SIEJfTs2H%|uDgQk`6R!Lr8TOO`CDMOGvm7Q2~{_kl9WI!aJ^*8#OX^a2744~ zlRVC%`Yv;Gn5UgIEpKU1tV26deTlFx3M6fJM3#4^Z6x{mRPSh_q{5MTjBK!b*b0t6 zNb27kxa3qQ;sw~~=M3sxT$|OH2b&s zZ~zJ6@C7^4<-+l(gu34sqYYL>pv<(c;du0Eih7!PKx?2_OQd?>PwM*zR5w=jhj+Ua z4U8Ak3HR&=q_IaTfdY|M748%~a+1S{DU9ei*V1=?4TH!F;IQ3uMHt|2z9Ytlcaw?N za1qM=Pv3M?@Oj0bIF`H+$QiAVG?ZSwaFV*#n&pmG|L^=T^*9iv760==qWYGh5F~*; zpfXO0$HubKC48Jla+`8a2L=;Pu(_mbaemrZ*cqd$8lW1HKW)!aexihp3gB)LvYy~p zDz{)MX-}H=A=}Ttsx6tq4ijyP3Kw9!92zcU03*uaB~(}Jv`MF>g9;^|uxkUAJL|*@ z1>*m#LEUfwv`FSt-m@E0BuKi>RdukuXoo0`W#+XnH*U!h%vc4Lsn*Uny6lLN#nOZ& zg~dWIWweGN`#*_Cz)(59vx|a<*R^t)#V<$L!g!b86@ONs8JRC;8{x(|ecSSz{fz4G zDBgs8kUhJE=lVAex=JX5Cug2Q4!-GL?mh9azO4xlfV4{f1y3yWM2ve}j?lgbIq5;1 z!fb(nv4vM|ncL_fYdR+46fhyOOw$yr4nzC#jvX0-WnQOrKDBoVo=fNl$P|N7Rc-^+ zfyQnI-~A$OgA8gr76ier2ZjF3Q871oqO{T*pt%g>zo`x3J!JqbkERW}flqoWz#g}) z-2mrj^TYI}e&u?%$J<@_Ut#%32{xI2Ut-+Ed>ljt=)VNk44rtb#5n4R!nK>MOHm=a zzweX~Y~_aO5UTg6|7M3qgxo6dvhAa?EzZ^{m^v~G2Qm^71xO(v2fwSH5w z(#}kYC^7X!92dT#!h-L2X!a#?=sCD=r%^Nn?{(U(ycn6#me+fi4ULdGfXr@zfnxsa z!wLtm9N!dkAThkWCp%3K>3m!uOsg3#@s7%X(z$ZJZn-BHR0p4r{D}z!vz-!cma$ED zC`l?E(ULl;v-+srb?ve-sgi@vasQnN=WWn93jH7t@i%SIZ z3~QIdEpt3JBS=qM_K(YtW4GrE-^)k(MR5QAHvj?5gLs0y;l)O$Q!?0}eF5+1f25VJ zfcCi+cn-p9n2>MxOd$laZv3ix5i|U}*MrBNMNWoWAGOY~G{2TLxMTkfkc0ryAi9nAB5TGO#BozOtu+lh?fr0MjAIMxDiM~RL~$_0&GtEpZFKz z)I)r$;63*8dwL*tDwrIbDT*()I;1h8ZgC~TNP4p*%0FXJ_hwHs)cWYftfQQA#lvtu zhPR`l7iYk!Hj%5jy$x#Lpk2gFu6kw!JYGl3@{Fsjbf~%c^VJB)+uzt|(7n9&GW5+( zcIi_c_JFm_TBl94w*);eSp=^qFx+8*SLuyJztc~*wL3>&gr(iVB)n=IF5fDiJ<4z^|$-WMqCtz9Y`s$vU-W%zQP}wmMv=KF> z71(GPu$*N4?Uo*!qw&LMN%7q2>pN6roDo?f2eW*RIs!2tzwopjvlNS6JZ`~V00{>jcM$GU2fz~*#sD|^+1YLLbt}F7mp~d zrS14$zS#j;s1Hp7dz}$lGb@Bp?02OYB({BGQ0hA|5mHXBQHamPfU3@fJ%BHUi9bqX z(Up1+xi84p9Ik!Z^pB%Zfwu1B>a4pGJ#|i(q3;^horm}Xlyl82M>|>S7_)EIYtop%2rh6j1~0p} z5sd8Pkex6$Xm~e3m_JpZWO$1bNQf(>E*sqjEc_ge)DlMAFFpUbvbwv}0_?rg!+&tR zbx>@}M3^cP`)Vbalz*+MB&8?c4wz73UB00iGoCsm&UeFv&l)#9zJq&+;)#&d(18oV z=DyX$lOw>S#bmDr4wyoi&=K|BM0PfUzH7h38Y9?$o(Hnv#tURf2j&$4{b13pvQh?N z^OPRT80#|1K@;?LmoDnMWtDir&Ht#G;qE?mX8uC3%@?(T`-~76i7W8TQWBaHT^Es5 zEDyCIm=DZJS2!>~YtQq>?aXKXk^On<&+Xbq4k34fnDyxOj&zu4iL>_Px;`zIuymG2 zaUW`TD7W}!iS*pPuWv6O6|%ZIv4NBr|mY0-sNOreuS z0k&GR+#A74^x@8yU*?V?*lkx1FB6G%6_dKkkD|rJq(Up<>+I0ny^Su9l8SXt$rLj5 zgfqlXqkDmz!pDhgG!@}q!bA~GNXQZ=+5QL+UJh_TkEexRzrljxw36qRl-A%8QbDF% zS4QPVgs{&UN4@yfeAt}B2%7&U+#B8h5eY6U_mDZQlH?1nS&WfC^A$5jittb&RoJ>j$3XL(xs{}w;-q->4&eU>1ta#4VfJasf)?;0j;=sxnjr|;Qs zh)`WD3FIDvt&G%Oc5u{MqI zmFiY#9%L}f`?Vhqdx0)=*lB866+b1_Y#9DByXYJg5^PcP0ydHL{0=*LWo@0FNNL3w z;%f-7vA4uoduq-Wf6Y;aPFsGPA33UpEJO4-k}V=%72pOPCPTO20|mPqx#s#c1dpp6 z0e)&tm<-UQx=b^0e#$i0bB#Jb23~#_)rMjx9T#tG3I7AvyN2>%W%Y`?-{MLrMw}Vq zb49$tku1JW$9U~f-xz4yAS$5Qmcv0b3spi)c3f>qyJ8!_9`FbWd-X9i>Cj(2{dosE zeU4}Ao?pbUhP;D%#9hKbaEfl58a+n9@KkFPC5h%8YLtx%^44e86I&qvVq9IphHmY?h@aSe27+<*L`~vOH%9p&*ves)Ot0fGSaMuUo~W{LGTur+OrWq;9r1;os{? z*BYa_<+Fc={kX1k73Eol^;pXbU|}ih_*wv88fBXp$CyRO)2vb13dq{{qkp5~d+vYx z^?14M#52w@M`QEgNO9T3k?d}~ia&byX?u!ZwZ&m?ODkSPC`>(ex?h&cXm|i5y~$>WP5S72h6$s z$3z83xwF~~+IWPgKUfPnDep0v18u19tX;_F3igtbzN z%Lh$J&nTNgT2w_~uNu_!_j$c^Vok!zn4sBv3?#M084&6`uh2OL$ayu&jCSL+Lsqpu zW`r|}U#o4&*Hj(l-!4&WyEiytfzV=y5_5%8$i6>QfRTqD_2lgFq>3d?K71J7x(cUWxcjsso$NgV+R=>J0uGiGzQHcHJtK=>Qk%cgU4v1+<{Zf0P8Hq9 zJSzQEVDz#&K=CE~EY1F9@F81@woCIP8vH0cEbg5TfJ^R^X0gVFx$%H|mbxzN++Klu zg?^sVA8cLr!V%zrJ?cOoO1=H+HLC=ARz@Rowu`-eQDLuX#9JJDy$Ww8OOgh{6SvEY zJuQPkBs?s{mjcCXz4d@uXf{u4Quk%X!)qEhHpMbYOIR3QCwVY4U*-b$Y`WBG>W+hW z^pLy^G(`#)DTUtKsClGo=kKQ!1`wwdJs(!Am}i${XB`s;(ufTd(oo;!$kg-em$twA z=^d!~^6%P4M;TH46noOjRJ5`dr+JFY<`?vnw1^{ z^ddS=G1IO0nhHK|%{oP!su?>w47k{Zg-H~m1KE?RCrC%kLilD~8<@UnJ+HCBW1*gzN%8!vU)!Vuu~RY+&A!+R^bU7_=}rV#5O+Ghi>n;G;Tg7&l2er7p-v!mqij! zMXoy`RcE6$u|f8o>(^Q+o9%NM$yWO0NWM=jKdE!lrq8SMcrdZ3#|?xe7xb3S{oKqM zwO;aQ>AVY1wNpN(gJb|#$BYY|!z0tZ#v6F>4a3XrzWKYpNTGVLJvD&xb8ZT2TCKS2 z=k$Nw3*`qg{l`-g@B740?pWIQq`bYs7HVc7K+Gy~rBk1xo!=Nhl?M2M_fuMl5m`a* zOWV~GY1I~(xAwTB51X3U%hRCOn%yGDvq3^`Tznn&{bo`Tx6J$_(5j9VI4q>@0c;!z zdTp`(NBfKZWu-$%KZF$2{0|E$;*m3jpa=+6K}I6T=Z9t(l3RQw46Mr^^a}aq~K|PUrhk-`52T8`suOwLMOqu_g(_6F~sj zImmv&shi%UTH%wX{^Uf3fi$*Cw*(ntIhsXSR-H@9j2#{Sd!{OO_bLSm_;q=Vk6_wI&}5eX;)-5tSmXyx-OZ8OCdy6?9P};;j!YpfT;kpuRfUB_(X0-6~Wt zxQP5}XtXf6lLBV)NP|7@oyNR8Qfz)xsxCJaBJ22@FN?9j4c*De5~r2O(*koMq}OE} zXL(QLvH8?}&uPDEEWn*rk+HKt6f~H2V_Lix0mwJOzCZd%g1n)N`E%2lSkb(Vu<`TLTe0Z}QR*Kv!HE*RNRZxK- z0jQfiUe3B40Je8nIDdTzcdhf4c_Wl)FJ9tI%@Hns|ES{dHutL^ik|f_O(#W7Dqllm z<4pg-8p14H&@$;HS)%%5m4-1vrAu}ch{@QA{m3YSsaA?N0zV*kPjRp99&a_AC4tc! zjXsT(^6gi^dl`uWDoy5vuL-+cqhC_;RPga5at%bPPlgU`3!J!oV6GKA@&mrf;$OGV zRynImlZAsYjM)k?5~6e2^%b}nrrUIaZpGBgr`OE}e7oT-KE?;0LWtD0@i!^|^LI#c z?zUbi)whtY%Vy|wA)&s4Gr6iLML3`^Ivkc9eTm12!v0Lk{ zt#5+f5&I+C5t|GS5f!Kik=qxR8os^`$g@@w-^DvE*JqSI@H+YK@Q)qa^BK{>H6-sE zOPaJx9eInoEaidRY3yguvUF+vRwY6F0gWF|$DaHuRIMMO+3KTaB*5ygI(5@%X@jzg znzQ#skjXpf)*&xVubx^flTdPzy!zsHP7aNzR^Iupca}oSZF>zpUlS=&3O%Y5h5EU+4#q2BI&-GVO!&K^ax!E-zw?}A57r8 zXbooLujWvPtIuL*%p2X=e<2>%W+Nj{7?Aa_YFS8=s4{q_)uMrJAw9-bs z?F9t(YPTt^w3=iz+F&{3HeYjoOzJ3xn zqZcOArQLK30GXoVIHul-QLH@Da&YbcPa{cgx{Pt%NUzMaiOslReT`4|evGqEN^wGm-&Lp#(Is)SuSkGT>NtdCsDP4HgUgARQX-H^p14^6fc^a8YHVPG4UT_= zh&mCeA!;%bC(dC?9N)Y*gWv5EHi5Zu5usiJrJKX)e6bq?;Ko+-k_G-(`kdt{W&>3R z0jBBA$9`MqVex01cK7c2I*8+x?_6`1gOD^i&o((u@l1c2-l#Nv{blGa74I%3+t)Xob%HygKPS=Q!8K0Fw0t0|l{LK_|BBIjKc=r?>6z?hZ}{~LG! z@8-Mj>(Y2x1}ya!q6CbE)h}S3RJ~czR-;c|a0TPA<%LJLkY%{9zjyhyiJWC4ZNbWE zJr8tn7ywcWY!*ek7E^6ME{s$?`N?E7j zL>AnDGodEGtQ+nOn1GzU#1T@WGpt8s{@{r`$_@;KU>6%s(MR!%GYj{jRRAqr0OYcB%{)N!1mTBFq}yUxKJ6XC5Q2Dlk;5V5N##UiafX9y)a*>Q z{5n2cV)deQmZojjOAwE|VI`7{d1=(P_K$D}(_diUp;nA%#GmBYKt}xQpMxiiH;|p2AX#9P7^BN6<-vHz0^j#w^j2H2!nWlItz*q|jA+byAAEg2Qm z*eG3zu7e{T7Nff;XZ@O_pW69!)mUIX3*B&K49vgO~Xd4 zRfDu}l38YeBdm3K@8*7U5}OLMl>^}nxawVV+rp-|Gra&+qP+0`xoWol{C8qPtx^!m zb3TJI3s!4j?Ms^dfpY-v+`<%U`W`exK8l615JeM>1K~@+Zqi&_|2onTV_d#awFogY zz90S?{|mF-Ks^Q_dpurB`QRnE(_j`c6_dm@;}MffYm}<=1X%eXS*5}EJTqu%Gr#AV zF^h@P?^f3W+m!4*Wz16x6~6B zRTNfW&5q-&GnGmqf14wYUcq>#?Gw)l1I?T-8${)FdaZ8l7`1T0QCYRVg zjWnoCUp7qPJT==DiHbPI2P;o&&m-+@a*#e$zz4KrbGsPme9ytJk|K;B!J2->9cah^0jqm-vcSm+WUtP{k*%on!( z%UKdAs}Bu|%Q%Tck}VHz!upd(-~vND<~MlUC`9Lb00Mf&qkG5Ah>AE|nFF&Alwpsn zNqbj10{uOiiu|%{`SayqVs+Qk`&tTQrlhs9wkGCXp|a(T3vP#Z+AE2_+fWLc4NT|l z;o_wBw1Plxg&O5y+H~6G)CUClfJwD%%#^RBZ;%TC6PkrGFW4Y-fVtW=)eRMF)CoMw z4q-og{q#!z7pLLeHmf8}V)<-JvWUkJ4QlYep58EK@v?!jturwY6ka=amS+CYIT&wU z&-$2EN~nN2`Hi}n0DYEO;AA7;Ec!c+_l^>7~5?hyA)D^VniJ|$1(N7`b2@O62&-bW-Id8%lWYI?p;0i}e z;_at(J^KWG^QU)H?>Q_2D^P@YHL*6Qg;tJT6<%n(1(R$;&a-)1W%>6+-=@??$PTNL ztr!kEhP_0=Bw7V71~^_XtPr?1=oZbM_EAN`M;xt#5hJbV*dh`7*3&b_c`vvw>jYPa z@!sCr%kNMdV@nwmrz;0tv^~mp4A)e=^eXf~lb%w{IFG*ljJD3ngh$7x)qip1HAeQc z82I?qmLKMgNU5JTg81z6+eXTRhuWS zHZ`h&C<~(Q(3@Rx;yWI+I_OGBaJH>)c~(ywKS`%gj~qB-K7s)(I;JWmhGyc&hmcc!)=?ZQFS6rJe?)E~3-Wg^1e-dGAvRS*=yjrS z|2APbMg*9zdzE2moVsJ9SC^UT|JOX$O)kDnGB3;^s$zL$?^88+8x)i)dNkm;J|g{$ zHFYn=OwI%U!*Y-*i&vUaMLgg`v@LL!Z%$vLX=FyI^U$yo#yQU`4NK_%;n!3A(f{= z3qRZE@G6+7?3xeGlN zh1HmqvzcF`l#J-40Nuy+zT$!;?eo8p#a0Vk`{wjI-+Z|u^Hw2?!LhFoon!7!`9n67 z<-MAL`31xEoe_a}0t15U49a#f$64PNM;|wfluV0v?R=?Fj~4Mb@gGZlRLd9ksbzf; z`V4|uM|teOW$x?EXZ%V4}>JK{2|bgz`XVO~BJ| z+VED+i=Hf~?xPs)^skX1U4`X`hhbw2cH-%Zsyg6TiF&TJ3jjaf{b39Of}tcZedo8D zit8$FD961Oh1v&D)@MR4SCwAg!$M^3MgsEXI?mYU{k5m6xrgq~)akmqucw&j}gwBrYI_K!{|+ z1KfK|N$$Bj;FO2YE}HuEGvC;xw-UL*xqv;OuhyTK8_`5 zG7sDherGIVw4Z|$3%wAm5b zbK4A4-&|z>Vio)yvHy5Uy@vPCZl54S=Az z0t)?5q3_enn(iNUkiIk|@3Gz51qe zw$z9?e0piNlBuzWZz-g4`B>8=McDy#Ax}#>coADZ#a==1avYhfz#%Pc;bJGiw8O))`^P5J; zKxraVw30blJ~Nc*8FsfB{HGue+R|lVA75W4RKauPQ3@-BnW2gTr~LXD@vUjVt7V(P zO@~aJBc{zLRdPKmm@!w~C{wUpD(}78jor6xcW!jI7>Qzc0xIgdi3WndvBQ!XN%c__ z6!YC-tIip7*W59H%<>m;ri;5(;i8!0A)~@3Qme<)R0Ft;@il2cOe@O zjHq-VX%%12=h)9vt<#?};UH+*)McE5|AP>Vdi?_lpS}IF2^8VAw;NorqjuHo)7qPd zQ@C)2Ivrf6!6ch?l(u2hM+brpAB(Mfl5t{!4Zg`Aj}mwO7s9>1*!Jq6 zv!DH3*lUY3`&d(YI>$FVI2{v>cMy)BMLpffjqMV)Rwq{-rl@IH`FM&~@J9E2%v zJR3t_A&wTB<)UI)D${-80rly7XYkLF{&^!ykuYMv#_zer^H z_L05sHjenLpd5Sr+@KRVOH%ZEKro}aW5ewWH@wr>C}-5XyZ zgR#1bKFMyx75yuv5s`4DDJZ9}*qI2hsPz&|n$pkgQPu;}#&>C5MhoO`!XoT|A9aKe zen*0Z`FsZ=v^nX6Dx@ton|1zkzm3nj^Zd0=!-N3NqQOY8QJjb;4R z9K(up{7|swy1T_0hTjjc2WTqsHAg7z=w`T~ADUdv1{xV%k?O0Idh%q8B=!Qj0 z-1rJ#j%k>NrV=L}QH#&h&?hT^YrvDd4ixOq6*U<^pCyUM*LHc!T!2%LJuNtzt$Za* z%=(q`HUx0{$5PK#L6fh1fYz0zjO-6NoA(5g< zv#-4zzVNUsvaf*>0gMLImeR95`Bx=21$a18j;jkVv>GA9#e?Wlu#UZ%qtXSHhju<>~)*b>Sb+4QZh4}O56SlyD0Gg zF*|z*c++DGN^ye{K6(`XOV#1#Rcz+RxcpvmZF07o075b^{ao0zAw3T0;5glzxkSe% zx9XX&!}5gC>Q98g&&M=6uG*=(W>}19=(kD?-=We;kU=cGf7(kM1IvxCkuF8&h^U>% zCA*jg5AWcAzu(4z`1I8v&ph{+CB{LwSqJp|O6m4Rbw<*4VPzo`KOO4w0owa`*0g=p zno5DFw&A$Os(nE|j=OpCRrP|(jHJ0De4Sa8*6Nkrpn)3 zKueiob2Jo!*hLjXR1=jaU9i>*2xd-&M%YFK0ON2XP?$osNJE+Z`cWr6QwonHq1Sxd z){J?B$--e?#IeQ0&%it90vFe3mdN)v$D$z9ga%Z3TR!zbsM8e$2!Z#YXhruL-Z`rb zc&I$*SHRPc!TguZajJ^#DONlhOrs>xGAdIpv&m9RAjbHoe}<3<QiA+rWRK`qd{EX!R0#LSu0@GECHi6v$t@%R;wgU~B1fLT z_oyGz2o=XS#T%1mZTnlrN{)#=#&BK`b0j^`{@;qptk(gLBuG{ml>CenoWBHmv7 z>cSg6WsZA@F)S0Ar5}I7nLjR*CYdt-SrR9}N3r?PGunWCyVBkU6QYaBf1H?o>sxN=-! zKlthBt2mP+`t&Fen|X&5iGFjNS;ya$aA5VF^=g(%ZYeKT0n>wF7b5pm-k-Nzm+ed< zAHfJ1z^Nq#Y-A4h9LZ*4LWsRQHqYt-l?+|gNNy(g3P3`B=G#${cxYHQ-N2EmiVcL$ zNwpBe$v)k_`YF43Yvt9HYz=hpKXDLZxfZ>K$yvYn%`qV^TgdUw2@P`z5VN^5F2yGj z%w?ZHaP!>ZkxHJOhQ*Y6f38WzOKEu`{u#D9VJaO5qOzg>kTs#tLTX{PqZkJog$A5a z3zT0xjd%Ku?+r49l6x0~L(;)9$(hplxc5}$JrtPX=a@#aM6dBl8BuLuT@W=YS|tH;8Sn56AU3l%y!;>Tf0@`$I|T=P{*h+>Q3UFP zq}XoGwKWoS1iDt-$0&LLKBO7c)YKU4$HRFa3&0%TkQOiC&7X+P?0Fl7rUEr+5i zw)pxZSzm4@hv#r(#4Olcj_q9?=xJzH$o;q1U@Q%6i>}rE6ta{oJVg;lr$WSm@%*FN zlhV#(^_Cg9wg?P$0Y${92=ofgB>7dsA!ZwYea{Zrt7mO&_Drp*5?L`C*vC0+R*zXL z{!0M6#`7KUclhiU1j>|&|lVSDSoVKGORf`mrC%^v@ zdKH}e7V*E|tIoT9*{ZnNCaFLzUA>@H!uL74ouTttgkL0mmJYRG&Q{_yyhFN5u~NXd zk#BtvwE%?hSnwM}v}^TuT9J}bK=g@9>?MzfH_Zu>TWtty$5*^H@Hd9F_nu;zUWeM5 z!DeK`yt>YMTw}TrekGukOzTC`+%NRs(=>HH?2sfr@BKI;ADp-xGo2)WWY(EViyE?e zym+5k_GK^E4ako?kDeFMcGeN1v%?_MDPb2q)TIe*E=rfi&bfVC5+r`n^3S~aQIRkE zh98?z0K~!?(>XXWpClC;*72m6ZtOjq_M<1D0PSTwS+*W_1abvQ2PN$8NJAQJL@6oQ2;25m<9@DQXpLuaHwFvju(^bkyMp@J5u{1Vm zyAh@uD!xIWA-CKM#%<*M^m^{KMwc+Ob3MfKBTm2rX(9535clx5&imOiv2bzv34m_O zf&eK^)J8u5Sv;r6)cg&?@9&#g8!eMMgl7E%eYsa8565zfq`z)P`ipc=uBxao5PxL} z?e_rACuPJ6e?!02&!C1iB>shBg<&J?K!U+fd*hQ^IKORZxiLMlaUg$q4`)Cpl5rkh zzl%|flJfI+KcMKHFid$JD!riYF~5W8a~7`v7e(lW&9DC#9z0ToQX0c^J%>wY-+Q9h z70h;Vubqtue3X3aAjVbgf*8aV4%hxJ27{q>hgdw@WUBX=H#g3%* zF8z)x)5>z~7xdw5G1z-ln_AMUwA;2zW0wzhb{XGPvh7Q*SJ&u1t9+stGh7a8ObiAZ z4s3Qyg;my>Rx5kPW+n8??_juGQW{(#SE zIWIr1kWyD4D|@1pTYfgA=Nxv33lXeGHj2(aB7-n26k~f3b0u*}&F4P>EEUcS=7Dh0 z&K5TT0D(_WTy6K%^;F2n`G#NlSWo~Vm5L!V6`5o$gNa8474&k2xiI`YVTdP($B%j+ z^^uvdQ+{=^ZpI*p6y6aI3`gcNt~V6cC;V2M(Ozt_`2+pwA)V^f{1tav=D~gL6NxjR zA1j}pQN0@()BhpQY<}-%xwf`zq9}1jhQFM-{6~&QuGAtV{ny?k(yEFc9u(%qOau-B z-?P!qNpBJ&+k~g{&CfD!Ak#yCD0!D^mv6+tF)ebg3UmVRSl1|eQM)bvsK>FoT#o#8 zKz6U;v#?fo;J3Tvi_?34*#IqTNslNfV3aj1+_D7YTZv#2+4Ix8KWySie|_|-C1PbR zkmhfMfUlxlC(wy6EtzG za0_XYcW|8<`@E=9i94~@gPEw$a8D@>yxd{bxb$RI4F`A_IdRCg8P~jV#4AP9lPa}Q zrEqE%2#c|(&5~&q5 zM!TuO7Ilhzlj2W|$knYqXr1TnfL(&yTzzg)`rM`gme;aK0B3y&a z3r&5d5Cg^m1^!g+dUOssT(8_y&?Fz{(Nn-WmWiGO&7{DK*xB-iGkmMa1IiA zr-@yyN)?7zRA-?6(CfBrL6BCW6J0=8e;fTFhzi~#>sQL_kbC(X8L0+`eXvSdTbD-H8oroZ0mgZ^L zJvV~p8PQS3&BT@Iqn5oT^v{XCX~<4S6y`7?k!2$#+BmCHsNL@~&1{=#1kC=D3Qt;_ zkq>%QIb?{{GPqGCe~p$CnPpp?n*zbDrl0451`$IvN`$E=#t)JHv90*RKvTbRvD5EX zHSZt3Q40wF#st^dT|Mhv*y@C^xh;*lMnD=RY3+nU{(u)QH=zE>)j+{Gvet|JUtFDU zb;YBdmlfAMk*x(GAueqGZ|#CHpW0~U-r)i4=ieEH61)=Y5N+z3S;YM*)k}5XcPNP| za5Xxw+aoYy4BVRoWdTZD?@!iF09IBpFe^=TC=n=>)v087F=#d`}WZj>@jjvl_OSN%S6}KYI1nGm(e+R6))UK5myt5f7nuT_Ovp+ z7r7F^_>H+!(i2x|Bc5Jk!V4+O*AQtpH+_fe+u5e0NF=3@0R|8Qf-WsF)Y%aaW^IU8yVvBM$F$+BreVbhkK2; zv%aJcGS3_=-Wps<8OLxwpkc?7amf48D#B9_J{dqz>4=sF|1u%FGDuLu!OoKN?a;O& zNa8~seZkQDxP>U0>eVEQl)HI-d?KeqHMT>N+D6Y+Vg}>yg~KZG))mbaDk-FFkzh_Q zAgQkXmmU74AsVRuDQ$~1!A(-y97I$X!DjLhR;jcPyM~{|RnLhIks?N3)SE0wb!SrR zCX}I%O=ffW~%h%jZD4NE?+1D*IgS`2$2Xw9%P>%bysOX_WDc!vVglgbW1< zmr(~JGgl`TtoC^n+v-!o@>)dv?sjmpR>Iei7-;+BP4uXO(+3R z^*QY&z%Nbzo2_sb%tump^}}8aO0#KRE|Pg1rnMcz=T&3T;3R8Phm*3n!Q>0XvgQWchBfGMGlQ)zix`G3dIMvX9!R)eTSnc3!Uj7&W z%mn)R$S3LF>vBv!OW5N_$w0Y!aWiygI`<3zXb9?NL}0%-Pw$zJt2DHIvF6#^ar^=`f=glOa9k zgU$$vjMi|-Ex>3Kv({3=`xqfklk%R?tr~v3iZQqJb#-FIAmuLAjknR=MruHgZ~!gT zIi<#<89r=kJ+#x`9?U`%6xHajNzV)MJ+1Z@y! zVPkvzek8rx2pvcIF5!xuqVYDmbWo;rRC)D3dUj=d*_S#K6}J-VP~Uuz^kcAU3byVp zwp97Cbf&^@jSocky~RHxk{X(e%wDXDANetOS6D6Ze_N{Ob)N|uz44Box8oD*e99!& zBG50G`oSm}Kp^vwtel_rf(^m9Ak>PXiR^DhKtvFXog9lXWWPG13zDEw z$$_C2Td9D`tz|Lyy502n!w+!=cOSZJyaU2Sx@2kI-=VSDo^3-!|Xp91G z4P|Ff>2wg2@Y`}|Za~-1+1kP7Uz9%oV$ozXYaros+>Js(!6LfPedutIcu1D<%c(kw zt&P6W7|W>MxvGUwtmLbpjvU;`_;g5>aMN-r1m>#d5UJfKFgk^@qlV;x&vzk<_5G)c z--Qb-w_egY7=e6-gIc8?Tye}U^$kCh`+Uww>I34X>jK^RmO;<4OyP3!pei+r83;?K z+EFF4H&H-|aRr$jw7=pjeH8kfS1V0e?l)lJW(_0d;qwyks>^&*c`P#^s{LT9+=&GP z@6$-4Tsn7!4-!~Ncr@)><;t74SHH+}wR2(JQTI952doGTAlrQ%**OG#6`-=NeNA&S zj|#U<)>-LDu1DwHR>o_Z&;c_d`4fJQY$w_(KkG)+SOT2zN$G%AJVA1D={UHF1n`&R(w1!5b>%Yfogo#0HnBs%7ED29j_n52WoyLn7fK+y~z^ ztenfwJz?r}7gfJe9>o;8iwE0KEt$Y*#CxY1HNtHHFnv0FXz7dz`7QR8DWTvDZUa&H zm6bn$J$sl|%^VWl*W!TZQkNDz_2-j*88KgYd2{@Nu@`+s?ih6<ke`cdl2qxfbyu&|6ebxjx-%!^t*Ihapp~f*wA6Y{Q+)OZBlWq2K zY0a-E+|ci#-wR7+cExS<70&e}DpfxG^azhA2&V!JUqbhJmD3rD0_%MzvbL)f9`uJv zWFeHyDt{|veugp;6f+1D&G($Uw>g%d@Yl{|Hy{^y^rh zcPN4nXUI5tuRjlHGPHTApG~}!i4@$UVC)lc1rO|MRI_5+`_h7F+D?{6gU*mZ%!#>f z_R>1_NWFk(92^jWxyv~M`PBWkVHhSL9YiT9sVq{r8Y74R0xB7yD&SzY%S$ef)6Idg zW?(KTITBGIB!z3?FrZ-y)DxpCsY9&~U%D3(A4+PEhEGC^K#(^26?g!Hn8bXnEe)32 z!PJ|oYa2Bo2SUQeHtcB}=SST-t&S8uaNwh$Y}ME=oq!C}MTeMdaa*krQLJt5E7+9(T(RN@6K4;3bKV0Tj=_D>7qnJmb(S1 z66z<*Re90308;r5sH(6{X@{?;;t@5Go0Z+57TlT2k8-vd>=m_62Ss6E-dD>4FTXxX znKV`(0S&78$@Q()0P>?RQwHK7NjWiWj-9y938n)s;Ky#i1Cgb;F22?8(WCum_ zrBXY04#&Rub`~kQ<3_kp2?t`ko(4~-4jM4x-$n`7Xt+D7rCFP2ISAszzY^Fa6~30O zuW)}rE<3Qgmv87usdj|DtFKVI#*bpB9bTFj3~H$UhoP%c^OrdvxRsF`YS zHf3+%pl;1iYgWbw!hSM#tbaC1i`u1mE@6qA4Xuv+!NdoF`7O1i(G4=HbPtUi0stbF z=d(TL<&`nHMQ&Cf>xlw)kE8O^QL8$q5%;9dY$iE^=mAi?2&&idxFs>W?R5`i)<+`;6qmbN{YXO9BNK;?mA*pCCM9*5p@AWO~kYbWG$(!MWuxJC>n~qZ?nacQGc^W$i~imeVn~xTfk??k8AyGiC$;!s&LI2e8>;jqL>4jWEIkBj^JZZ)SBNMgkKR=!UmJ}r*erBHh>xSqZFPF zI3uT1JBteIp_#LNfS-8w-lmh|!`@GUp_(M|BA|0&?lAM2gRj5aI{M9(*BfqVFaB&Y z{qTEbk2h@vF;w!2c0o;SwD;Ru7mU`o5TsSN`)qujs;CllshdRayt04h8R(-=S30a? z{c7V2Qdezq92fum0WU@G-Y^@@E83B=r|$6w*`IhPm5K&FUnK2-+<*WZT|wC$hP&gu z+mxOQ{enkVdYWeZY34|=*LRAM1;)W)duC=Z$@pvpoHrgu_UZimZ@gg;ZFrf7mMxK| zq-kZog1EKBeccn*VvqVy3uHLN^+C)Ba87h~1^ZP<6A&)g_QHD>dY44pOL)E>g-xum zNNYOm$d}0^w!_1dn82F43t4*fUofl7rA*e5*yr958ycfB>8$ZzxldPsJkjInmRb(F zb*z45Ij`g>Lk~IMBU~Cu)Sy#BEOJU-9|-TB*~9t!|GDxy9$>q&^NPVPt8G%32#pl&*exHTYHh|bLdkFBb zP|96&L9Gh%=`Nkszbe5p=LODYJ)ha*Vqe2soDboq-sy6J<11_Aeus?Rso2m8Qm!IJFLzvCM&_+D%95(xzCM5I z|CE>6uYc0guO^1PxjG}3=l^}jqxOWS41VpR7w>FH;+;r^)egI@6{F6_gaaCup(#Kx zOx|N9XI~#Sd6S)eq8$B}8fD6qcXnA<&Z>D;&{L!@0k0CyJ$E@{@yOV*{FYu+xggC^ zL{-d%ob5s#D`!VX*LFPFPKBDFzW7pT2AkY`5<@8yZnAaZy%B2v+_g-A_H& zVL4QP(#vV%NVM(QUAerXZJ=eszNmBCN*%kTyf))E(vE&wl8(X ziQi&3AEc1QW8IEHHKHNZ#xEg#ho-L=+`2POCi1O5(bQ}vuV=n%iuvA|L{WMpq17gjAo-r1PabATB+Rr86Jr3 z3l-ylx|QwY=WWe?Q1qJ<)(g=V?HRe@vg1%(C`ziEO$6MI1lb35j; zld0N3weGNT$jB`6&6#xzbOr+_kC>nl!V# zSFR}(M#5KopX^uN}5SRzhK))s!bn{fB?pu6RYg!18fLfx z&KC73`WF?1lY4uC1gj!eXKdz60prf%0|P|7WsHre!>c9;q=~}yajn1hK>ePF)6#b~ zecQ+zSCgcAJE`XgUc4d;)EGl$@mLmq_fVeko>0Z;sbsVOpnOZ*u8_V(ZQ;-lp5MR@ zH{<1Y1HyQHtD=LJoUuX87)Mu={m}UM=H<%;pCg{F|E9$$e<2HXYJfyveKrMEEKH52 zpfF{I2HRE{FlBz!s4`Jsd-t!;O({#yprd!-n>f>N8Qwu@4ps-_qZvy0nv~(!%;G3H z_eE(tx~S>cS7LltIeYUE;A%ac0S6JU ztJTC|2%h>HIaVhbu#+-$b=6ICvM5lezeKluN$yJx!Se~LuXI8 zYG?1tBx{B{CL{m-(^vBaJ0*sLonjZV zN%0D2EIxeqUm&g@s1={m@8Wk1)MTq3qo^Ksx(&)u;VwO;lGLe5xBP7fFMRUo&k(*W zxkgy^1#wV-;tm}VKdZpi)dZX~4Y7sp>1G*bR=B(n1M$OD$DlUC3_Yo5*I-Vo39=wY zo|ga@oDY_?UZ7DSGyf++vf6Y44JZdrNtUb$1x&sryAx+=+*F(FpUs6RUckBO#PyGx zrA?w+Iotmgvd3Z^{meeIQ#m-4O)9(j z2KVBZ5M>2ylJJFR!-$ESx#wzHNy(q-qZ%_Udm3DNqkSmS0(@PF&{;0L-&iQHdWu?^ zLX%v#rYKaJ9jLE78)1gYD-|i`y=zCOHa!)M29-x$DZd5lWshBQLCnj-u})p};W$RA zRDzd+3T#6Vz}PiI8Da$0J+w@0Zxh5KYtKUo7C=}c}sP6TC@5@1GDR@JvxO@W&5YRa}xc#@RccR>&lf z-+0USl>Icr z?LCY$CLj#W`>$3!s>;8#Q@j~+;s_sIK!ZwOIEVfHYYb+Gqf}U1!2eL) zr;0I+kr+A^Pzl->OmtWDG8~zl2gym0?RPD#;Cgn_yYsU<<%H820m4GvMpIFbkW$bp z?W}$%<>(bFi{634=a9|$k=gaaKxdNVMH>0Dev25`FPWL{orG9ON@675fE04F(ETxE z1Q3GY61#)+XNK`tI8t?*sYpPJ%k1PTBjVat7rGu9OzFbvi_OLZgyQmw)xNqFCRh39 z+ggbbDwRuejOl>mX?Q17L8f$Y8XOLDiG$-Gh0R|ym+~4RJ%zO<6^0tMnBt+ZM%3$2 z=VCW?{5L?Z)op^ZIK`;S>!u1Mx4xz@VN7KD>;C^zo20?;u)y@i12}*U@^`~?D$4vI zf6i%D@$CRaxs%ovLKWWt%hLB7yOUw+*k}@^{i!qcB!ZK*wd4D!0h2 zgp_W8N2YqADEv=B*^chP0!%N|UrQaM&RqKZt7M|x9Ve6+BAOJ6%ytOB!9f>X#>v^!jIjfA6Pf>{! z+%b`J1x8TXfU)uDXw)3J6i!(L<7%{XA;#j;o^3ZM`TSW9$4Ai($pq6L1i(omnp-nt zIY1=KMvTsu^`QltsXMR)XGs_Qn%0?`5*h7udW>4ZTU!>b#+Nn9Sjl{~*cps3DAUe& zKtLk5j@<^opTkXUrnh-EWoa!3+Di=6;BnErFG)AxRWC+&L(KNu`vz}-pFYwFnJ3)s z-0hl?!iL(?7f0&>4S?VAW<@MExJn(F{9J*^LacXGe(4=0oH6&q!&evny>7EX15#fe za;cbic2!FnDE!rg0N#H`?4Kgq(?>tkpUd=YAjIl)-wy)Gv(5!JLHIKt1r8n*TFntp z8n{SamQY=X%aPLH$>~K=0(LnTr>-&Bc=S_h#9xHA8JU~C$Hwzlh<3QR(|O*9O4;T_ zXOWBA7J_HFG2td#c$7>m2sGdQZd5%UxDUlr0Wo#?I~o2XG>_4o&tlw7)qi?JePteD zF1N!Nf=`ts@KG@dpOsPzM?UW3JVPL!-yTVBga_~uR5Nk6FTJ{)Xv35t7_JT4%~S7B z4C=&+i47?@ApM#@bR<|qC(WTlUALuXu`=J#-rEQHp;CHvPRsn%i;X z1(%k9qa9ByOQxfS`7V*6$tcMz<}N4wsFzA3dF3}=c-KY6C>t0r%?4(f{%&;(E&}B< zI(RHG0pMTySZT8kfnI-`4P;t|{JeCYxJ0|@mCcj%m4`VPhqHPih-YMz5ftUHTtc8cFNPB%yVeD7hKbw@-{Ect! zzo`)4%p^j-YXu||us^5D0h*HQBvOFan41j=m(xRSH}Gr*o@J)8)yNk;Ol|l zZ!&3VSK0Fh2{eeT>ysw$^&0X3M@ zW`jE|mO;~+29z#?03bSl2$+J0>1$G;0nC0g^u-KrV_L5AC=7yryou^_f))KRxc)zDyaA8{Kio-2VL`?8ml*^Q~KT;Q4UPCiDJ<_T&= zc34nq4QvOkr( zi08`F*lnvb|FGGS?|1A>Yr>WOEM>|-=B}xB5zf|pln$Vn7@8h4<-23H#nBep{SZr5 zAB|FD5bg=1b>$zAs2rDvxdbm*&!C7_fMe%x zYSlE}s+)S)~x#}7R?x4@Up8iy{6FNhO6VX4S)BhXYDZJ`Uh=c>*ZHqC zlYw6LQLJi16Abp+b_BACEcHO^Mq9MNp@$I@*Y~4DN$yVtEY~Nr8E(?co5dBhxTpfr zhQW@{#KMjmoU0-pTDzg$SQe{mWmZHXO2rZk`?R*)?7OzCvnxY6GkU9xj+q@3nY#a) zl%cIdnU@!ZIKTPVS8&@!G}{^+8l4n7d6v~xw<#?#{MyNDOFUs3Chs>|A(RXQST$hu zRI9yXg&fCq-(TxkY#v#08Y9xU&RZ~M$DpPA18k9v;@9H|O$-_WX@(|xGleos>ojMt z3^iS!Hft9CPM*Z9behfn&>^6t_y4BR!Wn5RB?O!P}G2y%m=4K8_yQJJ$9rxn9S{ zVdW20#)S(&z6Pi%!ZvSyF10ky*|S=yt0CtDon6L2oRKmx#@-0cPUXG2UG?XP242Ev zo;(U~nz&ZXWXxj{X2}lilR)@}uC(GXZjAlCd zu;wB3_CfG75v8z8?$e6@AI{8PJucT_^hxETGo0>^VElKpLbzJqSh;>*(IO>4RYJA2 zTU|+7;1)b>L66522NF5s8i1WP!sr)?QYum<0y3jkYkS@mhrnNr|OS6 zjbP==+_9#vA6Suo&;HNv)TxA8|Msl3`xn5YR~-OmRJk|rCN;PoaGbg~-_5j$bTAf# zY1ljt3o;=VyinJ8dwWjJn5x&$?K9AoM_J2Zi??T+0!OfOO#SM^Elg9n6}caE#gJ5w z)4Cj<>{vA;F~&^%fuI2yix}+kp_~dJNxK39u&JgE%Xxy(6PVt>DdVU#jcqg=g&i43 zrQ?{699#sXi9Bof-*`Ikn7kB8U#NX98C+&%`YRZ~eqNSl*=xwwhuEW9k%^z<)9E(sOr2k?a5u0J0;O64)%pVEcC$Pye zP7>)+UiOiA%}{}^CulDZI`WgcJgrqms%BRVN3CCp2l&K_I{cUukhMicI{2)x zVKY*hoN7Cw%lW(7t-s+Jto&$IhG0;ml&y|pF`86uS_M}9+63#pMib@s078d$w_5U* zANh3l196BtC!Jc#E598g8njqHNI?kAcB4LVe zbT4&K5YT@{P(|~N0|pF)6ihUzd3Vxd5f?PIr^^Sz3Ki5_N@b<++#68l!$|Fqi?~-F zUYkg5IVIm%%{7dZni;BXlYk40Q<>lc-O&LpY%?}g0-)dXqEv+My z5@PoyzZEvC<>-&^X4xLm^M!%tEw9c?YP=d=0yxl<(SP}WJ4Man9z?NMFt>}0n8N}z z7DrSQ2ed(`kinNDcqtU(Rg~`)?u);>Vq5lb{YA3WiJ$2@ROy*Z75*Ymu9xEBWK~6d zp>MIs!vu*M&8ST?s%DipH$nOiVeS?nqw8%J=x~xR@41}~{651y^#lvG=T}Jbu&$h* zv^JZ0oHe~6lI!Q3Mpl;9z3!ftF>ZRWWEOT&89=ZfoqbjcOEIFr(S#+27gz8or?mH5 zpgHLxkSDvYeK!?6=vq-4X>fqJ zp=YN?5_~!}0?hlVI^D8PIFvVl9v=_@$SYFCwwH$eTw|d)U{z2Pz!B2w2pG;8s21CZiQc=4;)$qA^pVt*nC93;XJ3n*^_%5`*CK^in z$aZ|ayQB1UK))5g#{A^-LZ1wXH82iaXXOnmlSbpT5s<2FK%wSbyspG1aCw{1(r=8x z5ue<=N4{s1w1bNN*}v$&dg`)+1?oaTukqVOrxO`?K2^Lis9bpLcOJZjjT<4#q|Un# z^$fC9)g3X(8)?VD{G-ybPw=<%a1h~Evc>vUL1!o;fr zo<1w=(@Z`MTO@2;U`BnF4!!xYKoO9l55F5GCNVJ&={=DGlke3g4hNZ;%Ue4EMU~$_ zH6`y`3E>*ZIpD+H_@)CdtcBB5KX4+Q*HjC*z!i{H^son$ja1#RL2wk<2r*9qR_L#z zXLP|bbRO+?SF3Xvpld2<^ryB>`@YHik2{+1$+Z#=$J9#xb5{U?`O0xhz7^`)z_Zbl zw02PK_UNHFkub`i1H+<}5?0fhZ}$9Zm>r)DOx$TQ9is^hPfpgdFNsq(>M+n08DvoJ zBycg2ya3{T4OKlV+Wp9AEAl|AdGAK;NBk|E@z$WMNdbG}X^u}hF>JIEA>7Ck zy*0g4lcKxSQclavy!C%PC}37Uui67muBZioM2lSE8mo*`pI5?$5N&Dki}DnXzAEls zVJDb>D|b0u_k+2aOiUad6(~(&G&~@lUvk)2S&8OZE9Q zpO@#BgR#L&I;A=OXkCp@UOve&)Ttbe<+)kb7>%}hG3rC=K?nG<vjRllD^a)x_&qW=4i^9DbZNJE=edXO=-{_yCn4;9RkjpIQ2v6@5`sd02_POgGey;*a|7TSv;( zRf1#mrC6j%qYy5W_uO*I<#L9GK&B6Snpi?6A4I5Rc5;t@8Ad4R&*3M>53hi1jv#2P z^(?Rgj;z5yG9n7QtLHpIL^D2N+}PDjlH#ShqSQp&%}n>u(2T~a)}+ZM6ik>jK#VmP zg+!5f2WYH_jvxf-C>bMV*c>Dm{3&-G?tEE?1EGDl|2do5S2^+MiP)iQ!ZZl%e`WDfPsI-wD$$&TEg%S`}a`Aj3gblFdPvarNvx`UY8hmFDmX>sr*c{Zi}w>mdLm0pOjQJQMq+p$}Ys}m7$hcJS6 z&`+>u-ZS;G)N;=aRU%E*Sk&w4Lj_MU+kjcoJIO8KLEA4oBmeBTOp&O`z^4p{q4&e1s>!#im+oD8s{K!Se^@gnY7YJa46Q&IN)hth@ z`!ppCAi}PS`5~XVD`E*-bq+$t_mCG(E*~#DkY=N}T}JDkURY2XDS^+U$X7L*R?zY~ zc6GGnqq+$7n%{g~NAiyd6@|9HXEjpfZc605qGKoVtl}wUhlJ zOeYSwaKNDuQ4+Pa-Hz}(68d#Qr$p*uBVG1q>k?gq_IB3pvP{=D$nIa2nI93$@su&1 zJW<&&^lVyP4UP37`3wBYK)(`DqJi7??evFWRmCIw$a1M*H#JAvbRzRiutbp2CMg-a z*0w_eteEY7`2`05OQ}~ZlJN{)(0KY z>X^Cs>Bu2Ay%>$n(AHmnrSYh1n!sCY9(`i}vaZG--MZm%-guu8DS5Uin-}B31+;;7 z`ELE0%u$munlw0@{PZprC)+U=yoAhl0jnS!PnS7rE=|O*%<^nH8meTA08pSQCC5?P zDs==VybFH`A%wbTa@>b%jXiUUJ0##7%pWyBPI7n>fi$d-Q?_&tZtNhp_Jv@BwE}k?S#tnXmiIU?wHrdSpF+_$N3NMYPJZ?AQ6&ugPw8SSdE?9}`1z#6^F!5t~ zhZ31~2cYfo#cQclxEA*WS_fVX7ipc|iCCf0l#|`N>GULtVp!#60kWx4GK@Hw&ixSv zi6(nv0!tTvk2uTad@0sQQea8%ht10C4L7sxArhE&tZ~jKTLtmfI>2b!0aoedFnF@I zh(5c`dOeR?Gw$eUuwlHqsZHs15>Q)$0gm&TZK~fFusZA6dD^V3~j&9Bo2z7CkPK z2s%PY%KKX=1`LTnPI?Z$Y)NBFN~1Ol!#QC?=v2|KsVhzD{87UE^Pu58ZulM3RlN3_ z2&0V%lLvITyz~=q!d$b9Lt8)B|97Rh8)6S;m#`KiZ}w4>!&Fv9OcJd z8i$#v1#d>ak?V$VmaBiiPCBVKqURB^pU%N^m|{@aMnn_;0})k5ZBDY{F`kLqCXT>o zGASU==j>Tb*^WH=!QNUcGul}S&)<)w$kzlanTTuq4E;T5iZn?yjVm<=X`hWNYp6+3 zz_O%>j5FE^CgJvulFIHL$pWj_d(z-u}(N!iYF*<83 zK5If*Y;*Oz@D@2Y_3!rcDE2*!EP~Au+bv$rp3dM4+X~@b+?d0FK%(O_v3hf_(xqvz z*Dr$6ewR>pY^!a6)UfZ7kM@~0ij*!65zlY!4oze-_g1-%#dC#}ZgNMl>s@}Ph7``* z2jOzd1hO~^3k?OEoNT)QXR%wt3+pxY4I5l8QSFd0D(=${g}`Mk^^iw#uYV zAdkfLV|RR7^jN~9y&o1q*2xs8Rh?7?@QMqZ%gM#pWUk@&vTV72(RCzpdtH2{eWlaC zW3j<+c#PMQC{QeOVc|+xRq#WSTnM)xWX?zx@Ce1=bh~QA32JIqzKX0j`zSriB9Ivc zG6B5)k$Mq!@wa|jfUHyS0gLFF?>(ihEe!v#VRLRksLFR_wCaCiRJ|#!UH2n zxOiTnMfkTb-%{o&gU0ZDg_H^!C%O(ZjT1MlZfC@etUi6#cB~ZR@{Owuy>i5;FwaMh zb7PHRpCK(b<6GtOjNL0j*1@D>>st&WWb~thVzT5puZN5ct}$s|rpi7VQhl3i9!_Kj z`k2X&WpVr5%cnaoU3K`@Mv(jpjfwXDX6Qm{3MnSyEODP{AM`giktO3C1SC>*Y?d{# z&?rY@X{Z}bwDgByK^KLmp-iec%kockUJVg+wJb|f37)Pynxw94O`zi#VNZVqo$aWn zXZX`aE(6zR?}|Lq0TD05M`k$Os|T!B0Wil+*UlP2J_!JP;6eG;=ARGB0Fj;-CE)8u z-R~s+$7W&D3ZaU2p0q&9?Uxoi%n=s?D@c^MhWK4b3s^5F{uo#ZYwiNO0TDM`%9US;1-f`u@mF7&M5Lr8w+VjQ%jaX$+wIiqHo{Un z;{!DD1l4Ebf!p4sl#q>}9Y1SHRGB2GE(R1LB%=&1aS3{%JRy6`WEj>tfjt#YP8&Qu zwwX01c?ru3{%qMoL?jLR`>nP^S}Kgei5lAq$P%MScy7XdA2{T)oi=692~o130c;ng z^pmX$+($+F2C6blz18L5nLJkU7eH9uz^^QQ&3BX5F`;JXj;1~qWMKZJ6WEEWuJgt;QCH0&PbteY=s+k%UU3NRP?0ZhX@m(RES_F|rgP$ejUiJCQi;!z2u)O2nMywxIWs+wy@oz-(nyiQK^*c{%&M{`&ovl;{OBQ)f2O;s>k z92&|Waxy!g>o&9?q5=@F198Bh;a%A80HtCtukp|60$80nRKZUZo;)pRi8j|a$}0>q zXtjK#bT84#K&$^VzsK=u)$b++@E}Y0-c@Suvyg!NtEDQ}x9)uRL2&{)oxom}_mE~2 z!C)>wOmWEsjA%DnKD%AFNC;3YJhG8%HLie(#jn%)(hr17H7<>x$=Z5-BDn-Ixz7d+ zjexl$jEKf~zq1;NOGLdHTE}RXovoBlZfF7;|DQn`(AF1BN~R3d|1*M^Y;~YA0~{xD z|QN@o`jS+|7oL4z4iFo^3cO<#D= z#shID1gw2-!5VGyDi5qThThWM;EI@Bt$`!qgY(Mcgb6ZM1% zz9Am&FU!;`3^P9FT zy;oid_RF8p{;op;Ys75W5TZXmqz+*n%%$d1>|cF!D<#P;GKw0b8@cZO z{@)e-3lD`PDRKUTh420{@Kerjj_2ygdqR8ZuJQNi1xCvLSxTdEA$`x@BV+%tePIyD zzi-{mli&e_KO+L-6j+u()$iq zhRyHd6|81M{@}4Jjcw9E_22a!44q-C6m&)SMCLREua=J$LY*=5zgO)YiBEDcWd#JP z(LqZR9b%I$GBblUFkc$X!HQ6rqRqcM7GhT9xoJ1MiFSQn*ig~`4403$3FJo7bZlUG zOYU-Sq52kPGq1|6NytHC<#LoFx(9xecSe}Y^RQ$nd)8O)i<3&PjPjlgXEZy2B1|u| zyrh>?arif#4JtMKlL2Lw@YA~B;@|+B1uU*bRoyVT1BN=eXDd7M|64C?2|b7E2h=7`Ryc2xL31_j^6&bN?2 zf_ZKx9)XD?!$M~vRCpLBFYQ7CS&IGx3V;&U<)Z(fqh7ho|3l9Onzn%A z$>pAmF6JL;1N#Kdc^qRZ8mB_AxRz`f@^X;hCOWW^6gPCB@1Y!z&Wqo)qstVYV(6Xg zJy%2PIEBYZ%X?izG$IJr#Msjc5;AxcFpDh1B`YjSdSDIWty8&BaA62iuiRC~~2JfiAY_JYt1TZ0L zE|VT>Yp$0e@RQFbV3;B+;MXHQr&s`mhj*hnD@ocnV3F|yi=%f0_|d5M(LAjWidq-8 zCPY^^q93(&VWpz`r_wg@rC8SoUMfeluBC!Jn#P@D;H1zkk`dY6^V7w_^l&crb8k{( zRgIPtv)HR75Ne;JWW*DKt+;4i&HU}Nm$VsIf32qM)3S=n^>^Ii#^)Lf&Nn6A^YK1% z=dmbK5f~fK6_f8=tWMCb%(s4v$`jGZo=$*A)K|;Vn|&oi-IycW%;L&2Y0Py3%rtu{ zzyd@jY_WIy2r9y%S}#Im{|k|)5fXo*2% zuwI$(PTx=Hz=>D_RG|U&?*X}Gev&X4oJ2>FTU(Zd#nbYRQs#V}p%Z8OwnA9(>0hD8;ha?J{8m#i+fHCE%~*0#3$%P>G1& zZ5yZP(*XdNXle$E*(k~woMUmlkR=0)dRv(LnbSJ!Z**1!A)gF^`>$(HM1#QUp1T2@ z?mqs21cZBOQh2<|EUx%;U=N2RX2aYG5;g*xymnD=6Vk&8KK;CT-%sncNx?+4#le$y ztvA*wubTNA1~?Ka)b_LuS9R5!VSv*^&J+SWjfp!&z9`nYN+UNtotpXp`g1AR~@SYz_c-o&!C4Ho1@^d2+9 zMS(PQClJdIJB(+k(RWYbCK)n6uJ!oFdRFnG06{y3IYK*gIDjS=44zXCd2vX!s>?Fb zIj;7xwix-hh))|Q4GY7X5%`S$PW5zc)Li*Qo8a$#%r@C*26dTG-^T*0Kod&j4 z8nf%)1`masG_w#%uJ9nnUk25of2+1}K;C?LT)e)cnYANpr#o?dMN zLq3`lv1DKjN;O179OTp*$ zE6o`&u4}E@vOU7YcD_-%juu2zO?u4WZhr_K3vY?@&(coS4mwL=y1zLnm_1=~BA@ih zTtCm#?5F48Bobw!%&T+fVK^I*ehH=zFFzf8pecqkU)_sY3Mz%W~g1GJ62uL`>T+b)5_CL4` zpSvijN&-;ec}A)I-x*Q1#TallQ2UIFL<>#*At9K+WSIFzMdG=@-m=dieCtto0}9M~ zXw8rZxJWqVlP&O42HbJ=jKlgzoFhoU9uyV9L?D_U?PsD$jt$Z^X!zP&a6?tp`g#}s zhrp4S!4cnXR1;D+>W=uESDS;55qOQPAgHh09U@6E$0 zK7gL*{S!8P9%UPJ^HD7u2~Q8q?#S=?E|)GB4BtiuSL2IraH_K6a1Htkd7wN8zbI=> z@8OU3(@WF*O5*4;AxHO-60}g&x*3D$`oCEx+KN%QN-vLH zKM)S&OryFp*|^ECu)=;8emQ+Wguv zVt{`#z@$Pb?X@`rcavc6;!2HyE56vZGXrX#5_!k6zMDBxYCF3e7ljCZQ~h3O=e+X1 zHboizv;YJ?Y%@=jVCpTxUL7%T+MwR)#<~{oOF-;2jissO-VQ2+xu{Ab9PCR{Gm%HP z&(=B64Q|_?EA~6Djs+9O-T?~Ke=V5ax{seo*9$FvCpEMNeL61+BwmpNWAxWZjx7zF z>>v4$@gtXp#B!0EEZmzFJcJ0WXkwZ?IG%waB2!!pZX$)v z<5;S$GO+T15DHdAf?D%|4Q$nG20I0MF)|-thz7D*B!paj_xqiHgkW-Mj#jh73#1Vw^(SA-PK_5)^PV)LT}p7|czpa*xN%anu5Lot^O1I{L- zz&eMk1J^J}g4Iw>dx{LjJ1`|2_;q0X%N!>qtuv>8E7?UZH=WfUn6Wz~dI9D2cH*%y za`Eqz_WM*?8nQ9JMjC4Dm@}4&geyS7b~dDZ)znb^>;_}19D{*yT~@p>1eAWtORyE` z^;DJ#I~0zAAzDvjQe$@$TW0`x9ny-K)1$=@3R$Nc!H-A9h;;yL19#gTEUJ_2hM%{i zWKE`WFbivH*s44nZzkM&=H}EIZ%L4^;Gwi4t#bGfETcST)f6;8HbB@_5WbG=n*bXL zvylzcnB!!r5ql>0At0}x+uyPFU0~r=tFg+WjMfjU~l??wjlCx2XVJ^Q4w$}l#aN<19;c+ z4Lj{cJ6VkX5r7Y!ZJ!?J0%3KkLnf}ugV+UKeDh*b7$G7NTQmxkEcTyFL$ZwlpH(yHap#jfs^ua1$$1LS0O7g z;~x{HwB?Xv$d(PZ6UOHEm03k05d~<{8f))R8@J(!7izgkcDc4WXj>l9+AVPxOxn!- zfX=N+v#KU@*RR;0QGBJvd- zwhy_4J@kb~jXP~a5U zZgr?;;V-{3Lcol)XLSF#D?gO;>D^NZm0KIE_Knt?HoZHaDhN_lOm^;0ahu{7*dTJ~ zkjbQp=QXKgKE-ii+eWo+wn010^O!Q2SGGWVttsF2!kFK)tT;M(GG-eIDvM=$pij0? zrWA@*h1r){@B9iG_G2ZuutbMLEpNscVqXnXc1rtBEOzHyx?{_2SQmdXEiNsPMB&CE zJ-`Y9R8}S*!^*4R?z^B%&e~l6T~1Zwn571o=%Mh*Mo994b6{&Bi21vL%FB_cClUuz_=b@X2^@2KEIsI@kcuEFN;ck~atnp;cv z4CSwxfUD@VVoZi-%}sh)zcZ~8-W3`%fU71JKsPOi2f*u7>3WgU-|Dw&Bz9->M?XW` z_VB{;ON5ZV%#gaHdzv%_LN$9mHCQhQhOxg0J+ud&0?2%P*dY_UW+5W&WYRLBwMTnj zAu;9&EncI2C?&0f5XIM z8q&TT(1k2#HHL%uRRI4*Eb2a)>1H;)=FEXfArd(VOk+n@Uj0hbVV^Us*GS|1p7V9y46gG^ zCwezO3sI(W6rf4)Qfdd-4~f*cJ&jFi)va`&kj4kKSGit!?3MY77ZY43@2#7BLDhSW z%mXAo8?}f9EM(q)u9|E5!8+H`48FVw;~HBl>z~@!oZ~R#!qgj#;-l`P;)IA`0E_5> zf13n7bS#S;x`fe1n*Kk?2TA6 zB{tf=@@i^w?ZZ1_!gJL}kYF!EO5n~rou~RT#w}O~Gb3LBWuS-0m`*m(m`=2Li#|$* z%cMvI)0jl6dlkXda%bW#5EQR>jjAwd!6pLyU-vhk|3E;Wlw84>js6%DNa-SiNso9LK zXp_v?lBj>L>-%WEsg+Fo}3NoZ$dnoQNQyVsCU| zHV6OFKhd{_Xuoo=ImIA_jnQ=2eG6e#4TxD&@ofO#wME!C_*xOO1No7N@kv(Qr_C?S zOkN8fc`Rwa5cv3eG3+t=%Q9mLRk0%&Kb^w^L@k&B4I`wsL(0Qx{}zpLT!8cQ&TogS ziq_i*nM0f%9Z~)K%0alD+scM}X*`Z{E>=_cb8GuIkqKB*&3|hRmK;=tf<3|kYqZo) zEE-SGoRGb=lluD!RH zR#&RY`q49rt#zh7s3wLpcm179VM26A=D5N`9$NKPX(0MP6EketvUyBMQqXM0#+@Xk z*DR`QeS8OmV4%18p}amFN}qxmmiTlQSn)7rE)MBx)gmfz1d)WVLS6b#b;J4pg8#9V zFVzz2EI>GP8~QOm=cwfJ|DOPJ2gH$@UTl!NDgz-_rAC@Z36P}H^mm4h4MQk9`Z`Ac zoPf73Xy`Gf1Gm7g|Dcn1TOI$rW2f`Yy{a)-2PSOm7@fY12+5xdW>Fcjo8|CCUkXMr zFPZ*-B5}B$U1Hj*$ciNkgB`*237T0TU;!ab6v7+&;xjJ}a{X}$6RMWw{{1nYa(8Y& z`l|FrX2Nh}IMnWolE=vq{oXVODfZ6qS?!tbfUOt0wI;aI5}HVSv2HHOXjSa`HCeyX z2nkM2CJHw7nnkP`&S6N+e0rl$qW!_Uidp@pHLJiAtHs|5T2*k6#$7{lOOL;dM&KV9 zX{+U6D89cYdxcAH`E*S|wI578bU%dHTO5UZ%n zFag>Ee+Pmnta2CcMw$^phQZA55B4|O0XPhVdWvEL_P$IrG&1wY!5&QZ<9CDx02$1s zk@I%~E7fqiIBm(z9ZYFwY+QSbG~xU)oDE+q#wod6hO>IxXzNhwt_y26yE$9SHA2jsf(=*>81uA zC{(n)x%}sQ1WsSP$=tUvzWE;#pbnJ!u!-k78;>)_FxY}x0RxtTvM)-|Q3TwMvBY#e zm?@GwmQoY$O~*RbOrcZB?-gLQ2~Y9(#pB?!5YFzaix1 z($S@W8WjghpNLLxeV<1jhf=F6OT0Tq^1nn7N$_jbWK~$OCo~9EGXD5}i^8CAjBqKT zdqfXM;^%j66rXosG&I2fh$mnPk-;kZ5x#-5>5ft&zL0&PVPbVo5~dIP%f{DPrV?Z4mY! zKX5@enWwUK)w;sQiYZ{Zy?u-;uQzSJBhI~WU;ADGWrTu*^LHtg<7AKx?!fJbhnLv=3E@*EagaH_57L(O{S6mt1f62GY*xp% zmH~fY+5d?h1qt9p(5L1*Y6QI20%D)?A&O+bX6g8RPMgvlnB5&>y*9q{5+yyz+Ursg zFo}+jm(Px;L}y#eSh?G>fBmr1N!nXgF>I zfZQ^k3=w!sWYh%KR)0D@7113H!rN1p3VzI`Nl!RNnQH@@?aJ@@8NSUbTI@NK@Y%=} zJf2i=9Z((6murA<%$lNaO@5sOMDnwR<*yYe%3~)dJ_mtcyEgOAREcTARqveq*7ah? zfavCyXw;|IP~KG6xbWl-4P$y0)+o=!IgsF%zzu#N=g8b^2KqAb$h7dvKk_DXHngBX zl1Vtyfa(cj>yq5}_j9*Y7hCu9QE zrO~4(fVTfcD+z=PMgjhKUDISwhahLW#q$r{3T6ToWfyG@VW-NQ*zrzSjH5Vi&Mqoy zLsk4~833#QRoRKhqvMV6n)}$B zT};CtdI?%sV@J#arN92WXO-l5&vAb`5_YACUskIZ@MRxs%vsL$F=?-iPYsQvM(Ido z{O-7cA15ckRlK`)kS+ZE<~+`A-Pxs;Jm(m{=8(%mH8r;~o;T*H3+bfILa3pRurEye zWV~wpi*DaVVsh1&@aH6eG0s+;HxKr{l~1X+u;T&}n`r*I?i(A3m%>nb$ReF_V4v@z zPisD@(-luh4kZAqV#h(`KzV9~0@;e{HS&X@{oXf8uoUf$s#wCj;8eQPJ%&vD#zuQG z_-`n)mB=pxZO8{1-eBnsO|HRkY`)N%=1_zF1#r8EA|mH1`2DNYLQ;U6SZqu3l-uXy zX$^Q5*)#cjT$^?-)A&%@+)R(gxrvf~Z8I(qTmL5Z-v$quo(Q}THCY{>U@852k@I`N z!r=MqiXz?9s#QY5Au&UxI)KH0tL{dc+U?4hgf^+&y=`=!A1=cT_F37ao}Rzb5VhMurSUXv_^xN{f{N1(5&Y8S#*@Lrno>xsis1F_gE|HuZOjLQ&s{2EVy`&ErF8k{ zuSqr*qY&x~F!$(gR6hjs8PGq}DSmFj3=WVJ*4Yv>Y6URIFR~#PK0-8f{77S~ZwA)P zW45t?DJZze5tX+i7>q3*4=#6EF@CJDR^?@DmxqD)aY}3*@xZ*CD;mLh?PR!Kk3?ic zD$|yo@*B+&mri?(AhGxrUT1ICrOzTtLqr`>+rUdLkpqVt2ytD9_o?F&ql&^S6N_nK+*MbBlOmAe zGHBmT0jY+~ND8HVHlVui#3TZ$vobzm8el;t5GE3wtmq6&7~#`#!E;yr67Ur+MReu& z@Uaz+)!>0uK|*=QEmDF8|6IsyRkBi=Y&wo66d70sthATepV$^Eyyonvqm3s%6E@ZA z#~O!?kGsOxvv~eY|FtbSp)3T+*Ij||CDsHh(#f{#jCURTah?oipDWH{xC%4$O zwHPf=_yj4tc!dEf1W6=d1sEZ*UIE9)2lKR}J}2?42}L1d!HE74ypg>ro&?`yiXD<2 z_sE$O*MqGR#D1}|`3n>7$U#Qxxux>POp_`FQ+N{_k}82v@7pVfXo0(pP*WM}^JcfY zpLXXXkxhTJ1g)il+!7JY?iw_fO~s@1PQmsJP;{kX<+cysrkvFaeShC*&R46a$|)%1 zHrDoMQ6Umf<=>0}g-|CS2PGz#q9M`y6alm<-f>Yi&$}j3tBxT)xivSb;AmIA49T2x zG?Pl?e3!kwG$%KeXs4p&h#BBUs8D1cnZb4oP4!t*XSOQ}rlmS!Wuk@tvRoHZc7Rks zttCI|2THl$cFJ)FHN<<5tYkhe-((q@CEU$TyY_`|i6gW15i#8tr^JF4njD_(=Ef1? zoB7K(axEnS8tNX@t}YkS@VhB$65j7}6dKJ+Y_okLm;#^irDxS%q$iK8;Vh}#z0 z$<(?xh&!`!FI)3hr0EriEgjg}8y7!4gP0U(v^zIb%fRG2_f9I^cnn4>&fhoSZE+Ep zPdJS8tqcC_5y%!@Z*KPw9`}{ZUN4})a%&`+M)Wr{yH24VO!RJ$I#AIBONfe6j9nyZ zP!GH-wotC9c3nL-zG*|Kn3>L1vhIKQJQxPZfI&`mhL43FGxaWO!K|l(lSX$Zolg=o z;eTo!;>o9UWCaW3vJhBRllRqk7^alGW@1v0Ja7PL!Lqa`g>y z9EyGpb)?R;wgrDEBvYL;L{J8DKVA}*2%!%r)E7g4b>1P!i<*yN zpUG4(HJWru z9M>&&-SU8NaD)YZV*Sv1mPPDTuJD%4c=inBf*E>_a5U_7N=MZ%Ykzl`_asKdxgwF? zr+jf$zsu~^6Rs63H^I=gMd&Jj-rUDZr*g7Cub-zdu;hJ!(e9lcZxQ)!Za$=gRM zbOR&k(FL3?*n>68eA|TV;xK3#6^;m`n6E5pMHZBgJBV-#rTD;mCP+s982iCG zhY=`aG=sc$aG~0aPZlkXhrZxzi4mnURT-lB&%}z z%gcT(A@|1Py<74OMmP_uNvds1-lWYz=k;`SS~);vq`w9_`NKqF^qlmmXeYOZK#8^) ztDW^|->@4;m-}i?fXL4^n-MDZ*}*H8IOvVXY2}S8SN?7?xEsK7AK3hMO?&B9{FwrR zkVyOIQ2dA{QSiFG=)~l_nyWYfL4aLW>s>jzqF(p4ZDEkA=Q-tS)q~#~*u8z~^b(6r zcqFLlJ#Q`$QFeWB z?RTX>us)6Q9w?V+fqtbKjuoWiSjGjVAwBJPY zyVEaovtTiL0=Mf4ko?XPC-ufH(Te~@K)Szay1)|}$w@()C2$XaXzRi46(@l|^o_q) z%aHI|_I+*(aQ_mkzv!(x>pfEC;bBR3!-)AyJ^!Fapvt9iMuKvx5T>5CnKh;pb80ru z0d1B)P7x_!TCkbKJ>Lq#fR|l?&!lr3XBaIP?3R^*n)eyCdLW`0tw#`I@@~rY5al(r zu>hedp}elj>|2~UkH~X$r?~;|Wy=_xd>yE?`e_Vr{r;o>E-n9&(=6oc!#|H~xL$qV zx%6rXNcEBAv@_Dw-9WVd3$%g7el1DyT&fyyoOjI+| zx{Qj=1JjFO9%QFVd$=vME}3oNtPLo9C!jc0QK#qeB*22_RSC0G=lvD!;ZAf`wKlb( zFXng%tl-mg(5thxU`6?LUiTkI{S^=0ECCLn8x-n)!nYpii^P)jSe;)PJS)=cz-B0n zH*u56jz_s_ZIv*ivYQ%&04T-7geb-~MJ(_|#x>2IQ{0+Uyuw;y_2FmyTN3l!YiMk! z&7AfPG~7w@+ES?iPg**nlZ~^1Z%i)QrnPL$>(-E(Q;l`f9^W2aQz6du_97tCoRcU_iI4UU-0H^aCbkc=8OvgOh!JRDQ)eAcY`f$}2$*5wTB0w230+ zofG=}E#FoWk@kIZMsRmi3Oad`NOVYd)%ATm?!&zXv4@f!7o<4SNXiX+DHZILi}*Eb zp;vwu*|JE6a&%DA2U;|^2u^&O|Af@416SGLon)Vf;Q6HPhVzzyyUOergm?y#j0NJp zH-l&yiz(sqTHu+hfkcKkyvvwdG{WFg&loEACAAn2$VI0iE=5sC`53R| z2inc0leTJ6wt}9&kiF8qyV|s&M+j$w!*-D^K%fz<8=X-|bDa#m7oZYq%ZeR-emAMr z?i<+2bq1qvj2OjMT)WMcbhCzzH1#cErW``gF7bh6!AF04RwL}_Qb#SC&Gvpp%;8ey z4Fe7{Xb*>>|5x^-FPlR~uh&+f*3ra(ig;(e2w~r{bcAa1Jp z--Z`4L)>}I>FIus(epu_G2H@Wnt)9E1@eKerZ z#5vZlU7z!az|>Df%iz&qW=W~|)to4Jelp>LlsmyuCOK+F^+A1YQ<+Bo-WiSoK&!O7 zX%bV2HW<|g(0}x5-z&8;CILp|1PxakdncSoZO>lXW{Kf{ZbU{>>wr3yK6_5b4aHjf zObFzbRT#;ZDfcDp-&i3Ha;MZ@CYFt3p!R?rFZ^t z|N0Clz!NM%-3_(FoD}3OnYHtJwV2bY3-=V%$P0iq050}@x-cuAv|ct6Za~HLNwwq> z)yggSXjiuB*JX?a^n$3trp^OIlEGDDuo0G3NDm2q;1aEDJn)-h#lZxR9E* z4cR}!h#hiX{(8PZm;w+zE3z^$I{HIhaH~Z=9G&g~ViJ8a^|BW(UuVN(t!^zX4-(dZ>t2mo!3XT#ei%7SkUbDYKVZ*fD}W=5lRTsY&x= ziC*+B(t0JsGqBwvG=t~O`Tke2?>F6ifel`NT_(r#wn>+CjNUIGa@if&y+|iy1-ro; zqn?RBM?~hA4*f?sn=vxX2mmNc+r#p`)esyC_lAgQV@%m@rgw75<&*YkV3>q9b9pEB z&-0v`8ea920~BN()xh017k@FBM10r?_moKoUR}$HyD+RO;fkRJY;Rd+DURiE}jDV_?xU5oZqJ+jj{M5Vvlxm|Q1uA1M>W%FbYcjoQztuWWMXBTiH&?UmM52|3`B?rl`cM5~ z3HvA|$ops8n{uI3xG@V2d5lePbr=lC@_4)S7`l&1yP-`3Y=y^ERnn*H_v&X(pHupd zlhElV7KR+Sg+%CP#mD~-P9x+>2he{%`g?jFcjC@pS*18kk3+VpD+tRkmkE0HGA3#z zuDVu=3VmEQUKP!*(DYSQ`G@LzclUMo#No}1jtA7fel0$=xwo%4BnY3qk7ea^#mUZz zXy|3awfHWt{E(2u*>IP!-CnOS#;K%pUPh!B>F}iMV)AQs=`0GX>K79?OzAC}etd*JT}P1_S+$3FOZrX`d)fW5=5&EuIr|IdqRk5VSiPB_z?d zK+GK5dgRc%Sc~SlS8qu4-jsm9B#REK2783Nw}Kqjkiw)KE4Cf1q&{K{IdQjn83`{F z`7iFHIk1h1(Lr+UDCo*K2M-P}(gTi)$kTe=#Bs~3Xd^*?%O>Rui<_B1m;HaWorx>L z0T#QM;?H7WY*{WvN^KYxy%!d*`GT=G*&59{#kvA^B4f%$55`Bj*PH=x4QeGCSscjN(~h#(n*xGgaQQj1<5+YNpRpTZ)K<} zb`U9vvEQgX@e^e`ez56+5}^Mi($a1El* z8m>kVp~K=gB06D02|%TBbA4x`Ejl1t$f$+I*$Qoy|C+`l<@RMP4o4P;W~hhKymxFs zxa!7dvE23S?vWX{Z2|BjksW^lN2(V9L^QDP(Fz-gqp@hP_{XqwoxgatAAlbcGm&OH zzfLc7Vb&ieQf?Z!S12i1Lg)jTM$W~2`>`Qg21dMl;+Jr^AMujz$gY`^<{vcP=!xqU z(~Jam(bdJp&TC}L(PIpP_c+XA?${|%^{4Z-?XAVTqz^SmAaG$EfjCqIKr@4u!C{>( zaBtUv@uomaPmwf*a6s9Baq3NGr$Bt6FLyLh;3{FDGLQ#&adC~c#Z=ZKi{w}k0z7{L z_7=NYh6LPfbFsR{szjDJ690!5)O9p6=5HdqaR<@&M0q)@V=A{(Qn7uRCg3Ir_TTi$ zxdhB>Ce?|4->O&X?yE{I!StWag5k-~aswINn^NGAX*6m3SiTU%C6q{*UOOZ@n$5YS zrR{K$1b$dr)S)}v87A$P%8Vi)B$>Z6g!=H}L- z4f^->jGx|$P*mdBRgU@@I0^F^u7Ozo>(2(?KYSEDyR3N&t#g2;C7csXxn zl#oqcGw+mxSxJo(mL8|f^`tQkOX0#}V@_8^uCzSc#LN;lxom6-nq%pW#>@s?0@~_x zm9klX#5c>ZS3l+YARixfYuL&4BoAptQ>Evmi5AO1r_sFh<{W|>zt(A@c%JQ8krY#w zwu{N+mQo>UpDj|^2yzI%C1&Lnr=Pn-$$HYlLAJN6-5zAu_LmpeDf(TshjGyQT)Tyci(l?<11!ewmP_|SKUNW^~o68XnN}b@o%EkutFT> zH6-C&*2RH0U=)Uat>5UjU00N6QY`7E-ObClQFM`YD7*J)ro0f*RfS1Z68jNbfyb-P z4tc)i+if4V%tFhj&zZBfr2CeeR)eTCo#8low7Co%HemV;h?4SUW1_U8M}PsH=RzHg zf6erb1<)3_t7`v%R3Q`kpnO^e3>9kQXZ`#+;uqlDchYdQl(29`Q>h~v5o^X--hm|n zHy>H&Cp!a-LWO7m5SA^+Weiq!Z!(aWg!0yNhtlO>TRN50Y?h^N#YJ#SY-aYhYtNOt zgw_ljdU7+RB;vL0?_WZD?Zt2jr&SktLuPtw@<1LVDPghsC~U8gt=IOb1*fvJkOddI z$M%0da9Nr-%rc==q|wYjw(s{EWa(B6K0*?P)G4jbekFshF!?!KiYgTQ z&?OS&qQy%i3;QR_sO*P2jg>HD1ge?%c6Z8aJaFM}mGOB;eW0HQJ3^sQW?c?s^vvT` z^>IU;R^4_~OZwU&?m>43`B=IXv{-}5NJLozDhDA_-r zRFYY-pzY4|>~UhLXq86W>iQU5kew7EL83%FZu`$yL-Ru`;1n@B{-)Q-k+m4Rofu`v znYYW`>4{)a)<2QiiAEASveK5t;u||o>bigAS;YnViZD5!c{Y_M=8vYV@=hGchNjJ> z%rwbDWWvjBDw6{v%fYSGg`m{C`-;g>EINz%(?3E$9Oe9ozJJ47N0O7u0uKtGJdADdTU@_%L&S$U zib#Guu;DvuObi7&qqp4Q<7+mQz{dj$x%ayiv$2hRr~N!xBHLpc<*3viDnrJ&_0vyv zQ2;n{NWMdao=9P>^%bv!xjWjBi&>@b{M`q2ln%-a%3`V+1R6EmBuo5cxr#skgr7L% zZW>zbT(L<$BI?C`ARfSs`vv98)!p=9?>K7?)FPCWy0xg5Z?fc25)!PF6KA@k5<_EP zjz)arkaIt$R-b}fEDK`IBEH?eD4F4bw71$e0I<)CD<^tO#!}KqWy=KD+4zgQg&8_; zRqKinq(X3j+XmjGg!N-8t4wA99Vu2hO5j0W`0nT~lzGAm{rw^-0SBa5Aqp<9)&`f- z;}))0rgmOyT9||+X)5K>ql8G~zbw=KzFOb;J8<*cL@Uxnqb898)o5Ill>jn@Y^IZ} zG5gNK1~gJf=Zk$_Gaj)fG9vcWVoTjz4IjixnWPiP+`opr{l$ zgPl+vkh%M&NxKSBa1P0I=#XIljCzd=IkB;CwlgzB#cenhhgkg>lL4$MubVD!M73Nf z+)To1$s|HsV~bX}H0|Or79#K?*j%OPSc>ZMiRSAannjAky=xyZV(H>G2+&*7O16@8 ztS)jUn?26#y>^lPz;&`ME&SCcES8%$VvMnu_}06F)GeLli8#wc4g;SeZ7br-#-sF# z*Aox%sx26w^=akfFL?ps>23|~r)YY$DDo8tw^Z6jgcD#=zK2nkPx_$i$Ke#27v6~% zP!Jo2>BDPQOB?wj84f$^BS+5YYKW;j9&u|VXHpV1PoLu~O4)2b5uuTh7bNP7S{%o5AGV+2r(^Y1(N8uqZauL~(# zkSEl5S{S;vz$_al*@#2=XbHFWTd7n^bq3(&Yww1xGo@Moo z_C(75Z@~PtI#KUON_58%0jcWj+)}uz!qx*>f0HL<+#|BIIK+h~hhVsW5c;a#sM$M* zuuLBL7kh-F{kEZ*WrH>rb(?+fBbDk({MTN#x51R$ItjenLV^8wJvH@&n1zF2pMpv) zf(m)PL5q6qymC6aD%TF2_?iJrho{UiobaXqV-Bjx{;x*u7BrBM|$^9kp7CD@6 zbRL#bW@&_(RX4P)z?uanhw))E$G% zRUI-Lu2^R&awp6}Tu$B`lk@14KwToH@WQ~@mi+LY=gD<%sLMw`$p5&aPq^H#9^?5u061k__kcbc&O>!O_3t&6J z3C09Xz0isopEr;$*5J%>m{?;4hpFN_Kpc6R6gs38<$O{9XO110n3iz>C z(s82cK8DhhrO^=Xv(cpvl)wX8-}17|c zOl9R}f6|R)DGbgIUU$B9jKQfK?SYU+vmKVpw9FR?_JyI0e!kQ8Y+jx06~V2N`}4%W zy{fhJ=Z+7=PIH=X&toQ87@w$P`Gm|bWnBxeNYF6=ZtU~M6 z;%hD%|8-;rUFTqDP&-Hv`$@ny4B4=ADwuB)B$*!d-CLc*{3@iV{? zQ&a-BEE%7DS}P#Fc4u=SgYZ8qcB}~Aq8Z`!*A|}4vtXMIKvqv*zyunqdz?!ZbcbHD zC?+Z0x~b-mS36aJ+L;q7RD2@Gu4nueaiA61ba!S70C-RpCA|_7t7I+mh!j##QYWc) zWMxrc%{eG#xAnDMD5Tr(wMOQ)>nN7qbUzrCN-9J_aCV1n0i|%DM10IFQE;X|36pK~ z&kNd8PsvJ12}@+uREwR_T?6q?I>Er8S=efKKLIocI@eWn<#ipKo^2&Ac_H5#y@zU? z&T5NV-g1Y9_B-9~87s?GKbDMF#v4pEqo0M_Rf2vzvH|>wX7l1?nvv~umvS`fmbFFv zEG_*jlflWLen`(ROk_Oj~0NWn>`2vw9YN?;pE$`zn(D;seM@9CvZ;e}tCo(Nn(g9DgP4s8GC6+OVtwFzNX z5Q>U3{T;;zo<5wvQz9ElEZnAn5;q_dH)Ihx%(B1Jx@rwWExj#WV;TH>@4VLOA$AWx z436M9iWZ^$v-UjTk)jcsXVqg7;>_?-Kvf&KhATO9Z~Nyye%5qLK%)Rzd;Fl5c_|%^ z_KC$l=FGB1=FyU05Fo^1nJxfq4D|N}FX_%DBpaFQsvaso z`9P=vpbb}z^BR%sPIJ@L9>ZQKneTW9Km36Jb&#eIdrx8$PXxvofw;qR{^+eJKvDh> ze}C!m{|jK}*4y^O?B#A3{34y~&B@jW2T|)kX&tcnEo?TF5$Fe$yAwTJBG8`=PvLpG z_DkvE0UBQrxQNp?=5+%~G#herTJUznY26=mUdCvC8Z9mMTE8w@Rpdy*0Yt5vB<(#i zYPv|F-DZ#t7(>L=fQlp<5X~Ap4dAOKH0%lFf*>`J3q2OhDUVin_d;fzxPE^;6=1wC zl89p%Fi&k(VjR$WrNdD9CY0(Y$Tp#KHXt$L_3HD?vEL zAx|To5q>dPwuvsVP=C&z){0W7JQrX54vvcz^)5SQQbGv}usBB-66<-0#ngr;qg)Qj zB%Qwat-L4wH>PG|nxYAYXox{kI4dcO{i^42^JKFn=i_G|JtUx^@|UA0dGyf0tJwOj z#DfYYeuRpy5EO@r^>abRP_VF4-rbaPyclI}hL|!UEXxYZRH`KMRHqOplUE91>w{%&l^T9m^F!TYfI zz!kIW!+z0A7Gqj9-CGllfh0F{<2l+l(^Ai=7c={W2}(YzSj&;kkkNZ9B0p8ddI< z@A{yQ>O$UC3fp5ET>Xly6V7qt#H*(O6I*akl6^LCQzQXq598Y3(9;D<5u7*gHOSZ$ zskvM71pjkJ1X(^M;>3sVEIQd=g#^%f(i#=8;qNEq3YySE6K_==TX5Iot;IyJjz%qSJ*JVeFfZ3fv*|r zO(a`3cQ^2o{)P;TLEeEvxUd+UvX?WpZCWxpeh(0bI1%dZyxU_qdb3RC4(&D-oe^Nn zXv?QqyQ|Q8bn+`on0w}ijV(^mXLgge3we@}iz;rBU$7p?llCu8LHr)`gPM6s@vKy( z3-webRO7??YB~-ul|O3Y6r5g;yEilqx&NU!e~uUGtMry6o(g%Y`Tf1S4B3j~cZUaP zOHogAOnkOuIQ^GjCjgzbMV~H0S{0$MAGf+ z{fdJMeUICMFRs}(_)%WoTJlxRDV4zPz_6}LeN-{LP7ZK>||9?3RZaf5WN$h0M0!y_>j@^ zv$+6w_V*p2NB~Wsg-_s6rdN>zcT25)x9Z;-Ju+ci_J#bq?=44S6GnQ2ZhB@(?>K=T zCl@_*f)?JTr3L0by*=ts^1khqgT`=v>bn~{C9+jo#q2_Kl_Ch;Yd}`v%(Dqvmu*0U z>VtAVB;wiCl>OkMkV(_0GQx15kl(rzsLd0}rr^xjvCZ5s6bOIe&&f(|rrvP;?Hj#8 zs&7uU$AkBLxFALBD5M|;b|M(t1kY0or23a73b*9xP=Ip{v_r%i$T~85JBfZ*B=)>p z*CQe}@)XhQ0f|mPO#T?K><@ZXn*bTN<<&L$Z7wl(w?gcyc|w#@Xi!pgIo#j#Wit?- zz_3Cr~pR%iYO-IzF>l|W3LAGC2I96|z!TH87tQHYwsVhFbzgm4)p z;2_3*o>DKmWIn_S_jpn~+E7AS32+wHl$!b!rp_ihORf$Q7`}u_=2JEjVB`&$EhWDc zLA!h?djNH-Cw1J^*Np&_P(ru}y7eYa(uTzYHM(fiCgJ)9vdzKVPEl}5i@sS8mUl6L z@qvnyKaSOJ(H=BTs3zUw-P{x|TgV~t=FrG6T{Pz1;mTdYEXpOi*GAz_ZqtTnKd!0- z28FGl(#u_{;UEjzd+UZ6-)IPdot|mBTrrx?u6P()g)PCQBt3IDc7vHCJUxU6m=Ogb zK(?MG_D_Kl*=R1;qv*Sd>Oml$FyTES{n?vSJA1ix#Ma+fyi?a~PD#-W>l>RJtMjaW zvmv~7?^b;4)oY>?`!d+|!VqH`(kT{oFN|%*jY&_R+Grg^Yh&L)39MpVaPRnMZJze< zzr~I(^@qSGc2woRyXTkGqGcKS#U>;#PNOu|9$MeKHT0P6GUi<{Gk5*T>i;RZOn_#>sHUS!u;n@7Q35wOBBz9sCahi}FIm9ruEm$y7F0$aAgGtON5qA~ z?%JYkqd<&hY`r?bcSDGWPW=d|GZDC<3KR<8=Z?JzRiS!>A^P*-txt%h4i|q8bU9%c z1siw}c^Mq4@gj{N5EsALf(iN5r~y?K^k^B*v04DeC9!V{w8blyvkxk@WxmvsRVPkr z|6S6+sOE`gmp+|o*Y-YHJqr_*2uWt~q2a<`g#xekh+3>P?D7t)4E^^cK`RY2LF&Lc zsLB&04s49e!xo7_GWq;+^U$|TkyRR8B3b4X^E?}MhlgX`#wUj%0bE&lUSXo99c&o( zk@U)&_qh$L2`h8oeXNL{H1#7fp>nns>K(&Wj{{?eR>KhI~R9A`zfEo9KHl?rQf zATg*13NauPQN`49#VB{$>0(Hs{~h5zZ&7i_vixe}-_ZoxbRu%&WxA%YA7v=;|CPon*$Vx zR?J@84Ar^pNMETfZ5RJ1CT=;t8xO{QjUtL&sS;qk>V_I9*6@mOB*u^NdW)QeLjD0< zMN_HHHiKrJw7V}=deA8NLv$;ikGWQO{RX8I*j-H%Fa9@RAkmi+Fe!`|CQtkuX?}k- zn#C?mWlRtrOzy9_%UN29m%nEwi6ziI>HtalDo|10bJ%K%A@G@?cJaQRo+F1tT$L4J zFe>QsoCYzDH>}j=?X6Z2km9qti+;DzfSlCH82sjj?waQg6GL^!AO2?_2aPYjx02sUtttoVIlup~)?)6P(WeAn4@e@46x$U~*$_xQIWT6#%+)nH zrV=&3P%2yn&6m;mi}E82Nx2-ceH2LP^Hzk(m5gc$&W~VG2X!UGH)YLTg7>$v!O?~e z&%VEpkNv6HAO{Txd-r)?=68*FQ)ED#l-}zd_%u%bCd9irL4ZJs@*hv=d)=(g+Dmi8 zrp-o(j7ht(k)YM=YH_Z~G1f2cM@-MGovKue0#EjM^~RkXC_pKqBYn|Lb8YM0X_YwB zh!q+w*DT8 z9^f$)pY6{!>w;69INtB0%SjO}t`8%;S*{TH1DEiVwi$`XM%`P#ZEfap#7$KQ;C4HFWqBla$hhe* zfb~;YeA!!!A;Cx`%mHX$};!eGcAdP8-eg9{AEQIAD2v?Lp#IpQPnO_W`KdWW)Cl z(se7-&7N;~hLR6ht-%kvMItlY`HtQ035;UI6%WbIijvxF|IOHNO^=K{OL}T0(6o^m zfoVeoR*;&w(G=R(EIXWym{cAEQWyrYHqo$(qPBv_UhRdQH8AR);kv|<%Cfic@V~5h z9CZqgNtw#IGD ztx8!z;#_<%+Gw>7eoe*OjVW8~-)_!`i*N8AC!|DLC0iTJQX!NS*Fb@t%Hc58N9E)% zWq&XRv2Ud2_e%A#a#|L*naXT`B7mi@v3xTSz;)51bY=Mw5M2XW#?A5CFJ0M>LVr#z zOKI&NO-l$yV0H!$%%#(Q_p64A^0gGK9wXq8Ldk7$}frQzaCcBZr48w}sSz#vV?jx3=x#PQ&WMd~d7B+17t0BLX7KP<Sj8T8Gz|gTzS~$9l;Wh|{5nH~^538UsX=>)@cS`wtlt*)^!$ zFmuh_{wO=uF`9Mh3Ro4pUNz+3aokZbb*yas3q^>Ca0xI;#67M+=1E*B#^c#L^{{$# zC|G*fntZqIbdcz48G&Rb(FGu8Mj=UJtVYe{`^}+>q*If&BVlufI*2;m@P}hEu&_bH zB3)eOb35BT!j)#EP7*+E6FCaDaYU5jjGlZ`vPvD9&=;Q-MV!x&PRi?{&16%5Tm=N4 zgAEabi+L%iou+dl$>wvNW?-8h(z3Dpt?3~|hB8diEP26@5{LU9ju)M(zJ5H8zo-?T z&}}{^b|DkW@K}JkySmiV@&Z}@a;TVc1O!YnM2Qg2i6HcilMxuJMBNtnda!Vcm%UWB zf^+-~adzW{R?ETyLF3Y>|JhsB&2Rj2)2cv3sUnxi$(a*KV>)-(A}ID2X?$o~=Q-Uf zb8oQ>{jt+x-^vyGmLy275X;@(C#Oc-cx2jjMLp+MJ8s~EHuoL*C9Y!%Axl5rM(W7c zs@EFs+IBMTeb_+Qt!&W`ftwGQagGt-)(47ST}n&*^t+Md^tTS zg(fBtLxeh|8-iIN72tr{fS(nFxGALf)FOZVzJ#Y8S>_AHf=hqWV5+-h-d}WC&$`!U z1n9TjDX+l})^jW@PVJjqTTE`iUhKKEf~QG6n#yW=!oh>1b{Z~_B@^#O3NDvoPu*2A;@oWb+NT8@1B*oV@hMpdliS4j31wq$4sg>p zI)Sme@vl0_A=gG5m%%UjqQT5k;I*{Fk;ejdVJ#pB6!TKIF>vA17K6nV0O+OXJE^rzBjZzxC0Rs-NXlBlSi2M)V&eF+$m`F%s_5c05bO1iH1 zF(@7fQ48?A#xc4mc5@KR4D)eI4iiK=l$I@)qSNiIVX--J~LqJgh4&w>QV zFThD);3l}OVd`H9sTy$nQEn*-Y`{}*0RHL=8ALRsibR|(cR%v z4Y$P`!p#h29CBEP*Z@T}{E$e+SJ%cq{2A3X#K9JBe9al=1)flV&x$12!J=5pDnK#qlrSZitDW~9eDu< z<)AcMFWZHRnWKaZ97-8fvz=xhyj=wX)>{-)kKy1O}kMRwi6Vco_&gng zWl;Z!K@uOz0ry(<)%Ji$(TI;wQM0-XrzO>^%dsx!holODSHjn}%V%_o0OgwzeUQdK zqbNz$MWptZrdJWA2O{bU^RSDifB&L2(YshF-alI`X6h@9f0#Z3b)jd$ z4XrD&rn$`_t#~Lm@PaEDFEH>cUlsBrO3^kyt)j!*%R<4pmNxOr(NP|p*sC?^n|O=v za*uzFiJB8;;yUhbOCJYKPL;8y6Q6@=<3Q%lC!GUL++qT(F*KJ1)~iW{3j@>w-oWjJ z1Zx6w^-7P1kxTAU>QiZX#RL@J!+EwEYIM$hC{Z_?d;M1?UHN(IAF7g-g;444*a`hv zByokArK;;52-eSnquO>aCefsq=Yh{X>0lB@VTJLh^}=7dHULwUHwZs``XqIs$kkS#pWCSj2_ zn$;bt7$`>PKz;~rYt_Ia)RqD-FN_?y(=(Mj=185MJP%eqVO1MVbX`kYD&D&h)Pqe- z$~L`s^_;J&&4gisYnwZOox}2er6#5bWXu(qc~GZnN;rCA9n>u|t2V}rh6@)m2J88| zpg!s38tz7!bbNp6i^*9iU-K+)dNEI8s+5Y0beXHj@)dXSQv`)2pBD( zrHh{~&rbb(|90dZFOiJfqawU@q22lKe4K8oPu8HJ5NLA4^D|-u^u?cD{`$^Lx=&yz z6KLKQ?w+VhyLbAn5KS?uM#9vy7jQY$*=W)NF!iztDnqhC405Dcx;>3CfJX~3Tr3s; zn0+dFYyzV)=7Cw>stk@>+y!wZi#31ApK?oKhctU>2)b@6>>gN_NBrOtLt1R1JgvC4 zSA(rN$rmplSBHy)m!FNZBucwty&Ap~>jupJ=)|=qHfiBHDAj7b1ID@E1k}nVWbi%t zaJ$VAo!IV>M?UAzxKUb96sFj{CI3tCS`7rZ8d&2`Qfub8x=WKnj^ zV{{5g*e-S9kP_1bvI#44?qr8B7^>>rW%x5n>1{K<|A{TtRq&yB3+9zCZrJl#c+7aZE|_ z#fa0h#tjnre2&6{yi77;hSs1UFCB~(Wje+*!U^CuWYVOiYu)^1GV}p80KlD3TpI<> zrh-x~kZARdWCj{vd1ssnnRrKxMlP}P*_WJJAvG>PWGo$; z)x-5&?kyu1mu{r69kSS}vOOovRbimB?gzTQdO?j0=d0ei~tTVe~?tedHOMq z!F&#=bJ?l*ajO___j}tmTsp=XUlPi%BI3__NS0s3ud- zsiRQrRr{Ptz#t6MiV;Oor zQWCDtDVc<0_#3F+YXWXg#?>9_*gasZ;kDvoj^JV7a-1I#-OPT;H*NA@3oa;wNg#|LFlZHb zy`o+GdelP$iGnMd?nO-_M>2hmNg|($h9vQ-`b$|&?*3ky0KXK3usTvUdm$pfnS1I? zGGKv7&2T88} zjKaB&jEnci&MULQPnu;8RI=Pu4oO`Zy7IgCpU;3-h>dF|=ndY%e$SF3d$_?COic8h zGbZ!!^Z;M}apNuj**`4=8=vQ`IA919s)FW8ONP0>dPl#ATu%Fkx*2Ij*f>L$akBYo zFOwZ5Dmx0%C(-8{Riv~nzUDb<)2YhzofVHbzBRPKT{eCw(bII?p_FzkOvB-&HQ=4Y zAqFjhPc!&aP4_pmNkzb$uYiWhVsIfoA}k@bLRo2U`PD`Co-u+5K1bTt)C5V;Q>wy$ zz}d$%F*r%4x9#q4mrq>;CT5W2NF4WpYEgjPCs!9nAEXNXk}Hh(7QVIa16!`od5K?& zss5`*<-_mbP@{?0y957wK%tZLtLe5s-L&q{ROyDLTB7hElQIL3UwP8 zZrmE$Q)1KFXkqn+%^HdONFg_giQwxCe7vXm13h@na=FVqVE3US;+}(NcOS`sv(pZC z=LpCy@a%EDCj))jTjldc^DZ2x9g7q^=eycVcbG85B0n5< zplP5!f9C}iyYrybgm!t%SYpjUF&eBg{+R<|vzSh&phgjUX}&XDi{>1XTP3coK5H}R zhZfgZ2p-pQV3G7MPrf;x+`7gHUUzg?3rZTUVh!1Xvo@iO5u{)*#suxFQcWURw4Wl(i<;5WZgEio1_VU#p!H;@ovJoz zosLSQH{as7kC{Fbcev5>PY2b_6CA-?G<(2F@!lOXatBx zzL&*f(vuLmeLIEtWl8e0d7YLl%Y9v`nWDC3MnRnaV_MY;c7U;9Oa5&f1esI|27PD<;U!t~xURFmscd%tni1 z`Q)yM9*&1Z{^4uVV7&i>Ew0$lawgPq`d=SpN42aPL$iqQ0GJatU!a-Z z|0Pt#60M75fZuw$4cKP=ta(-hM3Fv^TiB+m13!#y{!WESLPs?uP!Wwydy+(kfpMqT zDhw=N>FR7-Ee^K`0(9G9`dONS$x-IySOpJ8W&WNtQ(e|dkwj@26yB5QsDHDpF0Hmu z-Wq}rs7R*}5e2g$&9_B$u+lU{!Epx1{iBoVAhIEYE`Nd;l;c-^TC4e39vBcHHw-b4 zZ>Bnuz-t|ow!vVL1Kor2c9_0advRU>NAG*_zSFK5=hk6~`k7&}1)+M&bbqfT zwNQZr4Z&jp#W!+763_F{%Ds99jwX??5Mk2Kwji1`0{I32KVtzP7=Y@7(|I&@oB6q` zz#m4!R+=aAIkBlu(tH*c$!hl1JMAU1O1(sC`Pxbva)%Qh9*|dM?p>^=u%~gW?$3z)FtxiTOME@iTuu?P!oR~_c ztuA;hB#k@%oydI5=xua1GG8(YZM_C)TPSQKdsQ9Sadv&`Bl`9m<3Rx;#cN#ei8#}- zZENtfIT{L5wnVD*%XSgK3Uo~@e+VOS^Kw0M`45K~ec4#}l#MJ?tsu$;ec7@Wo)OFG zxrG1DbSo+n?D!cRC98q1>7iJ|PuTFlnT7D83$EySozM?s@!t@Ku+6UtmeQjv{?RHJ zQnHYRx}8z~ zIH9|ep;)9LgsES}0SvRYMlP(FLtoFFsJ{Y^c}I+v^ZAZy-;B-#T^GuBG1zMwn8uZp zU!G>GR=B4v24;_t;#YVe*&*~krJ&(elhpSs;IFpaDHyUdrC~X=>qCr@X@Q&Mk)p%< zuv`%CJ2PS_%$+DxSJ6^;WT=oi{4Cf}gUVtq!*&Rur&5^ER%7H!L-fKE@nwcyxTy?i zA?<^kSdQ@^;#nXL=?_1r4BLAHha2vQp^IauLRWVtf<&S#b?V-^B$h5WDXIu%#s`hE z&M2$=U|x>X=n<};VBL@3RwgcfXfBM;>sEUw=WhA<@K)Y0+Gh0EKnQyr%WV~C>@Qlu%bM)#n%RAm!X#q1o^$wBlD#T zLnE+1HthQTPC~j<7R!0|WMH2IXn6l_o{YI581N|Jiz!}ze8P<^Bx3H-Qm;p&6$DC^o66jC=&ix{`+kMbDy zW*!1Wh-caWNep7D)Hz^^8sAOz9S6(g-{l9^TyQX#!z=BpXg+OMol|^M>F~(Ty3A)f z9{I59AN#T$Yz3xF#?ygiFI&#+Dk9ZWogReV03%HBN8apyASZ0Yp-`)$6)^zy9S+A@ zBl8MglDf@ZXW;90qwncd(kc##=NKS(DxWv^e8QrU-&Xz45O9w~K6U2mdBOct!PJc6 z?(m`BeiQ|@gBitZ(*g8I^r)QUwYcMEi*~x>u)HVuvWh<5P3P4iJ}AibYkA!Ks(dc1 z>W*%soan^9C}*X(DKGmVYZM#X&c2XBt7hp1i-pW1p!;YB+3`mxa>+T2Ry_`%{@#zp z$SU2XgkRZ~rhA3!<6MhHHS(FR2di)+9aE61(}}P|a8LpnpPO%lxqUrI~&yH;`z8AKR%_Zc~>K-kv?}5c{mqZpgdaM5~|qG%cZ6In`$YG`zg5IBKZc;`ckz4Z{6G!2}yZ zX~LpB{>=}Nf2?FI#i__trBkSgGRL(hTCJz+2qWv;!y&C*(6DMZ*F+3sI-Fu0ry&7n zz_^WX%i2mr;qc`!RFFmYLbw}w4=i50tTc*6#E_lAe6hXs#Z(b@2<&5JD?aTM3rQ6y zvsbCm#(``jE#qjxGe(+71hva(eIxzMzm4;yRPXv^`rU8Tj9Y{MazJj5J3>D*zy z;gVML+@O*DIFDV7d-hbaSj4A?jPW9dStz{G$AjT4D}^@`<$lTOIrxekk%UOQ;(Tmk z=~K*=Mc$S>*E|wWJ=2=Ed&E?lO8}`Ll8-5NAX33xau;`}Y+(^fqd5ZeSF8$+y3pzw z0>%q34N4vAqbYpur2tFuaW~qM(bF+(NV$VbCTE_?xEE1MaYbB10s$~!%2o@+)||#} zZdNO)MbBrz2j+Q+$0nDl;IM`Gm{RrZ8yB+Ip4EqNd-%DEQyZF~OJ?U7{d=e4THL=f zm2t%uUsu5Vp-Q*>4(+MrP-&fRX(pKKZRkFZ8AI(ggO$ZLB3hYx6p*Ltyu3V(PxeNO zT6HBE4rpHLX-)&nB->YxF+AP=a*bze)|c|4)fr^lnxbfG>hr*Irs|}DLGri{SKDa7 z1LJ}ev&Q`4WV&8&vxx9{45^X^!-MwB&g5P;`?_kWm9w_Qbz+8t=T1rxHem@p@ z?f#nOLVf=EEneT9$GJtYh!qQhjt=Yye@`MV`niie1EoOT@_;BJ3wNdzcEUrTCf1<3 z8ja4FRE55M-5Z!@D;KUNJ8euv9DX|kb_T$5^m^IIx$?znPo_8jh=?o9+<)b)c|Na0|e4e*@a~VeEX)YPx z%QRWuRqmMBJ)_VA@7%cwpf@&e z61Z6?h0$Cf3zx@9Xav1KE0j!Z?!wj^LfD86p|-wxw_I@KT65FrbwbqmQ*oD7y6hm6 z;(uy!ch16PD0|nWU5!H(58%jLZ0gu&Ry>L(#Ik(U;Rac+e8j5X>4lj*q}>W-um>LB zW?Y=y@8W(vuqsdM{%|-XPT186lIa9zSPh^7)$hnZLhBeaAI!cwGRZVOzF)r;LALj! zqxB$Ga8KNP%4QX?02%=f2|1QsDW%G-BM&qUu5tG5%`+Y#Ka!=xIm$~o&}wODJMgF) zfp1-T!i+r!6A6G@946B%qPIuharWCij1=(_2yK2QE-75`5^p zgQvsYI9Z3StL~5hf29W|sI%tu=5o@G!mI*=3OTjbyx5$9OltpTzWqm~p1lZYMPN<& zP}!Ufv_PCzWY5-(dj}ra-Ij04gQ@jG>l;Ak>E55J1+e%tRyJSJ>1a!Swobp!0jYUoFityyOsR$eFndMhl2oR7z6WCwWpL*YY0W zl(W;c_rEk!5EN!Pw#kk%upyF~oc}WJjx7afkd%PTRra7%}ZEu1wG**68-IQ`S z(o%a-E1uH<7cSO+l2vlK;UMbD**{UcRTt(J6pRc+UWJ;n`$$m$jq+0pc(Zmv!FRM_ zR`e)N5x3^FFSvKWhze0Y`%u#+>~)Vkf-O_@*4lx*6niMT<))Np1AUX$_uqr1j`YOG zGvK>hg2k1q98Kljol74&D=;RBK-mW@`#$HzZ3lkHjzFLD+7n$lZutdt0T;=^zWRU4 z-JH&CJ9|(5?t-$@R(LR4kZ!{hz8tP-DTS7EI*wtTUvtD+sMm{n&!M5knKVwvQeli# zuvYU!ANKt9g^iU|V0Fk+5PGiarI;e@+kry40qmCnf;|COjdZq8sn;#NdCEA|#lXd3 zODzOP3eVQkaFzcwTn~X_$}q#WMk@VY%Jn91T9hpJdlS3dkPntF3#8qUk8q)ZU>SIB zeyP0ySAMQMY!KhvGuzyTMBfPr%(ugTz*LURkci?#oGy|%W~}NM3FDCce2e$>2;0#i z=V3+qT+C0&7{mFp+9glQq{-ypgaSJ3+YtswuAL0`g8nOEL7h*aoL!$(1OE@G?m`a< zbGbYR?eNw{-c}!@r)JBV%NA$lJ|yYDd`Al4!GTi=ZTOB#44b~RTRq4?KHF8cB*Z`7 zL{!<(Wg*@XaQtc14r0-1R&cnsvnXpP$?zSz@Lup$?VHIW&}A!MO(lXT3sJp%HFEi# zMcJ{#!*!{@JUBs~+YKu)L$cVOTZl8V;&Y`91H)=DocxD^a61&8yNJKf_deNH5PawKAu+?zWTZMF z)@BWs+jR3HIpU4HUCjv;9CAMn{}x2#0-!rHebC>~@bu|misd9k3112VgESr`C?=cW zxDI2YS^jwAr{hif8J|}vu|eK`LrYf<`Zqq}Q&55LlL48>X!uEe;-)(IpBOwpkt+4w z5HQdbvO)yt)WTH%ip*X`pSYT3+=ci|AOG>obp8clQfdSr*I4->6zZIolmlim7N=>V~^bs?iVc|zFaQoT^>lLrUH z)lQ3TR>l`{Do$+%vsbA8gsF7C-QjjoV*Pp}Fb zRgG}5f;U5)!>kg(vT(BlL6{)l72rkIYTQ%VN-|DvIcy(+yBa@QCxf4rj;T1{Mb6Y- zW4A;j;}vNkioX72OczI+3TLm6A)_<0$eAi#BShXTfaNZO8uR1HXgTE`y8FkBnn%i$ zfe@_R!A!9e8&}3&OIk&ByK(Wv{>dR(jgtSC4&sa(y#i_f;&iL0sk3(^FPsVd}c*&lQ;bFD%Z?D(v-2ra#6O5 z9Z==Mhx0E<>Mo=~5nql)QIVvivVDcXKEGdK8GNHV{ek`GaZoo8Mz#KB1{^0ZN;HeZ z>cgp;JPC|ZO5`~=z0{|{s$ZKkh~iP5@+uOpP|gk4jN~FD-$vt=j^sG`Y;_QXXXPJB z-XT^os8z1W0d_q&ZUkQdI@#B@F3O(TxK1|F<61Q)B1544^l!9-#wG#P`p%+$4@e^= z=p8gw@RUw%=hIt06$hY!2*sAh1TM1NvcTJ*aGmtcxC~(E#A=)&CcsBE9o@?vOr8gj3h~!q6 z*brw-I4*0_?pbU=FTdO5`6L}L^W7&HuCcBSd7W-$3|u#dW$m9=Bj9YY8yFnvj=kCt zu=JSpYYnJv7&x~^|H0oN@HCOyL3k-ITeuWzNfrs=)yS+cITXi$x(Lxf08WVo0oSG$ zAm_nh{7&HUfq9? zd4Wb|AUD%&*}9y1#2HFXFC>xq5~lVI5swFns<|+lh+y==^f(^!DxUW0n^P&unVVEzriL+~T!{+^^Q%a2 zRl#*p_JK1Gvusse_hBv1W(zi2y*Bw5tf6r_=20Z=r!j+x%aG|zBuAMk<`M~XeJC}m zf4>Ox27-=xuYpEC_t*u03;Dw|dIA;e9qmCsqVEOfih-KB{*y5YU9QdUUQ&Ru8HLGp zS5dTomQb)qB6qckUk*h22VwGA{tE7mg&n!&!ygT-FN?A%=7b8zXzf2+-y>cGiW3wm z_EFH)UXgMz=)BiMcRr7B&$-wX^|aV)vAP;e>0Om#BqBAB#Sf7t%%Tp&JLa2yx4w>j zanfuUBKL1in?Vj{a6!XC<(p!$U(2c|OzIo)A zrv2zm#ok$~)0EKdT)5jkpWZ{edQ&kMG%(q_g;S6~vbxi3pwF`a(^qA;8poE5^V;Bd z^5;p?m11a{v6Rc77{3VgzZzumcHzcr1k7^17@cuo%wcn0V1PN-iO-(9Qf#pz{!~45sLjtH{OAQ&yT!3skfK`Qw5`Q4`p^0yO@jU{@%^}U^c$Qrq9=j3ve6?7 z@{rCLfV*|je%4oi5FRYV(kFS%RsqLXX8_X zL3}`5I-bI5i`2;dBV>r$E^YmRjcbq@-^+N336CG#y@E6tGf$L^5r%b-vPU_ za3r^qgN31U6jEt}tb<)pQ#g@OYpqvJmGm4M{>wPqPG#X-g04OX&snv>>gLdwHt0w8 zJFCxQlBbpiP)kQRm-b;|ZR8IA)L0fQIkkOjns5C655w*V(kigv#7UZRsegEHOu>{* z@dD9IA9;nxp`~kO!vR0B{oh{UO|QLrwJZ3KSC=Ev4qTv05G3VZ^}VvskQkfuqkjg8 zio59ARR^|mCxEBrYg?KgYLf^d2<{L<-JXljeHFkuueJ;Xf>}o*28jB3`K?qLBisEt z_H})C9@}4ErWh4g@a?@8rt7EI=rt3pA}W0~+wE#){`5ry6=tgNQNfI|yxho+cHjmG z_j}E7385@;3^PRFyv4h4$A&#A75@=%a*Q0gTT_{ms**Ba3WJ*bQp^odEHV(xMgC#G z`F6uC&^00=bP*vc4%nXI%UCl*Kf5A}hoBvZ6`fMsV4bo=taot}@eCS%a}Q{I^!WH3 z(^VCXf#e)Ng!!8>EE%tO=LF)0Qcrv{jHSsnf`vgq?^v9F$L9q@%wOpVaGE@|RAIZu)n%NO z3e3RwE0uIvYr@Wmw--UgNn!&z2-)oMzLakUz4oMWZUO|QLp)7+=?ECMj8q2m1t&9$R=CTX`BN(JVy@oF;;r_3lulV0 zVxQHAOUf%kvu}PBsUPB`$GpZ@G3PhlNEMgF@4Otj&(UQo)#^)2^W_Sta`q}B6dvIY z96|FKqNP(4)*62Uu$t1QiMR`p+I9>@Q|J54Bmgf*533~J80&4gNMAf^Zm}b^0YR_! zIJm%C>{;c#mcWfc)#;_ELa)Y)cZ0+oNPh6@aia{C9oFxuxM=HeBFNTfxjoQ=N>N_V z6?0Bv_F(Cg>p=XmPVZBEU6%$h#_R_ADLkQwBgd2^g~L5jJK7h`dxP`!g8=}QJ0RTM z(L&aQD*7cL>s;kN19SRup>5m8pxzIy$=aHUKi8MXgLy3Iqj$ zZPp$E_4#+C4Um!06avBmR?lkex&~nQur}iy5FJYi^4pA*{E1!L*0^C|?&bgTmju{N z8dj?Z96)%JaC?{>bF6q4XM_gzIm%<6n0V9K(=TB{scMFnnsOT2q%GA?EXGCR zxH>5h!+j)Dh4~2p)5Zg_miOV(($ND5ef1n?6Ccsx6bq;l#fJ6pO?;#Acx0>k93i^B z!O~ZhEz!!csq@_dnNKfwi*v{#Ib~D8zUe{;Ezznnb}6-%33=H10+^&ooJ`wMq^-Lr|`clgWzi)HJq@L42q$N8jRP~ARAA3F4mDqZ}fhZ zghXb_lzR3!_^W4CzCFS7p&2AQfRk>mw*fa{mG07AP5?8`a$E62L*Hv%1a?0k6cAsJ zNYFkx{v+*X5G3`^hV+dGAWux0_iWE6CwF`>j9AHF_?QzlCS=)Nw>MdI+WG$WFB|S6 z$I4NS2GqLeFXSA2Qx!5Hqk`_D3I4IcUent zU!AsuLTO0af9yO;YCA7~O+f9iHXwc^b3*R_**weD5rRVc#QA41P~xBq`-eh0Vg<25 zxB!S*wZ(;RZ-HWrWbW)%x-I6e!|+O5#7RHQvrsyU+f#E{fpqo*Y)Nj!=(9CJDDAD8 z=b|E1>bVAJ5q7*nbm~i^#R#sw9*91;BThR-vB=Y`tPU~;5*XS{?^foppHz{0VUax9=51Bi0tnCi+E-}7$)Wm-KnFouE~C%LVs9Wn#cyx8 z1m)b|8>wZ4#I$=)vko3GGN8TBx17`1cI1W8F1skxMHC80nBpxWei05GiRbfG{N^z; zuoie@du1JvcDLMHVATqX2uwL4Qm9yr>Ig zR;`!Ed##RVL2mcfF{{($uKb^B92W?Rc1k#bWgAI}F@prq6c!SSF{}Yt!I5%yyYqnH z)Yg5B{grwy2`L0IhG-|&YN5I@7`oQNj*N~1gE~5qvBvwx?0nkrxw@$SX5;XF7<>P2 z!92Xh7nkqA(k~)Nxt*?gA6o7`!!D%~@AlPDUYSr_FjU@QCD?X-<+~A^biz$$g|(AW zyt86*y+69L|GO&`p$4ZifQ|6q`PX|r%#%P2Mz-NVK1u#`2<+FVw*cLbVdIy{fl@M= z8iWK_tH>JkwxJw~gKuTDho_=WDw*$m^beGEH9L;EDe9K~y%B6sk})%jm%-c>Lsf!@ z{iL3;T|WFi76`gW^LP6g;6WsAQ7`{x&lU3T@#I(v8#hiF>SKQ9M-9)z)_hmuvDpfb zirtsoRMj_paPka0g-Dm|=t^S$^P(EG9i$CK_31>WI`O+C34_R>_@_!~rG`@cXEEDN zLLpg;f#6#;5FDQ}hHouEvg$tAA3oSbM79^Iwt^PCQs<15?N=2mf(8|hX)Rl(zg5&H zylW1bZS^@=gGRI#{@Qwmsv77HNfviZ%^<7>cesRhP_VRPx|tgPGNo^;pFFxIcR@1f zUP#gr)y6LBNa-cNSd7*Sew7R9W@zZT(WQ;T`Hu?qk3`>=2p>;i^xR5^1-d-FrD0|? zPxTWEZ0yVqA6yWvydL@72yX8(^E<>W%N?#%RN9F+2!vSf|Ey|k@OBUy_3Q}`NWkra z#OPxszjt6>Lp=x~ksfo>Qxc?tySYy^YF)5F7hrYwG%Z(!t>s>1WQ6;{n*(eybL@ho z+5Vg7=M0tKjl8e7FpX?wRZAe}S8bA)lcy-U=B)F7?cI^l$O{5$yPCv*Mm?jRE?CnC#$qj^H_%`631>BeK2`@b_u0rf#fiwE_g za+DXRSNBzdiE%FQQ^6UgK}2S!yG%P5i5n$Q`XFLWie1S4q0$iLj{$LDdu6iJUz(~Zn?ppv0=$B>ozb{*EJ@Q(?<+Lzux zpyl(UZyRYpc<(XhkOlohh?NJAzZV~V%yzs?BxK+3&y2(+f^d&Y?~xx5d!@O!!$Je` z%;p6<`HaLmH*s;U)Yt%jti!K7v;WbAwyHL)P`#L8y5+gF0uJ72I2XB=eOoLNea{ry zs6BIqB`xOmX5)*feTQ3TI~uGw;zzc`hUP}l*1;_%{($G5meQ)QL2acH3|m6nnh^cW zP`y+s;=g$P-pn$?StCH$)JrD%DEz7V-ZSYL_AYv>*Bi3V8L8*)-NeA%>B&6D^g;o% zux((E-%>Wve@$QB_b@h1=&d~JMf&SH!m_c53fo_y$EKYS;e2=(jiq2h7%>$rVe*)h zsZd`)G+?wf^koY%no~_`bZrJTcz;PjaS@)5O$C@B8ZpSa(>^f8;!0`q1$L#r2@h{m z1w|B8g4CnX)(FFf$Tru*r{|@A?+Y61()gozz{x)m=@6Lv7aK3Sa^Ke2;7UP>=Px)e zUDZS1y{*b2qEeFrzzG&27zsr$BVBkBi@qIeKsF;}_ulA4Pa9?IFN`16UYUaOQ5K}v zHbO8`V+B;vs5k{o4cI)(iGARN5ElAu(5Ynnr+BFvydiS$Csdn{-&|r&j&*#u|CeJ$ zfV^w1e(uvdPy4}F@>l5*Y>QHt2>L5g3F|VxUjz9jW|`*&BHmgnM-?p3>MU%Yu|}W;lXb zc&<*pDAzDWaSDKm_*>+Al-QfMbnXo@jqN(WM}Sm@FjxX-8Q;|MwDz!GQ;jzo*mUh6 z5=nAycMpW=IPM=fHh~+vZvg*^CD&nfnrD3^^_q6nF`|}?%BJ$JxY$(8&cbJ*j*mx@ zZ&A|T{m-RpdNUzGdvlPN0KEf%?~K4GMCdi9-_-?&NZ>gHHTGO;@5VU|)zspgTm89O z_>%>=+*7RgZ;Z+IxTRUg`-4+j1-NnRw6D1uq_Hq7&XKj<&ej&!^IbmECE_I?dIx}1 z|2s`!`8B<;9FwBXK*w2^M_h(IPV`HLirYt&B*~RmM`yGuu%~G}@DflziHJbq*}Lz~ zezTCISO|f*Z)d0itzz%hBA^F0;MuOKP<(2iDVU{b3J0dg!QQ;)3IcoN=Pq{)vvCBj zl+k*1^D?rw+uoD?V5g9JQ@ErTSs>a8SYJ<|0bjr9zJO2?u{8!dT}j1`AIm<4Z=fKi zzuwE|$3S?UmMb5?gL9!Q(z%G5{^*dmLr87Tu+TQ!9W9K*`L1Bo~wzOTH^&gUI5gg8Rj1ejQWz?jG1S6 zH#!9LF|fxT?uKpLrO+s&q*k~+!-CoWAJJ#pAoC>@4K!sdoR`6q8#<@;%jrs^q} zCYPlL#AoVe*@bDftIn-3n#+&FLGybf1t$pmc+&bfBEe*t1C`0ugQhFsJ9j~(M+*Y# zv&$WOH`+c^?{6AeV;Nl0v;Iv#-teEf2}}~@Jz`AQI*`1cTV|&uaI5MY`?PHIV_BCn zV~J`00q_paskVZSN`Jy6+oaj&y!Knp6sq2nv4u)wj4G_f*mM!@NRkz@lII0q2Fs?> z+|P8MX_>8JeG;M}L2CLFabZ;))O7yLq8<-0@#GSLRebln*B*WQ!DiY1wse^*YToAPTHxY%))URb?S)_PVG0Xne90gW?KmBU6+Z=UA;LVp zQss?UPxowQ?Z`%fH(=S}PrB#Uzh6W}VOxg6v@*95274?KT=oDybN+JE*giS5UNjXy z=;C!N2f8Qk1zx&Y*Po)f3j82)K}Jr%^JRqNGo5mkiq(Y4LjcCnB#(DP{4_lg4iVIh zDIgAmJ^1&xrt>VVaxEZ1|9O~l>#$C5dhJXv66KVo`J{i~5`)u+tY`il7arf!rr8XG z$*m4+b!Z?$RQOWK+8c`*e|nB~>?jVk+Kg!Yy-_i=f{S`lVh1Vv4N)4?CLlzU*@z&UP*ELPnI}=oc#cdV10ujZB}63u=n3La4%+< z(uE*|7!AKU%&un|SAg@7yqQjuyx^CSLsv8SxOWe2IgwN)S?(7^)3}7M%@;4;R*Zg( z#*`f(kXj-~*%;WtLNg`r2?EcSm>C+n#?V#YCOr03a+v};xL6aEC;{*zSfu8h6;R9e zqyz!~%Fe0)ttPJXsmlqV)kcrm>w!K*H)0B4SB-e;yu7f<3mLdFHcE3F9p60g!DkLo zL~v=vR^SQ}W3gYN!wka!S-ut9bg6EJsSjKJFIYBuUAF2B0WB__~jzt_A zMe&ZjmTb*8xj@xOtAUkY%?&5~QA-KluME_^#Y2zx{?Z-xV&F2HrAF6sfj`MO0j8@!gs?e4Oi3ZcsDbv!*(@AkekiK zj^6xrU^6iOXAK_A^)vj@v3<2Tz)d5N{AW;zd~KNuaaO6q4xcG>3bo+ zXjWq*Zr7o%RP}T&i-5@-OZ-vDF(NmC6cLmdjcq5A+pJYwmC$b+fa`Ly>fc^ro2f_b zQ}V`lVzY!@biuC$2T7%n=F`kvt08r@J}(M1n!^@(t$4>eg79fX!PQL~oY40whc$nm z6%T7^cdrktA&i*?h4Xc}nvIlb5$yK@T=(BCVj;qWDZKSTM7YkMj)F|2Y2Ja=4`e@7 zX{ZY)foS2w3J+`4Cf_DK0<17^2W}t-n$(XFC>{TsrwLACix&y~ z_x8uxyC0(F{Jn{wS^HjD9Yk3}^y|G`9@)xlt?L62$y5o6Agn=&xEyl6x zn2mv>9s!ed-+Ev7)E`*l1Lo~Im6IpXp2Ztd8d8D062PgHHvS1L7R3XqylkZtC?zo|IjA^y-I=Q zC0BuikVKP;EmKgP&#tUWXpPG}OhwFh5oQDTh<}c(91grlN{1W9E$ARG%d?D9f811zaxv22<{$!Q$DyvhSemjzUDccRN1$t|_KlEU8gUv7K3w zB|#{yQ-~SQa1ln%Vxe$or&WcTewVP*;NO#M$8QP|=+?hE54t6Xk$q%m@J0i(Ps_-F zmnU1`*;r(a4tKF)eg|UYGdscMC253w`Lb8Gn=(+02lM`5?g@r68VEHO>aNMwI?!%V z;q8u+dH?|JBjkmt{kq;GIIQeKx2vFh+jWxYjaYCM!x;yKR4h}zQJ8j7AY=sM2Zw9m zqC#A_jo~&py{7I65v~~hZ5%=R^6VkeY(V*zrUQjW6c*?x5*Q&IE751O-JCg-QiY@^ zGUEk>A>j?8ym+g0ZvGva?nl`d5O@dF3{W`CH|##-s}R=#{1728Je>X^HV{gx3zS!`E_+18nI*IKl(xrx?#Sr=dTY{%1uGrM>$z7M}R;k~{Iz z&tcU~0BLLM0#MLbz~Q|gU126L*sOU|eQ#K?UdeOZ6InwtkByg`AjcFN>sXz7i+8~D ze`UQMOvRF}ovfm`xIl`9skgqGFaf&GdBgsE4)@fu$=YwZ`JI^vSWnpQq`_yMjy1E# z`Ta&ITrBlvsa{mMS%c81WHtGd4{>Pm|BL9PxU z2_DIn@H)17WIu8Ru6%iK=!J9{#O&E2qTsy9D9qh2u45THg(wNm|qb|HK4kypmu@LZ8DoNDh#xe zxajf`uTdzRoK%Mtp|Ef{=pGHqxT$oFMr0LET;m~zF(bYYojb@EOUfod4dkn=KS?=* zfcI_HXM`|Dp2o4HU^^Onlg!HWt4vLGly*MRUDtFctUiNm)dwW4CtANv?0^C3B102Q z6r4zQ%d5TuC$I6Rv}}pDe^jOnH?RWEfjq=)S|24ixVYFq4PrK zUU(h7)^G|G+A2_2ftVsQDeB^&TvAyIp}$oVI`#?bG0ItHpO?@wXqeWBS)3l@D6*3} zQI!(SpaiiJ0Y`o@mdD*Q#YQ1F4tPhE|CgzUf;AX_CU}q7RwWExMe$VF2seQdD8aF+ zn(!^|sDp@gOaRO2gMRa9iQw<(yqR8{qu<86LOj6h76LCtAI15>E9GQeM?%ZDLeAWq z2@Mr!efGA;o7ruDq7)Nt@0bchPlsB#{8`Rz0$&b8Z1H6iczHC2t#zF=t8DArf^h+7uQt>sWlSazhROtTE)XldP1sFIi8NTSNOEJv@Iw9Q)g+46b_OP z*anFu<8D920_75!Xjm0TIP;Usu(=o!n!1FwqmD-qISDP1gaSKbTbdi3{ z$^IPerX`$bdp60_h;{NP)l5sM+$zk;e*AZfOTpSx9dRAov&M5Z!8vxO0#g#ZOCH2F z_kGHe=F~a5HQ%=elK{WCh8Fq(9Ob!J^A+fN`oOz*3ePyTy zJ~Zz4sUFM76~uUaag(tz?re`X1OQhQ#nG^KCHXu*nQabXLk)E)aTz#2hJuH;jU%gH9TazHh+7LWTNjm>Kt=dIhModUMOR^_Ykto%MYIqoTeYbSc@Z5tc> zh}UlolT0Q|a;$8XPQ5)UM=RuQjq7ozpU~+j!|tly%NB1oJRkrdonj0ViF9C;581J= ziz^8iys-`D#eY2qmOfvPP#8zqHukE*z<>JJ!Sukgti^MSu6`XC7RX9H86?xP1pS5T zl+YrWC~3564s}rvrrn~*n%IF!LElaHml_kr*hccv8nqkq1EL+n?-^Cn2_3f6>|s-% zRA=LWp5kF4iiUF2?e5(F_0N;JN&7fT zOGt1wIs254%KAEn^M#y;2|NRsHpisN6E+6}d(H)C?KE$-Q+n;fix%+K zwhM{dR2N4s3x5IDfQXk>+>tpW3 z^ohyH)KI-+wPhm}Y|v(%{={UO!(`#cxAzd#3I&fs3IKs)M?@d;y zzx;1V+1rwsTT14`NN)k*_58E!o%S?-yiCJBdO%r#TNexY|2SZ}V^K!<;(ucXNw;T^HHwU%YY5&Om8YzRpyjc9-WC^cBgvSm% zodv(Gl-bI@}Ho**qfY)KOw9? zkp+r0b+@HP6ObyFr)Sg34%WEYlisxQ5as@b%KK|c>8{IHT;Xkp2dqV)OVrM7oLYG? z#A*Cu7_-)Oz7pNxXrP2|Qb5UR-knmZA|YJZ`CbI5s2@vbI-SYCrNVCF#wD2LGu@#AaPcT5W6MZ^ttAELn8s81AH0@!j5j;uwK zM$yAR_FnVWk#~%-zPlS`Y8&_X-AbHX2Jfc-VMnqTgQFUt8dbrD8*FQQY)r&H`Rj_! z8p^u5g?@?G)@v>d!WB?gvG2`*ztAU)B+Me^g}@y~gse)T>TdELCPvSB!2k;dO)KqJ zaqu=ctbcf)R14T#-_|!x9euV=#3{s!)?z@*k<^5Zq-@%#TVZ-3fGbV~o@nZZ9GKZ= z!vJms8e9<;Vpe(O?XH>M_7tf&jx)GRtdbHRh_xq-@^ViMt8-@K#5yOnanGutz8s1VPiGLb(zV1}ig6*5O?-yu3Hmzp_*y-qRa4!a7Q;L&jk+ z%0tZoRwSSBHTV3LP&t+*d}R=4gcHk{`3k9@F{zEKTBgGxC<2^S$qiNiE4 zjcV#`xw%?}^x49%A4a6Tt!1K^+BV>}(*+CoV!GE;E$SRvA4B!b>3D&6K};V3vu1f+ zw=hMD8Av~S(rbOw5RIuzarhSQ(9Gg{wuQwij&jT;qkjQ$UMB(No5ATr!qf`?VQ|ad zJLouPN_I6ojI#^UTOEB`A)xpAA2AAN01Tw;@>#3qJvbr%8Q>Oo9fjcQW5E@s+WvK? z`wzazUHKKHXKmWI8=Wrx;C)${8<+nK|;(O$loBqszPUEC1{xyXKy!h&PA3( zxRFT$Qjv$-rW9Cow~(cRrg6$3B>y|)v{{#~nIJ2borxhdaW8dDF%^)iAC& zFrH#abhSiLRS8QFh1oFF|IH9#P8q0z_QuLJ%@e}89KOm z>r`J4#rLRpf{L(3S<+|N4*+_RzbTcy-|0J#Wq*E8jid<1NJx@y$%d@PA)#8r(_|HJ zBn?2vG3?%QD<2!Y;cO9<`J(3&7yL1fr z!XEECxSlXV4P{^dO337(ISCON<8gpt!T_`CJT4)R!ic>W!h?mTj^~c!#*m zSWj!Sr2(F?iCzsgNbjs7_H*U5(S5}*kMkY+OLg}^Rbyq`sJ7^r5a-elCvUo}5!)qt zC_kU8N!S0wu1Srw3o($d+?Z|~qs#?&_M32FSKLe5S&2iQb1fm`IgXy94c)<~2OPr*x!)o%h5m)4CeNz8qbW z`2y;C@5taKw!YBrX+ z5>5uF52Zr4Z`E0gPr7GyoOY6&wuj8qFC-V-CkN2onaVs)7jPbI{|9Xz22Jbn^&(S} zu=Gw2wf*l7z_XXZSAkll({NcW7y80;mK)@L6uz)Y9E-XRzgAz-=i!F{)#$bW~x1kPyRdQ}jK)Q3`d;kDE zF>MsHC3!}mr>fUMUr-iLW6U^l#fA%1jXxb1&Q z7W5&^GbM7Kf;zS2-B|#2xx^V(%?eaTjDlO5qyHx1MEr~Uhwj0#{W9nRI`P^H6$+AT zcN(*SVaC|lnRIfWiuzltCD3 z9h$JF-Lp!mS{)mcF-ML5|KnW@?wCAC3b6ql8uu$uhs=I?eHRO+_YpZPNoY8&CH{HrJf(otTY9!l)wo8$^QqC zN;}>(Tf`{gm(_GR+dnGQ>gxG5p~JO_?@x zvGL_&@USU58i809ma}BySN+E{+qrVMe1qGQhhMgr{LTOmW2Sew z!>PHytzX&_5SO0RwX}6F0;V)>RHJ!9;CAy39u=W8R{01@s#+_`;}tmw3Bq9T9H^7( zzE}h)8NbGH;**?P?)uTPs#9Ao;P2#kDIz_98jYYGKXfb5LU|y~6E&mv?Gas=qL|^& zf*8)-?0W5sl4LsAp+d&=>smRKWaSN;PUjOfr6GI zuCT98U6}@MibL121OP=JMbF*^TW}|_j+7lN86z#WzIfBTB2A~K02X&xHQ#?_H7o^n zo;(`FBKV{)1sVDiPgGQ#OeQgl=rnQ*Dg;XG0J9P_#= zLAya)nORXwh$e`#kcn8%l3B$OI9gJ8wPH1HM(0htZ5(-uFf*%m_!Eqt)6B28#V_@L zjzL!evKSh4iOVP?s9fXIBA$+rFpO;;+lbZ;`LOF+eQiw?Jgnx@meDz%zI;_SjRlc( z^{vLyd(($H{sQ%d^R9*DJ|i#FHRwo3D>((a{w)9B-ki_2oO1M{qP&Ogyt0eKa%^xw z5%&l~o)+}YsJg!&FKzYy+0BgxvMkBjT?6^iYEO%a}Te z2vvz?JD{fL~ z>y~E&YUlKKT*1x>xiIjmGRE2(WJ!b-W4ZZ|4Vi~T3Ob5x<$d&WpmT$njQ}8|O-fYjPE;iATm!d+}`%whv-8_(EE&+{qW^06-ps%19}ra0oAN?fV07vuX@IAoaNT+&PFM}~ zTGvnixx~PN<`lXdyS&A#70 zj(F_lnelRhtzJW7m zTg^iRn;J{^?}NXSC_~mPE-NDwaj&L^8AG>OHczM|VP}9}Kn!m-2E$K%AMPgY>lxOl%#zHjpdq-waF7uwY`V9ETCnQl(Yrc|8E1(RK14-+gNSK4Mv&WOZZ_05}8v)8PlXqNBSre zdg}lv74|s1zynt-RRRz~TTWzYrznQ5hh(Od9$mlezO{mB(`q_#sE65jK6_FlmBlMw zK)faUhEHl8-Wu{f^Iha0Du(DJA)muUi|D&$srsZG?bS5g^wJ#0#$Yg$V2MJB=m)}X zc@wc${!LQI-$bULMb#+%1OaP?Tox(9>?+*eEIy$sjA9(aE4n~a_>;wpyM9;BB>8gm zNGklzj8oeAk7@sW*iSHpxTM01I2n?#{a0^r@W^UB?GDdXnXd=kKdgBa*u?(t%4I<> zx)iD6q~AmUlL;3Mr02}w06*HK+N=HS;?i6+4I}#F_I_uuJQ)kG>29*{HNz^V*+5wOTH zfs6=~kYGs8hKQloLYG_fa)+27%+gwmCCGqMBNzn3=$`eJ8;X|SxbtrJBNdp*ldZ&4 zVnk*%Xqz|MTAYp;3gzj-u`xhB;A8Y5K3dy)o$zQtd4g3L^A7;)znsGpZ2c0?G+O&O zFk|I5BBxy3earmiH2+pO-_6=+losY-1R{2U$i7uHD&4IK*Gx?92$|lq<*!EI6pLyk z@ddaPDnIt3ys4ZFz@HGsZDtwO(A^&ciaIm>7aP-7j}9uDI1Q_6`u ztG!*IB*_&9ovA=)=cGLTy`0EYMk?paceC_N#vDiY83t_T4tB8|EqZe7&Sgnjxo_I+l9kED zY?ZLiN1NMcq?>>HIVegpj_XX|AP--0{W>KfXOn7i>*d25K4=W8PARHciOUpKjbjjA zQCZ!IA@G<7Ab;NT?t1TK<40qkgE_w=H0@&Wt=2XkK%s9=m1IHpBl!zoEe z;4^~P+~30Cw-{>_5)+|%ZOe`XX^WNtQZOuyAyjPo)|GY%oXIUq^m=jIGF6<1D$ST< z?%sZ`gVim)n(RDFw4Vr@VBye~DM=}sx^OOKaLI3wEl=iXk8F!wX{t^TpUvGLm`#kfk`(XssIcJyl2hrOBrF(mzAqzWk_Yju?0+)^5o z(Hnq6Gjq(g7u4vctm+~K7h(10@#d9B6+dZDW1EQ9F)86bJ6i6H+9-}O9ayWq5($3% ztb;Es(mQLH66RibM3TPk92fQOTsseIMLqTZVWDT6K=K1;k-McQ6v39trLrtNFgwMC zt3vqQc~`=1W-=74j0aWTBJO9HJVc)kFMQm$)Z~;t=Ow#afA3uss;NF#7jxodgHC;zB{I)o_Rhm_K(Y_&mtX5$v9?qgAbZ_=Akgp)tN$jk09;6t3|M@9|Fr6m2c-2IpfSr_7RM zH-hdHOq{U5t*wcOcdPw>!4@yRhl$fFWc~u0kul1JXM4<_*p^3djZhAUb9eR-z7gMf ziw4KULVPIk=vI4W_wenj-mxzuT=j#V2B$R&2eOUSPsjQ5WmigGfJ=5rCpZJ0o=(|;*H1Ia^GTeJuLJiuEByf2T(Qz zqirc`yKP+Fy)SKXLBP_2XO#E-d<@FDWl;YT)*np?Z_BT54bwL4fFpm@pB-&1y>K>~ zA3q&{eG@`ZEwk)hh`7`0E{5k4Mjqc~{L9r-YMOz%8l0F;hJv#{Mr^)v;|H%2;n&z0 zFPNyzTEkw`ni4i(*@$5_VaosVn^x0>hCc}6T zCJ92Aq4)b{+!zV~H#}iD$c`wWzPcI96p&uKF06yz(x)U!Q9$F1%_TX4-P^mPoOd^+ z+c`yjXo-j_wr=%uV0ss=SI5vDI3FaD#GAyYyLj2TDZYpJp@@SHCpseNUBYA~OT&hnwjy~vX`rFqVF3J?XG zfvFNYq->9dbGSn&8<%XVFGm`tN`$Ua*hFm##ynMLzhj~R8ik?&-BOq_MBBcx4$+FN zOPg>sWO^n^u@fk<2K#6{nV|z>n<9Hkc6v-po@Oh;Uln??Bju%MkoW6)5j^njbK7cv zU56k_0@^y%#;}a97IZidM(kght~+|WM<8B;+oj#-mo30%bp+hCSoR`!ifuI}Qc!}-OS<%(1Saeov#=AT)LIaBq4(D(bY|HY z)~*B|BhUO>hcP!7;tI)IJ z+%n#YmNFZXX)qc3F3*e57EufMVX$;qn7uP&! znf?_?lsHLWXv^L%c_=uG|B6&eg?ba8_&>O@+sXjQ`CP_1PE8)a2rZ^gaS;V^w)a#) zXaIE%juK5C(2(2lS8rM#bb?*HS|NknxaJdK0>Fy zF=5A5hQ5h^j|T|U!^BHB_#RV%?hEh_k^AGL%-Df3zQ4sEIe^~%ih%;O2DMY|=G@1a zksivL9!N_T?(Rnit-pW;ux&0l)+Eu`{dJl$L%|K8mCC<gSH?CrbuPm$ooZ^!^=*gDX?2oR#d+@?T|xccbl{|GtL2czDRdK;f);ndud5N;P<771sae7>leAwE)On<#NCx zcEsxd1V3i!LzJd=MgP5vxMx(Ltokd(S@nhyT%BKuQZ!(i9Ll#9R2=|rsgv^_4?fLP)&<4*$+Y5O^Sqe~A-Rq?6f4z; zzO?K%J5PxMdi@=pYw|SG?0&K!M&^LJ!%+|eeZXAor z1pliqy1Z-2Gs5wvu7m>`s5l_Due_$4X~2HWp;L@7p83B;qXtAMB1F@X!jpck;o;|y zK{&%1HrxD*9HRRbEPni(5&{^zmJ8o}bvk%1oM^r3?A&PkLIF9O2cDw}2ff@(yd0^U z(h9aYxCRDQ!sEFi#j#-`y>PMaV3nvLz|c-R=e(f#C$My>3kj7=no6Ex%-gz^V2MK7 zzc4v&7FnEc^5%n^yBbW5TN{+o9ANuw=TNs^c%R%=uyrGc*btztubUup4!8u-bHw!Z z6mGWq6T`U{XBwt5Tn!knO#OOteQ)``9!{=hurbV#FlsUq!5;mKd@rw^yp}%2fjmz~ z*V1gmy2;P{@f1la9x@vYxXr8mgYXVejwVY$jnjQg;X&8n#=WObBBO&Go0;H<@f*G> zWSW84hP*foVM#T4IP)2iT7dQ|?D*qs4u3hSMtZsuNPg(@y}psS-3}HR<$BJedHO_V zIju6G%5v$C1UzSmJ}CweuH=7vlu{VMbDL>S@GFtII}mTKh9qF));F}ZeW6D|bzTsM zOVdVVw1BVJO6fDvPOQPf7OlKiVW=r=G)sb1jzfU7t8=;LriWPzYb?&)FM5qp)nO(X zE~{yXi`PL>4^01x_l3K;#V=VLxyOHPx(g-kvX)HKvVRQp4jpO?jg6P9mwSu&&Fw!I z%Tc-y`2a+c3rJPmPcC`d*VgQ%SC#zP54ulOL1TbcwZMbcwxjVuHB29-e5+jbO~J14 zc*qmFFts5B!Ly+y-b?gh(eP$S!0KXdSQLdb06`ovtj?g)_-qrS; zkan#UX3(H9)Fgq2zH9+U5H6m)xbwC95YhVYz?c5jv+&{BYthfLkE_w6XLgX8819GAw7k#6j4fNl8v6jrbu|0%9sIdseV^&cqbh12@ueVM|3tvti_3om$ z9@g79f^-7&1K#V%_LzQ-SzWn#_F#S(-~kC_jSYnz1XRMMKG%9g1AJ8t9h$3)f1b#0`f+#wAm zW&YSN`{30ld#f7U0VEHAThU!7DBXSr7K6grF_yO%$m96xfo&@sQ0|7{4)AjWF!U&m34o<0x6yiz@yYUu=_=RM&XxPf{IR z0NvK(s3ietZ>+lH@QCUE9I#1P4f^$mDGPGzHCr*ZTa?*c5%RWiDLbxsaoR{^}9lfUa2bTf5oIG)BiwybUSj#PgK7oq>&N=kbG^I zujM`DdS#Mc`2$QmcKS9G@&*xA5%2&Coi!829Nn>wwcBv@Dw@ z9PjosiPM@hy2biq5eijj={m^pv@Tv?Bm#V_K>W#Qw^{a9QD10*N_^Lj!Qh-^9s**j zTZ5yBgZI0`WL(4FBJ{R!(O0&T?jkgtoo|`8;WO!Bd?9gic}a&eb3!Xbp+MTNTrA-l zgdTryCN;X5=cmRSlM`5Yu@4HP7$#!2o45MAoVZz}Zkn9zoC6-}SDr|K`qCQn)-Xj- zYQiUq-PdJTw)qAHTIR^HFU6qY$GZSTTf?u4vciGp!E%tCuZFJSS+?e+1w~Fql$HS8 z`par~!O}K^AZq@2k0P=;7s}eKcfmP*P$|mSEuxrXIL@i*zF#orx#qJhH+v2kxh=C;<)oQk6&P44^MV3LCVxW(xz+OC*3j0r(pg*a zbP#o~l#&^j21C{5U{=Z~(zqi?GyJ+W|^x^t0$L3VZ#T4qMf96dMoyy&9tm;_;owfH$;mten<)Loam+<*G z1{pQW-x3(bAoCeIaWq5VCBA2}!UkhIvWi@o8+6_#P!6vGjKRnST-YMqO=%{l6grKz ziW|$-Kd5g-K{Dp+^Z;;w=MlPJ>c&8$B5o_$7o)%7 z%A$1Tk>o}(|43-^h*-y|Mp*2gEA{4xIeTt$#-be`yz%X_1YvFC({UCOELp0@u4W9f zdF=^UNNE-{7}4;S8B$I)gZ+`2nhzH{$c??FNhHTqDSjt?+gjYcK(CLyZ>81D&o1SX z(hs|-TI1~d9dkIo+%s~KIBR-~OHH?BVnTt<>AaB#+`OAa4@UBQ&KUKMfz9Le66lyL zl_-rp2`+%8Apy(Z1mZ9aGD#Z0dMwsXOsFe4lHdXwvDS`LwVMc-v@Y|g7s7H|z<<93 z{3?QlIn~KmI2|xjL|&n|rDQ20k6>n0^r3J+1IYG6z(H|Y*ck$E}d^q06RmX z)mp3^oX>RilRGaSc=_Ipj#qt&gwTlTl2mQc{G--f2@o%%+CJ4o z#(WI3UhX^wGhQL5h%7vPZ}06j^cjZYl21tcOc|pcNPC{_#K9d}Z-9R@S{3o2BAQ2B zxl*j*%S8Pz@-9Ni-*CrmV0v6ATN=(%bgE`-m#@S3%Ig;AkE9nx!GE5XcOG+3m9%jx zS@DTSUEi>v=eE=3_vXEsBv|On{^eDkK;e++pj=7>Oq`0P*!n5F7&vz-Gi4$C74XK! zB!tUeFhtluRYWaurP|0?_Og3(Q?~*qU{|i(%>!gxncFd64Z(+;*@Ax_RW{joGE?JW z!G>2HWEM;=GiR&j@ZSArxkvm;E!jZ?A;G zz&&w@+&86)`$cWOJ6wX9E+kPgcm36@@XIu|{>Cy}@FjtBwcsJXU&5JRMpf2uvXc@& zNGg6o9=MrQR9t<`|5cqV1$9KlQNQ(3TR=nmE62jf)vIf+bbRWdMXGE!eZ30{07t2oO9 zevXg#1Z%I#UYj-AkL&192@BmVq$qE8F#>p zG>$AtL8fZOu3XeotpnvbFYCH1Lp2ks?=r@D6^k2?88za|cD)qZUJ%2xVzpB_EDxMX zW?khdlIyuxgDK~eO*fhqp-|-%Fjo0+z*dt|&R^W1ZDy5)DDwHMR$`p2naLwX$tQnN z3#HK#pO<{jOW(cc8Qju9I2`dh6}JxS4;z8$Pp2O=*w1Ws+`q3h|Jl>IRe@)RC+u!C zyiYKgJA@_yf*D_qO3vPF*mo;t|LoZY}Qxdh%)h1{F-HeELXq zDCVYlxg*y`bIfO(czV|-o0&^c>`@?;zS<8$Wifc~&PuTgIK9;nIxVSeAVzXuNvIBg zD4j)#?8O+Nw!5EH@JCYJ%LUTrvD!NFA4}Ww!Cm#TGtv4u^&MhCsN^j z>#(w>HlyjUr`e4&a^xmY@{Rv;?vM3BX)Tq*xGykOg;J`*JwzVDI+&FWq=I48F0t`28rk3QMSCU(Mv{Rytb$IQ+362VlJxR&t zhBfkmCm^+ZVx*p;X7^BE-%>$yh zB`ki%-tDUbkGnw9M?`aW%$xcYz$E3y9a+fdGjIw#8O$3k_KHMb3`3S%=9aoo;DJmG zm%Pwt?2R)+vEpbs0)#F4KX#)Y)JvSpGrGfr5Y#R9Xe9QhcgP&)t10>%?wRrvHi&-Y z7Upo_W4-@o^{J2!fT*XMvd(g>IV1v->Y6+wdDsF5BEB58r{cE12`I2)?{3J$A5+D`6>t;x2_*))*JD6&2I%a=z+qye)R^KuyiTC73W8 z9e?6>*#HP#UFujIiVqCd@+a!Pm%kPa(Ol1wZtrnibP;0776F_95-51EtN0F z;#K7-C_P=4WG(V9ipdxlSse}9JKh=@s3E6d`i&$le9P-2AN%v9(G&olTj6A)#!Djjuw84Du3xRaP+c^E;HwuCii#$6T`< zNM@n1Gwj|}NGife)%bL47bL_P#jlrIZnOVc0C*ZqK_g!ftyk5VAi;WqD6;F=Ca70E3hlHn*fh)m&+vUcpCgF$PA9je=K|RbJFf72A7zO!8Zq=_T`d}wF0a+GqZLfSmUF+w$009>6PIh6yFCA}_> z%ZyM07r^f0<=W3y5P$v2<*O#qHm`zu<`!V{yUI6FyC=8Eza2gYzX{w=n@{;rJpTMO zY1emC9r&0{9R0UJs1lETgFx({xZadLM)BI{am}l0Yz}V0B3QZ$Op&`afo(P2f91w% z%h9zd;Q^|DuJ1xkQ`kU76;^dvju^+_?Q(320lty=)%8*=c(=3`RnW1h7lzZ3|&!@kj7zhO^<}K_{uAjm8N^wJ?o-zP0dXMFK)a% zv1V(|o8wsr0}uMbHn|Gwjf|(GO){H(I|TbUIWm8iu0iPo|Pvt{cj6j*VW@O$4P*t-2+;1HYuyseObZG+zqNEPW z#wv3i!Jeof2LyW)zx^l?U}R`I5WC6~%giJzlKcfQ`NQ#ZB7^}4u+D-vI7&hyvVDyO zN%36;&6^(!2Hnd|B-;DjS2Fvaf%ZEu8dS*{<~I1qGfj~5_k+OgGFoB^rsL5F4y-7R ztlfBlvg9&{yXUE;odMrOW%>Vs%skjoC#V;ZGj72*3jE?aG$=>DGlmOx<$TJtpF3`i zKX2x${QDlH@7FlxqfyRZ_PcgIU3%RMXX)W_nd-CWL=kj$ zW*&bEzmznXSIGCt`Mt$7nw}GAmV@XEP4&~2`%he|!d_oUiuim6o_YY7l3(VL6QYYR zifq`=nsSw=>QM6=%7iB8D`k3d^&ptB+dgEn3@Oh&{Yvb};Rv{T1q^7E*?$6|JBq)m zTV4`}zFm7!84|!UIot+WzZzUxY71UoISEJ&IzASe!HW7;&uQiv-bq$^tcssC3qh7g1w-wFjO&Q6V@A|i_+M=>Yc4(~lHwl;^x zIRxC}F;pz{m#+{yLeWz4hSr9+eT^&xu65_vuw#iEQ=1e&ZX(B2SDICdqf+So0DOlv zhJM(?v5V59W8L*9A_{6WnjFaMrL$#RkO+ZL3w29}klZ!dsrPmNi8bRENSzkSovvjf zEV+9hw}$sR79Mr+Ht7ySBwC2y9snZ}3f%=NMlA#J-UCYf$qNoxUyg@O0Q)mVSPm~( zH%;>bQ>WLQ&yEET!xzx$#~y#yek*WhR&9merrStAty$&o!9kX%ZAMGtbU@I-b+Wrz z0S+;obZ&k4zz!g?+>@=ZifN1U5t3tFOln%Lr@Yy&J3lk*B%oHyb6P-ZlVP#r+5}D# z_a?W`Gx~kI7)E07`j$jlX9m#3k1_N$ncY3)9Hvc2`mI>Gt#3WU*52&Zm;LJ1;3Ddf ze#HL9sF=Ws_6Z&n;z*FRlTcE5;n<-vUb$8y>m1Wk^1#ek8-rBGy$d#^>Zk6&KZe5= zz=9_KR(C~31|9i31z0JcM5f}K(mxBlS+$*W$*C1Cfh{c}&@iwP!JIv18UTaNt z=#;niy^Ia>HZJVf94P{{zr?+Qgv2$6`x;IHF7J04nd(932KYk3$cGRfkyy2jk~EA6Jx8&?kpIY(gr(N?5Dbka&?U?? zd6{v<&{9y!uFqsfuC%ZTi)2@*O8i`)N7sPX?nYp8<&N{#%lL+ClY9g=btJUb`(f+M zP*T1Lpk!K~Of=p((uHIV(R+C8_Ke-v6EZ-SyRTjZ=PfOuRGkT%Jm^q#ppJXycMhYn^mGJi zquUGXyQpID|Ds!>l9wTzs1k9docJKqSnkDpIlS}ZYm>P>@VVq}to+68EJoTg2_+k6ju6;|z=Th>~_v_P1k+cS@z7WPEO>ds;}B=vfrMP6jPo(MJU z9u{@?dDcANKHS+(QdJWH?42_t$c-(mZ=&*uQ)^zkbZ33s@V#+OlhQXY^>-MdfHn_> zYtcVrz;+q{lh1JGCt-Lh-J}~McabvWkEQaVsJ*hzk&?w37Z`hUD<)+YX~dHe6z}yX zi}LC)hDBCFUk>OQp$>#-MnCJCQ)3j}{2aU(qO5qCh4B|TfcSK;dYN?gmP9yoJ*c^C z8l^8+K8XYm4WO73Cqzp&#%IEy=5fu(fX5lU@jgWYdXsIT1z31bN%3XaGk{r9lb@|y z75HCr*#LkepqD6IY`X+GjeweQ7Ha&THlW|zfgjGN{&ak77F0U`FdWkY%~A1Tr9#M% zkB=fCNT_Y(f+f~>7pbyVOIsO!e)GWvXqbkV$WRDc9Are%s>^9X^DCu{@G zT~fbo90ZO=wQU($0CCpg~j zD{=`=>hX|)c>y$gQq{^Q4CWei3Ky(o2e}wdRHK_?vMfzoIhO<5sa6LMEpJag7^B2v zR@+kQ2C$#g6UhVGK@Sa8V-b1hZYP25kjSN3cKE%K8e%mwOx_M#+d*?E+ha5}XNIv( z!bt80ib+qNgii%ND?J}fxc+=&-E~$a_e+DH{D2|cdzzN5(|@mxvTAT}PwQc8XF_dm za&|`ffSN>XiygP7I>_;gIZkBYSOKGd?|~ISoW@7okGxlZ4+2^0eK-;Zq%(9`o2`VP zto=VLqeSN&0$;)_lfQw=i@35+v;0gQ_wo=d*am?y-^of#U$y>Yk7)C6oH`4YU$DJ8 zHIJzuaP$dSH0SviLY_?J^04MTW_I@I?M7Q%4@NZ^JNRxJLz^)190^eZ*N|GP7tz&?-CXv`epDX?j})=&=*mkUm`n~r{GK6LenU)aK7Yj zf#p{(BodaM_HDJ{iA{ zeslaTsvJfEjIem5z?5ZkbvFI1TPZTf$>=8d#@5Hs9nDU4vKwdGR9&myrM2h_T_|nX9iEjC_yt3^*qpou~y6asZo?5tJj4X)Y?eKMOITXOZIKO~D|59|Oa)<9e;I zrFA7TA}B#Ktw~8&DG*{pB>1qjIwAxd%MIW+%)~o9<21;bOiZiN8V(U!xN9{H&p5t+ zD7iqIgG&@5$IR~HN@JMx11+nYKwFD!BPuZ?_~H`RBq8t!JUsiFU~FA#4b%FxNrmMM zhyAC`h#DV*BhLfOy-;8fGIFf}gDSugC<2#ZX7UsAh-!4xmxaMTZxF>zSE(FaAb`uh zaz~D?59kECAxVq6>>|5fSr8cq%!*3${LvvF&ZTE?y>PsPvvn_^KO25*MT_dvW(N!w z>NzWSfjJ2x-rcuiPc`lSzxsI(+Ex1u!$DU1#Eyk`?1g{gYS^(y8i3B`L@Zmd)2XBw z*%HKg)zqX4S9LtxoPG&^JxJYpQW~d)tvsa{UlN_ zvqU#%A!(ebiHY>}=)_Ir{30PdkLJ%a#j4CwGM+;R;axtfinZHZ8x?N$$-ogAwy`Uj z&*j|H1*Qfre#ZvJRNUy+B#x;LcLz8&0e0>q#Mn0cOJaz=LSIG&*kf$(w?Oe?m<;t3 zWOGBrMUm240_N@zP2FU#v!;sg^#qAor|E%tf+XWf&C30p&l+X_G5qnBb~$Sd{!h)q z?jK=}AHYL_0Z*%imMr80dIc3LL+Xm=2m%aoltjgvUi@PglS4WLxy?2|pmPSO2g}Du8Um{#F5X@4T=&75&jh0b7nCvd8)!0u}vL*DLQq_A^ zWkj`TGD&-fXN{Ej>vC0G>)nq=9LU~wi4^JH6rX5QpCgDaAK+Js5*{kVK8s@|*L+IT zd-SZu%zJ!(B=ce~ax2sytU{2)GzpjMT1$s;^WF{!8xy*-6#gn@0fI*c6nH(I0Ri3c z#7A#vM+`Tv^eKjID$t~a0JrY8B2wn7j)uDeZTQ1nt2)fL?T?c0-gtbHDi0PPr8#o&s6tFFHF-C3x*3!)0bcxD3 z#@b4sL5gLxjbt2l(JJ>mifa={7uhBy(;oc#?QV^ypvP)AXzLj!xYbs9nQ|-FpyiDR zK=v@4f2vT{`+HF6s=TRjUhitRsUhHQ>DwcGKPYrqPxD)Yd=D|c@T12%$t*yeBpiX! z)MDjL{6uDi=<>ZSu&>VFS8IS^S#NZ47lyNH2sxBwLKu#8g1>}bOx_D(xD-c5G|CGC zX05YD-QhO!{|8yNd%BpNHyQK8h7P(D9AuAn5^j8>_PKtb6tAKdt(=3!GIEr+doM8K zar`h0@Mue<(3cDwT`cNGdP>D5$47D=uUH4)-TH*phNwA zkO;!0!DK|BctE0u$QAu{<7&6?&3Ii+1ib~{aQIHtYtXt>>>&vO&^~~!_zHgYet*xc zs3`zG%H-IWxUO~G0xk!wU7fflquFxL9p>e{oSDpNf2phfcN<;Oxgt1mx^|6mwEwSE zY;y@s(c>58RjURF*nbB}`Bvo7M+%WSY&b!3gFgP(Lnmw#eDL)18uqj%Jx`Js?nO=gh0@Y^PyTU%<$nC_ahWTK` z(TL3J4`%ZN!o&dZL^0-~bt+~zLMtt>1P^5mZp;m`mGpAX5Nu7KSJJT0%NK}XG&Xmp zLD^5T5*7VT;Mu%6shGq$Jva$ocNfD^5KT4j@&HwIwdvi7(A#!8n}AWCI+7}MNyz_J zZW|!V!x$kt07o#`#SAWG`c1slZ3xD5O}r!?;f|WA;}U&>WP!R=*OXkHGObvI!o`v& z-O4e?roMYHG*M|k#ve=Ou&Xr24>V?Yk`y{J|(7!msy%QgV+y~Ld=bOrl(IK!EMMdLpT}Ok;zjK9`e3v=v(VK z%6vC$l@79O6`u`=gTNrHs5VaySy!*eq+p8sbDdJuEgPB^_{<&aU$+?xG1a^&kGY?C zz7vW#K?!$a$Xw7R7oy2VcZHC(RIUM@NuR@IZK*DEhIQ{K8`Ma3M{tOCH#_boelRz0 zM=9Yid4e8pPlFG)QHiY@4u}Afa3k}6PFeew#ezxyZmr}1h^2DYS2{0X`*KChPRhxj z%R|NOe5Y1(sGqqsDLZpkjFTy7 zm$1L2p1(7@2Jq4=Fov*CvS0z6poe6yrg=D+{l}p~5-y-VKUSP67G{Y7vu2y$lP_`l zY#6q0{(Y1KyaGT4Xl#(Dd$n5+2cl{gR`+vNwi|v?DUihfzP@+{8=y5{6k48{surO! zvSilLGq}f@VZPYf`Ngqd3xz9{Kw(t}%4@ZUjaU`S+WRwF3nT3});s;l15*fXvc~BE z+p@RN$TIf%QA}N?K}tnJ;*`C)P)WHEx2HRnzd_j8 z7i88oXGxKwt`+V;lC}8+-dyO+%+f);bC$pTg3JEkGnxIzh zNF#dwQIBvA^2mTl;4e&KcI(f9m`o9wsBZiAE>oq}6pAF*bYv{n!(|I`viqZ)YCV}G zQ*k%mvnmkXAaV?o+@Kz7O#~&Yns2BQG{q7wDJH+e`;Li!e6ZF7k>*afKV#aY4wnZB ziNXjB=}IoA;%qTut`_3SUH>#88^3Fi3;~>3%n?qReN=BJuw$;aoms%-OY?=t41%;P zW!EE|uuYB(w%CBz%ok=E^NJWU2aM+QmM!2=#xA9ll=UjLKW=$2e$%^xWlN{b8ju)1 z4r=ZuwrEOThbhod>&$ts_;a(*OEDRNPv#Zs_|4o*0MwtNByQGs8f@zcFf`o4p%(!0 z*|08*p%iXrTKqJvu_b!4MjmDdzavb;CiQ4^(Kg!W=LR;s)9^TyNR38P!XOwJg+pcS z{EOZm+oG$0(rs7sfVrq<>vHNXoR272JIS%NQjuN1*(`>!A30t@i}^mS4+DJIpgoED zRr*czaLKufD8vu{ln+qwo7xI3F9MyzRraU^2LyEu0FCjTDR^a?F(u8V|3tU#H%kZc zxiCuj6g-Z1oUe0Z&k;+?Etnu_p3qZ?xZGK0&1wAelLp$mQrsl#Bm-YqK5CmQ7PfI% z2cF8az&G1)SnE(9_tw-g_Ay+)0HEO|)d_TV#Bi+d-;kdQB!H3)!Q3glfV{>48<5NdgmqOuVF6PSm~F=@d>c5##w*$V-scPNt+6+agRzUT9tI}{ z$t12^8cZ|5C`tj-Y5;!CV(2*Ubw?0_CfakPZZ}k}m^#X2Qr%Ryuj`EmkHX(cB40>4 zDW;fcrXujCE6GKJKFB3C{N&7)*X2fwMSBTHKr)Za{|q^;Z?Wa>s@D;@r(a)ljhVvW zS1mya;ZVTGxik-lt+<)LU6_vQ;WFpptJddng)v2$PH)PK4E7i|fJnRbR0mu}XFeQD zRsw@!{0tgC1>QiIGuDXPTe)uv`p_{Lu~?7sIP@EWVvKgQfk5gNMWrE+XWy~!|J6Ev3Pt{>Xkdp_jhBj6*-!s=>J zE%4OSxqjY}Zx(}^ZSIk37)%`5`zz-KO-^0O7)+WPHumBE><3+F*C`6Ga-=;A-_Waq zY>jc7Qz3}bOUKd$=Q%LTd3a&}Q*WdU;hk>@0~pk89p}lei=cfX1X9c^X;Vs4d&q`9 zO`P$|36=+ipkdMVT4ZML(wPzaRH&R2N%!9RcdwmA5&QQLPs6h_ckJRcC1m}DL+FV@ zUKjGf#1YC~XrpXqdO%qs2ZZQ6I~Abv>IT zp#f@r^*PmoqD9IW`BU_j2ik_=qr@>gM6;lu@|_>#k(uSJGlJxMNs9`-D_wTh=-yXD z3=d#t=Joref7e|a+losue~mTv-EgpI3voeY0PgE^kf_Y!Egc0`d#Udz-HBPG*)qkp zt>xT095(4Pm^zr)n^r}b#f zCue&Dg|Y`vAYzBkGNIWnSH9d8+X7?j=_QV@+d5^ZKWoSoSOJKs)Nz>Fo{EUUndgA* zdrQ$L+GZWh|DI+Ie*FqKX}ksqRA(J}>s)|Iyn+H40|Hp)tRfhaz$x#;1n7C#Fyu4j`_T!d5W^2@qa@z}!Nu3(wsEnbTjs z6P^qAu!~AIPXcXmtFMSkp1#u|E2x-{?((?bU5d~e^+0Pl2=Z=(x_W*h3S z7}ffHKqVTk2o0vHV8;pRi|2BFya^6ud)k^#W{YHA%dE{YgV`&0N~bvc4@5v3;&V~% zUk$-WZLA&H~>EGZ@>?R%yspcnI{DM37$$y8k5D2ONQby%7C$1C{wJ^O*L^w zjV5c+^&2eVJXWBkW{hci(IFSdrgZDI>MdL5QtIOqY48rOt256{Drksd9_r5{WiEMJ z6N;oYQekG`&Hp{@dqH+&h;t~_X52WuJ=cQMCRX7SCYzDnkWbpuUiFQUUVCP1h{g2o zVBj8A`c)tT8fTw3*^vSmcWl;L63izTf!tbYb#uEWoK7dj_JCug_sAi1G8MeVCS9Fc%hzw+b+>#~3`#8L>t* z1Oe}psiVd99ac(ebGbB6raHFAQOC1)VlP3r57lfBa1m5LbsGmy+1Y4vZ)#l zu`F6W@xC$q+A&b|WxjLw^SthK-KzvXVlyRx(nEstHh7yfu%p7w@@Z6CU zhfgp}HTWN=2`bbnr#NLw91?o*vb6#;U`2TnE&Fn_D3rVIOu%l^&9n&fgLEM_g(khc z5^hbPg*Oh@!J=ycwM^=2*>U@0*2%p6;(8*MNrqPL)_ia^&Sgk55+|> zNGOJA7>w3fBSiYX6{PibCfjsazl^F_X^i%p~xBq$}kQl6|YXgo6`9#t6sfdIzPZ>G^5%u^Hu~?!mQ85dm-Y{&#GK4Kylx|4rctIl-RV z7&2V;g9nSC?0m9ih;1d$NHDzxl{Hjom%6%oG=5D+v>P#yrp>!jCSlDY3(J{NIgCBW zZx|p58Q}$ApX>bRD!I^v_=D;%xj!$1-s65Bi`{h$=knor_ZLmexn(ylekqHg-{vD2 z{AJHi%^#8tNAEsgBqdhCSDJ{lX4R5#t0WmyW_H=W+nPn zf1z#QurXDc_%?#ohe$nF&^MYE1R^k1HqEvaxZC!2KTbDVC0)CZ`s)alG$>p0Bv^>P z=@6(2*0ma^W6GhMmW%^&Hw5K1D?dLlDg2I1d`iqw@}{&+=e!pGYh}cK_e&etFn!3! zX0v|ulswuh9t_`LId4!?5&-X8wm18odY8oVvm;smN9}8O@Tr-sZ2kiZ>*9*fu(Lu_>j!m{n+; zE9w~8-;bKc*0|Kll=bU*qPT_=>Wpz&i4%OO>NSv20Ki=nCRaRZCunQgzkV;zv(kr~ zOA!CncnS=un2!t~>??KdVhWXh>o~QdKF&7bF4@k<3e~$lRV8oCnMIF5jFWdlq`%F| z@oryagx(tD>0xH`xnX5fwYat-FiG)(v}B*-iN>x@qIp?JwfWa>2_q74U=q|ST5knX zhd|bLguE^KtaJMdOQnungh|cKGZbM&twe)SR(=u84JzeM0Re*)e1iR6a11l4IXEM0 zC=(FuA`wAi5m2v=%Q*-^$ArHk52ExZ5;B><13AoWEc{H%`p7W(ChpdrUsE5iPfR+Q zZQF@Lcr!!|C2GwmSP6FsWFYiPgrN}#<+ZCYWkGb&tLoR_AH%j(Z&x0nk#u4I$VFOF zocvT{DaH%j;p7-gXOvqSu7i;8WztU^DZzSY?(Cm1xp7!<;O_%x_LD(NaxxMS6fM`| zM&Hn`V%n!+1eG9yseMsRi zTEaD^+U`kJ7<{dqul82zjGmxbs>}3NfN_^-rYGa~Ydh-C?(~;So*U<^W}6ED@T0yB zWGK>!N}+CS@PWio8Va=Cq+vP$H`eRCPxceT&}K3S20~g0XCJFzqmYDEuhuypk3f{U zl*JtTEp?a#bn2;3Ff9ZFV{To`w%1Ur2v93Qtf%OxE_QETKq#j2h6n9m;%|+ifKy17 zGZhCVLqAjS85|uBGh(wh05?F$zk`r;zP(gW^ut{D--ep*TqtkqY{wWz3+yIi`EH@r zze{x#*OuT)C3YkcC(H+7_}__vJqxR*j#N?~#|U=~DunTnMRB8!u18)%gB~FXT4=12 z47U^q;_^g!q*rBAJZxZ-4#>LDmS^ZU^QoPCW%lp@&2{^lmT0p2X<_7}NHAL}4!o%0 zuHq(Z{Y!Wj0Cbd#^PX{j&E7!HpO8^Wg2eJPoAxOY70T74AlOv+!UHuvgBbm(pDN)`E@b7KmF70^zQrf-VXzH29 zcu-kNc8qICtii4K_nt`u3&e`F9e?km1y_?h=WX|m{HnA`>ihJPB@TWwfv&3to+88hD+Mh}xWGq+>b{v_#(|CD zGoY`H~A(siByz_Bs?0)9WZ5vf5stE?U9r@w)XVVRRj8 zz(BP1ginnp-^gR(gLfS*G(I?Osj2&M^8USst3jo%$Uy;SBObCc%%UgE?e-Nh7NR79 zff~r$xNZp%oc^#Zs5hN#=Gj=lmI&S8XO`O*za;Qf8!*x7B~10>udzu|remT-^^qeH zda7d*A!@7A?*Xp=DJe_;ugS^VTv4k6SOa;BDu8(bs+gyR)xaAceUu5e5<9I!H-#`=b8sYEjO zg3U6UgH1pphQdmQ_JZ>BpNk*LO+84kRujm(^u-o!{QZqCtGY2(kc4oGQpQm80#38* z@gc;iP6hyJ$NcCBhy@OH)XT~+(7wh_jAgD?iRFO=(me$sSQL^TR}l553gbpa=>0=N z#q2g+loc2EbbeN~LfwKB_=3cP$k4C2j0cS2W^+QH;5#)1Qv$s$FH&wE*l(Wy)OW{& zFs0y}g+V{yn%gX!2QyfH(jq=H*}$1owgt#Cj3sQb0zsJ?s4R-U5tWuZ#D(D|Kweb< zOfb;DbWoa4-OWJU41pyE`_8IEofvx}^zXL~PnI7PsGIE3^r=1v)`fhSU_8f(ZZ8RS8y_&n<^-=>8jfDOa+>%^i}2sw1nl znNvHnj%lt=H*1i`=eHRvUMx!2SL&b@4`yW$Z5W_# zY-MyG#=1q&Y`QY64K>w-UW}o8d|6`A$FFpAn}SzkRRPVaYBOk@`#W`kvusYuMjct` zZZ!R>6y7BHmtQ)}5C~!NhEd}DZF{nlQP2dU_5=7Sp|?(D63#cAMBdVi(x`we0(G{l zd=a|vUA)x(2aY?|~-6$6{9+kk)o%^MV@2G0=MTjDG1)JS&^@RQ(^jU>s}0+nU8?-Oq*mw~0QaCNl++JT%@T zt<9id7@4xu8vR-J%_x84U3dYV^sbws%-VAz$$4htLI-=prwp&_T)t%A;r>bAgC2<+ zKrT^WR4wYN%DZ_WFg|8ok}LNZY^R?{tQ;FXxCGQupJZ>lN?O`Jrq>q z*=Pk?vevO|RxA#!7}>y%9Lh&lc)+=#!mncxWl1H9ECp2%JoV6AMG%I0M3z-oA_r7_ zU~Xd>!u*2dgxoBVJ7e<3HHjXzSPIRVQQWcG6nYiWK1_aixo(mP3@tyl079wAPyCyX z@R#lB#@{7)v|j33&#>g}zvmtC(UJqx;MwRS`ZWve40_ft;p)B8` z*y;TJ^`9a~AG&3Qv4<267P}Xkr1pS?f+$y)P*c85jov%l8Joti@G!ta%aaD5nJ}Ih zCcb(VT+x;j4OSW?{Ut9FYa2D>Hld6O=Jo>bZAzf;LX}L)_KM0_xUuzD`oya0&`2(9n#cr?4(j=M!~Od$}A{1=UGS32e*AI`A8U<~qJmV~t9Vtj`0LaT(yUX`vM_ATE&Buog}dWAgYz*dp<1K5Oo)$&r>>5+v(C>@R;CA zBA^k@-HJj1T+mP9d6s=)WhIt~Fl*bhXcD+jtY_Vnlu%o?WpS|;&Ll1Gd$-IPVqmSm@yXA}I$oJj2ppQpzN#q6KdP zydw_kQHGA$z%#lw9U>n{7FAuzH5$3P{xta3-`C)t2YDYDnSfPLQZt!%^XrvpPz+9X zYyV_gi>4SQfOLQ#PAFkMK&>O#!ZTIXHy!8HWO-vW&v}mEap)?xUP}ZC(Bf&FJe0j+ z<(dOISU?+3Z?p{?0#y+Rr?y()ql9d!{EYhyEa$dRJQ{1HbjY1}{cF(|Y z8)A?Y)_yXCTRz~0K&MuZ&i2_VTt=G=YgSC8ZrHD)h;B%w(3$dJk9q?AAN&|FF`q~4UE^|DZ?!?{UFBy(oNC9Y&LM`o>{^Jq>YFEk+C=kB zZ5q)24=-6amAF|4_xzwP;sT)%de&_|7T@NB?c>@(|4MEbq>dLM4uuu$*EYME7odu+ zTe{`!k-v!dlBAg}yL=@I5eiBRNd!b#AGL@pg$_9Q3C7-H1lh{&*=x>d$9h-RSd(e+ zneT2KWf7p=FwP=}2|&`gBOq_1NxnA&SC`gRg;azKiFFqR2DJaWTMUJBW~yv_cqzdE z!?V~yb#4J@#9KtdQRfoLSWs|AY#z-f7V10TDy-{k$fP3V40*AGWz3Y((DO;fFF=5+)knq>H~g z=d{xK22+2Pv+hCSdRA;bRk9eJWHfQ={1V}`_)@`$fl?a!dTt!{J;+{en7;}RVa%KE z{}z+Wj&sdfFLY2Ka`fr_2bwS0tBT#(^8(-0t#Nv@ZQT5M!oVKSqvESRh52 zG712{H{u=tZ1%)f_sFm)Wjp^muz+HB&y5+CZuSGVOQb-iqvZ9aOb1QSWE=P(k+Kog%1}F3n{%1<}5IQ>D37&2XjWB z$)-j<@N3Ue7ZXm~HvA@_{27_-$xk}6q`PGQ4)fr%R=t~0t6q~1FkjDdP_mNLxlre_ zQ`t-s((CXSlz|G5Y)^1Rc*Z&@CG2|uh|VzSf!&~->yd@tvwK_vco(A+py*O7tDAaZ zCp&C9htWq)&=zW^@T3#I6@-6_lWGKWsI4^Zg-EvW%APpcbWy6^D|nO5`iI^aQV)|! z`q#c$+2$hMD}rv`HGJ`#OZV$XP1#-auNvKoCS&ZBT}#rrk$pOqci$`de4buz{O5pK z5RBe)aR_dp=c$d|(OWYhqLfEc?{|{df3Dj|T-fqw+EYL8SXsv}2pMVkX-p+OD64Yo zjw2OcYkLQn>2kMs+>{QvpJgH@^|q<5be36FS!iy6iy`M6=WbQMFI=uH ztIg|of0$Eq&*9w>$VU|i$_mQp*8m<3^TD8>+*hrh274 zeaq4tnXJX%DBDlJG7{V)JHi-ad6^dKvhni`oUw+-sALOalxe?)wTJfr*0e7Quk{)8 zNHe9esaX29&?LoGXGdxsazlVkA;*EpFKH^KETWyytoBF6iNry78?;(n&|3hJ$$&P* zWTJ19HtK@?mhTgD>KlXh#C7sd&Iq`~?G&;>;wXO2wo9in=rNB?ZrPK>A$*z2PN5@- z9`A;aHnYdqinH^PS@R&=mhEca-SO%^lfUqJq9 zW!H6K6XrI-bI3u=??BlS2I~%=zh2X+$owc2N98k&Q+Eo zz@hp0PcI@n)d`s?p)ittQkcg@Kcbg4pTp+Im5~aM7DsmEY?iTmNYSlnJ_3^l2@vM`VBTzyCftqt##1r2GhXQX{l+50y2*wSXtU4W zz~EgxosxreuP;XzZ1mjaQLajv=!@6$`hDqQu@Ee@h>Q^jV*m&2dN+@TZ4&sA3)wZ~-^gA(T38T}Oa|88fBp4qp{YK*e zk8M}&#+vH?9ALFOa&Jqdk|24HX(FF&zrG2TQUW@GDW*VM?}D(tn7Y?g_y9}Poju-5 z>XUed8=T|gPU6wc<)Z!gQFGOk>M{m|#Rp6(x6C*=BjnJ4)ujA@aiaXaBXp$a5dUKqV3!`3tP1$Jw zUGR|eJ}B8U8##t|ON}mcmqU3|&*1E`mJpeeqZ*3MPKXZT^m+_*RgTHMor^Lj`!H-W z>dwUL8Kst>Eq{K^`%c@FwCKeD84G|K+&S=jGnR`UX4`KpHu5HT=$IXjCg*}9RNmk^ zag7~5GwGAgbxf?x#jwNmsCm?zgBRaUZKtpQ)C) ze+iMAB~0}pLmIvjkI~ZAE}CF z4Z@C_%SWF(as?9g@U+0%!fAwE{e~pM90U7v-Sy@&|I4*>{+3Os3AIzM@4!{yRKWJT zlLI4{`I;3uXU;FY+#KqJ=x43$jCUy)zP-b(EYQ<$Iyw5Vtec-njQi171TlX%*;icb zhXW=RR^r#uVEZ|Cj~$>H@Fxl*fC_)qw2vCyzpZn3f}2$?xGj(94y4clV>6%ptJ^T5 z_Au@8hW(*^)aK4E5QMDUtb2?ZR$0kOS}8`}+-kWdA|a4UKSug^^}-J+dLufvypNt$ zf>6H6)+M#r*=*Qep>*@;gRXZ&J0?O>3rx#dhG-;d|KK{PBVk{J2MDO_FBh9BYf+x? z+4&P8^y;AG^@8-F@Kgf{T;=fyBG z?sMw!owP!rt)}~RH$69wp_>tj>7awrH8==N7=3Bo`AzF5QMyRyv&UdTdNjH?&aSse znElA}H7M)V=VI>v>2Az}XbmqvH0P2?76p(QTqWX2joJRjZ{uNgaw|-p-f;3C)hpi& zxOz#`PM|Hbj<7$79d#|4bVFSZ3j!sH#&h7X5O`i-_H@7KTA@RA5~l9DLQo3uvBqVK1FsRzkqi_KSCw=WeDqH-y*lZa z6&%%D+RA5Ub_Txpk?qQUqO2uESu3e3Y^i+SVY-=Aqw_jJ_Ql_BQtkml$#Wim{RNvD z%XvR$QBA*=L5O7Fi4@1 zd*{QiivS2jPvvt2yLfn3rCHq5S)MH=>TT5SOyX|>njrlgl4z4OH+aYZse{2JE}%dg zd%(csstUpeYqnzfUbm(@X~QE_+}=e!L;jdaS6z=;^BSWuLZp{H4BmbO>uEVjFk+6Y znA@>cU&z#ru@jgUCLF#X=l;wA+cvJ~13YH()%WH;_XBDYLML&YmKTx1aM(aNbD!v_ z^(^_)V>YzWS#FDyxrV~}{4-gEjS3%-i+u6;g0kAi5MYzpdg_A>M4A*2&lJF}Wo%`) zUzGp7ax+1Js1CrPt17h4qj%65j%yE36zUfNV2FxH+scEHZfrLQ!F&&B(E)PFNGVgm zm*@gbV<@(f0W`<0h~e*5K(Eo#4LyGZQ%=yAhHaw3N7vJQZo)OUT3NVWX2q)EbSWqI zw*54epPeHK4IqNP@mD?!bhO2S>kO2?l<3_}nOX_Alw6Vc^cY%1bEmo;l_V1+z1dCY z)x=yT872pSga#!C-E9k^qyU@!vwT2Q57c&6ojpg41k!cm zM+83FC3v~lSRI3U)a7J~&wU~z0SyWwXP(Hp2_jB%B1D4_*?*^ZdgsUbvb_KaNIc*b z*bA?|KoMS3CRG+w@R>#_3iE2wTkp`8G}T43KyCTe2+9NHf;(Sqe!t`20n3h<=r>XY zqAHrx@_OHZV0L%90*E6WA89HR_71()Uwg z@r`%g8;~E>bGHwHn1@JIY%7gKHpb#DOBVm{hC#Joi$;!+KZK$Ei(y8Q#8xP442^Tw zJa(Tb*NCZyBmVwt!tbRj1gM+BN6HG)rqoPTlcUt89AsKniD&KpHsfr$L{Wr4nR*qL zhfmntKJt6QJ39jljyVUDN$KYok^|FoK(b&_%UGayy%K>zJOD!HIRh{+bQ%y|-b#Pf zipBjv36xYib!n;N*e|YxiEFUuCj>J75%E_?PUs~2UMEq9HRPc!&BI~>kNf?Q{gZBH zf=0H(YvhXnzqYEi=M$vMmxnQQVL^lwo-Y~-5#Fo0m0r2yC~iH_eb7eIJ(=HdNdCeM zqf{stN<4UG1>A}AJI8HrR`TDUMt-<<^&(Aa;}~-=ot3OsOKQ&#|3m$|7TkT=wnYI- z0k`x&W>ui0M2%3y4-3sd!x+XoB#!`b%t3v^uN(>YOj-}ito%Jzsd=spS@$uXbV?xJ z?$g$VtEt}O8jy({uueM$u!Th6%EWK|&fqGAj#WXQlJ{Vq=TxW^)9vo%-WeIF;hKGs z0CVZm2-4WkSLUs!Q`BX#;nmG?`isU?8gv~ayJO*KXA_WY$8;3%qBG;>ywMR{C&Ik! z=Qd+^AEDw4_0SfKQm(aiokIfozZwFa9HY_(nHR2`1KpZpq$%EA!AB|*dK z#Ce2aYk%5rVd&yG)Pn_4ZpK_27>OzOYzrHS6FAM%cJ!zZz zTx^y;cbbt@WF*>f6|!Ji-?*1>Ow!p2MUpbSJ8(i|tHRNV;GcRPWib>f1dnCtaw3>R z8+X=A>SN5sVL|}gTuOR4Hs>`ZsmN!tb~;KBtc<=BvT=7dX%!X_4%%2u-CPm}yPK_; z?X_nh9kiydZS9P|JO(la4Ml|aw}XHFCR2~yJQke3Q$D1k9$yfVJ^NRbvMX_~c!{Pc zzKk6zVT;l9tb*=k@rwV2%C+()8~whTromysAF&z0>t%)}jKck1GwzG-t70Q$IxQ(Om(VaZ6P38?5e@`WPE0|>< zbw=Xl0+xqUvV|AYC4&MjMJ^{R0r59;y$ehUM+FS)ws_);;Ix2MfJ3HW_k3b4$AY;w~;a%AOZujq*QXi z)qMOuNM*`2`O_mN2ZQUAfHAjqPOB(!3dW%o>c3c39;lk>uXfrDEBi9$ueEvF1kl~t z)~U%~Mu{&;oWI$PVHVn2tTAJz>lTQIZ<^NZkF9R4_m)@01#P4StVfnFv7@`PXz6y1 zP!qe#4+**P_yNgG>r1vb1EWW|@iBPFvNzPc6t7{yJ|h{$K;y}94jq?xWjTIsvM$OA zKw|b&jOT+gHVf=-qL1LTz5JvE2*3bS=hVqj@*cjR_Fb@MIkCdg&63S~AH$OOrVi^U zFD=BSweNOj>%&1Pw9J5QRn@#ZuGSz`&% z-3Osne1K;NZ$0EV2JS8tyzKa?cW5J`7P$4@#D#b@d$b1Id;3SDgW_+@+PkS{R}L2} zr5(Hv9aGpik_W&Qev+;4rd#%KW~6kq`=f@FzR8@@@yC>qeeEFw6WDhzH){D)xa7w;mpD^3)dpwQUZ3;+ zblgbIyS6{*Dcvqu7zS-tDM4U=lI<2S)dBnkj`6V%P(PiRqkVkRbe0}e!?oXo4SLkH z^ZisDHdvQfQPJTHKMTn@|3-qG24h%cke^J?O!}rOqUzvK0@TE)9h8Z;&$_+#tr5tE zQqP^-zrxJO*2%5)1-5NzM?zsX-8!frALnR2#{3BiG$>b&ZSd-8JQ;^_{pdLlc$2-o zhaQD*nI<^1hiOr#F~{yei5c%vIoCI#8#Ek`+Cxh>mkG|E9hUD}g_`opgCxpa@6yAE z2MESe(9a>Ib)IdS)HW{DAkKx|L3RN0=}4|O_u zZEIZ*F0pbUVv;+R7^~XoMApcppt){=QR0FHoD{oWBUaxEGc6up$mBKS-5&A43KQs@q-b$h8BC{Z~q?pRQqQSYQ%CIHwaFtB8U^dJk(hSmb;NkK3 z+1b*a;*}kppQqV4u^z?Z#NZ3X3fj$wS!3^<8Th($Mq3PV7n<0-o={C_&aU~hJ*r-) z+NEKYpa&_}veL$a*cP*caXROm6?uBxsn}F7$U*o6l&lM6p(ijo6LwxM^J1JISWW~_ zK}P$Q)@zOvcJLVk?pAO^JN4LO2nAS* zPk65jb<4V1u=<3}m8RX5PiM&Pj#4F-jc{DWI<74E_#wNc-We1~P`#md6B>reP(g=( zXO!HvX_m~ue{4YK6Ieu#4r^Js=t8Wp-4r^Ip70|G5IDX$zy!e?B= zR~=+7@^Q8f5>PY$d$ML6kcFK0Tp3GxcEid}p+IWa`CNeNHmG-N32vAQnLEvo~ySDJ&`E=)2VFG-U z32L}yH#k#4;qlHF<_ap}G!0rpZ^Dmz{&i2&WI+A0HgPJf5qiiqyosh-ZCK=D z7Itcm78+@LA-I1$(Ncg<^rfLnva!6|M$P_Pw>$8O4TE8=LY(~*=6Ig%kMrD#PE<86 zwn*)lrW{}0GviE#HCRL`P54enq)XjG+MR7}3P$2bE7W;5D*6^pLVh5l3h(cV9Tmgb zp%6FJvNRT*V-m^!i0X=Gt4cH<%w#_hwof|2Axav4=OY;J*nKV#bE0>~$73Y(MOps@ zTgA_?Acmj|pN1d>0xL5QJQ0~Q1ibJEDq@-9cJc<_&!hdf<|1G}snA2Dm6?#v3G8{& z-=s##r+fFl2-AZ=Rh-8BGyI~4Ud=Z9D- zeW)P3`x-$4#mL#9`|M9q$<~@xUyS%AM2anyzEHR-Y0fqWcS>xlchjdqSc}z~Kt}FItOJcar932S6xds3jr9E8mR@1u)Mvk`vNHA8WCtB>E_D1-Io!g zzFp^o{@HYhz#Vj4TO_q_EMj;p!vI5vd~Z(N#NiRL1~#%C&qN%N$qnz`%(3%id2O zxO$=wsdyK=S34L^g0`wAZ=m^Y!)%v+{^Bmpz@%5ZDzFL!!>FMCG4sTDrdJ8R(7SMo z14X6U0*(0ZHklbF{Pd2&myUFlsH3^l?4-=7zq6$U-i?*v+D{AwEDJOcB+r;`mBAZ` za*ciQk&@k0%p{jtWCNVK`NYQYdRK@V9<^OuU8*FDW$^lo`dcXGd#Q}{dugmwmGn3D zx0{6lZ?y9ht>v&WVxbqG>a+%F*ZCdi(FpDCDToA{Lsjk~l(}pC48M=~+)JgAVXr(N z2*2;TXr{t9+OxHNf&2@x+(VY(qcHxVS6$qICUAKEUN`mHC{r-3G*ko7=uoH{Dbz*M zxnekA=OnXMNgu;-t5!6~LLu2eN2FyA((b<)#mW>b3*@#nh86OtfH`l|Zeu-4Acnb9 zee=9OAOBONQKej~0EGI5s`O_I^`wU;tk};9sn(SF!43m=8oQ6A&fEf=`tTD^n&jxj zX(pm%=*#9z{|9)URdlCV@tm$Ob$Sim{+HOUFUC` zi`#bjWFr*!rqC>|Nzhi80wGH#ni$aT@K0x0OnY2PTO)a;W+J5m@Zqia_ag=|pjG8E zZ~8)UI$bBQ_~NK(vdabYGVnb_$;CSK`p2~j?p{x?fzE~ir!INAAO~tFRjxD=Y!>)% zHwLhZ?gTF_7yS)fezP3CtJE+kByD~`G;rb)waGCPRvgRaaoA#2fWlW)*37ge_`sh) zIc7hs^e2(o*3|+U8ykC1X3%Po@Ky>ZNLt-oQ?Z&93OasTzoH_^_UptS@Y98%3|mC? z71o-Ip4P>mVx5LTj)Ci;(KnRlp7WZSaKdY~Bv$hKR)JV9MusC+zz4>^`oe+t{qYVL z+^yhuC}!{X{+flq9Do)SPMH_AyYZ=t-)SMUCCTPi?jpJd*j*P4P3f$W>E;E4SiC{q zLJujN`^>Q1tsYpa4QAfU}g z)lo9_Z6Ut^V~J@H3`6BH z!`~NZ>(^2TM#7NOp}&nX+aa(ArKvBSc;dk1#-EprPcyU=LJx!uRcCLJaMo23Ij*5H zRmh)G-cqe?CA^C|R}0cW8zU!%a?(51=-??Er1F)u5z4(m(1Bqonz_27E3xH6pad9Y1sRKH z+?zw=S0jr72&{8J?uG}g^h%kjz4@aKH+M2L_r51fSqMx6%w-B?#L@!S<`D$P2dD!2 zKL#p44;+sf(&rJBLE0twagapF57s$FIov;OWv=0tAV2Ofnw8ZK@l0$xTuG;)_WY0%m zn;xMl(OJ{h!y%r#lMFihaYMx~Pq( zcx(Pn|2wpZ*{LUOLBY^Kxx5Rg5n7kisUxP)ns&X3ayfUIa;JO2kW&DFi0h32C4`(Q z?DvMnW%gX%Af{2Fe-hf^hLUiyuf$7#nR=uLVvpn-j7{AJ^4%@BkC=@W95ljph;3KK ztJhE4zskojP&A0*gtwfcL2yKmzVrf1hTwt-?(+y!B`XFl9D(8Vpe#U{VSb57;YIKp%9;4( z-3<{m6`M5&`H@EYIR-;wm(JURB_V(+*fH|yuDzZV z`$OX)Zm+Sv+;p^J?;7=Kgv?BYcXz!GFF&J=RQgEHa;7LiO&7n;4~C0TVp%!AK5~c= zDX~%*$awlqUJ~9wNW9B-uP`!M*SS)W1df1s?GkwQFU)fm%CEP7F~0e}r%>Qb$Gn~u z%eQ|ouhodWmeDnfgrcbIEyVa|!xm26u28Ma1erN$+C&v)VFDK!?6&DbC?0Oq1)lrelUgY>o8e!&qDUrutF0mp0R&6i zKm{Wx?TGD`Skg*Uq4Dza6nOP#cNwyb7SF64aWAULf%Sl}WKOrIleGk-0bS_ok99=w znIxCR`4|H;NjLO0L+n~G5=dB`nnodEl12spT!4&`2?q#5$Mw)=x7ptVbv3tDwLI%DO$Gk|K z@jMfH`10lG3@R&uj=jh5d=zW&#uBndoho$MNZ=AH^ zPb%Gv`tbcxl~zfyuWeqM#?`lhUfn_SP}Z>q0#t9L;P68bmCtKCZvY=fXsi_GyXmI(@k8w_6|T^*ZHp+oT9x@+BZyruYQqglNR> zlh0HQ+G$lFv&v<4{a)_hj;TEDC+|r5Jc;UQaq8Q<%uHN#AI+}(1I)jp?=TdOwrul^ zR2*>!uPC&M8R+A;vV2tL;c=24JlXT$Wr9Bd3gK`oDHM<&!6H!@t5d7bZBX%lTFyx3 zkktja-z4FE*v(cEx)bH}0`k(c`f(GySV>?%nT!+{Zn zXP^}FISj!zQuXr`s1j;Vg&pk9DDos1?UJV`wNbNFk?|)xIS&*2_yd4t#AJ||(i%}* zabrNphg(*sYMvw#2P<uLWCXn0%j@(#d*n9HRY5J&SV^Vi$#uC_W*R9F0p* zZ|hZry6)2g*RN$mA5$@I0|d#ESUPw7_H3^*`?)%HSotIBzZGJXpNz4jK8RU~NIz04j3~-RtE}6 z2n4DlD1h+Sq&H(+(LF=1k!hq%Qdjv$ zqTV(w%+aWLx^fEvxVwbKn}~>bA){m0L9P3DBGVB%wN0-J7-0>3lf;;Vv49|_;qX8B zXSo+J0HhW&LFe{{?hqunj9n1az(nBu^n<)&y|k%@&8hRgLyT(A87NjJ76J(G6{3l> z;`ydWT~X8(=kTMiP5oyxDRKBeE8F7Jw3TA zF%eWb+zJd6z!3ZiyIS`VKDPC7D;7TJ2RZ|5MN%k^<+meZQ?AL2jHf;rSpT!9tI8S| zjM8*muBxjd8W2oLs*)J7&J4x}rFN_cc{A#)ppqfMKD2k6*rowQ3wi-~b5YLj(vxLj zVjtZ?5bZ;RGKZsx`c+Jc><*Wt=)-NT{43mv*Xl*CIO=HTa~+Z)3aL5dyXYIp0P3@1 zr-JKtwGp%-%!}q1V!JCmyCmwk?YOWdxW;C6Zu9idPaZ!`$YZ5xXc{H0_02GkZ#r+6{Gu9Vas4x!Q%qN17r5!F-iT6yG`Lk7g$B07_QXOO znhux9+;PBiL3)xM6}SD5%+ipeoMkJr9|Xp7m(KGAw1*Y|>cgR^%FJe-?gvML5a8}o zl}3eRx0_x3%nI*38KM))E$+@t64*iks4C-ZN|G_|tm=BwJmj_)Msj@U^A|U?6L5}+ zJ6df8miaSMA@T&3HrRE3Ly%$`DDYBg*a|QxJA3$0(rcZ11w&2VpHmN|&W8fI;;xGl zj^B~+VWRw9%llmVpT`pg#lwMul(ApZ|8$!ndVtsHWm}6sFt-l3mJh~pp`;A9k)-(3 zXr6w?*uPa=c(T&p12HM4S9+atteO2J_3tcB-{x%3-dVlxiyv!$!|l735(CdoG9`>z zU>gI8Tp!eHXh?5R6B7km;Yh?hZwV`;H4WZ;rljQwKeLxc6L_|@n! zp4`$)M(-xoq=@^&!iku|C=Ah+(B0wY@sBOw5+kY(KDWB~V$1Vm#f4mVn3~Qn7`RWo z0XBlII!)2`0sX|cz?`*%(!(6W>AOV28aDsR1dkwmR2TFVXszIj2WzS@R_FJcPyJtT z&4|a>NnUfqm&j~Al%F>C*1QZO&1Z$rFv|PK7cx^<(xTv@C90KRBwQFJ8OTK&?9(p& zUSz8XJl+aiKs++ZjPviT#vW4wn5?u6AJ9B<_nloDX9$w)JNFw6wEJcf7QA*sQgtp| zR9AIic2Jn>**HCbnI-uEHB98{<{sq?*H@2uxhJ_{d&SrdhS+gXVo`F~Ak&$awqedz zU&)s%kwOCQ>|3IuNReXmSu`@t`6Ey)9<+WeN7P#v5y>qrwa;BXI%L8>-Ee*Q;}%K( z1`knAtTtUeat9|cSn&5RRE?;z!QH6djm<+b7>!KyQ2Xp}#e)S9IHV|B1Akqnv;GhG zAuAezKmm=uunv`?Tw?l5=>9hUrbv7cQ}roJjh1jud2hT;HWVypf&0xW63R+CpRWz^ z5-UMXR*-$lqU}ED7|^sRCY5usX{pnPURQO$?qtUON-%Jh+#G%(q)y02e%K|xeUmQX zx}nJ+0QMiX`i|-0HJO;MF9YSu%(_7VT45rjtP>pmvS3hHa9N>y13)oUnMt9C(1-QNfc93Rv*}J>N3nxf`_-lUavXH1~ ziKO1+uot4+tm=&8{`vUkMJ4fpG8}AD*ID-#A8X?2;v>5jwyo ze1~C}G2&*?x+Nf=J|^%&o9eo4nG_^h^%JDJrD*f6kzgy->*XMtbwEeTE*tH3k_bc# zW*eL(6UP$%vnz9ZlC$rsqlB2R8f}r;>w?U{5eTN{p%ds4A4jGp! zGil$`AVUCUvhysV7@~G3Cx;NW`Nc~K=Cu;RHzU|8Wf8{8bd99jEm!N`yNNm=$N{g3+CUzgjSl=Q2GU2u2? zI$>9^Gi)(SdNlnw;~E5+9?9n=S&qe2tvck#vM7%T#}nq_G;RZel6D$d;I@Q}FQdW- zOfe2obOD-y>Lf#vk=GCRsrh=^&v66Z4w4SW)>Q+z5~ygq-yw{IHQG+N)zbjMDoFrH zH$QXSWAHC#e{%5bR;L$~5z`a0)$U2X_b}292IAeT(3e5V!9fv z%F*~v%LQWkt3tb0YiZ>4bL}A>#7Nq$nptjpUWH^M1X8!wCMreeQ$vl}1yXiRkR?Sm zsg&O1ZW_vqF_p|+-*7p~^-odfouIwFokeN6U8~wwT9_5C*UA1$w$@-$q-_>$c+0hc zxXVP^6idlLXpeVi`~!M9pay}12;ZGlE~C=BxiRGbpDB2Y;rqDPSA327v-b`GZU@`J zBh=3bwg)?-!}p1IVl|qUw3{ylIT4)gy8q1Bjqy)A_T^1!7kmlO-#G|_*)Dw;`)U#v zT`dk^pXHMPT$%|h^h)>tlruW96&veAn@|wv>S)9lRQ3pV;RjGa+XeH;wNNIlJ}MN> z$Bj2LLNEy%%Y3EtbJLGsSU8e!C>*?djhmK?XB63EB&INC4OF(Qk$CkVU3w2J6%=)u?wlOd zJJItx=hput@%e2~;l!2h(A&VAinNxJeCxQ+$`vx)4T^R-f8kQL$`H__FK)F#1g8&Z z5*A)Xohr?=LD8H>kLItmVAsJiFPKLe1;Z! zmWorWKljirMZD7)5QHJ1Q4H8wsSC!CAPJ_dt&TzC2_}@Y(f;ht^kR^QVxYg($x)A# z;h0)wZ`585b;6ivT7t%Mrqn$ceDlZ{6OjJXVMjqQ6kx`UjOT8!A}C2+G>af96A-Kt z2`=edSsbdy?Q>BRktgyLPVhC?NGa6=Y~2@#(jc@OQbQpCwwK96rukD*QoaWGb!;o` zg8;}XAZ{{$yAkrgwKZkmr8qir=uwfe5EVqw)a)Q^G!6MYTPMLn8Vu`m2F`dOqH6Mr z`OLh(SKO|wTi+zljG2e@S2JVX=J!kgu~1yKj(MFgmSqjm!wo+YgW^A&7~^k}V8v7C z1P`BOvPqbe&_d{-)_wZ>$lh{cLX$kZ*w&XsP3D{kF__nY#FfVaZs#jOr#mErqm6s5 ztb{*{PgZa6X}7>2**YQ?(AG-mfShGzDrp+WD!AGiv1QrU2tGXv3xRM?9-BAqjvr1M zI!J>*f{cpA5M1_ys`@d)vL^ohpyNl@@q>!_SL`nDf9`BFp&AYkB)6;7HW9Vs+u$Vj z*T)x+$Eb`8*)fc))ZIX_<5;a@!)`20P#pdx#k-7e=6T)j6`UC|A|_E#{0@Q*RHeg< zNbJVB_Mo}ETD8{bJ?v*pRtR!enogYeMM42>iuI zX&rP!Wh)r}{WHo$&+}-ZaJIM~<7gR_fjW~F08Bu$zey5oRKxD0u*9(`hUCwcpmYf5{fpyqdL z|E`HaXs!#@*&vYJM1Js2GjQS$G#<9BUKE`v`O*g`GtMh@;^JjCa>Wwy?Rc=F>ZVfR z+6rt$x_}yolN{PTGgtIOr-M3QvvRYzQ#t3pvhT2S1sz)gNqPwbt*VQeMU!-NF1c!p z;15HtKxIQ1$Zd$jjW^kOW?6lvIH-fzBag>-p(C6*G8C;|KeqBi0&z_(aK<;Ma(B;OZdyLcV~!<{JicC6`|PFRAVm1H7KjQd z?y7f%z?|8V8BpvqIzGsR{GMXfg_FgD{LSA5p@$+s6eaeh*F&he|6k;bQ%R8BFkF*z z>ez)4*iPkwd7%K(Gc>>7NSJohHjTYUmyF32UnnB^>GMLqC4~^{?au`E{f3L)6x(Wo zjVMoMKQzS2>mcPwp>d7%d^tcO9R9#hpz2%v(D>sM{C zMU$tCm(K3IvK;N4J_Mfv*m8nr2-9kzKsAaL+gg%=szi$J!?4}*C6VvnP9LzOe~r3S zQ#E`V=0nOg^`(Y0=Xm}q4~!`(Riilikk~kl5sQ0bGddd{F;FG$;m5I4>I{kVo(wMc zHs`q9$2N+kFtZT7@vpfmLw!)N1d9Hi$8)h|T7Y|wqJTEgev%UI?JgZb+;-5^L^gD1NlN?JLRAfVn z%d|19Xv<6DG8si6D+Hdrdcl(V`Q47zJw48vR|@g`%&uB-k<^10oZfHh3l^M*Gg`O&;Z>VgUHkEtVKG)Z=i|jGgilmy zD^e+oRMn~-4rzAXCx>3|2wOFa$F7Bpg%#yR( zhStIgvk+edr3Vo=80-uRi_abBDodjU%t#0xJ}8pMM3Np5R|;@7 zd-C>W75I2;o2{hp6=o@*KJmVX)dVMn;|;0qc`|AwvWTYC2Unipzr}>stvD&+o8=Drp&LK-@oyl zuMY}JF6b01qRkY9KVdU0kZ9b0y%S8hNVL+Rz(9qRQIIc%<3t10T&&|(ygr#JH8Ubv z*mO?;H^YpIr&=mdo5*I2N`%oZ7i5ZUAUk-{q7a(Uv`FXC0eCrxX-*(Z>x(k>H4!(1 zEJe2)_-DJ&9U?jt?;z?BZqr)9R4wVElESK|sGm!h_vG78(L1)L_d*Qb&}CAx!)HE_ z+XM8+jC&P~fab_{XS@rE` z6BW9u)<+G{{EO_O6Uvec^JQ*y?AvUBWTDgG2qC+&vc)&9$OJC#yw_nG4mn>S=IVT! z)&(Hes-w|ecaM2R)`5YaI2;AplPJNi=YtLOsJBTIBdi;%hX2``FZ~eV+2ETZh&GW4 zFm510!Gf3{)DNfVt6{*}XYE`hlG3yfx7X#0jIF<(k`_*j$F*EDZ~p$PG1`&n8u#Y$ zXQWeB>jf*78dt4)mX}RW9@8e?)yvsU(x9X}Z5J&Pe(k)ppV+TW-oWl=Q>_=TdSSgN((Ozo=pS*E4@ zig1{)Q;(0W71}OsFJwl%n{a-1L^@@Ga@*a^oBr$PYt_<8GsPR@ZBy#4+?Ss~9m0vk zYLqs+icaEg5Vw}uH~+HaMW>cc6AVor$F{pX%-AWd;9}<*pj}Aqj-Pk#q}ly_iQ!eV zBk$x^;`?pZ4NQ+@Z;#&Rj0?|UA9`SA&I4V69|G3_oiqrBoJBKfzZ3J290x(=UDLD* zY0~`E?y?XAkRFfzivibo>&0y>6ufPYk)wGRkb+mglr+hAedzaD?VEBQf3(S^u#JUT z<@xTY?KS@tU!788X}u6Sr%+ zz6)JpqX^t+7muScAsfG^MEkr8pA(nV;0|vAZ5a0!xJ&T%q}uh(GCzx zMkioB*FvCKr3*X)b+Uhl1G^~CvRVUqh-c7sRlVfEwJH*DHpVI*^y`Bg~Bl_nKQiHkocXZAD3F0wWfI-m9@Vhh{1=CJV9u9d3 z0apT!F3l@jV39`!MRi7P5G+1b3u&9~C3);F9yVgCm*jB_)#3{CihdBcwb@rB>`tXR z#o*w#m*G_(s-s>oxlObYEa>IeKi7aJbHub0UasRK*%d8F=Cs6baAb z&K4urYn;{d=9yT>_bIioB@vrT3tc9V@G6UA&{AA5oN+uTkTYjFJl{8t4~hb2v8?ek z%E#ER#iU{T{R83Wv^A9sU5LWD6Mb#`&<2=VorTw}y@nfw(~;qNQ^)Q2L4NFC`i2?J zeY6j#b^|eP>|M|V$`$7r5dD#pnygpg`a9gS}O>_l>BLtt5S(nhk4u1sH z`^V$xmfulxFi4k`3g@kAqy0f_;l6xR-8E11@UOu=KMRn>>Mb=A?XyOUfY9U=Dc|Zj zR4SEa29jay3XwrDeVtKy`+8pY;k%96AODRt|=lRGAOhKnN+p-P$@4r9~8 z<6`Ua$yQ5H_ytJOLFD7qGCLMEu*VhI3l5QFhqGVVoyw-u^r(#SRowRsz{pHx7X$iN zwnK8GeT!cP$>T2Z)=448S7L0F^+*RK{ci=3N}k`MuX)u-)K^{5e;mSwz?TbLhB%IV z!Wp#pJS3I2N+Ctd4$?QNAWmbbRZsx-8F>%*E`e%OT`K-movfqm*{dRw0Tpl{%frca z;k3Am16D==-^ZV<8Y;N>&uJ;uawy-;jAgb`4`W7n^o;|oSb!EvQ0VECkWvShgTBY5M~o7xALlv6n`n z>`yK+V)R+_`lC@U17S&4Bcm;2KYXa3@mz+ei1?g0tGjeXQB${_{w^_$vYc&aOT+es zGgs=!U8vM~H&0gZNjR{xRI(m4g?c?)>6gM^G6ZYmN7!i*o9a8aOjRmc3|+et!`T?bG}*s>5CcT zuK;%e#vbBsIrWS>2y4ifB6&iQ*a+Zk{)n*(7>?-d?XnZtQq0~Y*{;)goH|8jYRC)K zEgYZk=hi?Pp*x{ea%Ga-^5G=0HV1sY0G`;o29V1&C%vh{ z;@YVX6^Isbpck*tY@mBOXG?YuR#H&z2;CoEQkJxQG&zt~j2<@HE0zMr({6U2C8>k? z6E2U#64+#BeeI`7+)VS8Y3N-@2fxZQXU%=`5!QSJqWWyMrM|`B;&_B)G(;3&vA?KL ziY$w3t1{rHfavU>595EM#h7vMIH7nLd)Nu)C9FX+eunmwVJ>0%)f^)txuGc||Mv%h z=TV^&o_iYgr^fYn4^rNc_Rfx15HHFM<=dqbR3p+-rg+tsHoS+Oi+FtFZQ?w+eG2>T z6uzUI-#W(utd~AXM{n9I9 ziIIuoFZne52fi0D5CKdC^yhjV@)q?wGd3MsJMl$mv`GDGOSevHkvMI@vEHx?$KCn* zNCZd(ky?drnS!kt^=>6tx7r{?F-`!I7eZHOsdzuDZ0Xt;ypb#6B z4rkAFBTs*pv;y~y?8c?Rj4$}@HHKk{Fdw~|KpozFPECDDo3Z#(lJl8toUQMiN&`(j zn4i6g{EY~Gmy;r4?xc_S=wxhmElva*r>@brzS-V#PKo2Aqr}^@;c+sewApa(1Q5F2 z@}#v5`hTO32Th|I_Hf|G2pC2qgvh6%?j-o61+i*HOsmMR{_m@?`-zvK40X!N zP4h4@I0;yM-ozS{VQ;`#bP=ktFna*8`>DPjQO14lKHIDRi%`<2n!%)@*wAR3_sBj& z{ihZm@Y_aYy^e=4N5a$Gc~qaX)V1x%Z7W=xSnf zQW4k+ECpDJR{lpERck}LtK+RQKV552VOnu?H_`?|5#4+-efNc6md&|`K89l#t zgRSYpsH;?Y=wcyOe4LfJ<7#L2!a8js5}foq{hhSuH^YDJn6C_%H>~!wMxe+%S1MeI zt8Ij`C324Yq2EZtlBQr+LxID|VhTG^RDNn7WZkM|0qZf}B73c`cja8%IJ#!bum z=!z3;A18rqBdnNU`{!gph?F+oh+E+`&LuuU=T11CCd51ayTXsqt%12(zn}#44x)`^ z1Yz-Rf2;f&BTnY)MF*;$^XKb?L44&*^6+?OBMg+jqt{g_BBksb7AwLZELCf ze&h^@jnpHWy2`j#AXf|8HDm9b5bW)5<22Z-)o-yiSKAVDGX3k%Z2jMFa+loTtg@N- zW-}8biZ2PuJ*aIXYg_2jrnmVBx8QkZA-3fHw@y*mF2b#PGU;}Wm@Wo27^}Yxw+Iqq zE0GE(iz5{;qM0jyQnyCPPpYG0&c)4sMD8#N??T{;ws&VrF~zA$hT|946@tJD{Muwj zr5tU;M7!te>uS)0)m>+jD*PXgyDWo0EQ4?dC{lFd=}sHtDY~cAMO>mrtlu$_=&$ISJnPpW3dcaE0l|xGXV~;b>zr5ld=Wf zMurlS@G1_^`+u2PDW@TQ|JyppQD*U7JYOqTv6j*<75#<##AIv}w1#qDM0irSFWq({ zn|pBU(g;#HU?NH^r3sB1f*Ohbw$4Y8qY}t~lK#bmjsxg?`sRr;1+*YbHCzt_O#OYk z`z#_$mwe*;b}3dZcg(k9|Bk$ zvJM}sHlnq0!&wPTHXEe9O&nrGF)LFkmw_5CJssUh)<6C7G0U?i8Q|X&M@>mRNK~qE z(RAp%OoLUVlDbzd^Ms9noYg0V{(H0RdQ$Q+F*=5#x?0D^_{Y@I&%g=%`Su0UkSRPo7!h$ z$Hj3@d17X z$RM##t%@oge}*douQr`V%oGNeW{>2ZC)QTpoB!A(yLtVSn|tzoW>OPJ5i}DP#c49S z8kaiAZufQEa(EDsSJ!4mhLo&r0ZOLq1WvT1B3IF23;bg87(3eM)9MezB9MQxaRyb^EzBf_>&fqzTCW_+Xr?*n*95JbU8)M+}ku?!n9D*QJ_vWQeeC zShxUK)(Pc~3L-=s?0e!u|Ir}+43N^hiW!`#>8OHi&{GKw(#dN@!y!(#VQ#6Us(5cB zEiPz!j@lYExzpiwqSx1Fk_9d#TM~r$JfD;sv2Z^2FH>8Z>Po)QF3INp#nS~gv;s#e zQqf-sbf?RfeHKRsK+aZ~{RdO5A*vTI9Ils^X6ftNgmO%W&`yM*$LA|RHkzVMql7TC z<7pEtyj}C@%zWbWe?TXh=Cr`cuJ=i5VI3GeQXBS2&{KBH@T6=+u3ND%J;^Iq25Jz<5<3uRILpsHQk@PI*5I{ z$a(mvD9o!-BJNwzh77jMYA|B^1@YNXt!8l7z6p8IS2rZV7X(8v7iQ1$<1l#ls@FZX zFHuT_6l~vwzKE%5(-l?=;j%MRjzj#yOqyI7U(=P|EL3Cj_8G;X%-VxbbTWGhNC!S4 z4rRJa658shTgsW=?_!30d!jZReEXasNAjoyxLXPb(m$h~rQf^p;x=izfF%bFr;Vt7 zrvLD3{iKrYj@0T+YecRGO?@R&RF8M+z;gu>Y|>YLyzI>Tc3Pg1j1pK>#`Rrbb2AdJ z0OblDCRSqXcc{<3e=$CnYN~(32H4~l^O*tum|n=o7$|{;GK)ECdN^R_;53amxe?i2 z48d{yg%I(^{{(D|=5_>|v}>B>S-eiUvYM7Y5~+n$wMf+KOW~;du}_d0wLlpc6GBMcVsr2#8Gee9-QVjni-TrxJ|>@@I0 z#EKE!y;|vnCabPb;8;r8#${M-;y!jCkv#%RZQZM&4$h!xKOdq!asVdH2Z-#*R(d$H zHJ~)Tu#F4u09!h5SAIVr_czhU*R*Ymz-r@dHj0SgIfKKOEQdHv!UG(F|NF=#=dyT z?DX~pL4qnwcv&ne*2pEVCiI(<+9QxUhlWxWkkJ_euel5Z>+JTmR5pXw#vV{~d|y$a zoW&NGP{~FjUs6Jw#Nw3GqNm)3gP?7JA!8}pUD}TefWT;fevfRL_$3oe_w1C-wl;we zqBeitZi7c3ww69gBF^zTJz5(SvzrvmXoOLn&*rg;nUXK|u+!T=!W{f<(5iV&X1pj+ zlfA`3b&NuMMM4)fwTqB(E8cNo?mZip}3nGZ!-!_cby&zOz*skP5Pl4$r^0_IBplL8|p% zj72)F-ZOwD9A~UKPs|Wh+!#jh{yxPhwNcVc-~W-FHFv#quV?;mLWjmWltXS5~7bgoHSMd>8#i;-E?I2K_ zC9ylT@L6m@Hg1or2<6f2UjHoDtQOLoE4E%y*x!fk9`Jg81Wh@oe*_!+BKsXffFRz8 zQb}_y)+%Ts$HdD6POY#j!#be6kAAd6sz`#mvGSi2Y7LtB*mc1;#Ic`02PpHwalx_w-V?Qd;TQNOIx zezI{4m=`MS@9|(h?iibD;!xFV;2kS3Dxh{dO3QF+`wL4_R0oD5NWY%yUe=y#6hvU) zr?+vc&r7sFw;64OrNCRb3iis-{$5Qme5x26uv$XumV zwI4-bjhImP3UyexBt7}6AZ`eMCHC`VX=E7cthnr(7;`X`!Ae5Kde_2uJ$D}cDnLmyp>xT+eCh>Y$v3qGqxbcAg%r)`vd^>&J@}0FbsK z0Nb9SgAg7&nmUL`F|b;dMlA2-5}!IYiz5>rSEEOu-mFH+Syms{)nw#f3Me&?ekDu1 z78S&8h{(~;%mZBr!~+@D*6rMsALch1%Q#S#Kot=_bOR*3}VSG4f2S_W6o$T={;Qo?eRy0v;3633~`y>uV4Gyno!jfKzQ9IQ{*oce+1=_mpr zQs2`ybq(W(l+`lFT~EQ(ki@irxRFc$KqP*uB(e4t9VxmV@UyG2%c<{G$E5ivDLWQD z*02#DZuii+DY6xZs*=ff@2pOvzM`VN4AaeBD2R~z#CVs1wNN;T?Oe*)p#%uA3#xyu zGp8pW+bIc6PB9?ntBljU$p_Xt@6+OMV~h~J&^MC0N{6agK)kLkVJFLC`I{$hM1uEw zUpI_xnf!plJAYodwhb6zZUb(CZJKuoa@yvCLe(LaFo;C6T^3b5byNP-CNV4$yQ>sV zjpy?(xhV!<7K3`-q$?txb7rUCRQgPh9AWF8jB1ha2}_3gjIB{1&c2n#+|BA}-CIz( zgazDf{A9;lFa$a45+SXnK{cYCU4$dhUxHBSjj<@6S0kxTLpxxirL!*mYO3Aq>npca zZBU6fhHKe;fwwOvEK08-4ka@A4abAplC|aGqF4?e#DOnkxJfQ4pMc(<)7-M;s_IMe z17efu{aroug)G370cJ3}+~*f5uRiC5wmHwPo*R=~+Yc-_wi8cx*9dxW&S9K1!v)P- z-}_kGFloLh<^$)d_#L)GQnndnkB;$(q{WqJ0M<0>Y?Tt6f6Ihl=k8W|Rn(=GK#ffP znWUg;Ff>$G@#VWGherv~?wiSN=d#H&OkFf|7xtFjGv(+i=2}Jru!ec9qZBZSyyAeB zk8&WIT`GQ`1GrF9ZQtE-RO~FDQ^AuzyK?8By0akW$o{R9~yb3`P8;8nPe` z*Ng_dmbYYg>lm`6^z|TzJa3|lK}cdkE2jbV-?2dJ)LZ|K&G9WH5byS?uX#&y1rhE8jBwb=v>$bg!zM%q6x?GMjYn) z)?&0ejyR7U$WT43i0=aUl)BJUXO=e;+ZDE1Xa3%+6+~w{0OJ-Q`V3bHR1KgBb<<9( zuBc#i3a$Oe2!3Oo+VqpR!YFN8??|V3u(@CP-R)OYrDdz;WD1d(!?N;;bTgcQn23^%+Ti@dXffv#x{&YaBu*1}#&NyDSEK+QA25!$tbp)4yoSP- zAK_v{+dUgtElJAXs?>`PI9oUGllM@<1Z)ldL7d*^= zFReALu6XcWx(gB|Nrnx$T)rucD*wB~9xz1s_Nfpu`(+Gt!PXf7ZV9)+M60BKVzG?l`C#O|d94?`a z+>Vn)DV+c8@m%*>2`^|#j8B(yDeXNCl|5m?qrRN!LnhT4&!^`CLKF!<3<@sg!Bs>E zUG%v>n31B|-0R-9e#`m0oh7UUG(dc*#qvX3@m=hq^9ENKb+{4fd;LQ?ZvT=cFB4a1 z6_C3dB)fz}PFZfmOiipmE9Du`#84_daG0ylPq^dwg}kau+gAi9GwE)rJgWQ}veRy1 zdmqb?l-qc?k)oXXUjp*YjmCI)?sl9mb8`d7DfR>>wKuUP9+>EU_y65dz#&y*)SRN8 z-R%ho^mvDrW4nh@bOAGC-Sw_FFf;8GW z=StK{=-QY8qwZ;^0kwluN2D1hte{dPg`y-C$xf+FR+{X**(1cxM4YafU+h{^^d3ah zfVvfAgh|;&!0bVBFYIpz@-zU$@o>%A=wvyK&KzO>lPwqo^>!hB1NdFASiZT674SCi zGqkAG?Nd@A0ZflnqJF@zbFAxW0A(qY^xG?55+sgKU|?%_Hc{kqXPr=KeO-;&%JMKV zBh=t=+7kGfOgY9WFi`HHCO`HVy9%dY@%DVNFG@=<($gcm#6HL{t+|ZInqR&l_CwPz z=CU9q;kK8DkV*q7oJ`6=?Tu^-oXHjb;!J@g?Dhxziwv}I*cm%G4^4r~I{ zNiX3&u0T-KAMkP<%(_3f95U`CMA`;sicfcl(Kry>d~pjZ5iVJeS4y8^QJt0tswARw z%u{~2WZv-8dcCuM%(1GR0kxc(yQkRist4+W&7}_z7d14PAmP)Ql0=*uNPdR4V=Kfs zJI5gcDr@SYF{9#CsR+f{Ef5(8djU*ZeO>@IT0uZSIwX*G93ZG`_RBf(c)OF$L~H+Q zpPx8#=W|aMmG39*!ya`vqV9gW`GFq(+@p8ka92kh{nB&~RE{2gd9>#M%Tk6rapRFa z3h$T79$1Zny`v>wLyp8c)Zrqswtl}FPOH1TOa;()^Ht(@C{Pm^_+qjE_do`~c$<)q zrD)L=og;CJ`f+Npha8MX#7%79%ur2Bm}H;rJS4yM!;tI(DL#9nqj@2O*Q|EXoO=ms zuBA7E%R#7WAc47ckB~5%f~WLL|uezDh4V&u=5NF88gga?gTk4Of9L z0-o}mWwZ(smNxdX4h=cPN8O|cjzh)lh&LF}r$Rr({@Ms1mL5@b1prhr zObrq~YHjhRGQOuI3De%tO$}r#nKp(Bys-MetTxo(dy4W6i*9?n9^jN?t)#58fAe*c zizlp(?ln6*sH_JmD%aJL6cZCFoib>4z<~9lh;1ML7$b$|KZGn_?f+#@+YwFWqLwjdourt(T1iWCqN-EkVRB>fv{n;D8wv%RpL zJPnwWiyZ~tpD6Hzo^Gr(u0B3xu%(&7>Tg3O`%eL0@<34Bpxv|o$;WF)r1XkVYn`sh z>ZY@}-Bu--Hd7ayF5T(uWsK0}0jRwr(J z7~R@LN%iNexYZoxNxZ{2?P8|Aw`OsHN*_O=69DzI1_nVzs*#E+y)i)wH)(Q~!uya2 zS|7&@?XO8zTWgb^@So@lquH)~oauq^aXe{4g%&sFf>HA%1~GIgYkxA*4nSIT4o!gF zW@I-nGrS}_0N@;9Kh2bI=aN$auukbEJ3nv{Xe+TdCdd@LAZI{dWpv!@VZRU6K6I`6 z4F`}dBEt$ZgCn|SSH1Yf^4gXxSkJDJ8VbeMH*S(~9N)p#aP zb(4Z2t6y||qu2)7kR`XHaGHJU^*p%}nCRUU=oocj9ndae+lvo@9CX+6Z9~=GE(zp$ z!_2@AaBldL`7>X?dzSJ6Z+exx0ohNixHMD?}i?v2-#@hdw^sg}%Z4$Vid=1<}^ zc)X1@M~YF^!M}E8xw6G0nhDS}46Zx_Qui*WLo>Kd`N$=BT?Ec_$NRaT7&Q!te%IPe zv?HInNVqTI#C(;Zu85+*4e_<2W>h8WygZlZF_I33!6jE{#fQ0r_^geMm)$BVY~p=D zk&lS-ZY;&OckpL88wcjp(9P8xV@T#P3$XExzFYSFz!9hI#rXHe7wnL0PepdUcb#B| z_GqD=TRUX`t`Fd8t)hPuUzBbwMS{DBN6d{?1e)tHhrvBC0KU}PX$NK$sko++@=2VJ z#_VA{8A7DfI&_iUxDuKV@+SLvZt|XDwPzFU1YQ^sh+ zFeyYT(A%5|bAa`xCIcW0j|OZA!_%?CL?Fh~VYJG#Lt3 z2tAaUf>2oK7ZnHJk3imVMf~^#K@#82!U_@>08@CNs>UT`Qx|=wOqmt9U+=)cPycx? zcDVfDl7P#7)U@}@|Ab>~z{1y-0<$GsN-@$EgoiVu-eNpjFsp4Uf|~^#TZ&SQ+ub0bH<=eJ=J#9@pO4S_qceehG-HB0ILwD!flY|cehjN*^ z0=3ykYF_Zemk8CzL!mlj7V?Z8a4EGCriM{@r@#cc|MHE*)1-yG+!}3hXJmnb?K!#7 zt|DKx^JuI4*HDL&d4XoY@wDyY95L9& zos8<)`cFMif9Ti95nww7f&^x@pjDx8GqI<|g%ngo_GdPg@;oq_dcqlS*8HOPM34(a zf&Q_`e|V|_hq+gD6V%NJvp`r)`#PwzfznNjUQum@>!7YkfYDkuA56B&sNR8fXgkk? zh7{@pgflY(-a?lLNf*TE(Vgm8lgi`l9M3{MvnZ^d8`Z}PqwSrFQ(Okir>P;t3=+v- zUD&6sGY(bcRT>lu>8ci`(5#n)TipG7x5cG!^>gDxx;Y5Pht z*gDnWS{MX*^#Qxt&WN1Vi!l-Hf*(}EztFwZ(W|I>b7O4J|0Rq06cDPeG|+%HdUVlw4f`an;!eVS9I^lx(Z|8 zx;XsW0;qzJWa_)~a={@MJbykWFR|^sglH_#`JVpeT7b-J=9}E;8kyb026LZe!kWjDnt_`6h51NM4&O9XzB5p~X z@ng;;IqH|kk(^^at1RBnm;~57;VXH6B23D`|Da2^KcP`L7}JAYa`wya=*)n`n@eEo zQ%u{?b_j`0>oZAl>ja)#3?YhHATxs@EtSP)hpwa1M8P{q)KMC6w>Bvr0Tc)LRs}^j zW0`Kg&_G_N_#-@?bN-#NC#QeMhWQux>wcebbV*z76mslf1V1!vlfwruHDy~UWWFTy z!o0)^2DAI>N{wM;GgkZfBJL(FRQ0TrW_)}OGf5lp@4~97k&F>0w|-uLv-K8S`X)Y& zJ%)6`i})!iopdKz5jY0x#U-*VLizEc>6%GUq0|xN@Mi3MP@n|a3!e-Sk{HTyEcR0`Etsu7lycAM!M3b1xIDSbu z@DSyg{?+_DU2&Zjdu0r-BN*Yl0y-a+1bS&>D|6cz6CPA*$)1DQC0LIr%lNdaOAnfrPX zP!RR<1}kPk8?*dY+Fu(=ZgBDPJyfodyeOwW(t`I5NXn!qVYqTKur2K~gW&|aI(s)U z_`%()&l59l_)G6j`3sJp!`-A#udy$l6rqm#)re$#4Qrgmf0`_i=JvW~N(hn$>csW$ zYq!UrZA1wdDlfJ)OPGO!1mZ-cAEs}Y*#w~eLO9pOvrINaiys%_8WoRMgtQh80cd3s zCyPQ0etfh5>l1>GIB99_#E!Q!Ph^xyPhIU1z+ty3C60AZqDIw|Ah4(}X*}B(3rWX> znGEnj;<*ZuLlzAaE=T5c4O@Cg3{>}*$P8T8ifjTD)!?)wBp-v%PKSn;zT&Uw_gG)C zuWCOQ+12%O>ZiAxUi)D#^0G*@+El#l+452YRA?Y)8Pp#4ZTcL@-Nz@s zmBFqHliN%Cmfp{G&>o9=6nC<>(Ip<}HGFr*q7L(b@&wIr+2YeN@?p>-aV|5dS|4Gn zhcCYkZedYvm3V3XC|{_ZXECoqP^VoPOYima?qY(1mO>~RDpQ`&!BdbF)iH_=EuT;8 zRH6<`t?Q^1aLc$Xj<2MnI$}Tp^wmSSq(htzU|Henf2xb2)W_jvCddYiQ)#aMtV0Tl z74*X=#HqJvJ`b}KD$Z6aTmqSpyB1XRU?`I@jAyeX`HbBpha{4y`-_x!M?> zEP#l{re(~B>IEque_517AJREawIkfY6CRVU%KglISgGoJ+~LMPnO(|iNHV$upv4;s0D3nZpU|FvuMERH&dWEdrXYz;xSc^ zB2-uhroxur+Gx%7Lb$F|<4$E?N0+6&kc3%Picq!T7XkmdvO+3=BFHKbD@*%W2 zerVT*RX>YYo?=i)dkGK?Lb?Z`;?0;nwwCrE6|PNle$85aao^gSG4wKjO!Iy<5yL+v zOg>{Bnb6e>f))xhsI)w;SFe_=XRR`qRZqZ6eOd-^(#HiLdt)fKEbFzsUD)vkm^E$2 z194D!r|=R%-)d8%Xjm!#xp(_RiX-1;;oPRja^K~hvZEbM=A4I&KcWA9oJa*&(+(D9 zM;GP}!#9O*y4evpnca)yU35J@9gfdRr;}$_`%_IV4tHM|4Xh(-j0a5$Gw>M0{acck z1(Yi&6@loy z^h;al8(YN#)DD8NriR2nv>MGLIs&ApWf+w;dt4o{wr0k7TWSfd$quT|)U~wCTa>Y` ze>SEl3=j3t5AeUk$>DREvz$Y0&q&sxmtPUS0`eaEhDZ$1ZD>0@jsP{I^TbLAdhRo` zTwOt44WL+>MEVILmWTyTG^cCsZeEH1{u*X@qFCW;IHv^-<{}yROLLtOEeeoH5v<1- zx<#)x_y=Agc~u^AJ4@CwZQ89KGh4Y#HmXQ$C+6J|;}S6ZKfX+yaM>WfdrQtV;#DUD z>27K<1H)AhW)Ea-a^T)2d2ZIEm{jA$fKsM=P%o%f#uWte4Y*m+l^QO+YDM)LZ|KCcm81by8)W^fUJWFlAL3PcD0mOtg&| zMCcO3ZKtphdC2EnHJu04E(=@_T8U*$A~}r*-~S`F#U5VYTFh3+g_z=j#P7m?dYO^+ zG>FwYYOSg_-{cMMMNgm=Cc*1~Hd5P(!wG6YI(oD9W}}AgaK|5Zc`Rem)ZwL+f0(8X zt7jZq@?;jj#_M^*ZW;b!swbdJfo))rau$TmgUE-Sz@QR%VZFLWvf4#^%*69Dytw$< z;sZ@0MQ|7hmmE6LBBao?FhfhOju>cwR!YIIv-%jH@7J{K(5;#-+jnNmyF|b#j$P6# zA-N8f6l?a5h$Ho;)dAIUP034}jHpO}@tc{%uq7mOeZ~p7unT8|h3D0We zn~of?=%_Zk_&||GN(e@=G9-;4M_5xC{}z3uztNLDuIW+PZ_f#(F+Ub_B_y>6hx$** zPm>r{wD9~#07u(XyE4icfozbD8*>9VH8rvyqOY{)@eQT7{}%B{&I^bansLzX9E1b~ z-*ns70_x9vxVPb)D)6II5cNr0;1R_^MWz8I9C@a!d3SnC-+BX{0*~+ z;t={X_-VQZCJ=$=|?WMN0CO$ z`hj2SRById6gmC51NYo_;_bcB+=pYY7ftyjaI?^YwZg-F^_8=zxxJFyNXeqRpFcr1 zep9Rb9R2-aKirU6OeaB&eW@!yWw1re6%=FpXYtv|WN4_2EA81Scma|^gG+Z4?E-Bd ztghiO!)fY9!4MBKn71Q;Bjt(Y>QENdl}IVDyWj>A41uPM2oR_SO`eKxC+Kj3ewolC zeKF{paQ*t5=4eFJ9bt=`0Itn>*+jnGbLm-cq@K6Sjn-oNa3~7n3-@)FE{E74_;$4> z_sDyg5I_b;%od1IX2Z{^-zwez!J`U%i2s{M6FVAC=QXYN8?~~Yp%i?RjUN7U3BwKG z;C~GD1Ci2CkT7$Fa9=39b5q;^JUnBLW5&h4e8RWnm#zVD8nRb2e`+PSQ@Wmmm_W6p z<%RAL7F>;5?8C>eEKw-N&amC>q}$*f;|_ge%n#kS&O!;)BUQYf?sWoztl;X>om0sl zpx&sP2EffLtx`#n%9y(dhTsT*7VL1z5{H3Gjc2W2c8$%fQ+K#0?2fE?DU?6B(!adN zv1H{3XkTMz-IB&)^(cKPnd=7^XtE7!IO!7P3I@#UgCn-2Be*r+65M(l0hb}=wsB^o zm^J!MVdu*833+wqHoLn(e4JbZttImKg!pmIo6!y{Mq1y5Mz^zaiSTJh?wVEZ*br6Y zSMPUoGVV-2&3#6*xR!drXT2jiZKyt`bBCQi=)wVLdHfYoC>pXH?(K*gqI%B85gCAm z**VapdCn-{mEec5vB70iW#28;rH>P^8E00^k#BlPVNZ>-!|mESxEma&g~^Y6B>$LU z>2_u_QS`8EwErZ{CEne%&vIy7h!WsZSymFg09innb=q*6FS*>VWtCCZ8MCQ~aRuS- zB%U^O-dnyHX)+0K)~Ps2OY;YwR+{*YhN-1aA1$Oz8$b5xUiaYI(XhCUTxjE7RABSj zkU~$k`H0us;>vEqS+ieivpnISD~yXLYcssqk_tE432ITwGL6q`3&>?}Oa_Z8Ed{+l9qc6|hz~q6<7`;D zLq6Vr?*Ay)(nl7UAn#}s3Py0-H21Z%KRC&O>@i|sscgK;8NLT>1z$@Dk8#yx-%1Ou zW3Ar&>@yLy$mD=@Epmcn=ey37BDoTpgNG6Z_Qpfa1-{xMf96`C7wuPoVY&z5uKO;F z=v=c)-TN*3+84E1tNK&3k6U3he=7ZdBpmq|H@b8y`CjFrVQfB+A;e+bsURmUlXkx_ zdN#fB&8h<#-o|3;)(F-+O#@$(-SSAcY9@XmmFYI4H1{q`X&$%NK_ssu{-o%_X~p!< z2)@Ns1!=s@-C&$Ke-;SIo{rOtf~2)RpdRMvc0J5eW<<6^`S`;3D|YNPk^Z&1jVe#G z-1H&c)r`93e9RQBcDJoq+($>}q1tfL2fAHK&FAEa|Wgf=J#L0!2mT=ZrKNdfm5 z*VtOCJ%>o($r1+t4pO6?vwYxl(Vo@S&ow%40k!>P+`xzWu&ykn1pd5X7z{GlHxPiR zgn@+0Y=&_@A8-w#!d9bM4A-L{{Q({GxN;vm*O!%8uJOI<`^W!sE$5tS_c<#P?)-)c zZfUhac|Dv8*tAvzP67Wrjplxdku4NDlD<%=vr9@gru5;^&{G&UG* zA~W+aInA%^EqAG(3I1{_ql==Jnp$rQkP+_4u-W#l-q_~v{Y>Htt2q>0HAQX5bcf=> zjzsrR%TJ!^)_*k0mXCSaV+sN9WZ3)eu?#Ohx?U02l3T}mRM-lk?Gw`ZSF!fxVVUMG07vOQ z(H1M{o>LZssASx#1CD%)Yl7r4VW#*I+VNrlC^lmM1cDW)hu|9J%rbc1Wt?<$CC}6g z$N9Q6kwT|8je#5ggv5LVojlJz;ioy0jMg3C$Kf_8}<5rBIiYR7$p&}R=>LlSKjbf z8%-2ZwV^Y$fyrv!8ggcJWvw4ONh*oy3!2H-EcUcx+DSIgW$VgTVJI`ag}sfw7cRMX z`q{V%$kn0g`;jA8*1UOOW_3}P5Q(3Bpg~Po2k_+SP9vz#TMi@yWiH@1daBWln)?&g zLN*VQ^t~PW6v}^MtbHb$B960KTgT>f!rG2rHKlBZWQ#QmFRb<#$g}by%u%UKiohP1 zhQ<{UR#626oT;v-+%ICCbIu8%wo0k^g^I4^4B}2yddN{eG6#i-C=9F z>;4ySXEl)|FqQXFXn$qODyN;Ip2o`D)dlh%a9rt_>2zNJef$RC9X*|Ikz3fmo_9OHVrCpi}NJkI}O3?wlZ5t-t`C43mw*(EiU-^y8aX^y!WaF!aAoKV% zfaKFk07vl_HbtTAxjULm)IQ07PG-l%2YtXB`(kfq7Fs%RX4l(KCw35i&sok40$FTiEvU81^e2q!X*qHHu%E7u+>pUZGG< z&ww09Hw0J5!5P&7p_?UiRpkA~{W0a<3BbIsOL&6*?)wjq=n0r*YX5}))`qApp**j4 zCI%;%S4T@1;agfCz6Ap|qwuqhe7U;uPu$?+cNGFuh`~AVlN2E=Ze)Nk;LZ?@s@@ zRBYva!iVvD2M#XR-~-@phWT>QV2A(ZOaW{FjrBXPa8aNZup@&ZF@!3`OSA;8b}OKZ zzO;AEibx0Y0InSKUd_@)uQy6=oxA>s0z*xBOk94yx3s`$hh@#N2M9d~6S*6OGHiq@x}-R}9krA5m4{=h1)3rYLpmn;Ti_4T zORfOF7l{ki5>w#1u_8sy6wNV?;WR^?|q!(zN7LlCU8W1)X5Px9%^>Q`~72k zo#K`bbENT8CZceE=5d^8US=W!a=D}JiqPPoRbdi6v`8Q9pIm{d=g?eZccR;?cT4+k z04k^6^&zKL_MWgbt09@P)UbaEUE9h=ge!! zUcP(gZ6x;(`v>DU{1<}clHXoMeu{==$iZ)z%ewLZ|Bqtl?x2lea-?t422{RJi8^f} z)%Z*LeD&c{hR~dZuT}jtZs82C(`uKrnodR|ge=iI1p(pq+vsCZxS75Go2=qpnP(?+ruy4#uVNNT)*;|nUI`i+b>a3HlT&lLT{I%Lm;aB+f>JZVJmMgkA4Z>+^CQP z!HYZ|5GBJSE+%-S$gM375&Z!6v3p{1dC1%x!!G}w-1w5b&ZYP@)9EgF>ktM1oZKFqT9vyAI!4!ZdQ3Q`b;2DS2j%+ z&o^NDr~lW+47p+(JYgE5IhudML~$HsC@&RGcf^>&mku9dApF|Lr&NPULUNB56!tQv zvu3?m%a3G45f$lFDUf;0Q`{oDz-b8tDn>UB2qBt?oy6W*7FOyFfkul?d}7xUU4#pM zwbOPZ?>NQ!db7N&bm0SqcJ&97hjg7uvRzW2?i^ul>Vn`!{et_X52dB(Ss_VnTX4tt zIsvzV!yYOzgk6AJSqK5Z`??TSBN(R82rU&{e7bBn9^F|7?WfRb(`%Ks0Yapp-r`bM z&n9G8RJ?u$OKc^w@;vm?2e}C#2-m5-BL5m30y`v{!1;~JqkTskaM$4qpv`|HIU;O= zS=>hmr|9!(>Ngs2s4jq-9=Ik)+jX=C+c4Gz5Ens$pCU?1cq&~M)B_rch?o$jROO&v zUkcQ;@w>|mhMNH@Eb(GxngZP5e(K9J$fcVVHL2e@!TV)80{Gr_vVG1Xo zUOa}ICx(iMsJ5hiTJxx7Emw%Sze1hDJ`)0hvYK2-a-rG(7@1XfJkC3hfpRa!kgcu*aK8$-yGqE*#aek4`yq00120wNi{u{Lf%hi<7<*`X;<2*xF7eYYXCy z;Vr5jGkk`wil^&wgEV%(*%l#OUxgv0IEMwbrbOT^1aGokdBvd&J6t}N-=%BXQN@)NqDlD@4{VZuZ%K|) z1fkW{R9e8v4Fr$yx5-&fF;jHYH%$zN1)BCe<4M4QopWa`ipC+}K3GTm>PIXkddDlz$Off{| zK??09xinT6@K=ld9_2LBS{Zfb&N=fq@)~_i^l5oD0266qR&sQ|0EWP}yuA)QEcf%y zg%5YN>c_GU9HxpB7&wTp!0<9`1_d>_`JFS~bWY^r;f$-C4O*@#)}9rOp&Jk11;C=7 zWbVBjr6y12e_#$il>~JZ&C^kdz(1A^yNw1>9QOiDh42s`Uhi~Jmnu?ov!c%pc}+u6 z%;`U#G+e`N{+eU?9cH9T=h;3FrUctd42$wSQ~l>_|LD|~{W%aK7dz$60m-ICvbPA^1&4TX1DK?cK z`m~IBdUJzGrEO9V_aO0O(H8tYYsKxvuVFcxXzNXrKvY!46zk{F`h>pKvi`ezVr@io zW{ml@T3e1pLDfldAwJIU; z(lVApS`3?ps3*7@U!m6ijij!#us=c<76Hzg?*uYG1ZjPs0NIl?b&{z&&(b24FD+}6 z-eI31WH{~_p&fT#sS$j78LRT*Q4i$AT;|ir&_$95Qz=z!6K9dJVS8Cmy)%#^g0ih_cFyHnM>Z9M3iI+ zwwCREtCYKx^0i0Vt_eW0dZS}uXW-pD;q71j0Rgs7Sqb2Ny{oUQX#y3xN_u)tyi)_F zc@!CQDW=;gL*_6_2vd#+ei53P(h&{3g=j4(&|apx5kOI_Cj4s*}&x#hI z(O8G80#jRK$=!EOa5DvwGtmG7pU?sjcS@tcjvSNmhz)O1y?Qp*| z5wWqf--7VCADKr7RC2{QLvcL=Iquw@ylErgvIE43_S{Ed z|NUTHP(g}vDlr!Rxz-zDwMX(X00%?iArc7a4ZqV&c_J57*64nvHJNvmrNTv4$h=W+ zbyz7uVD7}&yy^k0vN|TB1l55h^Eo(enft%CcD-xZ!9RvR79NHzt+c$q+BF;qf5g~D zLm2MhkjTy7CDF-Gq%XrT9(#b`9=I>Stm=70`aCM)-uc1mC zulQp9@|C1`uP`ehj%AD!S5Vj<#-_ydmnfrv@JS$7S5*xAk|`NP8p?Mlx{|YgMCiiK z1~Z=okBpQB3{j8WqrWxXFQ|hUNw7FGO28iHXlnVN*>2)Pe4G1#fvT8~62l=jqNUu) zOZqFJCd(M4k?=3esisMO?jsxxIFv~EkNep!@<)e3oVZ!}+*@fXxk8n!6l}1gb4=bW zEY{7!uK75{8tXl=jBjjHsHG(rZ=BYvzNBHK-bWTZ*9m|CY3vJOd9-SZ)vS98W!7Au zeLc65I?Njt1uaHMLfo}c=}Z|v3n|8nq4bRtGY1^_plDI|Af)MxRL3|!@9&Y2zJr~Z z#d}u8L`J+)EjVMwxeWjvDMMe*o+@zAuu<193D3Pvh(^FsL=HPDw{mF6m(&pp4_|oB zo~yCtK;Fx<9^;1Q_kF-XQP!$}(Oa-|NmctzIFajo*}HI=>U}8_te@B;Yl%^IjP1 zBPnE2cwmt^r+|m?bvZ1v)%Q@lYo@_L@3{zHQp4pbWyJYKP8pI<8ko+@8W>{66=9UO zwjgwylL&QY)bF7?kUArbdlWT>r4o+6Q$vYp2%sFr0a`wA(0FmAyU|KfPu9R!koT^$ zMf?KmaL|k$^Ru%J2^saypSg+XNH5iwa0bKVKWslL&XLNf}xJg&CWRn6?Xb%Ad4Mm8y z0MRFw-?`Q-)7o9|Te#}xS3|&v^7}Y8wAe{#kx+O`QbBMF48M_9RX41LYc*m*8TjY?vVpi}k_53JE?dLl%& z#vDe3gJ7A?!e=6GnAU$0y^EoYo#hd8UHS=Vxp*Uy&Pm-!rWbb2!kL_p@W(Y zQ>#7*G-BzWMhRm~X_J=Q-XC+yQ0u^fI?{7z9`Bm3eDZ|u@z)KCG7xBRH}IZdYPZxm zZ%Qef;Irj_`~L|oHkmZ{G|o_vF8bsr-+qjhk{0X!22$SD_IVu$+|CTNyt2J5@^G;` z1J_(4|6y}VTu(&ZZ!aYdD(&GctB34T+(gk{={@@`fot#6Q%Dv}2=sBM^CP<<>%;cP zMk_@7f|nAERz6;iAayM+P}p&Qwed!xzqS^Ln)XC+PPQjCK304c;|{Er9eZzcpPv2% z&*kdHG7_EzOHUAwwDTb=Bt$&X3n!SA4bzeWC&j#qMpS|^kf{FEFk3Qf6Q5OYgRF4R zr@FCdPFhKs=zTl0S@)lV-}J!-UbHMvyaI==kfpAn{hpIL#nLUfyY+QG#(?5;(B z4w~ovYs8_tm9&HEXcSv(_CPP|{?-reiFQT~g&oDuRn#uI=MVa7X)?2EH9_6^#%ndo z@P-Y}49MMrdExM$Il<=FMECinAX>%2+WfGA_>LIzLdu;{wv$W zqgMk%dC+6RWX~21yF8z7IU-HKr&Gdy8^$kdYK7`SS3mq zVI^xlF$}7IST#8+BJf zwZVyho*^~%%`-+n(CRYixI4h*WiohBQ2C2@q&?yTf=YFLARj?U^<=x6*vI< zJGu&**Je(;z^4nCw;~ekQ9CKo&JHohBJoC699m6Dy>XT+x1pq@I1>vxE)SF8fLWk5 z7|*+(MiK3^Chf+`(D;bT3Ei#E>WWU6W{DI|i*zoEe=pw5(oTayL{{LaS3QvsaH5xb zB%tyfJ6ftV}WW-lL&kZGMysYL5bNj$AQVDmY5C@Etc(;-aa+|4FCxg0*N zaO3vR5xw?-I)F0Zv6j1n2j0HRV;pRh45@wI#Gyi*=1`i=gnQr4U7XMg{rT3!@Xo)O ztsv7#4{f?7Euy)}SK?}UaW9C4SH&SVBhSAeZ6+|azTzt!@KmVJZ^a!!qb;1eyz&Tp+=&42U$9jr0E|xo(|6|m()K1* zRjVu+DL+5A8klZcL?gB+oX3Uh(_ve5CB^@E^~Hv}s(+>YH(ugw*5hpS(nvPu{zx7- zqxMnlF|`APwh_0q8pY|-IOg#JIrub%N_z;zU}}GsR|Ik?v+ZSmJyO_K5zI3V)2{|$f%s|M5C?5=-;rB z6|Cvh(ZT^V0OH3F#)91PQUP6AEL}kwZYhr!Yo8sZG8}f+Uqm=m>AlUyx9w+9`6*0~ z%z$=|l$Nzb0J+C3iebn_q~0~YWKa7;WAUUr z?mdLZ@V`%V+L8xMT29jN4HPbP!_d9a4-G48{X{HUbh*c9qvLETY^Io}K@nP_E*rL) zyBj$IEwL?ffIEc`iU=JuIjtw)t&JDX$*oCmHBqLCXn-)%R&*UG*$deTkfp0l=ZD^1 za?%d~0|7v7$%*NE{h7sdI0x(Y@st7+LB83Li}0oi-D;Xfw0`^dgxajvSQnEbJE$aH zHe?BIz-@sVAw0V0YwKVr;84iA^Z7*mMRz=)_9A6)PHJ9_V5dh(TG(e> zUgc=iq0g;TZCx!imxJAnPu@4Q@J_>tytZ1>f5_Pb z8-HP)#0JLYsfEJIZ>24kZOj~(aNIe@GLfz+PD+&Rn0A%)Dra)M&?4?OF-??q%9w>I zP=IE4^C?fzq1UUO#%C?TA_`5Xs!AnSXG?wN+sBXRh73!aP9J-q#OrkDeu`vpU;1)B zScUKPFk^~!n6_sT=e|6xVO1AlNh!5!{Etg}dGiQfI74O-RDF}o8HCTn+cvu@>o(vB z?)MtN!pG#t z2yPlKb?rBeTmD6e7s=lH&m=zR^cJ@&if#t*N=2=$-{=K+ai|JGCW|;eyGyz)R#rnTC{L5G$+o%i*>sidL%w>Q3_g(W{CBvG zfZF6QNM)9JvEa&+`t7|3Sn9O`fCLE!+)jGgp1gc*&@q`#*+CF1-eOp|Das5{Q{Ty>i>jYn96L5cQJ^6Lvgvq?IH zRiHbyYu}nctN_}!0$5}SFV8cY5B6^VXo)vqv)bDD(-qoJQ|{MCvkc-&w<9M zoXOU4{+3QWK@zZKF4wumzsUN2+urN9A%X5A$9i0uzOAaE!5GHs-mC%lCcI`oIaChG zkG6qE@QE%5u{T7bdE#Zi{o}-(6sm3Z*+6}gcVAJ}IZ)5sY`M-|~O5{wkOrx-)&8}#>psls4 zamJDP%n(6^=$kuuvAGEnDiDP9cyoD^^Myrhw z63Yj_;9isfnZiFnc;BF)LvyM$?z#ytoq1{2tnk|5A|i5$7ff!-FqT$_lR#!7V1PJT zd2aj_7uuxEA+l&#g*$m5+1rtD=}yFo$d)kqUdTLgs#M&UD;3{?``^yzBA=+gdKw;I%B(GHcw^Zm2?ZYA7Fk3CKC5a+{s4va zaS|{JkY3VW=CV77hAs3Y!0UDiveQT4Hdr-k-1@qigBER~Kw?Ks0mpEni6GOE_sCs3 zUdza}=P*kGYZF_rVMpEDmA^o`L}Bk-+EKI#P%TX18SFYOlORaZ`U?glI@o*uQj@19 z_%~?SSK53UYD&>Lzt(+_XrChJ!_=qI+JJ`qq)3MJK7YTQ5nrs#fFD;%j$x7r^;sCI zYhiywE!N9l(B&(hVMtoeEgYbmmR#Q0UB`agDEz~uD$|UQ9c1?kMPFJZ1685W=raZ` zhL6$Hy;B+uZVe-EA%eHNH*^Yf#vQkL&FJ}Np%Hz74*acQ!6V_Dlh-NftvfDi-%4Pz zT!&ugV+I6TFV^UB*4C0G3-DouXot>5mZu#@`1xTl(OtZ072I_Q*pX3TE@nt02J82L zuxU}%CvDsY%9{IP3wB3XM}d*(yUnrhX|KG_-|_}idDEVhp!h`&@HQu*%P}Jrr43A}5Ghj=FfvuHq1MHNAuyKP#sKZ***Vxk#`1#_B{{pdf7R zOm9Q4*AK1_xcF$=>juJ0=SE%Q1yPiKY7Dkom9wXhH5QPqP$ARBZXeE)AN4~LhZpkw zW*0LaZoQ#?sck^*;vn!}U!nWI&m^S(=V?hI(pM*BljH#v27E4stKEuGuwpF7WABFC zzCS72A0;+`SpJas)a(T+cI%b~$F1W&!}}Q4;M9Q~%p@&fdhuW}Z67~cGWwjMWfu5# z1A~m^;FPBidOSK_(v~1={)vXaj6$j$uPrI)kF3@yCb_K9zqY4%k(wNj70eSSRlt`@ zyQ5*fi0th9ueTol1>?l)6nWa{hF9RP|7M&5%_~|#R~Ik%%BODF@Z9rmZ*@*UW$#d> z%R1GLC%@dabzHim9cN!0`O+mb$WjviI4K7AZL)RzmYMkBV!{BpO&V!%e4$>f)}RFG7nj8vPjLU#Q^*4;;y-HhA#H(DQg7=tY zy0^?Vj4G3y5Km8(rYVba>rDp=Y?y7!RiMQM3+IOTGjmBU#1g@8I;cg)>boFjh&f)ek3MWe1@H<2`V8)ro^%*8HbJEzlRrD5XpX<`;0Z<7gM<8|Hgtho(Ijs-X$Y`X~>tsNVA8+$gY zNZ4zwLKbg=xh`Pva#Y5g0@Rb2@!~k`P#v@;Tb|6F9VY3AT()9V@ScGpZrxo1ms9ze zHg32JI-;q@Hl0}7n@=b3MNPYIT7f&Kby)Asjw+Y;!*74XQ3T_CBnK^V*jeT; zJWG^+>G@D6XH|#Q=<)KbbmY`7tArE32mtOCYbZaqI&}#v)h98eK-?4J&v2d6-XDL0 z)O#)gX)rBme(E2B(Wb=Y#nLFDH^LI3AoqMY&ju%*h-sHNuuyoK51B?mpSIyo-8`d< zpttro&bB{Z2<~|gT?Khf4D0{Zjz7Iw6Y(6VzCDZ9VwDA5O zwq1sm!#daIR$aD8$yY>O96?&qYQ;3a-es4m=Eg`&N|JP%+Wt># zB?_@PZEnVAq;)S}$3d*k9dw0XaB(|5aQ@#t*Q3b*fE;a;XXQlI+p87;Q9>3{O$m6F zQZ%7SgZC>;yC6|2&H*4c>Founmo$Rxp@z;C_vjRt3t6E@qv_6>v+O7eE}-3JP<7NE=mOU`t`j?<}G zB4{<{6oqaAwEp*EMD5F~xf4t{}g}N+h4!wKbm>$pLQh0Z(6E z$-J1W7zjrof}jwz|9u)@*8AA9HYYob_ybVrE$@6gAVtIX+c*UMX*MJP<2=DZbNZha zA$QZ<;g%Ob+off?w^F9`2G@`D#|zR4KZU3{2o(Z+J%GnGlY>bg}No`=kLb2O**O0b)ge1cFVN=zgZ!-ICJVNo%4c^?*Y0#eA zgzN21MsK9`@mK*G5ccfpW&av_AGIX@oNh8z7_M3re+1cjUiXd zIby^_K^!^bDC)McX_Ek^3_=CqgubE9kR-}oQb6Jcm0%r`{VVVVCD&LE-!o0gqsdCe zWY<^pv=cWOf}DN^Q;x4@y*Z$YQ_dD8Dfj9${<1)&^cVWvP^EoK4YY^4zRoelrn zENBZHeZ%V@(hAr(8^^Jw-|C1nCCSDlkAGUYM(5Y8-qr`2y0X&Ue-~jRQb!CtkUL-& z;DF(*<|uw5qK#YQwWM-}XxzMO&2dB%`EV@OPYX6=&TzEq9pj2TW2-Rz9Cyk^3oG%P zZbyGbdYK&UIRHpEze0`CGfyyqSGZkcPza2VVRn2D z0}6{ht58!9ou!c?i(nR9Wai9}`To^AOB;>aI!lS|gE2Ovt3p1@3TQ`pknn09a8N~{ zTrO8?s<{iC%=D7bX>8+9bHruWV44NvdXZy9vpWRPV^L?7Xp(1#*ldST=7JWace7OHA2K zp9oJ{c5?`62X{iqbY{}_cDg2GGvCiEYcn0SJ7Z?RMa3g*_Z)JaWN;EoSbLFJFWOec z?2qA?=zmsl>Cr6s%qhO=F<}cuCS`xtaR%f1IOdvQx&~o3HWXw%cN3$Q1oH<7XR1hOm@c~G&q0fXO8S;AiViDk$3IEM# zt;md>BWLVK$Jns*AKiUTIU-eDQ#l73fru0u8lB-f{ngG3$V|B$+0Na9;QdtoyF7z!d7? zDgSW-iGN z<1tiN3+|O=r!^d(gMyK=^Fi3%vB!$i{ZZhX=tvzjoA&bMau04 zL)Z)8Fku0HPXzDKvpwrBuE)!!xDeooZ1ULOf+&EjA;rKVe$ar4s!@};rUVf|vB%6(EnxtHc z>9L1VBbjz|+&BzWKTq1-C7lUJBWx)(N9dxFc|96Zs++_7Ie4u&x zLQv4%oZ`f#HHePsEzCzm3&P3RDjW0%4Txvwmv3WF0%ht?HDZINH1%vdw{!PWU<2*0 zI4I`_QpG(q9HMZG=3x%dtz3>UY$A8@JpT-TfFu5m3nl8+Z8bMu zDj@rk@8AssHEtdAC6i!Ek~d~Y<1N~uETq=7v%DIG$ZOW;MC}rMv-BiVQTO=jgchb0 z!kxF^+YR`fgz^d1=`)R!tgwnHq`oI3^7;xO7}q_mv+F#Q=!r;*2(h{*rpJ5#B?aHS zVfW;ZD%^4uU!Ea)4|uVGlJVlGd37f92{ux(45)D%-%y(c>Z>E4e;N5l8t6&Z`OPo!xpBUzWS+Qv!lX3$^@(SNX@i_z5DKUII$uqJ1iVi% zh~;^~Cm8Z~4G~A>@b~AQj+@MD9pyKr~JnbUv_)Y>=O<0(F9^leDzOg{pmv`SFQqbrRcc7VQHj>WJ8}weC3GG4d#N( zPmSa5GfJZa4l$352Fgk$?!JU{p*WVU6w}|KA9`3m&$qq`Q=zaHR2Hq&+~@`1;=?xs^a%jm zv&cKjQpDN$&Mgd@HeDIbxTBULtR5y~y2}8s1^u-dq+i^W-(7i;CSkO|B3@198$~dA>HHc#*8WI#%M=b zyR9h~xYjU{eq)R9$1(y?Sk?(UMuB1>7y8Q;ga3~XDJY5`p$th5{?bJ9^HD6FXRAEn z9qdV$hz4$FD2kvm9MEDanc|VU!nu@36s4bOIZ66iD)JfY_maPpF8`BGgx^;tMe*fJ z6msPjYm}bL{b43KpK+_cuCq9Urjj2)Y2zi40ZW_5A~#kffqVr{oD(pE4uF6JbdTK2 z2&o>#twPQdonc?w$Jj%|n@hr#6i){zlEFYoTW#Ct51OE~Qi;_mq|%KWK_~&9cDSyX zWw{Q|7E>?2-rdbwMKz(?dw_d*vyWP577VUiB{twK=M}VD+VQ0rCuR@pt zG>kVgRK`fg0>E}FBPyM!a#-Xro^`chQ~QUBm0;CN%P4;vy*0W3Sl3YwUh9o}GT_#W zu*l&Hsw$~(Q*1kBFz@4liN3ZF&o{4D?)IhaOz;&lxcb`_vGBcZEy#A@QC7lZsgA5Z zzJ}<`Y$QHCN|OakgcJJjCUGnv*4^rhv(@k;Eb+WUeVxjJ5B*F)Y6USV#2M%wt@t2R z2!}9Ow}x;X=q|>ykT@VpB@rBQNdW`?6oF67Hh91pHOKAP`TE(`%6@sFkq7)+L7{?B zQr$;VeUd#XI#*ekvAG0m?_ySY#+P|wM}NzK*Es#(p8QIYK-5{_OyO1pwE7bCXL!$F zK?S){gO4HfpcBInTvn#*So>?|opm>KM|^oi-0ou`X=)f=ey=jAP%JLGyl+Oc_Snr2 zLPHxlkLk-1$(fjLC1mDdc~~Y8Z@ijxi^aD@6qd^uun(z{vIatY6TUQAZIH@F74Clm zbt6c00fd=-Ggo2?bIK%az#mk{3=FGw+DCE+KG7NG8OGMtr>#M6>WN#{nm&$)khMJM z@>?e*ViQhXEXPVn#S5h7er}%e7-T4`n;{KKYXRr)^mNrNX;hk{eBGa}o7Oqi(Pk^$ z|HE~b+-HX&!2Hq;*g}dr*-oU8sn3J~j#Fk8chEDAH;840wG|UTNkNiR95)+{=FrqCIfu5{B{ zU#{!}{$rHRIYTl1N&Fn%#i)=wtz0m_QLz6%YV~@Vn3@yFg#rdMLTk}<+`87~kGzhU z{EE6q36*@!zhtE9`qzb>d*#Pn7@Rn3Y&C=3n`+1nEP0;d&pQVcqb~SaU5n-n0(YMT z3I+xCk;OsyYtf3vk+tti+T)G_+Iedh2Kxk~VHnr<6tSjIeW|!}w~Zchube~KA<;+M$`;XNau*-#917G#+fWQ3%n{o`fE~JV ze)J&pA7)mY7As*ZTsPPy+T4}7_PugEy~|? z)_tS${b#YN=deCdCw31CSijM9TQDAa8W+cUg@7$+X1fLHtMg6h$4KdyTF63>zGq-h z+o*X*sQY||B(so{TU5hkn1@>eu2Ctk#1;e%zs!Go)=sXj7dMA+c3f!!> zYEk2bJ2T5*DPb(_ti*TByN9JhkPbgF)erQ90_7KSxkI9}%EEB;{F1%dPp~l^3X0Y) z@AONq$eF5{>c07NEj)CtT~FT-bOHK(#pnOAyM|R|_+49q%8E$^aS74!hMj?A4MHZp z%EeQ*BJU#_tXrQQMQ!&VQ3>#v=f1j^wjZX9i@u}`s$OK3r>F=xfy(x0AS%xa^Ao7~ zT%Q%OX?;0(7ql{1fe_Ys-;N7^){2tM_gPT*WNF1PH>Pex1Mk42e8G6*WSE`ah7KwN z!SdC=pJPVV$e_fR_3Bo74r6R(faSx-0*uI)M&aL6im&Wrb|n$Ii>k9<$ne@Ts8+um z83sYq9}0q@aNRa9Y2<*VCD-!c_-Qm3#B%0k2U;`!Zt~M9Ys6+aL{REh*l_PY7C?v# z3AJx+nFLLDx)fLe>V0|co0Fd(OCV_?#)Fr^q7CvZDo^Rr`NwmckWw?!vHc>jd*%i^ zgP{pQYxD}Oo7E=gNy39y`V63fqD-IApzGo{P(KOC>F$3|fqR-Snrme|l>d_HNH=)z zoEs!W1j>q{3E%v_g+yf;fF}u7JFH?w0Qo*D`X89F4bO$;Y^MoeMHquaJ=?=BZu+S9 z!L!$1u-0HXKFO)nMjs5pb)&))|+?>8^W` zXRF5A4?w^LI9X0 z(1A+W+Ndf^a{w?#?__6&VkhldCJsvK4T}eu?+G~f*x-_3`2MMmZKR!*w{9+j3M*vc zRUtHYAn?3sl3Pd6wY=%b)39OOBTKe{F-CH+X)k01u7@Po)KG; zh{Xy(`(!Tvf7$4wAec}*leyvLLD97wa|#~(6S&^`gS*zJ*CQY|-t=U`jGN&u?|>SA z7PnfxLo47)qtgmqr6MuiTG3Bf5p1)g4ZPSW5CpSIza2K7pVkCK`E+)=)|9q4n`YSa zmf|5P*xU8_=h)~}Dg+hu_HeA=Yk@a4cH=ceS7~we=OiW!mh@OchSK-j(kHk$~h_t=~ga@aI+{aX#`g?_?IWi*Pnxx_$?oTzI zZl2s0aYRrI9%}l;CHe0cQtvB^EJ)q41>A~Tj>W6_qT8q|Qa&Vo2c6FX|F;~LQS^#` zum9ni>3s6AjlYd!)>?75$i|RLgcK}!GJLV(7GE@H`?kX-0}y# z++sJM*EWS}v?mxqHX!)29y7e$R0gxN{jW;5o&Mz4N5f^?s0YrhvXwJdNcnA~1iW<-;FLYIT$@@lK(@z*hTBXhig511fYIL)hJ)CsQ$Q}Tz=D3Kq?F>q1Oam#5gA9NfIy} z%+XQVdhly$pdj2}CiF(QFoWb)IV2sp$cjIxrRNV$LaiKp`(YJKJtjgcAY0I^`2YJ zJFfQNM-Y6pMORR&(g*wGv{0)z`8S~VHu@==K%p_Z&nA2(KySX-AB5xLCzS=jx}`Uq z+QGp1BI0%i`EBJRS*9HBn_c?%xV(xlhDvAUIsKn*;qlN#rK(4`<|_ zmD9-}lE+&{{CT@Y zn<{E=70y6T-Q0Kld*U$-hGZR;LVE4C3Pn z0jQpRjJNsY|H5@s{aH1dZ?_yCwh0vQ^IFTW?%>HfpM114;~i-P%K&!U#{Y)LiQ8Kc z$V7q@2UKQe#C&;xqjR5s>2$pbTZr6~gy{v$kn`B^(rpMgMbmVGBOj3_(H1 z394}Hx&6;%TCw#0z$T+)-7Tzi(X*y=7Ooqo0K`YZa8#H8SFu_(c)d)@Ra-Bi-CJn1 zKR(aykM`>#LBnQBFzlFjfc>ksOlZ4AZt?Ob3DT}7F?S`rgu!EJ9hCX_W{hrgFA6XT zr14Zh=Xx5e+|4#*x&dP|`kWBpAZ1{ZB7-qyok1&pqsL1)PVW7PTERLisp20d^SOz zgPg;V4jLEA@vP9wN$w94J`nZqgr``9wQ1q-KIFR{hh<{RT`t`)4Xv{7EK*WmUG6g` z{I{N>{r^W$zfGo=tO+~Kl(CQML8&!Tv)9UM@soX6>zd3IYpR-BNuQk9u`qP23^AwNtp5Vi*n*b_5{-g=IbIbr z4LtOxx~bj;xwrJndMpzvwg2`e4aGHJPEm!U6GG>Pjdon|2CuAAp!i%D(zRg}@*93H z+%FY}q**$Kc6H4_sCP$ZOsf(lP$VEcoa@~Nd7nR{zGDh8zI7l_unM%UsKu|1NGy?r zC*E9F`@r(ALppI03S29#U$FjA?3ybo!A)D=t~xRXL<3F1q3WyA=gO)Jd(}%cKcU@L z5pE0NjZ(P-)X_w=?w%#eg(OxRngDmB#nU#wy}C9#zUo3udV+MblcBln);+wh z;fpla#Z$*@N)^!)bM&pgNz48}C9NxAX!BRQ#s)+mu788TQE57MEh(|&pBPXxi<-d; zUrc~s=#<>B#EY!OuAwSG{RzFJ8Yx|_zuN@r!D5^yn-wQ^DingO@Ot+^?KXhWq9HDW zZuQ!*JKz2~V~H!i=Xhvkt!+)H9aE)1?^QmqQ7PBbr!4qk8|JNvyGRGHHpeUICiqqS zsygZ2v-JxDUlJDI36SWE^$CSx?cmwWe+sQSN^Z8Jq;fsscX&O5EYmy?0WmM6L5ijcV)`d=#{v!=bQEe(Rz^fTl571Hkq^jS&vy@#)Dqph zFWRun{$=A5RBb@9^jo^>56|8yssfqaE~6CD2T=r29mj~teueQADNlk|LtM$^-q3ai zVsIHwaZ@+cL0(8A$=r)O+p%5U7&O3b`E z_Wp^Lv0n-6%|b5pF+h-pL!G@JO&@xj3uWQNTF;ipJUf!=LFm&CQb^Z9i6$9a82IrQ%G zt8=E>?sL>1-|IHGzKh#MU_Givia7GB60PP?T1c@Jh)^MtjH`;NVrLq_+ltzB-=hEA zi=xETRdC3EMysHi}+sPi}S8kYoW=n)e!Fjt7CxRGX zVMf!b!W~uDtQv`_aj=(5nI_5G3$J%JPZE^{fm3;Fe#2Nz$Y=mS-UCV5a|!IroGLcP zrvW}fiuBLqQbM|5H5tWv<13{@pwm1kw;l)+$zong-hDC-Xy%jTLsB+{6eeI0gec6q z9a77Da!$;*+28xK`;Ph4v*p@7&ZV!fO2|49Lin67X*6cD5)hnQI-nt1BFZsjY=y1*Y4Ai< zVqe+jKwc(J)2|K6|MSm5>IFhyZ6XUTY>QODygp$=ljgf1_b-v#Ew_`3I<2_PsiO(b z>Oaps1AZN>g3qL3NPq6)7GnmHN`Aizv7&dbg0(`Nz7(APRgvr4h%FPu$%mFXvM8;m zlTwA8?G~^1WE>7~>{ShwQ$yrg7%edqvCl)#;_F7*Q?Jq0sI6`YNy82LCGpJX`$8(LeFjmXk}(6Pg%rO#CjK_Yum?U63C+>(_Tfr{$OvH!lhH)J<~K^la(vRX5-?lBc^rws(Ww{uuYxDyaQy zuzWm;e9Jxjp=n`%?a@x(>*q>oNU}|rE8hTk ze)NNbn?1%VUeo0LWbx1!3`SVp zIWL@+qeD~zxaT6zn7krf>v*_itoN67b1YHMgGKlt(;{&M3hEKm;QQ%?Sx()iS*PP4 zr+2aamkFm)uuUnW!wi^7QfN!f0OdnIOJoEZOH3h1TOLE8G$CHB>1 z78iW0G5LjcAHW+22NezAE`!#^0bB*aN?puGP0`C|cpRL}6{%R-q08R2bQUF~z?Ft9 zTEEn_my@Z~)B3ZoG74YyO;V}gcQU=qsjmfMVbhNIu=pqh_XSohslJcpG;#vtawX)^ zy=!&+KbP;=aGcv>g(6z!U215Bg_mj4SNkfIwi0MUIo0KSLpH(_*J_OrAmU*XN}m8PhTHhF zvlpyexMdF%Qe|hFvams2#x^r1BgsPN)-%shWB7^F_lprx9PBfeOP1mhSeZwwr*s|& zOXW>h9(+pukzk34-wy1xZ2}qr59s1J=(_hEuC)wmhLnRy;KBR*91;IZFtTt=6(y|i447} zzZBsKUOGt;L(?H9K}_@UP}(5lZ5A&TCT}*hQ?P~FY7=7FlR{HUS?vT`-m=d|GfBxV z(6kwW?b&WgZ%~s#KY4m^dhXh1)!L4P!3M>LX~n*3r!?|%6wI8eGtBo#gAGFA6Zc?s z#bXrEd8uO63#X59)gs&R^l75?%Wdh^<9sCqX!2nqP49cj_}-HIO3newJn()$6KADS zhvzA@4!U@#*HrrqSl1w#0x?dSp#!n>Y)o>-01_6Xv@Hn?i_$I^+x2j0dO)QL`nZDn z)#Of>XId~biqIqTMpOf6jc7(s_t_e>~$W*yxGC`litYqLmE1Q77k7)ZV7T%zWqjP2NxCq%W_JboxMir#W zB!-WLFU9Y8IG+B1OFJE}sQp%t!fmP^o_)&eSpv10Rvs%;;>g3X`y$njK@RBU)1|;C zy$2UdMntT(2WFS%d#xWvA)}H3?^KnJ!rsDTw!7O8`7S+N(Cd@;8QC}Vk>rGC@>s*! zaK0oDnwLK+HZxQ^ZUzMO=RkiXbyy>gDU5B~A_@{MdS&dR1nH%exA*~Inn-c$rW=&u z7El0SlY%Y}jFEjz*|rh@Hsj7Mvp#~zA`Y*2-f&;nT%Ga0@THjMbw{UAep2Zf{FCrQ z*3J9q+_HKwsfgD8!PEB=41g08-q8n~I&pvq(S{czzPDKGf`vPb@>OHPi4qC*C2{Go z*k=QCyZ;aW3x4NiWebNW>Gfz~G#Zj#9r)|U(jMiAVj9aizHnR$3X^QxzMI`&Xq)LN zK(<4}AZ{xQJNE1VjrQTfX;-@q#vDHO(pEXbrc~_QRqKJ&yaPb&-$eUlrX=Qv_9fcx!37d2(*PNa*Jyg`rt@7>0a%KpHfCVv+jNt}AM~&=}wMdC7K55w)!P_YRu~?SPuw#CAu8T>&^UAk6*~P*=yT z`h23tP@@82E*wA8J+%q}Y;F*OJ0WpO<~(J-3P`qt-DUb=)b4qAItlo>J~Mcm z)oq_nLH_%R{{>yzaNJazrrYI5)ymZWjZ8f_o?>`C=j*yNW@I@Txjb&E`-X#y#u;GQ za#Ew#kLuMBH{v(o&sm%M!b@*Yb{1;ajbsko#N^Naz;w~3Md(!&o#+OLx@E>+u{q#ST z!`I~#QbBX(|IARG!&~HKaeJ3_YSJ-6F~T$0_V1 ziotT2?!tl|X)&Ot%Ox&DF@@I;M9Dei(KdUJq<(gR`8MXQwqhvsCdkXy$y(Gm@t)JN z&k{7FgV(aKnNV%zw&81vUaN4Uy#13pE;QDcrr3m_Wdb2cWFnYVt{d*5hSem%S+GUJ zj>6}{oKTmGFKTvwR+x1U8Bm3vRWK3vQ5Tph_LqH?L#9sT@7-VYS zQ`vi_J=*CXY3`WhRtw0FgC9{sskFSjI)qB|JGE&P^XldM61-7;@%!Y6MwS^T?SSIX z=`id{s!0Xj2&{Ve^Eo~;L-fi)H)~O`M zHsc$=EEP)FBfgL*)mC*gJg!<}A0(&bFDfqZhn?K~wzb@6@HzvHbbV-;Ij!DbHdKKz z38^NEvL2ckW~t@he%6*z>%IKNGG>u3UkGh3u51?;f5;o;u}eD|`<*XJyZY`A2~FlO zk?ZPsyo_dUQPPI(5wgb4HZzf1oO8K=8UQi}lkMX$14=5y)x9l%6Vmhk(k01CCCqb0 z)gaeAniWQNg>xbq@$HoosfdqmQ&R#CU_eyiv*^?zIjs^I|-(qE&QHK{H{r=hrGkOGCaA8+7yynf~mGBP7PvUah5aSN9kj_uLI7yX%=QDi_Y8<@c4+?gm zb3ZMIgN(i%w%}b{`u2CiMz}bLEiI!9v~xQ`N;!ykMLY#GGafT*cbL%|-5ZFr zY|h&8>K{lx=6U*TxFx=!AO;Zn`U1b4`{=1G(VE(bq7e%OU^3wJ9=AQ9X*ZCS$9c@9 zMN=_LCoB4cr6Rw4d9Z4~-U>x%`e2~aQ$kPOPBD}ybeMD($7mK2Y!@JFijUQ zhZ!@?Th0KVw-ilm2huuf;so}xiNgVP0dq^E@o?=zC+ACG?r@GY6FftWokB1;dysuD z920}yO*%rBWtycZm*cBF{re`yUtAy9>PR zp0?RahGmFvRUV)U8?wF4xp*jKLAm~MALW=@k=$mEWJLwUMhuTDTpgV$8a+mFi0jgX zp|n-I5o&Wjp(U+~n6!{3_)sGPEjgP?h|B=wrzs4`9gmo}944?R2Bu0%Oo2AL8Xnd) zu-olPxpt55oV)*MsD*hGrKbK0;r#0C>62wKSAXo`iidy~S0J{gFFVzgbh}-IoK83! z8hG2hg^gdKklB{}Q*^qP1mHU>fF7}A$gC~W#*(peQ+oQNols>{#~cKs)auX{%39}R z#$ygEt3rAKbIC}eBsK-CY_r zMO!t$xYVOh@)zRcWG1ssoLsLn+rk}{r}Z)Hr+g&g5c1$%PxoH&-pK}_y@Lm=uN1ZP zhu&(0B}jtL@rG792F1wA;y*+6TmsBmk?}UK||#XsZj@xQ*JDc_Y``0 zjUw2#ku#NNT%YcGScTmK+fPbk*U4a0f~=YWd%E`a)~!Wm#Qb4I>C1s>SX>G{E}<2x z8G=L{!B?~aJU7&f7pc;Vt!ij(#W%QCqBwKU@@`KLd@*;pmm_ZtD@jjFTFr zbHH>>C!=``g^N(qa6|~Y}VVABH zjqtYmSjOd>4UWy$ps;2yDF@Ace&ysL8E>d9u4-MGixb8&j}S-ex7EZuVv<2)*!i2h zHuBTf8X4Q>+BZ*VzC1k*}xyZEyUoQ#1>M7hi>&K^L#{`VXTm?RiJlp+<7=$Q` zMaB&Q$+qZah`kd3pI`lYnk24x@RfNJ_|n)!g#Y=N(rXsvKrlw%zH0o#OoERtsK(4nUS z2YLcXi}m`I-5%OHb{c#-UQ(TH&WP`sRr~|{~ zuRn5qR)3!L2#C<&zl5+^5ovuM^%!7{M`7o*Zp)9HV!tbFjoFh^Xw7Yf-l-CVirEHj zdUs7%T}^F^pwv|vRJa&qGzK1XGRf+dKjUAG==$4(AALoXogqr;s2ZHN$>a|V3eyvU>;@(=qC;dp+)>b4 zgwoCh%0jJLGb<8)Spqcw(3KGS73G3$M~HgH#5zdye#cYKOkaY&CN(znayY?rh#kCU z@pa=t!jO0CnBR+&>hhXAOn+Jmv**r>t~w+kMb)R)C-|q}NsQKpy@xGb2Zoi_(~+qy zQ7X35=hZ3d2evh}ZAs6_R#0nxKL_>Rg3<$M1lTa%b6Y7D^I@Mn z;u`rD-+^F6wf0h5$q_TUxw<^zit}1zM_=FwOIIWV6&j?r0|w0anNY)X4O0C?e>+OK zgWbL4T`$Ox&;@caQl1pT4vME7DH{e&6>uOLi_u9fXn^CJtMWcABGgqb_D2NywxU4~ zSlEGzp?`zN*H+CfT<%c^AbaA6X-`i8*d1sedSS5g_QvAoKm< z8R@5q{&0#?`!M`1gskQu>&FtXV;^eu>-p!;HU~m`0=0AZb^!{>uvXG&Y8TR-HX%%J zcA(pr6`4xR!6M8iv={HN+pq#~y{E}#Lv~L(3|}Y~&$p#sYdXcRTZo_(;dxnV{A9&B zk79uwPi<7}tLqvQU}Tw-O$L(nSLdS>Y~;6)vB09-Cw`i9zKmp%SQ4ZN#W^`swVbUV zYsj?1T@{NfpREbog?yuIbPLT=(^R#Pm zCZgvt5(dF3(Y?D8|M+!Wo>p+ME*|CPqG>ua@+STUCS~4K!H=zwcuLtnzotT{0{@HO zXC*d7vMFjNILH!GOZ$_g%&0x=ag#pWEcCqAHdP@e26oKOM(@SN1=|+SnH4}3!F`Bt ztoHVIuwa(*9Ny5bBwkT50lW(?AfG_z&R%HR2|~UKLX!eug?K-VH-uu?)B=gGP@Z=4 zzQJ!IW4$otZrA&89o|gae82~qbeDW(bToNuK8591Ng&Idi3A+j(dg;%Jwi# zHU+w9ss^{ab_*xm^$}e{jq2x@$i!~2VD_AZjT16YdQcW{7L?G_evrg~?=^EW#K^u> zABP)IeUiM@_45yZ*Ui0fQ;cXL{SD@w0AJ3)M?*MJx={!;d%hq{3s~}N*y@k+)m$_? z?4vl zI0($jB_oK3$FwyU4-UyAKaBVYvSl4xS0%*Y^Xnw$7~D(Q9qQ(w1Zm}r@!eqi+gZQS zuPA|q|N2L^_XNea0SOkRw+IFf+6*M^{vo5&uCSkR_We0W6Gt!YQ*4FNR2Ev5F%H)>o5}p!W zy)OB)lJ6<`qRu?oV~tK?EW4OAO(7!5Y0LyI`S8U$0i^1WGTfh*c6+kw{h+vW8-6|e zh);+ufy|ZHJr!J7g%)B%5#b?DdPceQC1FUkXk`o?$iMcm+F@nO45N zl;0EE_xxRDO1>#~=L-lA#~!ES zP^7D?=~WI>(|y+>S`o%T09qca)WZk8A?Dibs_;`n#_YBiIbBab(fN0W`}hU_n{hb9 zMFd?n0x6`?IT7GO1 z^u?MiUfTK0>=K~YcZLOX_~~-%t)&<$>otUr6XPe z^?-SBxc1A>Nf*g&;|m$%UEgWKvaQ+BzYIusOfr`Tl#wMZY8$0fjQFasz^3;)%c16R+@9~>I3+hHBU-qNdJ%OoNbhENC_yuz{^kdg zV0k%LU{<10Z*HUuWN|x8R+VJ}tJMjvGQH>N*d64e`t6??R*pz)(p54+4OTVUJY6)$ zH^To497ERBM0oa!?6HZ2>cHI@g<(Tf=QB*wC1nDeMi&flmP87x`+dKeDUNqNHJkd| zk!WSf@gix-JYQ+&!oA$O0SYpj)!?=x{~D~K7S?$%jUnD5+;fuqepn86x(_nQRN>&zfvdB{W1*JldHfO+xWCpzy+e6_rM2XMRKI}42j>Lvp` zD6+&gskEWY?R=S_fa_6K%I%Eo#u0lm0wm%EekpkM4ysBsaD-JINo#_NZc1gYy*|Av zB)V`IdOAIz6h(v+Zt}GTn>0*2D9C<-erHcTfE={0m84yqt4^O%ZH&kWHG*})$4hZw zJk>WLKhFEABJ<^6CHkC*tU6?CzF--w|nNEW3NR)-MRZ>scdPF8@-Kq4ZLUb`W z@a9f|{Z#}p$1V<_2Aaln`HILExY%+HcQBwq0~@to8`klAdKmIV1Yz3k~*uJOW- zS6jM`cfId?<7BJu!e4^mx26GSy0`Gur_d@uRQA}?!HZ34A6Dd!*$7arG1YI2am0TV z;0X4m%%x0=MF?Tl6k_t{-(Z^(^!dlxAPdMe01NXPs&~x5*}lU zsHCyCX}xk8;o*?QXbMAS{amcpW!OE#@$o?{Zo0g1TU$;6Lge?@vg-_CM_0PqeP zmb>RhWu1S(-V*dzEr-Cn-JGdlD;+tWUhJI<)KTSdD0#P|_nPcQleblkcdvYPx=!W; z7NcIEQ`Zml0(`&<@dK{nhLQe-m!)oqmd`{qe_1%gGt2COCz{6`MI-9Q{t4e{Y9{~|god3q-K$iIOi}hGrXDtgC8y@s0;KO#Eg^m zXQx<^$1!wvCBcmKu9LNn$OQSGQwIIt0;-SJ3MJQ*{4RtmR8lpaL$1m5j3I(qC(+s| zAA7)F?Jez)QD4E4Mn=Sx`ZuEQ3>n@+adl-)oJc#$V4mH`?#<5cware(V%j9crBp4K z(e5B19sQLR9O|s;g$g>f69W-ca2{5|7Ke}u{ZSU&FC0l7bNIwWrzB^RLT&q4`?2x1 z`j0~(wH#SMHY`6lR$@cSXr|iBqn`iZ5^TzQBG55{Op3n}Ob>q0yyX%4qMIG9Qg+d=du^05a_~VTfl6+8va-r#J_`X~2`s-w#JZs2 zWQQ;H=`Wm(mIWXmt#G56&eO2=3PhvLiA+fLz&hi97NUFV%J8Efykug<2#xo@_==P5 zRZG9q@hZ@I|1%f`W+@892%chnIF{KD!jHp2f(aiCXtr-jnKgO_?l;tzUm@^>4K|OC zOnpa3e#8sLXB1$R23cvP`k?QsCX8o|)i^tn@Z1%klx4sVp{+8nOXHay`9kb;P zi=#;_zs9F3K%T4MKtBVFDj3{~{#8|g)JHQ|RR;6N&&7dR3v}Tbdr8p~{QbCV$@1I7 za(>D%-U)-($=esdhnE0x@j9m1FXSP%!s|=iA`RV5+oy0RW-9+q6b8h0;HJoBTL3F2 zdmx6XG;Oy2qavQBykNLl#+VH1GNc6Y4gE=ub`NseQf=XyhH~SBz4M#zfJ-4VqGnKP z>|V$A_z@eZb;5BoEMQ=8o^%MIFg9y<=-GNRY!`EuIyLo|+$y^{!O|*C02U(Hbl|7} zcMYFFgn|qiZ~l({%FKZB}K)x|!Rv9HSzg)=ESv{@Rz*{XgZqjpOGY7;}&%?rZRDaR#-`aHTdmyfii%; zE#RDg_?+8^(>Cie9yekg{way~<90y!Prd&U8yO_inq~H%FFKaE9s50kW?1Vr!2t=? zhWoz8D;zUR+8Lq!<}4v7%=C1P$yVy91_lBAm0{2j!7-3AnT} zeosUAs(0KtuYd%5ab8-1j{=|A6De4Gm8Y5RKXG62j?3%Ol!AP#Yl)fEmP-$&5T|?hH0_^~}Q7&Zc8 z5QCA-u#xq`1r6)nmDONq<5>n;i^(`szzeh+&eXqSa*zYxH*2y{Yd)Et;q7{^3UX&? z`rl?kG^#3w5E5f5B))D~+B6i$K!F*@QV(whrr<(94oajJUf#*h-3`6z0m}Jk@r--3 zt`vmQtFZWiHgw6JaB%_6@RN4u_#y4FJ>~1dwlB5w40A|PGB45K6g*+SS&5XFjMKrM zxwMBvl*+PHcsaObB@Y*glQk6tv}>rN8nBsYyRluUa+ZY-2O~65Qh69s+CH$a3`>vU z&uN@FHh$G#fOEKhxDoj1m_}+ui;tI;^ZSNE;D+py-BP%d5R?6eTdG}hXTJ21=E{UG1!r(yiOr2p z99xg0a5qjk|FOvj49zh>v??0?2|6xQ?aN#Vzk3V&3qh>JDvUQBX;6phMY$Twk|?g~ zy5Kmkx`6a11F89Fn*ymHT?V6i8+tx7_RxuNgo9N~6WY3`eE_5JogA$1Ysj2V)=eij z#}LfHlq&DBoI#E0`QPzKw*!|LkhbCmy6P=m@6VXq z*abJd(z26kgE?@3?iEcADZ2SoelrY%!!uwO*zIe)9et7*9U%^`>9OL2=@+8oVl;bT zMP&!n%#MRIhC!OT4RyzOA#}ExX>chouXrTJaUr%cL_ssznAdTMAjgrWlhTrPf zcA)L=JFB9FARfnHyNSUuka4%q&-KRKgjINFH0j9*MfpyGuNU>;|R`CC{nl*hq7RT6LQRvd{xO zjO#@oJ$tK*#oQPV(Y97#&xuk?afKjJhB$oHIr~?yg0^pfw09|BbJot z2mcpetNNU`2R0Mj?!@@Uv8>i7qD{#DD-7a6W@uQ!z)q>nV!`Euf)wPrOFj3_z^9)z zX;CCIx;dqIb3HmiZ6LK760<_7Y+Q`|vQ35nTSz)oEH@pjr1Is

bq$NULewqS1f( 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

|te^6o7P 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 z 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 B+eOLVbcT9m(H(50F}2&CI6VbQAX$3x`UvuJFT z;oT8l+ltKPcJorS5s%%-yU+@};)JNPuB&8Uw``ukyD}7^APvs~aJEYEqxtbFQiL6m ze4irmP*10dU@am>v=1t*QTve_<<;byb{8a<{_U}ibFQOWS&k+NolUyVWdzItN!G`2 z(1~qno4Q)cJAVXWSZ>h5bFgN{2L3gr$Sa$8zMXP}?7_e>&gK;^y%Zw?=f%%}9aVq8 zaNR{v-TG@`#sK3@#&PheX4mK<;;Jr0pr2*IpJK!LDED%eYWdBt8qz}Z4^wQvA{aDA z&ZZ#Lb^gKjtHOZ>7$Fbm=sXxi9I9do5joOUOv zU+Qz3XpT&1tE_Fxsqm{^OtoY>lCWk&5o4o&Pk$3{U?mfl!X@UQn)kjj{A_!AcTOv% zj~~G3z-zndi9u|tuz{WRsu9~aR#LLQ{6a%2HpK&yv%v>v>l~f2%ZfRyeNC{$`p@%> z8@zIzx%pZQzM(c`=0>wo9{BZZF26cs(|)$xy=SDWka5jF>kO=JM%nF7LUw|B$_ko2 zU!IorQwoc~@@l%?!_w=0{Zh&MIyhNaBOkBktnG-CK6QVo0%b^~kmS_Yg3Y>%wA-3? zEreUKyBW)mPLm~is6;zi;;j*#Rh>6->F75XQ9CbTeUH31kC>Iu3ODcom*Tq!SB>%s zrs2&Ur^R&<==eh_QHD#qq10|v6?1tw=d9nDS`!d_t!_5h7Zlil?s${9;QA29=!NIs z>69OJ`OL6vmZN^*!~)oA2PkCotx&C>9B6erw*XUjo22NQ%dr8tItVy#P0?@l4iq@>9IYQ{I7K3bjzQv5ql!_ zgr%hd6l_xnu4|R~3XO)ZmAx9;m;@2MygJVw8FZ2IShRB5BN1wgR;oA739Wz^E3Ts+ z9tzXSq*b8kgFjvVn*KXvp7!Pm>{qHj8`>~q40K!mXLno3XnynNDh;^-Qglm)pjbwR zFs_4u20RsNM(5Jg<3_I7%^x@Vq?_QFqWJzge+ z13INsjaA3DO0SOud#bc4>EQG8c!32+aUzxHGU*a8BKNs=TfQ#?P~vdIvwv?d^?{#5 za58q5RN6`#HWQqVgUN)H-Hw>BvI&K}oGZ{CL>pTU&xERAA~KF&RSL`Fp4Sf9Dq@iAmenlwL9`|lW0TJOZMLq~DvZ@5hcR8rOLrwM{E zWkT1g|0Qy%#s>;_CJ|aEKJ-G34*Z&{;E2K$l2=x`Odshr+yn)AXF#As-;ihxqO%~M zs^2i%O#cQRN)@){sqkr@grI#(n*FZ(9<6u1zh&uckI0D&um3g@lkO{U?LA71QIR10_f zH&aCmC3x-g7QoYrk8MfkV~5fBImg&+6sBru{yARao+;qZP(Xk9Rc63sHPCf1bcAJk zd28Zmy1!_ERE6iiUyv*ad!7q7U4zyG(JToLWm_xVio1$E(j7v11l}b297E5X{6A=o zaiRHm=YAS5HWQTwxT?as{=OhQs2}L=p6*?rW1)4vB*y z0BtuPSAaUE(rcldw-S1cKf0Q&@|~pz>+}ge*GvdEhhAnlvC>CKmK5XLfb%%2B>+Z41C|9`}yYO zP81Zkv|7(BP&H^{Xu%onqd>7kMkmrj)Pgn6DKWlYO%l{Biupb~VkIlA#cSg!sj5#K zNy9X9DTj1Y0z-48J1{)dQL-82kcNL%L0Bt?Q@fE0IRhNH)Rq@=!^ctm=5J6D7{{1{^8Un~dd(DEO6P5uJE zH=F{Dju&yEZ8b)$Az8{yHt_Kk%W!YrK%zaFwdwZ>qxgf}S9AJCwY9E~dq(4G#s_(% z#~x*yNt8tGVjF($!=i5xK*|^lP>was8zkx1#`(5ntnh1%MdnTGG8Qw=qgwcVy@}tk z&=t?!mpopug5jG1IX(Fj-qsQ&o?h=Io=1N;{Lc@wZ6!%%vh|e@WoVE0&41ipaLcDR zXkfM7Mo-ZWtdLK6l?VmsY|upp$++iDaPck!#4!9w`0TX5d)U3 zKrsp;-a1NZhj~M#fYf*fbkD5Rn2Sg#6}e&~jx$)IbF47hZM zl-GdFH*o3QvTegh^1f8Z_pSZ?|4BV49<~p!!Z6Q)PQ`pf5McK&s&f@~E9w)hf4?ca zs4QyUOcR#Gt;M|XybLuE`1oDNj^1nZ{RH1F!fi(Da? zPw7xhh5ao&a*3BvNmP$2L{sL?_sdxb!~)(?>0w9V?6*;~p`#TR+E>x$i?}aTc>=U1 z-38FX(3IqWRT4p&mw*>qqc;u31_{NJu|eMdR@xcwc=(qZXAe{cV+7yE?Szf$*b>d& zpbC6i+jh>XK+Xwf)Bbrw?LV;WD8*&sxg+vG-s@?p9om>a1ToYMU9kvSDV--U@$!nr z0z_2T=mC^_nPN~qf%-`cT1o1ARmoQagtKgpoD6l-pbWNXWU_^ zUs=Gy#D}3nrt@1kgp7w4{CyHF<+2JcR0-fh2GoqxX0516l&woRMW z(noQ7qGUh|E?erCQYjjqX!9Ik{8U5PCx}4P9*FzJ;VTOHU-T%B?Gc-udv2)7qy0Cw zxy0XSs5|BAhubY`eY_5PG$^>qrin?#l^2s09xsuYaI2&kYIOD26s84p1huf=q)!hR z&`np6q{8FNs5=Dv8O^4VU~cjw`PsaFUljDNo5f6|0fSyE3a6ZL*ODtp%O=~cx*jc%CwiwRm@3&vCVt50_(b%CWH zFAD(U83xYTECS1+(Q9RmSiF6~f}ns61N^-AQ6!>Kj(a4#>x1x!3$EN+kG4|7Mv7%> z#d2-vkAN7HUAW3jh8EX@x`JG&Niejn`9(dEK48@;w+8>h`?c+HTQuGZTgG>}=|B7~ zqb`OMU_yoJMm_(Bk8mPdFP<##KNwonaiPos)3c}Lt8nthF>Gm<6L?5O#+(4&PsFSD zD@cKD#TJI_@_V5945o;5nUK?{AhkpUgM10j9xopM21&Bj?r=XL1UhCEk97ogW!bIK zLk(Pgn0vLzPM(jE5v0FuH~xS>2#y;6U+lATEQ1dnCTW$}U-N$^oE#En9{P=tCjwt^ zKo8P3mA3H;-3>g{jgRXNU6*-$6IT^DZnY~%MIR!jt)Q%q|FgHHrp1-dO;<&$2EhV3 zuVn!@j-?9Hcq!e~l{CQjIgf-ugh+}O`zMY=iLKH{oIuHW8uBZ|xp6YgX5Ac(6UtG= z?#K5?s&2`x=#LuY+q)94{pCwCo0uL80VLiOg@gS!;z1nOwYy(>g3)@uQBv>vo7Det zEu)QlZJ_+Fc72Wl(^}UyIN0WM2YL6AT+3C&?yoC!=^*XADX01mV?}eMLWO5;ooRXf zAL<>%?Ioo=-X8}#oNmyYuv0A{ox*&u#KLWXD8yke_yz%Ble6rhLtGqArGnZfqCKbB zZ$^L$hsyQD|J-Y5@s^wVZRC!cC)Co~c+XJkWYsX9GcO}krDWX6Khwm_gF5+Eq4VG8-~~2@_g1 zRgUCXlxMAmXjOloq~~Y^e7fc!^d{pJcOujUp)M#1H0ofr)iSMFRDY8H7qTT87ao+7 z%;|xyYSrN!teROd;I^>V$(8K-&RFWr3H}u4$zI1l?&p!k)W+VUz5;9)b3R z8bCe?PPC_;E;u;vwCv#SeHb2r|_pTS@ z#_`2%q^#@415FGNpb*~XI*TI;`-_J973LT$oQ%Lgz$Ozx3e7f-6k_nOo zuA#6w%qCdlO${Vcz@d1;_kjk&5&hXlE6Hf{*KU~;T7)NfDNMMZ^30>FdC_Je80L zOKL$JEW1)`FUH%JZ7KzQUVSdfusP}`Gi@2|fu_72*(oofIN~RkEyb?n@~Cf?cRvQ@&BRTdYexv zw1|}HPr$wa8I_rr_AqzFvq%m!tcKb4>2*%Ts+cZ(3>@!HD-4%qK(DxBHfJDLVAVE_ z5qWWV0qm=*(aW|N-7OkddM$~Q3I&Z5PiT8cNL)#wVoeEzvrlG%^mtXI=P#Wj~e$-pUgrthphYj7v<~b~ec&B<>C&)d1JgSIOHugA@B$vhXRQdh2kM)cy!|EL+{|F*2S1_ zCU?Ym%qCQIG1-fSTd_(P;&_;Y0nYRp6oEZf<9)N{8zV&{2XOES5S?{HZr*qC7 zG+}D<-EV|}D}uxzwa}R#b$}J~iAIZIAIWkDzewmzEcg4%{OuPd%8d1(4qT z2dfy%#I|?i$PzJrW?lyPNJ$;0@ZD`_IjHKxA6M-*7NJ%tpFc+_-X$CcXTyL5O=ySU z<$c))TXN*-&Vp!{#`1v#}FA*|I* za_)szF?%*NC1+w8e?|r}RO>uOm5@F?G%kAb5M--g%0!3jJ}{dn4l9VT0hiH?^w*1$ zg_HuT!$!QZSNZ^cf}Th;cWtqoBdFjjB2wZwo|ahTOW9(J-nMW)QcC{v*ul8w@BKe) zU;y$VY)myxZjwpR+W;rd*q*5+N*v)^kE6tWf=2nb)JfnT%TwqZiHtn8<@O~o;8g52 zUC=~nslp>yy!Y6!uIma`~a}-!| zS-c0utRfe_Fr95R_YJg&h1ceK^eSQ%6jUT8UbdR;GU4ht>3zWLfXqOs5s=?ce^>kI zu0&mTRba$4PM!{5Pjz5?ntQ{~0POn*lR zSfUI10w3EboJ7nWe8^FwH|>LMhLaYOA00@r%D&%0YzMbm3_p3L>)3iPw;zmEJxz|*z8rX4)n{m) zuy$HCdN3>eERyi^fBz8AgP>)<73bFV-Ok}SxB925h|iT&F_6cXnt93lu#iA(t7}o5 zCi0*PHH%>|5wJ40DV{2&=|e@2P=S1Xy#~PRKl$L%3;!NjJp>_l+p?Z$HsM+&wyUm` z!K&xh>`3D+?1bYM6z{VI>sfR(Psslr#pfzlTsiZfiHW-hAco;`0j z0%ERm4>DgC6*PIJ^l)8_)$Pz;243Y`&r*WUt#4RyDZXl}vwzHe;!|va8xzk1xeivJ zuDi`D^2fTLwmowh22!Isgdt0SCnE3t$-hb zW;buLudT=b5(Uae{9SlWfHZ$XGk=ZOc{z3!Qec>cM$|9xaopHIo`XEuI{Sf`K^Fc7 zxAQ!J1pOU;?W>3~sYc{shEYvM)4t+s^KbihjIt9I-xswsyyZ~|c=duY>M_q;$M{p; zIkvQmbG@cxDI06WmZ|pY$KK+>p;z0w;rWeP4-Khonww7xal&iFSD3X>5V`W?%W@@# zMzM+YIA!~WFD9Q3Y?=L++58B;IvQLi5v>XB(~NB#p{3e$JYa=A@fFI>Jzr?~*kj=E zX9fGw^@XZfut(u-b?(N2AI7(|$Kn2uyvQ@Gd}L8*}9{a4>ioBG}PkrO0_;vkG6K8^P_QZl5@zX@e|2 z1e9{r%R|g0bwMpnFQ{%Li{HU~fNS41-VMcd)>A{75R#vVNy=zlAd9!d3wB-!P}^MH z`3VNSjdIZ3^;Vf$4REht9nk_8!Zq#W=Gs@ID>Lg=>k;3wj(LUU79=vq@_o&$!>kX)B$eHs! z`}=V_8`UstTL{RZ+)by30~Y7{kak0GPi~;tgIF&3wg_}*%xx^;>%>UfaeUrmDP%ss zFyR8A@3A7@h?Ou4X}MH%R4-=Y)=Y1GtGhS$m`vBT!t4?P`*T=Bn1({JcmFE2Ms20$bakX#kBr%{taWiwyEBOEt=qe~4hj}G zbAaG%fkw0|!b}y7Vd8-JHjWA*_{}LQ5TX`rIf8cE+-0BmERmbMNz zj+&#wnRq2KlPLV8rU40J8{O0hoo-j*UYW!J%lbj#;@Gcq5Wo6 ztJu^1vnUs>q-)=rY$&Fw;fTq2nQt;}k6sZeS#7EW2>xILOqhHnXvp^XnN}&3gM@)R z05y;fhVPfG=7tSM7VGp96E0R2!^(vIOEt`gXO=H4&ZCffAqRN<;>ClUl0oM%KTudz zIKP)k%e|d_LC0(;Wz_P3vl$)Zur5-;Cuz0|w`CbY&GUh4jKEa}lGMAkyV$_ecGR#d zub{wLpLBOn&WxefL)-O7m~Sg}G!dyilgGp~38j_a1=-&2UM(Uh)EW z|FH_`K%$}=@pQ-jOJ?vyxCq=H#bSUGJn?huhFf0{tv!Do6h`1voWi&@CM3jo+Yj^l z!J%e*$b1E*rbg8!Od-f;V+;tDc(QI1o%+?502@^A?56=ZB}d&vB>k9y+C=gMCooxW zF2HnRovpdTjY}PE;yv+l46?t!AlckRxz%|&o!*W&S9U>;T3+Oqk`rtBk$rZ;@VqR$ zmpz|b8`lCSVaL9r+IjMfQ1q38ig-zVcw-iBmtNt)w>roHTVj0-^QW(sS$$b4ffxi` zzPT1btzFfkEvf$*s+_~rvQis<1ZS+TMmv-Xd1>uou=n^%;#z?i!2ZY9LM$h9L$?_3 z2nlOEYgrp}=oh_*7OtiC`Gwx-2Y`Aj4ov}p(p5SqU-6=4gybz<6H?)9h1rOfMr1aX**e^-oe*oSuoj6*Xd*H3u8@53a3{Wen6_lrlN z;gt^$x=vH8&*UTx7RzC8oq!as zY_8P*EjP7|A^SN-VPsc1VcgFe^~O%QVi!_|Oo0(jW%;O!tRH`c&?7Ipd*7jo@9?mt z%`%D;%1DKY^F>fuhsKXmU2UpP+}SE)2z-xM*T_~s?A|YsZ3WIz0h*B_SjSxcsn}af z=Sl5KaUIMxP|Om8O>!aYJ`@59*^@7p!V;8oBp;jL#@}hdJ%`~?a$c0nOjTVWw0-_Bs*qtlntSXj^=(T9dp1Rsc&%XN%Baj&cs}PVdPHdSGV*p2Gy4ey| zOJ9B|pwa8|O+0;cD|YeR=eRRs~%=22|n=utJVVI;4JRB|BANZnZcT z^2Lj|2`aLm{kTmbEU~kbn9Rb$p1@-q zDdQS*Ayi{ z6pn9wa~-pixZ6fgwOh|=E}I0qg~;gysMd&7PF<1d&7Ig{-ZnuxzhAIYJ79hoy6h)) zb``PiOd5Xmqzb3<<4li;<7tvp2-&Wdv)KKJ?ttVh#QuCg$8U)%(5;L`tBT4eGH}rW zVA-V!9XMcSkU;G~gyhz~AFbYgcwJLoO|2kUqJyw>&9OGuamQwqI2vxU2{r`l_!zWT ztM))*)hH3TwAyK3ck}fs?IA|(A%ED@2kqB-O0p@0=bB)u(t=nbDa0FN`<+x|k>WQ{$@^Cz9s5xVeNEb8Fpht+k zo)UZdJfX*mTyTdcIi%Y^|B;Dz?jNC2Sk)qaE$jOYvCaG|^bugoNGB^n|9}B7{GIbC zA`$a#|8r?_HIZD23wV2Q_KfdBakvHOpg3Y2Jtt^J(MMpx{j?0yT`5-}iJzec_0v;F zM=Az>-mx=9Mw!L21<(3c*GLd;qv>Nh z$h~{?)NlCu(_x|+;&cb^(l*xj+lW6we7y!(&iNNNyqQ1h2xCbn*8}R`6{0cChTnP! zC)r^(n1t$&6wiq~x+R9S@x>JInz&~0pMQZ}<%JF-Gj6l1Q2(`zfc)@;e-o>a27CZ3 zmF1-6$KcE&Lj6M_e(QdcLG;Do3HoN?Y=58@5@Fi#<#7O-tJbi&OR&i)J*+T4Zm^H5 zF0G9K0CAO&)Uv+-QoLiS0*+UH$*poiGH{JfRPl{>%ncVAh^qXBryVTM*_tRk^)QFWSk6rK#(I*_0ONf&!BO-4!-0>X)CL3Am zF6RPtIMmz~cMx0-GmitO%$*~D+=FOSw@08-Iz4M|KQynq^QjHn^Jm|!AHkwyN5Kge zuP=~wEvtQe#2AEhNBGKtgRDCR|B8W0l?-_x$2`9O&>q+Vvn;SSj5b&j%7U9hY{0fE=L?W`ZY>jM(KixB4Q8@e0?3)zLYOlb+qD z2{`TEK1ie7GV`0Y74qAR?Ji%q)9r!UyF|iY#Z`nx&pf^%(Y8*=US5~7ppklfzb}_^F(&y()dv1>i_V7MH`+t)g9`Pmnr;j>=sG*y9ZiY-ds`-; z&Ogs>%zl3i9dkWU?q}*$R=ZpjdFXy%AFg^WS&I)Lqv8uGii;R+wqN&2iq%l026H9@+NtO(0D=B_kz633QwgpyMrz2*06RE;;MD z+c%Oj$d7dzfq$rsaP`CS^VM0UFv1V@Rr(r8Kt!APzy$OQi-B6@%^K`q20J@{QO&3) z$Z4_f{{Wfz0?tYSLYTKqEsaEDW1PZ9D$H=dnb1v2gmOGh(r6V?@120sBb?RAxOv;t z7BVes{Vj(pJ$#nno$mVhM zK1q9qS;?uKF0Q=>k~zlc;yQY7#t;&6$;lGbPI00674Sq>SHe6VL8e=idoUKex?P8Q z?nmHQZWKjNf~FY-_-V+$lJz+yV40bY4t%^J?B-n>xDK)>n-~ZG*0$niTUQo;l*llLHo21D8{1pQ>unv+Fej# z0M+_9o1FA<7nBluTfr4}dMf|s;bMDFL=nimZ@qt%PrX-%GD~a*=wmRUj&b!abU^s0 zw%duXrWM>okzUH8-!$utZb#)B$Hqh3U;>}Wpx+wrp-@$M2=9cO#go)6bU&|K zy`F4gRegC$MQJm{>Fqnm+{PkqEe-!5zQUIy2qP5lCVrBK(Aj4km2R4a#zVoeOS9|> zz;=`yy$=aq%Mi+VYI&cW(A34$)C82`n>SjtK2;cYE~(QQ)Ex>JA|_a=$qzs3e8InAC1q0fvG)W-&aK?ACZ zk=N#L#E(s<5n<9r4aE1an?eb{9-+bsqfu1CCWRGIAJ$@+24hLXFB)t_(~cEmfKY)HVa zRZ(r_hT+dS=B44hM3|py;n73LC_feHz#KF#quK*JND1Uc0KVhID4|8Dpv+MfZoMt9 znnyC$@Czc_z}RjkWuuzQZ9dIhN##3_-&zhC&2hkJB5tJ1keDPaqSKo21>XdhRMxEl z1ke2};q?G(&7Zvip^IPW-ouo4Q{+m2+HoB<^E`|91f1EnrILAe_DS)ulg)cof3lRx z%G%TTQ|BX1*$XUCz2Rx3K(see(=-cN{RJMtII_5K7%Nc%mh5K&G>B8o94%>1#~=o+Pdb@yjOQbuRjRuMQ_lH}cJk6H z*%B(^DH|fjZ{sYSKSn8@0E;ydEbXKt+BsHu5BOsr->W-Ac?J$RkzAJb{-&@%iLlPm zfwSBtSmSk5oCrL8_Z5^V59-2jvGgY$QN4$;AN z{!1kClwkYDCx+`jUq&H2w4y)7D}V{NXQv@iQ-t0 zV5}=^M9}IDuq)2`PR|9pFV+v%Z6z)4kHeenJ`8jR20*tJ_ntCr)s{pp57D>{rcI{+@}8L{q)SP&uz zcBIF#E2-zlQB+uT8Q&ht*{=^8l31;tYe^DzTi3&3e`c*t@-Ab$=itT$j8K&X9l4=q z;q+YDjdqliFR7Ro88it=wGlN=$%_XWgXl+HijB{<=5{g)gQo_Vm^T%O7bTPRn`?q4krue-fUg8||%-)hW!Yj^z8YGtv2l%`pT$=R3L?t#Ni zqrX&y&koZg*yB%ImUhc7E}4=?l+#&W5cWYxl0?2*%{`E_5qLU=G}`S*SM`aN=| zJHMKUtP0AfR;7v~@6o0$yqfuu27b&$M<97+W`%vSs&GbK4HfQQa5rTcr$G@{$13dYL?=_}5DjRn3C=cLP}SI{L1GfjU!VSTOLmlaQ@!c~5{a?;wL zmBx9+zx#{7`|D6Z^_t)HgZvrlRp2MHHZhHnr5prJ60OT`Mtc<`WA@N9^3U1FldMby2h!mLnCJ+inx4+|uyWdD-~C z>bVzB20-Qc?l!i=NSN*-ly2kXYQg2(NvJTJ(k!YH@e+u`*Jv!C|s;x zoE}X~b@h%Jxd7sCaeP;;EkJ{@ACE(O_t2^AG^A8;$k{2gV#5h65wmB97}ja=KUWG3 zz^xZ(h%+)K0P8lSpx_9e{m2s%NxnGxr?@VbxakIrASZ?{8eD z2@|h9*w{#*p_1DZE}!wb5$avs^N7PgXj~1w4C!%yNkPhRiCyr}yr5KM!F*IK8bfPB z6gyqd+RVm7jl~x8#gk}7j#Qp?T1#Ve+0siu3F817&5aL6B2raOd=jBx1za!fZLJin zycqgpKw2r{%KsyKwe~GPnvkFSnnfAU(DYqpo@Va+i1Ih$Izsb{wGmDR?geOX~bIOOIT(9C1R8R#lt*{{Qoy6N`R$P`^IA z;8Q-PcG*uQP(McRbA~l%2mZ-nlhFng=yj(%0Yz-^UUeIN<7b9h?GaLw9SLC#6hSus z`;IA6AEZmK(D!TCmY(zE>ybK3rjX$R;sf9XT7vqi<^i zw|W-8n*3Dy3MSS8?0k}Db&*wW2=_D;(Rl$U;#8q7g6w_6J1|!Hc;tu^sah3`%&T^eSHE>Eac!+32JSIv@g! z&eR}wo9Q(OcI5?z)t*zOY{pgapYp1ukUxEIdY|QN7m!+I;{R{c{07Ssz<&Bo6o2!P z$p_R`3PT6|WE8bcTiz0fbs>#^c!OP(t3oHtPTHCyy0_Dhe(ML!%t-63dlyN}h24zm zyc@OhM@bK9Ze6GVCGO1H*=A6olggvX-~Yh5zcr)!K!F5{`n7ynRFK*qKn%2ERN;>P zJcyJ|jY^?x;hz~ zB;<~iz<*pTsGFCBZVUQVs&syUVcjEq^W`s|-Q;iJM(T~$|Ks6oOkSk?S%mP_8poy3 zyiiJ}p&K|*hr&BOp8_M&MKnRJbkxK~0-)?v0L-;q-qY&&ekT;I;G7^uyeO%Aay7j# z1qBo{^HiF)46#3LqLxZ#%qSD><$j#Y_4)(<2?gV||1zIF5G1J8d;|^|x(=ar&qizn z{|n>R&~xa4A4*rpVNn7%C8VkXESV?5U92vOm+p6j{b(+C&vpySXRvt7{Bxy5@CpJk zueLLJhtZ%O~V*PO_Y`UJtx>yvCa1nh|{soH}M_qUjNI2I|T~9o5{6i&8(Th6_=xH{f)41 zZXdYvbMwuE;!zd&&-Ua?#9vNa+o18c{nQ-eE!mZO!Y-47ax^#+7B-bMvHaB1m&2n( zJBT56IVbnla;9uRf34D(+Bk6Umma5TD;vGrR5n<=s%)4Na8Ac62QBjP4t(L}xE(E!P4 z1!??!7MYB`%sc{Ae=D|p%JN1<;^X%{=O3f{-0Z1*0;NLZcN=M8FvPh~(Tjba*tD#@ zeLvC4+t@M=ETh%Eb8u1JlWV`wm_TPN-O zwtW}?f0iy_xJg;6z>nR)D@W@yi^h$AUkG`*GTsZvLw{V{(lt;3d0yOj%@A#Nh8!?H z%3^;u(amdL+m+$vGuh=<+|fDWE(bF?9_BKXSKDG%^j#9PdRK@(--4}+XJ5zMrb9P- zw-kD=_UIYqeLX0xk}gVw42F>~)~>8>BwOlQD~CAyvGv!Cv48tXnZD0d{xboL#+an0 zz9H|HCnt$P^06L7lA z!BzmuGEwl(BKkd^8Ob7n5(5K3bww}tz5{4YUU{HaijgQ+B2t9cAMJTZ?qQ{d>AijI zv`%yEU-JFl!Bewd{bPvKM{ux|dvCRXD*!n*2IRPDTK}!O5gU)(V3c$)9)Me8y(=#{ zH2v)O_Nh1EARL4|RNI#9jv@U%9w~4&r37+GGuC6f2NA#EFX~>v{oACr2T9oD%xFN+ z<1b(=NxhIPLFr0dL~mOC4ucz>J3E$b8Z-!VCvUWB?9d-I=ip=-fxt0AILH|9IJ~Z4 zK`ng$)^V=N#0f)r!8^XfiQz@zyQw89P#^Aw-!pKt(PR^G5`iX_mg1P$%Yv*qicREx zHv0%xH}{PIK=X49`10$I&v&SV{qpBrzj^BBq7r~C`E_8Us!d~pL(atH7Fb=|!}PPe z0S(&3#5Mn7O|E;W9e(|X{Xr$ITUG+y0)}be4#JDW`Dqbj?E8L!qfWwL(LQIncDn($ zka5=2a&z+M|En@*Gd|#xoL5qTfskFF0z6!L9zto`j3~mV<$Px`=Q^3bT&{dC-_d+TYujlr97Q zy|+BcuT_^0{37MRLf;y@ixDY!U4;U}L}=8540$pic5$hE zIt0Y-=;EWR8O+Spsg_gKcS_&DWCErR3F1Q?hgjL|J~IjQT~|1EF#wG>j!@Ib!H&#t zzGLxwm74#%U3Q?e<#~xP3uXQ%?}SRD&gU36q0^~#mTQE2c;&(^5q&}Dm>u7zo7;oU zD1`RXfj#pP?VVz9nZw&?y7FU>MAc^OO#oBcXs@pTdb2hVYJNk8IpfCn5mu-FblWc} zij&7i!Xjc9W0}6Yr77`ngYucFV&i7*&F^ z6=bUWZLnDTXttaR^QB*KAhZs`Eg+xZ*hQB21*14J`|w@`UwqA!JJyTGv->YHQ_hzl z4m|sccnoIfh;nxwp9T6Me8OnQc6OcV{I}7?wyu*;P73Lbb*5mPeP^nKNZD; z$g$Fe&<2;l7m{Mq<%y#vy2qW>`l)R9!AO0hraHpJgOy09YP`4_+A?jKr0CrVz9oFD zq}hyowb04PM)=00R)mt`j$8T$Y*&SQ7RrIEBolu;C|qPgl%_tgko}NOnVorf5qjJ# z8vWq3$Rms?2flz-&jbBm+BE;}0o?<46tl|~-pPl5wGl+STCFe+x^z4r&suYqDuN|s zBmzM?wUa5KrVK5r@0@vEtwAcwqN7e_!ko!hH4^7VHn3lqrfwx^e&58rG~=j_Jo`L@ zJBliI!NG||u+gHWvvYKAQc&1~0|g1Ad!H=J4bJWANmBY((2;!)B;h&D4Dq@jmrPDb zp>4;qyn^<(UJUhqx1O{tPx8y4u$}`O6L5WEjGoo)hAJl|oZ4I-4#+8vo&NUy;5sOR zxnESllo(qJh!I?rb5BxK&6uB4@lAj0SXdVwg5Q)PIEmYJy+7G z_Xp?}J^K8?6w?d{{Pont;?ow=2`rwzS zQs4sY8e`}^c3Z;i3bGRwpcOw&~4!7ej(;kGb!lf@wQ7tASDyQ37x4tNGDx^WNH2& zjEPPqK5k3@XeU)6K0)D=*J}H~%|WG>9&oyLi-M%wM8#?q49&qGo~AXC29g5J=~EU=p_{*-YLnRjR52dcZk*1p)$pHXXkk6 z(CnnyO-o+mgZxgKLM|_Xc&A^y4?5?AV-zi1E)P!A_>s}!V^_#IG*~~OT?^3^e0krv zsb6p`&>3pFVaaCG;Ee^-Qg?q_f6yq|Ea|F)|7DWVGtQm5j_5T%0kDg5-;#=-2c9ly z07Mb=kY~GopSUN8qv^wI&gdXkKu>T#eF?^tHwVU`T2$JEXTk*gl#5PEL7nB7}zl`-F2&imCx^$!;H3h=*rnxC?2BT^P&Zl&X- z>c)!!`gcLAXsqWB<~&nyi1KhO`f29cqP6FZ4?@P!p3sCX&BYQ~kSeFVcKc zr^K0LI`)#Tg~<}EjF|mbS4Kk0F~V-A-xyj6C1sZE!x{F@Mt?|oPF?zcmh_i4eulT? zeFFS6_f>0}?xEu_xL$o$zx|yX|KgA1wsxBj=1H<1HmbHN4;plK91vt<3x151xDk(77bI7`2wvg9 zlaJEU=c&co{d=tc7X%JGDT(I^cIs56B#3a!F-}KbP_m9 z0QhT~inZXTF8VgW=2~7uHkPqIhRN#J3-*>?LzFTC{H;Vny(P_tE6v70TFwrxe+I?k z7y^NK?~`LV=`Km4M#GN*GYNq9IV<;pv`RdOfj4%bP#F67GGHRa=x-=M*oi)uLP|o} zQ{!Vs{&aF-g38Mk;jh~hc8W+Elqcil@frr1G;|Y$>yRBCk>McQo5<(p+jdZ?MJ3(Cz9i^QH%=hYCn<>o>XRBzY4z6?xZ0L4Q zR^a&zEggGEs`Zk9&4%w$l6vIw`ukvTEyiaKN}P{Y2nhthS=s|k3yb2#-Amifkl%?M z7cQDZI8qfrX#eQCIE;G#*&W|D|06b($neLigz~OO7EDj~qbQV?*Z-6@lB7K2G=Sq< ztnM8JGLl*kCem@2Q4?49)H?_m2tekW$11L=CcQwBbvUD#q{Y}@=4yA3JGs|NV#mS1 zU5l-1OU(g|P#>6otqxle2OoRPMeRM*W$=$bLhLCj{=F+IEh8RFImyI5`#9T8rj(tY zKk}+2?$pYiewA6T5kIn#+`Sm77@aei(t5yTREcw`sqe2DbT*#{33GnGE@rRvH)X~S z6uN|Q2P&*8IxJ|NEk!zceb=XI#XsBXx(^Qd0YMT)ns=XW1N)6UQE~OsM)WxyX}tge zQjCU9!;kB}bWj)a3HiHJNBa$9>zmV#K`fVN-MIJ%4&CuWDk)7U;lhM+BHmPJ1$k!< zd=mf*+n=T}Qww}Fq@znIpp}jmP)ZX)lK5)^L(v9`AEzHouZp7$JAa^6*7vAr#rmge zGspKXzzFfvJy8>)H_(4q8tz?X?J0k(RDe)Bs!HEIlFt6n@c5x`f3UWXIYVd65OhZ! zn*vQkB#Rn5WqNbaBs;c~ zwd$2!1bAM8_)>)&Lr}`&UxpG{cLl;N(H8vN#(|bk6p>_Cwwr19$PX|LQvEw;r9hjO;eQ^iN?50W9^V@2XA%DF9- zsAu&EBcU{h>ixnBXn_>mxP%#b=E>QnXY%~{t-i44>@2lgu4RnV((wxN_CyrJtG+kM zGMDbv2uR(>0>~g_8H&Z6_B6YPhOhJp|139}R}j5Cnfo-NzlXd_9~D4#XCtf?jhrg+ zsgp8j9i-xa=|3;~tV&DIRTx)li`~j7bEm_+a1hT&ndeLFO-~LlZ>ey>nd*x;rq-o?#ZSsPNmc38|3Hk3LV z2aGS#d)P{o2qw{S9(H%UCM4{28+GS&1w7uL1N!bXHWN*n*l<6*)-&bzq*Z?ef&PjM z>s%{|oVm39pSeW|eAdVI4}ZVgWNGnlFg>iZ_trMg3l@>WO~61YI;QV)`{@}cx`2N* zrrrez3&>xv;tCm2u@`2i(hCgC2~AI5jq8Sb-9F3`Hkx|78*d279P*n*8I&v2Qf=it zdYeD7XGgc3e}k6q=lC~n z$li9Xla{csBXqEo8su>`*GH1NHz2R=5ORio3k1)x+pYp3bwL|;_{RpC=Rd86j2A1f zs-4ROBouvXikq=}-%N=S1PaGE8y?>Z1)r3&F=UnoQuyGTp2WK#Rhrp8E~C z4pJrmWqj3bVNwX|Wa+(4!?qsEb>!FK+r4pN zW_78135H?fG<31g6i>xb8V59=1<|=562&xYvy+6R{@%LEC_*X^m^CB+qreSn4EqSI zTG;(ieKlgWptJ4cq8wsTUyz%z6a`LUfEvJgqF+zn5lg(thj}2LNPV7u<#}e586{{A z?-k~*g>X!{PjA#XsPYPos0VL-ides1iHwk;ymo&dnP_)LOkdc@E5Ijmv9EYCL{%+| z=F`hoywmXo>~!B@%D(1BQ*;M72nJ`R_ALJf22kP~7#sfhaYZyH=|$iekxD?cqq`T; z(xhf^w;p7%(+2Q#%~l@_j4O2wi=WpX&gOR+ZBa4?X5agd|1jzxcvyH-eC0zVFfv^# z98z@fDH`w=p}gMR(<>g6U54hAHNi*piVoV?A_t}qRejr}X2dLi0M5X?E-b8ODPNzl zcUlWP18%Dt-n_xNM##Rw)pu65KV8M`K*Z~Sa(!)_s(Bfg(XeH2tK7cM&zOjHL9 ze(B365!{h`0uU#n2ri|1Lk^Wn)37430g;d(`TL)cEa2#>tShO59KX+r%< z@zPcBROM=gojcPXkxu_Ua+;O%#dZtVGar)e*a3H9opZao%9c=t_X!T150KL`YbmLP zBror6-bGvUN6m_<8`$X1n1yyZ|9euM)+sOfO>PBFIlcO#${Eh8KYOw2R9F2 z+Ml(|>c}Iu9>mCf!AhF_C`aep%VhH3qdu~gI3ybW`YGAAB_k_wlHbA7Tze{fFB(tv z?!w;nv6p$Hu!WpjKs?o7xnqzi&ay@F?yu<`V_PBuGUqtkKXO|g7X1!+9e zm|+BC7V`?xM(u3r9-qTeKB))YKk?rJWT$kyu%-`crC5c8o6P2*26|2sFW!Ha1*tDPp z>68yv+sY>P|9CO?VivAb%+@cL_@k*yR3tT4Mk-*UO2$w{VBWqlA&)$VbKL zmaOmuuoRYWx+s?cip;!Bd}x_f2m-8k5Vg0UGM=462aGf19(MHJ%rAY8HBJ3)(K^s+ zwT|;Atz`XY2U!X*rH4pY+{}1-5}Z&XCP{-Ms2Es_me5gjn$D-<<8%y@M#HlTImx{q z7Pa$Y(iP9_6B;PoIvQvCA!s=aDa`BT0iXqfQvDW0+G3W3+JYkjugLH>&*D&}vHu{2 z5lo*14;ouQkR?n`5U7mt3qbgSPFc|y=KBeY<~5ENaR1X4*e{BV2_ly3fVMGyOKCES zSRd^T#qscVm;Rh-wa%QUkICd`&EQB z)Y6$I0k_qH8RVMhNq~AE*oh}KZ$j9RoBt^{PsSf6we$z%=-5l2gJ+bOW>SULfz^-~ z|I7`X-H_a2l-a(CT3WRUBsF|-2k$jrY?i$+=cX@UNOS!jb0Z1n0lWT4Xh2H9)QZ!a zx#}>!ZbpO>MNs-l!z{)pge3P?*IMb6a86G?|3B(HyGhE+)FC7hLwW~A>dS_vMhF5= z`EOfa*u;iElT+4`VmN{UQ85x51{z3bjM=J_S3mf_$)DUj5bVru&SIF0N;onk0Eytz zGCL*43LYLQw(f<9lSZ8Z0FU<`Aov(%`NsB3WoH|PIO7TaBWjOPFSppho~Y&u?Epn{ zpCWc_I$gWPSXb3&8D^@le7UBb%H>4Tlv;GavbBM8*n&T^P@o!OeRe)HkPuY0s~G_= zlQXumzOX58`1JL8QES}AM&Bu$D+}jgy4W0DpaWelU=`$ep? z>*|~p;Q-?=j)*c|lmptVKopUS290z2$aAsFne)N(LSS^Be`BFC$Hk0!*~`o5xXg$W zWSdij;iO6yV)XlA+Y)41zGobzAH;b z#kX9pW;LNpLDN~CN4`egKoBzBi?A&1Jc2r(*0x-WONhTNBY<2W=4AZ0~tA9_>Ef$QdM)U|k zRv(!G(!6V!ZF9Jsi$V-8HF44Bnx`IWsyB7%WC>VL_+A>9X4SlX((gI8fKiL-!G8b3 zex$8!PT_u}LWwvAyxT_Y)I(+7kqBXG)$52Y^OihX!lQR;`5VuIhz18MvxA<*1} zF_!DI$dr(vtC&jBMIj#WfjK>rK#75cPlUsvZEi* zJ~%bD_#!0IUmEGu@W_N4dtx^efbbNXk*ecM`>fsq>-Jeq^?aF{l%ZgYX?R)U zLh4aPPC0C12;l%qFA(N$uNi2tL1m|TSEN2=LGTEDz*IQWpAf1AVE^X{0Q({|7S8Ij z2VrB3`wzX7-*~p}u+v03==!uHJczfoq*Zy|7pL9t2CzdZ!^Qm)sPz7|rB{3l=UZW9 zil@@Q(MuCI`)|J*rp_v6Ebf-^Yv&{|kQtro!WC~2t>HJhk@b3DNc&Wv{KTf6zeHLBk^O4{e_d_YK=)VJ=3g8oCi4ldjiYx7~txb8kvFZ=N;1)E?*j1>=o~# zB;Tk~EbKyzaHUneIz>~-zy{QK8rPsl5 zdYiJj%r6mq_K?rLMEL~(kx1w$d71t$>(51vh_M%Kq<@o(O@8NF=qk1pwL^6skt@|U z9w1G@?=_|c)tHN0!oUUX)Yv?mpNOU0&hrvikt6AcbG@0@P#(!!N5CS~ihgob@j!TJPQ@7Y zN^sW~cz-PB8|_6L5v%b$RN15B2Rod|N9l9Or@xkC+2DgphNQHT?Mg>y*<98k3FBWV zrzncQ-}_@}UDV8DALQ*6A<}n_?%k<_QYAL?Gp5fC&O1wbgG#7;#fW93PQlmzrN~zy z^inqn)_<#Lcl=`JE{XHj&fxlIm0p)tk5Mi%=2QR z1n$`TI5#dakQ_}QpK)$i?zz#3(n)<$6ALy&v+v2IsicE>r6y;jxLI4=LDRZ@Wlv4* zIxto3K?Sa$m3O}3dhz>1!t1`tSW&fCO0Np8lW64M8?0&((^`B5ALs#!5Q$W3Lb~KU?0}pPE+th-8m3De z&HG;o^t9n%!uVn3@%ek8GO`-ZWnOpHlmK!)$qYiGRTtuE@1#_$&}X&6mA#~mx(=_$ z%JmFsCSupIgpI8EBn@&{M@zJAE08m} za&8Kdvh>p9iNCQTcrz{VwGtLkuh?gaxQP36T}JuZQ;olt#qttjw;s+yoEu)dT+zr6 zi?1%2BJ83MU{xDR2m{BajNv)@*mR|*;}tmR5xgpkKIU=3g7p9A0CZk7=@puvRqi2g z^|OE77C2IrRi)}lK|9%{MyQDWQw_#H6KgB1#xr)#!`++)7P=sbw{ zBj@a%dJ*6n0tTOmP;qJWjew|ez_0)Dqlg2}#TS(H;(m^l-;4v2CtrUGhcx|^P+&p< z2q-V6|Bs-vg_CL6A4Q3O#q;!A=nf8mhPnQm^1kaARYPK4%71uNm^4e z8EIx0xI!F8iEEK24T8@{hHuOf;s<-m2G5=JBiCA2={EpHO zApAdmYr5iR8OUYOKc2Zt29lW}_!n|B~$R5O1DlRRYJHUo=5(b%PTYalT_E%nICNun6kuXe-t(nQo&V zfQMf7sj6>nD5#T2PMu_1_?6h)-UhgY%#Hi=|LXu&n>0xD1@k%XBAyc|9xC5Hu%6@syf#YnIbvmrAlA5TsW+Aj(HI8QN5;?D;yRM6vfsPGUSi<@iUH6l%OCP z$^V-`a$b;)k|+0#$7EVS)~C)XEKJTpf18EYv8OgQ4?6sr=1!9s$rWdvvuy%0V@C8F zR>AliI|6Z8PKKLxrH4vU*&pz7|JoQTu1W4V$=vMX(FWvnT3_yzwKSXvrgt1)4;-iW zXU1uTQXuj7-jG_%{OOf>*P7GhuERkFOF^PwiK2ZL%c15xMTiYm2zPRL+6x>6C)kB? zlmfMj!1hj~bUcuVWfZ!=e`EBTvX%cj;V@Q3L|K?NUX7%WPW-7e(p5pdrK_r^bYl$* za0$&-K0)?Fj;nT2KfK;L>HHIwHltI)`YsADYQk^>H4K#YFKfWT4;Eg7V{5n#Qtlu` zoR1i(=|rtAet=n7|KA%6T_P;9{jC8l6+pSgR+X4G+m8HvG!~b21GW$IX``E^S0q8) z_7^fPI1DvES6TBbt16AD@c&Id%>Y?DkC|{>Fa7LL3mg+~IuOgUY1SFjJ->b@!EKZS zev-?sM17^57527~w3TDi`|gVwx70NiX4YFqa_DvCI6NKk1mJFvGt;%9o%aP@$+$hG zKTJE2f&_#np;~!koDim~XBr{ZKGrO@j4iez1E)9G2yZns3X$I|vzWNh-4X&(u zJf2K@ep7jI%K0C4%}5(`*VI19(V9u55Os~0mR5wu@Pc3D3eV=F?MIY4k>pMuMDFzU z$y;(iCZq=Q*xE_FPLCmp61(t&t+U*k$$YeF4`yB>$Gy91S)uwy4D2>lUeFK|8{y^7 zlThexI4K-!nQ|BE?ir$F#E6+)GA&0HGp_0L4)EC|tneOany0!EfFd@LB0U#G^%U zS@p;@lDs_9f&5Y<$Zm9{1~o84&v9!(@t%~BGhOk=2t>|Q{Q&ysR|g+suLyKg!cx&) zLJTBIRlELg;$__6Aub)`$EcZjL0<;}OhrI$J#4$wB|1KN)welXsUS>I!w;&Qy(JLf zw6sDBcP=uy>+BswEHaUkNShCRoh!o7ZD3)5w`qrD7LdzT6^u_DabHs!^XRqnY25?x zs2lU-tq@mhPnL;5EtWt%MD#tWEVcotUVbb}vhmMayH$9VO-n@-Rr=R_MPvJLP>^v{ zDqb^M9Na#@9j)lghzhAR|A|1*Zd#@cTR)(6T-_GNgm^le2-4=ky3LA6HpEpmBH1T{ zp@-CP2qAygo&yYu>FTZemflVh$#*ilO5V<`bp_;fYAv{nHk*~+Rr9J;8uXE~@d@>) zJ$BV?!fY_d*h%1zseZ0%ND-8Ikr2v_)!Frm9vnU*XDb4kQ^_HJC3ynpp7fLt?UKe+qVBw&^t*;%ogjI_(p_Aud(X&Zs1v!(zF{ig z%Y_aRYbQ4la??Z^+ih18!(R$pN?jd20(p!FB;TlRs!B}`QLAT7LpCmr$cPr0^<&{$ zZTze-LLqiVw*c*oXVY@tstiY>6~UJRmf-4Tg8~t_GS(x^kQ&;HsDX8(69&T9ZEDV~ z{tpil&1eu{P9Hat)jq7tPozbg7eVzTmG)KaP}!WLwbdNYl)!~tA8v6)bsXlI;sd;zY{ zzTrpa0644&J@T6`en>~&6=6onc1ezfnF)>}H`#oZ@d-&3c!_T}$Q=Fwq0`duxfSL490$Nzxiq7mot|u zKIve&Ajo`DUFoTcN6P@i2qf}aKl5e6n|t%js{iZyZtio)nDL4%o9b%3PU@a(1b zC3z8bu{Ks==GCx0SM_*IPcUs;mDt)&@*Un{mZ$)ngw&sycs8)Z`&lk{9ON;M&eJ9r+vse)k%nz{f)h8Txi95gW{n z6QD8X6W-e)LfukTQGSS&!}3P@VoEJm%!92CN=XI$zG!ZRL-pT7m%%^W_2@Xs9hT7~ zbO03bQ$aOhXgv@Oa981E&`X#ta%vTTL&%3MYZrG zXVc+gewqCsG*sPS+4ZQsFcv)d z3oYE2J>vV)x{P9fgoY0e@usCh0v2~6j*VU|#@atgR^%p{7NEdR;|^MrK(MxLAtW(O9DB4q^|!!@B`k$zAA(3h#=vpt2F zl16v2!5eTwkxSh=(OxFvn2yynoa)E^Rr<`tT_`{R*yb&3qg;PYO6Ch5{O4T=*_yya z$^nDR;HX5lPJ#a~L}ITCE;JwUhe^Keez%AcRQAeq_j4zjX3KDRFq+k+Fs4ZP&0k4G z$sK+0?GuxETsTtrV6zwdy|G0iG_Q_3M61&MTXum8&%8wL6)uw0xkB*@SIyHS91}dG zYOBa<`*HD5L^}MeliW&XDk5>en5x(88~T-d*ADe<&8Z+5#M$YAcDxd~ukObRMI;Z~ zck(&U8{DY%>##lNfg5ZrByMHBPf3V>?7RyOBP|YFIrla1yCnJivBGcTTx)?rb@KP> zyYUvb-O(Jq_Nq4)MB(Y7v zN$h9)$uggsfk7#>5^tLQ zQ0BCAhK_4lVUGd=zh2xM284Fk@>vkH@GhTZzAbQV0SZ#aOmXJ;3O_rN;q(|a z&Q}u1<=cEWDqhp9Jfq3Kai(`hKlE_(ExHgLtj|cm>|8}oyQO2asbO$XeFq>J_YG)# zyM@C2N9EGQOtm=yKMQ5*&+Ikm`RZ^vdmSrEe;rBj#MEX|HhfSmf{$_fU++r~dNRWb zO^Dmqq_z2|gpOf0v@Fp>bR*G2ji^ju&3kogakJH#Jgo4)oK2ox&T)(;Myw1qmS1{T zgmqg}s3jhJsgJ1Ul;5FFQ~Mg#ihCTOc-^Ld#a{GzfF?JcXf)xyO4Q=hMF?2roa>_| zdl1~s2kdW1nKB5lGN(p{E^+w)0lo=X`i~nOWQXmSK5`sx%%fMohK~P&0Q_{?p>99+ zA#0~M=M}0dEE86VdAdN3XuCg2B`PJZiUzj8I0;P(K687T>6$}(c+5h3ehFfH1{mM& z*&w?Bfe&1%A2zb{SCYzA14u_E1?+JkF2r=?+GW(>SFwt(;z4fkAPN~LKMH&@C)X=P zQcyk&%6KBlRyDx~BTJjy;RqGjv22Ij`^Q6!ge(n)tE(evd73q(<1UCvf0~Yq_jP@u z$2jS$BZtT+kNDdYG0odTC}5)}5uW0tx1K-6x=2ers1L*SORa_y*$-V`qY^3`YkP^E z%B){nm-8J~&h!G+UM8KCE4&~M;<|Glk46e8h?yH~z%(B`XCup8>4oKInNrtA z&oJ`dfuG9bGpYeRG$;2)r+e#0+l78)tbg4s1Bpl*ma=3n6UZ*HO2AX19~Z(=nx!|C zzwf>X4~G`>zUI{l)78KPms@}@$5#=$V>O}466ag^LZHvJI{vK*5iL%Ls$hRPm$+RJ z=!i#Uo2772qUnSM6z0aIvvB@_t;>q)!0C=vpwiSIA{o-I&t?9B2C>}+zUh_ZuIT6Z zvh~%lNzL-#*3vrQAE^5eAkT}&@b?f5L7_YLR8>2ar}FA#H)+~UBK99brgd}qsKBV& zi3N)ks@=pjcHs0}_o?c|>X|hcbiu8IVb`_wr-%ty%+_g;2?{u1^h~Q%)Vl2w1WKgZ z$9&Q#zQ~Hl7K1x7u=YwHg|?$PXaVvfYKY16%=xCL|Nj28E3E*C1An#I%Gf}4vcS?a zC;s%lU^Id%z$f!CG@iOEBoH-}AYpc#**jo@HOKRJOO-la&;Uh1y1&nST3KLENcJKc z&@^kJ5Y|Hit4jM$_8J;}@K-_E*W1(d4kv%C1=U@D0@184E=hVBPeG{A;u4)j2j~u%a z5kwDBxUX#Yv)O8#X^J-}GAb4gj^50<&Dj*6q<%eM@Qo(cUy`6`ss{RVjU*Xg+J?;P zM#d z<-lEuxG^~XpT76)DC!HF+FAV7n&TGuXYGddX`(wy;hDyISfyOqGNgHU4DF__6nKoF zWY=CqHL+<6O|xJKQ@jMVO>WCGE?y5x%=W%-!72`cN%3v&Qytfyjd){ntfDosaE^^R zFj(|gz~aQGb2FYYm&r%Z(2p13g`(U;FMxqeo|#)HV+yu0-QoB>dV(%dUo23YAN9p? zrrsWGbHyz-VfnST&@O|?cD!tG27sSx(pNzTdwr5yJUx7dG{jQf!=_a{rvfw?a`<={ z#YC|QYff{*Q;a(o?JsFl917nd?=et3uXq&>@pe*|uWPu1cfmpca1}pGd6{gWImLsuQtophig%7@ zGz4AuQJX*=f?5QcInE=~l**anNt%`-?3L3xIfMo6SMLJ8q@+H#vHJHfeMm?Ip1ojTKN6I-cQJ&s< zlYh2Hdqf9Wu&7{$XNziHR@Gy-gJfRNoX2$SrNG8V00VqfV|Xm&1V(T>+2)27l%M4v zn8fXv85xUMb4tFi;H$E2J;{R~@JgIfj3O%Ix;`Wcx-l(^Pijf{Ii;YXKyWyUBdMmW z7Xxi^RRVz9ogt2HgK*1B%$<~rNN@!eFyd;7B@`NgJBgPlzpdwIHs@-`)HI~jbdHVH zKk&Qc9q&Q0$9QMM%VL8klSvE$C_9)iGk@eGs?f5wM4eJDpKLqTQ3ac82&O02ZrI2k zPq62N@3(Ie{og{a;ZA9b4Fhq5W27-vDroUR`bldH9ILs+inBRf)Q1mT0pt7zZ@SFa z0|%%1v&wQ+Dvx&|BG@DZ5oz9dA*^Ka9-DFWFs-MyGwbwUj(H0^zJfaH_=|LUo;l)@ z{CPGFpQTTQW8a0!60pJxXdd-xG8d3~cQyJ-Km74aI{ANmumY|&d|4=vdXMz!m0#o( z6=lFqZ#2YGSi)^ehZEJ~4VWOw60R%E*LOvfx>;@Ix<5a67p!t^1}tOw-3Z zQLf39c|w~iNfp7r3$`B{()9o#=k(`zmY-5koEc|mkwXV zLL*RBtxQIZ@NSdXs1^f2LAxyPMJy`;#SyskYWBjq?;OkK39*hs#?-mNw9BK!v2`yy$!_KdrbTuyAd-UmbiVftM4d;E}9g1^w&Q6ERCc z@?W+5wZcWL@HO^vlDm-Q;|+0}r3jF$nt+=34^sI$#lfCHI||NG0A7{X16)}@YfM+} zzk>GPL(n?;u8&zVYrT{Pf4|Gz_V2Vf2?!@LVZiz$+ z%$oi$1e`@|FQ8SceJytV>*PmqnYcOj^>_g<5jh<8G`D|NZJLvY%&{yVWe~fN@JV_zQ0JPZRp?;O=?Mcha6e*DRt>-Rp`Xa=z0zv5xu}<%TKeYz6=O##U78+HmuuIb^r&-_zOB zfry`}tx5h&tbQdtDip6S1HcDP`|#XIRJVz1)qx32Eac76%s58q+w@$099c)OVz34+CX7b~k_M3bTiZ9er8l$l8K z>lzTzCQL_gUa*ZfntvarLVrQr`U4jQoivWdmNcm??4&&9_J|5gQQ=VMIWlk8g1ZR8 z`?)IuTU$3)#*^zXU)U8_L3YXyXc_v|ipH}Oyx5$$8vY!d&OaseM=!)B1dXLd^1Z5e zH7XQgu`yP~nmBnR|8R+>IvC$DoAX+Gt^<~HTad+YfQF$@q$Kri!iSbZ)!u%Q!vk94QdFTS{Fl&!Dw0z1TuHD&t2U zpF<{HGv|;+fTarps%GHVcb_HePifhe*e*)ht=D~a*vSWjOkHQ~w^~BB%GTaWp>(IV zewaSlMpKxu|Gh8jFGf(ui4f}=an|6YPmI326}HHX>8kkg-FJn$$^0a(Bp|9ssUJMX za;f81vmgf(Kf{uPOHCa-ys;SFEARz*>^O7U>=Sz{F+R1{oY^999jT}_M42b2NR%R5 ztH0@ew6?lkBM(>U?JIi!E@OYE_d1E>qXF3MfS77|?7uIf|DPl`c`lz!@UALOu&#~* zsPj^3^EyrZ67y9En$e`=wu(stDFvdl=jwd@%OCQs44GtoxZ#KI>j~lZ1OojqG6d&x zF+c3&xIf}yzDw?Bhp9Y82=l@Kc0E?%WCX3DRbf0QSMbzpv6Q6IVvl6&_&h~_7-Tj@ zvEL0!j`zI2qO>nQs6OWZhDxxV9h`DdL4Fm%8mtQVJ z8F4e^Pi!9okhB#zeTFdS{;44VmRidv_5)-5dJ}GwP8QZuke{yby8EZm*?c*mV_5DJ z+l3Sa1phim9}82C7c zp~mmmqGGibk}UJ*<17Mx|6kJ%)J5>9b>xZ9gxL57Gz*0nwrK#)- z0SDB`wiY`*4mmK_IQ7;2?BQonh7X@P3zJ;5nZkcPWCPlYGdN1>P6JwaIc``w9Wc>+6vkB!VQXLs^PAU zi&*9!a6(6yE9%&(H_8G9>ZM5F&ZR6 ztn0b<0SJWphZM}&z}-$^N7cD?X#zLk?D4|zLHExvPf&Am$d)7Mn)Te&?7+6s@BZBb z`jxfsQU?Em0S!Qp4}IrQ*miHdEK>iyA##$&II(IC(FX`B`cKFLaPh|4#nJ^Y_2*!t zQBt1)+@lD;lhmTYhemv#!^{ykzrk0KH{$P%yk+H7G?$+j3qC>>6DLP6coQ!J3hQ^6 zg%ukT8-1ovhHPiid#kk%hbZQuXh~qm00tPO#@fYP12rncKP<|+@&C9mQ(^?jssi4B z%vR5ggl|XRq+L|$3)u0+nEEY~YE0SNZ{#IufaQyws!79{dJh@Ek-~Br`PY=Uuo#HT zIB^-k-yeixeNUOgWgoH*3|t0^Dct#B!q8Wl>v zQ7}_iIsP6}__q`J$7t(AO+0uprna;c#2-_sh45%HL5PqC!-swg8G=kc3x6vA6|s(NsR zJiv8APcOLj(+&VYe!ouH2YXYU7=EHp~;gbcA|sj%btxzr&xFp0CcR+V_Z&Pn18VP*Q-R- zUX?$z{O8+0^Lc2bA!VUBwLspeJ@2;YmFc>b6u>a(2{gjT(+@;RJE3`>B71>+jkhjx zFxN&qW|uKoYm<&>XqfkiFWmn=+~Rm=1SK-N*JG91o2lDC$o&;sR_0-~;pH1NPm&4~ z2?TT<_bK8qtV_xD8p6MnKi9%<0} zs3yP~D*n#fg&S*G9sS^xD{E>LL-JH~Y+(Q9WQImh$|2*m`3|i;BBahvzN*^5$Buuw zMV>78DT<<>zRC7la16fc{8un_u4YqO;s|;aYKSPlIQueNT~B?30>ajSx_vSdjlhZ- zll>@FAojQvuYwyg$rvq@^;+3(_l%GIvgQt3kKnbOLeFEXR#&gv#=Bp%z5VALkCUeS zd~F%N1AFTi2)N^3$!Hdn=Z4guxCi8#mYsA-Epw!jz{UYfA-540M5^>2GQ_dJ@xoR+ z=;}_gWJO68fF51zh6h5DDiUTG9=T#0mF`@f&lPp6-cpEPaX{58rx zA}rY20yQg&T5>l;ot(DFTYyvGY8EiAz=|9kSxWp2Q*Hv7O z9St7orh4Ce#^e{yBa?F?XRk_C2UT_VPUs*SRUSR-(|}qdz!ujkF{4rbM^-pP9!EO5u*Q9YgAn%M@`T%(E%Ls;>; z)fJ!=Dt>B>bp6vnB~4OWBzxkrc=Zj-zT7!TZ!VwNUKq6tV#G8ZTP9L z)r8AKlELN8D)R1%-X5~wI--P6As;``-Lo>dkzvZB8Kuk7+fN3gTu8hFT>(FV7!E_S z^0oZj0Ly#^c)2(Y|5f_6Z8@3}un*npmYebOt@fody(Iro9)bV{AiW1`+Stz^_h05_>$ypAZ~{rIrfmDr^36bGlA6Cn5$L?1gS;B zQM8bthNGf}$yv@4qk#QzGiKA2Z6=fFi*UQn@t*I?z@T|!05r@!_=>wfGXViAny_t+ zRabmaTnPDhTg^>o;j22snHN7+$J?Ylirum|s{*>;FTE48oknK%{t=b#hxqBMyOf2a zwhzLEK}5kE_cN<9f|$3L6glzYs)Rta8dGBGJ6VZ3A_iUC4)<6%TQyt)op8My0O*?8 z)T`#1k$dl|!q<3&BFh3tV$@cJg7>{2^ZlIgE7Ra|)Gv?b8ayvW`?AE#fP%{bN($XV zTjS_CkEAimDIKO&jFK#-bO!6EL089I6+ut}Q24az_lW;&t7K0C_kiqw2|w#nvx^yN z-0b3kn8%J zFf}{~fVYTQHuYHDou>|sr4TlR5+B!7q7No+~<)H?;OF4zfSuHdlH9 zgQ3@#ynSD3waET-HcQxNyHL|STnJRdOMa?xCLeRcw8zT{NDza zi?Q%c6m*y)!>!}zhzMOw9{(xj__#aTCQUzBHVqOsyXO&*3{{1l_sa#LwCt{`05qXO z>Mh0DcEAlEy75Tlj1Xe7G`M1p4i<1XK0AW9Lv%9n?LCO=8P>|Q-&2B1~>4oJunOM$(9DYP&ei**@4mp(ZjvX6H zIOVNqU$loYHSuV{Vve%*a~IYc^OSS5H)a5JDC?p#CzYdUssraV1*AJUNGFMMu&Cj_ zTB%v{FkI`B1b4ujH$DoZQh^(WmGWLOSsHhrgpHU*aQM#`j<`*NI ziVV1yN6H%p7m{tC7_Rz$d^rkwB#bc-1k2>=(r%@e#7osMp-cjnnrtV7D0d~A{+CuDOuy3VGV69A@MPi)}HtWB%Y*0Z6u@9LE_9J%<5wPT+xHdmBN$%(LyNytmH;8UyD%kkLh)l8{tQuWcj)ab z*6CkZ8`_{UjWlSY^zKUxyRQr@$2f`I$^7`m=RMD*?AvRBDjaBXMWm#b*MySOa|@u_ z^c>XGv)Y3d*j>sUlD`U-D!GW6&RehAX@Jg6$QOU3&6KyPUo!35dzB()~R8qMya;B z^$luC)E;$qEAq@1pky@n9B!Npb@MQiONruP^&TaG6;Z+8X<<37%71rk+Fg%Tx3O-0 z4MM0_%xhr<6fi?fRUjJBWbfE1o?pqeHGKRX>^=#FF;wmQG1tCOeXNg5*K5UZK&DOi zUszv7a}nWtti-c@5_^PmxSZYopfr^CM81ZBt7*y+Qf60>VTF%}61bRfR@X|KBwsqL z<8Q&`K>NlHl}#tN2v?7SYVFRF z{EJNuit_zxdXZzLdD1u{;IUWV$VM`4me2HUR@kn+YQ6JpDIUJqJN@%_t=> zV=oy5?BAw7_9L@n;Z_XPtXIlBV${Hrgis( zKj+jh`tW5qQGcX88SbR+8HXytOzYZf{+$@ESu|sEBYzpDWjl>=fF=hnb#BHf>?Wlu z*UD`rtRI_n8Ja~w<2J!(v#B^QK7r*BcAGzfOGhi58|Fw8Jqs89xS75;ST}x-SrJ+n z+5@MG35VPHMgozNr(-vhIGeJhQ;rbpFmYe)=9Rmu5CifiX3~njjhmN?k&XJqdV_Zd zI_B+_<2@dv3m83BP8fS2`?vsx;l69zb?;8_ z7sPmmN_&9!H%5Yc1u^xjCp%^i79`MbZTTt2-}$W@tOLdSqPPwpD{eIVJFu#ZiyIBs zfe>IaSm7LI(;X)r^FFG5-ChiC$mSc;uO+$_${1l8nJ(uJtTR<%q=ORrejh9^`?e9~ zSz+r~x<;L@mo7Ib6soS6c&6z8{jgsXC-)1C+p%q!q)}Qw8Ld|;)nO~}(l>U_@5qMl zj88YChA0!>kc)7^0=!K!YthuGg~yJ`AebLr1A~rt_Es%fe+Wm$O%1uDnec#YxqO3P zLULBb)Qo+`9Qr1f)nbrPKZ6igA!j?Z0#{VI-Z(2iBWj8KG)2MpDZBVDR5-08M-L~P zqsMd5iMYV;$I7_@{QAbkdr)2p+B|%*J3A|arJQEfNA@BcI=B8_f}KGGnUY<*Uwv0S zy9b@BL`cl5=|gW3S7#HVWY<*mBPV$P{@o)$y0zZW0-$gC*((oRj}YvaTe8=7tV@uAx7m2;qH5N0!h0`_S1*)#zjtqjLN@XpXZ z>==?w$p;zfPymm}X>@N36VYpX)=As8iK)+|CN-(dDP#8rzD^Nq;W-F)DZ(ELwEuX%vhj$oP&O5Dhb4ZDDrqMw!; z0x3p~f%Y!qMwuxM9x2Exo#DA9iWx*BHSvqQR+gk_8$P;nc>q~b0gYc_wgt2}gO!qQ z%Fo4yuA7z&G{}Lz5`bI1JA*jP{df+B4q%=5PU`2yxc?lRt{q-?MIiXJPtdlK+)?Hq z^V0djfM!fhTx@)U+=ioeBbt38OX`#8-CJ%XowB30YJx>+Z@uJVV{G4LEaefoFC%*! zWj50MvlpPUW;Z*sK!G}rX6>b67hf{j=i;>4E5>}EH+JLkLhvOT_J`C$`d1(u_v`B1 zn(@Vhw9#*4o(xzZIjv2Ws$5hyMvwageAk7iJ?5)qV`j*V+klt#o4fyvi5jo?cyM-l z)-pjHZ30ra=0~e+*@;AJB_9Y{qAq&8!uEml=}$MxZKQI&xdMa!0CS4d2|b+EF>}P$ zKDo|fg%trpc_Opg6o8#Zo|ieS!Q|*LU%wBCcxCAU5}ATws?1lbF>bLLDcF@Dgpi3l zsx$i|;FM3inup7Ly;zh?IJ<4Fy}I2TH4?T9y#AGDsE!>~xU)^xq|2R&d6i1HvOU9Q zh)5N??k)Co2p0CKH1-F`v+O!yVJ&+l0gJnGvaoB{4Lzw4nnp}6e+J+;;92uxN^kF7 zb$pT+zfV0&uzCbm7c~-YsZNO%y59gMt!v4xg*fG!Wn-S~qEC_z4`BewdpZj`b}(QM ztA$r_-V~@J28nF@A+ur%0RaUIWsueIo+YPZTv9g*utDEN2ACvVN&a6ZJ zlkQ*W*ImK^MKI?>^a!+G*1N0FIukXY+&f?a;LWCvATXn-s3fv6;1%(^ z)S5pSGhvpRJLG@9kGC=o3phddnA6!k|FJ|5-FWIK3=H2?m3TZpcs^Rj>N}wmQm6dq~zP<11VdJ z_v31Kwh;1Vtg+q?mrea5Qyc}z>*~Il4v~k7svr{tt!NBf&QJNcazQi$dj$qI(s>Un zFuJ33^EUE0y%O3ucDU1L4t9?5wl62Be+oyf#t1N)9W_Fz>BnponfUpF~t-4WX_R(|0fE1pz`1ujM176%a8}@>}XeT*!#tk1Z8hP@|>rrZUN|d z1*AOa(4OcMxt0_G_W;(4xf&4pD|=UOptD4kAi?+eseYYt?kacZ~OE22o4 zD5K2wHu{bRk)~-eQ{bm1OBIus3liM^fV4oWV3X+*z*&9ej@KDU<24BqTR(y&O7Ex5G4Zx9_}n}7_S}0 z%aN>jr`kZ*U7!8l1QBjCG-)!&8=9lC9}S1qsn*>HY@pW-$X4Nxxm3bPSY4E z#`WawwS%B5>h~77SYg~my7b6qXwVt62vt89bG=E->scU=`w|cD>DS6_-WDi{RXQot z2>48%JUXo;UW74k3VPmjQ7VqCVV!bQ)H4 z^Bh_}$JLcwe#1&*n%yLt zxENjQE_kzX$N;#agl)5yI~4?m`Q3mRnaO68Wtf)pPoPhz7s83JbzuKY2!?y`pqAcd zh5C;)7B|#_u%M|dMWlR@NcKlXqe3 z-|UbDLUq=}ukOPd^>pO?5<<2_1Jp=BG0DULoj4nc(6M?ld4X6Me#W!QAj0Ode1E$r?(3bn zt21zK6T;F+TB>jBB&UJ)4JAv6y&OqMM;iW}3qf~tT~K70AS}I>*|1T76dQ%-aV{<0 z6m5bd3j_n_@vy0z8OiLP`21GGt2K#>OeIE*#88gfSJ6ew!wy zXbs%eUxmgktz#=Y4PWA`##ShM+=X_hlh=4MKm8 zISxd0qVtDO6w|q{E$4CcA8iV>W9Al^8bLA<6y8Cd7dPVW&s_qMIfuHqC|fUktQZN ztfBmO53pow*Z~d*zU~A(9|)SO@^<;Iqw$K&10F698x#k!XJT>5U7XcPF38O;*f>dY zz_lT~?BcwSTQ{I7#32~OC1I}3my%#FIRiLou8&6U8;K&OhvTfOqKI|V^jY9KlN+-O zBM_Q#HNBP9nf`6S zw(WD;=F-VjPQ*Mhs``fCt6f}Z$TiGXvFh4L)RU(oZL%2MWe_APCn+G24Kdr!vmYC) zx#uSh=_`9VtJw13Xfc{+T)NUvHPd676RRS#$!`pW3luQAK$_kQx%}PsdJOXBD3fX~ z4|sYXE`p?f!dwZ-)J%LtkbvP5WYPTrz{R&Eq1%3QawVTR<1Me#m|`AAAV>T%lEdi5 z6`$w$Ju+31m1qbcp;(IJK=e5__05H)P*hITPsEMkHUjU)S^sRGAE+2Wy~eTl{ry@i zN*UMMj2;nLS)NMJ%gk-uH(YfKd>X(X{Q?HQip61L5}&WypA3Jyub z5dJ(s%^*r72(JvV7@523b&NMej8yLd*DWjG%^w*#70)Bzgv!@MTH6l1x6h;~NS}yu zIGm8nS6^w1ZVAMD&#XpoOKdaMXL_or=)?z;@iOdt7~m-W&+#;p;4V(~9*|yoHK{9_ zIlkSslpIicwIbCSSFDBZ<9yC$RV|l!`}K44vNuiqK)!w`r?(UtFVI*#Gy3^NxL2RycYUy^r5 zTl9NF)v}i=>05 zXb)WF?MPkTDh?THbmam?x-%(M@m1&lR?&`$$8(B$#oa?#bD2{7v!d42vMY1|#E8T$ z;3psiCpzE^CD7Z)n+P!CkePx8TWdZxW)N8LyBjpZ5b(a=K`z7}FTQ9O|LCg&=taiV zh}p$LCo18K*mKA0)B79n_hH8M3#XT|%@2+G%~s``Urdm^3N*?z0NA!1E46Kbh&&to z+jawwK>m~T$mfap*4fTMu{?-Sj0QY;IKB^ID1aG?5?Y<*4~qBqFog@e&8idcQeb3~ zVNZYsvn&&hM~yI^LL=I?YrK$l#hNkpOm)QrYHRzxy+t`7RNd+SVZ`PyVw+2>*Qvv} zy6dyoO-Zuv5*(dcR;Gk7IeA#ux_*q2CD4y%*?k~&x_ln0#BT=^D zG6MkRx-yCK947yvxQ-7F8i<`QY`-AQrZtsQQIX_V&lV0+33zfUN6Q@_-Dkj<`MQA$ zk?6_k{Hr^bb#c-$#cO){Of+}Ymd+=r+zHG;HrP3S9v5|P=wV&#t+U=%;{3}Z@40nT z`0TM(rP(t~sS%V19YW1iYob~jt4nb| z*oFjVcY~f}$94pj88))FPS~Xy6Gf|*6g}qB5nuf@S!fM^qR3f(-j&IdK?Ow^@O2BSHWJ!Fqq3-b8~ z;fpmCoyK0UYhYu*uXfxOIXZnMKJ89y*2wdHr?1lRTLaD^z{1b_wru(2;|CvFE>iTJ zKroGBS0wCvoZ=HwhS4^F;ZzSD{<)Cx{uN>NzrnEWF;sJ6axj(~5v3K5HM}XO=ip}F z-s%H~VG5--{M%id@t8ODfb8wN{2Bamc`&)P^prL#Qzirl`iW(PwxYR?07=0E`v3s( zuvORewK_a7Vm5D0B42%Z_p{D^QVwwFN|>!>cMhyPMBcvt0k}PcYv*T~Qz)5JrAv zMb)YXqF}Yw@5ka^6 z(g4C`D5&ig)C!psQRuW(`+TZed_)AJmKQ<81>~un)f?BJicSstH?61b8+ftB0|cwH z`!nCgsiM~W@O)NJh2e)w&X6%KCLX=ZRmA6%EQ%x`ZDPyoD;dd^fHM6rEP~%r1{BH3 z=l+g7`&J6W=ucWG03p9NV+V2PD`KrqybK=2&K3yf-3Fgs_ z>67id*;i|dPoTYc)YzX32qt&ee+qpjEkwD`n(v$7iOX zIBQ@@vFJcnqP+^IZAq))B6cvesW6}nr1QG8$!S3zp_`^Aq`Y)MtO)iLjj{1#eO$vC zX^c*4^(D+en0iXg9UnKwZ`5p(DO7~t(D8DIl0Zh$hp`mRBdN3SKovWr3L9St?} z<$oYU_pGGyDs3*FVd&wzwK^{wRV-ON@Y12d`Ty$cG8PugZ-Ji z9$^IV27N4fpzJ;Pet@-<4%n`z&)r{Hi9}}CC8Rh}Tilq6-=GuY^MGuk;aR=MfEw@GmF-8hW5Sd} zouFryZ8LW(%ZEjBBpUcGvxBoo)|G!9&nL())#dnIL^|~zR%eTLAG5HGv?_F5?X1}g zP>qxx$_M&k6_V+2x-gyT-)Zp7!(M@VDX@gnqaBGz2Tjh%=P^3Vd?@aG*^$*FYObpj zcYwme!&z+iqTcPEB2%Fr<^OMTv^`c$fG#c%8iKP^w0&WM=3r<~Y|nUIdC&tK$j`;G zZN4BpB?Q9@uOs&>)lVH5?acZbR&5I3zvBQEJRH4r0Yv5aGeN4KqF&xPE}0=b4fWB& zyE^ntnWWWs*RUz>RU2aeU~fGS5s4PwX*t3vHT_D-*fqHJ_Hg9H@t6Byb6Tm7dnJ9> z)#~-ijE@Z7=4oSuh4}oIkdwb}I;9IomM8KPTf;>CkrqME@JJ-b=>6l*HgFrUVm1}y zN1$OF3w?z(I9jg=j0_ZyZ0!45&>A*3gZ2{gn14SilB4J_*xh%&YTf$DcO4=0tdh>- zC&szeJX^y*@;P6yHsnVhYa%}?D1 zNRi~FK*F7C@{$ef7%7-jC=tG$saEAkI+)vx96K=bxuU#$XBB0(f^r%sMh#A%)kMICpKJa!wV zCm(W1X}>@n;;-EH#Cw$-3aFU+7cu0eiZrx$Wd&my-xD%fFq#w$;lf52UfAY@`3v_7 zk{Q;4nyvs?qkZvO4>eQMqm$)YBeN^UwpWYJVdf$$>}rLqBs`MI-v8DBc{zql7*sEx z3;T_fqCI)9KWX%eFf0EpzM8TfMUCrwVkMnLDZ zg0`Db(e0lLJhZ7Cn?VT|J*O2R8#{lX=^N9H1hffgQ68xD2cEpL@dj{{b@EgT@zRqn zjpMAspMMWY>~e;}zgv1Q6a`htlU*>iF8`&;BMuNM${n_I!NmsJL;La%%5rb=0mAqTW#;qGSWBXOsOX_$k0t zoH%>51Kf^ny^P`(qY?6Dnzz0O{D6P94)IImbzKi5ul!;@RhX|`lfrBnR&OTT?wDZG zGSplwrVzN=A{~mi@2sTLanO08Ds${jd7TD4Vmk^a<_S&u_%ryh_l&)v2R%ZGOobLC zYyteR4Ukk8Z9)xmGz}0C8IPRIKtq)zKmnMF=YbYamsz_x@GEc~;+NP6 zNN*GrBYsjPmO@x){TjI~TxQo!SeBh_ybJ^B?RG z_fH%X=4eSh?MY{=NOrQFS@39Hs#Hy9g4m9obeWQqMNs=gfo?`3eLT`wc@m~gH*jYt zfJ@w8Mlmmjf}jmYjR72qYgcA!hzC?jHG&Vfw z9{bA(3->Uy9fxy3z~b_nMTJ8#X~{|Y&DXKJ221nl_{V$Ih8WrimdXWrUKMqQFg0tvs7IBl1&)DRYoDx z^GVu+{+zblEWp|k3)-jycODyk6qNj)EoC8#atVwV{94m=*q>x0n&LLk%qB6_N%aw3 z>DG;S^hWG1Z>L(?^$_N1ZVf{i8#n~2W)(P(!;1$qz$fC&{qKnk35PFfBJW1Y6Tbzu z1ML^#K>O=BCviigo+^UQK$PCN)k>V0Q@3e|_%Y>&wZGf&k{?}uEg%v6iX`#b;yD;4 zwzKnEfJ6UkQHd7;O!UjI8TOBmc{wkx4}`9MRC@dn`Yzfj%oV-pEi0qqoogeatHMC?1PzoCuLm)%DrhaPh z3B7D3zSB~x@(Gx4dH6OstqaLX_6V8-j=9`9(IN$XS0qGceusf3G89RpTH1l{+^+Sj zLlTVHO}Bu?**@NGK$wJa17lH5=seFk4%|8~Z{enFb$Zd6&d4CjPZD&|Xc-oa&ijEk zcnUmAn&w}e*~*O2j@ht9sal)HjY8Ihss8Ukm34f_6Bs(kA)rp^!C@9jp`j3l@*V3d znKXLMygCa3s(Mur4dS|rvTWGrS$z)6?jf_q{uT4g2b|*pF++D)-OMBtm+}K?RuUw+ zeetCrHM>WGQZ;T7`h~0Je3yK~Zy2J3fabT)O(hzZA*d_i*-_lo0kYs`{x+nvk7PYe zyn;j7z@0YE?i6(C#E1Y>4mpk+x4(&ZKN4Kd0cl`%Qj-8%TiLR$PQTu!iD{~JBb&^E zimjRJu~d!%JtCw1R})}*3O_#VGUcE2?Ey%d zB(PW&htlPv+1m;A#GsZNbl5%wwgvXRnwTNc&ebytQzmj-eLGhtWN~d4)}ORqS%1he z-QRF9xMWDnSW!*uRlUOX79>U~5ZS$25?RkjX^6FHc(R?8%-QrNV%$0Yu#|B- z_e2u&>Bl{Nb=N4XK?=?FrEI~YM)Rln97_aM4d9n`z*ii4n#H>G;;~tx8keW;qlYh? z!8LJFRhKNAjf(waa$(@!V-1x?sod|#6{cz`(hFiE1R1EBqh=*EWPrto;Hr`aq^!{v zL#iE6{X=6qQTnC2w5@J)WTly0|FvW+fC(&z6^~WCQA~=$IKX=6-_%ryt(au?H;zBg z@^_-2?_-ZR1vFGOdjG2~P=J4cU*Wu=9JJ-33e+>p#I!(m%92t9x>Gm^*aDnmD04$96;KUR+zMgtP zemHVErpk+dx{QQW7G5kUl+>VCyaS%F(H`u4tsoOJCgx3$Z^DTDkV)K@;IZ7sjtvjt z6-#~}l~8PxEPB$^cd#8v2*@Itc9Jis_Jc+2eMiR$WB}xB!RzZ`Tc}E7b5FPD;VUP+ zL0HiGhWz7Z9668xDL~f07;LH#Q+Z{xADqY#G3zuZ1pE$9_gQ6=vJ7Nop#L%KC-J0> zz~8M#dZ#d5g-ya&B;GA8o5RpJ&t@MNj*8>47jAU4zkVB=Tw@C!!o9k#R7<-Vu3)_0 zV{G-998xeftz(PT#lBFCK#0{RSe=I!6N<^YL(UJfDS%`j3;qZI)tp}?Gh!>PG=s12 z4IpyQdO=39;_v!Q9E5cI=em`Wr{{H<;H{utXO}Y=hvWjyX?J`_V6oGJ8HSzMQe8io zcZg+>Vvq!Rr`XE7Lke=B9K`c-InBQJM?1JaM#s4Gf9J zs_WR7nb{9~CY9;YUE8p^&@gehLy7dpJ`Kt}3+Y*HR+&ju4GWG8Rv1YZyr3AjONp{E z1W`uPCZk(q{oHeFPYQFGgdQu%FXTqKTCOgWl_J$YCEeCV36pMvn-}ckJM;4uttO+v z@?lqI*28qO^4lm2MiNcpAiEy!_Au8c^X~B1=#CfehV2Xq?|}G|rhsNnM9z0!4mpqt zIav%z3QiUEJ6NMa6$T1O*j#=2yY4QRaagT4IJQo{c#I7|7LMIg*7S>1H^Q4OLh;wi zg43M&jm6C-cX-B!Du@%tkNP!=q{&a>rtd$rx2e7#x}}xYep)K5YAZ&+_ixYwIhs{B z+ij=&Ps3%37q+$)tdCrfSw)mXBy-8R5@{ZjWS5@(8jDEus>lv#oiMSzsBi55Uq*Ig^8Zr^0=Emszhk8peM9YDo~R3LsXs}YBF&C(VLwpzF3x;V(q#=*M<^TWax5?~ zH-kZdjya3fWXp;G_NEpNsrPM$k$%0q(}E%Hp)(IRQvey9;yWip=l7UFuh;5DysOoH z%e0ZClOR0|fkHR^-{7*{(?1{wd~duKo7G<$^|2Ne5KzE(zy@bh^v`OE5WZ6+p?4TM zcxI(0V3;1wjCX38l0>}5UJ=kYrw3^?8Y899q)}L|(R9cq?*k$YIm<=oL|TcvwXtrs zJ%IV?!YuQd$)|UPB!7g#4s1vfO%cI{_^DulZZ+)0eM12H)OD;xVg>==He9y52g#=y?i}G?@Qj%tq$fDZ4hSgI4^$`Hf@ThKO6hW!8 zc%NO&tPjK%6}^p}BJ>;bN6LMGVngqrr#%qRcn%-p05Gg9-EVOP8dl-y@5qT6jCtfc z;-K4g;j4{ww+ScjpHZ;=745s}2PA{bmwxRc*saw&-H)0@9o5pyQ{JwutuMTq6EuU! zTgTmImPHhJpsm^WXi_1Tlk(&Xu}~wc2g3d6nFxK4zMtsx0d1Lc^Vf zlX>TXAVqM+&Y*IKgv>>YOv%xs5C@fdj^AwCt8x*+(&hV}@zT=`bZoZ{S~YE^adaGd z44^(_4Y{o3g!*e6I34^hb?P}x@fk4dt{$NUdYxRTo(Fk4mcs$Q^xe#&*Ykwd!`6=5 zDLeGd_fS%c!g2@~1B>*G02P^%N$a-DWr2uv_J0K+i#Zf!rT;29yLUCreckq;cSV3s z7fV@s9xRC`yrS*>bC2jn$Bx)PR`NBvZjz(Q8)fT|@a@LCQe^k=?eRCnxwS}>yTE8D zq3UN=((g65`RxW?enz2{dK89N$0~DqF|g1Ww?-MRChdHR$AU$Bf6-7 zAI$2*@J>aV|G8dLl?3a(}TD524%he zr1kK%YlH`YNqx4pZnoFyKV=QQzpJV&r_9XPQ81_?SDgyvOWJP$sO1PBA%HbLHn76P z*HH=On_7tNp`OnU(p@e9QGieHKc_&1$vM3QExTn`U}n3%T;-W`D-75Pe2+V~A7$I}U&k6{Yzc@&(BFJKQ2iwIvbR1lE^H)1&aA(&j!v-z%lku_$5!8h^q%z>z@ zMW~;cllRm!k~Cj%hV`eMR=SJvL(symW*GQXBq;_fNx-JIwfS4kTfappVUEn>fQ1>C z(e{XXC5HQD@K`(_gzYWI9?zoLAR_y9rFe6&l6$|zsng8UjBBF20__0uAVimzA&-*y z9vU>Wl;uhYOGmldR}jm8jyrH2`e1i2?y4 zW5Vu8xS`ukTWZjvmmZwETk0KQGXIJL|J0Laxu6tA>EG&N-+h(ex$KXHBEa(G(XauC zGZ9iWa>~jA6Ai-eB?_d37k>-6h9{XL{SUvT6k*LAdn|?U`=kPuPAI2pZV|vfE2&t> z>MsFh_P!MTC*C0!Tgr8s6|6d+-Z}{{EpunJSj;`i!z)0epV>PNmq{K#=I7# z6u{ATknQ-nhxS!DC-)FcX1Xk)ea}K&Y72qn&BU6|*q&;5NsC%^SL~L#rZs;dWl7K? zq%=kmbi~omNq^NvMRTUUhY$DGAm2|UMi`(%F#;hp0IRpQVAl<30%o@}mxl|vb_lO> z%JU*c|3}X6)hOV;_y|XcR2;|2vY@&wT-o{uKMOGfp~Q8&gcVeXpZp?~RT4Kb`JQ^I zqwA|H7Hy_W7X?`z6=lHt+0w#069i%ki|L-Ugc5wMt>hGdt5;-5)QYGV^p>XxFIq9g zCJ(rai8@7*!-d8#O!kgCManJxBNfvm3?XFlOA4w+aV5YD2ex@fIIE>kYATwR1@Ea@ zf1l?D6-GI?V|2um76LdYY4@DX6dME3aSgUpA5yFo{kXX#rjORI)jDuR>y<~!&i}13 zxfaynk6jTHnhJ+a4gmj=GgWWi*Cb+-L}D1wQ)^RrXTKg?8L^}x@rArKA?vBiuTmzy z>T~oAWZH|xeA3uIY1x$&fgI(u38wf>vNDXmssvj0hw7PQGE?DsZyn`75_v7uXQDatax1MsHEuEwSVx= z;BTd&*V0X{;j{w^FayEilHdoonfqdXt{ugW7*CVa7aa~Qbq2m-t^O4EtRJucs;~#k zEW8^7MC6#g6)9h;hVwE@D0O}t7G@8hi{0W!>%Mo`HS+u=VnwLj3`D^|uC7nTABpNN zj=_J{SGeIP8SwqFcVBqh!J5+sK%{RzOn_GZXSM%Hd>wtwg(YA|>AS>sEGU}M>SPd) zOm-NpF9~NYaQ~wD7P<0Rb!Qu7cQe6R^*7Nq{kF4C>)}+EU+vydwmvr+9mErHwaYSS`keGT|6j zAv5he2i~)B8>15~B6lFUd;RxaO@!x&UEmEtu`SkZG9S@?`#IRc>sxNOjuhPqKCkH$ ze4hAe+A2;<7H4^r=+1tBM+U`Uuw8M+GXyOMLB1&+-*OUBy2Kkx*m$BFHV#(@l(f6o zAvhDFA|fHRem<)v-i2>|*)&ML2!Tj;hn;2vzXBaKC2iICv z0dwxEJNjGXNjdx>FAf*h0NO*HHbz;$|2LH$9MnfGF=r60IQl)vLc1<e3mc#RnHsY%?~Fplk63!!q68efKY}=kyHzHF+jS zgSz^{QV;R7*+#;fAB#PYYmuN9MlxyOdMNpT3$T!j4%k4;#|qxs+`R(MEobR#bQC<& z^v`5FyxH0;dgP+;`#wd}${Q5Ro*3|Tl8x4?ckYKpMXRp5T7m8h{X&syA17`6L3>*~ z-c8$}Rb{qm(GhQVW}Ys)P|8lbR{@IX63u466hFF%Yc$S$08|)Utt%?~GXFk%keJJr zk4*P22IAJ1Q5_7w6Kx?Drhc&ZL5GD|R&Ea*fm%ma+Q5Qsg&_MwH!rex+2xnSQ5R$B z3B_stqIj%c>+HxDLAwpowFhC4y~a8SjzD^iBh7FX9peimKUr$~3Hr&ILvaOI!lM&O zl+zHLZ8O!eEv?W=}|2JMb$^Djs z|KHpwHrE!fA2XvVgV&o=+95ate>cgKKMS0t8--3R4X&z1I6`!oqPLE_A9Ex4+8YKS zQ>cd422)*>aOaxv9XbQrZZ(tjp-#E{%zVG{ySO*S(xWaij|zjQ^^c_Wcc4b7gBw&= zQGfpINHz*0)q^tGmAm>{g)bQBgN|cwKC1M=sYQXH@tQC5dJ1?SPSau212Ue)+;_1Oi>cD!#KY&8+y#7{jL_&H z>XY4n(JNKpP@GX(|6O7X`ymDjNx5V8&ji-|`LF5VXq+IGpHJalQ*K4%AW^ul$IfW9 z_3+kbJQffF5#ftRSiQDURyqhDIAzE@gXiyh-Arn~k1b9p>MrIK6L|nh6+4E*o3EteQRy;wG;4V+s%eken0 zUN8OcB&<$ccQLpS1_ybX9nd&fWaYHl+In{bzL6!?(4)m)&pE{w)T~uZvrKiM$o4emo8%O- z#vXRIXp!$47ahYAyg4yA{o!9?*J=~PEHbY$i`=fApKxNR`G^+6dkaa0k{4WVLD<`a z$?=96B>w95w^zFt1mAM&h5UK3xyY0ptCFIa6U`wM zYpyTL+K{~rt{M#qQzNSrki2W7*yl{(KAs%d%t|?c4mw`7EMi%g-;_5(HOs_lmjvW( z`UTqx2%ty#>wR1U&pZ$Shw1b_e+6TN*;^9vm0(4s*#sPoJLMyeEFWOkwS~MuRmG~( z7z>l#Obm7N1dNLp01d^(e1qoy>V7N92F{mawRV8X=OB6{1rTuiI&6{G>%T!{yO7=y zUba|{ISf@pFvIxgas;YWAKW)+C_JX0p(efQ>4c+m7f=P!le5=KK0-g4KmF&tCL-2` z$^!~T41J6=*k<&$1R*}Yhl2;L{08()T%z8BE-*fG$Gtc zfGW4MRn7i8-0EYLdTcRiMsJU8Lt_6Bsgk9pl zkTs#gHRsOM1-`7ulaaO*+s!x!Ly9u3)7Q z7-`3ya9E4)8EYcPnevs$^u_l6@xb0=gEAt(BJ+Kt8jAE6#J0lJ_#Brz^iWs`>TbQR zh%wgBF%r>lwi}er*9zNqr9oj)Wj)mLmW;KRbiWaW zE4%UIKvp~WU`+IfXHZVTRL(UoN-n&BNk|~ERdqz773&e*Vr@0WMt*e?ye?J@dp zp8NY8?ZQ$^b;oF%c(=s8KFDm2x*h|go4GN=ySHJtZ6aAJ=Ao&-xYY+d&)Vqhs3#1RwC?k<_J-b2ns< zZN~7D7GfAKMzav+Y0lD(3wE@m%8S8XJDX-63B5F59H89W7PB+rt+C080m!4W48R0Y~ z9OASwmmZx)?9Sf6&i~5#9{tCHKIivm!JGuR~s}`q(0k=7% z|B`1q-~P8bD`rodV+`;1R4>ZoW7rBc_f~y+m|<)B>FFRP6H2j37_!=3Q}Xh|B&HjD z910n@xIX}(l?aJRe3Fqv;;5S;XGhS|hI3SIWshlFxc&sUaO`Hy3r65PF-Fp=P>y!a&p0G{VXV6@x~mKvAPsB2*3d9X-wm`oDeQ#(B}b4wg}8;cgQgdPiV~` zh8OVk`HCdx#+F`h7LsBXm^O}zXJ#ZWI3GK6;!QJ2r zRfApv-7kyMatqXZkc`Iit>O?b-O1sM&`KiZM)WlFg-2;&jh|;5guxx}F((HBx{XHP z+fEPVKmtfG-evts_SR^kXdToA=X~lt0~Yur*!aODxP$RVg`Ig%jf!m6`Yo(&Iv>6m}dR@mCRm-j|1g?w=w`*g6F zSo_)!TF)_qGqXCsiG)o#!TGRhidYw88y6>88KATllB$$>R@G-YR;L z7W88Gir$qM)!)@z$iB{BoI}}Q08}eyWFFGspKuce_Sl=TbHM#^%e2yKc*VA)TUn0C zeRnHh`b{~k`ORbuMYl|<=jWHqdRkpNz_qC}3q^@tXVzj35NP50wi)MrI*901+?;d$ zP(i?X(1Q1D(+p43$>mW*&JCC60L8?C+%VucxD z3cy$EIek)&lfBvJ_Sw3A_flY-FUg_8ZREHo(V>>JQ^N`Zvv|b6p#bQk*os)XnoB$a zHmqK{o)JK%z|ZqGQm7#iDn^R+=djGG0zFmE-`lFp*G6IUw2}I@wN{G{cZXI@_3IlXXwzn8FnkLeww;-t@^4D zh8>im0p!5EXt|A^a4O~+fKET2kO+({#ozOxI_C9APrvMiu2ZkeEIg>~05;IN&JD+% z?}e<^U2+d>F_~+gvCq;Lk@9@>oEb+;r&a&@^7BLKtr>>T*{nQ#q72C%eLisBEb-kH zIyj3q^%W2~IB(&BG{4Ss|Lvd|MgBdk2#K7Z0w->M)k`w%qIGzKD6CeM2oZ?KK6H>- z=Z&Cy@iD95`2To7NodyNNS9@Gt}VDmCkxhkI%#7h1bi&DT5pCWLt#O=>tx~I41}hA zNBGI==3xl!XNegvDHDEsyyn4V=)%fYpZ*90Q?xkRT`quM{XZmshIOEZO%An?n5cZ&`N0=;d%O?C7)3fkbJOZ}oC>4z6QG#nScMk4BJXiOLLo*gOD^4}x8K8BKO$&?8jrp=v_uIj#Ge@RjAsILtQ_Lafji4lWfT zmK}nX`D07MSw=Y=@*qAE4cqcZSNs%&1YYco%(&jQ3PGC>&=bd30bSv2&{{93&bK2r zLB@!{>*JPfX4s9~oCCrM(ot`BUak~W_$%)4;k$v(49gOXzTOWdMQGoW<&*zY92Sf~ zQ;?9z78+@;ucJ;Pp=)-{WTal(uSrE8)VdSO zvCJ^`JvS8WW8a^AzgjOXJw8&)7N87-pP^u8C+TQqoa|`4x^$_B)4n$k2OC7>;&lWN z0=!D@nF@efd5h~n5={_huX$rw(k=&_Yyp+d*fN_zAs}i^MJko41Y6FLMtdo^-hjV; zTwnvQ+elgAb!XrbETTkOy$4=Fm#X**#p`Vkx^IFtGK^G;q%T8R=pLn!r*J*& zM2F~N+pIghh*cOX-YICHm1}q>AR(NOkS|7}ZHD(F^&pa_#f5)s)D<*8Z6QEXj%+4) zgiwMnY0sNL&CBM#f?i)tdq;xd=$LQr8QVN)Or@hC*0EM1kumyT>qG-%tmjF0?_tWF z`nD{hQ)WZz53=t?9Lp;c*d%Qd=Qp}E^emib(lRzqdk z!ju&E<2Jo{RSG?9-ziw6Up~4Jp_vGRp#xs_W7ZFE`}qTB-ATE`9IR()yu zb8s+!nxe(sR^v6SeGA}zmtvt#oY~S$MU<$G7nt#X`;|%9&^gf!BJCrE6x6Pk&9BZF zr8FclKneD(-iCGAzJLO;^K)J1wDkwldU_=r5{mP*Wg2^72*r;3*-b|p(TglAudLUd z4FdY0=ib3LVyc-r;w(>H1M@p^!-P8I2*Gxz_K*K1hFr9;=*N!LZNu0YS#JPzDqByW zFwq;_isN%J)*lQXckI_`lKMCe)lR-oUwtmcqoy+>~I8g6`_#L%K z13(_vx04T9B3$KHg|O|7m4lPRjP zCQY7Ya~~ty--bmOy?a_c&PNIJ1*ucS>!k{|yR=QkNHcjKs(yyTo){sdjA8Sa{t$CO z?o26TqY6Hf98(Gl7Y*+d>;@RWE9bERp8fmHYEmGOon%bdw7SQDl`@hZMe|b@aDZ$- zG4Tm-53 zru7ySnW2+$lpG5mVaHv^w+aa$7&GN5-#;DekpdG>zmG4E|3Il10odi8%~nP0mwX&9 z&HV4{6M;|K;tsAs=PS7lg#2bU!i^l;Zk>-CKJy?weMz?M5j^M(iwl-8n)b)7a^ zJ>HA&uDbHGc2f_BU~hDzG^hB@4h*3*H&xNvW~Q!{(Dvx=J)dMmSc{_6z)VbzwR@#j zQ~1m0pk~o>WC}ZW2?# z+fsZD3wV#^i&JUH1K=cEw7qw4ZDcp_m{Fn-4h`%neDl>B@ z!4VFz3@|NsND(@oCW|bXr(QpTh|S!^Sm_GPW_$Ti}w=W z4Nb(&QMnV3UHZ4*kSd?~LHv-LBk=_^QLF<5B)xrR1)D-V6H0gJ*&XF*({epFxBV{icZh9s1y(WbW1 z(Qhb3MYt6oCqItf+WkVGae4flIYI(t6HKV#Gj?xp=aFV_Qg;YzD$LeKxDG7?%A5aV z0_ze&G~(CKVTVW_m-@LkaFrl%X0T z6BJc|LT&uKRa5cls=Pi&<|#zBw#{tl%^9 ztQ^?+r;Lt+PJSz4e=xa?1v6$%gdACx4uF?2!OutQR-U!nsqK8|d8lkg3yh7yLdl%> z%tQ)b&sBgDEGd>Tr9Q~6`R|x$Bwo#EJ^Q`L{$X^xgA*&AdB`G(>!bWPqwz~tvq+D3 zJla01Idki&hV`SMi#rOMo?GE8p)~YQXo4=`bx^CevwAF1tFh1OMieC)#z%a>O%iSp z`FtwoZH^bqJW~awL*dRonI0{Pm@h%MJ=>+57b4`SUf_huk2dX}gZBPi^^%s_o8;`< z8D*H#0#uZ3KX5Cq{Q!63r;&oiC3^G)Qv>Xm*n}17jNj)X zWjAg-Bk}Gu4}md39SBO;EUdyK?18Z|uattImMXrXTzkC9IqJ)-q zJ3_={eMFm5?rsH8d0|p<_nED@dU^!T2thL?tc@~O>Gx*RXte3R`t)rdcLATp3i4FG zyz96K$~VEOLoj#p#Ap;8&8FE{kn|4*>lB$zXGJBhjy2bg{w6q})^t}EoqgTvx7O`G z;bE6xTo#ixThXtgm6jq6rD*Dwv;INHk9#j1nM3!M%^JjWBh;UQH$9*}lzmqtG^|>? z>g#68BUH#++1$`CA5K&ZuT3!i;CdTbPjaLA#zYtDg61Yx=9N1!hVT!DR3PX5Ok?LClZ6}WF>R0)l zBqx9iv#QUJZMvo-NLieoa#L4k8w33XOAFbTO71zY+@&e9-VZ20J5t~5`i0$f=KOax zmLNSXyR)Vm8h0dwQ+?WvF%BJP>2qLI&$5FvQ`zGx>~X^bvxa&Kpi`v*v`KJGkp`}#Be4{%OGNG)X85*uIK*DGgMDX zTAl14t}*nuOwsSuowU?WK5eWide>PqA*1bA&k2vEZ3(p{nL5IUPB(cXCG6&Ig%KSx ztFbFk0C}3lUVm2RYoa945~EgYtUbUT;zof>>nZjrxUVWeqgv6jwK3-mb8`N(r2MVm z%S%urty~XuX8UO#sR98<$Iruvj`iH01lPUoh^Psm3aPrvF)#?-jdW8DzH6Q21r>^6 zrXZ*35VF%+@O=LYZG`$udI=}RB8P=q=qCMuQ~+F^qw>j-G(u#?Jy^SH)E_bY6_LT#(hJ`idiqU4UI1>m};EAm`{V3q*ZdSeD2;n8H_Brk*Xvi#e~$B z@pvIO$xYT8Z!6+7&4L<}pXT))sT@zsZWPCAOh(4`z702tx8B>qo1lKvpz4lEwP!<_|U>-aqi z!>Hpw(Jm{j4Lo?#njNXzMzhMgtlQnuP%Y;`fPRGOMRf^8N|{%K9d+v7n*eF3;#J67 zRydm7XNP7Tn=InAW2Wz=zhKTQ*_SP`xKX6Ss+HF&%H&(=ZE=&e$D_nB=`Qv^D}<>(&muW8|U5 z<#a5v&F+I{%f}m%wtr~Q5BhMG4nd+PrYE0()yk92ESEqz)y0e>-_`qI2BU$XOm#2} zEXUSpv~B)&ZoV%2L!@8n*!_b2(Ay{;=cG=SAq~yx6jc=`hHn|kp3LxPfOi&R}Di1>;8a;f=GYVKMuBqz4_q@*oOUs37H5zrxJc6_Im z)3bO}etXSkSKgm9`auM`=>Xn?29AIJ=5gnpHOxA8i1LXM6tBz1vXfT#LmytDInLYZ z2|FU@=%qtXnr%~`m(jwNy<53fFUm@3GKLlp5FQ8HyPdNSmEM9X9p;PVu>4ssT6!h` z;(ygsb`u2R0p3jb^yj0#$JOU{YaS$9vUiZVNKCi+$BJ7!5g6H#)I>T(S+f5g`ws0^;Gb{_U*h+5@dh*21Kz zr&1&Bb1w+*7aJadLF!#2!e}B16TWl9eaaYvpmO%w`D9`4??Dc9s>Y&*!d}DWZaxHW z-Ip=th!vOUprt|t%)`ozQ>dCny0_&f8fW5;`u{BKy9rNh#g+sJ*!yd*{mY4QZX322 zPy^D0v`;s7s{g|N?MQT>RqC%e~1Ovi;)n>qCopiIt6h#lY=DZb!>Rn zo8E5G?5;1^I-6pv$|K;m17*DL5BU`4bPhUc&<^%k5OhPDc$w5>uk|Fj@pZ4uxUc*A zK}!9~Z0>zexFcLRExqcNi{5{FLrfh06!_{2mhY-4)}(EjAh7^l5I0Z|$z`BP97rc) z;f4}yDZ-dpL>JWj{8rp%N*jR9r(lB9u%IA|Hk)qIMIhr_p<9+BT-%VQD1Ot!EP5}iG{j>~U52IbZ)|CCjJ`sqxKya2={Eksgh@P% za7Ix82xw6;wDGXh2~-xRbWH`ScI*ecirc2S(w(?3n`{$afFs<=28v;<6_=>gL9ecA#oeVVr2_AoIZ?PyCC z!pnyvU<249s~V!OXC!Y07%)sKAaXQ66%mxqL3Xcmol<`vBeV>?k8$?l*wTVOeIIQ& z74Z#?~x^_sF0%qp49-bQIKXAz8s0yURg=niW)=ZE42^UFzmRyTp9r6f?&rDWgs3Bo_kB zvcS*dLgb%r<&MW!BOVEQt|bBf3r&<~IoP?prpyDHE_^^wn9D47-GhX<4G;u$Hj@00 z9ESYeiolC@R)LI=1gn6Mu8XZk9SlFvPa)d}LaJOBdR#&CS*p9WI4s^YrDMHitlisj zA3u>_dEt;tyzk)kB=A{y#v!o1<$$VlLx*&327x(m8jp`gs29+^L0F{<`gjl$QF5|w zTD*okWPy=7dQHjUYlZcyIor~7dUPT0f|VP?w}#f0aT*;9-cg2ZO25sXvK3x7UjtN)}Wz(XS|wfR}XH+&*}r6b5|>X(2Q@xE&Y{5 z?T4TxB}_^15fO8hLbUhNs-9m6#bFl%wN(!)YbhaKCH(~SBT9ooX>BIdh)vRXx0EM( zV77@6Qy~DfN@Jv{hR7csT`C%Hb2A$%kt+k*sGEUZDY+=Ckk9nk0Bs#Xj63ZFB+DHN zK|XvtKo#BAImDNPh|H8?!wg7N3`U#UhTp8`zg|nrW1Gdu!fnM|zQu{7X|wFlzVWc9 z_R$HvxD!2$%9GcJ-9fK_Wox~(c#W^S1Mmy zcc>h{%!^Z;?nwZBN>EZ7 zEhB$CXLBer<^*Kn`aGB%7BhZaqhG4u@OR-2qM7ew%Fq&`o~R97SHNayY_%s&w`nN%#TOi#3rp2A5`Y%^KT$@|l$!?% zr_Zo>#hB-8hTyJ*$sdmpz{)tt4>jy(?nL-xp#oAHUFws-Y3_y_LoGz@RYEe2I)8RK zDLG@qVf)bAbm3CeKT93q`JW?M$gnSLr^xxJ3oo^-g~!b>cl6<%KP?`UlZ!!zM$rRz z$3pO+X!inPnF7rd+00!bQ14l>N*cf6FmlOzo*4G};FtwEpqZmer!LC5U(H3iV*zMz z_~b*Aog6;+|JI~LP)-3bmji_J*M3= z*h;C}w}>LKenE}*Jmbv0z8QU52J=wRKr1Bv+)0{@sP*MGbaJA@xfwoFqKo$Jdq-aD zA%seg;$6lzc057TLLy6Aa6}UQKrJVbl)MN_qa1$E-mLT|N;ta8f|xi02Ptr*f%*Ef z(41I{R$%R}Ags;P|KGhPSC}t?5t~%r{!$m?L$j!E)iOe=bJ%+~r z8i_6_yzW%kJ=+%K{EzSbLGPsmlwv4_vMX2nCOQxYl%4Fu&z&F|d}BK<#cdhWMeU6* zV{m4N=y9Epz>6F=B`+5cpvws1pNXBr$4PS_e$Y8oLptHmE~A`|O4f_nCtc>p%PqP{ z$#%FLRL_}T|L>+Hpx+hketChDW3*R0JD=sERtS9|cyD6uXZJmCRsEUCcMYZc0-_4N zcbuH?_HV9I^LNAC6)Wqr?#D0W?jK+TqVmVYm zyCNs{i$-PwAX{Yyl44Diwx<9<2v|&w``bg7d$V>drFYpKDaWs!ubo(9r?384tSVuX z2jEy6wa0YJ@Gq^&4X&=_lDD3j+uSQP331Z2vCpX(H~>+pVh>J7UH_qHkYz-&=OKQc zh2lfk8;FP#VBu|sMgFSkOBMapm~uAbBM}gOYo4luV=E>AQr?sd?b1_|rAiWdOjYjn z)H~JIi;BduL4T6QOx52mGKOEDEGu1&}+Qvu#>l{UJY zugfPi`IieE@`8soOVGBQ5KRNd+UIrh9nVWL05Tb^quQ&FmD1SdGyE^X68$(0j*iq#!Wvy0mK5F9qb3>$P9M zOf+x1aBOK|6Gw+8`(8K7)U_BH*g9q|nf zB2$@PMpIE_$@DG&`caA<`%Pjhhg>e&*)|>tuAzW-ea|qS|L5j|`_V(=Dodqh`=*`* z6E!NT%($Bln&vM~xPsKHf-7JovS1&3D#gPp=_FzsEJgV~cXHDgXh;Jfm z+70v7uW2c(ZXSF(^X2b`h>&(#gD!SxMmIAmnEMhMih}N0_{Xc}0GqOh(+4R9i9S-s zw4Uo!IuLd57+GZIefon%p$iap=bVf|e+mXcBTnvT-P(E;>&%M+kn~Sw3Iw3Qq8{W; z0QKcKV!vSewfIaJ#hV@4o^~bo`RTW}XbOZdM51MApcF$H{Ju`p`uWZ?gJhNo9}?E~YPeklAxrwbf!LRp?X+@d7DK{)gP zp+D%E5iNaK(Nxp&JI#i9NqlyHua_@)RI=`k`j!F46+vwiiX?mF=r}q=Q1sotQTRzh zspzm0@`4gRs?E!)JCmz47$^eHK`Y|4`P=_Q%B?2Wp>*zQGKH<;fD~kySWI4JF>YZC zYf4o?vMCon`{5;R?*QhL$cMsIThvHghFPyVRm!&Cft=gLCuPJ%GZ8jEmvP?Yu-@gh zB#YfT2;~N^kw?#nB%L5CqnQE)nTx}Mm*cb&2$hB0SH#5QtLH2`0w~*9x0Tm<)^!ZS+Qd_jd1PBmfoBY1DejXc1 z|1fS!xA=;petfqwHHAh$oh{@`8AcbBHU0uzn;uzxR$OCRL9ExTbkvI4t+dJbt9}zlw+^YTRSNn9G?3xhYBLc<1}PHvjNEKvD5jU6o!WP@ z`b0qrSHZ>c_SQnsP)Td6=HiV03}QuWRFStwB}CI$gAuDxJvJ(e?uFLOTv3@%E&u-t zO`S^dt}vE97C^Uu1p5n56y(;VL3-=;eMe3u_7-zZC*y_|gIC%BD*y-hSs@_j@V^Bv z;qX~gXxFTZ`Y8)5+?{c9N*y@{W__*NQFJ$|B)tMw=;-stgQ|nAtqTt$$OjnpS$aJ%bto82ULjUL!U6a{* z3Z<{-dn}G}&xJ`lS|+6!|0)K&#Lxh&H9hG0UA6FU=pn5LnoxK}p12e{l@M_G*$h`G z(UP-=e-v{y7Y+F2Ik_BPEh<3)r*L5gsf4Viv&=mW39W%y0g>EG?crBXh3GAiWUJ_V z9KwbF>E{%J02cmr-}+4ik7Q-cD5YEzo%bSzp-FLg1LXq4fFYA=?b?LIx09;XuH}Cw6=4>#>-1 z6Z54<+*CA^Kyh-JucnVYeINRcLG`M4TfRkkXRxfFW3;x~o4CKxn>}5IXK1}W`yK(Y zOX6%D(igtJ85`9CXAB;bF9l2O@%1Xw-=Z$!=1wgEqKvZ87Rt~wL6-^?3Ot63Hlb!-1(iV9Z4W_fIpO&LbO^o$k?CwrYZYrRS zSyRSh;MdSEz~t70IRsB{p-KS1NoCe|<7r-dC^VMSk+i`kwx>NL3B4)4?g)pDCKa#F zHAgc@aKCEK!jLjl~&k_8#@25lp! z_j0D=(wZ%~5H8224zuQ%SvZ7E3T*GxVL06B#L6Ts&Ac%u`lcPn!GL|7u{7&c(a>sZ zJ@{9?>4oSrDJ5eS0^Bcd%Ablt6Bh!&~A`0!bAugAqSSMYgc|Tl)At76F3*@sf1I@>qSxphLQ=r4y18V zEbEOaLT@x&2X3Hqa?_n{JY2E>5Sgz?^$lo(#ja&+R11lAqznvX0Bp3K}nadG-V^i;bH1wIc`y@!p@!vanRqsQSK@9wOz|jrB^BRDe;TPPe|^&X~i_ zqpDjzZFtrrh^x5G`2ewgAV_o|!cDM#%7RLtS$#T;^`79-P}qt&cBf^+iR*tUHeeR; z`Q~Mh#xlKyWQ>0FWfdh7?V#54UsBCdsIXmuDqf|{`u~5pv-&F)jgC@^a|y|eujg*v z+yM+)!{1Qu&b9zVL_Lrf(TGQ3hq;;625=!&J{;?q?LL%hN&8{RsN)MKKMZPCsz3eI zOJ}B8O`5-f%wx)45L5Agxi@>_EY3uN{ayG63}x0p{2V|~T~BG`fE zTL=81MrUi;RNn6_8N%B7o15pc7?>kmbxGmlv4xZ=?aHaSRPEkgFS}3N>ZK-jj!ZVO zG%P(vfjEc-ksOv>A(cFr5IpN^&$jKpk7$eOiD1CMwXz5|xSc>F2)Zj?UN8;p4f?|C zxD3vO;yX)+M;O#AtH8fbjSyU9IKb(RHrbrLq>a<2;VKJ%xjs2WCM1oPD?_$1))P4i z&yeS(NS(o0Drrny(@Up!bW$hfZ1>y71lXd}l8u!PnVt!-iSUZVEx=1@rsrva4bZA1 z_bK)u(8!@`fhHbso}}_UZ;pxK6E0r-UF6JDKRvbr{hv`a&yq7IkV!oBKg%WXm^QiU zT{)8$!ucZ=apyTmVmOkZHt|0K_dRJ@00=VejA~tqS{KZ|SA*h`d@&Z{AX4ewL~>OI zsUbb?xPh)E?ENDjL(==VJbOs`9!nqGwL%hOxj@_sGoRmD#lZ)i@OgqH3{U}tn&%j1 zgZ;IJq9L!=eF!g1AfAjUEXk9Dh8#7dpN5Tp(5WwbVt$(n%wVw(ad+33aWA5QL6m^QZ;J`wlCo1eom|Q5^2@$jFEyt)p5eCgrJZ=A2{iwqA?RW!Fh2|gvV&kX7_0pR3J(pyF@ zJCz}}%3IucAaZJ-JYI#sZv*P!v}q}OTRC*?>W%*Q(;Fk9vYC~lg!qE0{gNm zRAaV##UCoIZx)j!sM2=Ji(%%)`?2Tvu~#c)M+#+i8PW~W7TQzTW0{yh| z-;Urw1dcg_qXq4O$eQ=;s_b5SOoJ&-XF6;9ZR~+aM)ozspaO|iVxTIpk`6yq(seO3 zKyxTm>L%C(c8I(ObI+cOf!;^7kY!5E5aYN zC9olW)x%}U1Ck6S!w=Wh%tQO-aM?f%2|ae{o#seCxOt4Dqqmp6yuN29X&G7Z4b24l z27)5_1eK3Atf(+wx2QQ69PqdQ7U}~t&aV%tA`gwC>waf@@)&fJ8zU0C`RgnY#z zn){vSez;&EDxnhXs;{>J_@UgP*EhgExT0$TLAS*bP%?#;u}6Gh@b7(0mJKfO8g4z^ zRJCvlbqf4z{W$?BxbAUhga|&R0hRi!mBXXU%YwR)w868SoG%0+Fz=SA$NdZGv{5?% zq@g>k(yn5w-jbN(8aboe;+;w>KNr9#_@(EY-Yai(6wFgfCE9~^j&dK#->$tF$_4nX zN(8aX`0=8DFt(9f?V(onyoG|&nBEEDH1`6IW*pr6G|RtUpk zJCdNoFUbH89%;Kp1X}4w%m|N+uLUdst zz1aWXWdq*|VcvtXL}O*9;2%ir+pL?}DnO%aOR&pIAZYoJ>3DdZoM*Ob@YRzh}& z3G)QWf?EzSeDIK#qOB?QRfM*ae{^!&j+%PZADRA1&1ZC_LazG}h0zj?>

;Q~bTi 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%0AtwtUIW4T~@ORWhhG=Eox1EmHte8*)jDpW~ll)on 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

i%M2XTMyY=6R%9d8}r`xN&; zum{X_k1w&wG-v+Ff2QU{=(-4~UsD#tQu(A^L?^*grZnoY9TqbpQSr%ebHzM%H%2-@%z_a@55&0v68Z%68YU|I%wf0G05~L-@)ko3Uxf9P|LaK)Z29SVGog3-<27 z=WOq+K6f0xVHw%D?2R8Ir(Wh7lB<2b5uIVP^|!>Q5rn83yZRc#HKfc?3Qp38{3Cqg z`r?FcC2dWsM2xy(zwJ1>Yi#|nHz1Oe>KiljiC`vcludkgPM3Z~yWUfsfOe8Ki-+Lp;2Ws>G$$^K6{>N9UtE0wCVTqq4c`f0b3S=TFI=pON_|@=7PbJ{7Ayr5=Ij z55c5pD;^RmK~J+t&60tdex+nJdu9i)QW28R1L;EA2f7T6myi~4txIB&NY2)|*N|f5 zb*?NLgAmlW_iOq1!rNEOb-h#WQv#9EeRz7kQz5o5*ogU6&4`uAiA}ql3de)Jp`5K6 zJo|(5#q-+PF85{Sa!3rhJL~{2K1{V%c~zqP<QLJYWFJEZ6vtoKf7Zg72=;ww!%`a3WSZN4ocf0WVK?i(&|-h> ziirdUk+^zfxd#5_mpA)(HB2{zW1Z@Z8+Y@adyY=PQpAr)BK-mNszJD*#+LBoWKpRS zi(vOcuiBg@Z*GosiN$I(KcNz9!1eID^wQkZK`uwnI>Vk5C`#L=!BQ2*NvL}>7mR2m zwA>7LmW)J#wjX5Pj{0O$?`d!3Q%$|f#j<@V&%8;Hq*Ct#(wrOBWuE5nE!&XWO}eHB z(iFj?%H&o~o|Gk3Ks;^Sqr|`nPAl?V79Q<^l~P@49Nh$oZD(!!9}0|0k3SHJ0{^eb zFBn;j{^;IJ#Ib4L$7D~&mi9+~mcl|`9p-^nE_WU<5xGWsAd-9n6yv8SKST~ z{gT^k8#+T?DQvK^1C&5^^P&jO`|YXzBtm56Mny4Py>niW1ihj~7$OY9aREeJY8+RZ1&&Lo)Y z9XL$wY=prpWi#|1-n=_>Ut(W-T2}{vaTpztVhJkS0g`5Pw>a~u@AgcT*1_I{0D6&F z9WGGdA4kb}MVm+IpmFJ$kApj^%IZSQhDVUwN6`r*FgkClfl^ydP&C9NrbBGzpO{ix z53yeEyXlf4gZKWoVUynXe>0BEEktyN55+~qSCCWx8_SnviJQ0`vbal{FJ1oSI*p0E zfOciaP;^o%wig-nXzJ)XQddE?IK)f_&TvmYQ}4AjJ;3mDr#94YvCZ4UWOQn9iVmu?D%11_)znx-wQ? zrr8V{`9VeV`3@jgW&s4zUbw#M;A1cNianzF5zURr*I7@^NlKV8#CT>f1c)n3vQI4C z3sz46;o~zUx*IkuPW(|3o^DNnvvoC^EI78jUI6RDnX8Fjb2Z9pS4sQ#Wf6qH2OgCr zP<%uO#zi1Ut<D4DN4p8At%`eQyPCsFKrBWY|aheY$HZ)%)f z$D+8)050kfdZl4ymR}tYcs}z#$*M3^^ncbeS*-Ecu z0<(o8L?|Nhcn4meM|;c5wT`(3x-fGId2<&;9wLQhU~N(uE`}Pkc+1eb^M0NB)(n_F z&Hj!Nzc@=Y|{)@MKXF+kIGBr$zBsidjU)JJaJBTl?_YDZyooABOW3D~X zuSh`FzkING%#cFdGy@Gq-z(Ht={tRvbmbnz$k7XV|Gt&iMOF|JxyYXM-TyaSC<)U} zmhNDRR#5a13#UJ-2$6}!QRmcq7)xlI=^;({%tbqig6&lgyu7Xv4C*c2! z0QN|*i2X6Ui0td(hFNLDrLyyq;SBx5Am-BB5AMw->85I}dfQ=Iip1W_f>fPG1F1}? zA>K@a<`D1yesB!AlnZMN8RKFZ+IC26mSCChZ43Z0!9Hs2XK|hx`22=#r-mR5& zT7R)Ok(lM2M6RBm%s*baij-iE^7rWdlTM!;TmO>DQLkk)N6ONv)ilji8dK`rrGWM0 z$9F@GEVB!4L;=DoY_xC#)x+A%1t#V0JhDsz!iJ;F$m-a*wp)MRT^U1JG72|J=4ioR zB%BJUxKEmqsFWnGU0EK~EU~4K-CkUYxBgApxE=rhT=*yc6f%LtIwsEWikj2%uMYz- zpez-HIx|7j*n@yUnR`!LHzJ(oyTmq$dmF>25|+()JZa4HnKBECEL})MeVeiJCm-W5 zu?u44B%b|;)39fVYbFImx&5U&eQw$pKrxCE!s$xU-qyU!OBY7ZIyz6yj6bIGIKAF^ zzos|d-1?hNKn(&FQZ%y-2asHRm$m{ug2RJdHc`n)vh(k@L?a$*e47?J@i(^#uelYG zBkDw79OURaJ~ep8JN6(xHBPPbF360nxNdz`N%Z>oww(r<9_q8(qL>N2GYSeOSLguagZm}5~fy!efS!_^f%g#o_$g!}cJq=t?etw)6ueox%vA{B86A~=R)lC~JO z8s4xj*&Va9Z~AxC z>Mojmj+IO#aNfTt52{@wJ&wg=EBbD};S9+WfEoPV_yq<)qss3dOzUuu{;vjpOt4DN z8SL;=w=oi)l8*%KSC8Sv9Zr)+4NI>BPnuU5!ri>$P@97tW5C6hwrB>vi?l_1JyF-LzjaP) z=WH}c;zDzTb7;sH|J;TLArkuT#M+wpXfD+18?KRQ+?!`dHr!5|t@umDG`1Z!=L*Cg z6qE#n`G84A<--U+ZM{t4R}1E(2*8@VM^thFyN3z=f=m(*JP%{8x}Ae2kB1D19q`K0 z_t^i{`>|9KS458~D%(721C&JOCYKUdJ3=IRGTH(S8f_YDzpp?zKVzQhi+aQ}+qmcrKv0m)5b zltT7a)v&MJ`m$!z#!Dni`Dsgr7Pnz&2tp)lQK@80{|H54Pa;Yb#ICJk=03W$1E63E zgf#Vn09Ebr5b@8l#5p30Ak9ym#3H7C7NB}dVXgfZ;tlEc`QVgY4w5nTciMLWSXII@ z5<{~UbcQYau%RB0oMh5v{vg7UoIpa2w-`0yfbr{hXW5|IIgO$U+|x+nUqH%7EyGw{qor@#WU^{j|F%Kjd^=~mnx7R3tm;2WqMwF%w zmz9X^@^u!MNlJm=fC(+}LYHFTPjr_G+Bd=caL$!GS9ca5ffJn0dsa>@!J9KcaleoI zhj(2)3aCNG?z@Fv@Fvhwh-zC8A(nz?La!h@CRgc)g1IYmc&6twQUZ{?g6^)Y#o$jg zIc-zfo_MbIm+pHgb^!$@#z=L|7@g z6&S_F^rfGfdox zRt18ok;Jcr9B~i=>+kD2C~+cJ1>hAv1KoU)XcIM8Ub<5HZIdHhGY`lZV>V5@TZu2SVBp+ zSto}xGc`hak=^M)k2FjWLkKaUkX?ETe7Y<LQ1fIwuEeJnyoA%y^X=~_E(R&sYuyXuzXC%Rh#3idh;nJMu=Xv z1O4^qCE7n_Fx{#(ZgacBGh@)*P2GI`G*JDT3)z(kq>p;4i+B!kU*cd0?j3>&vt?vuKqtuQ+&-4|kYywOZcLbbc}UV8u~7{O zZFsgZ=Y6mpTzZ=)d1vU^1$rk6gK`gfyAvtMjzG{`@Za40cEr8mg}(PN>-(q>CHdpc zUa$CzcF-w{@Ex*O*>PerZ1Qj<-aI;3KTrnEkG8fZw!Ctwe3sZ=ARBPU+z%WmNXqAu zHhy>6*fFPHQwGoaFP*^AY<8&Zi?EJbA^X3dZP6AfKai#JV)#A zq1d#~V3%|{5v-&H`toktdy&Pz5gVs?nB`gfv_}M-MAY)tkgf-hrwSsYQxl^Bto5TJ zS$T}1&SH8|c9H*=c|}z?k=o&mi+Mu2_{z;xjDVC&c3D8Y=dYm~S4iCd{MAUK zKWn|@p?`lNl^an$%^asy%U=dpdu3?HM$#ay}?qZALl z9T?c?8^X_Cw)r1Q&+$Q4={xa|_&9T-h>dc!%)$-rz|!YVYd(MRxI|nd$W-C+#){rP zO41z7Ik~lg((GWg*CSG?&0}cgK(|_A&-dTD4B;KI4eG@?~_v@g<>YX_0Sti{bB?X57KOn651<5Wh+t;aoVMMByfOU+YnFx*MTI zhL_cW!>nsTffKmS+gGTC$bdeQFSb-f<_hwsNMuuk>B1;`-N>=f=WQ;e*uitm3Gz~& zby8BQWTlaz3dKi&F&uFJuNZJG82mr)R0y=^;Ezy_I;tXfW04{VepZXFT(1q7CGx3| zbz7}mb5p3idAv=sUMMN9NPqt3q4?enTzH9TUPdksX}?F)XW%%yNOJ1~3+|#GxH2#! zF{l8HXDm=!3({Jc-R&M{P5wd`7efKxhe@zsGc)5>_;hCfdw?B?me$+R^5XHxbL4u# zeK+18qvY@QA8?=TVG{FUTL1h7V%$-{m(4dqP%nfwukdkHUJt1nW=q(%5PO4()ap}t z6ycV?${GLl(kudhGK(k(^`x6Me&s7rZo1yuFNX6lVq2ZQ25oK8vuEZ#HqeR71EatE zCEn>VtIvQ)p+ia8fo$LeZ9kN54M&`->0%x9XCz-Y%?P;r zwE#@UOQ7qtZH(U5M!_Z)iv7rQAfdwMJaS@SVZvP@*OG(0OPnN+}2-m20~x}Ig2q{N8iiI!^^dHZJ5 z1&PWo06H{p z16*ge#R~d0rEZ_b#OgCFAe=WM6*?ZRx>}Cmt1O;HrwY{ykWeaOat{8Vt;dVKSS4%y z%VX|qX#U3!mtk=MqJ@V-FJ@z4S2B{!pB%07~M-0fVj0>^Xq&F^9QNP$BUJIOr~D zNk_z}Vd{(0SjME02i;SyeiI7ba6WKpHvHEWDl$D|CI~CLKDht zqTu$X{n4a?5}qXfzHG?bG{vY!8h0jS8+VRVS8U^ zk1TJ(IkLL<@|JJ7Sf{dVC!YlZ9*Tf^PV3U$a4Roq)e+!QB?D!46;{Qv6BXDACZtTn z4-%wx(o3_h2g-2yJ1;`dhTA!%ojon}nPIVC*N1#6se!w+pRENX+RO?Y+JCvBweF*F zDAU^_$tg6kmZ8Mw60Nl?BZXL}WUN^XJHv1tINscofNW4U$e}o;6k{^HX#{ zq7wqJX^4gec$vAevgSzF zq>zsnAg;alPf#J^#sfmahyPq|q_>6}<*Q7-9FD0mf=~b5|Dcv9sn*L_`-jSMTRxveA6izXo+E_Tz zoMxfAjnLF&XxmA!9~6`67RKi^XS(NJbUyL?n`XmOKzyZbrd086mhItgaIXO^@UOIq z7OAe3&lX&N)fgIUcbdfM)NoGGhNK6P4OX&0!@RxEWhl_~r0e;P4$NnTn75!(PcqUkJPbLq>C(vbxtk}}P9PIvOY~$% z0?h`>%UTB{C+x6ewn_G5*$5xNh4$`#7usPx(#B^yYkL)la%NIz!CDLwI>}FmC1NrF z01D(LY_R3;g)`}xcLV<)>xCgXtNOSk31J!E*5CJrN{RGV@`t-aSgK&(`}FZ8JLmNb z%TxI#YQ23i==j&ST-gb5lyU2@s|U>x9H?q*4?ZWLa%koc>d7* zc$Ju}?rh%*QIvhmd&ZNb6u8pR)<(hucj@jxM;g{0N{;T!!LgwljoqvoUN4 zsJxzx-;wC|@cbt9CwM%lIHr=zmJ>Xt*rw)-UZ%xfvZc0oNwXYP83due+*a0RjfTkS z8)uarEK)Y535-wzSY(p60M(w>lILym|JekY!Px>5g*mrGm8~U8+x2=%wLKog^8pMn zH*$E$ADT+;02&?6{o-pd_XU!E1*B9$;UzP<iI@$#{=SPU}w}@SV}@B>t;U|>WS|V zJ5|>jZR5-esURSv=^;i0HgHo!2;J&xypKS&R$GCR*6A~ZDd4wxSb3;X8yas{G?z0F zzzJp*aZrtcHd@qxl}U2=BPD`SI%BC}YQ6Y!zH<|%X`Ir+|}03Km%I0hn3ahV!0 z71YFA$RCj>e&pxN(lV*q$_MmI(d3pJ(x08N=gk#@z||5F2Q# zL>-R=C#>9tO-z|+08ev>>}=S-hzw0ajuUNl2^L+V2@)bo`p=@bQBmQ@MeKOOlUoGh=iEy& zOqv10hPmcB$?+>$$_v92VY)-YS9MMI!;@1))Sju3QXEI-*~RTrjMbxE)=6bz6&TRw zKL$gzj5muKI+gFh#Cj6O=EhfE(z!iTLV0D7+%i*3(6d;s5_PgfC_&?$lq_I8f);EjyW2CylTM zMfgv}m0=Er7;MbZhzS@Yj&qXQFjNF<|4}9zFhHvHM9fcf>8*I(D6nirI(S%@pZ$9K z-pP2R$|ip%D0|}Q&jNN@Qx(QNWZGXj<`mPD#L`p9vc*mu^E?01N`XXGk?UY{XL3BI z@TOiSASl%M;`Z3}SZ48pJfNK?JA|h7(8#lO#M#d715HkiS%fOI#SDMYx&PH6KLELsmW*gjAA@Z4a0pRu_bZPQLkx2U ztMxhvuHKbK?E6*O7ZvKBQ2I}j`s1~u7%z!-%NjQUCOcgnMA;B z8>ctk7mq zUl}(=6+nZL+Mq?FKjiA9RTWW3`8Z^0a5ddT{c!<0111xXO59;S2aBqB4ai)|g^3@bNhB>eX(1J}252+7rkB~{7^^#iS6=BLu!a>nXw zXp6prE0FU2rfT$L-34`8&aVIZ$R8rNeh~5y#jO-vs{OI(*M~QT?@F0VY$P~oF(4n6 zZD7yg*@GXaCvR^H$aVBvq zHYnDW0I?;83;^QSc6c3y>D#e6yb1s5t8+bXxw@1*de_Q4K@BH8#y1xMkqRo1J?LIN z4^BZWabz!x@bCEeV43z|gU;>jFY2sR+S+G#Nr|$d}*2yf{xKPCAWxFiPv4vrqF3^)fy_QaNw!B?9{yo zoMENe%K~+CUaSnL((*Uv>X$Xwj4cyflX@FwoadNvw*&6ZL<W6%v|e?L4LRElIu(oPG}yq%fh8(Je| zDfq6><&bL#Rws6U-lN=U;Mf4*hjy9Bw%Ym|-$uBZ7(;89Temw9BP z7$}+Jf!3AuBYUkoF56wXqiJ(yPz{*6hLHNW+V@zF#k*80dQ{q~cr7QGxd*$3OGrmd2 zJnYbxj6FV`;a^w+=7tEIKxk|)Lc7IKX5h}v#B4kvrFCfC@fN)8;eIQ9`ceH_uk?*^%K6$scHx!Gvq)kY)cp|g@Z}0NLx$2^Ai!CPM3-`2fX(Dk)H|VOIOjrkHS#TrO$gu>UZ;QU;7V8% z9LriYl1*d!hjJ){Hg$E!!sGjXt5+z64kKA{o0i1GNywNkPi$kcm4D7y@MZVg z#<@;6t#qp?r!+=QljY^sp;{BU4fsy%UG;)SrTF_Gonxo?EN7KPZ#t#j{yz$+%3rp6J4h(OqbDF75x-}~29n?90I>7P{_XiA?3Y|^ zZAN(D+vxJLFdcP&O0xUf{b(O51;f(^;n0OXIVx?imSW;(9`(a8$35>NyrzPXU$n9P z8eQRI@TQ5rsXpfxvoMYtbU5RT9fS#by)wTa&RPq6kZP{bMNaNxSLcX|XStCsLR?kS zpcTz{cQnFCh-yFDGj9XC)~)@NwJKoFE+icd@OE~y}HBo z>@q^l((7*Cay4e_@4p&b&}BOTPO~-_Bw$H6BbBA{TkLT&u9x4%fe3yusm9PX0;YYG z7)uK)j2F^q9RKr2$a7f^tOVFkXN_(R2Vgsn8>Pz_{i2U#w2Ep1IJscyVHt+ zcF901|3=Mkk+I?a<@cJ0cu3|631GGBA@pWIE>Jd^Q0G71%uIY6K%67axA^w$g(_Z#PY2)Z2!xFtuo<4h?=|YhGfURH-+$rrj8(rkVeWr1YGKd9%S}bVpbt_X1|}3aFuy9zd|*FK83AR zz=0#aUg@im;RC?KCp4G-ukX-<|CcHZdSeIt0&U7pj<2`?)1ALr0)XPDjW2zvEQFts zPh5rVv`jBeCzbGGDfL&YTsvKlz=IdQlA|cqhrw`iP&n|29US%O zTHV4gN|FeK;`!N?UQXM?V4{%;?l9Zc{+@7XzXF6;hmXxq2^o1MjU8ynNw@7*(6wTK z3{=I`yd|&dy*^MI4yG3h-p*ycNiK}4$cepFCvdx{1H_j6FWY}Bpavj{vIrxbNpK3K zI8Z>E-AUe*YDNZ$P+Oe$4=_PKl0$furZ~n7mCPrXe;6zzE{)!CqxS#beH2c%IS577 z2ecBQT-8w27%dm0V!f3*LwoKpcbQaKHSU6O<01YHP9^LvVF=byW(9?IzyEbl&%!+% zmqXyIb~CgKJ!6yKsHSlZ5c?BbvnVnYp} z%2Laa0_Lu=co8~cvl`ahhC7$cwUvWCLh^UB2<*NEYG!Rl4Si=+c2Rq>oXK> z4MgY2xNW&}#8ymj->(1vsJQQpLqrdIIlaekJi0rP`v zG%jyZ5+H58C8Mf_!bc-V5q!;(R<33jAJv%tSm^p7jFht4`H240AE+QTchct;j(MyX zs=m2V0N-!IB;Nzn>uF(@8nS&n{wyPWUWKOj`;FhBTAy|_MidFPm)rb8#UrNn0m02@ zZMA4_zFDfhbxy1B?L4m4P7s~U_wXiVG&#In!x`19&>ODuyoeoHU2cA;#2R@)9rbPw zmmo_ET?31V??r)4)4h6KE^=45#(sjg1Rm%gj0_uf(AVl5E_So-H%NiaA#)6_BSIIl={`^<5Cbl!*a zc6n{83cFu=L`s8%XQ*TQyQwDDIJF`agBic{Sc;fM$DXkJWX=4)Cq_w`<9!0VL~6F~ zy~&+$h(*i|)Wmh{@M1xH-25uIAY;5N95+A3AF{G$Mz+x*3@cfq1G#KuA(SQR%{@A; zdUqG9SRHW=LEOFdqy&1ybjnQ>KW}`+$0lTo(z{WHxWkZorM%%g?K^nc4V81>Z20!L zwZ2&$bcK7ef$$B+*l91Q5hDOxLo$YG^`ydVlYq!H zoNboxtJd{(1ZZ@jW$#c0fcZXiA4>E5C^c8Fx~rt8_=d$ow@JZ4>5pWb`D_Ilu6Ygg>!IG#miMj z{A2U@B3ctn7?F`{<<@NA-y9>OWNTWc39@U$;H5EUtP{>GBsOr1$ePbVCx``na$}DBIgh=&9md`-3#xKwn%pgK8hRVkK4I@6-2wpE^XBLtzk;&7gyXds#T1<}Oz)58IUM1;$sia9| z=wgaRy=SIT;=<3Tm?Xr0g1gCB9=lg&mrf@OtvFoHjo;Ok2;tp$C$@wZ+UN{ufx(kr zloD%XFy@D*Xpe672X&%I52ns0fFBkFp|6%04MdDRHk9D*?||$MbIpA&ri<3HY@|}p zq3|LiopOxjK;X1In?O-bZ$rYYlYB$P5`DEu_mQ|Ognu1CMWtX5#Jq$ARQPcHm*Epc z7J3QfUVWAiOLiC)JL39IXAc22m4W1TB;pS;rXpmijBt;DZ>e)VlAGu~C2O6&d=msR z*(gk>!TFcBf?d0_zH=L=E|l}yn*V%~X`(t)HT2Uky3tIbT2zTXLUCIw!J4c|Mf^Us zuO-0w!Ne6cYk64uyMy0TM~fH|Dyf3nQ!9r67H`mBgrX4tJZi9+lnBzSj>tU+%GB5v zX`HsFYx-lYS(C0kM`Ts$bI+lt|^i4Nzq>24I?EFyB^bxlm?Myi8s2|1s+tnEkB3#qDyk8LZp&t<>^P)gE^T3AKlPfAVGgN*~OneN`64uOwPZSeyoH!KL4c=ww~ zo)AGgQk>;2GR700|C4xNY~C)z!mW*6*X0aVql-vTGI>lJWYsRVmmx0Ym046YfTv}& zF3m@`?a<$KL9!ULZGhL!W^F+U#}-!#>yEn%vd$92Yh;suyZ#()7ML6IVz+K?vb=KY-EkydlMF}j z`FP1@%jD;AVZ&7sb*9D(no_?44G#?Acdbyf0Ww(oAG~SamPePjCJ9T4{l(;c|L)cP zgKF|(%WMQ3QZhT0-uw9u5_%bk%VyIiN=yK#ah}?Ig)Wg&Nl(({Q|DpAO!gJ7tV!#}gD!TUJ zF1o@s*9WCt@LI9duC}-N_7iA3n<}NY;b60&!W-7DFrYJyX5H0ck`7x6{ zt73m>@|#7^vuIJfAgqCZa(;?FI5fY}qjwJ^z72MT&hi1z9qe{%sG(z4gzxC>pK@Fn z;`aGZNL9`oI)B3m5~*d6ct3NTV2drRg`PGv8I&%VzL(mGsElw}oH;x8#qk`~AweXL zv^{|a?PW`$K!QIHnzLmm(>EJOK;J=UFO5{hDSqQG7n#sS5o7@H zK6jzBZMz&3VeKxKK_E@ABb|;6&kjNlCm_7 zrCvlRzgM8G@lusS zAj_6v0%LYgAwhVtSkS6adZ(v9dHEe)NG42By!PBnH?*9o=Z9Nf@?LHIb+JJpt>wezBz~e z=B$J+>(4v@-BH|e13n2~dWyAck?&j_X^laG2p{Tr3!(va zHuaGRNA}bsI<_cD*JL!2GKaPWQ6F~Ey~{(o#G2CkD1PFEuSaMz*rt17Z+!8w)TgSV zsBIL|6l929x$#qc-txHO+?3B!juN%aZ`74;;i&Im$6VdAAzjH}C(v=IP|n5pu8HRG z-Xf+asx4PjKlD1D(%1eTa0YsRho>s5>h>8oHERaE5DhEL$y>RDLGd`zDN&8Y2Qdw? zuEI43ZUTJ9{UqaxffZ{ydV!W2Yn(#WBZ;367hwu! znIi%HT>oHEGEjU|4m4sK@1xw{Fdv=xe-5sum9=`$v74eLi zk5qZn%$K9zr^e^{q3Ywjet*6<@3XV1Vk-be5ZQdNWd%5hVCZ|H%(K{>sE&CV%;New z^EHIhyS|bfiopC~X>$wtGus(yOx4stVs*Hi3KnC(HR^IQ#YL)=3t&d*&C7v{6Yx$F zN5O=4;01!^5Z!yDSdfO&+n{Rk%UJgDtJ$|)F}H!V%7PNW%qogW^$EP_65UL9m{LHr zP!d%D^AP_3sj@nHH9Dqwdj7?*dv&>IH!`X}K)i%uFt)^)_~&9yG$xC?yB+eskHURm z?A}tIw;5NaJU{8)|0G5$TwSLBMI>oiTD8EN+E@^b&jgI;eM#|*>Lna(t2E(FmzF7b z+Q&vc;l3t8f|@In5Pgti=Uyh_y!s+#m+Z*hrRtRJH8zrcfx+Da;fc(Y4*3URp`1W8 zVEB{P9ch!*XScGe#D5Xbc=?X8;1e~fBPNN}>V=g}D%$Q4c0@w=b-j@64O=dAy3X|{vm734NGQ&|(Ri_uTd zSpZq$hJa}HYI@^jwMuDBY0N=48~E$VC&LssrU1k5f{IOjRSJHqV6c0uHu`z3VXpS4 zaz6#arxlNQzN8KhjRx@fri{7!$wxsa1BF)oK-OJdZ-290RB)R&K*o#_O)U07}WK)?0WLVJ}enQ0E@2e&BpG3BIO=I@MP;;IiVBMZHIW zr;{IdJcC1G&P(wnEulrQ$|k$GuLI-&$HWl}7w`-q9tjJz_{-Vz*}xR2EaLm^O4!-gPw{t9t7qxFd_Itb!mlCX)N!mm z%L3%32cI*Ru0gb2)1F6}muODXg>vfi>5LNzP@6jRZ=J)IX2lSNV=}vJ5WZq})f^+C zKR<`MDqsXLyh^Cfj2kX~O{Qu0*BEnSk%I;jytrdR4Z3t#JJuE#4KQ`+f};;g1_9*e zh%xBlq_cJ^(ZNL&({<~fmF&mSlC)VyS)h*05NWu15dW=B;{=7Xy{fAQ?o=}=nlxky ze`l+IFt@tdj&AdEN3s;U8>&J?N^b5s4kRow6il@GyJ%Bxc#BJn7lU535$+Sl{ zf1Hmq_H=p);0=$=mIhP0!{Ej^vIrr5ohI+(yDymdu+54x!L2ZSKnlEd`B+uS{n$<-^S(pei-(kvkQj!S<$W+7vckI@Uu_mEik)lbng*HF)b9Y4&=G3JQ-6uW_Pa^e_~`@eCb2! z5y6n|1;?xk1=F56*Tk0cd~{bmxpo5m*LtxIW&pXn9_XygYHUCSg0`xk`Bn04*Y{|_ zuVpRQB6h(l+<+Bwtn#>UE%#Xl&%!`De>Z6HZ4#Xdq?{Z)DivX8_Q}R`JU>QEM;{ zN(Yn_=l0i5eud?G>Jr5#0O+YTAf;#Eou+T2US0JsbSpgYg;^xR&Siv!opS@ zr`bJY7Lp!eiZztM34#-@BR0ElnzOq;U9?#d6&R~|hpi%W1j8JKaDox6$X>}zhH`0F ztcBt94vRWrv}UU-Gr!KZwC)gY+Q4D}dj?J(l4k(cLRnE_Dqd8(bP7qb18OfW8~uKzmQh zSF$h>yG5v(5adtxTTQfX)a~6&qPR+^iuJrPR!qKkq^f!C?mBV6^iSafK8bF+$PoPV zw2P+0Ko(a9kk$@L1LT05w2P*&&r8|ItJCLB@#h>U+7W_9rL=5i*!|Kzk(WV~hw!!H zXHKXX+1;3)^(hLf#~=^QOnca)?E9A!2Hw2O#&9UGrP>0S4owDrKSuri5bZSMSu)$_ zFn?`^v9nV%K^I?d{>WPqj8?PE=fPYo9UcdDzsg0w!F->)GO+z7r8=<+GmsEgRAkCs zGG2Oehv+_1sj~z6w|>2`TPpWMU00)%%E4LTErkA;?f|&PA`^p#DmaV?_$V{q=DpOP zJtm}yh1i_(T2uO%+)ZNbJ1LEET@D&7JYCDO{)^MhGB~K@sfvEK221=# zV2Fcso>E?qKbdgcsMg}{*IvaImQ{yB{+rpxDieHRzG^3RV=9Wsf=ZP^NYI@_;}NzG zf0vsx2wo@v?>(J9n00{UbQGWdYJ|-MWGx$7SIj~(Ss+)8t%6jpEOh(eEzGJEhGuZg z@{j@ua`if?6l;Lzyc%65$P=4&s@@t4kCpAa_NZWYSaZOgOWi-AmC>lS2kWI1f!A$H zspz3)@l!EXhIHv+dON;GcdR~P?ejw}4Rxdr)b;UB)xGq*TZK29`p zx8HL~pB-jm%(FT#Hxt<&!Q$(mWi0DoY$F@VYCNPPbX2z+l@pQL41FO^MX~Pa!-Odt zEG!|J1cXXtBt{f79771z!!$LIXkhBr0JR2S5?l#5L3MDWKUo43I-S~5D~G!0w(#X! zBfA^6N|QnOu=0IXPP*nK7K;32rt1R(r-B%S-phR#r#C{iy8W9)*+47{ptP~u%~FEh zGiN2_o#r9WM5Gy+MfZ`CTZ_mA5bXc%n}t6f3XqVULyKS$zagFapWhTdu$x*Q%#Hkd z_Mko9HC@{WX^f>r04WO1x_v8kjPc^Eh2d^)MxVKhCVM^v2NS*$G@Hog@y4Ol?VE#7 z_TgNI>T&nh6@t+X;}<~|Q4u-7jPJgWC(3-}z^7$>c(+W-m9!g@3E@ryxmOUbELE2! zF~nY=Efo+3Xmt|H(vx+D!xZ~v@~?g7HiGRyE|_#ossXiyW~?qI#R~>r{cg^TOycG= zy(94*C^tx`5YwwU?fRsSU&)-`kD=F=RoL-l-m|Y$EVZ74;3*RoE;ZKxebYA{iYrB` zO|;LxB4!or&H>CJD^%Qh$9LZyMoo+>1J6#^B;QEB@uc+x`bbeN!6ADF8$Aj_mT#t6 z8Q`YkWj#Y+@MWsTh`2DR!rpd7`q?bChbGM`0kQdNqL?d<#mx!WBYD5Avv{Op-W!FI zCetxu5+?-A-%IW*2DG9nd$h7E39Rtc+E7rP>z(kyHxjbFBuqMIPNMZ-nUHv?5erUv(N?88^{89pR){zF3)R_EY{VIo{wyWfH#pfbql!s?DLZ%hDkfHt( zQIhk*GOM}wj&Uc!p~GD>6@O`5f#K)6EGU$ON&CTxA@#}OuUF?Y*{>pz_Gdi(W*zbHpwrhu~(a`k&A5`5yxc7xmYIrk;Uyp4Jj=%x@ z3o`_Aq5iiqun>Eg;GW3nSg@{H&8Vg|L$v`;cbuU){xS2opYl{7ZENuO@L;1)a!5^;}0 zFjCe7WekSF#TX-lCLD)*%xix?qL~Ff10SZDU?PfR@VIObuHgfek8Zl6VDq=;)Xfc> zcs=_yg4lN_xNs*@N89Sf&bXDw&r9AOR5*gx((iQnba+Hqwuik)>&5g0&TW-#<42)) zDhAM@^odsfR$%--1p@?pBV}!WIi2BIEgCacMu>X!hKt=!MD*6Pf8T?E#N6H@E(y0t z@iRiBQP~L*+mpI2XJ+w`xVfsS_^hS4S8L!!cm6QYQ+T=%L}lzFfR$`YTlR>{+;~=p zoO*yU&Y+#=2ATEidavB``WkEwUhvCMl|pQsllx}JaC_Ad0KNR>B#Ks$MlJ6| z17}6D2TO$~CT2*Cn2zz-r3v7;%hL{YGSwlTx zCt8=#EN@fnJ>Q;19{$rW|Nc0ewxO3SiXw;VHS&+G^uNH~^zn!eoSI&t+551c%Z@EZRP_G7Ub!Q0wp!U~C)!~7Ke`F!naZVlf+5K&U4)LYl8!1ikQT|#>VXgfzu7!o2aZTfj$19euL0BR8`H)OVB1Od zNy>z)H9i+L;mjiVYqvkKcQSs(VN8rZC*&_ku=a--*%kFAKtmpD;(LFz-H7m_ zj5PeaGE66_+G7aDeMhJ5l-@%UH^S;wGc*0NPweGGlOHZSOm#fMqlu0kukT{@@A|jY z%|ka?>F*Cz?4@v;%#+P9in?omX|2J@iY}`^zIraVr6|+XR*r}iZp___%6}Ebz7&E| zK)tDLiC<%+BoeQ=3nQ~_5)L3_Kg_r{A>DeN+AIm7V5P0b63Q zZ&Dh}2R4KMj^O7pdx5h}Ci}$%$Fd(iQ%Ip?d1^ZyH{G8{Jnmpok4n{^0LfD> zs1voA`5w83W@H{WOz%e1MZ|gc zQ=%xR(BfqtZx48XmPM@di0G=aHpf$1MXt88Uh5clVtv~uq+?j!N|j0NaCQ2jwW`t_ zWmyFST?~okWXA4C0bgi;IBvL|R^(|A37SYzWs6vpUl_M$icgZUsiJi|OCr(*$xC^+ z$=fjI@lj2R$z9wN98LVId&+pj|Y|xiW36o2+Brl5`B`V|O zJ{!Vlly!{Mk>UlGAo+|5$CCSMo=*REuBm9=H#x=by+6Kr-DA4~3%d&MZ)F)UVLpR) z`YL6xbKu=R%4(UNgO-;b1NVe_F)qX)eoI+({)_XY#+v&vsA4qg* z>dF;gS!=<+IAMDn<+He48DTQIdBjJzmy9sg9~>D2D5{ws-xoMQ)z$dCRw3=Sq~OMR zBlh%XF+W$sF6aEg_*P03CzvTQmeCAs@JXk%FGoQu;KaHBCRWgsO$h0>gh~b%Le{up?oa@Q-v0Kg6odIT+p zQ?$>M%5l}o|DPeC35ljZLaBE_d^au8@2FJH7&J`Uu>@UN_Tur+Ym<1eBe9f~54I?b z4_>n4qNh{iZggRv)zl>ZN2FiU)@GIdVi`qil3x28>XC8t`}u6Fef%g=so+-nYLABDW>ijgf3wX- zL=1etXNp!VC9a26+rO(&->nLiB@cOO%x=jdILJ_ud^}UgK5kCtX)mB}L0d`zZkM}!vHu;N zWjL1* zozHWST2)U0J<>}|?0Im&wCH&of-MxQIZT5Q<_VzgFUM0iXIwx?O(>k!xZ++C4H1*# z-f+{M+qgLH@o_qi zV!&DCzfjuBFujrxH^oGsob38(^9A#`X;OiF!4xi+o`AgF8iI|Y%S>d+18jqE*aAKr zz^?68%qRYB6&PI+=0EOtO;T(W+!daNLH_7s_WVcRDl)1KPv50F(z7p)Z$yX> zoM1s7a>@nskb#<;Zr$dJgzhAlI_nNDh%*r)Ll~d|&1QC;T|6&kPGB+9M4DoV*n3G% z5e6P;6(hmdzCWow+GUF5kN`lWDK;w2K#O!gO#Q#TB37Q+-Nnltc^G5biB+1_{vdN& z+J=wT{Y4FdqAHl6u64LAH<@%1=nLVW9FT)dSQ82euj|2%4DRCQ z-wR7y;>rli<=K4(LP=33n$e9J>TchsYmgBXm|I7+DO6`ULhsqH(|6WgElZChN5xye32XL=gtOLkMgDAja zG$G8tN)MP5Bg~ypC8jdfMzz{*&Dx1)_+OVhK>j953%Q5&LAW;5h||pTjeLtx&_H4|q1K#&zhX+J zPmxxdx5evLyi-tcn?t)M(8o{kAez5Z%)8j{Aq*qpE z5f23V=U@5~iSjP!{u7snvg0|7n`iaYJ<9%NrBj@_{2ads$%e=uF4H3`Sj;<`C32wA zfgj5vt408HqA{FRG#T9e0ul`?gUuc^h&#qTJ-Fw{(L^{(i)c?cD!MThYl&YCr*bcWkaF z#zmRQe#|7&Q&n#pU*L{qp9$dUR<0+3M44AE59QMX%Ao|z_saMx&8=Ou|U_L0k= zWWWPScolTG{H+kcJu6y@pTBkI-vw?t2{pGVR5aSVSMfME($JoHUT#vXEE%==MgxoL zPV(V-3!1Ljl8A3Rw?D#(+Cv^yUn>~{xZ46YmlSauh! zK9n}^0_CgT?u!?}qA`q2Uw9wkCkqnH%_QmcHdV*gezN}pN?|YZx0ZDxrX*&T{F#Nj zqPd2gG4&U7z<&?-g~?$&ASYku8iB-E1n=3DkYnORH6VMtHTxtfMIkVE-7fNipw#@2 zm-oxYC5KsTqkKMa>+(@lK}dFs;HbCBMTl?C9)Ft?fl#F7aKJx@z;Dx;7P^WacO1Ar zDN8G1-`)iLv(UwC47Gs`MCEM4YcYb)2o?L>CGcjcFNagsk@c_;tP(`AxEZ09st~x^ z=UZPqOYk!bmZ9EgQ-{i&n_Tc3UpnDIiwK0W7P@)b&I3TQPJRT~NlQva8?hpw${~`P zy~u@kH4CUVW>Mh#5xV*NIugls5PIFb6D){c2W60b)EFgYUXMf05K4(LdIiuKY=Q(w zVzs7;XZKaFy_0nZn2#O>nFMg8TVWmJ{2t!~L@7l3^H>3KKxq*OYou&5aby2G-X4FUet?C|OcGwwfY0Nq$>GekQ7TK9iJ0=T4Ei zHgt<*r-Uo~IM1dhjqAWdLfUZXGjVzsDj=1rR5MinZ)jpHhX_XU*7o8zN0QB6p@%z| z@l#f`yq|68o^cu!^`Rrqv|c^@}j1$X9Quh)c^WFojV zCldDT0blb{V=TAXdq<))b?t~#H($Mv_O+#eFZgO7l(X{JKbcCnD=Voa+sDV|=*=FM;s1RoV=AX+}|C@RJ*?(v63V${Q$mE%pp_v`oB{Hz)VSz^El{1YrP6NXE zc^JsZQ*zrDAHT&~a?I#DJG|!y_7ZNzTi0_#gxOz3XJ+`*-HolurnqqnX3*iopLH_z zL?jdLlc6`r6=hS9?=9Oh;zTO7>Ia{C{9~f$plG9`R}#m_F<87|AZTwQ#8M2@Z1$Av z)P=L7eoS!H2f*Q0dfG^#k-;=cXFgc%&0zd~Tm<}p3A|g^kLx=ZL7O4OKkS$iU$<$gdxr^kIAT1XLQ`AY(B6FjzNW5ES|`IOLKvR*_$+G zR~U{*xnh2O?N?9&Ra?@!qqc;=ylUgD5TpCh5z($M?J#yK9JCneP*2_=A{J@D)Tya z9c!?2e_xXHd5PeR_eqA?Md9k7%fnGZcZ7o4hO$rI_CPRhdoqD|1_76KehjkRFq**z~m_SxC&RIfy^Bk%UdiM+=-ttYNrL zZcC&mRVVtcke8jJzn-{d90M|dgF;iemo?s{cX%4Ut+B@4ib}_0s?gjFsos75Xj#-} zf!_$&INa@Ggc4?)@!HM0xbv+ z&rOnKcD?sjr|flhTME%&sZNfUzxn($UBqq{$Z3-Po7_{u7; zFz+0K!;#Eg?Mi5j0nb%ogC~yTROk4SRh|{tvd)|5q$}z3%*izzdMx^(*gp{ERGUCWB~vZTI_~wkxaufS(h*X}JouOX;E} z_!M~;msL&{<77j9_6s1Rc170yGglyZ-lMh^)@Wx;+ao_q^9@2}KP5(A^sGwLqwYQt z*VzExiwh+Bog4Z9V)|ytqs(z*t@#kA`ib#1Eh<`nJDlSh#_4=v@*D8lkk_luMtt2OC{7R zpP!|#9S=yl{w15=K_?j!&iMo&Q&`hp*kiMAEdOZP=F`7q|H?HV@pCn%hW{en`ZtT# zP^IiGl-Qsh0Q-AnsO>o^?Zd7stZxc}wRg&uO;f(YK#f^dmy5lcHe5g!LI=R*&do3h z3`)CgTnMn*kuB76ezu|D7?ubI{gVr#W*0r*;bK(``i!X|DXHyEfsN9{N@vJTe+*ed zx;a=UNMW=(kM}`g1oOy24fM=YCCUyR$d3&CI!^}%?Rgi+r^dO>pUhVf6e^2kb)+JE^wuZTLHi;`nErG0!0@gn$NJ#JtM zvZnEHm4y5ul!6>1Bk7DuFDg~4;D#kk*%cpLv=uvevDBlK@W}4-OBT=4Pi-S!`cd3^ z{35{3wer36xK1#&@YU$4r+k=A&l)sbYpTtNE|mGJ#Hgjg+w%kfJ@b7lt&HrmZc)#b z1DQd2kkLViK<*u9rM+Q(N)z`&gqD9D9V7h8CUco};q>uZ#O5E(|Hb(-2spO(M&JfR z7R`$I@Ze)D%{FHKT$WeeSuL|scBX3MW)i{4$>FMibFkrAiFQ08ae#q43}&Z9>lK{e zLcG%J;QG4!EtIh(Zyl{1kThlD!2o;LySAZ?*+~wqdB?+kH-ROp+)qJcLhN?>2I8hy z%1P}5jXIWr1=?x@nJct}@!wgRI&=zmut57?@o|!dTU>h*1~f>>v~ODO*akU?Aw0bL zxME+@qc18KD!ThzL5VRWqA&>%L{O@HayLDG71f zC?;;y(WV{%^xgMd+dV(o@|TGaS0A|$oN$o_1vO3zi`_!LL>uCTw^>bzyp{Mox(Jd{ zc^(z4@tbi9f>tHG0Bh)K$pR>(h}sF;+dV6Dlr_&pR$R$->%2`Pi{w77kPXAl7rn?p z2RC?boZU4S5BDAb9r{Nighy!O*V@wJ8Ma6e`jOm=fKlSlU&)9kaxm+~r9k?E<53*Y z&+!Nd?4a8P_at*G9f&O%kzxJt(d;*`N9~gZc|sH_IVt11<-}bbZVjJXN!NZo;fSAa zfL2cqh84vA4|D*wwtD}(ExLyH2$M!WaD4%*@GjWT{6F9~0bMJ3c>=l5FPI1oVSdkI zi=e`MF%vfT>EZuMvwFv%bwV&YtlOe?1xnq#=SAP_J{m1F;ObakCT{5jhO)-5A( zLOMJQpMA#rl%dg(JVMap#=qcT>ccMR@$Nq**BgS##a=7A&{ImOmY0iCD=A)TP_t89 z%R8MvPv#1sO@{g7p;|-B(b+KhmoVvZR*x%_KhoI09bi+99w-(>FyVgblQ49yAk4hd z{%nKZr6;~N58rp_PYBs4NscE&NegKt3UrUvb)syBN9UdzHASk?t^BoSq?$Pn-1Y2D zq6MnB9JFClMy+QSxK&cpeY0#k7#GoV7WRkonzfJ7@>;&512DxO_A)0CX0YyYrS^C` z-9->zrK&4mXagA|@JN)lVzk?iRSKeetmt_C#_Ixjttxsb-Tm!c-6%gVOq}RQC)mKZ z4l2_ZR1sq3{M0S;ob4phYtlyxL-eEQB;w4%gG`#k*#zR{V!k+D6-4ZPFb$>1rRf1+)l zEJ%D?p#n{a6;A{Pk-L1*qR@~yPh&zchJ*99PgtRiWJo+;`#92&CISwyP zJtFW^I-DQy+NbAgA=)pdvoQ?j+VJ=I=LYWA%51*3>4D4y>9gD`637woOtFa9T1uNk zq(c?1&+bR}SziHg9B>9xvNyLUQxuUTkULIe(zr>=7!>eFpsQk6BOFY*i-4GJFMCOY z$nQntVE7ldA#cyMXChfoBQmRP_S;d#PKzd7*Dx07IWOpaZPjQbnKT{3qqLX>_*fvX zBj`kh1%UIA5^XA^_T^K|M~~19jrtvw))XgeP<9>~;hdVJh1HPy8q~ve@9&~*_~Y(( zQuB}h;)MvRxZUgv6ed%5Udr)KY$A2+)2Iw{?kb*pn)rQ<`8x;q=f?Rt9Ty}{P8BjF z2-8b>ywXW0K(&RZW>YoM$jl@uYX17RR=gUq0FQmJYkNa*C_7bOM2?rO`_LU<_O!S; zTC+*In?z325J+VS_kvy`Sk3JkwK<$@gFV1?u57<~0Kh{>p9nKxL14&1MF0f7p{JuK zJS|zxaR=26ob_sBDTC@Lry4rMdTQJaB>l-Wek*nq_I(XowGWX-lFtCe$-77@qalhb zs|e+wKebqvZ0h(1S(g@jRq$9dCX3A8kY3PauYu0GLW$xx0_>-h@nD)3F^H617+t{c zCF?n@KziaX*>t^51`7aG>B;|eBkLQ4zw+-fWym%^79!Aevx>~()6PsJTMyV1A{CD0 zGyIOnsNG$#Fs~(zb0$H??eq}AN`l^*Gy`War7xg*c=5qXD5_cZ&mVu%i$BtdOAioT zdyA+N2E$=OO}WqGUcD2B7?I@#Pd@YI_iGWHG>GGxK^p{N!3vCk6B9yu^9M;DWTzjn z3Zi+KoHwzzu>$YHJ*bT~w_3=N739kpDy49t8D5&SNVoRP+5`>8ju(uHS8+PYHvoTI zA=!f9xL(KlFO*SyH4t;0n^e@M()`2IKB^rdzOW(?f~;Fs)BRX*ic#DxsF&v!bG`o_0CV9yV){mP zZV2qwW3wwL2ck{2^KioK-oG!gcdcC27HlW2P~3P(S!4skN!&l73(OCa1&)48U`P** zwxdwC@Dk9uZ;A(N?90}`tw?0h(=h$61-xm0V8Zq-kJA`&WPoC?(qkwiu?%Kb%skdgzRVE|Xl0bjBU;y&Uhio>$a4^E7(b3G{5Rx;J1TZ|#lMxGVZaW>v`JvlCYRv(L2`myZb8V?V)L%|Odn0s8XoMzPn5b6)OFGPGkdmMTwU;V))8& zpF2KA(fK-Q&cW-;xID@Ox16PM#E{nvXy!^*?WJ+N0OiuIyUTB#@oEY>ap~%A{5j9g z4|BgVWYI%EB|U6hMH2Gd3AbKgXc)P!qltyDaj8TQ&8R%jr~H#4g`Y{xRylTEmdh7NV9Xz~3=_VR9yp%?E;dWUM%peo z9+C5e&aWej^dKTkZl1Qh;lrZyRYNL#p;9mTCuO5IqUZ;8M>4ZVXYX|*4Kz*&(pImztQ0%1#I%Xk--Pe^(|=AbsjrlRv!n?U zSCU&cNMK6DF*vogU7<1foHG`vAaYwqd%d+39#^8>km_5fK$#W-fJ6`i@9SYW&PY#+ zu}|KP>&&jX3f3H#8jt$+VBO5M1$F$UN4cDst4~L~HTMCS-Z~$&I?nSd1ISlvI*ej) zWVwKW!dJHO*t47$^u~mmj=H81i&shK{-l*m(w&?~I&`%+DBI_UuW9K;Gg1SGQS>}! z)Dg58bze$2_;@JRFs@+A3^+F03{vz%xT#H<%HEH*-}7k$D72ofen|XicSp3`C#AoG zE}mcoa|}C(!`mxcDhy&pu^-|qF}{Lxh%T-Wt(GHdwxhh3#3*9v^xjH*bTk>A$>c$$ z+d>3!*qQ3US+bYtz8l^=-%^r^FbCr^T06%NmdXO!jwP;)bKxSBi6C7 z2Up42+=|*~7(a>(d}51xdxh1%bhf+-Fq2bJ_JM4}<9JbyGQsUm%@u>oabp}EISA5_ z2z7xmwi$nRRil$bStVzsq?}!1MDj6^_P+`=Y=_<1yAPVq=CPhgjT!*$DGtJMD)0Tm zCeQ;MvBGE#y6n%@7;j*5Xs<%-@H^d#Nl2OrS{I$|;rP?c4|ef!K-cv;-zoCOOm?Th zpm#Uu1GG@<+0By~KQF2x;ob3}dw;JbOUQGbE_00W3%uEc~#(LGOkw`6(q<9RD35h(~t)LySmp>*vC(d?6rk2W{COMCY=7>h= zKf0zah z9V|mn1(_0}$)5XD-Obe&V}mog{NLCYQMVCxZl2bMMy#UF;(K4Gx(x;#O}cs`K{f(h&j6~Z z-UteatHk-Wv*gC?#(d-uwdwIb%l|uK@q+502d&xbcQ2GTEq^WKphN;ymmk^r7=5N( z&xTW$*+p>qN7EVcv#n}!x@mMFosHr-oEXAY)IoEIz&jb6@tn!0FPzFP6uh37u33<0 zJr>=-!s8Rers0U)enPw9|M{tGM26NlIfa>JmRR=-PNZ#dTl%AO(?XZ`!mA$iA^*5W z+}}#0s$y{8sTMjMd@B(wpNn@}AvKetY*Er6!{MxrJtaX0sD&TE4_Z;eSdbt^w;%9u z8_FV!JZWHbf2-ERMHv)kSd7y;sf5yjgDw+wpcYuVKfrXV*=Bqid1!@DzEXg=i_3mZ+qfga(E_=k&RFvo|=NSi=>*cmyCKe45wM2D+X0lpAQQbuG&bWKS=B32z?1z~AUku4$ z_9aWoT|LyiOt)a{TF;mz|2=s!3b;|{L_O?rMovs7iu|?@cf~l%ylM}+(Rl)P@$*9> z{62?sbj6&!+8u~Qyp8WuR9;5DBix2t#z7oTbrSVsdMDh2!n&FbgOI zZ+>|Y!u_VuvDhnC`mHakTgkDI7w}GRJ4-*1R|U@B3~un~v`A!2zBD`cfU?M3uy3Q_Qya3@yw# z=HI-s_(QCX%TgoDVGZL_9q(-1QOA~jw$P9EyzWXw(&k0{)T`~`Az;xCwV!M4_3)GF zlu%YYSxks<$l%w-GS&(lry3dU+6M<*iI2{exTH8qN7OuU@*!2?A=VJ#3Cp13 zl`PaUrpz5zKx>J*c~N`16k6xugALab8je@u`OkfjA^_I=fywBAWe}_~P(TpTS;(2T3YVcs0|5E>ysWD#qP#I$H_oA`6V2?RYZ6FImQy}# z#(<6CDb_?9G}b|&z`Wnn4IHS7FPirQKMRq`x7{>#`u>&hI`TK+eQll0(%mZse=x5E z!V(QP%6=$syZD^G`8Dn_94`=Cy;zX2dW0Ah_LqMUQEdDygS6OuNY_2_rb&22Jxg}% zdh+V)NRQz4OL~8}p5{Om-QYt=PPP6)@NaYRJs5vRR_Y11z_O7n#T^tb3j2S zdo@|nEwTP`FKCVHTnB-`WPJ|T7u5axIIM&5FY14ht6D;5+sdC>1#eM8-F0MwLzvjoN}W7C9(Q#HuBcYNB#9mKpd$43JA^E)BqVvH4)cH74tr`!s_C`-0} z7WbAk4+~T8`^1tqP$*$hQ15>wsd=2R-rn!H`lxpfo;0;~!PDhpnuLG8*y+|S-Z zrEL59C`gIYDUwVN8j?sZQdfxe>)hLhaCSBR6cHZ>lxS!{BDA({b!!Hv@uziRtplJR z>-72u;)c-b_>3V$J%y%Id?e+Y{DA&}V9A#PuwOSMg$2Htf@2q;)=AFIiOzYOI>+Z72 zy$qMAvZd0XF8CgZ=tB=JtbW#jF0Zc^?51tB@W=)urH%&EQMvJ#89kqYf7aSDI1up{ zu?Ss`fvm)QEny$oCXD$0pPHv6J5d64-kNP0X2mRtbkKFaZ=>47xagMxcDk=DVT&xG=L9fye`sv2IybJ=!_4 z$!whv>(`cRg-6F5H(|=9u)4PXMctEz!?N}W+l6NM&wb7x;O~dN=l3!&CnbLm{l<+T zurqX`c>SIXZF8Da-b_~wA!09uvjH`2d3lB_lGIq_7U zhRmZm>ivITlDmlRIST0p=&DF=;oYW0hFZS8ZKc3?qnrk}Sf#DHqH3rmaiE~okyCyI9^e9#wmPRU1kyQlkJ zGNesA4a`q_qST(z_5Glj8GMQHc^2L1}#^yvr&y*2d#0(5tGaB4%m?RFYBXBr>eJ6ZRAnnJs zl{M?**1#9(vcRtiG8a$u!P=<+$Y-45S4AtfxI)v;1-WhzvI8do=+H7OR?1Ra>+*l0 z?smq$sV6(byrV#_AQH3-i{54TKPiSkW+Be7G@GpbTWLFk@9D zDJYylHfwvCagVY=Kh--7!f^efkua3)L}e*=P499nue6LEBeWinU}b16?7ihYKJ9;caGVV^4<#p5-@z0jc%@7^F6Q@>I@J zlcVt}Q_PV2WUt}FyG?Mb+KJH+K8wEKGw5W%n!i%#9Va8XB?&H7;%~J~k*u-u>gc$K ziTKA&H<-n!VAb#qrR*zD5q5n=k_ZNzX0NbCL91{bBq12Zvn9e+ivlcugFFH*cNGU< zb@Wxh0Sz#9)+o4j^bKI+%KZ$ypmM$z@F=od7WY(qa`_2xGi1HHop?2`4Svn9<`x7=1Dt=1p^`o& zh1RR6sP%9#9>>lroa~AyI@r+RMnzlq-l+gp|7eDa1k6W}Bddq4vag!KQtU=Jv zfef|T})-tjrU=7oJW`)nlF#TPL|uOrvN;t%4d8mm&0vQ zU6U)gov1Nzl>YJI@{9=@wF++QTHEhq;*A)@RVd5$Z1lV1qRUK;?&dfI*o1!Ow(bGq z9L=_b(FwM+myd_0xoo5R{z#CH3WmtAe2{NWZ$XSDiwY2r5$cwI89%pz>+W6INS)v6 ztDuXY0*&Qn7)_r4FQVC|s{oFyR!q%^*4ZuNZyl?knl|g#l#EVClyWTDv|gU%{9ATO+S!;sKjo+l)QoQelhlul|%4 zZE3k>71h9`0hzg_6}FK}e1McwDPFIlnJDCtMp>N4ElX@Joc3bQuzG=|LG?4HTKa3DhYOC%W4o5?*V)kq zg_E)zTZF3;-CCR2g$iCgJ3>(8p(i&ws2Osb*%Tex?cC%g&KemZ#_o?Pl~qN<4YWvr zGOdC$F1T0syA3=43XD=iEl}GZfCG=TH%VHEwQR2E*vLwOxC0r?4TtG{qp+^VfEmU` zlk$t9B23R8&(hFE=LrfNm&E!#v0fb;W~>>H_x)jO5C1dYo&HfM`&>7^OlTNQ#a|ssv{p`rB`Hj=4%v! z6XmNj>0!C~;ys*fd!?N2e zQ3}wtHpNw`Fnfhwz@{3nRng;MdQ0fm`d3`zsJ+3>w5gvZK*4l~za9GtXAkfK{AM;N z)E&Lt5olp%%TJ_F`eOUxuD5lEkAJ0o-1~wweSxw59n8Yx9-p;Wk4em}R>w;%hc+o0 z>t)If^!1`jYaOh4tHw1t20M#Z^SaH(Ed-6SH3osdy!b%4ZapqjzE}P{_vk-BWo@PC zlbI2u$S7MHSl<)jXcFd59 z%XX}+2ou6D6@mQ~!uf3}NW3&7gAF~CV?>L*YccuzeY#1Icwvt^bZn}1&CkDG$O$sN z%&!~H_u0OCBcB-n)>aKcmd7+C|10tfBW~4_<@y-LGYR4`enK45xkk;5&D$SDkx+^o+0m8)j!GX!ksTfd zTx1-!sqn<#P#tBDs{7JxMec9Go9b!YEG4@?D~8%Y1OekqWAJ(zPzGMjlKQR<)u<9o z%=3i0D@VbIg$_tQbuWUoRo>FJGV>uUJc)bD0ATuNX0}1-yUjRLc6;5aI7EcRTxPtg z3Z_o0rCsWJ3y9P)5VV*yGVxl44>U97qVdgX4TBJ?M4IORPrYGU?VoGG){8z4A0nye z1#~TYIrBmhH{`F*TiD)7#Y0pKG7ARmWGq>qFo zwpb$bBDS4gjp<6OmK~*%UbF)e(EAQGy}Dg!T5{f6rG*{djN3=G} zJKer+{dMThcZ=-V`BYo6-Ltfk?8Z{p&7r{IhiB;2N8Y!Tjm?I;$D%zh@?k0$uxgQ6Rh|vFygPvqo#0K)pBYvl53?4?3E35jMR5lweq=HDfB6l z&-hb6$oUG2*1h|cWvmq0=H#)`dZLbhe!Adu-~Ii_1gIj;+ckuXUO$=>7lk1~4BbO+ zU*H+XtA8Pm&67SI9RhZ|`y3Am9=i% zTRm6&8gz6dUlEGEPV=9n|9O<_ijKcL;hp+iv!4FOuicIwA}*vrg*%u zIjE3Sk!A5DD?aqVkicO$5k{ZX!cBlyZ`zw|JWgzrS#5wEq_1Wyz-PMkGC2crSBIO7 z8PUO-@q(cYV!r2Hc0qS@RW$ObDQ2E>(GbZ(OR!BH9q`+q#4d^h@L_elVr_JvG2wm? z`ivU_!H_^@ngXDM!ntrSSVsjC`!m8UQ%x~sOJypW11nC(lO&BB;(`H6NOd+nV{MBV zLik2=Z(7A5PLm3n5R#6Jr-(R9&L1&l-<|C_5VkZ|0uk0S8YXmXNCrE% z1w7KjZ5vX|4(Tl_6B=eu#tE+>aiFl8Jf(#M*L^hbt@^yK#%=G=>>C#22w~yhAB5gv zp}ISyG9%RI43QlBqv z=Dy&FE+&ds`?$Kr#|4KpQ4SiDo5&L5B7O}0t~FJmpbYNipkojqr0~BYEjp(P0PfV) z(scCSQ*1lvz`EFPGxne47dEYpd=%gQ$q3S$JPtmFL*B+)Fna zq@mhvO6ogx!7IkQ(>sI|-OTS^8Qr7OaqH%2+QmsYpZ|64RlyHQ7MI^D-K%&f6?6Pd zLAo~EdT@}{pMJyoVCL7$vxFSNbQ^_^1Y%7BMaQt&sWHJs4kZb3kx+<3;NLT@GFCNS z&Ce>m({!Tb`tr&0cJ%~&Q5xlrEU#kWGug4BpCm-AQ>pqz?lF%oaVs$A7+y&f-dTNT zA-*=ZOPyh3yBVE)jRzVEOX7U9yR3q(yds6(tG&fkPVmh|@h&zGUF6hC-N!-QWkBe= z+1OpIb5LbJOh3>jz5AE564ptmYk7@PJ@QL_NpAK)=w2la$p?m^%%(H;!rf`l1&@Kj zsS)=6BA5w#T08woJ1(4%OGWM8lM#rHJZyKw$lhZJ#a9pZ(>5$UC)(KtUhD;cSROVS zbnDU{N~v!K!fo9{D;#f;N$`NT)`6uW{nT*w<@5V`INl%6m;>7wv9kbuRTM*n-ni2R;sIm7|PTd79zWb-shpmEU zJVMzl+tC~UgyoQX;qB}ERGkj200cjXhoWe~&(-IY?y-8h{xkpzBxc{ThfwS#B1N4K zHY@f*@|#+HR-Qa!R@FZfB&rvL6+;5+Skawhm+WZWux{RJALCJG`#ILX@JBP|B@7Ik zznI7GH&9Vgn#kjVVdgE4V7|H4%j~6*_smnbaqG+c2S01WOj{ zVw@eG?iY)%&Q_}#O)2g>`4ZFrgF}oQ6=$oB41}?5I>&KyE*Ax1OOJlziO>XPJdICafMnAshF^8TllU&0{_bhfjJLVuS$=)TNwT5ZU`V z@Cc3f%^*{CI+KYc#G)VA3jj!fS~VQy#TQcK?seHr0{;xw7bJzk9`#;Zk3CY_Mavth z96ZTRoZ{*BKvB|##N`r8+(i3LNVG-L+R-Pxy0!H~KoCrr5->7#x~dq@BN61}@T@h@ zZCMb{J_DF|i=1ihi~qaihuSjQa?(~IsTsYFC870-&;$#O7xO0d&>WR;XssDc#K``Q zh;POO(Uy>vZ#x!?iNPUh zdfkk~optH+Wx9nc(Ii~$@9NCKLGVRhlN?R2g=ce`iG$`5rt%F$Oe3^R1|_}ajSB$_ zG8xdjH@lQWC(eXy)_G6qek8=;N3*&lM|m^1mxT;E39~*#Iz`vs^fWwJ5}dq9!>)6IGLyN4?H7qLOqK4jL+I?I!sn6Z&x|1Uh~#0e9JGi`R2%Szaj)BO=9 zE0XqmIyam!9DoFvjN?LEgd^Re?bYz-X9`JPzD1EmyRJvigImaf9 zzGZft`Gc)Gfij0@GNV`9LcE2#l(nBMLy&T5;#RZ;BX+O)??Ew*wa=v^Ij4AZWj^>W zz|MzR5*RREC{k>>3`O@Up^#$6v`1E|YYO9CSSa6Wrw%go#-(I`ZC?CVnzSy}@VUo( z-Rs#EK6khc-~}23wHC_CRgaU6;o89j5+Ap4G!YakL5m?toRB&E=to+C_z{h5kVEl7 zvs})6c55LuXow9Sp4TB@0wK!HTU`K_^o{F~wfH;&swE? z_gCS(J9L3M#1R5OAD|ERQO{kmP(#o(;od6x=FR_$GV|%n_4Z=Pb#{bw3!S1!I2p-> z!!Vp|#xSSfg_}X+dB}xm4U1*3A^2pGKA71YxaffnpBQo2b^KiS|*4 zlJTCW&7pcZ?CUH)zK+Uw0uW(_By(jqKT-zCq0*-)2JxLK$&@tE4eR8UzSOzl_qLU* z%=_-kBOob)F&C_@pZ!l>WQU#xTr8fzEd;aZA$J6&Z^3re3@5DO`v?V5m)MvWLZHpN z{~VN1lFBJ7cJiU(0)tm4SLvRyznr@bO%%!!=@n!AIoCAlPg7>h;IsPkBW0=!$)*P5 zKL5pDyritXLbZL)T3gsj5Gbu=)|QK)O=MR*B2j)M>V|&_-7ThyrNIi@cvsELqhXeI zgQ1&Mwh*@4mZTn_=$`x~rj{NeCbq(}M0pOB&)-VuSvgzH<5VY*P+ul-JfK%il5X$w zI$=`Iax#{b5CY9KSfpZ5D?~&e=L3TqU+)AGFM`FT^@aEz&qX<9a`6Ma!hFQ6*F+C3 z;@TRr@F0UwfI5kc8cZ)4Dg`(9uK!yn^z(EEmONDN6cp0f+nI_^-lCZZJH)X?vQ+z` zpfb4^1J6R;C|An;_Txo>3%ON_p+`3yX?W{d?!N7kN}_f~a?rgiun=57p+0Z>XMic> zk_ymwk5!a028z`!L?qwfu6KDq&dYu^#;*<%tQoWGa&cWElHsI|8AqhEWA_Mq^nVcs zeS*ON&9Qd@l7J)WP^Dg@xhRHeN1|!7_$2-uPI#BeBNzfSXAU1to@Y09G&dz3l)JWA zNPkrF?N~t&o2i_Hjb-oct&l9y0soKYFzHMdNk&~aBZCid+|S27Tj4v(8*9`6uCtAE zP7Lxf@_o-+s^&wMFYW+2cmbe{Q$=a{0OZ+nI?T=RySRT=yucbgW;k@{Zm|*5Q9nd}EW?TfH)+c zHFF6nB{jh$rylc5U&m1g{JKj{wY9+*syl<#!5_@L4QM0v+R~Cn zbuHvGgj7?g$T`H@oq~RlZvBw*4GDB+SwXZpXa{2i0Mu_ld3Ti? zB)j_zDFz$=$j-)L7llkKopi_938}yxSsaOCNxyihrB5P|IICjk23{0C^T4q&*bkvS zu>Lwq@vRT_>GULKb758hBJ`{JRHPl`(X3*OeD{=VGmRslz8@6oyf?&=>T4)~%3ZVv zE!!ZclXeZQ76m_sn}mr1u5aoWqTpbu&14uyD1zkJ58TF-avwm^?Bk$%G)zmi=puzENMedGd&1Gvl!VKI6|NjKF*cWutVKq^Mtf4u%;SLbR# zsp^!TJn72KWHp-xchyI}``rJYg(`-Mn+lcBsl@xI;u(BEW5fy8m{iuw|HM*IjF`#$ zIW5kD@_ft**tD9UUFhI2_|DsM>WbfJSp0tgsP&R{hL^K3j?6e}GkuQW>tDZR1C=gB zQc@}qL2aLaN~-9L;_EK^Mvc^KLTzENm$mfGh5n@3uQzusD^zt~I^+2)WO^*?=KKQz z(3{%ViCYhA)t?vI3b#x@9>!SKY?f1D*SOSquq&5T4==rK z)|fmZaE5@q%Sq}vvffRnSfsefV-~p`u-c;sc5y4tt&*m0)c7GstbZ=n@k?>=RcVn_<6-3^V!1{LNskZ_}UVf$=D6f@rYYwzfUftr|bi&7qYxl6h0`h{WBL zTAim}Y>3}4LJPRLb7lAVB%Pu-C_K1@th=}isa!k#)|y-`^~Ws!gT-HJ_$et+wn2kg z{%m_;+A%uYO;Q9#9M`;oZs;tl{|g(Wt{qh<&uQ40TgM_8*DJB8hxiB*niGlBh%r9m z#c)S6?ofQnbJ?RCzm-4|IiuK}xxH&hO@lsiesSI7@2bTvG|g@K70*o-ZsG#!t}1EZ zt~P4{DdD!})IwE#LjK{Iyy2F@xa{;ji7w#rmGT*P`#Jc#rEJsjSH2uWLM|Tsvq-3c z>CoB=k95$_g6+Q;9uw3VY4F7uwmxh|W=HMBUrJaN6b9Vo*v*`alEfU#yo!V9mmG`) zEY^8&luty)F^9IIZpk>GJ_}twoVi}@zx)lVO_7j$>1M5B-G;Li7msd^yQ82OLPiW8 zvQJgX(0~y+;$w=89(BQt-qVY^bv+mbarXC8)Orjlx#O_PMxdi7?vG@aSP{zlq1oKq zk+z!Aa<#gf+s^7a9|a|Qmev%P3lE(x#Re2()~DQ6jZGrd+|v?sn25;aBdy1g346-Z zMbB*5%h7ahObq}-K)k=WIsDW`lJlgag|O~|`pqs->Zj$h1GFMrN}}ja!?t z!f^O#&*i|wI@y>u)3b&V_b;e3CA^XEI1C=RvF8q!gJbRv#w5uf))C^(a(N0n1rz4d zJF60-6-S4Kq!)d<0~~CqxADIZ#5<&tVdHiy@4m|9b{6@_(r>pfN|eAAwIj%$V&+}Y z>fOAU^=VydCasxfL0FmcS)VR>uPzAqgL&2Gvs#nL2e$1(zyWR8N&A&be%O7H3b`%Y zXdZYN38Eepk0|Lm%Aax}1C&b24E#BV%$sQ*-o6;m-f!p8R2e&L`Dn`R7qp{`DMoFV2X~Qmslj z8b~99$)K}4gFsgt6p-r{PSOu^Z;l)!HxLn25mvLdeC|)I)v~T?3A|QB{VA@2d+&UFmT0;bADKvvKk7K&JDwn06{Y!_xa!7TYrR`$8q zN!N+g1-04#4xcCWrZDjQ;8O+u&rj}|6=BFCOa5aDLy2h7(ELMng{3SE#l;QOjy41L z4R;fKhhx_Nrc7wMHp8QsN$by>!tU@*3@JhC1d{}BYn95pPcY+hM&^nW z+`53D9lj2=YEw>Ne``^lr`@53_Pv%lo~tY`?`eKcW9d2MPn zcVuqn+;t_XB^>^WT_hvgaCWas6qo|}A7=z4T5oUB4Q6|d(jAhf@=)bzgYCD)Nxb!y zrTcEQv@-8~fatKwPEDBS*?- z<@GRP!<8eMJRS#vDyXYu>{gBV1d4$*w4kCcXOsdp$4RUryFSz7CZqO|^ftrrg zP&#*w!BIwAA8ceQ@13fwUo{@6hOJ{o6w+g(JXmuMy))To{crlNww}T-lYEhMFgi#C zW68)i6~63s=Bk&WM3$~1GmdOx;OyY^9EOL%m}B@J9x4YBg$3lQUN!R8fA5Jm3vlxq zR^|-y*Dq6a{13yTT~dR@m+cHkP3>4fk;{@IT{|4@M`h@3I(a3C?4OThDw&neYlbbJ znQ(?l(UPWK{F~j_z3#q?iyK5lU_ba%0`h-E#IhO>65`yeTJZkgb#D9c4-G8}ImMXx z7|}N-7z4_UesC4pf7*TJsyVNgOh4n&BI^CKD9jO(nvo@F0>5qahbR`8J)z!^{Ej5I z$mZJv^)~%#W=@?CvGJas3#7n$KrXrEeQ3tgw_Ef{`_tdD;vpVA$JFmr&{3~j8clRK z{ng+M+?rKDXoRiPCdR0vu=TGvWJ(al&xxTO@r#*ixLUyb z1z~aW8iyC6%rdk{bJy?{Sb)*%+8s5!nYTM|Q~~TdaFvU5!^bseAv^w|E#iv~L$5b8 z1Ad!1`$`dS`gcu4z%^f_Wwz^h)ek0FX_w-Hi`k$qt+io|XMplNdqP^jGZV?!ViuGro%h%+G|{7<2)0YS zZE5(tfU7EEY)Iij@kuC85e=ShhILXVS%m3$doIB4tNb6oElLB}3zzEVP!?xp$61JT z*JlDmHDnZMTr$?gJrWh&kkOUguE+t~WmoJ&KpNdC(vLdfx7VIInd=U}W*wWwyHr>y zO0LHc)Pme`8oS^0pk33&LSq1IiS8wC;vk-K~eh`&tp&>0`k} zdq*)vB^BK}>*AxC7&dc^PO|1-%^53_^qL zzi1`yABA{wWlI`*-x}eVl_cV1L+EQPZSziF0jgV`T$u8GLPN~vYkTAr)y{Sb5))Q6m-}oN&Eh0~U*1#6GR!rj;LoP$F};MJhXbO93`k{AIb^X{#?1HT zhj|A~N~cL(hiDVic@Ga#BmSAVcjdIyAVyS~`WtaJuOxh7$t2D!(!UcwTf*SciYU>@ znPK!>nDc>{`$zLZ>@Y3p__m%Ks$wxwVFeI^SYClgd*s$5)tB`6YiDku@6{IycXuMt z3fPNC_p4^}MGCvgS|FYob6a#hFtv5}2eqb1amJ%vU4&E}_<&y$SD2?;p)X-4d1Nwj zt7Vf*=vviBvaN7NqSA^74%JYp4?p7@p3^-Q(UmQBh>JNq$Xmdaz4}5H!@pdm-l*IA zf2J)M5pN!k7s=QaVT{95;R``h!j^h|-5K(XOtR$Yd2(1PsU%3HqpHgX#l@l-bjzdbf#T!z{s3XU607#A&R7NWs=OPZ z;Vj|BT>4M#R1U2QER%j|GQ0{`_IIn=nBH<~1yo_K9qKa}=W@j){^33!9;doV4^^Gd z=~h3bxj*KFex()rQK~G={tW}PU!iHB!JQ5hp(!S(L6FcRsIX01;-up@&~j7hN}0bN zITt}>iCBT$;j`}IN^Gm_IZ!KdKAo%+(GjM#Lv-5ovG(^#4M_vAFA=s?_Te*jQr0=6 z6CyWX}XBrTMJ4M#I^DTXI|FeYu-2U!hm+J1oRvg*rpk) zFD^viB*Ydh{skdgG8K(-cs~I>TftQBSlq@c0#qA4BBtw8{_b@i672$8`MPJSI8hGk z{&&xS$}5`5{9z^jO~XOyL$l8WJIvNv5Y5WoU(#mhy+9o2{;)9dNJdVf@3wt$s#|dmnCNVTb(a*nKa4)>UVY>%oWFL&AfNTfc2;#Yr>0mC`VjGQ|jb!2Fw?9R#(M;$M?%u(=dJ^6Y zky;<~sTeXlrh>_1<-@N@=q(#YFC?5`AiE9e9E!wKkM6OM0|WS@Dju+1HYuJ%XGKDB zZHDX`r;pYv9^Qdiplr65?Tjo|7rnGy*@6zDJ_W%+55?RL^5%p05;3nt$;zij)#bk0 zb_qch&I3o}A99JMLf&OG7*I^BPwE6%r!e`!-V-q*55mf~p|&gq(G5)5M_#N)=-@h? z4I}scrl(uVgh6B|rAIzfs`cvrij)_=UaJvJeUJ=wcw5Nf5n?h z{nLY+spHerI|BrcS>g>WcoAnTA-G|f9cIiYsTd4yR=g-aF*Z7B_T)h_&PIq$nrodm zm(*Y$t-v&N4PhL4q1D}j^bjK6+^I!!wT>iKGTC_TEki|)%rC;1Ly%m=75(QRqC!PZ zc%G>_E%rLz(237!iM-Ab=Y{feUeX*4FK|hN`PK#3N_n-;)5=4y1BxZd)iMy zo8G6LKf7VY@4o2D0?4nBO=)Pnee?-gh$*-XCMJlr-gq-2hnc+bJp1$HU4Kd>fU%9z zXKgSD#_zen1;^+?9Cp+KUqs#PfK|1Gko)sOB zd1^qu)m8}qqZZ8H_Pdal$oky$#jv^84BOYJ;%3sxmq{^6@+C&hCva?OoURF%DHHJY z>7f<;qkv;|dSvmE;=;78a}&4UJo+;W?vh~v`CuA^oDZ^-0OJW!pMX{P>`MzBEId** zyRcmi+rtYv zlzG3RW=3{RDA(9=A(Bl_j9@UQBKk=H+EWqMw%lxT{hXiN49#g;>TnuN)4)X~H>7H} zX9zTz@XeA2B)HHXF}o^~?zCSBt4{}QYu_>!d~!m2gBTb;O{pmJeQB8WV4CsaHM<-R zEc!y7jBSFDp-41f?H+Wt{ukBKHIOMd?noV@VJrUebMvW`+Ha8lpXA}Bp+j3&P97}y zL&&+y4w_r`|9I0)l%;Lyc&)V3XRH1}Y)a+>@G4Ua-ZUIs*mft;Tr=ABgQ}1`W|I*o zO~#u8fcU|Vy)}1LlipHNsH+bMpGKeERc4|t{#>ToqSB!O^)?|NP+K68#aQd7*=NeK z=~I%=3BDY}|kz^9~6`MVGi1fzQiYxvWks=$|up4WpW0YEEP*yXp1 zf*T*cX%Y5+;~)F9grnxGxzn|fFpET~u3w!O-y0NreIJdWVvG@hJ8Wbkwav~bCJD?d z^XgkJbzOYI(LdZ(Unot)IL!UDD_>)HgyhqDm>V}?N{iS=?RfLGD?Maq10(a5?6 zc2$+~#bl&bo^Zpm&UoRol)!Vaxl7;yQCIqG)q4qSTM3h^NZe~k>Unh`#NxzkO4mCr zdoNb1lPwlGlq(Rr4X11xv6e#tljoy1;`f5NBX<$z%-N!P`NbK*wSBdii)GUe$vQ~$?nuy0ISSa`rkLFaw{fbJU%bs=Ie#W zxF4_&LCdFs!o2?}B^Cx_m}cxE1S|a@0uF==vCAa0Uo|}>+&cskmd&3E^kMw9L6Z4B z|L=!r3Dq6DTOETHtCRjN31@!-z&CRjN`}BXPgZ^+A~8{_s}%>5QSAtXtpV?KyIrhg zP}EiQST2gvUB;)#i@s>l{dzpPCV-N|A+%@(+y&zdnum=XuD@k{le87|p6An+CND5_RhbbvX6ALEry(z#ns1YSL;+pWJdhrz& zuQQq%)`T_5kk@4BxjH zhz)oV6w-9BA*g5f9a-aAprs@DV#%#gdCk=@DOZZ7g;laoOY0JKpBIJs$IV&y`?fu!n;pS+QBn4C@w)6Y znjeq7#oZ4Z4Bs?I9RpXIGv)X7*ia+^N zJx=nNNK6opz|cXc=k)$fdceMIBSW;DJ;l^O_H#%eAc6!UKF7n-2!X&CXPWYttUUq+ z_FWt4E}@LLFyG_rY(NY1UmebdroXihwQi^V?D2E^euk2+@P=ZtfVC=t+C}-~z%zSv zqT*_GMA{xWZqRg2bx_vEB*mkkY{8~SwFlbmPbI9)Jkl&vjR%w-aW~_B`t$$8p!GD0^*w=)OuM?tgQS)buJ-EZB zvY%g@a0Bl>wTZ5B_7_z!#LQ|MHTFKXv7iOX=Pciu0b=tqGgqqD7S)>>3af16IIrt* zL7$OhOsH*tw1iEhhvh8zY-dG@!R@ftZc_t@)DEv;M=6vGm4K0XMI%BdPyIW%(x@Xp z#=(aVbi6-QnhXmKZoCYGe^Z;)Y!R!GrWsqMGM8HqdYB1Ao##<=U;cnL($oRT3*Aob z@|!qMPa>o-4Ui!docx%7vahU_V$&hp0bfl$3~#l}6Us1WDN_Yw`9-bna1$jKwl!|p zrryzK6kN3j0qHa%z&r<#Pbuw;hKq0MR{$v=@=Msp_>lO{GpzAnT#2r}3G!F+zyP)- zbpCXjvUUFKbKOXmmX9(86079-G24?9F6L}2%u`#^x*&WcH0A0x&1BqBuC-OPI;+C!2+!wwWE&vHE=BAyp#|=dB@?ph6#(+q|Gob zizSjtS?YZ?450oIh!>HDEk{}Gm)S%zP8pdf6D)9UoR~w0?o(*XCty;o7$5nD@gCr| zixQ!_3_-iwuE^|2#K|()c98PrRf^vT7@Kx>Ja21C?R8=|k3p*Qh1=g-#iehL!u5Y@ zo<}<&I`2b@6a1;W?~LSjl(J7pY`!djZpNz^bmEKaavwA1zC1+#Yv-=;Qt%Oi+WM!{$L_hfi<^{#HlwNRmY zzcn@dY-EuShz!eT0P9kF6afvC^uHYvAPFi|Z@{GTCI=c=S5;^|DW>q=9Tr&dnDckV z!fW?SXrt&k?}1rlJ2cK7>z12k0diBT?Kwo2Yr`_{&75-x;u4+ZYP_o*ykM@>o>zrh zw@D^@1(rmM5D)7wl3cR_05*1k47m7J`|gf!`1yu6)u&fh;zyA0^bIQi<-ss^H4EYZ zZue!oI(=y&Cq%ps98s~iTLG7EGi9_ChJ7@S<{j?IgofbSm6Uy+?xk0mfUFk&U_b;pfV{_D1UakwrNW)6yXg>r_czP=T zbRUPx6HcLZF$Eni+-_sUd-8gttDx)ov%qexnG2qp!flVQJO}w6+Jfc`1YcJ-)_Jlh zehjcu9|>srbuoT4FF-}&;WxrTkIgeB9fnn=!Gt2B5l^`V@zvF{Qez zC)s7|#SzD0w%-z16Q_{rZXo8-e=|%ct`GLTOaQe0Hoz#H>fqR*K-Dj3$Htn3Q^nbF zznTC5-*02`G0WDI0^=wi=Z~i>tqTstxJ6Ic*W3fA7nL%ToWIuztu7s~LiCkXu){8I zY9s@9FV;z#r>BZ$7WIFcF(<$sf5nfQKu0<|9K^EY1}^#YW)o8yCp{rh6G=z;yVzyR z&muWo5^}4dQESChoSl>pb=~#2iJdg3!(kNDn8t+u$X(Mb^;rV~L?B6(ud(NUPkh#@ zkr*>iN#^$T%czEE2Y#o>x?Nd-i@^7eXlB(SGR?Y2@*@y|hw)mY9+CbKd&+(jcl+aC zB}qQ4fTb^WIZss9LePfdL#6JpHU)O(8n?I3P^&H)&@39hxi^^`BWXp{KT+0~1rLATPT8LV}V z!0-TI$FQ0~D|8s)D8VbJtW``be5)?vQ>lm0{-Ji13KADjypJ-NyT?jRh!*K znB>g;sBa1{rYb1qVY7})+dEfEl}gVQpu?w4{*$_o$lHapDPJ-A_S%!Id|QZ3p%l>k z%S4>ODKzj2PY63`nd@0X5iij)LmYOnFPKgpc!O_Tu@g9l(mr9*9O$+Gw6S$~>D6(K z(KyOR=c-a7_&{V-rN~PsJfH6Gz9*Jr=-43_(@u|AN2YYqk2M?rh${oAWRn1BpW)M- z?4s3=jXEewnyYRmo55BHJE{jr|LF)n4x0|fr@xwm=k|SCQQ0`n0@1`~k^APM{?4{w zr>HbrBELJ9vG(o#6)>ctlH-zUrxcJ)lZzFz`&=vPmQ?@yc1B@urWW6K>-Df|yPFlZ zuQMq202Jaqt1pmu3imqoP$|Hsn_Vz`g~hz8qhs7@nlCWuDNzlz+9t2CY$!Jr7Nv;F zjLyE>)Q^C4?u24yDo><^?llL@3=Z!K`b4-({{-gw(ydIXOgF~CkSM%I27{z#;Rs6qlv46Hr|E-n6h|!LJNuGFE2pfUDLvxpiV=-^hE)~#bkg&0Ga+Cq`w;e#%;h$5 z^Ot~Ic!CHP(F1X(s7iYV;yCe{ZEfSQ_ITn}nO#;D9exS@ zm|R#sL}ptE+-$n`(w+F?-~We$*G5jCmddvsSP%c?Vjr(^;$P7HB7ycKF~7v~SyY-L=n7xK5$-4C53`VzVKTDr2c)b+;6{bH8(4C!DmqM}v@Fxq1qIRDQh3ro*5)hw z*+OcH20O2P0Q&Cmc)s=EP>N=?w)nN@m3QAOeUxZSgoH4B31R^l5eqEu5TQ@5Z>N2> zaVZUDf{w1i(*Y-7I7epCpOEuYgW^OScJCFpaS-US`0qH0a;;C()2MG%=LbhpHC6dP z#{pW(k)tor)@hAn$uXZ11C^4kv!LjciE782!O4 zFY9ocN!8UF(}QMBrxvY-XYjNwuji;@f=b>NhKy8ku0(@fIc(e_Tf-QiK@=7^6@#mE zYFD4pGb-JeL9qL&W_R?Fk=_wR)eqh?bWn1R;=*mqvu@&Q(=hXRK^BAfhQf&A@k7u zpxlt#J6-zTnzAhvySt>q{A=mCUg9-6=#HZa7LH#DKNhr^PC#s!fRmF)R8qh^?r)iu zK#4a;fa%a8%b1BbT15BsHi2k|Zf?r&;>WRuU$@DrpC5mvka)Tnrol#lW0+N_tnR#; zE14bzwVBe$%31S~fOZ7ccK=#GU;S~glb*1G#Ivadg&MFV9F69clO+HAq^%8r*E2b+G@ZxWOM2- z)H;75M_rPlltqW@kn~r4Xs<;c3(voyv0@xQPHiCrQ=uUnX@=cv$+I?1cQG%oCl8H_ zy68?S12mTVm+X0?E8El}m^%oC%nWEfhA$yc@y;A*RIKQyhhM|S6bSvwq#|$P-l`TH zZ&16|B@BzW?KB!44z0VS-W@E@bivP&|Kl(h$xgwoJb$vlZj>%ApZ00nuSCx^peK1Q ztSqSQb@!ZQWR*SkS|hdo&vcJ+gjbYrg8cVgvbVTU`#~FlGfy#lmEl&wjQY*(fYM|& zpI)uQ2%7FNv1S;BXC+e%y&d<&Tnmk8!AMZ&{sAWSPqGuPx(N2A!LU7ObdX!$rA|jh z{hoGgTMbjRO6iD;0T5=sT2qg!`oaZBzuQj*q7c-{2qu_B(|rnX*Anbgx1`Ra7bK@jpR=awSQ5 zvUI&W5*OlO%j;)0|GG{%Bx!1Z^(uCT;|{ukL-iSY7pl`(WZ~UgYpwa6*+Jlqh6)Fw zXSY+-T7K>Nhrl`JNSlgy4pNeD;Z;znwfsgq!su2B5N*Hz#*CzU|&6;eqNJ135Swdvlx7-K=hwlkshZhuQxcT z(}h0+-4}C36W+ZJXtz8(rq(vSPCYx`b@=4i7!MeMHn2NpO41wp7<}2)0a~9ceVwM4 zE!_4nfPQ5QV_5J7DWP7Q53q_xrnwXEG#6Sd{=6agkfB$s{ zBqn3HW~5Ghaa3m08vIFt!kHUX5bE1+BPo|DzW8sF6qYI)Zc=#-{t-IO4~%3ImU<%0 z0CT`y+Sm`nTRZCGgDZ^_`P4k+Oxc!v44j+{b^H{SBuk|xhsPM2v{=zrpG8!4-69l3 zX%J4n+piz|3uRDd2eJi-1mD}17ZV(>eT$m%ve^b+*+skhbezCn`{3TDSSh6bH|m+) zQ-fD7t8~?S#8C{_!5kzgHEH4ROZkSw`yT;f=_lAVda)ZowpW*E3wV<0FvYki=*2RO zQ375cgGORJRl_u?x%ZhSx|#giP7$Xv68*Mh ziAVVKgl#!L@7sObJT+!lYIqJM^+F4?=7SED&WHdR@zi8M&WGtHFOg4y=hs-gKyLnM zzaU?3@@1<=eh^h5fw>6F)N{bcSguOh|A#nm`4!sfuCv$L~jKTf!wu@P@VW ztV6rXWm2Oktowg|cobKey#Tdj*1)q4>N(FDjE2fXfvs2*_aY{gcwdXu1gH%#OvE`E zEaE#TZ`o5@fiAo@GCjVehB22t5d7o*lW(ay)yx6}I%n(}H=P83FPg;%+R^DZ^d(za z0;`xB0u!-|nxkr12J2|@|f=J45+-C|tXv5ZOGD3ujY_WE9Bapj=hWEc)P z-!!ntx}tw`ZYY_4`Ku}d11LZ_U+VD-0U0CWsM;SxSamqf5+l~kGObtj@*P`bniXJS zGgZH>3>#{icDIabmUK&nG+<)C-grL&*047RR_uv88jbBNv&`2>eAa~Kx?VxdJs1xq zD;dKf4I>9!T+a^Os@|=dU7d%)Ik^ z@=dncLhk2fXLkWeWgpXxS}h*YT`ZkF2)P!w9=@M{W=N{UT*sM4GDhoO|>?!87$*qc%q=(_umc^vF6ox zl*s*m`f%Su;Bl1Fbcs+Bpm2Ybp3Mo=5clNvLa|C`uML@xLg^UFex=q18CTSx3ha_? zBMi^P1UEReiLk`$3G8F!ha5Cb{O-P^&D08XQzwxm*Juh+aMOBAF?AXQf#HO?8aUfp z*jwGKh_Z2H*Z@Ib=$?np5*D6^7=TVDRW* z!g-!^pYc6#@p+x0|)H~HPnzBFPfsxI_?+1BL4&J1Rk=6QkR!% z*T3npF5(Lh%qLW@YDY+@RPZ8jK@e$|zp?3e-b2dIHVf<0;?0V>Y#+@!oC`S96P}<= z-`R%DUge)Ab6TQXOXYCIjk!@AZHqIHR^+|K^0^Gk^_W=V+oI0})tU#R#`J{Ygnq9@ zyl&Ov*vaOyC9{)3(ooyyz8hf%CO3Df4eWG>jX2nOE{Vz1^WgA;O-lx)nh(Qy5gozh zA{V8&Mg&8&s6j$#Hj4us1SP04_dP@mj!F&mP^>?OpHJu)asi8Wd|S6g$&aqPJtf1H zBY0o^^nRB%qpJdxYPirgwXoe1-&U4fs(0l{v7kBOi7H9`&slZ5x%AlUer`;MpZG6cTPl0EXPBe{ni0s7xLO3ZVf(VDIVbuyc^rRc-sYTq{cL(*#h` z;McwhQP7$8N*O$Q90|KyVVVCR5h4-~$ihc=7Or~l8dMNV@A+VGldPPUdgq zBV{GeXc{;2FJ;5q0|&uyB|CIM3=bD*AhqTttYhAFyQn0zJwt{b6qGS(oBp1UuhnVq z=X>TAyQ)VL;+x&xmD6G*=maLM9+OQHIy)1`=lxL#G^}b$2Rf8BEag&_4F@%!v_ift zk%t;mf0G*85ov4gNc-9K1JDL^XQqR;yTPpy-awRU4*@t!NZ__c;BU8y-jRP+nkQK1 zebL-T#ioOP7I9PhZK%pZY^hRo`49fNQ@W!I7}~{hN*=1>9G~TdqOdc)bBpTj{E_+i z`TcXe69*fGugMjR1D!`XHH&tj%R5OIymTQd%k(Sy%8n_4p4^K*bwJ_V$-~>%)zfR; z>=T;g64J}N&X&Gc5AV#~{Q<^@Y#eqycVE2DP0(xjUJ+iKbg3$+-!gllSP=yaN*Gtk zY!}YzdyOuw@plPcJl5=UJ1tva;Y2&hhkwO>Vb>z(qwyDq@%`Ven4f6?x*p0laYlMY;&fK8(JFU4`K^f( zC>Bj_z`AMF`HyU>MU>at1%zH)aoqoXLXOXc?18s7I;_DT@1eYxfRe1pXnmhi`(V6754wW(*q5T<6)c1$IYl1tIGuqNLnZH2WcWnXqwK3rZs#Jmd?wf+m|bAXfr=q!pQ!e;T_#)3JG>0nMHf2)CWu zo4<+IspFD0-)aVXxFoRq3S9PxLPWJ7tS#u64>yQx(qL&MyCSfGT%k_D{FF;Vz2B2o zP}Yd1<`pOOMsrvxC1eRq-DuVyvO_!rvsx{Xr+-asIV&M$q{60HL!?$aO^;0$E`>}S zLdE3FW_iF6HqoR>zvaU_Er+~RghX~b`{&_ek;txt0qB~Kb76*85FxgYNrhZ$f;oNn zPHYmGBsgq;Kw;fJz4HOuD1S9}t6D~vi%SA%Q^JmJXT3?ZK|hh-YF>P;H|`a`d2A$! zk*vnF7dApsJ@@fU-U5EC!1!sND$|5dPTJ(tB`YA>NV)thhNcTIz77-rHS*u^9UOsE znRtgW32G}>v(KY)dxAlSCS)SGW$YjG9q}Fl>TLk+C2I00G$NVlDarbB<8))b@tn=NtK*F%y zJqXK5N5Kd$%n7TSJ@%;YYSu+8ev0W?hu929ib5zMY4Xyc^e-t6SR+xq(Kf2)B-^%_ zd>wx00`|C-N-E%SI@SLR@UJZET8|f+jZ9j6DZ;C=@=|ggiK~bLbf*@=?j|#d^Q*-%fF+(8(EA0$LKNGC5FN zq)&4{#aTM2wDUZ(tQt$SjZp{eBQ?K;#?PcN48yHE?1fzeaVb+MRAo;9Us1ARLntGP zDAtKGNSsH;L(1vu>gs*Y_3qAoz<*Y^Pm1Ju_jy>O@$wlV_3x1458NIeiMy_i{asfe z?ai^oF2IWHFlFZXI52dO#kutcf}3}v({0k(V)b9IAxrZpji%$%YQS}6%Y?^Hujm1yMk zf+;{Pe;AM~tzebI1C54>TJ|0h$yuyo2gYxr1B|VE&5#a%rNiJpYV8-iS1=8sS?Y=R zvQxJh7ZA@PR`>+Mn5$8=5Xfoq8V3rk)|?!|j8i3AB}Ze?!An5XuMDh2lse4JpLN~5 zK}dv44Pe6~&9w{m;6ewO6bSFWs(+nzgJlrN%3$qVm!iU*q0%R}ipO$Tb3}GyZBFJM zk~iwuWfqjkmv*>;b#tBiJo2f7(t)(90mJDc9uEan8UpsgV!m$pZ{r@Q|K>ZqP8*;o z&?BAI8JHl{*8}2)c3|`KmO9@z;1F*|;<50g?&hav}K2jGOtU z%;W*a*C?02I}6~?Q7B`}!XRjEC$cblL@hEw^q5Y}w_tXHmtQ=~ziU8T7@#Hyx{^WHEXjo! zbOM#@aCnP>;&?-K1U-7#g*3k#U|{-?Pe_BZDt=bn-hWyB;ls~Fig`Z;kb1W!gcRo} ziav{RLv@oBa3KqxS798yWoZv*y)ia#Uw${NxQDqB3^gwQSjRF^<`#N~RGU`CVa{o2 z(*wi@-M=J6JmP{Rf3w%ZkUaNHbmd5125o~6UaHpYiA-TeySeySnoB?K-p=Q2QHAj! z<|#z+j#EM=&Jljl^+pQA>O)iY%0f(-QK&qLEnId2a4|coE4g-R7|LQ6q5Ws-O_q!8 z;99r--Wb@s+XQNK^wU$gfC2ABm>nS9^$#UH*Pv#RiIh|OF0Yf(Wy<B3b#2GDY2LRz1kuFdg<}km4+9ZuGHS^jRRYDVjE3I<4G2(w50r z+Y+_ZQnol4Flaa+#fmv4!&sD#eJ6C)*5bAH9bpNcC1b z<@1;;p3C($GvZSi-Kk>s*%HAfF9~pkIQVFG<4=h|Ix-$8SYaeB3)GTMiCz`nvvdaR zP-e40wtH*s=*$}lR=a7yAatgXaok@x#5|U~<7urJDRD(~vJl{QwvzWGx6n)ndTXcf z_vu)*OsaK4;&+pM*r&{V#;&lUlO5=b$9+%G*_yv|y@?cr-{`rePB9h8Uky;M5D=VH zTd(`_&eBf?-oA(sQPvnP%UP)atb9U*V*Cx+E48ZxS~UE#=3z5X7AD?rGCejJc{l@* zdf*%L1Ddmjrp8^l&WCJZ-vpH%H*&tR#hTrh%!1`oNWxs5xf#fy?d3aZ zGV#{1=JfwWr8{w`6`*gp$N<=PdCu5T(?qlf_Fhn{2S(p1uqxUkH#&xeWFjR%5AjR5 z+}HKP1t_Lj>ib*wenjBxqA&&Z|K>V5JsCaBMkB%i>`xkghJLy|#2fhtt;ysz<(^to zPY6K0<-ieDx}G-a0?=783Z^wFhsdgq+kaPHTznDDnikR_h1J0BAI~^AOSN z0biCgzTz2^TxI$RM%;?p)K_=z{~C;u(BMRh#)>e7D^0$SiN>JqCF3Z7RCd|WCpY#P zOWE}@awuJW=QH1|XS{6)v+rx{Fl134d`_5j8vjn{!5=8NeABmj%EHq9;2#*5rc^0n zcxW7S1W%}<%wxp3>aD*1Kuv?&<*e4OM;>a>mk&!nJw~v6pd|(fNaS+;M1O$n0KUB2 zUN)ac9^AK8)$iyMjClSLgsOXKU>uZ9x1&-y2DJnsZbb!F><3bT?nr^0mn#QHXb!#3 z0HHUkQoTH&n(;J{$@*e}Bj1QQJ?!Hh4-B3s4)+gMf}(=2(<1x54*7=Pd)~j}xaG1F ztC-!M0<;MG4t=PmzkExTSIM)wfu8Vp=$$@&;}ynBz8rQ^NxoMO_ejs0ntiiykqo|J zGQz)lK>x20UO)JL?s3<*PK~@p%F1UAV1rfW`Bmc&Mi3(zg#naizW8WdMF;<@aB)Rl zWI%CMI#5*g9)d@g>IktN?|T)h?;@=W6Kttj$0iV!l|rUJ3Q}-7cF58`j?^xP*Mr8(fVdyb0rA3FgBK#HW>u~a0Kjno8PV^&Q8@Lv8!Oo zmmWgheHtZQc1|Fj&gjo?3`tX!Wba~YZVJbm61iItrU73(z3Al^MnCF{P>dH^(7W4@e0?`-KHg~8zZyx30>Y*b0` zB($)Qu@5@dcG9KSGIYt&#M|wH%Yt}(oG%S{I{a@7*U=ZchVJu-N3duv!&=rd7r3g$KZ>hz+*n%$IhhQkc; zFmpdjnuvVBw~Vg<==AN=eNsTRur=OI!`A8K$ou?{_KxPIG_4zDPqyvZ0b(xW7myp0 zkDZv4sK895SMm()zcuQPsZq-2|+!KQnpMIdmTtdUl??ip_HWv&QV1>J}?wh zKPshp_-h2ei0JNF>*W2YwF!ATI>CKq{P?aq9gp$Vz}^pCrP@|f56mRhd#NT&jSJh=g>CL2St{pB ziPy{az|_IqWOzvZ3T=^vkr91xtZ;kC zpV)bEGuoHy%jyxBV29&X23|4XLIPjJ(VHVU_?!&sqrdkeeP(gInt{PuGtk8g zf`yx#NqevZ#QiuCl_C|H6L}8cKNYoVfdfvuGO7AN0;&K{K(N16mD>i;vp&}8MW-h7 zLh!8b{kNl-mTOQ1z8}djAWjH*O z#lLh)^V-dS6GWOnmt@oA5bvhPiEG;R+}<`<)F(rhHpk7VUrQd%XQ#jF(CNJvU3mM2 zfmA04VUNQv5xtRA?x0}48Wf-Q5$~?wDq$m57OjFO>nKEy&gsMor+wTzb4qzn8B(%A zH~Ma55oJHq->8lf9Y`0U?OlSueNc*IW^Do%_M?wO;}!e2!5NWQFP5HV9?2}=XTgb2 z8?eFLXOoGkg>)N{lGKKVcd);S*axAEaf-U+d3C@dWjk6p7t!-IZkliRgiP!UihCRV zDJa}cj7xf6&EdwVA@x*x0a=ohrUtx^+GEl$giPBm@F+T0AM9L(zHXHRH`{o z&;mc;6pZ@{NU-FBA^;6t9FQ*h>z4Fv^sA?Un8)zpA~PLIBaFq7$N4+nn{jZ_vgLjf zFz|Q8M{sjK-<5P5Agr*x?9Uv0$nhKDSbZG9i2s9{3w|5er>+g^v{9cy0p-0zc$M? zk@1yqSdtOfx0(Jj6UJ9cX%5SkM=gN}yES}muM40OmXPniB9kwP_Fgr~bK_D4kJ!uyv^)5b{6o5iD5 z#_v|I*?$-5dZM(2cL`f!;_Rq>YRRaUyk*YDZo9&NEXNWA2d3_6kd=%epr0gSFX|n} zR|r3}P5YaD75sNe3cHeRH$>5{CI#HMUi=1DpG+Kc!(~uaPFxNqt;yDpWgdhA)|z5+fl{MQFN>;#%Jhz=e%g~i_@zKw8k{h!uGCU6<(j{?H$u6H5()q{Y3riX{lncBSj|@7tBU8)#b?V zU)G7g-U-WH!s1$NU@YyI9ZT2K-R`6HJR}EAS7U7=ueojils{74@Na;wP%!-Hzk{IJ zh8EUK@2^NJGDW5I2ii@P#*V5Apfb}3q%}!n@f!yB?Q7+BLiGcER(~JF&j?C(HEb*p zHIJ*^u-P7C_p;IoY;r0?-fUHJ+%0P}7>u#k2MlgoNA?uVy;RVqe#_PCCm4x-1V@?( z@Vr(FZPU*6hI`+pZCoo{i3|HnUdOy*42KrA54AI7Ij#2&Xt6*coQt-?d4HVzlj@tR?4zr>G;^UO)4^hpg+2$c z-NnXv|MfQet-bFnyCBdjsj?WL<`0EoGw}WNyIIPb1j4V#W3z`~kL%`ut^_GPP70 znByYTrF-p~wRk7?qQkJ9i7Z+IkMDi}V4PC?Ixu zV=eO*gC)D}tY7TAD;Q*5q^Ikj>m|+;HDJ$KR=}TyHSQd)!Fgmzp=8;mt!5DU}U3lj+z?w(mnr~?ixK^?CEF9P zKCEf$Vc+RSgOz#hE8v(A6x3X0;9}5o|IJ&k8}o&d(FWlo37{a^8P4wsOVaU$pz%)z zb19B;ifkR}(aT|7I=C*6k}U9!rg7KNefA_ScdUKUj`8RXe*fE)5F8XAVe-$q{jI8Y zb$mDYO{UI?nC8~|iiilo;HZq6Q0RNtdsXg$)7{*vgdcxRS4MbfcBSXq#+_8fVJ;(l zSM_VhRhDwt!fJ;QQPks)azF-!fs9=b)a>iRcOXHVznO<#{4}?TeQh**8Y{J(-u6-e z#jxd==|sV(=b)DPiiAwWU4S)>n2Ri5>^&2#b?TuQcYhsX;eBoDbp+aX2q;m7*!5~= zuPbtWy9&JBrac~V-~u1=0(H3$dKJXtSN^IE8Ge)2)Q(gJq2SD;B{KKG;UBP=Tn*|& z;+cLXg^|>8WJz`yiQHoj(xXv&QTnq1aJ$xUQ-amPXzl8&4_Xg4Tv>WLds>d&QOGse~3bNLo);ba}v!pGd9L1E|`RtgB9 zJBQ6{7$7$G=hEprfX#UBYB_n4=yeDk_b6CuWD8Sy;~5%QAw7v! zw23$hS)QnpY`$2qXI%2HcWub^kw?=pq1OAQLnQ;Cv?hCcZ3Y|tnqF=US@;tGZlFY|%0j8zXI;+QQOZx+l$1AnhJ;3TFIJumE5Gl zYgyZL)6uyO4)B;wuDMZ@ur&Q4WtapoFRJ?q@Pej<+(yuK8ENrU$EW%p5O&o$f4BE8 zPsbHt8sX7=r8kqwvq{yRNPku^+ww^qxBO=^qp*-ENXO+JIE&+@~*;W zEx20nI%_eOifbF1{uXSY6 zj@iKPgus5VcPZYu+iY!!~vOU8Kk{#W~-9*NHKeVhqn(UNVrBq01f= zexsm|C`dUyf`-aIGUiSmTTDRO&~N<)Nu!JGO`0%q>Urp*&9WoJq}YN^DXBCz7YO$~*&L3PvDe3c@Gq zmGd2LE?)LFA&&_IQal&j&uGF!cSkeQmbX0smv$b6fRrACAdu8%n$ z1lORgof>Yc*~oq4&2!4I>xXzDaAE4*jJ*|07<3zjyTM_btZ1mcsRdaC(0E@giCd{F zjFlr*PifiKonTUS>9aS4$o;o$rePbubLxBSSoohx`040hGHu54YjyUW=}P%AeRd6; zdNzQw>vsz|YQ{bGy7GhC;mOzcl-+`k9T9=a^L|WvL){s8*U2vz(K)a5-=gs(kn_F=9?Jvzb&`zk4qccotYoT+%sXwbKM#70HQZCe zUNBWHMg8slu-nxk3w`>4`wg{U#3hmyJc)N7kHCS?oyIBmeLI&1IJzQZcX^ZWnIc0O zo?$oo*!%n852L`0{}R5G$~P*F`NjW|*X3GrN z)fQ0ynlrXYSliWlWz|yelsun%*#27{H-j*aRs(}C7vXlaPZewT*yFJfBKB*tL>jj~ zdL%bKc}0=z#~J*MyLuRKEa0!g*M5a_4;I%=*$pL`ycrUh?EI?#yMe1KN0H|u_Sc#0 zhgPf4v2f%I1L_w!4FIH~6!x4g$#)Y0N>4{H8}xIN3|EgBT}ZjPR6iv##M$pV=zGyh z?Q=#h2x{^+vo=?z-;1@G_Gg~!_@OI$NGf&@sV$MU%luSf-K52|`uYG<(sc3ak4Xv< z+};br@lhQi9@s%nQ=H*}1?c17;1vu5T3}Nfzb9QnId}qxUpiKvOCwGL#1bT%*h*+l zmKyX^0-RS8N@$#Tp+i26VO!=TgXy2ZpImLMaQpl@8=J8BrvnBO+VlOl5$=YY2$D7d z$vrb)zgEOj@yyJXul1{}kN)*teotLcLtFq3%UNg9ztNOw?V?mjoa7l89O7aHRK^l1 zoLtWKUB5LotE{lr{AX|a&84o!XPFE9OH^Yio{rZ-+ytkxiYF*>*DRhc#u`Q`>ucx8 zm#}jgg?Ae!;ZC!ulld>(KG!-K`9%ZG27Lg zyZb49N@SAwy!_ZJg{F)d%`+b)S6vpkLEJ#9X;}A3wxY0Hof&_uUY{JS83~ zkWdFtPPC4ome#Zs0z^r3pXt_M`G20-T(QE@LPk=^ND2>H6%9UQ z{2>WJI$o9M@X}?X8o_?D&<<%tK@PJrW3TjMp-RP9ofY}lU8$@`5Qj9ER8$;gyK*vx zj@^bC^eFb7X?ze17c*6j^2InakukG|F<-hV%>%(R0z1eR$JzK}$xG#LBRPadO7B3z zSP+4h^K&}ZlPluw9WQ-B;KES|dL4h6Iefzyy?A{Dq2AdrEc(U$=bHGiW|7J_sKbD> zVbM}RI>_C_?$JtT!&w4p?H|0RiJ&s>a%qKz0bDG2X87OD#_w;G9o*kfHs5WA;WSw{ z!R_;SuqUTbE`f=JXSCqpag4Bi?5F>ouD%_^4D_H3adKqrj|2_oKgONc zg4xjz)Gs|KaLZy|qI|NDxl~O7(QUK0{~KG>OLNv%il+2?23mSw1%12tHq@=c_`PGg z=zlfSl&yx!b-R8~h)6ecab{>auSgLpRxT_1e*UcGV$fmbv(~z>BLGq(uY8v$x$fsq z!6ph{@v@+^-wI`ni$?nlE*q^60S!^B!c)gr6h1K~Ji@4@}cgQ)Wyhm677 zxd|jLrfHJ?*GfY_tOP^3&|g`lEtnORHiLuTGsDe6+14=>iph7Rb5RP=Nvux_-k#8j z_hltBee5?hzTYzND+puXx`QuzM1%p@(4%OiFu*KlpB>@}F19?65tN9_!%HWoYMK5A zvM6ua(Z*(zw$E<5VEi7S^M}o!qwJ~?0ExaZbjxjqai~4VoZaT5BSZZAlQQ44g zhtaVLI{nX^UWmokmqzM%<;$8mS$$jE>pzpTGQEU0ch6Gl0$>1wW`LX%xUG-v+I8Df zk|5J4rN0oSYGNaDpeAkpAnG&Ol~-Ot?tsc*m*W#|!mXm|A!G2bm!0`p%6q$4T>r6^ z{c`kZqCOpv<77qkWqn|0M?f6hAVrI>Jg*-tun3GpM%#z8r$!%#{aV^>rp}X= z@Ft7IYz$?2FX%cZ6d5xsOJMi@(w?bMb}6x0hM~GWLioQUI=u2@AB}#=nfrNmoG`A3 z86$NLLRdwm+q7ytVD|55mVnDQejXwkD4=Dx>LFad|LyWlXSeu9cWR0`!*HKzvx|qR^mQf?J)*bA5pW$3r3oy9}Rde>4^kG1S@4#jmP`)fLTx zGm8sJEAE6n2q>8p)?#qTen#?)k;uTUqrPK1VHQ+91R#mhq3)lyMiyD>ZNcvDgw6#4 zTp}C%^XX>+b97d)p3}t@7)cXuVljKM{gg0^3^}omkUUv#XRrG(v)JM8xpSdY}`n< z6kUS=;s8b~CG?l^8Ty|3#Bf~sI^TGKT##*lt}-g*f3pH5k0sPGQ1V3S<@9+LsIR68 z1E3w5%5$LZ@~&&@FXuf8hX8%e&P-J9EVGRXu^ATQaNg~Z;5 z?{zYEg^@Phqk){t5ShQxowy-^zKL*%At+DD=`=(lU<=OXWljLIWmFM~!r{^%RhCu_ z;}IDTzV*``T;^chQJA)rhzQ*@`Md}FnP^ybIJ0sV1VJ*on~!#KZ#XX3A5q$kTSPqu zbXoEu)=iB1ZGy(q$q8y4Yg8S!d`P1C6L4%5x5c#`eaOJJBz`zUZ5SQw3Y|TX$6y;v z5Ac6}DzNOp4jglPO?tv~o0EZq!Cd*tnX3~+Irk6DW0)>zj>n;{kwwcko~P--p8k0wE)h?bH>#U_4w4Cx^9G5I1TuU5DBV*YfF~_$ zs^dlsy{U?h=|tz3n%P_mm2%`6;8ITLodjwTL5Q3LQn?tU_B5rK1p46WUyh#O1UfER zy9seawkHE9Iso(}n85PZ{V;f%6$P=ME5 z74@!z5Ez2R#*o3LDk--fBAZRG4SyP7)n8o zCjbT?Q=b%}{p?fT;B8=7y`|*VMr5_(q{_aXt?-^3exI44dR=t`4w#%(+?m6*ljsnq z7lWXt6(iHP*uCm@ucy9%GSkB-Y;gPo{-lfYD?`Z8uYX>hghpIdKs>S;sVe8iMKw+5 zKZdb5j?QMUe8D5wMz%@Aoz`8Ze2f95wIWwGS)D_0;G;o1yFr6O!*}lOt#6S7gIeu% zk0+D4YpJb&$-Q8&7i4?}fN8iR>n7aR?{pz#AE`;0^34J~>nxxPDY2$z#b43AsvrBA zIfoG({NmWT@qteUcs&2~aiY`FUSeqb6dL=|mCj_Z?;fY(_( zFq2hA`RX0l!27?#n-{805ymI=rr>72dQRcPqMDh86AMh*=c@=#u8)Pq$tJ;8@a<9g zR!db&PB`gF5izU{%zbmqa(4>x8$AQ|U(W&aLZ^Cps7_Z*w0R|#s|o6>{gxfE*;y`s zB;$XWh-Gjj{qOQ~X(Q=ePl8LukH-L<4tc;Ma>ZF*{F^J<&F@gmrAC};VzHl=~p1tH`Ogliv_MNnu=qC8@eumLy#yJEVHwmRLMaC z|0)r>Nu3^?FoY>lH6l|2JZ@&*&U<$}c0UA56azbogY*)Kq*=1JsN0v*L0&B5hnQHz7)$I zD?Luz`=u&#Anoe!%am3oiMhkv-s5@{9eVj&@=V?*^Uk$LF)C)aFOeFF@zkfC&~Qn7 zZMDoDGE`m`!5a4E6W25?Mlz~O@JsmPFR(KHW<49!onhC)o|R~2Fy=}9>s}u!-3d^m zN)J0!>CN5>OP{qkM(ebgb%Z0V91_N1?Iu{oex@1wNQ1fY$O4?ew@PUNT!O0`4Z}f+ z4o#P|-7onap}c^tMzNHvkjkmbZ(QlQ&HAUSl8A6j10I%e3lM$bHQKL^JhVuPv+ac}B49s~*h1HiLYBSy_u)wqvy7W65)gtazZR-!{5 zDSTAbi_rHx79~)Vgd0D0Jb8FB`)LP_-Qs6yu_~(OgJKd%f1VzD;w`Ov|SCze^FjAz(|N zvakU2o}z&ZHm==VTa4+Q$NKifm{LFO45YpZqa(?yef}p< zlS%gF_j7oqIy29($yHA$lr^A+Z5dCX$*3&Za^;y%cCBAkNr+QWuYjyKWWqvZ7Han} z*ZetHEiHpCW^Sm80S=uDrp zHU{j87w%a4sp=!xR5xzGFTzr$HHBp7Avr9dK~4s4=qF(v(rEBYF|k&IP2636vr7d6 zQU@lGhq9uP+C;%(S??n?2X8m8#7`qi{*Y>_-6CwDJH8rW4w(0y#ubi2J1J@2)K_fD zjca5p55;U*Bq?3%@H=CuKRp%Pm$3W*^Wf}z!={iQ|RQf{vOmC&iy#8!{>RZPnjZ4*P{;!AqH%*ONGkq@b zrV`Xhp`LKY!jdW9wGarYckdPC6DI>F)A6?WVQSFmX0{vm;RRF7ukN1vvgj*Pa7yR$ zRG}4%>132?7J?BhiVS+zbkWkxS_ABHq=HM$kmT$>B2{vMgYN68#bZ8mOMilMN(F_U z;Nr9uwgJ`FsRUv!XEh?ezqEp_!{@nB2)jh~Lw)P?*8h<9R#*TL`AdX%eA`qu^DRx^ zcxft#XIU&+tYx?a2l!BVX8BBR$J{{N@^(IJQw#2sj&^tA5=h2e-rm1Ps{FjtDR{i7 zd>DC7q}ALGL0T~|f>2b+o{C8LA=Q z+hpxZ#Hth$)xLwZr$2$jqg~rCNYK$SjEumsB`%tV3MAt4u3i zB|enZR}?vpg9dw!n`xjpw^509ToOSd%pO6M(zN^zmWgKkxnh>#%SZ|9vzo@I&g6)g=7 zEB(f^*a{!kVl$a!X&HNDgdp`jO*tKr$2?@s57=12jIj#3qROO=i z9T5aj+04kcBsB>K_vei=Xs7mh~z8M!ANF@kX}^W;$w z`A;C75^=hr4fD*r4w3?mWM`e%SeCP~B>&fBzg8z@mR57t#02rd9u!a-^pS1hfiYs!&EogHKor|u~Q$KcaR7WU5DsOawG`Fv@u7S zPE!N6&#l&t4GyqI5dJ_olXFJwJ>bi8v%9Snc+eYb7uaOIkP$w0WK~DtI6<65k^pjC z_gZaKrVsh7)E!NmZ^_3U7j^5EDY2 z1j<4l21L^uHt&BM{iIomWB)&5qMLX(jc-A}xN8LjW5~kNI8cNgaC6BBkzHN#GKd_C za}9+?tI0bV$Adct0CrRpILWv`OCZixI=*t}wh32!OO@+ni#cduSUMtb?AKF#rLqN# z+@HEstK|J*Z@jw@%!ovJ@P~3A%!GQ0HWIi&VI9NVv)w-qQo3TrWFE-4dSZFOfr125 zec75vBODN!w)vSKI8Ii$z@(q;XD!KMH;c9jfnLv_lP@GB0wT~~egMaRHf&BErq`}+kM@*Kgr=Jd=P^~bKKU{PC zU~(S80_ZMcPOFYsJb+N{1i|{>E1By#8K|W@pDlqszooLeoVZb~H(w!|_O}$w69}p8 zwZj7CC-(mVEu*M%*bB2d3Wx?SH$bv<%~1FC$Rf3(|O00 z>0eUbqSJsrd#~V`x|{Z%UY`WTdFQWRiG(|0H7eq){E!OAa(5tWCK%7b>{0#6?4u;+ zPNH=7o!><@?T6GZM?6<0g;kx=He+Bs&N7Ry0!I9#NnK|JTh+!aWJmN(XJn(xOL8yt zL|i5gB=}J~pmHDX5l!wD;r1YNmsqYgUeib-{iBZ91L?In^B>r94k`~Pyzn(1h7;YW zn;V3~>6v6c(&ZQ;1gOl6SR02}L7C`{e@6YgHCV?aAu}4|wF=*x=I;?QqSX2A34*J$ zloe=1ohxy{gqr82pP04TbJ+o2!p>B8`|t(`*pSNAKjL+EiVnJ1bl?UPu(+`YaP6sX zgs_6eC3w=gaFAGfu?&B%2LTZg6HEk&L?ql%XR}DJjh_tYR+^fBd+~Qsj+x` z@CeV6BW>S=7gvDoV{X*9kr<7dKa-VUSEEEYeU&H*AqKI z^SL{)`{!UUV=GTtf$`U(+gEBRRin2?QZ{k^KTziG3Ox_VV-o;6oJuVu;bmu4aR__icD`}G`OQU zRXx+RmWY(`?J-CWl$D1VI=&9C5*7fs))W2W>QeY-1u?qv*{6;#yM7l4q|K?6;?YqR| z0Q>!@xfbF!=nrTcseXM0DT13_dsIXuOL<^(;Y$cH;AnwoY8{WRsMOVkxWP0M;da8d z`tb@sZUxBFcBnKJQnhS3RyC2t<667UKt+057LF}~do`|#r5Ddq#GfW}cLD<|X!2UF zPYyO_08K+Na}O5(xX+8`%(D?@WKTf=!;REnHzXId=2ddgF&`L=Rglq|0V3n^b~d_x z!_YQ_<`qo=I^CCemIbfKxTeU{5BZVSI-GdbIAXO?M`RN9Q?+tQlUePU2R8LC`|3mP zQo(n}PZFF>JR<%rhigSJil`s?8D-~%y5F8^(#L?WF8q6Zdddbi^F(gWo|!!jc|u!!TN9l7~clOdZ84P)lt;bG}5B|EYkaL+rKUH%R#Dmqi=6izrhZHLN3fEU+{ z?eHE?PZZCnIUZt7eP}H6dTEElUmv`Zp#P|ndkP@90HI-!;_;e_@?4Z8-UBTJ6Ptaq zwd)jMOJdQyVU&;SJj+x^3>h#>ivhzXXmb9Th6ya-lPfgSO1Hj;*m{}2@jLxk1-mO} znq(F%t=!oPJJhs9F1N8upz0)J8hLNIX%$89YKHs#vL9)XVFgYl>=M>F(B|H~wji3tog&MaF7@(dIL-yV{zja*J zAsl2%Q+ObB`lnylz5&*smOctg*-xZ^+$f7z8DXab2w;o+cp0-4Xo5=u{FEKnq$^$5 zp^&Lel-|p;^b6ijMc|2Boxsoqn>O~U{?Gp)>0+ZX5I9Npr1(Jl@_6a*#ZhbGY@nEE zh{cKb7wVor%^(tmlmc(>K%u&Z2GFpjkTqjl%mNdS!vvIWi zWXtz}&2?)vQ#=Gl9l&`2kYOCLrI5dToFG)rcH68uzYc>4>=|HXDz*hskFP0~3C+Mn zXgAk%t4PF@tL|nTJ2UM)YdRN}aImQ;C%wN(4HUYIU*YFcz(y>_=n1mnXPgEj%ItCxh zAjVxwWRJ5yb>08L2?Q&OUiI@=F~q^BodA%nvL+*Ld++@Al6gnf9eBM?$OW#a$5(p! z5C+3}IvDAzj~{hOQ`UTb^}MKTSDP0WG=O>(q#toQzD5V=qEpjK>%)W#sySESWKnhw z6no45L=Y-bN(mw+cce%WHc-S97Vy4YOl-UEq7mKLB)3aK|*-ThlK- zSgp7ckCtaai+66p)ZkwZ!gYc6dzT;nEl0M6f=B|0Y1=UhsAgogC^yL@oBsIhgKF0T zC9Lmg*t9GF?os6!vB1%O)sbxCU9cwDn|s1yiD3_GVc(c4B{sMrvOBDP;dKV5yfeKSH5pmQ-a9tq2UU3pBQyDH@Fg`akZl zAS46>QNxn3g$v3P-^!tZj%h~?^YfTiUl$_}Qugp^fG+HCZ#GEaC*BiC%?CUL)qdV@ z6wh=sJL&AgIOd$2ZPsM;VOu3tm0=>;AP3c^Adl{!n z{y`!2pjL!^*d3VIh` zxL;;1cZ-RGwnq!-(Nqi*mp@E(cWE@v+>w!zPy&gU!WSw5#0^GY!4`Lf*1C(e<`{+L zS%mOeMz7~Dl_Hvad&2LxmWHIs-Y|#4Z_HV zkBn!^nGD;~Vag~IrQNj;2ltr4yZ4pKq3Z?R69+Ev?3$09hYNt21Smq5v( z^uU&%vwLYA{M+O7rnA7`HaemkE+k-fherI%YwQ+0&0chY7jJOsq!gE<>HgbLQLnL_ zMD@{2w9e6Jf*{zhBzRLM0ol$CV*(Ea6$a zkAkVqq8C z1vvMwKc-6xu3iHwa{PGP*j*hCB*5-(xi}7^@$m&O7DX9V9UcZoS>i3vSg21gOW=x!V+sEPy!snH*Ub~6Ieue zgV%u@kH#l7xb3A_x?hfc9bNZO~LP~%faKB-buMA+0 z=8MA@I)$3np@e!5-k_cgiHPd}FOVLJTML@J2ZBXCzYx{!y}N{HBf7mIiwUBSqy~)a z`f!Ef{xJ#AZ_jyzDsSNW#Hmi|PrB%7vn8d>-&l@cMhW+LBk-Z6?FfvELi49R;la;Z zpRT|r;J-mI$9WWlv!NJK^KdoWkkx2z<&6%=d^rSUFs!FHF)?zJw7;aY7WUNgPc-sN zU55;HcDf~yY+jSyyucmuy)76au5h-!z3|b)zp{I^5L4xxCOloP6ox z2fnt480I&Fqw+cjE~vw=5Ul816zyzEs(CJU_hStfE92A*sxjR3Mlx@5iy?m_ku_8h zQA}mS)gS12|6 zF+?vQpi+JX+H1bm&3^A%b?pbNTZ>q;e<$dI=(&OZs@c)o=)}Q>jAInfqYs|}X7(>F$m8pvJhQ(X2l%b z7VK2n_neNaiI=fUqTnKm3>tfb-DWD#hBaCbQn7e!0#gS}(wA-1?ch;6XmJynqD^XQ zy6A|CCsybal7vvwtPqCLLwCHa^*jJlQAo=cE>uyJF+>i6DXaVp#7NzGc=|C-C&X_9 z!V5HgB~RNqTo^ruV+>xUXQ(6g&IMtvx;J%v7qJHiFS>P)_^zK$oz+YJBM+9Ty=1zx zbEJs2Lg)|x|LQGFs~Jt4WG~C35Q(e)tB_XUo1uUh>dFXo?WnWBCxqvQaX2|wdtA#f5l%R%>m6h>!Lco`S8TGL5Cg;qd zW0Luu_i+iHYLLr$)v;@O&s*yWRk)lm#+u^VT>eRXdu%NBJsJ*oZqRfXa%^qYqVf*f z_*uyH^6FApi!v3-Pxq<9Ig9r&Pg&hiwx%`jlT|RC0UB{O0)qyuyMbM37zQ(D>M;}N zG9&+CfTcQUNY1XvE0DpMhWr2Di}Y({Z@9Z2MeDoSV<;#xx=_%);GeN8m^zK-O{wNh z!biaOs^V0pkct$6d!b-zyLtwIOTMsZ25=}O;`lrE>uc$skfkx?vT6v%%AA^2IZ~mZ zXX9)B3ta?%r_kCzp=ZQ@kVal_S9isr4?7N%{aLVe*$m|B)kbQaoBLsTs@GXX3e->6 zG*Hl1jtV*#tEmt-J{(zi_7`T}eN$AF{EXF(6?cp_B+|EKuBAxn4xb8HOoY|($D)H5 zs_beLvaUF5JIxPl&L8qHW@h-`E`JIemMFeac7A2Q_N;jlYdRyqw@!?>#P2{`OT3;V z!eT-@Su_W~*W39&gpUxAb zk{HE_Lvi{p zgWn=S$GJgnxCZ44#jRkbGnt<{aPC-(EALWHK9~I5@o?^93zOpx(n63z)tx{D>YvF; z6IPBLh?@hBiOSeYNl#zesI1hr0Oa2sejkoE<>gn27^N!-Cafwsp*HS@(7u_69oc(+ z8eFIbK=qHB7d6oksSZR9{Nx-9tMkWQNxK2cE;RHAM%z+ssJ1n-hZbTECiDK2{X3=6 znVCNr;MH9n2Jw!4pl4|C$}qZX(_4yKSqQAvQB7GY(>K`XU^)BI95lYYB6Yl!4pj2K zoPtg(0Pj;-fG=BCw6*S^l4j}D_%~Xs0LEc-OoW?YyVE%wbZ)lL=;Ti9H*P#r%=b%) z`28T47m;i)-hkF`1vUKFZj##gx@6;*;Y12-*sq?$4w`vV8^M)W{o>HBch$XNk4 zLhR|x)2g1nt3kdC_e90hY`1)=-LXDffv8fU0hK2#k#ZO_wD=z0**MHw%v&N~9IA^Q zaJcX)!-ek(X#GZY`bGQBK*suL4x*D|K}|<#31a1AHvsR5w71u1{GQDPs@m}J?NEL| zA_Vi5 z(C{;fy^ewYwvvyArb=T4!<~M1o0OFElOh`nIP^uUqSux9MI!wPMN#9Wv2QBWN#Gyx zWiAA$W#FWs572G#$c@p;yRs~}W>_UMXkQ?zTYVtVhFUgm{-MV0ruf0RdI zRmUQ1cy%D@`TP%bZd!>3gAkIXt7TTffn_c9JPB=1jKdVjo=pgUPe-A3xe%>vn$Cd^ zZQE=uC6mO~ z+p$NSRX;>N#L%`5!f+23S24>=B8`J=Ud&b{S6C0~cX+j-Lo7~LG!aJ0z~34@s=SQm zmQ5jk?B5Vl8ksdV zE{{|ND^s!7ENJgLfi)7O6!1EJmu&}gARvMcX{Y2aDAr6Q#WS4f$EMjtV>FJT*D0hy zHBP`-YfUctO50agT7yp*+Nqe2XuA^eCX^z1F}QnZO%aP79(+RT*?VzAUdIJFp;3bv zQ**o#jjH(N{rl(y44}+~Vve{q=^H-vWm)%s2|kfGq9n4-M`XNXo1O@O8GRRV@~Y6b z9y>g7ST}8sO09`M^)5ahFylWKb;5WAy?cFIVTwfDRiR$CX<EDU%Wwa3w-?-&)0SlTf z3GzZja&y!^YM=f}Z?DOW?jQ4mGqauklG{D7D~h3s~4|k`+Ua3>;LU@r{~`F8{3{se7ln709YX(M2oOX z8xT%OlFPG%0=Mv+*Uzf%l+k(hKSEu30|_+e4} ze%T+DM!?S6B~&5*7BC1w)g6m zD}fWS*oREW$`RUh z*SrcSt#ux=?6$YZ==o8*%?n&xc!)vreY%90t)zMuvZ3#m3A1HZ9g$}TSKG=T8jK5{ z{Ay3tg%j=9TYp329mnWE+zF#^#x>n8~o&@W5Q$@Xf-gp9hdlov}EqL$j*Qu*6 zM{Jw{H$9wucozBxu$mRr#ZsB4c}cfe694g4Vs}H|lO5!Vj?^lmrdeifcxG<63M7|| z5FW%^!~CLg>|YSFLJ4q<@qMs(4Wt4*m8u4_9>QjfO@2hLN?#KInZoMXGydvWR=J*~ zwX^iBau|{3C5HK>x~SPw;ueW5k1RQf1a9coXt@6YbW;aCyI>&{XkGICzag7+4djpN zqEu5&YytQ>>7S}KFtk-6IIsc7g}rIIWi?5_M62CJp{Yf8*VFZuHODbH!oS~g;lp`2 zob95di^QEHo`-pw5g39#(QsOxXH<|7-DG10Bu+F^Vt zNLqk=ktBo(K2Ro~>A8Rs2_SvpNXmdsr0WQwZ(ayQu6;(vl_P%hRl@dBItqh=d}@>wNkqzc z9yZIl7sBH{+QO;(joCth`QYUE?2z}clztWp83P%t@!CfA8OEVEepy(Np+(I|cRr9x z@N(EdtaOfaDMRTEAu#xP3AuQB?UO-r(-ygd*j-PX{uA+K>aF#K9Of|w-Z43%;f(^s zYR^H%3?Jl&T13)5WLtj=;&GF5XL8-AH*OF<$GT$T)<0k-d%Cg=A~BStP3>x~D5W8% ztnu6VDF`AACy59*>He#J$l!t9)wE8PH&7yu}i z;G?)evfzk7WM;hUm98Z<%HIp*!(NU#l?*V+8qfb>9$+qWf@KxXr3HD$rIV!SY3LtLh?FHGg{f8{Ul&LU z6|z*vhR4X3rJzU>ffDYQYZ{WWK{9es#wfsr+@ z5G3Smv;xy?MVL*aEAhabiy&NM5Tcgz(~NnfqeK}!BZX6k^3eY3CtK>Wa-5UEwLdve zxV^{f-!Le(GA9)N0f#mTPujoE)Z_?eT65fZ%u6pl!V^l~M*?l73060s+0WsRR#<47 zC2@u1JceP2Bny`$L43aR^Ty|W;8})iCqlJpxa5-25?P#}{j*{@)Pm|#TgAk4+jgT} z7DHgROVhaMUn*}Un~(-8;{JIqAlcC|`}*O6uki5?0tE6*!J&9;V&b<;%5(C>0g(18 z>SeTMaAJY??g~^{5t#34yN0Mi;cK%JkqLy+3!#_>FkiaEoM?uZU6a_avGv&8f~8QT zP3@flQVG#@Z7CF9=N^0@0$V-0_gzOJQ=xfytnPkw8&?{BjR>FzXWkLiGpIBYKLd9g zXM_M-RuH=+=>EAXEv;gIhgcb8`(rvx^f>+dlE3*j$urwlAUOEqT&_d>@PK!Gg#tEB zy2W~-e?;NIg-xh5!OkJ*Xc|ehS2nFsX});A=DTh}=pwkG!+QZ*+Kdm2gkp(oUO~5@ z7)sO(&nNBVXle`4(k!x>JO`sc{W3I1Hse zWg>oQ4690wtk}O4$0W&gMgI)3G7LA2!$dqo#?@QdDM=29_DG^Oxk9-P!w~8SaM;PLp2D7*pczE)rAA|8^w2JCHK+iD+#7k%jA2b3^GnT{ z{r7*hS<*ToCkNqg+8Kjlv~Uo@4&s*u2px|gcsvF+zOS9Z{c%?6qNC#XEp3P3`$Go9 ziQ(@KGZuA~+hPHv@~#RQI@F<%t_3d+Ewy)hh!(D!u;C>M>9NGxCeG1^y&Q;Ja@*WsA{D_`l)dr-vtFt+^f}v2@FFqtu6D*;xXwEtU(1` ztWau2YZ^(5%?EuLw);6I{+y-=8Xnr$x+2L8f^*f2-cI*Ouj5AP^Jq|?MA7C5Lu`oK zdgYvX^y7A+ZWwYdHzWmYhcC!Kq%RfGU6uglNdSv_aUlUp&(|kYijVbY=(LlbuzuOp z!8Mp^v9S4SDRn|MWpbRgw%cC4LZ#v}lBv65F0hh>iHs|g1mMR8Y> z7Ye_5?Gvx~M@yVGVhDh9Rc~HiD72;D8&kACd``fvf4<4k>lD2G957Sb8=jj-zbKQ9K;p=Nh479`fy0QMN($KOBf}ZIw z(j;|2CiU_|7-_WRgbw?r!Q&j5tvr!iN<^V#k8Fl;Nd?`;BCU%ysT&+48DW{2O4JfK zT(F#E0@063}YmD?Wm@1n%f0 znihw{hBh{sJm|rlA*^MHYjN+j!4d=SepxmZS9n0!eWo|N=ia+Cl$j0Nd_>u-&d?Z& zMoZE!awjgGzr;A0?bjUve(Voeu>!yf)s?FC=zI*gkF>LC;JNRw{rkX?&PGTYUulj9Z?gctDc8HQ`yo#tag8)vn_o@=)r6v6DoKG?0IV88 zMFBxOrrSdU73>72pBj~cyt8;uh{}X11I=QVFR^W_xLp3al(BQ!0MybzcZym+ejtT` zpRd#J@6JVk3@HFH;Dkg@BuIwczQZ~^9Z^8D%)CxVfyqZtgNnBQUl}B!RT+a(#1p?b z{b;>(i7@P6&RpV-t_R7vLM75niFU|;h|G)>f*r&2etkYS|Ap4MXW3j{X)m5@5r||;V%#BM_9kOwD2U0ylx!b~A>QLnurQ;Y>P8peJ z78YfZ^)|KI4Ifp(X6Z=CFM(F;HmIqiIIzlm;xC-g8$b!i;TqKxZBi?CMQ7s2UnHY} z%hPpTsT~kyx)@zeIWjYsSX|^Wyvh5XM^Dv%qkz$SBi%db{+P>MUL0#X86}FNPa8_@ z4bVKJ30DXRJWdL7pgUOg`2ojA2F zse74}dPYz{iTCM*J`j@=2K~W>4f$t)2lE9bI|oPn@--MY@{`V64~6(G8dd`>ViwUMyF(8%>94rRDB zU3#CFqlCJJ4OBh6MTPu6r@zLAh@w1Y<}Bid2bJ)rNRrfPzPiUyqvL1)vn$SLP@kxq zeTnldJ*5^N>T@+07s)vcE}?wfKPrc@q@~RI3nu|(u04NdRXehWa-!O!G#7NjC)Qs4 zfu=axLs#<)6JDH)<^2_Mh)a0^riP8RBt)kwXNb!q+^2y(OCadkc~TehuEx_IUEL?< z>qo2j+YsclKNxjIF2dW9SdIFZSB+KA+%9)86KuD<+1^nfn=y+AfMnzEW1`NEfTIWh z>a`$EQNTuU5l)N~j`)guNWnkq$XO(l$*ZGRJ!;A9wQ1sVrcLEvz7PR2n+0s{dE(}$ zOC5gaL_ZN%a#zws&{nuEo4A{975mxQ-zf)`&z{oBf7sPjL3ZRocs1**RYpmhc3aAuyctB!Ht^6(dsr~r|O z&)8ERl)W=@HYilIjHtzp8oTc>Y=E9naG^W}1F9o6n?woD@;0qU1*WU&_H<> zD34dgq&6Ynkuqb(t34VE!4a`ULakt-1C$H-lg7||ux7-sc#0$nkMFBLTjUwg|OL@Ob=GjMC9R1A0V#J`^C``g?q8HdK-Jfz=M1F|vw)+Ohw(!2D~sp!K| z^RR+BB}=SwB)N60XKVT{R>X@8N+K>-WWgVC1XYCXhOaq8ozH97!@i+|5R+2uRZP0f z2SgC?ABd&#crFk7J@Q~OKg(EiO0pjaE31f|n?C_RzbXL&`lQy!?=Gl;;??N zZ=AmvqTo(@Lgfk<$2Dl^IpI(F3xy5d4%&(Yg*`rV1A4U4^to2_OoeTspN~=dxc48i zk>W9TZ)3eN-}*<5E^HMWUkNuJD?P*`3yQSlOSiz7#S~b6G|)pQ*-&L`0vA;+$M18S zQ1cr`sG2yY=&lGhNlu~~uqex=HBY6Ao+>l;36 zRE?0z2(L2Um~By~^>7jT!xaT2F zvvmcSnU^k?4y2R1F-4Bxf+)}5CkWM*LL~bY4aXHW#bt>7AA`Vu8khP%Xb2SJ{Q@^MzF5vR80M)GyFF>o*Cx&x;9zwyF-`~3S~Ha zSg)rozreo{g6en_0z};6Mo5F1$DC?waz0OqYOJL!37cf)0jv0D+P^&i%zmvcb9jOX z@XgeWO93fn^_C*wf6Y?`4-w*EiqeP!1OqSyt;%LrPx$V&4y$J8a)d1?)AhK!(<=O5 z;5lEKRhKO=3C?8>M-`7B$g$v$2HGhurL)_2R!lGMS6_Isr+;VMqNGDYht>ne{qI+N zINPD2bPOAHB^gx-smho=x=m;G%MN?yJ2~GGqJdNFJxRzavhz^sw-Sb4%K7{%3wi+w=1A+!ir#sg{D2pt$c3 z{RJveFtjy15ww8n^VU`pX@7Q#f7^AAFk3bZfkcBZf@M-Xel?Vi{NS^W+{uhYBrhhnDz&c9O1{q7LqW@|ka0pNX|FKma7GT0%ecc`$9Md&zV z3T)b3GE_$wh?2ljPF$}1^~)6zJlwy6Rz7WdV}-*jzhzHN0j;C9>RlgHj#D_!U+K+9 z_)r4%xK)YDuWd%!blmS23}_E#FBccIv8ECJYsPCC|fw6A+~@NJ7*|~ulT$x-NJS$OJ$^$+>4EQNy|l62qY>z@&BK0xP*W5zAHJLv9KoRWU#*4 zUh+T~FJI@XaZV4KEd278rlqHO zYrR5u;ju27ndmP;Xt`gDybHHL6Nm{b942Thy883^;O=h7ps$h8m)Y=q;&u?pVz6ot z_E|%kG=TY2@TnEn?PI0c(}ZDpT)FD*WP?n5gn%cKHXxR&&J)COD(HaOaj<TaJ{EqvdobWlxh51!cIt@uNowMD_j`sfR@CkA&5GNoIR1F+Qm;b% z5>l;1R)m?B@cuCq%LOshX=g4BhwznC5_$?n1gZ&625+B!y4mxPSAlEF`(Q-r3nDjn zvPQt@wxJO*4P|)HSu}_)tf&u18o2%&^-;1CQckvQ_Ec2=P&Q&NL(b*A5bj~VO@lT$ zIsBs(nNnN8;;3PJ%CaBMN}gu`#rxfdO$a6@3zoGA-`dz5+0_Ta%y^p>F)VeRp_pnK z`e1nXk5fuwsWQ;GBOPgcd=~Fc6utxg#9Q2B_l%68WOTM;^KfQJuLH5l^pBJ)l^!xM zeEHdIHGo~!Gb+|xDZq9_x>#1rZ~M6kZQ}!VmY3UGi^vDtR;{%AAA4JMoT*J z@%?OyDUvZ`HAMmpvFe7Q=63OOAbbKY8f+w`HlNmeug~$sZSwK=2}dHKkN(?Uz8%`f zmL-&n{iRx>zvtHP+DQgqJK8hhZmAq-?F!fwigQjk-R1*e zK^CdFbI6+W)4AwK*ud(OY*iAWh%s?r!;-6O-|By2XtCsmr|^?OnK6JxwT0nlsmiY= z@ZEceig%ESiPKPq!|yVJ?+FY=2In0@j!G75#Es3;JCZe|RrR*Iwfq(csuqHv$CK6p zn{EAy83Rkn`0imltH?-xyPAn5xj%K7b8A#fTLU!tmk$>6E~_#7ufv-_1% zkBAT$0)-XL?_(6GgZCJ@xO-eA*3Dp_`y0$klu8($>*@yZTaeT97qXaUx-EP}XTj1? zaGDlPE^-Zua(a-G@^Z@k&teFwm{ zMjG--wP<_clHX4K;Ke*~Q=Klza*Q;f#t9K*93sf?`Q{gVyf(AB>x{N_Z!QB_o|ay} zF8%42yBHU}wDruW=V;`St+Gt7jT(iOLATKdJrC; z5qTD!HT+kQ-VG0{H&`|NeL9NOR=5;`PSg4Lh|{bCuO-p#sFyHiYK+y~K-(W)0W=@@ z2B)!DQJ1z8=|APpI7(v#0PuMNtOEabcLS5}2uM!|i z+kg@Qxlg0}q#+Nb69a)lMIO)F5gcron8vJq9mgG`G%_f&8CQ^DabuhS0yOR1yJtw! ziXv&XX_KOZ7Lm=OJ;QZr$N-_%E&-?G@ka6$6>R(Jk(U(BZcXb9W!A~`;NSTt_3FlW z7Lb{2RMS!@Iz)&hJm+SFy?m|Gmz;l(PWu@quvh}sbepbOHwNK`-hO-rLIwvU)i?{< z;(xiQ$%{thkyWS(ZA)u(LIF;jPpGvJm?+a6ux0Mdwd-MO*YMDNs)D&zzHX!V7x20w1{W`8rrJi|G1e`jtBtuyjZTT4UEY zM$BPu3E1ooW-1s~vEVq0Rt^}eFzHU(3!3||#0Z7$#U=PRamB=gZccRZ?s4>^Qhjv6 z^5JXT>Yz(uI?zXH-8CAxJ{Da&nY&i0jREZ(C?Mf}mNOVgo7D7|hou%=yG9sPH+M3y zk%{PQF!tw9-xu>^>r3-@m2kwP%&>E~nyj(DBHQ7AhW6;bcWQBVfV4-7gm(u{< zYBoHVeSYYy-B2S^s4Y*1KEtFmGf5m%3j{0a;SO$gKz1PU&(0^^h{!4LMYIm?9w*AVqT&#i*Fh+$XJm+o09Kdl>Fi&DP-OLn`TNG5w-Z7dgT%u z5=1+d3T;3iZj(R(Md%2cmR=y8j&fybCFjEFv@33g0~W_aEO>B z@fm)+FG`ZANv4=WWpDi)HQCG@x_k`$HF3s&Re7sOnBZ<^7iNBx==4Dpti4~ONowH8 z8(Ek8VTB{UVh=TPLYLOyosO zkj_l(J$9%jp}5Oi6NX`b)=yBlu*I~DLKs-etmXXzVAf|fl{03@fG3jO_Gz>x$!O@^ z@UY|zG>oZvSzpSX`Vg-(wOoHQg8CzXWL_B=h%bf&t}Igz7}v14+(#da5(xEFDH8R- zD9kdH?1ESe9S;SsFt+$)EPd?OLHY zt)h;Ib3)(WdUzz&{K1E?bez_m5}U+v+SuY^QbII4#MFq1hsxdOFI#juwC&=WY&hgc z0od}v^^w-^mQ8tuK*Dt&8r>WppU_G2v{(M{xW&cSnj;@%YBXwHN+{$UU&ajVF2of% zM4s)z^}v130c_48bMk!08oLK6`6|F3D@vECt9zqc_ZFP_WV+V|Tn0EDGE+FBSb1SB z{~JDK>?D6>zSx(%0@P}WY;@Arr-Qc-%^ML~eavxNg7xn0m-l`H+Z;wy;ilU5&cIN< z(=Ju2KJrL~?|AhzbBUBqwuTivHgE*YNyearx)a?5+zxZH%1dL>= zj?c;&;r*ondbk<0N;1B`J04OGB=Zv^`TRHAIS)VNV=7fOqvQNo1+Q}hialerj38|x zpva9kl{lkt%)NzhDxNvdUuv(o+Oc3 z*xs}mEL;#fB1~Xx0WU00+m|lEEmXM`gSR*vu+~p#3|gqROh1$ly4eVb!`e2t`SI4c zFDfnS#DP=&95l`AX-o1BwMEi5kM5k}1Zau5|HxBYl3WOlTl#souK}2mdgHif;t6gW zwv$&#*Up?>;4WvO)VL~enk_uIahJes#Yo6_F&Pg zW&RI+%eAn{T+&W4nEf7plh_yD(=8|XJc8e2@oK@?S1N&?;Fq8=OP^bBrjG(_tGx_M zRFCVJ2AVI9Dmmvj>Gt8d7NL=}_p?`AfCO3W210`RSCL8FB=rlRtXDrO-V9vFZTp4L zKnp_!Gog82Smw3|nG!}z@4j*uJ7D2>4g+Og(=DIv6^{F7lf7xVYvS0dMR_rytdYzJ zhN{>IzC%PU@G5ndkx7=dl=pT^)*jZT1MG8H|D3?3XnR*Hnev+6{YR%szRmM>!pn6l zV!q=}x%b7SwX)UOb+08C?Qukq$KvXlxNEwISormb)d@Vk`9mJ&ewqX*UyPw~DFZ|F zwR_;8rum@M!X3?zWlDUi`#d2I1+~(ye9ZfS>}da;n!YHTEzPVS`#zyojLV7!`nY1V(j^r`04RJtN96kiB%H-Qd0K&gJ)l$%?Wpd*x4l4aJdH-d?-tISxH6n%;;YL89IN9 z&d}fWcp?xMDB?R;x6bWH!tsA_*2fHW1t{#;J~K_%VnWXh7obLsa0uR}6*2p0=2uv; zPmEE0VT;JYfwo13G>-a3g$)P;Kw@^g1AWeyVQ>vXy%sUxdWf;k6$=_mrz`=Ez~C$# zA#7}2PO@~}tXi9<0(QdVaZ{@J*-X)1L41!^A5e>|#1JFp5mFFth1?`;jb9pY2HED3 z+96j#p0;Kah=VXVjfzc?IvnRoM$P%h-=UkUU=E*ybBd9~o*VZ<$^mVXo6+%7pyZP` z2i^gM%y?Ym(P|~ zC4}!Yy>C58N;Z?+Xh>zv*!*+2>R7lUHTLD#hqz|OU?`BoG_oi-&pC2U=f^YLvyckX zCD8W@D+Q;y8?Jb*K`JSzVpHe^^Y%JcN#|Tn*s?s9@oek>oNd7y`i#R?SOld9TUTM{ z?cVZja^6dFG{&3S7Cn$gR`;RX?82w2|EE0HX=RhZ(Cd|B&Z93lLSHaI>4gP#FrwqR zt(h7UIojtnsSzG9iDd5!unPBgC)Vel8wIg7fzOcXJclaLT@Dcl1GOg^qgm-ECCqn= zy#n^!28;ShnYOxZJ%8u?wl_j<5TDRAPRMdbSkOGG>l5vWw!YR+D3nuf{Az0T(HuQl zL*M7)s z%B1&BktS(XJ{_fizKw2&KN01ql0Oc+T)PqM%W#M=ys2uFhd+Xl=e z4FlVJ|BWB|Lc?~zp#3iY5An(UDOJ8T8to?F@BU}IGjLRq1~!DImtyXHH8DSq1!#Xl|orfkOx?2?c8_U7EnuD=Nfg z==8ZjH78kM8fvH>xZa;}g(g(28Hw})OK07o{I9<*yvg_y`B<`XXd=g!_Gw%Um44@6 z*tS84FqxExj0e9}RMQai`M1s7n{uJKO|-_gWr$uoAmR z`d$JsRZ=eh6=7zM3D1}OR}SDSv=e+$8gFb9{qu8oBexv&@NG&_nn9qnn1&N-`-rS5 zJuOgz_Dp!=+4n*7+yO?+xi>Xa&2JY+;!7b=WCd0Cv8>Oh7d6z1EzP+kt7sK8Un44b@X2 z!_1Y!eASe>C2?@xXc}S!8V6Y%#Exu%9G2Jq*8H8o?jM33A*h?&EI1-8BhgXJ;BuG* z;6~NlHoW-vQdj=nQ;NQ7hOioT!$=E4J<*pmh+rt&;IN*B@8rk?WX;`5OWbP*2-kUpT;pL$V+y*0Z0p82LWg@8;C(%oRPHkaV?8y%J2 zNSlhP?{}SDUMs4QZ}B34YcF7Ecbb|KNQRazx_Tu+G6OJvhMf^Oy^mkxN<@ zvxL4bKdq#9vpqnu5HQqHNGVvevqBTzHL>BL$d*LJ?=p5^%m?`Bx3N?rIcvS_11Oz0}%yNIg8DO&p2SB1&{VdrY zijP}Fq_65hOQGTFEl3Y%Dxh*&I%6z9f}K^K=%1Nd7Im#ja++$h`qvObK|ZIvGxw1= z+O-z9RPHN+hQc%8-9mIP>C|>-*zW-?DpVtq>&nr=(%~1S)#}3Sf+#v1ZbCKod(BIg zSY~0Dx@Gw*wVOgJTOE?7V?%Tlx?>4hMJC7w{EW3vJre5~-U@g!8h*Kcw1)eX zIxKDp$CT9*J@1T5P%k-Ghw4xo&J#;ojG5}|D1vv2X*mvP`1srR{M9l9I2cyHg3sW@ z_2SA4^S*&ByqpgfLD<8WoWy>GF+%-{6Yd(BWdqnK+b>aY^eYRG*WM~SbC}{3aPt1_ z9|3H13DNsmY`w!XQW4ub)7+paw7zNo6TV3wSmL5uKm>iL_QRY<_~q%Q`7rXX|LievCk;n~O*R>gcu+j38FUVfe&WY* zT#Wn)g85>Tz9HqtfCUZ~$&JAgV!Wtu@OQ?J;@ok!Z;D=Yd%?w1*Lev2ZUO$k0(zPQ z0s{YWhP=FOgmDo-BX``w1$OtP#Hggm%MSqgWNI=v8U41OHi#s;%9OJonZ`jH;P+RH z#kbzE70!61U8#Hhcd#C-sygWn72}*CY&19Ax$hBHvBtNp(nL%(C4LT~qLC!fR2N-8>mQsY)>&ClEHnE)Q z$W26B)H?$-b@b+dncB{PJ!5=cFC2ygHRl^T&?oIq)JFTj+V^vP-8KH|XlW>4VBtd%0G8;LfaaG?Af~p7+J? z80_|h7W{~Of?IwspO06k6wO>2lv_5GWV&a^0?-l{Vr4o2;5;B3r)-|*g)=L)%m_(y z3V|XkdCziFfmV+RP`}JDTXx$*@2Ue!dKQvZ_rG$hPTTO-e%`B=uDHB28x!p5Q!j{^ zp&&CJmMh~a)co-(q`lI)1;9kv|kd{l`tf{1c%o`^DeeN^O7{8Q+$4ADYGDG6G{T3I7I(%tp@RgOPcuC zy4EMt|GDI4FFEZHO}!2QpI-3xBNup2yEql3*@tV*&cjAuiv@Mg{mRauRyiC)@=Tnm zdb)l#chII(Z3`4Qq|LY~eU7@-tnntT1uj@0TvF*ZP(<>mpA7E>EtZ;p-7ANY)W;^# z2)_heC|p13Xs{p_TdS~w_=syGww1&XOCQ(uaz;L$DFyq*ff3Hh9Y}1kuT^f)b{=|k z0^S;f!dfbM;Me3qkTx^6GkErUY$fC(f<#Woe?EW2w^0tlO{Ik-Ai;1#NMa@+Z3Cs5RfE-*GCJVF)@3Mcor_qMaZNw?HQ zkM_8Rp(y=;xqSu>wTaSrC4s@cF^=@pi-lCLsl3UYMf+Hw3EfW+5&ArvZs#>RSxY8k(hSI@B@K$8Mdy|t?J^SNHnUr#5BhrNdxkG?55IwY1fR!@dnFshW867BMVrMGj z%O9}Wf9zi~ppV?3sq^1oTWOb1B4Fs(I5u|eoMM6&98I6*KjhN3 zoGJU$ynv{hJ15HMwpnXT5`v(S1I+S2Ju~{S2FR&bv30HfFkh_Z9MQ=Un3lv4HFgc< zuZ#exl%>qz*h={ST5l4Z!1C{W6=l}w0n>U`?8YyrZyfb--cXCxaMM5h>22)7&>KNp zTwC*y-S}OM{_iIg;!5J2!C!F*fJUqmVCwCp8ch7eP6GXTHvKMq1EgSN_nk9PIW2hPHKeq^nimBMBYTD=$AVp>ZNP zjk^z+Ka)_2&RC%L{-#w>j40ecz;3SD1z-GkrOgpNY{P}N*A)*S>6I2j%^?MQky=#k z#q5d2S59+Zxw@1(05 zhH#m;MqV-bM@VMA$omJ|N>^P`L*Ur@EHclsmAoKH8LnbuSfNV>LtV|9)thw;_yH+9 zsCLl15kdtt>XOevdF{}(?QvA3Yymwt2veVz(pCH1Vya`!PT!Izx=R#lcY!R{t`LnH{Du=sw(*jCEP-5)V<5+On zsc;kSLDwhDz(4$;wJ@GY9?S`>h#&Krkju`ppQ;0^ zJ9I*%I#_VpOFiooU=<6#9E@Lj_=qliBY1u?kG%ynSvO z?<3Tw+OMOY_mrl;ZSQ~_g5Ul}#7QrG1s-2kK@aOt%&Y|lf8Zr7dE`kIkGre2twZB)*KkqZ2Tt91Czy)r@^2Kzm~q66nK4PxkHJ zTKIF9CN+FsSEz$TG8VV1=Hp`&e_k{)h5O~;`yB3?TRpwG@ z23Xg77*$c3uxsCDd+IxzzFC^-8*%A#zq1i;!vZy?dIPot{Yr?UZ0Y7)_8yqA1||W%yQ~BdZ8{q zD=?aUq>LEAl~Av7Uci4p52UifFZ$-28+LktkUE*8%FckmAH=7<5HA=aMMq2BGsslo z-t=PvW720)F4`zE7A6{m22!w&DbOi|mTk-usE>Ji#DjzS`Me66f%hXoZ#L6Nni@`( zr&x7JM(U^IhHr*)r}-9k50B$a0@KMp_QuHjF=@R1Zok}rL@fUt5yIVMW(BI5dVCys z4rfqaiupL{CEG`c4!NRy*vcqYf@rkzXTiOut296Jx9)OsYg&Y_hzdNZPP@tbEnS5#sI# zn6JOV7Hdk^5?f4b-Mp8Z8JarTGj!)mx`pEl6cON!kJi3HGeO+`X8lW3VIEp)9CP>V zD)!^CC=+6h0cqi@_~oND(*yvuAo5Diu^6pO&OrMKQ;X<1{+J^6FUu7U65}$KfH4og zEk-_0S8EG#JQX@(5?iMA1`e}pCVG-$-gbVQnl#9=t`lp6JK5f&9JH~J_UcCx$aDVB zTEuSRKY}>^zuqNC?8EB!_8Xl~NyK&trUL@3fhN9OwKFf{|2Uy zX_kY>QC#!=>$i~8rVW3uyV~59UvSD1=hux=d@ z{qdUf%NCqVk49Cwfv|i)Da2jFlqie^4}~{xj9$~gKB{^#OUnPO~ zx8B>JKW>D97 z>Y&QD$a(5%l7bW$4y(7umS3{iKy(oq5Q!_!m_p($t=KfI_xRwTD+H^q<27vt%^_*FDy z@6bz-Ztz_tyaO;1E?YA>?zL#GT=c{E<__1whkmcZ$z#j?m)vHD`hBD7!_u1raBOqs zr%|iU<^sVNv?bpoWu{K{5J(#&r9&sx>SNm%++h+DD=W&@4@RC5-lWvLhSSQckPE|e z`#*(PiBGDLs58-8e@4WkR)$afs`>Z-$`mKm@d0(1zTo;$`0}<_*3Z z^*Xf6NgX5SLdwW&J#fFvFcK*6ylVl;m2zQPX%V1tb};Oeo!N zf;F8o-V}Dz$&(5N+;_DQy#Qs2J%tyuwowNnH&HvTNIYHqLpu}Sxe7s?o{8b7PVj-# zmfe?&uU2ol%J?-nV-fp9?ql6^x7>^i;oC?wy;L};I5-09KESnzAJq96Ub?f30yFZY zoF~-PJ(#{Lt3wQyEaCEmAu^+u0KJR2=D``xQ6=Q#^X>P=ml-2-y-P=(VEYv1oBu69 z3uojJ-Lz#%rQnG=06YD{iM>9NMVC1g&{+ecn4pv!q#Z?H%8{fC-pGD=YajmzYh$i#rmPVRNHpFwx^wF-T0>7W;2s;xsN!rr zI=wQ7#Fh5}Rcw7}jdpkb*9IB*+(xv!1uS5U)wsZM<{$M&&qK=-@9vV zt^eM;g#z-a`K2+@L{tC$@u{M48~Fr!vlpJbb1l=87#U0u79E8(qsBuefsvrhCY1__ z4>U#U+3T;1j`%BC06sv$zn`EAXG2&d?6~J>)(@qUpJZ2I59`mYa{^RYrgR#%*Gyfp zDrr+CSi}nSSQ06}jBt0@VDvY*iNG7;vuvs7)@}~bd#@OiVfq3EjDoo?W|f)V@caxS zv^-KM_53hPOM;28J`>Plt)D_cKVu(MG|8R6YQyKiL{X(hN5ZBQ+=X;7ThS{hjz$A5 zi@B_C;{-+SOBpIPXkeisw{D4qU$WM}|2`Y55XDjihp)dEXrYJ(XYu$C@h1oFkHgWO zM0aX3SmWM-*qC=8PZuALiXg!@p0?Xmz1E%)WONGdmCF^yIMqog^0ar~qBRvsuyWaU z^J;!63WPW)C{RX%642^HcbXAU>f>%_{&!mmg((elw)S2^c4jIfxA+e+BL

Xj_hh!OHt@KqpBwXLLF@)*YW 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/InsertingData.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/InsertingData.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..eb57e22c458ea68c4d8816f10dd4c833f037f6fa GIT binary patch literal 8288 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/MergeCells.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/MergeCells.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..edb7c877ff13650783a7e02968df6d1563317efb GIT binary patch literal 5889 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 OZySay48QCv!2bYYeGCf# literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/Outline.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/Outline.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9c90baa4ebfa62a823c7e663ac9afa845739269f GIT binary patch literal 5724 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 b{FlauT_?hs3jhEa?%RRm%EMnfIN*N(9ImG@ literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/RightToLeft.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/RightToLeft.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1017afde96d90a8faba076bbc7fe10fcdb1b015a GIT binary patch literal 7305 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 Um_UqGs0Cmxc`2YX_ literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/SheetViews.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/SheetViews.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fd6a7797f03d375e89fd15a33e63208b587a12a9 GIT binary patch literal 10269 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Misc/ShiftingFormulas.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/ShiftingFormulas.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..377c23e64bcaecad9697b768d4a56e260ccb282d GIT binary patch literal 7048 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

FO#U;QBG78e*vr3>p zT7T2|A&eqWIfT=HtSl)(P?p`T{D+XT(l-40F+khYm{i~(#KTnfwz5fy`I_&r)wiRj|0V`_45l|0TJdf5EY}=ul+c52$?^|6# zfCR+m>g2GEBSD^M*gkeCw!;t!kZGGTisLYZA%$(P_ff9m+u!0Ss1y3wwlIMg{-n<> z_6p?rPdfc}3va=MADr~>y7+^s{WqQLgMQz;IYmIhSSJ{q#|VnW8$wZpSb_G#w*Tz1 z_Qmoi4D@e1Cs5lzv7`UVf&GKIi%b2|k?#oO-}GQx^jBT~bl>?edhuQVSB~u8UHnfz zY>R#G5wu+f2sMa^Sd738fBv+H@b{kAKB~WC{G){JeKNA!(wH!F?s`tLzt_FQdAFey zp&IVLCH7nIC7`>l#|fLYpXKy^g}vZ$w?Z!Yw!&Xv$o)EdN!)IoHxxUbd{65ArhD=w{q2K@UApZ(qModkDxe~%UL ZvnkO?kBl%v001@NT}PltqU>A0{tv^If1UsU literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Columns/ColumnCollection.xlsx b/ClosedXML_Tests/Resource/Examples/Columns/ColumnCollection.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..be26acad1d3659af8190ae3b4ad58df17bda034d GIT binary patch literal 8566 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Columns/ColumnSettings.xlsx b/ClosedXML_Tests/Resource/Examples/Columns/ColumnSettings.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ea65770a0e96abb987f31e3badfc6ab9eec7eacd GIT binary patch literal 7363 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Columns/DeletingColumns.xlsx b/ClosedXML_Tests/Resource/Examples/Columns/DeletingColumns.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..f430cbf678e7085fae00b89231da2073463c369a GIT binary patch literal 5708 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 J$7Kr+_%HLhk;4E0 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Columns/InsertColumns.xlsx b/ClosedXML_Tests/Resource/Examples/Columns/InsertColumns.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..49515b184e3fe6ce9779bc72a0773bebfd35c65c GIT binary patch literal 8523 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 CP_gU) literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Comments/AddingComments.xlsx b/ClosedXML_Tests/Resource/Examples/Comments/AddingComments.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..dde44468ee2dd28478d6c7201b4af88c6a0034fe GIT binary patch literal 30272 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 C0vu!j literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/Comments/EditingComments.xlsx b/ClosedXML_Tests/Resource/Examples/Comments/EditingComments.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b0bde502cc414bb9969adde99ddb7c62c2db2c49 GIT binary patch literal 11953 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 M5SoCFG5x&zf8~yBE&u=k literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleLowHigh.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleLowHigh.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..80e81a737135fae9a83f56dbb80eac893d44e03b GIT binary patch literal 7371 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 KCQa{J`SpLtC1Dc) literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFContains.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFContains.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8e4adf15d5878e7b6fae0fac38b2a9ce6a44abcb GIT binary patch literal 7461 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 UqhtsGV4}RAQutQ_|IXR}06&@-y8r+H literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDataBars.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDataBars.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..67dd2331e0562c4d052d2979ec565b1384fb06e2 GIT binary patch literal 7293 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 D4eyuL literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEndsWith.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEndsWith.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..80d08b70abdc1e37effccaebac46051124787f11 GIT binary patch literal 7443 zcmcJU2|SeB|HsFgooq=FV^_@B#*!ghAzUIm8M9bojG3`7T}84@kv+*)%HFkP-!qh@ zMb^m85|y$@$tZ)cJ%N#E$!>>CXmGg634+`c}=dYj@Hii^uNc$D@j+Oam@CO zf#wui#b+ymA!Es%Epi1G_cN8leFwsD4t}Gi95iJTOUy5Ftch`$%wyLAM770CjmFb= zAq$$5GDs{z&%I8<7cN{i@Y_>fAy%2k{KX_&EvvT|EZT3^npVdDW~5Fhv2Hw{DDE(9 z{jnDI>%6Q*Gi#Jnb+~@W-hC2vdps#tSabB3Lv5<|m3A(u&rOeW%cvLarB( zGvsdDlmM0prysG5Y4h*B3$fcTId}`N6U?AqyyurCM@lhr{wZT1k_;PhS&w9Br`7#5 zN)TxMU<4w03XgUpK&02te;38KH4Uoj>yh?G;|VSvSU6Zl8VVLbW04*x7pxN;>_x;# zDS_41R8OGY5JaE_!Px~z5CBZD1UT54NW`f?AOxf{+8sfV_Q0XBz%LjNygPyje8f9J za0ujSgcBMf3x&cUfH&VYz}qzi%=~cZf1>Dt!MGsN+8#(RcQlsx17XPa7GME01l|cv zgo7bF(hDr0hk}DoC@aXz!W#iqaf!fuPlplltaiMGND2R0E_7)QM`oWH zqIsetNR#GzJMV}fA2aPS`TnewDeTlfDpGCN_*BE9Lrey~Jpl76mb%9jsV|}Qad;q% z)BLcV1F?eJSd>`&Y%cgUQ|mqbrzIK!)%seU)R5m>ixD&sKI$p0(-#P1hQ51~`flg6 zRnmqG9ew{)gW#d>iWRZY1&bZ{Ofax6IH_gF8=g4gx;mB!nr5%&(i%k9l4DaEAHX%I5=R=#z|aE`EsE1g*x{A zZ|P}V7EErc5(5}zx}3H<=ly9UysrrLo>b=QG?7;`F)P^>+iuIAJ{laXX=}i6o`Z;vf$-XW2c(?Q` z|F9V`D*YQOqu|fsJVOgHi?HRT+DYjom|II-kYcwG z^JXt4@eN+aRu{L09DB}HLN>ax4B`~@pYKdsXSO*q3y+zuC09$8frIk{bQG;}Wi~9z?x1RPV%2ZEr3e-`IEK#TN4xL!ebSfm zs=(nXjdlKSciomnPp9Jgg}q&HKU^)ffJ@R|#?v)|cO&!&HbX|4klW%S9e zC(+A>H4CgjW~_4#TR3{y(O}fEQ z$gJ|Kb_y{>)#N+Dcyq&h_U}%F^y=L=3WzCM!Hr`0-+Va-pNx)EebeM0gS_hxO=ic~ z2+K3u?7t&(A)^1W6xnoHP@0o;#=2j9N4{o$IvnN*t*gQ4iyfs~@YjRA$xp_U+3biGzmgcvXU^C3rQ&TAR3G|?MNsYQKnP{1MR^R*l z4Xh{CX@%Tj&m!RthYTA!gCQFicrk5VGH&nF@v)1$_l{+M@iPk@=rPgQ+t4|nxx||B zF~GR)jtO~}F*(5a^BohhUB+So!2c#I`S%jKCHZ&_Q_Z}dCvva7=&Nf(J}HwEaDLJZ zrON-5eM5!A)vECAZ#uKak0tFXeMI!}l|k_i9nYg9DjyVIjm@5!?Y|Q4Gd>!=wpzJo z!hJbwjt3_7o}T#-$<5_a8)COYl&@!EPSu17WoQmbEQz>s&uTFlD#V2)SqF{#&0Xn6 zm87-!L=d`cskrhXr0&YkP%lT>_VO!}ox7_So+RO!H6mb3WJ?~M!lWEWG|wdWawhHJ-wi73Zz{)rP@6MP-A(d9t;koryxm7F!yG1iuUnhG z&9+*!7Lu0f#r=Uoi`bs{s9ph2<0>Vk*FZ|W96r(6cvX8Li+J^V;mqgvV=-%#+ovY4 z+p+ffK)%-O1A#a;bCw7!)6tNP^H0-t*2?hWur|-yL7`_hWW6+ug<-xS%q4TgyL?}y zf0`0UK~^)^THr zaQamH>_9MCd2J>szyH8_CO$SniHjbrHi^z%iZ}j{o%U$2yke2t9`=`v^!bg!4bNU3rXh2Nz*!5t z%p1EjhG(X16?&iJ69S5-`cjWmr-rsMG#$M&?4@{*I_7LfmF9z@@>H88S&dQwoQ3-| zcFDg`HpGUl%$$za0%qMMa+Z?|%4=vbriY4Rn@py6QjGZk8yohM=7ieZFQYl9dven5 z!U3EN=m;;mz&W&6Rg~j3MNxQ5Y=%<8uZr}2Sad+T?a1*~!5Mnqe9}^IbmkF;&iSaf zq*JO|WJo$c+&}o;G&!4m@go0chpgHNp;NhmOI^8Vf|hoFTpa8#P7k!#5b!$ttp3Y~ z{%h*_M_4j^0RWRGJ)H5(_&FP4%Xl% ziX(>Y^$hy$hY6k0jnWdUbLqcUIB1V1!^LN64qQmd5}ha%I3(z!jLWn zH)z%;&osiLS)-o^95;E>b?u^e(vC0XK zus5c?cY9wa3-U?GJu&3f{B`OmpWsUo*4d|8cHPmG6&)IT8Mw}-#7ZDUJVqPk!n8{J zlu#<~VCEqv4?kDU>64Ne&c5MjGdW|BBhNmNDH&+^R;@)TrA3 zmU_6nzg;PYvwBIV)ZVqvW{z5py8|CpM7?%w-y$qsr$$(BEvi27VG`uy!fDCCS*)$R zgUz*k)ANYQOYqF-*?eW8JLsWmk!d)8Bc@t6Vj)wFWo$v)o_?A!&0eVKNw^u!Dg{Y{ zbUAVk-8P&gKE=+$VJ@=x&P~7R6S1d@H6BEE4ZpZ&HRh3?oKt*J;H@ZE;X{2~{gn$9 z&(mn|hJGX)!JeQxRhvbLUfSl4D^$5BdwS#fF{m_O^>G~gRl>!1rnzKPCcd*mDaI?P zUv0!IwKk@0_@0fJd37Tu;mCW{vnOqs6YH$69+E76ASgc7XUFKL^v05dr*=#>IwaG; znjI6|ds{WZis0%F8MckhFe)6Hio0Z~TONZh5jgHK2|;HyhgJ_83|zg)d}FQb27gS& zV)07^d&o5Ep`Ymk zT+)!0#MBj`2i1kcNpl~aoC?5fvw4-*Uis$v)tXGsn^MNc4VbsEz)DL-S_T6C)|QCI zyMKpJTMagT`PR~x;POq@$Hzz7M{YwHKvFUgOG5+G4SFTzf+Y|USS0$Z{x^$%3b+1} zrl_f+kQ)xEAn|Af5seZ698w`};I2P@v5?c!HaiMdlZDDCNkQeLWT9p~s`Fjg9iVj>m;YE<0SbdEC_=X={~@HNx&ej056}jU`JQCE;~VJ| zsX?IiV|{U9qve4G$QJR`I>jT{{cJ7#&(mZ>@4v*2$W5Q5){QvlL*1%k%eZ)Z5dwi2fL9}cliD%#1yX$S(Vqh|*@ylARDLr8HR+ zH%rQr{Z?B354wfhz1@3%_dh%{ubJn3Kj-^=&-eMBbKZ~H5emxPAP|Ta#DgFjzqgj! zMMee!)dB|#hzI2B4)O88yPfdxaFg=IxC`X%1&Li+Z~n(uY`h7!MVd9Nn?epw@rL;{QSIkaU}@XZZ3=%+S}6%fUohU`An zE1p@9wQgaFcBu_F3f{*p-mu4$>^;jBqt#IR8t(G0Ma}uCF-{rHVjil==Jvru4A+D2 zwoeLRiBP&>o7i@L(p`uHkHo+YynYb9X33skR!)$Mb`&_80g^3m77y;G^=&3UCFKw7jB%96}z61TG))|K=LXmx#h5QAkM~9takmh(-~%_=ogB zm;t{NAaERRJ^wcy#2X@I{=H9sJ^&C5iU>!-iEs$Q1CRQ#N55MWPV!YFft-+4 zkVh%VBT)!vxV(&v0vzFtR929YmXihkQF1C$I06QVzAR^l>OVUk@wvY$Vm zHu-UlWpr|3=@f4g-I3}@xdJAeQhOzCw(eqMmfm$QoE=tI+Z6$Cj2ruQNu3H3Q)WmmRT5s8v_G;?j z!9%}2*Cu!vxnhN_4Zx!Op9scwg~xOqxWZG1UDrlaK~rqC9J&Ljx=NmMIOx>E{{Ba` z;~e8p6s#HEJ&1bJcVKGOiu1$(QwswjQnWip;v|0q-7oI_eb(b+De zFdqwsk3Kgm7hg}ttwGC)uUMQ)whvU$(FCeMpf1G&$L`IVPB;n2qmULvJWx^yKP&9e z7;WaW0<54WomE&aR6ceW^c`DBL1L%QK>mUUblLEej>?L1#=TP`IdIjnT$qir&@J37 zqnJ=ms@8=tiRlTlr^;E-aO<(4xxF?=zvPTJS5>E_U zZ=oMi4Y#P}wdsz;)J#v22ltGzY`+x7=LY3tz-2T7MU`vwQa0=A)=BE8HMTNQdp-N~ zftf1X*v>4>Y#3Ynx@ws`RW92p=$Bw1t_Qkd7A^!kg zniZYMwNZtGH@SBEac92p;d<2b0@~tTuJPDOXvC@SuvN|7a%xew9M%CTTZH6OBjbq zV6INNN$OiA(Q-E7mdLh;O)%&bIT{Gr3^fSE^fd#Be(tEB4t>M1hjCA(S%Wwp_$Xq8 zS#M@KNb09p*-1u7vRR9Ivz5p34kTe~OWK1EzvL+GFukw}+AZk6(3SSSeQ7M?^SjkR zFS&}SnNY8usjNpO&dIb6TvA>apYq+b_IUkp#nnc&|G+{&Em@mfg*~$h22_hmt+};J zl3;z6eeiTa3}&D2v)+v9LZ|0cb_KWYy0413Wsu~3Nr83fI|)6@TpypY$G45ey&`q6 z^A{!~}z4rA`IvKqiB*8W+-dvnFqn1s>f`s9s_sDzW zO2c61!($_ft`An1?oM04*rXF%Z00Tm+7;8XN!eoLEppTju3c|b>Q)8aIT}e%s}Z() zwB&xO{+iPX)bMdVJ)Kgrrw%PklQR23PhmPSF;4Q6fph`mLe{xi?7I#)(&zJ??SMS9 zeINejW5e{>skPL$DGBkyY0~Fh4+glBGVdL0z1GXhu5aVL#z*BVbbg`bFCsJ7$vVw= zT}?nQW6=;Nj}>}F?xxoAT8#7eK+&cj9lBG!>{;@_3LOj$C&LyGsd@T@Hm))wE1O)H=RSdTx)iM5Tq_#r zOlWUe{e(ZGJ8IueYCGPzQVPfy*DF@#=@nvS#TcqIn-xi4 zsl#XQtR*(1Q=M|l9K;kWo;5wzIef{4?MW@8Tjh#=a$5cE-D&;h<$PGfuttnRk!DD1 z{hCl9=D0;}bPl@3{sml$U44Sr%lgBThW%^s^ z_^XXxN61rD&hd`?y2$QM%9?AhAr)TMuC`3B^ckeFjSUz7RigIQlN>O;z@C?WiZNw5 zNg)z}VP$8z8iKh#X})>KL|PytO})LIq+}*aW7a`qK2dQ0*i>w6>{W+i)gwm=<|_y# zX#2oEHM9CTCp*j0=ausLw$CnHnCS%D!mb^N&lY+pRy%s5PwL`%ra`rfOG8|ScI2-n z1jQFhA45loXdcV`!LY~W-g{&ZYQ=MOy5A~-sc`S3gpcG;?at&^J080)wCD=E)XQ zmtk+cI>**N+H)GyJYpbnRQFb*fj`-}bvAkATjGlHZ<7IteMh;@5fdG*`-<=BZ{MRQ zyF8_xEd~}Ui($I>)J>WjZTsO^PZqS0pXa&j%S#e7(6?Q$azrt!+}n$(S6KqA07%R_ zZV-rlGdYRCY8wUFc>if$&f1!sAJW_V`M~}W`wqh_XKRxJ6Ge3Huy-YQlz)~odq8Gc zM`p&1q7sQOA)b}WQ~PB*8Ci;5B!&LR^f0hk&u1!_8Z00yrf$G{m%cl5q|3+p5&obK zmCvu!3i|lZG4iqsil0|aCDb?zviY4d-rt0HNE$ynR2wua@xqdfj*c8Bq~zH_pB$xx zvG*^Hoj~y=(axDv)0Tzg&(D@Mhc^o$y&J6D1_ZArgn@YyL7bSQuKZKjNAT{V9(y`9$is`;Vz(Cf+L z3Z$3#lz@`S-pnJEnW63UcMjbi@>04_85?q`M(1&HWv2a#taiBo&Kfg?UGXoH4Yp^k zu%e~5R{Hsg;M-Zxw@}Gv&=r%b$Ap*UUg4A`j9#HcJtH5SLE4-IhGRd-&n_{}t>MUUWJL`-Y_Z)k?g`#Y37 z@2*|ZFNeAI+RszUao)p67gK&d%)O+TtzRc(_&K`q)RQ#GhebDuQ?uCP@=o?S1s3Pv z6Y_G3|y+^V0%T`K-t}Q| zqbS}mQ5x^QA#KK}jkzKjEnHH{j=C4z+rnwg$<)n4;#*0$^mxTmfOg4OQJVwyp&+^YuO2EzC~y!xh3Pp_{6k9Tk**Y z`yba94W-S0aB(RFv(DbE&YAYT=~r()v0y>jSkvKfwsqLzBc_D2u!z^M=h^)chf~X- zP>PtkA3N9dfA?-@syd}3O!``>|1^T;FSL14eTewYJw|3BY}|J8>1 z?_;5Lbg<4WHd)3d7g9wczJVN^7v6mX1R)U+lshnQVSy!;jFb!n{H-k!g~xnnNm~sz z&U|a>OF(~<_3`nM@{!vR2FQ{O#Ky$fVgo`+qOk-b9E(7G)&FMkcNx{6LJ#S zJ9WtKt-tDg7sde4%^CgAmF1MA73H=n|1PAVzQK0B56}iw`JQCElACFjC_$k0V|{U9 zuj_#Y02R@39mWwHezxfS`)RVF_b;g-V$&zd^-vQ4YN&^DhI_da1@zZh+9tHzU}ax@ zU+)SE1_+uv8nHneA>LTz4m2sbi3kCPv;h&N2smI!ksB+0jJwpvrxXT`#va%Z25{gH z`dmk=V1a+q>DOC$9TlmVayk&#ORZ1BfVfq>wRP2=w+Z2N%(>+;$j)B31LduT z2Y_n0^Oo3Yy`6GywI%_ZwIAj5PKE7oajQZOz|8=KKS7NYb+B z!N*q9b3lN<2L2BiWT(pZ9qLw<{Y)DwJ2Pri;QJ76U+QcX;ARK?_Y0q$-EW@+w|0Mq b1N5UQ(d-BnFhU>@J@D5Ia3e~t^>6w#JrOBn%e9nU5-L&| z*|OY3gtA9U|ATJfc5nCh``y2Joind-p6}=Rp6~NL-{*PW$K=R1Ds~72LIc^0BpEJQ zN$jMcfIuq1gBh|H;^_+Wa3i=ly1BVXcw$}oGj>Bnudg=$^Izm;BV4^COHiR>YmI_- zMn06`Dz3{sF07}tsHp*3w(pYvtNd`@9II@e5Oq8E;icvNs_C}Qj|7!_QP(76813tP zEh)4L1IqkhgNZEt{b_L-by!y@9s7u7=8Q*5wkYdp3htqt7wMEQ~hf;SS z^Xe0>M=_m!?QWqm6LQVaYgcKR$i3T)UrleQW{}BH;ZD1TloHou*h~&NNsEv@Pc@ZkbV=8Xe-4QY+X?JyO@$qf4Ld z|FCg{A4gK5?X!+-^d>)q+3nrmokP&^qf;x~b#&g5Qlu&OqzM>Fy0y5hMv`;p{B#N> z1hRV2gONN*09=VMiPiJpMe##rt+Lu`q|X2ZBE}7;0+o`Ggz^J8q#Fu@b5eo2lhEP{ zP&HNMV}L7y1hyca!r+Pgpb3ts0zE|{;gw)8BJvb~MGz(2@Bj|Hf_5Wd5hU;@!3l;( zAYBkn01PfEDF*|+`Jn;btjTZgg$MqLq8l2GK?2%tNOvrNBmG1ewz&nA-yA`30!S)Q z*p~Ey^6R5ipvPnYd3h;md1(NSkdr~k%0T&H|8K4Vo+JQ=0#M?30vId;2?G!}_=j>s znt=Z&!Vq};YW}Y~NYF<~{r5io^#H)I011IYkPtAW8v*#aM}Jro0m2zD>cqdafjOe2 zWYLleiZXx{LPj15cSK7oILb>S5l94pltsZM@I)*MiT@UJc|Z|>OUlT}qZE-cl8TCJ z_XpdQW2&nO{-abttAnjif@MN!8wA1vCivD^{auz{yJBSgV6|4TR=M@X)1`}^wxD3; z=Fi|b7=2neU&qmQLB_e9i$1D>1HV@kv&1&h=vLEG<#o(HHTBA)iv2gZ@~+t2M0N39 zrip!4ZXO<+cW0F63hj}5q0+gG*0F=ouc3s~kz&W8$%)5A;!RF>ehi#x)$9$saju8D zLq~u*#kuIVx&RO3_QNur8A&6!5$c~+T>Yi*>MHO_c<>Q#zRI~D>$^efy&ao#R!P+^uDgA z6>m7+JeReiUwjhwyz{{5f+eS8H)B0LF;wVYE_8^qHdJ`GC-cZd791@0^_osRg&+VZGZFzTDa2nD z_Oq8X=)l6RQ^<;TGt<#FXqR~98Trh(R~?>{r0p%gi}%riE=v}6(rnUKzLvLYxR1Z3 zrf^s>xGIZvp%rN|8}DB9rWQMMbsyP6k)y>_M%C2(&W`Bj6RfHIetw!K4CyZJZqhWs zZ6_s5t3g}yX77(F^gcVnyX{^4j)u{^SHnvhN?4kgti`ADo}S8w4HG0jg{kp>y`h%$ z6;0r=RH4{>vkb5Fiig0PtpUp}*ZR$_SKf`&*e|PaX^h5de(Hd8S*oFpNsvh&u41fg zjxt_4^oDTRaMFtf*MkbIR&`Xgh=u?oxw6kqvvZ9z%j3P?K0G_-HA9yNWe?uwV)x=s z?)Tt&`l4T@{!FpzGY7!|ht9*6uX2MX+V|j&!vlc(Q zC2RtIzLXd+WE0yV5XNsgLh^D2ewiHA7Ohe3k}Q54PdwzXLM*qF?ZkEBEN#R?#96IG z&af6o@pNCoRTMV*AAZeor^)#00)$<_d%7iIsd08FX=QQYth;nc*hHZFi_w&)h3Hrs zJ1z{xIj+wgY?m8`qTZ65*mw#UcPZW!th5Jq5U!i+ zruopCD4ey&=c4i-MdhS$w$KWds*9-JOrU9dODh@)kMF8z9z#n%IQc2#_<@Y+WU=Gc zNmF5^$0mmo9`3fSQlXX7&LImlQ1hhY&oHQ4S5NQPpE)zIWLT>2k3Kv!5aax0VfNv; znLVpyOuhB{t7mNrXjmnVV`a?J4jo+1u90t3g4{nAN=Ks_#6DQ~I9_Mj!4c>?p{=cX zhoarCes)A^AEe!0Ga|x4X5=ib&l^Fj^c1$82Ts!6o~p?{O)u0_=VBs_=eH_ zVtM1_m2@|HguDXJeJkw;Hx!&dTy}pmC{v<&l!h;#!c;Tm97FaYe(j_geY^}#@Ga#@ zO#|=jsYGEp;ZHEa-rHYe4su88A@h8vPX{3if;i*FxGeWIv)Xh!$YX^+5~1twH!trOGxFHp@ES<81>`Q6RYjr9v(@XbQYm8ph3 z{*#L1%@iVt^5HpwSWBbF_H)Pl$@))>eIg5%@cn4s_g^ol3`fK$zrXJtiG1iSnaGN^ z6_jDL-FsImB($?#yvb}qK!QE$oK2_NmVEsU!!UIW%vUCA2xRwqzOFvt#8Uu3BEr_b zq<&S`B4bUDa!WBZ)jk&cFjR0eA}2$KhsM8zma2VW?|a|s?D9ptZ^>}(B!Ulfl0pQN z#mP~UU^a2YZ>6_r_T$I2;#muqVkdsLXGY|~Y?D3rSPu-1uyqi>jD;(urRFyt$qaIX zC|ue0^b#h6YXq0_w#M~(#|q6M{7j*)vuwEj?B4O7SbQij5HRFx&7MZ2%sn2k)JU?& zp3422z7(ZyWvcDMmeWRAbPOK$z|^=(~;$}j*=BR&V-n&JxcFet9~DC&T?An z|NU{u3zP7O>#5n@4$9mQu~+TX7!Q6)jSG6L43!8tZDwR%6x^qV=V;%F;UHJs^}Y1O zr7K&pJCc}le8&ZRlIe?n%v(T~w;}M!U@G;w2vG>%m$r6jgI^Tg<3)}}Cg(*aXHSUi z;%@iPOz##U&Wlpcb4<=8h`TRKTy4&Y&;oe+^AaNqC(Kxj+T<&jSC#`GIpOvmlBPn| zKKqQ0=f7(;I)l2*P&mY)cQgjgZZ}1C;cg4wKAE3-+eI-qAS_?xUHDvya;6B2VBk=% z#8d5;dL_F^d6Pkg3@n0s;MZLr%Rkkq||JP>0_z z8-p7#CNMPODt)!lt{2>62GzN5=)OUvq)ycFonMw1FNqz#U#0GBX1d2xM>KV!{ANfF ze#}p15GTYYCb&mmP<7kPfyjV{yA>x|PR!>@F-S#*kz(_I!%Oe#y6B`0CylE2i$Mj8 z_75G(?KHt=3XNHr5@+uCmEf~N&ssWu@O0AqTJ6$qwRtLXFN(I$1@p6#8vD5WA!lPb^0ZuzL9#?yE(%lHVNbt?--N-)~MqOG}9tlt0}>7aJyzwe`LeISlY# zp?Pm~kEST#=G0_SU2vTs>P)qzOSizS=pg9cm?(D-csj4fgTR|{(jTN3!(t8Pl!X_n z%`=Rn9h=NVmZFK>NJ<`umqqGN6Zx1PX#oNkZw7Gl&8TkU&U99iuX>;rRY6r#-Q8%&st1#!eTh_H|^p1_3kR`t+#Q7AC zyi7hql^obecVG8zuep!r<(kh5N|SBp;TpyKcq{BEZr(c|?r+OdVo9^zO3tQL zD1efg{i*w8vO1712tb4JJZy1)%Wu(&4g#ws-62Z z^W-QvGltUE3Qg%XF=O-uE3}xN^D?t7GeDd5Qle429c-ZYDb$UcYv>G`4-s1;>LkRL zr&7wF&p#vu4IWQar?v_FYAkRI$64-*p_mpzL9qO^AEc6Z@XeNd&Rs?vAy$4 z+bJq(&PRms0;-k6+_Q42I+cR@E8#W1&l6yuW?c6BPU23;IM}A;nq5Q;Usg$vn9Nn& zcNgfX5E@nCtwUGnh0dg_G7ZjX+tZHHr`Yei-w|w1y-X3M5p^YO3TW(25FKG@&!8+#wyida_E zq2ts)DhF8DGR9ZiTsyeG@R@+<$V)qVFNOEkY`d!l;Sv7nhBmBdKXQ?B+;O5a7S?+r z`nqv`&q&N=YrWD);12&0w_zBNQ6E^*YuI(|6639vl3ToyWwV9v5U|6EhQbYI9ETpl zE1R6cLcTcohUmHqFG!y1KY{8_H1LciALXQcSDGZ`P|l2+zw`N>NG@B;YlxG|?R=*? z$~6182AKzp)G9TX8GsNM*>L zBWc2*fz1>T7b?8N20ZeAS1Gz5Xsm>?5#ct-PQI$A7 zXzX=9-M9l^T|ZG#xw1{+;uSiBn(NVKzZW@f=bce$rZi``b~z@Y=eXF&)qT$@@_Q4e zJ~=t%L0Kkm-%A_!yzNzGIy`MgRa4$%ci};w*=KAaXI?&!*NcwF19rZ1kU+NwNzRS2 zE&WGS0^2bk-VD$>#6B_%E&Rf`TK9jDAH(K3^&W7qwR)I>b^l-Avj5%A`k(WoRmQLi zH`bxYIzUoFA-@wJygR{ljToVjFu)a@w{YOfN=iZs2L0Za1Q4)4pwmW!wJYCSdJ-|; zWj#DRBs`?ogh2!)1+z9XG+U!p;usu}guo$zZ~EUY{wd7*OM0TJj6$wCq=X~@2oiwe z2OUx(t>LXdu2@NHX`AapRpF9S3gVK|;&4fGDM=-`jFPOpgsd!FQcezTqYV3_^*5a# z!dQ^bp)votvYd>hoPyj2HU{@5xMS@_-d$$AYRl4&3?!y>tJqxRKIlOJFWOPJy;X{Ro6e=c>arCeAoY#BU^VD|C0}EV&8j& zt(5_=22oIogAnoOuZz~+eQY>wq5JE`KT6oTDFyW`q3u3!kmsZ=M7liY2Wi7I1%a|Ek%#4|_OA*;+-?E1mTe5^GQI?2E zge)bZC~GOw|3SBKySIDq@BU|A&&+G)Ip_2JKHu|wzUQ3xqo++l$p!*}c7l3x)wMsF zi0&dI1A(f6g9)?`9+{uRE^k)*Z;$pVwsEZHEBXMuQY&mjX=sxqNPhSxb}q!`<*qZ!`(Y61qwM$>no z3hEOxBN@-UbTvZE1*hqF{#ITgP13V8x9gQ(c=H!r#~M6s56FyL?cN^C<;fw{M@78dlNAPHz4Z7KkWk* zx0QvXVK5sw3<;N#k(NZ-ic6p{(r^hGI0}h@Aw}^-XEX}`E#@-fvKSc|xHM8mLR?Bp z3buZI&@DNpu$JIIN(H1g$n+FYCgdnUAZ8%Jx5w(QvOFzT_gKSPtzfCa4JOcL3Az}O zvFrtBvmc6f;V)FTG5;XtSj9;fd7mA>Ptf5L>r^A|PFs!V39Iz<*p_PH%bW$VX1VBR z`=fToJ+3kgiz~P>!4*rRT^S;o&tMui0{I$3aETB)2}wyhA&{Ww()%%B?vcts=;gEh zR8Q4;s8StEt}F3yF;E|s>dj6b$Byr%h^%=uI(~QFIwF(M>}~rtnzF+Hr6mOaJn$@# z&G@jTHK~F_kDpXLJmWh>fB&J@^Bc>0siBuE(Clo|2r# zN@~CUBOjkD6LDIOSUwXCh`|0YL>;pNBUMYzpoBrk<&gx?1WPr$Y9Hoy`My#l$Y=Jz zv-av&?5{edP3V?dLpys9PJA%tu<2u{rz3{&RpvuRIqrt=@AhCCk0RByr+_b5CVCg1 zZ_^5NH=tW_zg|8!IUc!;C?&mSvM$~_P`)Rksm=g(DGE5)HflQ29!bEU4M+r_q!52q z*b(8%jOW43pt~v`tg;YN5xWpeEdKd1%_@DlvpB?p<`)&&MR;{LpUTb!H~8ibUtGspi)s}3R2aZ@+Gp}ASDj~}w(ub~dvU%=J8FJ@r?;1kXyOkv4XKQYQOBl&bGnxz6^BJ|VfFU1SE658 z2|MRaoEA|xj@`*|7e7z7HEi`=isAA=$aJVdAck)lK=O3L{Br1PjRqp0h%tX*Z+-97 zuLU-gzU{9bZEPkIEW%QJOhU6w&JBIMx@DD<$%p0cIh^Jbg>#|IXJ*@4WJjx>z3X_d z=q96ju$ipvg;pNvOnEjXI!jCRZQKXbS}$!}k$XeWh~P*GnUW2Ams3z2EO-#6sne;{ z+7|ytsUH{LC8GNFjhuKIwK1o_Y4w{Y3x{|`Mq{djZ{kWh7=#R=o!DBCrs=zfas56j zb>>DYT0)vd?k$JhVzgT31sMtXg>=I-R@ww>NUp3TxRP@J{e%UUkwrQ3Ko%`l%hy7W zZpMFo0F5bUZoZ{6V=*6WQZQyie+p)RMSipoV5?##hVGS9#!l~s*e9P%RP$DJt2lAZ zCc7ni<*0sPU*%AZ!c+AIyO@KP{m6`pgXeNy6&S~aK+|x`uYC17y2v7hGF4t)RMDAn zch)8!)|V>26c%7L0>4_VO-kSvRxzCBtIx#eTzjY89m{`#Fl~`^XP#>3>;%NOu)SZ= z@bzoU_PjK6Db=eJH;PzCRfoqjCC?tVC^%QG>asB8{ZxMxr%FfQS;}Eo@q4kl98kT7 zM}_^ko)@8^m1RXUSe+^UR6?L`;A$9W(3`t#t^6zwapO=J)IIrhRAzGKI|ntZrQU`N zW-Vswm4c{1uv@X+qv~3!+6K&|Oj#Z^QgcV;VU=O8^EI6Blka&iGkdm4rL{w4maLKJT}fE^H{|H7{PKA-5&%VU26EfUHw@i<$g z+U{wdbJopQ`lRPmy&rBI?}vuRq(X#Zvb;4lQsm@=Ad9bi-=Tw5s*x>DQ=s4fPzibjC!SPv;Ihc` z>>0}^f);0~N4+BYO1kjoUklviIc~D_xUQbuao#PH`!AS}rlv5dV0Qob{ve$&MbUeN?Y`YUpQ8 zqsdMjFb;FMS{q6~x751ZTrZYFFZOFt3ir8`cYY}=d*3X9x@WnsPFh`^(tS;^qvN91 zP40Gm8O^cU)KlA7HdiDGwjZpwa8w{M@v4XQXXUw0_%w4W1i#40Rm`MqIKw5{5j6C) z=&WJh`DPBD0yd|}*JBSE_?&t*N>1?S8BtymmyeS2Jl;hT5c1BwWX49tPduefF5Fs9 zdeT_VCVlYh=a^>%S%4aSmlONkcIS8zUTF$U_3UtkMH#Ynl9DIto`PMaJ7r~d zBWZgFf;gub4o3T{-;7#fnY~gLVKIDl#nU0|eR&=!mTFj1{ooFis0FK)gt2`Zm9OwF zuA3(I!<^+8Y%&wBo>FfYQhC!-SEw=vaZk%Fbbq<%V7am_fn7_Yt@457y}cI%V%70&9NQqq)?JOz{K z=8leHrgBk!*+@nfZx%wKzLFFO5$sx}vN~+#of>|-&uy2w6Jv5{sjI$pF}t?}tTp1kNl$iA3JS9gglZsmr6+<3|Nl1rg+IxuE6m80sfJWMTM{W(c$~>fu@XxGLd0bSUV!kM$TnfgUI8R^~y$U7#%$duKcT$_c z%pURiv$2bD>Y9vbqQjWSl4$H?B9>qy1D>L6V&<)7ROdB}#w>&PFmTnjS31JKbVX`##Sk4QGDjqHlPX5^dXT*!##+@~TbHbZ&%~@4`gW z<)(`lxxZLv*MuB6b;W1#(Ur4j7I%G~@9Qm2_pwq2yZR5``MT7bp_s2E%=Kw5?8;rm zv!CZ$kFPF$2%)*lH>1(SseoYD?!742X1-|=g?ipP%XWg#~RK8*jd}q-8pnEEbhf7HE zsV=9=x$z@hJa71zrk|@?wuh5fv?%YPW%o~x7DDpjhUz2(RZDx|Xt@QLv7dhDm#P`9 z$V6KIcdU*2XLWLBFMQ` z(ou$5|Lz zjrrymoV4z(kUAbQ#etd}gD(EI9MPpIX%|=Ib1lq~_fQXeZ{=LY%Ty|Yu4kkB zdGmRpZtD7$OB7d(I=bVyZPBS7ilcazG~&fL`k5qj7NM;I9^rbXS7FdKr6!_r;GwyI zadn+-ywXQ`eD*NjMn`(^2vvDo@{m&nJTBsw}n z2P~p9j}`Wh$3&TGlt*B0fVFXBP)v4xK=pvmv$Ts0d8=i4+z}P?#cz<%qe(ja_YK$& zKajZHWEUFz#o8zMh!g(@G5aA4bYGH|M_l)D4)QnU$$ZvTOz6cMD{lnyS=(NM>=4%r z?dr%gtX^y79Mo03t@25xEY~HnqVlVqdCWrKY=!u-4y4%ro#8R^)20?zYgQoLcH z)M2|Orbn;roFfv(SA2sN)8f}t&!NM?(81Kry%?SOc+n8Nv(G3w_X?hPOb%_#z2{27 z=quV*kJ-bJ9RUon5Gy zEVFB99B_1L+<~vHpQ^sSN&&wRORIG!Guq%qi48UP9HN=rkUlLcCb9pd(D|FLy!E*5S))HTYe0FYs>$+v!=S;6b1_FjA(v;@(}%;BJ`11#Ttl*B zV_e&iHX`7O!~0jmG}dt~Iw8eh7}gdpKR8aB_2iCzV4J&k=mT~CKi`1=)js*})1WnC zu!br&5XJ@$l0&1u^BcS?!D*fUpixka6EJUKfn}Gts5lhzy)6ktaQ=aiHg{M*^Sz}9 z(c!zSySuxnyX3ks0F=a`rn))?>+DIy0ZSwyu_(+p{qH^gE}HsN7NQ`JMy)#}hazB* zBn%o1I3!0}hgH9yF_BbNGdu!OkPs7>5fK*?5tB9)hs#O9x|GzGeym z0l=A)18N;ILfx?FZA4OJgA4-bXq_F367j&0qSto=&Q7B1-=fY)2kgOhVSobu#O4}N zg@FHw(Qmi#8YlQcKmW?a@1*SC7}H2_wEKZYd_2B?Fw6&;%0>m0G9y@e?l0y>uiN=n{|42Y*`84w0zZau>r!X401GSVzhC%lH@|ff+-%;R9rUv) XQBRu+7$Fdd7I@bIY-xGV+OPiuGwfeO literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsBlank.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsBlank.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e6fa5ec0709dce0a5fd48759682f75f61d8e09df GIT binary patch literal 7408 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 literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsError.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsError.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ad1c538f951bd13d72b5c956023c4d7cf889c392 GIT binary patch literal 7845 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 Yn;xPA#&`9RDHCWJ;CgWYSpb3l4|{|93;+NC literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFMultipleConditions.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFMultipleConditions.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..73bb457562999e52691c06ed9dd00d90ef08b083 GIT binary patch literal 7357 zcmcJU2|SeB|Hp@@kjR!4#t0$CI);p0S&OXMGG<}K%rrAXq=*?`+U#$`JQv$kBQ+11}+c?v>C*B!`JAu zmGm|`IuNK5IM_hDKwfT8PXg(f6M=9{+RNPyoW%>;lR<0#$5%wOF}^{DJ*d#By%w&M zRRGy?5&zUYKD4j2xTOhFCLHDetRPI_n$=bQ5Dj~e7oQgft3N*M`9wmLN2bcevO3iJ zTGDA329)_hhm+bG<@2rXXDSDKJq;o{dJmd$GM0$Xu)fT(p~PY{52X8u>WG;g97)@R z%5O-_h}?SWxrYT}G9=Z=dwXe_Sa~k%SJP~@tgbGIXpenUN{PU`fg0U}nvp!p9>;#0 z`D)mik8)NGY+=ro!3O?2c8b?*KTh|VEyrLs(6(ad&9+JP53fdeWYw?lVjQb)?%U6D z)&EZO7#L4MFb!BoG@tCc1GV2J(R+=g>&L8Kxc$(K6TMhV-cb`ElFZ9-p+&MMoIWju z9t5HtEI=fWk}z&$s5I^KucG+As!mm%7U>fh5*bIpBOtQUG7vBZk0PLPcxME}gMyWU zL)6t&4`bYr6rcs!1xF-)sqW1w;}GB7CM%?}O8T1~LIHxcu96bV=?4u#Pnpgi0$c*;+Np=(<}z~)GjGlqhI zK-Z-g1gwunKn`PJ^2)NZSOv5K7NvlKDMG-||2Nk#UK9)-jX_HhNkFhj6dZ=U%0Dy# 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 Gum1xp3|0gH literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotBlank.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotBlank.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8861be4195b4f28f3e7c218c5293470c3a027221 GIT binary patch literal 7414 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 EKd8uJ8UO$Q literal 0 HcmV?d00001 diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotContains.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotContains.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..86567012163013b5a364ddcf436dfb85c628c0f5 GIT binary patch literal 7459 zcmcJU2|QHm|Hp@rHL_L8Hd&&Wv9Dt%dt@ien8iLbW=7UXkzJ8JWJ!x9Ey$968Ol`vF{>5A{z%)RaLW>9k%OhTNloCggXe>v6-9B~u(-|{u43yoxx6xR|6Nz#2Ry7iHUk>ZU{@Dl zPNrUbrYsOLmeSrRQE2fnTQ1C}KNRQSJ7U5@St7K^@ZyR!F&>?L^s>KzhMa09OyNUL1D=h&hnxge>)-Ux^!?Rs3+A{j89s-8{` z0<9f%KqT$)D0c!xbnX0CQG8oftEjvd>60it!3B$ffyG3jU>+0(fknDtoM2!tB3eWi ztgNJX9OVut0xby6E;s@Y&;>()ft`s&oIC_VKscj3-~>@D4ut`(ps{!lI1%`XcY@&H z2sgMB3L*}LN<#o|erSNVYVw%+;!uA_5sOByoQgLoaJ*uVGb&j$eFfg-|@a3UOnz~WIq_vrWD1Qh-x5OulxSRx9PDTRBAX6m*aVM)WTD`QEZY352c^#N2>>4Cd&P{6x` z{hgH)Y!i>AEa*NyjC|a8czVg4-En}SfsPQtUtRznXRnPA*z3bMb%A)lGmYn*ZL)vS z*>>GfZxg!D-ub2TFQ;NxV0Vcx7#)hY4ph={`45+YxR0ae7s{9q zcQVu2Ea=@8h5FHQ)K^;Wo%5pyRoE_vFWXyajhqqGe-gg)lTTsp4&@O z)5TB`(2d9Nm9(>Iy71ZLvZ}lXbuaT>=fY0sBFH3O^i!lV&(~b# z)URkfr#Xyl>&?x~GQaYA$j_g1=b~D~%9zxVd=6IM z{b?iK9G%@Gu!fU&l^!|pjXLxlHLqyCOC`vBnQ1_tgTaC~zAI7s%42P%tGjY<3qIK` z`r0q_rQiwMe)K zvxVSE=DV?+0~axs#Vx@{pR?T}8D3ffvGV%8YfoNoSr|`U{kU|>OQIxlCd8|II=!