fast_excel 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. checksums.yaml +5 -5
  2. data/.dockerignore +2 -0
  3. data/.gitignore +7 -0
  4. data/.travis.yml +44 -0
  5. data/CHANGELOG.md +41 -1
  6. data/Dockerfile.test +16 -0
  7. data/Gemfile +5 -2
  8. data/Gemfile.lock +30 -23
  9. data/LICENSE +21 -0
  10. data/Makefile +13 -0
  11. data/README.md +177 -40
  12. data/Rakefile +16 -0
  13. data/appveyor.yml +25 -0
  14. data/benchmarks/1k_rows.rb +17 -4
  15. data/benchmarks/20k_rows.rb +4 -0
  16. data/benchmarks/auto_width.rb +37 -0
  17. data/benchmarks/init.rb +14 -2
  18. data/benchmarks/memory.rb +8 -0
  19. data/benchmarks/profiler.rb +27 -0
  20. data/benchmarks/write_value.rb +62 -0
  21. data/examples/example.rb +3 -4
  22. data/examples/example_align.rb +23 -0
  23. data/examples/example_auto_width.rb +26 -0
  24. data/examples/example_colors.rb +37 -0
  25. data/examples/example_filters.rb +36 -0
  26. data/examples/example_formula.rb +1 -5
  27. data/examples/example_hyperlink.rb +20 -0
  28. data/examples/example_image.rb +1 -1
  29. data/examples/example_styles.rb +27 -0
  30. data/examples/logo.png +0 -0
  31. data/ext/fast_excel/extconf.rb +3 -0
  32. data/ext/fast_excel/text_width_ext.c +460 -0
  33. data/fast_excel.gemspec +2 -3
  34. data/letters.html +114 -0
  35. data/lib/fast_excel.rb +455 -78
  36. data/lib/fast_excel/binding.rb +31 -21
  37. data/lib/fast_excel/binding/chart.rb +20 -1
  38. data/lib/fast_excel/binding/format.rb +11 -4
  39. data/lib/fast_excel/binding/workbook.rb +10 -2
  40. data/lib/fast_excel/binding/worksheet.rb +44 -27
  41. data/libxlsxwriter/.gitignore +1 -0
  42. data/libxlsxwriter/.indent.pro +8 -0
  43. data/libxlsxwriter/.travis.yml +12 -0
  44. data/libxlsxwriter/CMakeLists.txt +338 -0
  45. data/libxlsxwriter/CONTRIBUTING.md +1 -1
  46. data/libxlsxwriter/Changes.txt +162 -0
  47. data/libxlsxwriter/LICENSE.txt +65 -4
  48. data/libxlsxwriter/Makefile +33 -11
  49. data/libxlsxwriter/Readme.md +3 -1
  50. data/libxlsxwriter/cocoapods/libxlsxwriter-umbrella.h +2 -1
  51. data/libxlsxwriter/cocoapods/libxlsxwriter.modulemap +2 -2
  52. data/libxlsxwriter/include/xlsxwriter.h +2 -2
  53. data/libxlsxwriter/include/xlsxwriter/app.h +2 -2
  54. data/libxlsxwriter/include/xlsxwriter/chart.h +164 -13
  55. data/libxlsxwriter/include/xlsxwriter/chartsheet.h +544 -0
  56. data/libxlsxwriter/include/xlsxwriter/common.h +35 -6
  57. data/libxlsxwriter/include/xlsxwriter/content_types.h +5 -2
  58. data/libxlsxwriter/include/xlsxwriter/core.h +2 -2
  59. data/libxlsxwriter/include/xlsxwriter/custom.h +2 -2
  60. data/libxlsxwriter/include/xlsxwriter/drawing.h +3 -2
  61. data/libxlsxwriter/include/xlsxwriter/format.h +8 -8
  62. data/libxlsxwriter/include/xlsxwriter/hash_table.h +1 -1
  63. data/libxlsxwriter/include/xlsxwriter/packager.h +18 -8
  64. data/libxlsxwriter/include/xlsxwriter/relationships.h +2 -2
  65. data/libxlsxwriter/include/xlsxwriter/shared_strings.h +5 -3
  66. data/libxlsxwriter/include/xlsxwriter/styles.h +10 -5
  67. data/libxlsxwriter/include/xlsxwriter/theme.h +2 -2
  68. data/libxlsxwriter/include/xlsxwriter/utility.h +35 -5
  69. data/libxlsxwriter/include/xlsxwriter/workbook.h +234 -57
  70. data/libxlsxwriter/include/xlsxwriter/worksheet.h +780 -91
  71. data/libxlsxwriter/include/xlsxwriter/xmlwriter.h +4 -2
  72. data/libxlsxwriter/libxlsxwriter.podspec +4 -2
  73. data/libxlsxwriter/src/Makefile +31 -6
  74. data/libxlsxwriter/src/app.c +2 -2
  75. data/libxlsxwriter/src/chart.c +116 -23
  76. data/libxlsxwriter/src/chartsheet.c +508 -0
  77. data/libxlsxwriter/src/content_types.c +12 -4
  78. data/libxlsxwriter/src/core.c +11 -11
  79. data/libxlsxwriter/src/custom.c +3 -3
  80. data/libxlsxwriter/src/drawing.c +114 -17
  81. data/libxlsxwriter/src/format.c +5 -5
  82. data/libxlsxwriter/src/hash_table.c +1 -1
  83. data/libxlsxwriter/src/packager.c +378 -61
  84. data/libxlsxwriter/src/relationships.c +2 -2
  85. data/libxlsxwriter/src/shared_strings.c +18 -4
  86. data/libxlsxwriter/src/styles.c +59 -12
  87. data/libxlsxwriter/src/theme.c +2 -2
  88. data/libxlsxwriter/src/utility.c +93 -6
  89. data/libxlsxwriter/src/workbook.c +379 -61
  90. data/libxlsxwriter/src/worksheet.c +1240 -174
  91. data/libxlsxwriter/src/xmlwriter.c +18 -9
  92. data/libxlsxwriter/third_party/minizip/Makefile +6 -1
  93. data/libxlsxwriter/third_party/minizip/ioapi.c +10 -0
  94. data/libxlsxwriter/third_party/minizip/zip.c +2 -0
  95. data/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.c +2 -2
  96. data/libxlsxwriter/version.txt +1 -1
  97. data/test/auto_width_test.rb +19 -0
  98. data/test/date_test.rb +34 -0
  99. data/test/format_test.rb +179 -0
  100. data/test/reopen_test.rb +22 -0
  101. data/test/test_helper.rb +23 -4
  102. data/test/text_width_test.rb +80 -0
  103. data/test/tmpfile_test.rb +1 -0
  104. data/test/validations_test.rb +47 -0
  105. data/test/worksheet_test.rb +129 -0
  106. metadata +34 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ac39efd3391a98291ae2c1f5ba4102850b8ad678
4
- data.tar.gz: 7d2eb11896d20f80f20405778b009e09ac1b41ea
2
+ SHA256:
3
+ metadata.gz: af06f03372f15efb18eaf09669f7822ee81b67a5d4c6be7a55c3b8eb2609fd82
4
+ data.tar.gz: af892b143b010078e56380d38c76216ff19cb524f3e73c5206d18131546f216c
5
5
  SHA512:
6
- metadata.gz: ae26296476e89298ff1d584ae59e87e81f46a118e0c7583f5328fb12845afe970e1fe040c8783388e541d3b4077948957cec5923cd124d325475629e5272c495
7
- data.tar.gz: 921ca060bf7cb21c541dc0664767a13d5f95be2f76d7947c24e2677133c06cc21d558f925e372b4d49f4fc56977650a13c876883e3b0f3850ba2f4953ab565a5
6
+ metadata.gz: 979827252546904e71283dcf5996636fad7d04963ea1d07f6adf916484ac94a39e9b5a6f7d479529cb42971f53dc2dbadf0c08d1d57caf3eac7a91747308b6f2
7
+ data.tar.gz: 6a64e0cfa1894134759a2a1784c78c2641ff6aec2b81c48e9afb81fcc335d24ff7a0022f3ef252bb2ba0824fc8afe5220159829bee5bc32556687ed170009bbd
@@ -0,0 +1,2 @@
1
+ libxlsxwriter
2
+ .git
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  .ruby-version
2
+ .idea/
2
3
  try.c
