xlsxwriter 0.8.1 copy "xlsxwriter: ^0.8.1" to clipboard
xlsxwriter: ^0.8.1 copied to clipboard

Native, fast, low-memory Excel .xlsx writer for Dart. An FFI binding to libxlsxwriter with a constant-memory mode for large sheets.

0.8.1 #

  • Reject non-finite numbers. writeNumber (and writeRow) let double.nan, double.infinity and -double.infinity through to libxlsxwriter, which wrote <v>NAN</v> / <v>INF</v> into the cell — tokens that are not valid in an xlsx numeric value, so Excel refused to open the file. They now throw an ArgumentError at the call, before a corrupt file can be produced.
  • Correct the constant-memory merge description. 0.8.0 said a mergeRange that reaches back into flushed rows throws; a range that straddles the current row (first row already flushed, last row ahead) does not throw — libxlsxwriter silently does not write it. The README now says a merge has to sit entirely at or ahead of the current row, which is the accurate rule.

0.8.0 #

Settles the class-modifier and export questions ahead of a 1.0.0 freeze, and corrects a limitation the README claimed but the code does not have.

  • Mark Workbook, Worksheet, Format, Chart and XlsxWriterException as final. They are concrete handles over the libxlsxwriter objects, nothing in the package, its tests, examples or benchmarks subtypes any of them, and the package has added a feature per minor release. Sealing keeps those additions non-breaking; adding final after 1.0.0 would take a major version, while removing it later would not.
  • Name the enum exports explicitly rather than re-exporting src/enums.dart whole, so a future symbol in that file cannot join the API silently. The exported set is unchanged.
  • Correct the merged-range limitation. The README said merged ranges "do not work in constant-memory mode". They do: mergeRange in that mode writes a correct mergeCell as long as the range is at or ahead of the current row, and throws only when it reaches back into rows already flushed to disk — which is the same write-forward rule that already governs everything else in that mode, not a separate limitation. Both places in the README now say that, and two tests pin the behaviour in each direction.

0.7.2 #

  • Rework the README around how constant-memory mode works: what an .xlsx actually is, why document-order XML lets you stream one, and what streaming costs. Adds a measured memory-vs-rows chart (constant-memory holds about 189 MiB flat from 10k to 1M rows while the default mode reaches 1.4 GiB) and a diagram of the one-row-in-RAM path.
  • Fix the Workbook.constantMemory doc comment, which said an out-of-order write is silently dropped. A backward-row write throws XlsxWriterException; it is not silent. Column order within the current row does not matter.

0.7.1 #

  • Fix a truncation bug: every string-taking API (writeString, writeFormula, writeUrl, mergeRange, worksheet and table names, format font name and number format, chart title/series/axis names) passed the Dart string to libxlsxwriter as a NUL-terminated C string. A value containing an embedded U+0000 code unit, which is legal Dart content, was silently cut at that byte with no error, since libxlsxwriter's own API has no pointer+length variant to switch to. These now throw ArgumentError on an embedded NUL instead of truncating.
  • Declare platforms: {linux, macos, windows} in pubspec.yaml. The build hook has no Android/iOS handling and has never built or run on them; pub.dev had inferred support for all five platforms from static analysis alone with no declaration to override it.

0.7.0 #

  • Conditional formatting: the report and dashboard set. conditionalCell and conditionalCellBetween highlight cells in a range by comparison (the ConditionalCriteria values, or a min/max between) with a Format; conditionalColorScale paints a 2- or 3-colour heatmap; conditionalDataBar draws in-cell bars proportional to each value. Backed by libxlsxwriter's worksheet_conditional_format_range through focused shim entry points, one per mode, so the fat lxw_conditional_format struct does not cross the flat ABI. Verified by writing each rule and reading the conditionalFormatting block back out of the sheet XML: cellIs/greaterThan, between, colorScale (2- and 3-colour), and dataBar.

0.6.0 #

  • Worksheet.insertImage(row, col, bytes, {xScale, yScale, xOffset, yOffset}) places a PNG, JPEG, GIF or BMP at a cell from bytes in memory, the shape a logo or a rendered chart already has, so no temporary file is needed. Backed by libxlsxwriter's worksheet_insert_image_buffer_opt through a new shim entry point. Empty bytes are an ArgumentError; bytes that are not a recognised image are an XlsxWriterException. Verified by embedding a real PNG and confirming the file carries an xl/media/ part and a drawing.

