fast_excel 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ ```