README.md in fast_excel-0.2.6 vs README.md in fast_excel-0.3.0
- old
+ new
@@ -1,19 +1,19 @@
# Ultra Fast Excel Writer for Ruby
```ruby
require 'fast_excel'
-workbook = FastExcel.open("hello_world_ffi.xlsx", constant_memory: true)
+workbook = FastExcel.open("hello_world.xlsx", constant_memory: true)
workbook.default_format.set(
font_size: 0, # user's default
font_family: "Arial"
)
worksheet = workbook.add_worksheet("Example Report")
-bold = workbook.bold_cell_format
+bold = workbook.bold_format
worksheet.set_column(0, 0, FastExcel::DEF_COL_WIDTH, bold)
price = workbook.number_format("#,##0.00")
worksheet.set_column(1, 1, 20, price)
@@ -33,48 +33,146 @@
See [more examples](https://github.com/Paxa/fast_excel/tree/master/examples)
This repository and gem contain sources of [libxlsxwriter](https://github.com/jmcnamara/libxlsxwriter)
-## Benchmarks
+## Install
-1000 rows:
+```ruby
+# Gemfile
+gem 'fast_excel'
```
-Comparison:
- FastExcel: 31.7 i/s
- Axlsx: 8.0 i/s - 3.98x slower
- write_xlsx: 6.9 i/s - 4.62x slower
+Or
```
+gem install fast_excel
+```
-20000 rows:
+
+
+### Create Document
+```ruby
+workbook = FastExcel.open # creates tmp file
+# ...
+send_data(workbook.read_string, filename: "table.xlsx") # read tmp file and delete it
```
-Comparison:
- FastExcel: 1.4 i/s
- Axlsx: 0.4 i/s - 3.46x slower
- write_xlsx: 0.1 i/s - 17.04x slower
+
+Also can use `workbook.remove_tmp_file` to delete tmp file manually
+
+
+**Constant memory mode**: saves each row to disk, good for really big files but can not change previous lines that already saved
+```ruby
+workbook = FastExcel.open(constant_memory: true)
```
-Max memory usage, generating 100k rows:
+**Save to file**
+```ruby
+workbook = FastExcel.open("my_dinner.xlsx")
```
-FastExcel - 20 MB
-Axlsx - 60 MB
-write_xlsx - 100 MB
+
+### Write Data
+FastExcel will automatically detect data type and one of `write_number` or `write_datetime` or `write_formula` or `write_string` or `write_url`
+```ruby
+workbook = FastExcel.open
+worksheet = workbook.add_worksheet
+
+# write specific type value value
+worksheet.write_number(row = 0, col = 5, 1_234_567, format = nil)
+
+# write value with type detection
+worksheet.write_value(row = 0, col = 5, 1_234_567, format = nil)
+
+# write row of values. format argument can be format object or array of format objects
+worksheet.write_row(row = 1, ["strong", 123_456, Time.now], format = nil)
+
+# write row to the bottom
+worksheet.append_row(["strong", 123_456, Time.now], )
+
+# shortcut for append_row()
+worksheet << ["strong", 123_456, Time.now]
```
-## Install
+**Saving dates**: excel store dates as number of days since 1st January 1900, and FastExcel will make it for you.
+To make saving of dates slightly faster can use `FastExcel.date_num` helper:
```ruby
-# Gemfile
-gem 'fast_excel'
+date_format = workbook.number_format("[$-409]m/d/yy hh:mm;@")
+worksheet.write_number(0, 0, FastExcel.date_num(Time.now, Time.zone.utc_offset), date_format)
```
-Or
+
+**Formulas**: special type of value in excel
+```ruby
+worksheet << [1, 2, 3, 4]
+worksheet << [FastExcel::Formula.new("SUM(A1:D1)")] # A2 will be shown as 10
```
-gem install fast_excel
+
+**URL**: Link to website or something else
+```ruby
+url_format = workbook.add_format(underline: :underline_single, font_color: :blue) # format is optional
+worksheet.append_row([
+ FastExcel::URL.new("https://github.com/Paxa/fast_excel"),
+ FastExcel::URL.new("postgres://localhost")
+], url_format)
+# or
+worksheet.write_url(0, 2, "https://github.com/Paxa/fast_excel", url_format)
```
-## Column Auto Width
+### Data Formatting
+```ruby
+format = worksheet.add_format(
+ bold: true,
+ italic: true,
+ font_outline: true,
+ font_shadow: true,
+ text_wrap: true,
+ font_strikeout: true,
+ shrink: true,
+ text_justlast: true,
+ font_size: 13, # default is 11, use 0 for user's default
+ font_name: "Arial", # default is Calibri, also accessible via font_family
+ font_color: :orange, # can use RGB hex as "#FF0000" or 0x00FF00 or color name as symbol or string
+ font_script: :font_subscript,
+ rotation: 10,
+ underline: :underline_single, # or :underline_double or :underline_single_accounting or :underline_double_accounting
+ indent: 1,
+ # border styles
+ border: :border_thin,
+ left: :medium,
+ top: :dashed,
+ right: :double,
+ bottom: :hair,
+ bottom_color: :alice_blue,
+ top_color: "#11ABCD",
+ # Align
+ align: {h: :align_center, v: :align_vertical_center},
+ num_format: "#,##0.00"
+)
+```
+
+**Shortcuts**:
+```ruby
+workbook.bold_format # bold text
+workbook.number_format("[$-409]m/d/yy h:mm AM/PM;@") # format for date
+```
+
+### Set Column Width
+
+```ruby
+worksheet.set_column(start_col, end_col, width = nil, format = nil)
+# or
+worksheet.set_column_width(col, width = 60)
+# or
+worksheet.set_columns_width(start_col, end_col, width = 60)
+```
+
+### Set Row Height
+```ruby
+worksheet.set_row(row_num = 0, height = 30, format = nil)
+```
+
+### Column Auto Width
+
Column authwidth only works for string values, because numbers may have custom formatting
Enabling column auto widths will slow down writing string values for about 15-25%
```ruby
@@ -92,11 +190,11 @@
```
![fast_excel_auto_width](https://user-images.githubusercontent.com/26019/51788441-ba981300-21b0-11e9-9611-54dda78effcd.png)
-## API
+### API
This gem is FFI binding for libxlsxwriter C library with some syntax sugar. All original functions is avaliable, for example:
```ruby
Libxlsxwriter.worksheet_activate(worksheet) # => will call void worksheet_activate(lxw_worksheet *worksheet)
@@ -104,19 +202,31 @@
worksheet.activate
```
Full libxlsxwriter documentation: [http://libxlsxwriter.github.io/](http://libxlsxwriter.github.io/)
-Helper Methods:
+Generated rdoc: [rubydoc.info/github/Paxa/fast_excel](https://www.rubydoc.info/github/Paxa/fast_excel)
-* `FastExcel.open(filename = nil, constant_memory: false, default_format: {})` - open new workbook, if `filename` is nil - it will create tmp file, `default_format` will be called with `workbook.default_format.set(...)`
-* `FastExcel.date_num(time, offset = nil)` - generate Excel's internal date value, number of days since 1900-Jan-01, works faster then creating `Libxlsxwriter::Datetime` struct. `offset` argument is number hours from UTC, e.g. `3.5`
-* `FastExcel.print_ffi_obj(object)` - print FFI object fields, just for debugging
-* `workbook.bold_cell_format` - shortcut for creating bold format
-* `workbook.number_format(num_format)` - create number or date format, for money usually: `"#,##0.00"`, for date: `"[$-409]m/d/yy h:mm AM/PM;@"`
-* `workbook.read_string` - close workbook, read file to string, delete file (only if tmp file)
-* `workbook.remove_tmp_file` - delete tmp file (only if tmp file)
-* `worksheet.write_row(row_num, array_of_mixed_value, formats = nil)` - write values one by one, detecting type automatically. `formats` can be array, or Format object or nil
-* `format.font_family` - alias for `format.font_name`
-* `workbook.default_format.font_size` - set it to 0 if you want to use default font size (that what user set in Excel settings)
-* `worksheet.write_row(num, values_array, formats = nil)` - Write row of values
-* `worksheet.append_row(values_array, formats = nil)` - Append row of values ot the bottom of worksheet
+## Benchmarks
+
+1000 rows:
+```
+Comparison:
+ FastExcel: 31.7 i/s
+ Axlsx: 8.0 i/s - 3.98x slower
+ write_xlsx: 6.9 i/s - 4.62x slower
+```
+
+20000 rows:
+```
+Comparison:
+ FastExcel: 1.4 i/s
+ Axlsx: 0.4 i/s - 3.46x slower
+ write_xlsx: 0.1 i/s - 17.04x slower
+```
+
+Max memory usage, generating 100k rows:
+```
+FastExcel - 20 MB
+Axlsx - 60 MB
+write_xlsx - 100 MB
+```