fast_excel 0.2.5 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c0913c4454d805190410b1ba3657913a0f5dc9c1
4
- data.tar.gz: a1d3fe3a3f3ee227fcaa900791bb34c0320709e7
2
+ SHA256:
3
+ metadata.gz: 26cc6868779b440f2c848e60a68bce2272760255e1c4d4e887edae312d16eb76
4
+ data.tar.gz: 43e3d4288b2c2bb06685308a4c97b267a563d72c32c4902793dd6d3030cde890
5
5
  SHA512:
6
- metadata.gz: 9b6761029c771b2fcc9444e5b896c64282e12ee4dc19b9eb316481f86aca2543f70156c79159966dd50b6488dccd8bc32292725101bfd6068044b1d938b709e9
7
- data.tar.gz: 7d89bc8a36f46ab01cd74826dc411233e6b1f532d0eaa1762e296e4c1f71b7b5d9f42ba706c2445d98ff87d919cf91bcf2e4b8c9a6f299991eb7aa27b37c3a13
6
+ metadata.gz: 49fa98254e1c6b147e0edd4262ddd87d5b75410b42b38843ae887bbb98ce9aae6bf6607bdebeec840bca73c98ebc5be1f451ed227d51a147fb6a1c6bd8bd0f67
7
+ data.tar.gz: 724f6b6e146816061c270899d798faa6ddcbe29e8ce9aba958bc23cb14c3ecdd0e0ce7de686b92b997957c73164a7f83c52f3283499a193eab96670bc9fdecec
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
@@ -11,6 +12,6 @@ libxlsxwriter/dev
11
12
  libxlsxwriter/docs
12
13
  libxlsxwriter/examples
13
14
  libxlsxwriter/test
14
-
15
+ ext/fast_excel/text_width_ext.o
15
16
  ext/fast_excel/Makefile
16
17
  ext/fast_excel/text_width_ext.bundle
data/.travis.yml CHANGED
@@ -3,26 +3,26 @@ language: ruby
3
3
 
4
4
  matrix:
5
5
  include:
6
+ # - os: linux
7
+ # rvm: 2.2.10
8
+ # - os: osx
9
+ # rvm: 2.2.10
6
10
  - os: linux
7
- rvm: 2.1
11
+ rvm: 2.3.8
8
12
  - os: osx
9
- rvm: 2.1
13
+ rvm: 2.3.8
10
14
  - os: linux
11
- rvm: 2.2.7
15
+ rvm: 2.4.5
12
16
  - os: osx
13
- rvm: 2.2.7
17
+ rvm: 2.4.5
14
18
  - os: linux
15
- rvm: 2.3.4
19
+ rvm: 2.5.3
16
20
  - os: osx
17
- rvm: 2.3.4
21
+ rvm: 2.5.3
18
22
  - os: linux
19
- rvm: 2.4.0
23
+ rvm: 2.6.0
20
24
  - os: osx
21
- rvm: 2.4.0
22
- - os: linux
23
- rvm: 2.5.0
24
- - os: osx
25
- rvm: 2.5.0
25
+ rvm: 2.6.0
26
26
  fast_finish: true
27
27
 
28
28
  script:
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ #### Version 0.2.6 - 26 jan 2019
2
+
3
+ * Add column auto width (thanks to @duffyjp)
4
+
1
5
  #### Version 0.2.5 - 22 jun 2018
2
6
 
3
7
  * Update libxlsxwriter to 0.7.7
data/Gemfile CHANGED
@@ -5,7 +5,7 @@ gem 'ffi_gen', require: false
5
5
 
6
6
  gem 'rake'
7
7
 
8
- gem 'roo', '2.7.1', git: 'https://github.com/roo-rb/roo.git'
8
+ gem 'roo', '2.8.1', git: 'https://github.com/roo-rb/roo.git', tag: 'v2.8.1'
9
9
 
10
10
  gem 'minitest'
11
11
  gem 'minitest-reporters'
@@ -13,5 +13,6 @@ gem 'minitest-reporters'
13
13
  # For benchmakrs
14
14
  gem 'axlsx', git: 'https://github.com/randym/axlsx.git'
15
15
  gem 'write_xlsx'
16
+ gem 'xlsxtream'
16
17
  gem 'benchmark-ips'
17
18
  gem 'process_memory', git: 'https://github.com/paxa/process_memory', platforms: :ruby