3
4
  try.rb
4
5
  gen.rb
@@ -7,7 +8,13 @@ gen_ffi.rb
7
8
  a.out
8
9
  .DS_Store
9
10
  *.gem
11
+ *.cmake
12
+ libxlsxwriter/CmakeFiles
13
+ libxlsxwriter/CmakeCache.txt
10
14
  libxlsxwriter/dev
11
15
  libxlsxwriter/docs
12
16
  libxlsxwriter/examples
13
17
  libxlsxwriter/test
18
+ ext/fast_excel/text_width_ext.o
19
+ ext/fast_excel/Makefile
20
+ ext/fast_excel/text_width_ext.bundle
@@ -0,0 +1,44 @@
1
+ ---
2
+ language: ruby
3
+
4
+ matrix:
5
+ include:
6
+ # - os: linux
7
+ # rvm: 2.2.10
8
+ # - os: osx
9
+ # rvm: 2.2.10
10
+ - os: linux
11
+ rvm: 2.3.8
12
+ - os: osx
13
+ rvm: 2.3.8
14
+ - os: linux
15
+ rvm: 2.4.6
16
+ - os: osx
17
+ rvm: 2.4.6
18
+ - os: linux
19
+ rvm: 2.5.5
20
+ - os: osx
21
+ rvm: 2.5.5
22
+ - os: linux
23
+ rvm: 2.6.3
24
+ env: BUILD_DOCKER=true
25
+ services:
26
+ - docker
27
+ - os: osx
28
+ rvm: 2.6.3
29
+ osx_image: xcode10.2
30
+ before_script:
31
+ - ls -lah /Applications
32
+ - sudo xcode-select -s /Applications/Xcode-10.2.1.app/Contents/Developer
33
+ - clang --version
34
+ fast_finish: true
35
+
36
+ before_install:
37
+ - gem install bundler -v 2.0.2
38
+
39
+ script:
40
+ - bundle install
41
+ - make
42
+ - bundle exec rake test
43
+ - bundle exec rake examples
44
+ - if [ -n "$BUILD_DOCKER" ]; then docker build . -f Dockerfile.test --build-arg TRAVIS_COMMIT --build-arg TRAVIS_BRANCH ; fi
@@ -1,3 +1,43 @@
1
+ #### Version 0.3.0 - 23 jul 2020
2
+
3
+ * Add support for FastExcel::URL
4
+ * Add support for writing boolean values
5
+ * Add enable_filters!(end_col: X)
6
+ * Allow to open with an empty existing file
7
+ * Add missing enums to chart
8
+ * Don't change sheet name from "" to nil
9
+ * Support build with docker
10
+ * Fix crash when sheet name exceeds maximum length.
11
+ * [BREAKING CHANGE] Rename `worksheet.right_to_left` to `worksheet.set_right_to_left`:
12
+ - now it will work properly when using the `pry-rails` gem, not forcing the document start from right even when this method is not called.
13
+
14
+ #### Version 0.2.6 - 26 jan 2019
15
+
16
+ * Add column auto width (thanks to @duffyjp)
17
+
18
+ #### Version 0.2.5 - 22 jun 2018
19
+
20
+ * Update libxlsxwriter to 0.7.7
21
+
22
+ #### Version 0.2.4 - 13 mar 2018
23
+
24
+ * Update libxlsxwriter to 0.7.6
25
+ * Don’t crash process when duplicated worksheet name
26
+
27
+ #### Version 0.2.3 - 27 oct 2017
28
+
29
+ * Allow Date along with DateTime in write_value (thanks to @noxern)
30
+
31
+ #### Version 0.2.2 - 20 sep 2017
32
+
33
+ * Nice setters and getters for format.align
34
+ * Add nice setters for colors and borders
35
+ * Add sheet.append_row, sheet.last_row_number
36
+ * Run tests in CI
37
+ * Performance optimizations and type check refactoring
38
+ * Add styles_example.rb
39
+ * Fix assigning align from other format
40
+
1
41
  #### Version 0.2.1 - 20 jun 2017
