From a07f7e74f347738c4245f0d6f1019d16ff1eb964 Mon Sep 17 00:00:00 2001 From: DualFroz Date: Wed, 26 Aug 2026 18:07:00 +0200 Subject: [PATCH] feat(render): add sheet grid text rendering --- lib/src/grid.dart | 72 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 lib/src/grid.dart diff --git a/lib/src/grid.dart b/lib/src/grid.dart new file mode 100644 index 0000000..956c0b8 --- /dev/null +++ b/lib/src/grid.dart @@ -0,0 +1,72 @@ +import 'address.dart'; +import 'sheet.dart'; + +String renderGrid(Sheet sheet, {bool formulas = false, bool useFormat = true}) { + final dimensions = sheet.dimensions(); + if (dimensions.rows == 0) return '(empty sheet)\n'; + + String contentAt(int col, int row) { + final address = CellAddress(col, row); + if (formulas) return sheet.rawAt(address); + return useFormat ? sheet.displayAt(address) : sheet.valueAt(address).display(); + } + + final colWidths = []; + for (var col = 0; col < dimensions.cols; col++) { + var width = columnLabel(col).length; + for (var row = 0; row < dimensions.rows; row++) { + final length = contentAt(col, row).length; + if (length > width) width = length; + } + colWidths.add(width); + } + + final gutter = dimensions.rows.toString().length; + final buffer = StringBuffer(); + + buffer.write(' ' * gutter); + for (var col = 0; col < dimensions.cols; col++) { + buffer.write(' | '); + buffer.write(columnLabel(col).padLeft(colWidths[col])); + } + buffer.writeln(); + + buffer.write('-' * gutter); + for (var col = 0; col < dimensions.cols; col++) { + buffer.write('-+-'); + buffer.write('-' * colWidths[col]); + } + buffer.writeln(); + + for (var row = 0; row < dimensions.rows; row++) { + buffer.write((row + 1).toString().padLeft(gutter)); + for (var col = 0; col < dimensions.cols; col++) { + buffer.write(' | '); + buffer.write(contentAt(col, row).padLeft(colWidths[col])); + } + buffer.writeln(); + } + + return buffer.toString(); +} + +String renderTextRows(List> rows) { + if (rows.isEmpty) return ''; + final columns = rows.map((row) => row.length).reduce((a, b) => a > b ? a : b); + final widths = List.filled(columns, 0); + for (final row in rows) { + for (var c = 0; c < row.length; c++) { + if (row[c].length > widths[c]) widths[c] = row[c].length; + } + } + final buffer = StringBuffer(); + for (final row in rows) { + final cells = []; + for (var c = 0; c < columns; c++) { + final value = c < row.length ? row[c] : ''; + cells.add(value.padRight(widths[c])); + } + buffer.writeln(cells.join(' ').trimRight()); + } + return buffer.toString(); +}