0.5.0 #

  • Worksheet.writeRow(row, values, {startCol, format, dateFormat}) writes a whole row and dispatches each value by its runtime type: String, int/double, bool, DateTime and null map to the right cell type, so a report that is a list per row needs one call instead of picking a write... per column. A DateTime needs a dateFormat and an unsupported type is an ArgumentError naming the column, rather than a silent coercion. Verified by writing a mixed row and reading every cell back with an independent reader.
  • Show the memory argument on its own. The benchmark compared one size against a competitor; the new curve measures peak memory at 10k, 100k and 1M rows and shows constant-memory mode holding ~191 MiB flat while the in-memory default climbs to 1433 MiB at a million rows. That flat curve is the reason the mode exists, and it was asserted in prose before, not shown.

0.4.4 #

  • Benchmark against excel_community, not just excel. The chart and the table compared only against excel, which has had no release since August 2024, and claimed "about five times faster". Against the maintained fork the honest figures are 3.2x less memory and 1.7x faster: memory is the real argument and throughput is close enough that it should not decide anything. All four numbers re-measured in one sitting on one machine.
  • Say so in the README, and point readers who need to read spreadsheets at excel_community rather than the unmaintained excel.

0.4.3 #

  • Widen the native-toolchain constraints so the package can be installed in a Flutter app at all. hooks 2.1.0 and native_toolchain_c 0.19.3 raised their meta floor to ^1.19.0, and Flutter's SDK pins meta to 1.17.0, so flutter pub add failed at version solving with "flutter from sdk is incompatible". Allowing hooks >=2.0.2 and native_toolchain_c >=0.19.2 lets the solver pick a version that works with the pinned meta, while a pure-Dart project still resolves to the newest. No API or behaviour change.

0.4.2 #

  • Shorten the screenshot description. pub.dev accepts up to 200 characters but scores only those under 160, so the previous release published cleanly and quietly gave up the documentation points it was meant to earn.

0.4.1 #

  • Declare the benchmark chart in pubspec.yaml so pub.dev renders it on the package page. The chart was already in the repository and the README, but pub.dev shows only what the screenshots: field points at, so the page a reader lands on from search opened with text where the measurement should have been.

0.4.0 #

  • Add charts. Workbook.addChart(ChartType) creates a column, bar, line, area, pie, doughnut, scatter, or radar chart; Chart.addSeries plots cell ranges, with setTitle and setAxisNames for labels; Worksheet.insertChart places it on a sheet with optional scaling. The pure-Dart excel and spreadsheet_decoder packages can't write charts, so this is the reason to use a native writer when a report needs one. Charts are wired through the C shim, which is compiled from vendored source, so there is no new binary to install.

0.3.0 #

  • Add Workbook.toBytes: build a workbook and get its .xlsx bytes back with no file left on disk, for serving a generated spreadsheet straight from a request handler. It stages a temporary file, reads it back, and removes it. Supports constant-memory mode via constantMemory: true.

0.2.0 #

  • Add Worksheet.addTable, which wraps a cell range in an Excel table with banded rows, per-column autofilter, and a name usable in formulas. Pass the column names through columns; they are written into the header row. The autofilter, bandedRows, bandedColumns and totalRow options toggle the matching table features.

Changelog #

0.1.1 #

  • Move the vendored third-party attributions out of LICENSE into THIRD_PARTY_NOTICES.md, so LICENSE is the plain MIT text that automated license detection recognises. The attributions themselves are unchanged and still ship with the package.

0.1.0 #

First release. A native .xlsx writer for Dart, binding libxlsxwriter 1.2.2 over FFI, with libxlsxwriter and zlib 1.3.1 vendored and compiled from source at build time (no system dependencies on macOS, Linux, or Windows).

  • Workbook and Workbook.constantMemory for in-memory and constant-memory writing, with a NativeFinalizer so a forgotten workbook is freed.
  • Worksheet writes: writeString, writeNumber, writeBool, writeFormula, writeDateTime, writeUrl, writeBlank.
  • Layout: setColumn, setColumnWidth, setRow, mergeRange, freezePanes.
  • Format with bold, italic, underline, fontName, fontSize, fontColor, backgroundColor, numberFormat, align, verticalAlign, textWrap, border, and borderColor.
  • libxlsxwriter error codes surfaced as XlsxWriterException with the human-readable message.
0
likes
0
points
1.2k
downloads

Publisher

verified publisherdeveloperyusuf.com

Weekly Downloads

Native, fast, low-memory Excel .xlsx writer for Dart. An FFI binding to libxlsxwriter with a constant-memory mode for large sheets.

Repository (GitHub)
View/report issues

Topics

#excel #xlsx #spreadsheet #ffi #export

License

unknown (license)

Dependencies

code_assets, ffi, hooks, native_toolchain_c

More

Packages that depend on xlsxwriter