2
42
 
3
43
  * Add FastExcel::Formula
@@ -10,4 +50,4 @@
10
50
 
11
51
  #### Version 0.1.0 - 24 feb 2017
12
52
 
13
- Initial
53
+ Initial
@@ -0,0 +1,16 @@
1
+ FROM ruby
2
+
3
+ RUN gem install fast_excel
4
+
5
+ ARG TRAVIS_COMMIT
6
+ ARG TRAVIS_BRANCH
7
+
8
+ RUN echo "source 'https://rubygems.org'" > Gemfile
9
+
10
+ RUN [ -z "$TRAVIS_COMMIT" ] && \
11
+ echo "gem 'fast_excel', git: 'https://github.com/Paxa/fast_excel.git'" >> Gemfile || true
12
+ RUN [ -z "$TRAVIS_COMMIT" ] || \
13
+ echo "gem 'fast_excel', git: 'https://github.com/Paxa/fast_excel.git', branch: '$TRAVIS_BRANCH', ref: '$TRAVIS_COMMIT'" >> Gemfile
14
+
15
+ RUN cat Gemfile
16
+ RUN bundle
data/Gemfile CHANGED
@@ -3,7 +3,9 @@ source 'https://rubygems.org'
3
3
  gem 'ffi'
4
4
  gem 'ffi_gen', require: false
5
5
 
6
- gem 'roo', '2.7.1', git: 'https://github.com/roo-rb/roo.git'
6
+ gem 'rake'
7
+
8
+ gem 'roo', '2.8.3', git: 'https://github.com/roo-rb/roo.git', tag: 'v2.8.3'
7
9
 
8
10
  gem 'minitest'
9
11
  gem 'minitest-reporters'
@@ -11,5 +13,6 @@ gem 'minitest-reporters'
11
13
  # For benchmakrs
12
14
  gem 'axlsx', git: 'https://github.com/randym/axlsx.git'
13
15
  gem 'write_xlsx'
16
+ gem 'xlsxtream'
14
17
  gem 'benchmark-ips'
15
- gem 'process_memory', git: 'https://github.com/paxa/process_memory'
18
+ gem 'process_memory', git: 'https://github.com/paxa/process_memory', platforms: :ruby
@@ -1,54 +1,59 @@
1
1
  GIT
2
2
  remote: https://github.com/paxa/process_memory
3
- revision: 1aa4df28c9a98903301317236104abe591e086fd
3
+ revision: 282c75336a4a6b92207cd1eaa57f20887b92601e
4
4
  specs:
5
5
  process_memory (0.1)
6
6
 
7
7
  GIT
8
8
  remote: https://github.com/randym/axlsx.git
9
- revision: c8ac844572b25fda358cc01d2104720c4c42f450
9
+ revision: 8e7b4b3b7259103452c191f73ce0bf64f66033fe
10
10
  specs:
11
- axlsx (2.1.0.pre)
12
- htmlentities (~> 4.3.4)
11
+ axlsx (3.0.0.pre)
12
+ htmlentities (~> 4.3, >= 4.3.4)
13
13
  mimemagic (~> 0.3)