data/Gemfile.lock CHANGED
@@ -1,12 +1,12 @@
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: 73d9477fc33706f4a186e92794134248fb389183
9
+ revision: c593a08b2a929dac7aa8dc418b55e26b4c49dc34
10
10
  specs:
11
11
  axlsx (3.0.0.pre)
12
12
  htmlentities (~> 4.3, >= 4.3.4)
@@ -16,9 +16,10 @@ GIT
16
16
 
17
17
  GIT
18
18
  remote: https://github.com/roo-rb/roo.git
19
- revision: 3ed05e1caef0ce3c5db5c19f1fa14e6f74193079
19
+ revision: 5bbda9849ca6deb0ad8020c4476c1ab9ddfd824b
20
+ tag: v2.8.1
20
21
  specs:
21
- roo (2.7.1)
22
+ roo (2.8.1)
22
23
  nokogiri (~> 1)
23
24
  rubyzip (>= 1.2.1, < 2.0.0)
24
25
 
@@ -28,28 +29,31 @@ GEM
28
29
  ansi (1.5.0)
29
30
  benchmark-ips (2.7.2)
30
31
  builder (3.2.3)
31
- ffi (1.9.23)
32
+ ffi (1.10.0)
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.3.0)
36
+ mimemagic (0.3.3)
37
+ mini_portile2 (2.4.0)
37
38
  minitest (5.11.3)
38
- minitest-reporters (1.1.19)
39
+ minitest-reporters (1.3.6)
39
40
  ansi
40
41
  builder
41
42
  minitest (>= 5.0)
42
43
  ruby-progressbar
43
- nokogiri (1.8.2)
44
- mini_portile2 (~> 2.3.0)
45
- rake (12.3.0)
46
- ruby-progressbar (1.9.0)
47
- rubyzip (1.2.1)
48
- write_xlsx (0.85.3)
44
+ nokogiri (1.10.1)
45
+ mini_portile2 (~> 2.4.0)
46
+ rake (12.3.2)
47
+ ruby-progressbar (1.10.0)
48
+ rubyzip (1.2.2)
49
+ write_xlsx (0.85.5)
49
50
  rubyzip (>= 1.0.0)
50
51
  zip-zip
52
+ xlsxtream (2.1.0)
53
+ zip_tricks (~> 4.5)
51
54
  zip-zip (0.3)
52
55
  rubyzip (>= 1.0.0)
56
+ zip_tricks (4.7.1)
53
57
 
54
58
  PLATFORMS
55
59
  ruby
@@ -63,8 +67,9 @@ DEPENDENCIES
63
67
  minitest-reporters
64
68
  process_memory!
65
69
  rake
66
- roo (= 2.7.1)!
70
+ roo (= 2.8.1)!
67
71
  write_xlsx
72
+ xlsxtream
68
73
 
69
74
  BUNDLED WITH
70
- 1.16.1
75
+ 1.17.2
data/Makefile CHANGED
@@ -4,6 +4,8 @@ Q=
4
4
  endif
5
5
 
6
6
  all :
7
+ @echo "Compiling ext/text_width ..."
8
+ rake compile
7
9
  @echo "Compiling libxlsxwriter ..."
8
10
  $(Q)$(MAKE) -C libxlsxwriter
9
11
 
data/README.md CHANGED
@@ -20,17 +20,19 @@ 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
+ See [more examples](https://github.com/Paxa/fast_excel/tree/master/examples)
35
+
34
36
  This repository and gem contain sources of [libxlsxwriter](https://github.com/jmcnamara/libxlsxwriter)
35
37
 
36
38
  ## Benchmarks
@@ -69,6 +71,29 @@ Or
69
71
  gem install fast_excel
70
72
  ```
71
73
 
74
+ ## Column Auto Width
75
+
76
+ Column authwidth only works for string values, because numbers may have custom formatting
77
+
78
+ Enabling column auto widths will slow down writing string values for about 15-25%
79
+
80
+ ```ruby
81
+ require 'fast_excel'
82
+
83
+ workbook = FastExcel.open(constant_memory: true)
84
+
85
+ worksheet = workbook.add_worksheet
86
+ worksheet.auto_width = true
87
+
88
+ worksheet.append_row(["some text", "some longer text for example"])
89
+
90
+ content = workbook.read_string
91
+ File.open('./some_file.xlsx', 'wb') {|f| f.write(content) }
92
+ ```
93
+
94
+ ![fast_excel_auto_width](https://user-images.githubusercontent.com/26019/51788441-ba981300-21b0-11e9-9611-54dda78effcd.png)
95
+
96
+
72
97
  ## API
73
98
 
74
99
  This gem is FFI binding for libxlsxwriter C library with some syntax sugar. All original functions is avaliable, for example:
@@ -93,3 +118,5 @@ Helper Methods:
93
118
  * `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
119
  * `format.font_family` - alias for `format.font_name`
95
120
  * `workbook.default_format.font_size` - set it to 0 if you want to use default font size (that what user set in Excel settings)
121
+ * `worksheet.write_row(num, values_array, formats = nil)` - Write row of values
122
+ * `worksheet.append_row(values_array, formats = nil)` - Append row of values ot the bottom of worksheet
data/Rakefile CHANGED
@@ -22,3 +22,11 @@ task :examples do
22
22
  require './' + file.sub(/\.rb$/, '')
23
23
  end
24
24
  end
25
+
26
+ task :compile do
27
+ %x{
28
+ cd ext/fast_excel
29
+ ruby ./extconf.rb
30
+ make
31
+ }
32
+ end
@@ -1,6 +1,6 @@
1
1
  require_relative 'init'
2
2
 
3
- HEADERS = ["id", "name", "age", "date"]
3
+ HEADERS = ["id", "name", "age", "date"].freeze
4
4
 
5
5
  DATA = []
6
6
  1000.times do |n|
@@ -8,15 +8,15 @@ DATA = []
8
8
  end
9
9
 
10
10
  Benchmark.ips do |x|
11
- x.config(time: 10, warmup: 2)
11
+ x.config(time: 10, warmup: 40)
12
12
 
13
13
  x.report("FastExcel") do
14
14
  workbook = FastExcel.open(constant_memory: true)
15
15
  worksheet = workbook.add_worksheet("benchmark")
16
16
 
17
17
  worksheet.write_row(0, HEADERS)
18
- DATA.each_with_index do |row, i|
19
- worksheet.write_row(i + 1, row)
18
+ DATA.each do |row|
19
+ worksheet.append_row(row)
20
20
  end
21
21
  workbook.read_string
22
22
  end
@@ -55,5 +55,18 @@ Benchmark.ips do |x|
55
55
  File.delete(filename)
56
56
  end
57
57
 
58
+ x.report("xlsxtream") do
59
+ filename = "#{Dir.mktmpdir}/xlsxtream.xlsx"
60
+
61
+ Xlsxtream::Workbook.open(filename) do |xlsx|
62
+ xlsx.write_worksheet do |sheet|
63
+ sheet << HEADERS
64
+ DATA.each do |row|
65
+ sheet << row
66
+ end
67
+ end
68
+ end
69
+ end
70
+
58
71
  x.compare!
59
72
  end
@@ -22,5 +22,9 @@ Benchmark.ips do |x|
22
22
  write_xlsx_20k
23
23
  end
24
24
 
25
+ x.report("xlsxtream") do
26
+ write_xlsxtream_20k
27
+ end
28
+
25
29
  x.compare!
26
30
  end
@@ -0,0 +1,37 @@
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("Normal") 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("With auto_width") do
25
+ workbook = FastExcel.open(constant_memory: true)
26
+ worksheet = workbook.add_worksheet("benchmark")
27
+ worksheet.auto_width = true
28
+
29
+ worksheet.write_row(0, HEADERS)
30
+ DATA.each_with_index do |row, i|
31
+ worksheet.write_row(i + 1, row)
32
+ end
33
+ workbook.read_string
34
+ end
35
+
36
+ x.compare!
37
+ end
data/benchmarks/init.rb CHANGED
@@ -8,10 +8,9 @@ require_relative '../lib/fast_excel'
8
8
  require "benchmark/ips"
9
9
  require 'axlsx'
10
10
  require 'write_xlsx'
11
+ require 'xlsxtream'
11
12
  require 'process_memory'
12
13
 
13
- require_relative 'init'
14
-
15
14
  def write_fast_excel_20k
16
15
  workbook = FastExcel.open(constant_memory: true)
17
16
  worksheet = workbook.add_worksheet("benchmark")
@@ -57,3 +56,16 @@ def write_axlsx_20k
57
56
  File.delete(filename)
58
57
  end
59
58
  end
59
+
60
+ def write_xlsxtream_20k
61
+ filename = "#{Dir.mktmpdir}/xlsxtream.xlsx"
62
+
63
+ Xlsxtream::Workbook.open(filename) do |xlsx|
64
+ xlsx.write_worksheet do |sheet|
65
+ sheet << HEADERS
66
+ DATA.each do |row|
67
+ sheet << row
68
+ end
69
+ end
70
+ end
71
+ end
data/benchmarks/memory.rb CHANGED
@@ -11,6 +11,7 @@ puts "warm up..."
11
11
  write_fast_excel_20k
12
12
  write_axlsx_20k
13
13
  write_xlsx_20k
14
+ write_xlsxtream_20k
14
15
 
15
16
  DATA.clear
16
17
  50_000.times do |n|
@@ -47,3 +48,10 @@ sleep 5
47
48
  measure_memory("write_xlsx") do
48
49
  write_xlsx_20k
49
50
  end
51
+
52
+ GC.start
53
+ sleep 5
54
+
55
+ measure_memory("xlsxtream") do
56
+ write_xlsxtream_20k
57
+ end
@@ -0,0 +1,27 @@
1
+ require_relative '../lib/fast_excel'
2
+ require 'ruby-prof'
3
+
4
+ DATA = []
5
+ 1000.times do |n|
6
+ DATA << [n, "String string #{n}", (n * rand * 10).round, Time.at(n * 1000 + 1492922688)]
7
+ end
8
+
9
+ RubyProf.start
10
+
11
+ 100.times do
12
+ workbook = FastExcel.open(constant_memory: true)
13
+ worksheet = workbook.add_worksheet("benchmark")
14
+ worksheet.auto_width = true
15
+
16
+ DATA.each_with_index do |row, i|
17
+ worksheet.write_row(i + 1, row)
18
+ end
19
+ workbook.read_string
20
+
21
+ print '.'
22
+ end
23
+ result = RubyProf.stop
24
+
25
+ # print a flat profile to text
26
+ printer = RubyProf::FlatPrinter.new(result)
27
+ printer.print(STDOUT)
@@ -0,0 +1,62 @@
1
+ require_relative '../lib/fast_excel'
2
+ require "benchmark/memory"
3
+ require "benchmark/ips"
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
+ 5.times do
11
+ workbook = FastExcel.open(constant_memory: true)
12
+ worksheet = workbook.add_worksheet("benchmark")
13
+
14
+ DATA.each_with_index do |row, row_num|
15
+ row.each_with_index do |val, cell_num|
16
+ worksheet.write_value(row_num + 1, cell_num + 1, val)
17
+ end
18
+ end
19
+ workbook.read_string
20
+ end
21
+
22
+
23
+ workbook = FastExcel.open(constant_memory: true)
24
+ worksheet = workbook.add_worksheet("benchmark")
25
+
26
+ DATA.each_with_index do |row, row_num|
27
+ row.each_with_index do |val, cell_num|
28
+ worksheet.write_value(row_num + 1, cell_num + 1, val)
29
+ end
30
+ end
31
+ workbook.read_string
32
+
33
+ Benchmark.ips do |x|
34
+ #x.config(time: 10, warmup: 2)
35
+
36
+ x.report("Normal") do
37
+ workbook = FastExcel.open(constant_memory: true)
38
+ worksheet = workbook.add_worksheet("benchmark")
39
+
40
+ DATA.each_with_index do |row, row_num|
41
+ row.each_with_index do |val, cell_num|
42
+ worksheet.write_value(row_num + 1, cell_num + 1, val)
43
+ end
44
+ end
45
+ workbook.read_string
46
+ end
47
+
48
+ x.report("Auto-width") do
49
+ workbook = FastExcel.open(constant_memory: true)
50
+ worksheet = workbook.add_worksheet("benchmark")
51
+ worksheet.auto_width = true
52
+
53
+ DATA.each_with_index do |row, row_num|
54
+ row.each_with_index do |val, cell_num|
55
+ worksheet.write_value(row_num + 1, cell_num + 1, val)
56
+ end
57
+ end
58
+ workbook.read_string
59
+ end
60
+
61
+ x.compare!
62
+ end