fast_excel 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +28 -0
- data/CHANGELOG.md +10 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +9 -7
- data/Rakefile +6 -0
- data/appveyor.yml +25 -0
- data/examples/example.rb +0 -1
- data/examples/example_align.rb +23 -0
- data/examples/example_colors.rb +37 -0
- data/examples/example_formula.rb +0 -2
- data/examples/example_image.rb +1 -1
- data/examples/example_styles.rb +27 -0
- data/examples/logo.png +0 -0
- data/fast_excel.gemspec +1 -1
- data/lib/fast_excel.rb +342 -71
- data/test/format_test.rb +171 -0
- data/test/test_helper.rb +20 -4
- data/test/worksheet_test.rb +86 -0
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0bf8afa4f1566ae7cc27fe6b7a59e1d9c0dc0d0
|
4
|
+
data.tar.gz: eeac6d37268bfc90e54a338e098224acd382309d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 75345de42e34f5e4db76737ba2c1ad8d8c2fa74fb44653d1d0c5a86137d635aab3c2abb5297ad32fe6a67e4813e6c57dbd50c543ea5a75404a44ada017e45c2b
|
7
|
+
data.tar.gz: c37550f5d67c501b16e9199f0a8aab489ea760257d2405f3b0ffbabcb41e20625ee80dfbb89bc7dec1ddb0bf93cc65c5e59b89de55f1727dbb5d85ead3a1e049
|
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
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
#### Version 0.2.2 - 20 sep 2017
|
2
|
+
|
3
|
+
* Nice setters and getters for format.align
|
4
|
+
* Add nice setters for colors and borders
|
5
|
+
* Add sheet.append_row, sheet.last_row_number
|
6
|
+
* Run tests in CI
|
7
|
+
* Performance optimizations and type check refactoring
|
8
|
+
* Add styles_example.rb
|
9
|
+
* Fix assigning align from other format
|
10
|
+
|
1
11
|
#### Version 0.2.1 - 20 jun 2017
|
2
12
|
|
3
13
|
* Add FastExcel::Formula
|
data/Gemfile
CHANGED
@@ -3,6 +3,8 @@ source 'https://rubygems.org'
|
|
3
3
|
gem 'ffi'
|
4
4
|
gem 'ffi_gen', require: false
|
5
5
|
|
6
|
+
gem 'rake'
|
7
|
+
|
6
8
|
gem 'roo', '2.7.1', git: 'https://github.com/roo-rb/roo.git'
|
7
9
|
|
8
10
|
gem 'minitest'
|
@@ -12,4 +14,4 @@ gem 'minitest-reporters'
|
|
12
14
|
gem 'axlsx', git: 'https://github.com/randym/axlsx.git'
|
13
15
|
gem 'write_xlsx'
|
14
16
|
gem 'benchmark-ips'
|
15
|
-
gem 'process_memory', git: 'https://github.com/paxa/process_memory'
|
17
|
+
gem 'process_memory', git: 'https://github.com/paxa/process_memory', platforms: :ruby
|
data/Gemfile.lock
CHANGED
@@ -16,7 +16,7 @@ GIT
|
|
16
16
|
|
17
17
|
GIT
|
18
18
|
remote: https://github.com/roo-rb/roo.git
|
19
|
-
revision:
|
19
|
+
revision: 85c2736b0ea1c984391688c5aeb4acf85f225405
|
20
20
|
specs:
|
21
21
|
roo (2.7.1)
|
22
22
|
nokogiri (~> 1)
|
@@ -33,18 +33,19 @@ GEM
|
|
33
33
|
ffi (~> 1.0)
|
34
34
|
htmlentities (4.3.4)
|
35
35
|
mimemagic (0.3.2)
|
36
|
-
mini_portile2 (2.
|
37
|
-
minitest (5.10.
|
36
|
+
mini_portile2 (2.2.0)
|
37
|
+
minitest (5.10.2)
|
38
38
|
minitest-reporters (1.1.14)
|
39
39
|
ansi
|
40
40
|
builder
|
41
41
|
minitest (>= 5.0)
|
42
42
|
ruby-progressbar
|
43
|
-
nokogiri (1.
|
44
|
-
mini_portile2 (~> 2.
|
43
|
+
nokogiri (1.8.0)
|
44
|
+
mini_portile2 (~> 2.2.0)
|
45
|
+
rake (12.0.0)
|
45
46
|
ruby-progressbar (1.8.1)
|
46
47
|
rubyzip (1.2.1)
|
47
|
-
write_xlsx (0.
|
48
|
+
write_xlsx (0.85.1)
|
48
49
|
rubyzip (>= 1.0.0)
|
49
50
|
zip-zip
|
50
51
|
zip-zip (0.3)
|
@@ -61,8 +62,9 @@ DEPENDENCIES
|
|
61
62
|
minitest
|
62
63
|
minitest-reporters
|
63
64
|
process_memory!
|
65
|
+
rake
|
64
66
|
roo (= 2.7.1)!
|
65
67
|
write_xlsx
|
66
68
|
|
67
69
|
BUNDLED WITH
|
68
|
-
1.
|
70
|
+
1.15.1
|
data/Rakefile
CHANGED
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"
|
data/examples/example.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative '../lib/fast_excel'
|
2
|
+
|
3
|
+
workbook = FastExcel.open("example_align.xlsx", constant_memory: true)
|
4
|
+
|
5
|
+
worksheet = workbook.add_worksheet
|
6
|
+
|
7
|
+
row_format = workbook.add_format
|
8
|
+
|
9
|
+
row_format.align = {h: :center, v: :center}
|
10
|
+
# Can also be called as:
|
11
|
+
# row_format.align = :align_center
|
12
|
+
# row_format.align = :align_vertical_center
|
13
|
+
|
14
|
+
print "Align set as: "
|
15
|
+
p row_format.align # => {horizontal: :align_center, vertical: :align_vertical_center}
|
16
|
+
|
17
|
+
worksheet.set_column_width(0, 30)
|
18
|
+
worksheet.set_row(0, 30, row_format)
|
19
|
+
|
20
|
+
worksheet.write_row(0, ["Hello"])
|
21
|
+
|
22
|
+
workbook.close
|
23
|
+
puts "Saved to file example_align.xlsx"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative '../lib/fast_excel'
|
2
|
+
|
3
|
+
workbook = FastExcel.open("example_colors.xlsx", constant_memory: true)
|
4
|
+
|
5
|
+
worksheet = workbook.add_worksheet
|
6
|
+
|
7
|
+
color_format = workbook.add_format
|
8
|
+
|
9
|
+
# We can use color names as string and symbols, color hex codes and color hex numbers
|
10
|
+
|
11
|
+
color_format.set(
|
12
|
+
font_color: '9900FF',
|
13
|
+
bg_color: '#FFAAAA',
|
14
|
+
|
15
|
+
border_bottom: :medium,
|
16
|
+
border_bottom_color: 'green',
|
17
|
+
|
18
|
+
border_left: :slant_dash_dot,
|
19
|
+
border_left_color: 0x00FF00,
|
20
|
+
|
21
|
+
border_right: :double,
|
22
|
+
border_right_color: :crimson,
|
23
|
+
|
24
|
+
border_top: :border_hair,
|
25
|
+
border_top_color: :medium_blue
|
26
|
+
)
|
27
|
+
|
28
|
+
# Possible border styles:
|
29
|
+
# [:none, :thin, :medium, :dashed, :dotted, :thick, :double, :hair, :medium_dashed,
|
30
|
+
# :dash_dot, :medium_dash_dot, :dash_dot_dot, :medium_dash_dot_dot, :slant_dash_dot]
|
31
|
+
|
32
|
+
worksheet.set_column_width(1, 30)
|
33
|
+
|
34
|
+
worksheet.write_value(1, 1, "Hello", color_format)
|
35
|
+
|
36
|
+
workbook.close
|
37
|
+
puts "Saved to file example_colors.xlsx"
|
data/examples/example_formula.rb
CHANGED
data/examples/example_image.rb
CHANGED
@@ -7,7 +7,7 @@ img_options = Libxlsxwriter::ImageOptions.new
|
|
7
7
|
img_options[:x_offset] = 0
|
8
8
|
img_options[:y_offset] = 0
|
9
9
|
|
10
|
-
worksheet.insert_image_opt(3, 3, "
|
10
|
+
worksheet.insert_image_opt(3, 3, "examples/logo.png", img_options)
|
11
11
|
|
12
12
|
workbook.close
|
13
13
|
puts "Saved to file example_image.xlsx"
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative '../lib/fast_excel'
|
2
|
+
|
3
|
+
workbook = FastExcel.open("example_styles.xlsx", constant_memory: true)
|
4
|
+
|
5
|
+
#workbook.default_format.set(
|
6
|
+
# font_size: 0, # user's default
|
7
|
+
# #font_family: "Arial"
|
8
|
+
#)
|
9
|
+
|
10
|
+
worksheet = workbook.add_worksheet
|
11
|
+
|
12
|
+
worksheet.set_columns_width(0, 11, 11)
|
13
|
+
|
14
|
+
worksheet.write_value(0, 0, "Bold", workbook.add_format(bold: true))
|
15
|
+
worksheet.write_value(0, 1, "Italic", workbook.add_format(italic: true))
|
16
|
+
worksheet.write_value(0, 2, "Underline", workbook.add_format(underline: :underline_single))
|
17
|
+
worksheet.write_value(0, 3, "Double line", workbook.add_format(underline: :underline_double))
|
18
|
+
worksheet.write_value(0, 4, "Indent", workbook.add_format(indent: 1))
|
19
|
+
worksheet.write_value(0, 5, "Border", workbook.add_format(border: :border_thin))
|
20
|
+
worksheet.write_value(0, 6, "Border2", workbook.add_format(border: :border_medium))
|
21
|
+
worksheet.write_value(0, 7, "Pattern", workbook.add_format(pattern: :pattern_light_up, bg_color: :yellow))
|
22
|
+
worksheet.write_value(0, 8, "Script", workbook.add_format(font_script: :font_subscript))
|
23
|
+
worksheet.write_value(0, 9, "Strike", workbook.add_format(font_strikeout: true))
|
24
|
+
worksheet.write_value(0, 10, "Shaddow", workbook.add_format(font_shadow: true))
|
25
|
+
|
26
|
+
workbook.close
|
27
|
+
puts "Saved to file example_styles.xlsx"
|
data/examples/logo.png
ADDED
Binary file
|
data/fast_excel.gemspec
CHANGED
data/lib/fast_excel.rb
CHANGED
@@ -110,15 +110,197 @@ module FastExcel
|
|
110
110
|
nil
|
111
111
|
end
|
112
112
|
|
113
|
+
|
114
|
+
COLOR_ENUM = Libxlsxwriter.enum_type(:defined_colors)
|
115
|
+
EXTRA_COLORS = {
|
116
|
+
alice_blue: 0xF0F8FF,
|
117
|
+
antique_white: 0xFAEBD7,
|
118
|
+
aqua: 0x00FFFF,
|
119
|
+
aquamarine: 0x7FFFD4,
|
120
|
+
azure: 0xF0FFFF,
|
121
|
+
beige: 0xF5F5DC,
|
122
|
+
bisque: 0xFFE4C4,
|
123
|
+
black: 0x000000,
|
124
|
+
blanched_almond: 0xFFEBCD,
|
125
|
+
blue: 0x0000FF,
|
126
|
+
blue_violet: 0x8A2BE2,
|
127
|
+
brown: 0xA52A2A,
|
128
|
+
burly_wood: 0xDEB887,
|
129
|
+
cadet_blue: 0x5F9EA0,
|
130
|
+
chartreuse: 0x7FFF00,
|
131
|
+
chocolate: 0xD2691E,
|
132
|
+
coral: 0xFF7F50,
|
133
|
+
cornflower_blue: 0x6495ED,
|
134
|
+
cornsilk: 0xFFF8DC,
|
135
|
+
crimson: 0xDC143C,
|
136
|
+
cyan: 0x00FFFF,
|
137
|
+
dark_blue: 0x00008B,
|
138
|
+
dark_cyan: 0x008B8B,
|
139
|
+
dark_golden_rod: 0xB8860B,
|
140
|
+
dark_gray: 0xA9A9A9,
|
141
|
+
dark_grey: 0xA9A9A9,
|
142
|
+
dark_green: 0x006400,
|
143
|
+
dark_khaki: 0xBDB76B,
|
144
|
+
dark_magenta: 0x8B008B,
|
145
|
+
dark_olive_green: 0x556B2F,
|
146
|
+
dark_orange: 0xFF8C00,
|
147
|
+
dark_orchid: 0x9932CC,
|
148
|
+
dark_red: 0x8B0000,
|
149
|
+
dark_salmon: 0xE9967A,
|
150
|
+
dark_sea_green: 0x8FBC8F,
|
151
|
+
dark_slate_blue: 0x483D8B,
|
152
|
+
dark_slate_gray: 0x2F4F4F,
|
153
|
+
dark_slate_grey: 0x2F4F4F,
|
154
|
+
dark_turquoise: 0x00CED1,
|
155
|
+
dark_violet: 0x9400D3,
|
156
|
+
deep_pink: 0xFF1493,
|
157
|
+
deep_sky_blue: 0x00BFFF,
|
158
|
+
dim_gray: 0x696969,
|
159
|
+
dim_grey: 0x696969,
|
160
|
+
dodger_blue: 0x1E90FF,
|
161
|
+
fire_brick: 0xB22222,
|
162
|
+
floral_white: 0xFFFAF0,
|
163
|
+
forest_green: 0x228B22,
|
164
|
+
fuchsia: 0xFF00FF,
|
165
|
+
gainsboro: 0xDCDCDC,
|
166
|
+
ghost_white: 0xF8F8FF,
|
167
|
+
gold: 0xFFD700,
|
168
|
+
golden_rod: 0xDAA520,
|
169
|
+
gray: 0x808080,
|
170
|
+
grey: 0x808080,
|
171
|
+
green: 0x008000,
|
172
|
+
green_yellow: 0xADFF2F,
|
173
|
+
honey_dew: 0xF0FFF0,
|
174
|
+
hot_pink: 0xFF69B4,
|
175
|
+
indian_red: 0xCD5C5C,
|
176
|
+
indigo: 0x4B0082,
|
177
|
+
ivory: 0xFFFFF0,
|
178
|
+
khaki: 0xF0E68C,
|
179
|
+
lavender: 0xE6E6FA,
|
180
|
+
lavender_blush: 0xFFF0F5,
|
181
|
+
lawn_green: 0x7CFC00,
|
182
|
+
lemon_chiffon: 0xFFFACD,
|
183
|
+
light_blue: 0xADD8E6,
|
184
|
+
light_coral: 0xF08080,
|
185
|
+
light_cyan: 0xE0FFFF,
|
186
|
+
light_golden_rod_yellow: 0xFAFAD2,
|
187
|
+
light_gray: 0xD3D3D3,
|
188
|
+
light_grey: 0xD3D3D3,
|
189
|
+
light_green: 0x90EE90,
|
190
|
+
light_pink: 0xFFB6C1,
|
191
|
+
light_salmon: 0xFFA07A,
|
192
|
+
light_sea_green: 0x20B2AA,
|
193
|
+
light_sky_blue: 0x87CEFA,
|
194
|
+
light_slate_gray: 0x778899,
|
195
|
+
light_slate_grey: 0x778899,
|
196
|
+
light_steel_blue: 0xB0C4DE,
|
197
|
+
light_yellow: 0xFFFFE0,
|
198
|
+
lime: 0x00FF00,
|
199
|
+
lime_green: 0x32CD32,
|
200
|
+
linen: 0xFAF0E6,
|
201
|
+
magenta: 0xFF00FF,
|
202
|
+
maroon: 0x800000,
|
203
|
+
medium_aqua_marine: 0x66CDAA,
|
204
|
+
medium_blue: 0x0000CD,
|
205
|
+
medium_orchid: 0xBA55D3,
|
206
|
+
medium_purple: 0x9370DB,
|
207
|
+
medium_sea_green: 0x3CB371,
|
208
|
+
medium_slate_blue: 0x7B68EE,
|
209
|
+
medium_spring_green: 0x00FA9A,
|
210
|
+
medium_turquoise: 0x48D1CC,
|
211
|
+
medium_violet_red: 0xC71585,
|
212
|
+
midnight_blue: 0x191970,
|
213
|
+
mint_cream: 0xF5FFFA,
|
214
|
+
misty_rose: 0xFFE4E1,
|
215
|
+
moccasin: 0xFFE4B5,
|
216
|
+
navajo_white: 0xFFDEAD,
|
217
|
+
navy: 0x000080,
|
218
|
+
old_lace: 0xFDF5E6,
|
219
|
+
olive: 0x808000,
|
220
|
+
olive_drab: 0x6B8E23,
|
221
|
+
orange: 0xFFA500,
|
222
|
+
orange_red: 0xFF4500,
|
223
|
+
orchid: 0xDA70D6,
|
224
|
+
pale_golden_rod: 0xEEE8AA,
|
225
|
+
pale_green: 0x98FB98,
|
226
|
+
pale_turquoise: 0xAFEEEE,
|
227
|
+
pale_violet_red: 0xDB7093,
|
228
|
+
papaya_whip: 0xFFEFD5,
|
229
|
+
peach_puff: 0xFFDAB9,
|
230
|
+
peru: 0xCD853F,
|
231
|
+
pink: 0xFFC0CB,
|
232
|
+
plum: 0xDDA0DD,
|
233
|
+
powder_blue: 0xB0E0E6,
|
234
|
+
purple: 0x800080,
|
235
|
+
rebecca_purple: 0x663399,
|
236
|
+
red: 0xFF0000,
|
237
|
+
rosy_brown: 0xBC8F8F,
|
238
|
+
royal_blue: 0x4169E1,
|
239
|
+
saddle_brown: 0x8B4513,
|
240
|
+
salmon: 0xFA8072,
|
241
|
+
sandy_brown: 0xF4A460,
|
242
|
+
sea_green: 0x2E8B57,
|
243
|
+
sea_shell: 0xFFF5EE,
|
244
|
+
sienna: 0xA0522D,
|
245
|
+
silver: 0xC0C0C0,
|
246
|
+
sky_blue: 0x87CEEB,
|
247
|
+
slate_blue: 0x6A5ACD,
|
248
|
+
slate_gray: 0x708090,
|
249
|
+
slate_grey: 0x708090,
|
250
|
+
snow: 0xFFFAFA,
|
251
|
+
spring_green: 0x00FF7F,
|
252
|
+
steel_blue: 0x4682B4,
|
253
|
+
tan: 0xD2B48C,
|
254
|
+
teal: 0x008080,
|
255
|
+
thistle: 0xD8BFD8,
|
256
|
+
tomato: 0xFF6347,
|
257
|
+
turquoise: 0x40E0D0,
|
258
|
+
violet: 0xEE82EE,
|
259
|
+
wheat: 0xF5DEB3,
|
260
|
+
white: 0xFFFFFF,
|
261
|
+
white_smoke: 0xF5F5F5,
|
262
|
+
yellow: 0xFFFF00,
|
263
|
+
yellow_green: 0x9ACD32
|
264
|
+
}.freeze
|
265
|
+
|
266
|
+
# Convert hex string, color name or hex number to color hex number
|
267
|
+
def self.color_to_hex(value)
|
268
|
+
orig_value = value
|
269
|
+
value = value.to_s if value.is_a?(Symbol)
|
270
|
+
|
271
|
+
if value.is_a?(String)
|
272
|
+
if EXTRA_COLORS[value.to_sym]
|
273
|
+
return EXTRA_COLORS[value.to_sym]
|
274
|
+
elsif COLOR_ENUM.find(value.to_sym)
|
275
|
+
return COLOR_ENUM.find(value.to_sym)
|
276
|
+
elsif COLOR_ENUM.find("color_#{value.to_sym}")
|
277
|
+
return COLOR_ENUM.find("color_#{value.to_sym}")
|
278
|
+
elsif value =~ /^#?(0x)?([\da-f]){6}$/i
|
279
|
+
value = value.sub('#', '') if value.start_with?('#')
|
280
|
+
return value.start_with?('0x') ? value.to_i(16) : "0x#{value}".to_i(16)
|
281
|
+
else
|
282
|
+
raise ArgumentError, "Unknown color value #{orig_value.inspect}, expected hex string or color name"
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
return value if value.is_a?(Numeric)
|
287
|
+
|
288
|
+
raise ArgumentError, "Can not use #{value.class} (#{value.inspect}) for color value, expected String or Hex Number"
|
289
|
+
end
|
290
|
+
|
113
291
|
module AttributeHelper
|
114
292
|
def set(values)
|
115
293
|
values.each do |key, value|
|
116
294
|
if respond_to?("#{key}=")
|
117
295
|
send("#{key}=", value)
|
296
|
+
elsif respond_to?("set_#{key}=")
|
297
|
+
send("set_#{key}=", value)
|
118
298
|
else
|
119
299
|
self[key] = value
|
120
300
|
end
|
121
301
|
end
|
302
|
+
|
303
|
+
self
|
122
304
|
end
|
123
305
|
|
124
306
|
def fields_hash
|
@@ -144,6 +326,12 @@ module FastExcel
|
|
144
326
|
super(struct)
|
145
327
|
end
|
146
328
|
|
329
|
+
def add_format(options = nil)
|
330
|
+
new_format = super()
|
331
|
+
new_format.set(options) if options
|
332
|
+
new_format
|
333
|
+
end
|
334
|
+
|
147
335
|
def bold_cell_format
|
148
336
|
bold = add_format
|
149
337
|
bold.set_bold
|
@@ -159,7 +347,9 @@ module FastExcel
|
|
159
347
|
end
|
160
348
|
|
161
349
|
def add_worksheet(sheetname = nil)
|
162
|
-
super
|
350
|
+
sheet = super
|
351
|
+
sheet.workbook = self
|
352
|
+
sheet
|
163
353
|
end
|
164
354
|
|
165
355
|
def close
|
@@ -177,9 +367,16 @@ module FastExcel
|
|
177
367
|
def remove_tmp_file
|
178
368
|
File.delete(filename) if tmp_file
|
179
369
|
end
|
370
|
+
|
371
|
+
def constant_memory?
|
372
|
+
#FastExcel.print_ffi_obj(self[:options])
|
373
|
+
@constant_memory ||= self[:options][:constant_memory] != 0
|
374
|
+
end
|
180
375
|
end
|
181
376
|
|
182
377
|
module WorksheetExt
|
378
|
+
attr_accessor :workbook
|
379
|
+
|
183
380
|
include AttributeHelper
|
184
381
|
|
185
382
|
def write_row(row_number, values, formats = nil)
|
@@ -188,28 +385,62 @@ module FastExcel
|
|
188
385
|
formats.is_a?(Array) ? formats[index] : formats
|
189
386
|
end
|
190
387
|
|
191
|
-
|
192
|
-
write_number(row_number, index, value, format)
|
193
|
-
elsif defined?(BigDecimal) && value.is_a?(BigDecimal)
|
194
|
-
write_number(row_number, index, value.to_f, format)
|
195
|
-
elsif defined?(DateTime) && value.is_a?(DateTime)
|
196
|
-
write_datetime(row_number, index, FastExcel.lxw_datetime(value), format)
|
197
|
-
elsif value.is_a?(Time)
|
198
|
-
write_datetime(row_number, index, FastExcel.lxw_time(value), format)
|
199
|
-
elsif value.is_a?(Formula)
|
200
|
-
write_formula(row_number, index, value.fml, format)
|
201
|
-
else
|
202
|
-
write_string(row_number, index, value.to_s, format)
|
203
|
-
end
|
388
|
+
write_value(row_number, index, value, format)
|
204
389
|
end
|
205
390
|
end
|
206
391
|
|
392
|
+
def write_value(row_number, cell_number, value, format = nil)
|
393
|
+
|
394
|
+
if workbook.constant_memory? && row_number < last_row_number
|
395
|
+
raise ArgumentError, "Can not write to saved row in constant_memory mode (attempted row: #{row_number}, last saved row: #{last_row_number})"
|
396
|
+
end
|
397
|
+
|
398
|
+
if value.is_a?(Numeric)
|
399
|
+
write_number(row_number, cell_number, value, format)
|
400
|
+
elsif defined?(DateTime) && value.is_a?(DateTime)
|
401
|
+
write_datetime(row_number, cell_number, FastExcel.lxw_datetime(value), format)
|
402
|
+
elsif value.is_a?(Time)
|
403
|
+
write_datetime(row_number, cell_number, FastExcel.lxw_time(value), format)
|
404
|
+
elsif value.is_a?(Formula)
|
405
|
+
write_formula(row_number, cell_number, value.fml, format)
|
406
|
+
else
|
407
|
+
write_string(row_number, cell_number, value.to_s, format)
|
408
|
+
end
|
409
|
+
|
410
|
+
@last_row_number = row_number > last_row_number ? row_number : last_row_number
|
411
|
+
end
|
412
|
+
|
413
|
+
def append_row(values, formats = nil)
|
414
|
+
increment_last_row_number!
|
415
|
+
write_row(last_row_number, values, formats)
|
416
|
+
end
|
417
|
+
|
418
|
+
def last_row_number
|
419
|
+
defined?(@last_row_number) ? @last_row_number : -1
|
420
|
+
end
|
421
|
+
|
422
|
+
def increment_last_row_number!
|
423
|
+
@last_row_number = last_row_number + 1
|
424
|
+
end
|
425
|
+
|
426
|
+
def set_column(start_col, end_col, width, format = nil)
|
427
|
+
super(start_col, end_col, width, format)
|
428
|
+
end
|
429
|
+
|
430
|
+
def set_column_width(col, width)
|
431
|
+
set_column(col, col, width, nil)
|
432
|
+
end
|
433
|
+
|
434
|
+
def set_columns_width(start_col, end_col, width)
|
435
|
+
set_column(start_col, end_col, width, nil)
|
436
|
+
end
|
437
|
+
|
207
438
|
end
|
208
439
|
|
209
440
|
module FormatExt
|
210
441
|
include AttributeHelper
|
211
442
|
|
212
|
-
[:font_size, :underline, :font_script, :
|
443
|
+
[:font_size, :underline, :font_script, :rotation, :indent, :pattern, :border].each do |prop|
|
213
444
|
define_method(prop) do
|
214
445
|
self[prop]
|
215
446
|
end
|
@@ -237,73 +468,121 @@ module FastExcel
|
|
237
468
|
end
|
238
469
|
end
|
239
470
|
|
240
|
-
|
241
|
-
|
242
|
-
|
471
|
+
ALIGN_ENUM = Libxlsxwriter.enum_type(:format_alignments)
|
472
|
+
|
473
|
+
# Can be called as:
|
474
|
+
#
|
475
|
+
# format.align = :align_center
|
476
|
+
# format.align = "align_center"
|
477
|
+
# format.align = :center
|
478
|
+
# format.align = :align_center
|
479
|
+
# format.align = {v: "center", h: "center"}
|
480
|
+
#
|
481
|
+
# Possible values:
|
482
|
+
#
|
483
|
+
# :align_none, :align_left, :align_center, :align_right, :align_fill, :align_justify,
|
484
|
+
# :align_center_across, :align_distributed, :align_vertical_top, :align_vertical_bottom,
|
485
|
+
# :align_vertical_center, :align_vertical_justify, :align_vertical_distributed
|
486
|
+
#
|
487
|
+
def align=(value)
|
488
|
+
value = value.to_sym if value.is_a?(String)
|
489
|
+
|
490
|
+
if value.is_a?(Symbol)
|
491
|
+
if ALIGN_ENUM.find(value)
|
492
|
+
set_align(value)
|
493
|
+
elsif ALIGN_ENUM.find(prefixed = "align_#{value}".to_sym)
|
494
|
+
set_align(prefixed)
|
495
|
+
else
|
496
|
+
raise ArgumentError, "Can not set align = #{value.inspect}, possible values are: #{ALIGN_ENUM.symbols}"
|
497
|
+
end
|
498
|
+
elsif value.is_a?(Hash)
|
499
|
+
if value[:horizontal]
|
500
|
+
self.align = "align_#{value[:horizontal].to_s.sub(/^align_/, '')}".to_sym
|
501
|
+
end
|
502
|
+
if value[:h]
|
503
|
+
self.align = "align_#{value[:h].to_s.sub(/^align_/, '')}".to_sym
|
504
|
+
end
|
505
|
+
if value[:vertical]
|
506
|
+
self.align = "align_vertical_#{value[:vertical].to_s.sub(/^align_vertical_/, '')}".to_sym
|
507
|
+
end
|
508
|
+
if value[:v]
|
509
|
+
self.align = "align_vertical_#{value[:v].to_s.sub(/^align_vertical_/, '')}".to_sym
|
510
|
+
end
|
511
|
+
possible = [:horizontal, :h, :vertical, :v]
|
512
|
+
extras = value.keys - possible
|
513
|
+
if extras.size > 0
|
514
|
+
raise ArgumentError, "Not allowed keys for align: #{extras.inspect}, possible keys: #{possible.inspect}"
|
515
|
+
end
|
516
|
+
else
|
517
|
+
raise ArgumentError, "value must be a symbol or a hash"
|
243
518
|
end
|
244
|
-
super(value)
|
245
519
|
end
|
246
520
|
|
247
|
-
def
|
248
|
-
|
521
|
+
def align
|
522
|
+
{
|
523
|
+
horizontal: ALIGN_ENUM.find(self[:text_h_align]),
|
524
|
+
vertical: ALIGN_ENUM.find(self[:text_v_align])
|
525
|
+
}
|
249
526
|
end
|
250
527
|
|
251
|
-
|
252
|
-
|
528
|
+
[:font_color, :bg_color, :fg_color, :bottom_color, :diag_color, :left_color, :right_color, :top_color].each do |prop|
|
529
|
+
define_method("#{prop}=") do |value|
|
530
|
+
send("set_#{prop}", FastExcel.color_to_hex(value))
|
531
|
+
end
|
532
|
+
define_method(prop) do
|
533
|
+
self[prop]
|
534
|
+
end
|
253
535
|
end
|
254
|
-
end
|
255
536
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
def inspect
|
260
|
-
attr_str = fields_hash.map do |key, val|
|
261
|
-
"@#{key}=#{val.inspect}"
|
262
|
-
end
|
263
|
-
"<Libxlsxwriter::Row #{attr_str.join(" ")}>"
|
537
|
+
[:bottom_color, :left_color, :right_color, :top_color].each do |prop|
|
538
|
+
alias_method :"border_#{prop}=", :"#{prop}="
|
539
|
+
alias_method :"border_#{prop}", :"#{prop}"
|
264
540
|
end
|
265
|
-
end
|
266
541
|
|
267
|
-
|
268
|
-
include AttributeHelper
|
542
|
+
BORDER_ENUM = Libxlsxwriter.enum_type(:format_borders)
|
269
543
|
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
else
|
278
|
-
self[:user_data1]
|
544
|
+
[:bottom, :diag_border, :left, :right, :top].each do |prop|
|
545
|
+
define_method("#{prop}=") do |value|
|
546
|
+
|
547
|
+
send("set_#{prop}", border_value(value))
|
548
|
+
end
|
549
|
+
define_method(prop) do
|
550
|
+
BORDER_ENUM.find(self[prop])
|
279
551
|
end
|
280
|
-
end
|
281
552
|
|
282
|
-
|
283
|
-
|
284
|
-
|
553
|
+
unless prop == :diag_border
|
554
|
+
alias_method :"border_#{prop}=", :"#{prop}="
|
555
|
+
alias_method :"border_#{prop}", :"#{prop}"
|
556
|
+
end
|
285
557
|
end
|
286
558
|
|
287
|
-
def
|
288
|
-
|
559
|
+
def border_value(value)
|
560
|
+
# if a number
|
561
|
+
return value if value.is_a?(Numeric) && BORDER_ENUM.find(value)
|
562
|
+
|
563
|
+
orig_value = value
|
564
|
+
value = value.to_sym if value.is_a?(String)
|
565
|
+
|
566
|
+
return BORDER_ENUM.find(value) if BORDER_ENUM.find(value)
|
567
|
+
return BORDER_ENUM.find(:"border_#{value}") if BORDER_ENUM.find(:"border_#{value}")
|
568
|
+
|
569
|
+
short_symbols = BORDER_ENUM.symbols.map {|s| s.to_s.sub(/^border_/, '').to_sym }
|
570
|
+
raise ArgumentError, "Unknown value #{orig_value.inspect} for border. Possible values: #{short_symbols}"
|
289
571
|
end
|
290
572
|
|
291
|
-
def
|
292
|
-
|
573
|
+
def set_font_size(value)
|
574
|
+
if value < 0
|
575
|
+
raise ArgumentError, "font size should be >= 0 (use 0 for user default font size)"
|
576
|
+
end
|
577
|
+
super(value)
|
293
578
|
end
|
294
579
|
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
# end
|
299
|
-
# "<Libxlsxwriter::Row #{attr_str.join(" ")}>"
|
300
|
-
#end
|
580
|
+
def font_family
|
581
|
+
font_name
|
582
|
+
end
|
301
583
|
|
302
|
-
def
|
303
|
-
|
304
|
-
"@#{key}=#{val.inspect}"
|
305
|
-
end
|
306
|
-
"<Libxlsxwriter::Row #{attr_str.join(" ")}>"
|
584
|
+
def font_family=(value)
|
585
|
+
self.font_name = value
|
307
586
|
end
|
308
587
|
end
|
309
588
|
end
|
@@ -319,11 +598,3 @@ end
|
|
319
598
|
Libxlsxwriter::Worksheet.instance_eval do
|
320
599
|
include FastExcel::WorksheetExt
|
321
600
|
end
|
322
|
-
|
323
|
-
Libxlsxwriter::Row.instance_eval do
|
324
|
-
include FastExcel::RowExt
|
325
|
-
end
|
326
|
-
|
327
|
-
Libxlsxwriter::Cell.instance_eval do
|
328
|
-
include FastExcel::CellExt
|
329
|
-
end
|
data/test/format_test.rb
ADDED
@@ -0,0 +1,171 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
describe "FastExcel::FormatExt align" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@workbook = FastExcel.open(constant_memory: true)
|
7
|
+
@format = @workbook.add_format
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should give default aligns" do
|
11
|
+
assert_equal({horizontal: :align_none, vertical: :align_none}, @format.align)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should set align by full name" do
|
15
|
+
@format.align = :align_center
|
16
|
+
assert_equal({horizontal: :align_center, vertical: :align_none}, @format.align)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should set by string" do
|
20
|
+
@format.align = "align_center"
|
21
|
+
assert_equal({horizontal: :align_center, vertical: :align_none}, @format.align)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should set by short name" do
|
25
|
+
@format.align = :center
|
26
|
+
assert_equal({horizontal: :align_center, vertical: :align_none}, @format.align)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should set by hash" do
|
30
|
+
@format.align = {v: "center", h: "center"}
|
31
|
+
assert_equal({horizontal: :align_center, vertical: :align_vertical_center}, @format.align)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should raise exception for unknown value" do
|
35
|
+
error = assert_raises(ArgumentError) do
|
36
|
+
@format.align = :aaa
|
37
|
+
end
|
38
|
+
|
39
|
+
assert_equal(error.message, "Can not set align = :aaa, possible values are: [:align_none, :align_left, "\
|
40
|
+
":align_center, :align_right, :align_fill, :align_justify, :align_center_across, :align_distributed, "\
|
41
|
+
":align_vertical_top, :align_vertical_bottom, :align_vertical_center, :align_vertical_justify, :align_vertical_distributed]")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should raise exception for unknown hash key" do
|
45
|
+
error = assert_raises(ArgumentError) do
|
46
|
+
@format.align = {aaa: 1}
|
47
|
+
end
|
48
|
+
|
49
|
+
assert_equal(error.message, "Not allowed keys for align: [:aaa], possible keys: [:horizontal, :h, :vertical, :v]")
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should get and set" do
|
53
|
+
@format.align = {h: :center, v: :center}
|
54
|
+
format2 = @workbook.add_format(align: @format.align)
|
55
|
+
|
56
|
+
assert_equal({horizontal: :align_center, vertical: :align_vertical_center}, format2.align)
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
describe "FastExcel::FormatExt colors" do
|
63
|
+
|
64
|
+
before do
|
65
|
+
workbook = FastExcel.open(constant_memory: true)
|
66
|
+
@format = workbook.add_format
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should set font color as hex num" do
|
70
|
+
@format.font_color = 0xFF0000
|
71
|
+
assert_equal(0xFF0000, @format.font_color)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should set font color as hex string" do
|
75
|
+
@format.font_color = '0xFF0000'
|
76
|
+
assert_equal(0xFF0000, @format.font_color)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should set font color as css hex string" do
|
80
|
+
@format.font_color = '#FF0000'
|
81
|
+
assert_equal(0xFF0000, @format.font_color)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should set font color as short hex string" do
|
85
|
+
@format.font_color = 'FF0000'
|
86
|
+
assert_equal(0xFF0000, @format.font_color)
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should set font color as name" do
|
90
|
+
@format.font_color = 'red'
|
91
|
+
assert_equal(0xFF0000, @format.font_color)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should set font css color" do
|
95
|
+
@format.font_color = 'alice_blue'
|
96
|
+
assert_equal(0xF0F8FF, @format.font_color)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should allow to use symbol" do
|
100
|
+
@format.font_color = :alice_blue
|
101
|
+
assert_equal(0xF0F8FF, @format.font_color)
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should have long method for border colors" do
|
105
|
+
@format.border_bottom_color = :alice_blue
|
106
|
+
assert_equal(0xF0F8FF, @format.border_bottom_color)
|
107
|
+
assert_equal(0xF0F8FF, @format.bottom_color)
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should raise for unexpected type" do
|
111
|
+
error = assert_raises(ArgumentError) do
|
112
|
+
@format.font_color = {aaa: 1}
|
113
|
+
end
|
114
|
+
|
115
|
+
assert_equal(error.message, "Can not use Hash ({:aaa=>1}) for color value, expected String or Hex Number")
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should raise for unexpected color" do
|
119
|
+
error = assert_raises(ArgumentError) do
|
120
|
+
@format.font_color = :aaa
|
121
|
+
end
|
122
|
+
|
123
|
+
assert_equal(error.message, "Unknown color value :aaa, expected hex string or color name")
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
describe "FastExcel::FormatExt border" do
|
130
|
+
|
131
|
+
before do
|
132
|
+
workbook = FastExcel.open(constant_memory: true)
|
133
|
+
@format = workbook.add_format
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should set border as symbol" do
|
137
|
+
@format.bottom = :border_thin
|
138
|
+
assert_equal(:border_thin, @format.bottom)
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should set border as short symbol" do
|
142
|
+
@format.bottom = :thin
|
143
|
+
assert_equal(:border_thin, @format.bottom)
|
144
|
+
end
|
145
|
+
|
146
|
+
it "should set border as string" do
|
147
|
+
@format.bottom = "thin"
|
148
|
+
assert_equal(:border_thin, @format.bottom)
|
149
|
+
end
|
150
|
+
|
151
|
+
it "should set border as number" do
|
152
|
+
@format.bottom = 1
|
153
|
+
assert_equal(:border_thin, @format.bottom)
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should set border with long prop name" do
|
157
|
+
error = assert_raises(ArgumentError) do
|
158
|
+
@format.border_bottom = :aaa
|
159
|
+
end
|
160
|
+
|
161
|
+
assert_equal(error.message, "Unknown value :aaa for border. Possible values: "\
|
162
|
+
"[:none, :thin, :medium, :dashed, :dotted, :thick, :double, :hair, :medium_dashed, "\
|
163
|
+
":dash_dot, :medium_dash_dot, :dash_dot_dot, :medium_dash_dot_dot, :slant_dash_dot]")
|
164
|
+
end
|
165
|
+
|
166
|
+
it "should get value with long name" do
|
167
|
+
@format.bottom = "thin"
|
168
|
+
assert_equal(:border_thin, @format.border_bottom)
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -20,9 +20,13 @@ ensure
|
|
20
20
|
File.delete(file_path)
|
21
21
|
end
|
22
22
|
|
23
|
+
def get_arrays(workbook)
|
24
|
+
workbook.close
|
25
|
+
parse_xlsx_as_matrix(workbook.filename)
|
26
|
+
end
|
27
|
+
|
23
28
|
def parse_xlsx_as_array(file_path)
|
24
|
-
|
25
|
-
data = excel.to_matrix.to_a
|
29
|
+
data = parse_xlsx_as_matrix(file_path)
|
26
30
|
headers = data.shift
|
27
31
|
|
28
32
|
data.map do |row|
|
@@ -32,5 +36,17 @@ end
|
|
32
36
|
|
33
37
|
def parse_xlsx_as_matrix(file_path)
|
34
38
|
excel = parse_xlsx(file_path)
|
35
|
-
|
36
|
-
|
39
|
+
|
40
|
+
sheet = excel.sheet(0)
|
41
|
+
|
42
|
+
rows = []
|
43
|
+
1.upto(sheet.last_row) do |row_number|
|
44
|
+
row = 1.upto(sheet.last_column).map do |col|
|
45
|
+
sheet.cell(row_number, col)
|
46
|
+
end
|
47
|
+
|
48
|
+
rows << row
|
49
|
+
end
|
50
|
+
|
51
|
+
return rows
|
52
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
describe "FastExcel::WorksheetExt append_row" do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@workbook = FastExcel.open(constant_memory: false)
|
7
|
+
@worksheet = @workbook.add_worksheet
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should have last_row_number = -1" do
|
11
|
+
assert_equal(-1, @worksheet.last_row_number)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should write_value and update last_row_number" do
|
15
|
+
@worksheet.write_value(0, 2, "aaa")
|
16
|
+
assert_equal(0, @worksheet.last_row_number)
|
17
|
+
assert_equal([[nil, nil, "aaa"]], get_arrays(@workbook))
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should append row and update last_row_number" do
|
21
|
+
@worksheet.append_row(["aaa", "bbb", "ccc"])
|
22
|
+
@worksheet.append_row(["ddd", "eee", "fff"])
|
23
|
+
|
24
|
+
assert_equal(1, @worksheet.last_row_number)
|
25
|
+
assert_equal([["aaa", "bbb", "ccc"], ["ddd", "eee", "fff"]], get_arrays(@workbook))
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should write_row then append and update last_row_number" do
|
29
|
+
@worksheet.write_row(3, ["aaa", "bbb", "ccc"])
|
30
|
+
@worksheet.append_row(["ddd", "eee", "fff"])
|
31
|
+
|
32
|
+
assert_equal(4, @worksheet.last_row_number)
|
33
|
+
assert_equal(
|
34
|
+
[
|
35
|
+
[nil, nil, nil],
|
36
|
+
[nil, nil, nil],
|
37
|
+
[nil, nil, nil],
|
38
|
+
["aaa", "bbb", "ccc"],
|
39
|
+
["ddd", "eee", "fff"]
|
40
|
+
],
|
41
|
+
get_arrays(@workbook)
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should not reduce last_row_number" do
|
46
|
+
@worksheet.append_row(["aaa", "bbb", "ccc"])
|
47
|
+
@worksheet.append_row(["ddd", "eee", "fff"])
|
48
|
+
@worksheet.write_value(0, 4, "foo")
|
49
|
+
@worksheet.append_row(["111", "222", "333"])
|
50
|
+
|
51
|
+
assert_equal(2, @worksheet.last_row_number)
|
52
|
+
assert_equal(
|
53
|
+
[
|
54
|
+
["aaa", "bbb", "ccc", nil, "foo"],
|
55
|
+
["ddd", "eee", "fff", nil, nil],
|
56
|
+
["111", "222", "333", nil, nil]
|
57
|
+
],
|
58
|
+
get_arrays(@workbook)
|
59
|
+
)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should not allow to write rows that already saved" do
|
63
|
+
@workbook = FastExcel.open(constant_memory: true)
|
64
|
+
@worksheet = @workbook.add_worksheet
|
65
|
+
|
66
|
+
@worksheet.append_row(["aaa", "bbb", "ccc"])
|
67
|
+
@worksheet.append_row(["ddd", "eee", "fff"])
|
68
|
+
|
69
|
+
error = assert_raises(ArgumentError) do
|
70
|
+
@worksheet.write_value(0, 4, "foo")
|
71
|
+
end
|
72
|
+
|
73
|
+
assert_equal("Can not write to saved row in constant_memory mode (attempted row: 0, last saved row: 1)", error.message)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should write bigdecimal as a number" do
|
77
|
+
require 'bigdecimal'
|
78
|
+
|
79
|
+
@workbook = FastExcel.open(constant_memory: true)
|
80
|
+
@worksheet = @workbook.add_worksheet
|
81
|
+
|
82
|
+
@worksheet.append_row([BigDecimal.new("0.1234")])
|
83
|
+
|
84
|
+
assert_equal([[0.1234]], get_arrays(@workbook))
|
85
|
+
end
|
86
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fast_excel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pavel Evstigneev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -39,20 +39,26 @@ extensions:
|
|
39
39
|
extra_rdoc_files: []
|
40
40
|
files:
|
41
41
|
- ".gitignore"
|
42
|
+
- ".travis.yml"
|
42
43
|
- CHANGELOG.md
|
43
44
|
- Gemfile
|
44
45
|
- Gemfile.lock
|
45
46
|
- Makefile
|
46
47
|
- README.md
|
47
48
|
- Rakefile
|
49
|
+
- appveyor.yml
|
48
50
|
- benchmarks/1k_rows.rb
|
49
51
|
- benchmarks/20k_rows.rb
|
50
52
|
- benchmarks/init.rb
|
51
53
|
- benchmarks/memory.rb
|
52
54
|
- examples/example.rb
|
55
|
+
- examples/example_align.rb
|
53
56
|
- examples/example_chart.rb
|
57
|
+
- examples/example_colors.rb
|
54
58
|
- examples/example_formula.rb
|
55
59
|
- examples/example_image.rb
|
60
|
+
- examples/example_styles.rb
|
61
|
+
- examples/logo.png
|
56
62
|
- extconf.rb
|
57
63
|
- fast_excel.gemspec
|
58
64
|
- lib/fast_excel.rb
|
@@ -145,8 +151,10 @@ files:
|
|
145
151
|
- libxlsxwriter/version.txt
|
146
152
|
- test/date_test.rb
|
147
153
|
- test/default_format_test.rb
|
154
|
+
- test/format_test.rb
|
148
155
|
- test/test_helper.rb
|
149
156
|
- test/tmpfile_test.rb
|
157
|
+
- test/worksheet_test.rb
|
150
158
|
homepage: https://github.com/paxa/fast_excel
|
151
159
|
licenses:
|
152
160
|
- MIT
|