14
- nokogiri (>= 1.6.6)
15
- rubyzip (>= 1.2.1)
14
+ nokogiri (~> 1.8, >= 1.8.2)
15
+ rubyzip (~> 1.2, >= 1.2.1)
16
16
 
17
17
  GIT
18
18
  remote: https://github.com/roo-rb/roo.git
19
- revision: 6bde8588dfd97d7a18981ee3ac7b444fec165a2c
19
+ revision: d416f1520c50bbab160ca2ed9a49498fcc3edf50
20
+ tag: v2.8.3
20
21
  specs:
21
- roo (2.7.1)
22
+ roo (2.8.3)
22
23
  nokogiri (~> 1)
23
- rubyzip (>= 1.2.1, < 2.0.0)
24
+ rubyzip (>= 1.3.0, < 3.0.0)
24
25
 
25
26
  GEM
26
27
  remote: https://rubygems.org/
27
28
  specs:
28
29
  ansi (1.5.0)
29
- benchmark-ips (2.7.2)
30
- builder (3.2.3)
31
- ffi (1.9.18)
30
+ benchmark-ips (2.8.2)
31
+ builder (3.2.4)
32
+ ffi (1.13.1)
32
33
  ffi_gen (1.2.0)
33
34
  ffi (~> 1.0)
34
35
  htmlentities (4.3.4)
35
- mimemagic (0.3.2)
36
- mini_portile2 (2.1.0)
37
- minitest (5.10.1)
38
- minitest-reporters (1.1.14)
36
+ mimemagic (0.3.5)
37
+ mini_portile2 (2.4.0)
38
+ minitest (5.14.1)
39
+ minitest-reporters (1.4.2)
39
40
  ansi
40
41
  builder
41
42
  minitest (>= 5.0)
42
43
  ruby-progressbar
43
- nokogiri (1.7.1)
44
- mini_portile2 (~> 2.1.0)
45
- ruby-progressbar (1.8.1)
46
- rubyzip (1.2.1)
47
- write_xlsx (0.83.0)
44
+ nokogiri (1.10.10)
45
+ mini_portile2 (~> 2.4.0)
46
+ rake (13.0.1)
47
+ ruby-progressbar (1.10.1)
48
+ rubyzip (1.3.0)
49
+ write_xlsx (0.85.7)
48
50
  rubyzip (>= 1.0.0)
49
51
  zip-zip
52
+ xlsxtream (2.4.0)
53
+ zip_tricks (>= 4.5, < 6)
50
54
  zip-zip (0.3)
51
55
  rubyzip (>= 1.0.0)
56
+ zip_tricks (5.3.1)
52
57
 
53
58
  PLATFORMS
54
59
  ruby
@@ -61,8 +66,10 @@ DEPENDENCIES
61
66
  minitest
62
67
  minitest-reporters
63
68
  process_memory!
64
- roo (= 2.7.1)!
69
+ rake
70
+ roo (= 2.8.3)!
65
71
  write_xlsx
72
+ xlsxtream
66
73
 
67
74
  BUNDLED WITH
68
- 1.14.5
75
+ 2.0.2
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2017 Pavel Evstigneev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/Makefile CHANGED
@@ -3,9 +3,22 @@ ifdef V
3
3
  Q=
4
4
  endif
5
5
 
6
+ # with xcode better to use cmake
7
+ UNAME_S := $(shell uname -s)
8
+ ifeq ($(UNAME_S),"Darwin")
9
+ USE_CMAKE := $(shell command -v cmake 2> /dev/null)
10
+ endif
11
+
6
12
  all :
13
+ # @echo "Compiling ext/text_width ..."
14
+ # rake compile
7
15
  @echo "Compiling libxlsxwriter ..."
16
+ ifdef USE_CMAKE
17
+ @echo "run cmake libxlsxwriter ..."
18
+ cmake libxlsxwriter
19
+ else
8
20
  $(Q)$(MAKE) -C libxlsxwriter
