table_parser 1.0.1
table_parser: ^1.0.1 copied to clipboard
A lightweight library for parsing and updating table documents (CSV, ODS, XLSX). Extended version of spreadsheet_decoder with enhanced features.
Table Parser #
Table Parser is an extended and improved version of the excellent spreadsheet_decoder package. This library provides enhanced functionality for parsing, manipulating, and updating table documents in various formats including CSV, ODS, and XLSX.
Acknowledgments #
This package is built upon the foundation of the spreadsheet_decoder package created by Sébastien Stehly (sestegra). We extend our sincere gratitude for their excellent work and for making it available under the MIT License, which allows for modification and redistribution.
Original Package: spreadsheet_decoder
Original Author: Sébastien Stehly
License: MIT License
Key Improvements #
This package extends the original spreadsheet_decoder with:
- Enhanced CSV Support: Comprehensive CSV parsing with custom separators, quoted fields, and escape sequences
- Better Error Handling: Improved validation and error reporting
- Performance Optimizations: Better handling of large files and memory usage
- Extended API: Additional methods for table manipulation and data export
- Comprehensive Documentation: More examples and detailed usage instructions
- Modern Dart Support: Updated for Dart 3.0+ with null safety
Installation #
Add this to your package's pubspec.yaml
file:
dependencies:
table_parser: ^1.0.0
Then run:
dart pub get
Usage #
Quick Start #
import 'package:table_parser/table_parser.dart';
import 'dart:io';
void main() {
// Parse CSV
var csvContent = '''Name,Age,City
John,30,New York
Jane,25,Los Angeles''';
var decoder = TableParser.decodeCsv(csvContent);
var table = decoder.tables['Sheet1']!;
print(table.rows); // [[Name, Age, City], [John, 30, New York], [Jane, 25, Los Angeles]]
// Parse Excel/ODS from file
var bytes = File('data.xlsx').readAsBytesSync();
var spreadsheet = TableParser.decodeBytes(bytes);
var sheet = spreadsheet.tables['Sheet1']!;
print('${sheet.maxRows} rows, ${sheet.maxCols} columns');
}
CSV Files #
Basic CSV Parsing
import 'package:table_parser/table_parser.dart';
void main() {
var csvContent = '''Product,Price,InStock
Laptop,999.99,true
Mouse,29.99,false''';
var decoder = TableParser.decodeCsv(csvContent);
var table = decoder.tables['Sheet1']!;
// Access data
for (var row in table.rows) {
print(row);
}
}
CSV with Custom Options
var decoder = TableParser.decodeCsv(
csvContent,
separator: ';', // Custom separator (default: ',')
textDelimiter: '"', // Text delimiter for quoted fields (default: null)
shouldParseNumbers: true, // Parse numbers automatically (default: true)
eol: '\n', // End of line character (default: '\r\n')
update: true, // Enable update mode (default: false)
);
CSV with Quoted Fields
var csvContent = '''Name,Description,Salary
"Smith, John","Senior Developer",85000
"Doe, Jane","Marketing Manager",75000
"Johnson, Mike","HR Director ""People Ops""",90000''';
var decoder = TableParser.decodeCsv(csvContent, textDelimiter: '"');
var table = decoder.tables['Sheet1']!;
// Properly handles quoted fields with embedded commas and escaped quotes
print(table.rows[1]); // [Smith, John, Senior Developer, 85000]
CSV Data Manipulation
var decoder = TableParser.decodeCsv(csvContent, update: true);
// Update existing cell
decoder.updateCell('Sheet1', 1, 1, 31); // Update age in row 1
// Insert new row
decoder.insertRow('Sheet1', 1);
decoder.updateCell('Sheet1', 0, 1, 'New Name');
decoder.updateCell('Sheet1', 1, 1, 28);
// Export back to CSV
var updatedCsvBytes = decoder.encode();
File('updated.csv').writeAsBytesSync(updatedCsvBytes);
Excel (XLSX) and OpenDocument (ODS) Files #
Reading Files
import 'dart:io';
import 'package:table_parser/table_parser.dart';
void main() {
// Read from file
var bytes = File('spreadsheet.xlsx').readAsBytesSync();
var decoder = TableParser.decodeBytes(bytes, update: true);
// Access sheets
for (var sheetName in decoder.tables.keys) {
var table = decoder.tables[sheetName]!;
print('Sheet: $sheetName');
print('Dimensions: ${table.maxRows} rows × ${table.maxCols} columns');
// Access cell data
for (int i = 0; i < table.maxRows; i++) {
print('Row $i: ${table.rows[i]}');
}
}
}
Modifying Spreadsheets
// Update existing data
decoder.updateCell('Sheet1', 0, 0, 'New Header');
decoder.updateCell('Sheet1', 1, 1, 42.5);
// Insert new rows/columns
decoder.insertRow('Sheet1', 1);
decoder.insertColumn('Sheet1', 0);
// Save modified spreadsheet
var modifiedBytes = decoder.encode();
File('modified_spreadsheet.xlsx').writeAsBytesSync(modifiedBytes);
Web Usage (Client-side) #
import 'dart:html';
import 'package:table_parser/table_parser.dart';
void handleFileUpload(File file) {
var reader = FileReader();
reader.onLoadEnd.listen((event) {
var decoder = TableParser.decodeBytes(reader.result as List<int>);
var table = decoder.tables['Sheet1']!;
// Process spreadsheet data
for (var row in table.rows) {
print(row);
}
});
reader.readAsArrayBuffer(file);
}
Command Line Tool #
This package includes a command-line tool for inspecting table files:
# Basic usage
dart run table_parser:dump_content data.xlsx
# With specific sheet
dart run table_parser:dump_content data.xlsx Sheet1
# CSV with custom options
dart run table_parser:dump_content data.csv --separator=; --delimiter="
# Show help
dart run table_parser:dump_content
Supported Formats #
Format | Extension | Read | Write | Notes |
---|---|---|---|---|
CSV | .csv |
✅ | ✅ | Full support with custom separators and quoted fields |
Excel | .xlsx |
✅ | ✅ | Modern Excel format |
OpenDocument | .ods |
✅ | ✅ | LibreOffice/OpenOffice format |
API Reference #
TableParser Class #
Factory Constructors
TableParser.decodeBytes(List<int> bytes, {bool update = false})
- Decode XLSX/ODS from bytesTableParser.decodeCsv(String csvContent, {...})
- Decode CSV from stringTableParser.decodeCsvBytes(List<int> bytes, {...})
- Decode CSV from bytes
CSV Options
separator
- Field separator character (default:,
)textDelimiter
- Text delimiter for quoted fields (default:null
)shouldParseNumbers
- Auto-parse numbers (default:true
)eol
- End of line character (default:\r\n
)update
- Enable modification support (default:false
)
Methods
updateCell(String sheet, int column, int row, dynamic value)
- Update cell valueinsertRow(String sheet, int rowIndex)
- Insert new rowinsertColumn(String sheet, int columnIndex)
- Insert new columnremoveRow(String sheet, int rowIndex)
- Remove rowremoveColumn(String sheet, int columnIndex)
- Remove columnencode()
- Export back to bytes
TableSheet Class #
Properties
maxRows
- Number of rowsmaxCols
- Number of columnsrows
- List of row data
Examples #
See the example folder for comprehensive usage examples:
- Basic CSV, XLSX, and ODS parsing
- Advanced CSV features (custom separators, quoted fields)
- Data manipulation and export
- Error handling
Run the example:
dart run example/table_parser_example.dart
Features and Limitations #
✅ Supported Features #
- CSV: Complete support including custom separators, quoted fields, escape sequences
- XLSX/ODS: Read and write with full data type support
- Data Types: Automatic detection and preservation of numbers, booleans, strings
- Modification: Insert/remove rows and columns, update cells
- Export: Save modified data back to original format
- Memory Efficient: Streaming parsing for large files
❌ Current Limitations #
- Annotations and comments are not preserved
- Spanned (merged) rows and columns are not supported
- Hidden rows and columns are visible in output
- XLSX: Only native Excel date/time formats (not custom formats)
- ODS: LibreOffice-specific formatting may not be preserved
Migration from spreadsheet_decoder #
This package maintains API compatibility with spreadsheet_decoder. To migrate:
-
Update your dependency:
dependencies: table_parser: ^1.0.0 # instead of spreadsheet_decoder
-
Update imports:
import 'package:table_parser/table_parser.dart'; // instead of spreadsheet_decoder
-
Update class names:
TableParser.decodeBytes(bytes); // instead of SpreadsheetDecoder TableSheet table = decoder.tables; // instead of SpreadsheetTable
Contributing #
Contributions are welcome! This package builds upon the excellent foundation of spreadsheet_decoder and aims to extend its capabilities while maintaining compatibility.
Development #
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests for new functionality
- Ensure all tests pass:
dart test
- Submit a pull request
License #
This project is licensed under the MIT License - see the LICENSE file for details.
This package extends and modifies the original spreadsheet_decoder package by Sébastien Stehly, also licensed under the MIT License.
Credits #
- Original Package: spreadsheet_decoder by Sébastien Stehly
- Extended Version: Table Parser - Enhanced with CSV support and additional features
- Contributors: Thank you to all contributors who help improve this package