SpreadsheetLight is an open source Open XML spreadsheet library for .NET Framework written in C#, and is released under the MIT License. You can create new Open XML spreadsheets, or work with existing Open XML spreadsheets that are compatible with Microsoft Excel 2007/2010/2013 and LibreOffice Calc.
No Office/Excel Interop needed. You do not need Microsoft Office/Excel to be installed.
Dependency: Open XML SDK (2.0 or later)
See the version list below for details.
You can read the full list of changes at http://spreadsheetlight.com/version-history/ Note that source code is only available up to minor releases, meaning Major.Minor.0 versions.
- SmartTags is now removed from consideration (not so smart now, are you? ;). Which means the code is now ready for Open XML SDK 2.5! And yes, it now works with Open XML SDK 2.5 (have I mentioned that? lol)
- Internal cell storage structure is revamped. It used to be a 1-dimensional dictionary with a 2-dimensional key, but is now a 2-dimensional dictionary with a 1-dimensional key. Tech explanation: Dictionary<SLCellPoint, SLCell> to Dictionary<int, Dictionary<int, SLCell>>. This is done because a 1-dimensional key is at most 2^31 hash entries, which cannot contain the theoretical 1048576 (2^20) rows and 16384 (2^14) columns per worksheet supported by latest versions of Excel.
- Bug fix: plotting separate data series on charts as different chart types now works (your typical combination chart such as a column chart with lines)
- Bug fix: Formulas will be correctly changed when columns are deleted (when the formula involves said deleted columns).
- Bug fix: Cell value/formula set on a shared cell formula base cell now works correctly. For example, setting on C3 when C3 holds a shared cell formula will work.
- Bug fix: Setting filter on worksheet now works correctly. It failed to sort before (basically also need to set underlying defined name _xlnm._FilterDatabase. Gawdiggitty.)
- You can now get row/column grouping levels. See GetRowGroupLevel() and GetColumnGroupLevel() functions.
- You can now get a list of the shared cell formulas in the currently selected worksheet. See GetSharedCellFormulas() function.
- Cell formulas are now more correctly maintained when copying/inserting/deleting cells/rows/columns.
- Catered for situation where cell reference ranges aren't in top-left to bottom-right format (such as E1:A7). See SLTool for translating reference sequences to SLCellPointRange and vice versa. Don't worry, you probably wouldn't have known about this anyway...
- You can now draw borders on a cell range! And border grids! Try out the DrawBorder() and DrawBorderGrid() functions.
- You can now merge cells and set style/border properties at the same time! No more manual border drawing on merged cells! Woohoo! See MergeWorksheetCells() function overloads.
- You can now make SpreadsheetLight throw up, I mean, throw exceptions! When there are exceptions, of course. See ThrowExceptionsIfAny property. Not sure how much help this is though...
- You can now forcibly get a boolean value if it looks like it's a boolean but actually stored as text. See the GetCellValueAsBoolean() functions.
- Breaking change: SLCellFormula.Reference data type changed from string to List<SLCellPointRange> (but you shouldn't have been using this anyway...)
- Bug fix: The properties "count" and "uniqueCount" removed from shared strings table part. It seems a high number of shared strings will cause the calculation to render a corrupt file. See when writing the shared strings table for details.
- Bug fix: Outline (grouping) levels of rows and columns now limited to 0 to 7 (was allowed to go to 8 previously. See GroupRows() and GroupColumns() in RowColumnFunctions.cs)
- Removed optional argument use (specifically IsStylish) so that developers using Visual Studio 2008 (.NET Framework 3.5) can still compile the source code.
- Optimised GetWorksheetStatistics(). It's now faster and less memory intensive.
- Bug fix: autofitting rows with a smaller initial height now correctly autofit to content
- Bug fix (?): SLStyle.MergeStyle() now takes on the new style object's format code regardless.
This package has no dependencies.