21
+ endif
9
22
 
10
23
  clean :
11
24
  $(Q)$(MAKE) clean -C libxlsxwriter
data/README.md CHANGED
@@ -1,9 +1,9 @@
1
- # Ultra Fast Excel Writter for Ruby
1
+ # Ultra Fast Excel Writer for Ruby
2
2
 
3
3
  ```ruby
4
4
  require 'fast_excel'
5
5
 
6
- workbook = FastExcel.open("hello_world_ffi.xlsx", constant_memory: true)
6
+ workbook = FastExcel.open("hello_world.xlsx", constant_memory: true)
7
7
  workbook.default_format.set(
8
8
  font_size: 0, # user's default
9
9
  font_family: "Arial"
@@ -11,7 +11,7 @@ workbook.default_format.set(
11
11
 
12
12
  worksheet = workbook.add_worksheet("Example Report")
13
13
 
14
- bold = workbook.bold_cell_format
14
+ bold = workbook.bold_format
15
15
  worksheet.set_column(0, 0, FastExcel::DEF_COL_WIDTH, bold)
16
16
 
17
17
  price = workbook.number_format("#,##0.00")
@@ -20,56 +20,179 @@ worksheet.set_column(1, 1, 20, price)
20
20
  date_format = workbook.number_format("[$-409]m/d/yy h:mm AM/PM;@")
21
21
  worksheet.set_column(2, 2, 20, date_format)
22
22
 
23
- worksheet.write_row(0, ["message", "price", "date"], bold)
23
+ worksheet.append_row(["message", "price", "date"], bold)
24
24
 
25
25
  for i in 1..1000
26
- worksheet.write_row(i, ["Hello", (rand * 10_000_000).round(2), Time.now])
26
+ worksheet.append_row(["Hello", (rand * 10_000_000).round(2), Time.now])
27
27
  end
28
28
 
29
- worksheet.write_row(1001, ["Sum", FastExcel::Formula.new("SUM(B2:B1001)")], bold)
29
+ worksheet.append_row(["Sum", FastExcel::Formula.new("SUM(B2:B1001)")], bold)
30
30
 
31
31
  workbook.close
32
32
  ```
33
33
 
34
- This repositiry and gem contain sources of [libxlsxwriter](https://github.com/jmcnamara/libxlsxwriter)
34
+ See [more examples](https://github.com/Paxa/fast_excel/tree/master/examples)
35
35
 
36
- ## Benchmarks
36
+ This repository and gem contain sources of [libxlsxwriter](https://github.com/jmcnamara/libxlsxwriter)
37
37
 
38
- 1000 rows:
38
+ ## Install
39
+
40
+ ```ruby
41
+ # Gemfile
42
+ gem 'fast_excel'
39
43
  ```
40
- Comparison:
41
- FastExcel: 31.7 i/s
42
- Axlsx: 8.0 i/s - 3.98x slower
43
- write_xlsx: 6.9 i/s - 4.62x slower
44
+ Or
45
+ ```
46
+ gem install fast_excel
44
47
  ```
45
48
 
46
- 20000 rows:
49
+
50
+
51
+ ### Create Document
52
+ ```ruby
53
+ workbook = FastExcel.open # creates tmp file
54
+ # ...
55
+ send_data(workbook.read_string, filename: "table.xlsx") # read tmp file and delete it
47
56
  ```
48
- Comparison:
49
- FastExcel: 1.4 i/s
50
- Axlsx: 0.4 i/s - 3.46x slower
51
- write_xlsx: 0.1 i/s - 17.04x slower
57
+
58
+ Also can use `workbook.remove_tmp_file` to delete tmp file manually
59
+
60
+
61
+ **Constant memory mode**: saves each row to disk, good for really big files but can not change previous lines that already saved
62
+ ```ruby
63
+ workbook = FastExcel.open(constant_memory: true)
52
64
  ```
53
65
 
54
- Max memory usage, generating 100k rows:
66
+ **Save to file**
67
+ ```ruby
68
+ workbook = FastExcel.open("my_dinner.xlsx")
55
69
  ```
56
- FastExcel - 20 MB
57
- Axlsx - 60 MB
58
- write_xlsx - 100 MB
70
+
71
+ ### Write Data
72
+ FastExcel will automatically detect data type and one of `write_number` or `write_datetime` or `write_formula` or `write_string` or `write_url`
73
+ ```ruby
74
+ workbook = FastExcel.open
75
+ worksheet = workbook.add_worksheet
76
+
77
+ # write specific type value value
78
+ worksheet.write_number(row = 0, col = 5, 1_234_567, format = nil)
79
+
80
+ # write value with type detection
81
+ worksheet.write_value(row = 0, col = 5, 1_234_567, format = nil)
82
+
83
+ # write row of values. format argument can be format object or array of format objects
84
+ worksheet.write_row(row = 1, ["strong", 123_456, Time.now], format = nil)
85
+
86
+ # write row to the bottom
87
+ worksheet.append_row(["strong", 123_456, Time.now], )
88
+
89
+ # shortcut for append_row()
90
+ worksheet << ["strong", 123_456, Time.now]
59
91
  ```
60
92
 
61
- ## Install
93
+ **Saving dates**: excel store dates as number of days since 1st January 1900, and FastExcel will make it for you.
62
94
 
95
+ To make saving of dates slightly faster can use `FastExcel.date_num` helper:
63
96
  ```ruby
64
- # Gemfile
65
- gem 'fast_excel'
97
+ date_format = workbook.number_format("[$-409]m/d/yy hh:mm;@")
98
+ worksheet.write_number(0, 0, FastExcel.date_num(Time.now, Time.zone.utc_offset), date_format)
66
99
  ```
67
- Or
100
+
101
+ **Formulas**: special type of value in excel
102
+ ```ruby
103
+ worksheet << [1, 2, 3, 4]
104
+ worksheet << [FastExcel::Formula.new("SUM(A1:D1)")] # A2 will be shown as 10
68
105
  ```
69
- gem install fast_excel
106
+
107
+ **URL**: Link to website or something else
108
+ ```ruby
109
+ url_format = workbook.add_format(underline: :underline_single, font_color: :blue) # format is optional
110
+ worksheet.append_row([
111
+ FastExcel::URL.new("https://github.com/Paxa/fast_excel"),
112
+ FastExcel::URL.new("postgres://localhost")
113
+ ], url_format)
114
+ # or
115
+ worksheet.write_url(0, 2, "https://github.com/Paxa/fast_excel", url_format)
116
+ ```
117
+
118
+
119
+ ### Data Formatting
120
+ ```ruby
121
+ format = worksheet.add_format(
122
+ bold: true,
123
+ italic: true,
124
+ font_outline: true,
125
+ font_shadow: true,
126
+ text_wrap: true,
127
+ font_strikeout: true,
128
+ shrink: true,
129
+ text_justlast: true,
130
+ font_size: 13, # default is 11, use 0 for user's default
131
+ font_name: "Arial", # default is Calibri, also accessible via font_family
132
+ font_color: :orange, # can use RGB hex as "#FF0000" or 0x00FF00 or color name as symbol or string
133
+ font_script: :font_subscript,
134
+ rotation: 10,
135
+ underline: :underline_single, # or :underline_double or :underline_single_accounting or :underline_double_accounting
136
+ indent: 1,
137
+ # border styles
138
+ border: :border_thin,
139
+ left: :medium,
140
+ top: :dashed,
141
+ right: :double,
142
+ bottom: :hair,
143
+ bottom_color: :alice_blue,
144
+ top_color: "#11ABCD",
145
+ # Align
146
+ align: {h: :align_center, v: :align_vertical_center},
147
+ num_format: "#,##0.00"
148
+ )
70
149
  ```
71
150
 
72
- ## API
151
+ **Shortcuts**:
152
+ ```ruby
153
+ workbook.bold_format # bold text
154
+ workbook.number_format("[$-409]m/d/yy h:mm AM/PM;@") # format for date
155
+ ```
156
+
157
+ ### Set Column Width
158
+
159
+ ```ruby
160
+ worksheet.set_column(start_col, end_col, width = nil, format = nil)
161
+ # or
162
+ worksheet.set_column_width(col, width = 60)
163
+ # or
164
+ worksheet.set_columns_width(start_col, end_col, width = 60)
165
+ ```
166
+
167
+ ### Set Row Height
168
+ ```ruby
169
+ worksheet.set_row(row_num = 0, height = 30, format = nil)
170
+ ```
171
+
172
+ ### Column Auto Width
173
+
174
+ Column authwidth only works for string values, because numbers may have custom formatting
175
+
176
+ Enabling column auto widths will slow down writing string values for about 15-25%
177
+
178
+ ```ruby
179
+ require 'fast_excel'
180
+
181
+ workbook = FastExcel.open(constant_memory: true)
182
+
183
+ worksheet = workbook.add_worksheet
184
+ worksheet.auto_width = true
185
+
186
+ worksheet.append_row(["some text", "some longer text for example"])
187
+
188
+ content = workbook.read_string
189
+ File.open('./some_file.xlsx', 'wb') {|f| f.write(content) }
190
+ ```
191
+
192
+ ![fast_excel_auto_width](https://user-images.githubusercontent.com/26019/51788441-ba981300-21b0-11e9-9611-54dda78effcd.png)
193
+
194
+
195
+ ### API
73
196
 
74
197
  This gem is FFI binding for libxlsxwriter C library with some syntax sugar. All original functions is avaliable, for example:
75
198
 
@@ -81,15 +204,29 @@ worksheet.activate
81
204
 
82
205
  Full libxlsxwriter documentation: [http://libxlsxwriter.github.io/](http://libxlsxwriter.github.io/)
83
206
 
84
- Helper Methods:
85
-
86
- * `FastExcel.open(filename = nil, constant_memory: false, default_format: {})` - open new workbook, if `filename` is nil - it will craete tmp file, `default_format` will be called with `workbook.default_format.set(...)`
87
- * `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`
88
- * `FastExcel.print_ffi_obj(object)` - print FFI object fields, just for debugging
89
- * `workbook.bold_cell_format` - shortcut for creating bold format
90
- * `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;@"`
91
- * `workbook.read_string` - close workbook, read file to string, delete file (only if tmp file)
92
- * `workbook.remove_tmp_file` - delete tmp file (only if tmp file)
93
- * `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
94
- * `format.font_family` - alias for `format.font_name`
95
- * `workbook.default_format.font_size` - set it to 0 if you want to use default font size (that what user set in Excel settings)
207
+ Generated rdoc: [rubydoc.info/github/Paxa/fast_excel](https://www.rubydoc.info/github/Paxa/fast_excel)
208
+
209
+ ## Benchmarks
210
+
211
+ 1000 rows:
212
+ ```
213
+ Comparison:
214
+ FastExcel: 31.7 i/s
215
+ Axlsx: 8.0 i/s - 3.98x slower
216
+ write_xlsx: 6.9 i/s - 4.62x slower
217
+ ```
218
+
219
+ 20000 rows:
220
+ ```
221
+ Comparison:
222
+ FastExcel: 1.4 i/s
223
+ Axlsx: 0.4 i/s - 3.46x slower
224
+ write_xlsx: 0.1 i/s - 17.04x slower
225
+ ```
226
+
227
+ Max memory usage, generating 100k rows:
228
+ ```
229
+ FastExcel - 20 MB
230
+ Axlsx - 60 MB
231
+ write_xlsx - 100 MB
232
+ ```