kmadej_fast_excel_fork 0.2.2
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.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.travis.yml +28 -0
- data/CHANGELOG.md +13 -0
- data/Gemfile +17 -0
- data/Gemfile.lock +70 -0
- data/Makefile +14 -0
- data/README.md +95 -0
- data/Rakefile +24 -0
- data/appveyor.yml +25 -0
- data/benchmarks/1k_rows.rb +59 -0
- data/benchmarks/20k_rows.rb +26 -0
- data/benchmarks/init.rb +59 -0
- data/benchmarks/memory.rb +49 -0
- data/examples/example.rb +42 -0
- data/examples/example_align.rb +23 -0
- data/examples/example_chart.rb +21 -0
- data/examples/example_colors.rb +37 -0
- data/examples/example_formula.rb +18 -0
- data/examples/example_image.rb +13 -0
- data/examples/example_styles.rb +27 -0
- data/examples/logo.png +0 -0
- data/extconf.rb +0 -0
- data/fast_excel.gemspec +20 -0
- data/lib/fast_excel.rb +600 -0
- data/lib/fast_excel/binding.rb +2819 -0
- data/lib/fast_excel/binding/chart.rb +2666 -0
- data/lib/fast_excel/binding/format.rb +1177 -0
- data/lib/fast_excel/binding/workbook.rb +338 -0
- data/lib/fast_excel/binding/worksheet.rb +1555 -0
- data/libxlsxwriter/.gitignore +49 -0
- data/libxlsxwriter/.indent.pro +125 -0
- data/libxlsxwriter/.travis.yml +25 -0
- data/libxlsxwriter/CONTRIBUTING.md +226 -0
- data/libxlsxwriter/Changes.txt +557 -0
- data/libxlsxwriter/LICENSE.txt +89 -0
- data/libxlsxwriter/Makefile +156 -0
- data/libxlsxwriter/Readme.md +78 -0
- data/libxlsxwriter/cocoapods/libxlsxwriter-umbrella.h +30 -0
- data/libxlsxwriter/cocoapods/libxlsxwriter.modulemap +7 -0
- data/libxlsxwriter/include/xlsxwriter.h +23 -0
- data/libxlsxwriter/include/xlsxwriter/app.h +79 -0
- data/libxlsxwriter/include/xlsxwriter/chart.h +3476 -0
- data/libxlsxwriter/include/xlsxwriter/common.h +372 -0
- data/libxlsxwriter/include/xlsxwriter/content_types.h +74 -0
- data/libxlsxwriter/include/xlsxwriter/core.h +51 -0
- data/libxlsxwriter/include/xlsxwriter/custom.h +52 -0
- data/libxlsxwriter/include/xlsxwriter/drawing.h +111 -0
- data/libxlsxwriter/include/xlsxwriter/format.h +1214 -0
- data/libxlsxwriter/include/xlsxwriter/hash_table.h +76 -0
- data/libxlsxwriter/include/xlsxwriter/packager.h +80 -0
- data/libxlsxwriter/include/xlsxwriter/relationships.h +77 -0
- data/libxlsxwriter/include/xlsxwriter/shared_strings.h +83 -0
- data/libxlsxwriter/include/xlsxwriter/styles.h +77 -0
- data/libxlsxwriter/include/xlsxwriter/theme.h +47 -0
- data/libxlsxwriter/include/xlsxwriter/third_party/ioapi.h +214 -0
- data/libxlsxwriter/include/xlsxwriter/third_party/queue.h +694 -0
- data/libxlsxwriter/include/xlsxwriter/third_party/tmpfileplus.h +53 -0
- data/libxlsxwriter/include/xlsxwriter/third_party/tree.h +801 -0
- data/libxlsxwriter/include/xlsxwriter/third_party/zip.h +375 -0
- data/libxlsxwriter/include/xlsxwriter/utility.h +166 -0
- data/libxlsxwriter/include/xlsxwriter/workbook.h +757 -0
- data/libxlsxwriter/include/xlsxwriter/worksheet.h +2641 -0
- data/libxlsxwriter/include/xlsxwriter/xmlwriter.h +178 -0
- data/libxlsxwriter/lib/.gitignore +0 -0
- data/libxlsxwriter/libxlsxwriter.podspec +47 -0
- data/libxlsxwriter/src/Makefile +130 -0
- data/libxlsxwriter/src/app.c +443 -0
- data/libxlsxwriter/src/chart.c +6346 -0
- data/libxlsxwriter/src/content_types.c +345 -0
- data/libxlsxwriter/src/core.c +293 -0
- data/libxlsxwriter/src/custom.c +224 -0
- data/libxlsxwriter/src/drawing.c +746 -0
- data/libxlsxwriter/src/format.c +729 -0
- data/libxlsxwriter/src/hash_table.c +223 -0
- data/libxlsxwriter/src/packager.c +948 -0
- data/libxlsxwriter/src/relationships.c +245 -0
- data/libxlsxwriter/src/shared_strings.c +266 -0
- data/libxlsxwriter/src/styles.c +1088 -0
- data/libxlsxwriter/src/theme.c +348 -0
- data/libxlsxwriter/src/utility.c +515 -0
- data/libxlsxwriter/src/workbook.c +1930 -0
- data/libxlsxwriter/src/worksheet.c +5022 -0
- data/libxlsxwriter/src/xmlwriter.c +355 -0
- data/libxlsxwriter/third_party/minizip/Makefile +44 -0
- data/libxlsxwriter/third_party/minizip/Makefile.am +45 -0
- data/libxlsxwriter/third_party/minizip/Makefile.orig +25 -0
- data/libxlsxwriter/third_party/minizip/MiniZip64_Changes.txt +6 -0
- data/libxlsxwriter/third_party/minizip/MiniZip64_info.txt +74 -0
- data/libxlsxwriter/third_party/minizip/README.txt +5 -0
- data/libxlsxwriter/third_party/minizip/configure.ac +32 -0
- data/libxlsxwriter/third_party/minizip/crypt.h +131 -0
- data/libxlsxwriter/third_party/minizip/ioapi.c +247 -0
- data/libxlsxwriter/third_party/minizip/ioapi.h +208 -0
- data/libxlsxwriter/third_party/minizip/iowin32.c +456 -0
- data/libxlsxwriter/third_party/minizip/iowin32.h +28 -0
- data/libxlsxwriter/third_party/minizip/make_vms.com +25 -0
- data/libxlsxwriter/third_party/minizip/miniunz.c +660 -0
- data/libxlsxwriter/third_party/minizip/miniunzip.1 +63 -0
- data/libxlsxwriter/third_party/minizip/minizip.1 +46 -0
- data/libxlsxwriter/third_party/minizip/minizip.c +520 -0
- data/libxlsxwriter/third_party/minizip/minizip.pc.in +12 -0
- data/libxlsxwriter/third_party/minizip/mztools.c +291 -0
- data/libxlsxwriter/third_party/minizip/mztools.h +37 -0
- data/libxlsxwriter/third_party/minizip/unzip.c +2125 -0
- data/libxlsxwriter/third_party/minizip/unzip.h +437 -0
- data/libxlsxwriter/third_party/minizip/zip.c +2007 -0
- data/libxlsxwriter/third_party/minizip/zip.h +367 -0
- data/libxlsxwriter/third_party/tmpfileplus/Makefile +42 -0
- data/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.c +342 -0
- data/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.h +53 -0
- data/libxlsxwriter/version.txt +1 -0
- data/test/date_test.rb +22 -0
- data/test/default_format_test.rb +19 -0
- data/test/format_test.rb +171 -0
- data/test/test_helper.rb +52 -0
- data/test/tmpfile_test.rb +23 -0
- data/test/worksheet_test.rb +86 -0
- metadata +182 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 2c036baf1c91ac62746a505b2a05e5911da35172
|
|
4
|
+
data.tar.gz: 7b984910b9ba3a6f8a081fff195665815a4d6810
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 7da1e648fc700d7ed47bd41bdfdf0fe11041e0cbc3671208d65afc0a76c43e85137f8de648ea1327905ce2fbd5ca9d2fd5bb5739a107d3644de808f407e32d42
|
|
7
|
+
data.tar.gz: 0184f0ac3e58b9acf1f44a3627bac1e7d1083cc32a211ec7c2ddd9846d3202152847960af57102f9c3bbe230b0a066b1dedc4b1238a9017414289cfaac1d4cf1
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
language: ruby
|
|
3
|
+
|
|
4
|
+
matrix:
|
|
5
|
+
include:
|
|
6
|
+
- os: linux
|
|
7
|
+
rvm: 2.1
|
|
8
|
+
- os: osx
|
|
9
|
+
rvm: 2.1
|
|
10
|
+
- os: linux
|
|
11
|
+
rvm: 2.2.7
|
|
12
|
+
- os: osx
|
|
13
|
+
rvm: 2.2.7
|
|
14
|
+
- os: linux
|
|
15
|
+
rvm: 2.3.4
|
|
16
|
+
- os: osx
|
|
17
|
+
rvm: 2.3.4
|
|
18
|
+
- os: linux
|
|
19
|
+
rvm: 2.4.0
|
|
20
|
+
- os: osx
|
|
21
|
+
rvm: 2.4.0
|
|
22
|
+
fast_finish: true
|
|
23
|
+
|
|
24
|
+
script:
|
|
25
|
+
- bundle install
|
|
26
|
+
- make
|
|
27
|
+
- bundle exec rake test
|
|
28
|
+
- bundle exec rake examples
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
source 'https://rubygems.org'
|
|
2
|
+
|
|
3
|
+
gem 'ffi'
|
|
4
|
+
gem 'ffi_gen', require: false
|
|
5
|
+
|
|
6
|
+
gem 'rake'
|
|
7
|
+
|
|
8
|
+
gem 'roo', '2.7.1', git: 'https://github.com/roo-rb/roo.git'
|
|
9
|
+
|
|
10
|
+
gem 'minitest'
|
|
11
|
+
gem 'minitest-reporters'
|
|
12
|
+
|
|
13
|
+
# For benchmakrs
|
|
14
|
+
gem 'axlsx', git: 'https://github.com/randym/axlsx.git'
|
|
15
|
+
gem 'write_xlsx'
|
|
16
|
+
gem 'benchmark-ips'
|
|
17
|
+
gem 'process_memory', git: 'https://github.com/paxa/process_memory', platforms: :ruby
|
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
GIT
|
|
2
|
+
remote: https://github.com/paxa/process_memory
|
|
3
|
+
revision: 1aa4df28c9a98903301317236104abe591e086fd
|
|
4
|
+
specs:
|
|
5
|
+
process_memory (0.1)
|
|
6
|
+
|
|
7
|
+
GIT
|
|
8
|
+
remote: https://github.com/randym/axlsx.git
|
|
9
|
+
revision: c8ac844572b25fda358cc01d2104720c4c42f450
|
|
10
|
+
specs:
|
|
11
|
+
axlsx (2.1.0.pre)
|
|
12
|
+
htmlentities (~> 4.3.4)
|
|
13
|
+
mimemagic (~> 0.3)
|
|
14
|
+
nokogiri (>= 1.6.6)
|
|
15
|
+
rubyzip (>= 1.2.1)
|
|
16
|
+
|
|
17
|
+
GIT
|
|
18
|
+
remote: https://github.com/roo-rb/roo.git
|
|
19
|
+
revision: 85c2736b0ea1c984391688c5aeb4acf85f225405
|
|
20
|
+
specs:
|
|
21
|
+
roo (2.7.1)
|
|
22
|
+
nokogiri (~> 1)
|
|
23
|
+
rubyzip (>= 1.2.1, < 2.0.0)
|
|
24
|
+
|
|
25
|
+
GEM
|
|
26
|
+
remote: https://rubygems.org/
|
|
27
|
+
specs:
|
|
28
|
+
ansi (1.5.0)
|
|
29
|
+
benchmark-ips (2.7.2)
|
|
30
|
+
builder (3.2.3)
|
|
31
|
+
ffi (1.9.18)
|
|
32
|
+
ffi_gen (1.2.0)
|
|
33
|
+
ffi (~> 1.0)
|
|
34
|
+
htmlentities (4.3.4)
|
|
35
|
+
mimemagic (0.3.2)
|
|
36
|
+
mini_portile2 (2.2.0)
|
|
37
|
+
minitest (5.10.2)
|
|
38
|
+
minitest-reporters (1.1.14)
|
|
39
|
+
ansi
|
|
40
|
+
builder
|
|
41
|
+
minitest (>= 5.0)
|
|
42
|
+
ruby-progressbar
|
|
43
|
+
nokogiri (1.8.0)
|
|
44
|
+
mini_portile2 (~> 2.2.0)
|
|
45
|
+
rake (12.0.0)
|
|
46
|
+
ruby-progressbar (1.8.1)
|
|
47
|
+
rubyzip (1.2.1)
|
|
48
|
+
write_xlsx (0.85.1)
|
|
49
|
+
rubyzip (>= 1.0.0)
|
|
50
|
+
zip-zip
|
|
51
|
+
zip-zip (0.3)
|
|
52
|
+
rubyzip (>= 1.0.0)
|
|
53
|
+
|
|
54
|
+
PLATFORMS
|
|
55
|
+
ruby
|
|
56
|
+
|
|
57
|
+
DEPENDENCIES
|
|
58
|
+
axlsx!
|
|
59
|
+
benchmark-ips
|
|
60
|
+
ffi
|
|
61
|
+
ffi_gen
|
|
62
|
+
minitest
|
|
63
|
+
minitest-reporters
|
|
64
|
+
process_memory!
|
|
65
|
+
rake
|
|
66
|
+
roo (= 2.7.1)!
|
|
67
|
+
write_xlsx
|
|
68
|
+
|
|
69
|
+
BUNDLED WITH
|
|
70
|
+
1.15.1
|
data/Makefile
ADDED
data/README.md
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Ultra Fast Excel Writter for Ruby
|
|
2
|
+
|
|
3
|
+
```ruby
|
|
4
|
+
require 'fast_excel'
|
|
5
|
+
|
|
6
|
+
workbook = FastExcel.open("hello_world_ffi.xlsx", constant_memory: true)
|
|
7
|
+
workbook.default_format.set(
|
|
8
|
+
font_size: 0, # user's default
|
|
9
|
+
font_family: "Arial"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
worksheet = workbook.add_worksheet("Example Report")
|
|
13
|
+
|
|
14
|
+
bold = workbook.bold_cell_format
|
|
15
|
+
worksheet.set_column(0, 0, FastExcel::DEF_COL_WIDTH, bold)
|
|
16
|
+
|
|
17
|
+
price = workbook.number_format("#,##0.00")
|
|
18
|
+
worksheet.set_column(1, 1, 20, price)
|
|
19
|
+
|
|
20
|
+
date_format = workbook.number_format("[$-409]m/d/yy h:mm AM/PM;@")
|
|
21
|
+
worksheet.set_column(2, 2, 20, date_format)
|
|
22
|
+
|
|
23
|
+
worksheet.write_row(0, ["message", "price", "date"], bold)
|
|
24
|
+
|
|
25
|
+
for i in 1..1000
|
|
26
|
+
worksheet.write_row(i, ["Hello", (rand * 10_000_000).round(2), Time.now])
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
worksheet.write_row(1001, ["Sum", FastExcel::Formula.new("SUM(B2:B1001)")], bold)
|
|
30
|
+
|
|
31
|
+
workbook.close
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
This repositiry and gem contain sources of [libxlsxwriter](https://github.com/jmcnamara/libxlsxwriter)
|
|
35
|
+
|
|
36
|
+
## Benchmarks
|
|
37
|
+
|
|
38
|
+
1000 rows:
|
|
39
|
+
```
|
|
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
|
+
```
|
|
45
|
+
|
|
46
|
+
20000 rows:
|
|
47
|
+
```
|
|
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
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Max memory usage, generating 100k rows:
|
|
55
|
+
```
|
|
56
|
+
FastExcel - 20 MB
|
|
57
|
+
Axlsx - 60 MB
|
|
58
|
+
write_xlsx - 100 MB
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Install
|
|
62
|
+
|
|
63
|
+
```ruby
|
|
64
|
+
# Gemfile
|
|
65
|
+
gem 'fast_excel'
|
|
66
|
+
```
|
|
67
|
+
Or
|
|
68
|
+
```
|
|
69
|
+
gem install fast_excel
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## API
|
|
73
|
+
|
|
74
|
+
This gem is FFI binding for libxlsxwriter C library with some syntax sugar. All original functions is avaliable, for example:
|
|
75
|
+
|
|
76
|
+
```ruby
|
|
77
|
+
Libxlsxwriter.worksheet_activate(worksheet) # => will call void worksheet_activate(lxw_worksheet *worksheet)
|
|
78
|
+
# or shorter:
|
|
79
|
+
worksheet.activate
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Full libxlsxwriter documentation: [http://libxlsxwriter.github.io/](http://libxlsxwriter.github.io/)
|
|
83
|
+
|
|
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)
|
data/Rakefile
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
desc "Sync github.com:Paxa/libxlsxwriter to ./libxlsxwriter"
|
|
2
|
+
task :sync do
|
|
3
|
+
require 'fileutils'
|
|
4
|
+
FileUtils.rm_rf("./libxlsxwriter")
|
|
5
|
+
system("git clone --depth 10 git@github.com:Paxa/libxlsxwriter.git")
|
|
6
|
+
Dir.chdir("./libxlsxwriter") do
|
|
7
|
+
system("git show --pretty='format:%cd %h' --date=iso --quiet > version.txt")
|
|
8
|
+
FileUtils.rm_rf("./.git")
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
require 'rake/testtask'
|
|
13
|
+
|
|
14
|
+
Rake::TestTask.new do |test|
|
|
15
|
+
test.test_files = Dir.glob('test/**/*_test.rb')
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
#task :default => :test
|
|
19
|
+
|
|
20
|
+
task :examples do
|
|
21
|
+
Dir.glob('examples/**/*.rb').each do |file|
|
|
22
|
+
require './' + file.sub(/\.rb$/, '')
|
|
23
|
+
end
|
|
24
|
+
end
|
data/appveyor.yml
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
install:
|
|
2
|
+
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
|
|
3
|
+
- SET PATH=C:\MinGW\bin;%PATH%
|
|
4
|
+
- SET RAKEOPT=-rdevkit
|
|
5
|
+
- copy c:\MinGW\bin\mingw32-make.exe c:\MinGW\bin\make.exe
|
|
6
|
+
- ruby --version
|
|
7
|
+
- gem --version
|
|
8
|
+
- bundle install
|
|
9
|
+
- make
|
|
10
|
+
|
|
11
|
+
build: off
|
|
12
|
+
|
|
13
|
+
test_script:
|
|
14
|
+
- bundle exec rake test
|
|
15
|
+
|
|
16
|
+
environment:
|
|
17
|
+
matrix:
|
|
18
|
+
- ruby_version: "24"
|
|
19
|
+
- ruby_version: "24-x64"
|
|
20
|
+
- ruby_version: "23"
|
|
21
|
+
- ruby_version: "23-x64"
|
|
22
|
+
- ruby_version: "22"
|
|
23
|
+
- ruby_version: "22-x64"
|
|
24
|
+
- ruby_version: "21"
|
|
25
|
+
- ruby_version: "21-x64"
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require_relative 'init'
|
|
2
|
+
|
|
3
|
+
HEADERS = ["id", "name", "age", "date"]
|
|
4
|
+
|
|
5
|
+
DATA = []
|
|
6
|
+
1000.times do |n|
|
|
7
|
+
DATA << [n, "String string #{n}", (n * rand * 10).round, Time.at(n * 1000 + 1492922688)]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
Benchmark.ips do |x|
|
|
11
|
+
x.config(time: 10, warmup: 2)
|
|
12
|
+
|
|
13
|
+
x.report("FastExcel") do
|
|
14
|
+
workbook = FastExcel.open(constant_memory: true)
|
|
15
|
+
worksheet = workbook.add_worksheet("benchmark")
|
|
16
|
+
|
|
17
|
+
worksheet.write_row(0, HEADERS)
|
|
18
|
+
DATA.each_with_index do |row, i|
|
|
19
|
+
worksheet.write_row(i + 1, row)
|
|
20
|
+
end
|
|
21
|
+
workbook.read_string
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
x.report("Axlsx") do
|
|
25
|
+
filename = "#{Dir.mktmpdir}/axlsx.xlsx"
|
|
26
|
+
Axlsx::Package.new do |package|
|
|
27
|
+
package.use_autowidth = false
|
|
28
|
+
package.workbook.add_worksheet do |sheet|
|
|
29
|
+
sheet.add_row(HEADERS)
|
|
30
|
+
DATA.each do |row|
|
|
31
|
+
sheet.add_row(row)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
package.serialize(filename)
|
|
35
|
+
File.open(filename, 'rb', &:read)
|
|
36
|
+
File.delete(filename)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
x.report("write_xlsx") do
|
|
41
|
+
filename = "#{Dir.mktmpdir}/write_xlsx.xlsx"
|
|
42
|
+
workbook = WriteXLSX.new(filename)
|
|
43
|
+
worksheet = workbook.add_worksheet
|
|
44
|
+
HEADERS.each_with_index do |value, i|
|
|
45
|
+
worksheet.write(0, i, value)
|
|
46
|
+
end
|
|
47
|
+
DATA.each_with_index do |row, row_num|
|
|
48
|
+
worksheet.write_number(row_num + 1, 0, row[0])
|
|
49
|
+
worksheet.write_string(row_num + 1, 1, row[1])
|
|
50
|
+
worksheet.write_number(row_num + 1, 2, row[2])
|
|
51
|
+
worksheet.write_number(row_num + 1, 3, row[3])
|
|
52
|
+
end
|
|
53
|
+
workbook.close
|
|
54
|
+
File.open(filename, 'rb', &:read)
|
|
55
|
+
File.delete(filename)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
x.compare!
|
|
59
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require_relative 'init'
|
|
2
|
+
|
|
3
|
+
HEADERS = ["id", "name", "age", "date", "random"]
|
|
4
|
+
|
|
5
|
+
DATA = []
|
|
6
|
+
20_000.times do |n|
|
|
7
|
+
DATA << [n, "String string #{n}" * 5, (n * rand * 10).round, Time.at(n * 1000 + 1492922688), n * 100]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
Benchmark.ips do |x|
|
|
11
|
+
x.config(time: 10, warmup: 2)
|
|
12
|
+
|
|
13
|
+
x.report("FastExcel") do
|
|
14
|
+
write_fast_excel_20k
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
x.report("Axlsx") do
|
|
18
|
+
write_axlsx_20k
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
x.report("write_xlsx") do
|
|
22
|
+
write_xlsx_20k
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
x.compare!
|
|
26
|
+
end
|
data/benchmarks/init.rb
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'bundler/setup'
|
|
2
|
+
require 'fileutils'
|
|
3
|
+
require 'tmpdir'
|
|
4
|
+
require_relative '../lib/fast_excel'
|
|
5
|
+
|
|
6
|
+
# gem install axlsx benchmark-ips write_xlsx
|
|
7
|
+
|
|
8
|
+
require "benchmark/ips"
|
|
9
|
+
require 'axlsx'
|
|
10
|
+
require 'write_xlsx'
|
|
11
|
+
require 'process_memory'
|
|
12
|
+
|
|
13
|
+
require_relative 'init'
|
|
14
|
+
|
|
15
|
+
def write_fast_excel_20k
|
|
16
|
+
workbook = FastExcel.open(constant_memory: true)
|
|
17
|
+
worksheet = workbook.add_worksheet("benchmark")
|
|
18
|
+
|
|
19
|
+
worksheet.write_row(0, HEADERS)
|
|
20
|
+
DATA.each_with_index do |row, i|
|
|
21
|
+
worksheet.write_row(i + 1, row)
|
|
22
|
+
end
|
|
23
|
+
workbook.read_string
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def write_xlsx_20k
|
|
27
|
+
filename = "#{Dir.mktmpdir}/write_xlsx.xlsx"
|
|
28
|
+
workbook = WriteXLSX.new(filename)
|
|
29
|
+
worksheet = workbook.add_worksheet
|
|
30
|
+
HEADERS.each_with_index do |value, i|
|
|
31
|
+
worksheet.write(0, i, value)
|
|
32
|
+
end
|
|
33
|
+
DATA.each_with_index do |row, row_num|
|
|
34
|
+
worksheet.write_number(row_num + 1, 0, row[0])
|
|
35
|
+
worksheet.write_string(row_num + 1, 1, row[1])
|
|
36
|
+
worksheet.write_number(row_num + 1, 2, row[2])
|
|
37
|
+
worksheet.write_number(row_num + 1, 3, row[3])
|
|
38
|
+
worksheet.write_number(row_num + 1, 4, row[4])
|
|
39
|
+
end
|
|
40
|
+
workbook.close
|
|
41
|
+
File.open(filename, 'rb', &:read)
|
|
42
|
+
File.delete(filename)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def write_axlsx_20k
|
|
46
|
+
filename = "#{Dir.mktmpdir}/axlsx.xlsx"
|
|
47
|
+
Axlsx::Package.new do |package|
|
|
48
|
+
package.use_autowidth = false
|
|
49
|
+
package.workbook.add_worksheet do |sheet|
|
|
50
|
+
sheet.add_row(HEADERS)
|
|
51
|
+
DATA.each do |row|
|
|
52
|
+
sheet.add_row(row)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
package.serialize(filename)
|
|
56
|
+
File.open(filename, 'rb', &:read)
|
|
57
|
+
File.delete(filename)
|
|
58
|
+
end
|
|
59
|
+
end
|