fast_excel 0.2.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.dockerignore +2 -0
- data/.gitignore +7 -0
- data/.travis.yml +32 -9
- data/CHANGELOG.md +36 -1
- data/Dockerfile.test +17 -0
- data/Gemfile +2 -1
- data/Gemfile.lock +33 -24
- data/LICENSE +21 -0
- data/Makefile +13 -0
- data/README.md +177 -40
- data/Rakefile +11 -1
- data/benchmarks/1k_rows.rb +17 -4
- data/benchmarks/20k_rows.rb +4 -0
- data/benchmarks/auto_width.rb +37 -0
- data/benchmarks/init.rb +14 -2
- data/benchmarks/memory.rb +8 -0
- data/benchmarks/profiler.rb +27 -0
- data/benchmarks/write_value.rb +62 -0
- data/examples/example.rb +3 -3
- data/examples/example_auto_width.rb +26 -0
- data/examples/example_filters.rb +36 -0
- data/examples/example_formula.rb +1 -3
- data/examples/example_hyperlink.rb +20 -0
- data/ext/fast_excel/extconf.rb +3 -0
- data/ext/fast_excel/text_width_ext.c +460 -0
- data/fast_excel.gemspec +3 -4
- data/letters.html +114 -0
- data/lib/fast_excel.rb +131 -25
- data/lib/fast_excel/binding.rb +33 -21
- data/lib/fast_excel/binding/chart.rb +20 -1
- data/lib/fast_excel/binding/format.rb +11 -4
- data/lib/fast_excel/binding/workbook.rb +10 -2
- data/lib/fast_excel/binding/worksheet.rb +44 -27
- data/libxlsxwriter/.gitignore +1 -0
- data/libxlsxwriter/.indent.pro +8 -0
- data/libxlsxwriter/.travis.yml +12 -0
- data/libxlsxwriter/CMakeLists.txt +338 -0
- data/libxlsxwriter/CONTRIBUTING.md +1 -1
- data/libxlsxwriter/Changes.txt +162 -0
- data/libxlsxwriter/LICENSE.txt +65 -4
- data/libxlsxwriter/Makefile +33 -11
- data/libxlsxwriter/Readme.md +3 -1
- data/libxlsxwriter/cocoapods/libxlsxwriter-umbrella.h +2 -1
- data/libxlsxwriter/cocoapods/libxlsxwriter.modulemap +2 -2
- data/libxlsxwriter/include/xlsxwriter.h +2 -2
- data/libxlsxwriter/include/xlsxwriter/app.h +2 -2
- data/libxlsxwriter/include/xlsxwriter/chart.h +164 -13
- data/libxlsxwriter/include/xlsxwriter/chartsheet.h +544 -0
- data/libxlsxwriter/include/xlsxwriter/common.h +35 -6
- data/libxlsxwriter/include/xlsxwriter/content_types.h +5 -2
- data/libxlsxwriter/include/xlsxwriter/core.h +2 -2
- data/libxlsxwriter/include/xlsxwriter/custom.h +2 -2
- data/libxlsxwriter/include/xlsxwriter/drawing.h +3 -2
- data/libxlsxwriter/include/xlsxwriter/format.h +8 -8
- data/libxlsxwriter/include/xlsxwriter/hash_table.h +1 -1
- data/libxlsxwriter/include/xlsxwriter/packager.h +18 -8
- data/libxlsxwriter/include/xlsxwriter/relationships.h +2 -2
- data/libxlsxwriter/include/xlsxwriter/shared_strings.h +5 -3
- data/libxlsxwriter/include/xlsxwriter/styles.h +10 -5
- data/libxlsxwriter/include/xlsxwriter/theme.h +2 -2
- data/libxlsxwriter/include/xlsxwriter/utility.h +35 -5
- data/libxlsxwriter/include/xlsxwriter/workbook.h +234 -57
- data/libxlsxwriter/include/xlsxwriter/worksheet.h +780 -91
- data/libxlsxwriter/include/xlsxwriter/xmlwriter.h +4 -2
- data/libxlsxwriter/libxlsxwriter.podspec +4 -2
- data/libxlsxwriter/src/Makefile +31 -6
- data/libxlsxwriter/src/app.c +2 -2
- data/libxlsxwriter/src/chart.c +116 -23
- data/libxlsxwriter/src/chartsheet.c +508 -0
- data/libxlsxwriter/src/content_types.c +12 -4
- data/libxlsxwriter/src/core.c +11 -11
- data/libxlsxwriter/src/custom.c +3 -3
- data/libxlsxwriter/src/drawing.c +114 -17
- data/libxlsxwriter/src/format.c +5 -5
- data/libxlsxwriter/src/hash_table.c +1 -1
- data/libxlsxwriter/src/packager.c +378 -61
- data/libxlsxwriter/src/relationships.c +2 -2
- data/libxlsxwriter/src/shared_strings.c +18 -4
- data/libxlsxwriter/src/styles.c +59 -12
- data/libxlsxwriter/src/theme.c +2 -2
- data/libxlsxwriter/src/utility.c +93 -6
- data/libxlsxwriter/src/workbook.c +379 -61
- data/libxlsxwriter/src/worksheet.c +1240 -174
- data/libxlsxwriter/src/xmlwriter.c +18 -9
- data/libxlsxwriter/third_party/minizip/Makefile +6 -1
- data/libxlsxwriter/third_party/minizip/ioapi.c +10 -0
- data/libxlsxwriter/third_party/minizip/zip.c +2 -0
- data/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.c +2 -2
- data/libxlsxwriter/version.txt +1 -1
- data/test/auto_width_test.rb +19 -0
- data/test/date_test.rb +34 -0
- data/test/format_test.rb +8 -0
- data/test/reopen_test.rb +22 -0
- data/test/test_helper.rb +8 -5
- data/test/text_width_test.rb +80 -0
- data/test/tmpfile_test.rb +1 -0
- data/test/validations_test.rb +47 -0
- data/test/worksheet_test.rb +44 -1
- metadata +33 -9
data/fast_excel.gemspec
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
Gem::Specification.new do |s|
|
|
2
2
|
s.name = "fast_excel"
|
|
3
|
-
s.version = "0.
|
|
3
|
+
s.version = "0.4.0"
|
|
4
4
|
s.author = ["Pavel Evstigneev"]
|
|
5
5
|
s.email = ["pavel.evst@gmail.com"]
|
|
6
6
|
s.homepage = "https://github.com/paxa/fast_excel"
|
|
7
|
-
s.summary = %q{Ultra Fast Excel
|
|
7
|
+
s.summary = %q{Ultra Fast Excel Writer}
|
|
8
8
|
s.description = "Wrapper for libxlsxwriter using ffi"
|
|
9
9
|
s.license = 'MIT'
|
|
10
|
-
s.
|
|
11
|
-
s.required_ruby_version = '~> 2.0'
|
|
10
|
+
s.required_ruby_version = ['>= 2.0', '< 4.0']
|
|
12
11
|
|
|
13
12
|
s.files = `git ls-files`.split("\n")
|
|
14
13
|
s.test_files = []
|
data/letters.html
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
<style>
|
|
2
|
+
html, body {
|
|
3
|
+
font-family: Arial;
|
|
4
|
+
}
|
|
5
|
+
#result {
|
|
6
|
+
font-size: 14px;
|
|
7
|
+
font-family: Arial;
|
|
8
|
+
white-space: pre;
|
|
9
|
+
}
|
|
10
|
+
</style>
|
|
11
|
+
|
|
12
|
+
<select onchange="generateFor(this.value)">
|
|
13
|
+
<option></option>
|
|
14
|
+
<option>Arial</option>
|
|
15
|
+
<option>Calibri</option>
|
|
16
|
+
<option>Times New Roman</option>
|
|
17
|
+
</select>
|
|
18
|
+
|
|
19
|
+
<pre id="result">
|
|
20
|
+
|
|
21
|
+
</pre>
|
|
22
|
+
|
|
23
|
+
<script>
|
|
24
|
+
function ready(fn){var d=document;(d.readyState=='loading')?d.addEventListener('DOMContentLoaded',fn):fn();}
|
|
25
|
+
|
|
26
|
+
let average = (array) => array.reduce((a, b) => a + b) / array.length;
|
|
27
|
+
|
|
28
|
+
window.widths = {};
|
|
29
|
+
window.combos = {};
|
|
30
|
+
window.characters = [];
|
|
31
|
+
|
|
32
|
+
for (var n = 32; n <= 126; n++) {
|
|
33
|
+
characters.push(String.fromCharCode(n));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function generateFor(fontFamily) {
|
|
37
|
+
window.widths = {};
|
|
38
|
+
window.combos = {};
|
|
39
|
+
|
|
40
|
+
var startTime = (new Date()).getTime();
|
|
41
|
+
|
|
42
|
+
var canvas = document.createElement('canvas').getContext('2d');
|
|
43
|
+
canvas.font = `normal 100px ${fontFamily}`;
|
|
44
|
+
canvas.textAlign = 'start';
|
|
45
|
+
canvas.textBaseline = 'alphabetic';
|
|
46
|
+
|
|
47
|
+
window.textWidth = function getWidth(value) {
|
|
48
|
+
return canvas.measureText(value).width;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
characters.forEach((char) => {
|
|
52
|
+
widths[char] = textWidth(char);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
characters.forEach((char1) => {
|
|
56
|
+
characters.forEach((char2) => {
|
|
57
|
+
var combined = textWidth(char1 + char2);
|
|
58
|
+
var expected = widths[char1] + widths[char2];
|
|
59
|
+
|
|
60
|
+
if (Math.abs(combined - expected) > 0.001) {
|
|
61
|
+
combos[ char1 + char2 ] = [combined, expected];
|
|
62
|
+
//console.log('delta', char1, char2, Math.abs(el.clientWidth - expected));
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
printOutput(startTime, fontFamily);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function printOutput(startTime, fontFamily) {
|
|
71
|
+
//document.querySelector('#result').innerText = JSON.stringify(widths, null, 4) + "\n" + JSON.stringify(combos, null, 4);
|
|
72
|
+
var fontPrefix = fontFamily.replace(/\s+/g, '_').toUpperCase();
|
|
73
|
+
var output = "";
|
|
74
|
+
|
|
75
|
+
var averageSize = average(Object.values(widths));
|
|
76
|
+
|
|
77
|
+
output += `static float ${fontPrefix}_DEFAULT = ${averageSize};\n`;
|
|
78
|
+
output += `static float ${fontPrefix}_CHAR_WIDTH[127] = {0`;
|
|
79
|
+
for (var n = 1; n <= 126; n++) {
|
|
80
|
+
output += `, ${widths[String.fromCharCode(n)] || '0' }`;
|
|
81
|
+
}
|
|
82
|
+
output += "};\n";
|
|
83
|
+
|
|
84
|
+
output += `static float ${fontPrefix}_KERNING[127][127] = {\n`;
|
|
85
|
+
for (var n1 = 0; n1 <= 126; n1++) {
|
|
86
|
+
var char1 = String.fromCharCode(n1);
|
|
87
|
+
var charDisplay = characters.includes(char1) ? char1 : '';
|
|
88
|
+
|
|
89
|
+
var prefix = `/* ${n1} : ${charDisplay} */`;
|
|
90
|
+
if (Object.keys(combos).some((pair) => { return pair[0] == char1 })) {
|
|
91
|
+
output += ` ${prefix} { 0`;
|
|
92
|
+
for (var n2 = 1; n2 <= 126; n2++) {
|
|
93
|
+
var char2 = String.fromCharCode(n2);
|
|
94
|
+
output += `, ${combos[char1 + char2] ? combos[char1 + char2][0] : '0' }`;
|
|
95
|
+
}
|
|
96
|
+
output += ` }${n1 == 126 ? '' : ','}\n`;
|
|
97
|
+
} else {
|
|
98
|
+
output += ` ${prefix} { 0 },\n`;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
output += "};\n";
|
|
102
|
+
|
|
103
|
+
output += "\nKerning:\n";
|
|
104
|
+
Object.keys(combos).forEach((pair) => {
|
|
105
|
+
output += `${pair} = ${combos[pair][0]} (not ${combos[pair][1]})\n`
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
document.querySelector('#result').innerText = output;
|
|
109
|
+
|
|
110
|
+
var endTime = (new Date()).getTime();
|
|
111
|
+
//alert(`done ${endTime - startTime} ms`);
|
|
112
|
+
console.log(`done ${endTime - startTime} ms, ${Object.keys(combos).length} combos`);
|
|
113
|
+
}
|
|
114
|
+
</script>
|
data/lib/fast_excel.rb
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
require_relative './fast_excel/binding'
|
|
2
|
+
require 'set'
|
|
3
|
+
|
|
4
|
+
# not used for now
|
|
5
|
+
#require_relative '../ext/fast_excel/text_width_ext'
|
|
2
6
|
|
|
3
7
|
module FastExcel
|
|
4
8
|
|
|
@@ -9,20 +13,27 @@ module FastExcel
|
|
|
9
13
|
end
|
|
10
14
|
end
|
|
11
15
|
|
|
16
|
+
class URL
|
|
17
|
+
attr_accessor :url
|
|
18
|
+
def initialize(url)
|
|
19
|
+
@url = url
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
12
23
|
DEF_COL_WIDTH = 8.43
|
|
13
24
|
|
|
14
25
|
def self.open(filename = nil, constant_memory: false, default_format: nil)
|
|
15
26
|
tmp_file = false
|
|
16
|
-
|
|
27
|
+
if filename
|
|
28
|
+
if File.exist?(filename) && File.size(filename) > 0
|
|
29
|
+
raise ArgumentError, "File '#{filename}' already exists. FastExcel can not open existing files, only create new files"
|
|
30
|
+
end
|
|
31
|
+
else
|
|
17
32
|
require 'tmpdir'
|
|
18
33
|
filename = "#{Dir.mktmpdir}/fast_excel.xlsx"
|
|
19
34
|
tmp_file = true
|
|
20
35
|
end
|
|
21
36
|
|
|
22
|
-
unless filename
|
|
23
|
-
raise ArgumentError, "filename is required"
|
|
24
|
-
end
|
|
25
|
-
|
|
26
37
|
filename = filename.to_s if defined?(Pathname) && filename.is_a?(Pathname)
|
|
27
38
|
|
|
28
39
|
workbook = if constant_memory
|
|
@@ -294,7 +305,7 @@ module FastExcel
|
|
|
294
305
|
if respond_to?("#{key}=")
|
|
295
306
|
send("#{key}=", value)
|
|
296
307
|
elsif respond_to?("set_#{key}=")
|
|
297
|
-
|
|
308
|
+
send("set_#{key}=", value)
|
|
298
309
|
else
|
|
299
310
|
self[key] = value
|
|
300
311
|
end
|
|
@@ -323,6 +334,8 @@ module FastExcel
|
|
|
323
334
|
|
|
324
335
|
def initialize(struct)
|
|
325
336
|
@is_open = true
|
|
337
|
+
@sheet_names = Set.new
|
|
338
|
+
@sheets = []
|
|
326
339
|
super(struct)
|
|
327
340
|
end
|
|
328
341
|
|
|
@@ -338,6 +351,8 @@ module FastExcel
|
|
|
338
351
|
bold
|
|
339
352
|
end
|
|
340
353
|
|
|
354
|
+
alias_method :bold_format, :bold_cell_format
|
|
355
|
+
|
|
341
356
|
# "#,##0.00"
|
|
342
357
|
# "[$-409]m/d/yy h:mm AM/PM;@"
|
|
343
358
|
def number_format(pattern)
|
|
@@ -347,13 +362,31 @@ module FastExcel
|
|
|
347
362
|
end
|
|
348
363
|
|
|
349
364
|
def add_worksheet(sheetname = nil)
|
|
350
|
-
|
|
365
|
+
if !sheetname.nil?
|
|
366
|
+
if sheetname.length > Libxlsxwriter::SHEETNAME_MAX
|
|
367
|
+
raise ArgumentError, "Worksheet name '#{sheetname}' exceeds Excel's limit of #{Libxlsxwriter::SHEETNAME_MAX} characters"
|
|
368
|
+
elsif @sheet_names.include?(sheetname)
|
|
369
|
+
raise ArgumentError, "Worksheet name '#{sheetname}' is already in use"
|
|
370
|
+
end
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
sheet = super(sheetname)
|
|
351
374
|
sheet.workbook = self
|
|
375
|
+
@sheets << sheet
|
|
376
|
+
@sheet_names << sheet[:name]
|
|
377
|
+
sheet
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
def get_worksheet_by_name(name)
|
|
381
|
+
sheet = super(name)
|
|
382
|
+
sheet.workbook = self
|
|
383
|
+
|
|
352
384
|
sheet
|
|
353
385
|
end
|
|
354
386
|
|
|
355
387
|
def close
|
|
356
388
|
@is_open = false
|
|
389
|
+
@sheets.each(&:close)
|
|
357
390
|
super
|
|
358
391
|
end
|
|
359
392
|
|
|
@@ -361,11 +394,11 @@ module FastExcel
|
|
|
361
394
|
close if @is_open
|
|
362
395
|
File.open(filename, 'rb', &:read)
|
|
363
396
|
ensure
|
|
364
|
-
|
|
397
|
+
remove_tmp_folder
|
|
365
398
|
end
|
|
366
399
|
|
|
367
|
-
def
|
|
368
|
-
File.
|
|
400
|
+
def remove_tmp_folder
|
|
401
|
+
FileUtils.remove_entry(File.dirname(filename)) if tmp_file
|
|
369
402
|
end
|
|
370
403
|
|
|
371
404
|
def constant_memory?
|
|
@@ -379,6 +412,13 @@ module FastExcel
|
|
|
379
412
|
|
|
380
413
|
include AttributeHelper
|
|
381
414
|
|
|
415
|
+
def initialize(struct)
|
|
416
|
+
@is_open = true
|
|
417
|
+
@col_formats = {}
|
|
418
|
+
@last_row_number = -1
|
|
419
|
+
super(struct)
|
|
420
|
+
end
|
|
421
|
+
|
|
382
422
|
def write_row(row_number, values, formats = nil)
|
|
383
423
|
values.each_with_index do |value, index|
|
|
384
424
|
format = if formats
|
|
@@ -389,52 +429,118 @@ module FastExcel
|
|
|
389
429
|
end
|
|
390
430
|
end
|
|
391
431
|
|
|
432
|
+
def auto_width?
|
|
433
|
+
defined?(@auto_width) && @auto_width
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
def auto_width=(v)
|
|
437
|
+
@auto_width = v
|
|
438
|
+
@column_widths = {}
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
def calculated_column_widths
|
|
442
|
+
@column_widths || {}
|
|
443
|
+
end
|
|
444
|
+
|
|
392
445
|
def write_value(row_number, cell_number, value, format = nil)
|
|
393
446
|
|
|
394
|
-
if workbook.constant_memory? && row_number < last_row_number
|
|
447
|
+
if workbook.constant_memory? && row_number < @last_row_number
|
|
395
448
|
raise ArgumentError, "Can not write to saved row in constant_memory mode (attempted row: #{row_number}, last saved row: #{last_row_number})"
|
|
396
449
|
end
|
|
397
450
|
|
|
398
451
|
if value.is_a?(Numeric)
|
|
399
452
|
write_number(row_number, cell_number, value, format)
|
|
400
|
-
elsif defined?(
|
|
401
|
-
write_datetime(row_number, cell_number, FastExcel.lxw_datetime(value), format)
|
|
453
|
+
elsif defined?(Date) && value.is_a?(Date)
|
|
454
|
+
write_datetime(row_number, cell_number, FastExcel.lxw_datetime(value.to_datetime), format)
|
|
402
455
|
elsif value.is_a?(Time)
|
|
403
|
-
|
|
404
|
-
elsif value.is_a?(
|
|
456
|
+
write_number(row_number, cell_number, FastExcel.date_num(value), format)
|
|
457
|
+
elsif defined?(DateTime) && value.is_a?(DateTime)
|
|
458
|
+
write_number(row_number, cell_number, FastExcel.date_num(value), format)
|
|
459
|
+
elsif value.is_a?(TrueClass) || value.is_a?(FalseClass)
|
|
460
|
+
write_boolean(row_number, cell_number, value ? 1 : 0, format)
|
|
461
|
+
elsif value.is_a?(FastExcel::Formula)
|
|
405
462
|
write_formula(row_number, cell_number, value.fml, format)
|
|
463
|
+
elsif value.is_a?(FastExcel::URL)
|
|
464
|
+
write_url(row_number, cell_number, value.url, format)
|
|
465
|
+
add_text_width(value.url, format, cell_number) if auto_width?
|
|
406
466
|
else
|
|
407
467
|
write_string(row_number, cell_number, value.to_s, format)
|
|
468
|
+
add_text_width(value, format, cell_number) if auto_width?
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
@last_row_number = row_number > @last_row_number ? row_number : @last_row_number
|
|
472
|
+
end
|
|
473
|
+
|
|
474
|
+
def add_text_width(value, format, cell_number)
|
|
475
|
+
font_size = 0
|
|
476
|
+
if format
|
|
477
|
+
font_size = format.font_size
|
|
408
478
|
end
|
|
409
479
|
|
|
410
|
-
|
|
480
|
+
if font_size == 0
|
|
481
|
+
if @col_formats[cell_number] && @col_formats[cell_number].font_size
|
|
482
|
+
font_size = @col_formats[cell_number].font_size
|
|
483
|
+
end
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
if font_size == 0
|
|
487
|
+
font_size = workbook.default_format.font_size
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
font_size = 13 if font_size == nil || font_size == 0
|
|
491
|
+
|
|
492
|
+
scale = 0.08
|
|
493
|
+
new_width = (scale * font_size * value.to_s.length )
|
|
494
|
+
@column_widths[cell_number] = if new_width > (@column_widths[cell_number] || 0)
|
|
495
|
+
new_width
|
|
496
|
+
else
|
|
497
|
+
@column_widths[cell_number]
|
|
498
|
+
end
|
|
411
499
|
end
|
|
412
500
|
|
|
413
501
|
def append_row(values, formats = nil)
|
|
414
|
-
|
|
502
|
+
@last_row_number += 1
|
|
415
503
|
write_row(last_row_number, values, formats)
|
|
416
504
|
end
|
|
417
505
|
|
|
418
|
-
def
|
|
419
|
-
|
|
506
|
+
def <<(values)
|
|
507
|
+
append_row(values)
|
|
420
508
|
end
|
|
421
509
|
|
|
422
|
-
def
|
|
423
|
-
@last_row_number
|
|
510
|
+
def last_row_number
|
|
511
|
+
@last_row_number
|
|
424
512
|
end
|
|
425
513
|
|
|
426
|
-
def set_column(start_col, end_col, width, format = nil)
|
|
427
|
-
super(start_col, end_col, width, format)
|
|
514
|
+
def set_column(start_col, end_col, width = nil, format = nil)
|
|
515
|
+
super(start_col, end_col, width || DEF_COL_WIDTH, format)
|
|
516
|
+
|
|
517
|
+
return unless format
|
|
518
|
+
start_col.upto(end_col) do |i|
|
|
519
|
+
@col_formats[i] = format
|
|
520
|
+
end
|
|
428
521
|
end
|
|
429
522
|
|
|
430
523
|
def set_column_width(col, width)
|
|
431
|
-
set_column(col, col, width,
|
|
524
|
+
set_column(col, col, width, @col_formats[col])
|
|
432
525
|
end
|
|
433
526
|
|
|
434
527
|
def set_columns_width(start_col, end_col, width)
|
|
435
|
-
|
|
528
|
+
start_col.upto(end_col) do |i|
|
|
529
|
+
set_column_width(i, width)
|
|
530
|
+
end
|
|
436
531
|
end
|
|
437
532
|
|
|
533
|
+
def enable_filters!(start_col: 0, end_col:)
|
|
534
|
+
autofilter(start_col, 0, @last_row_number, end_col)
|
|
535
|
+
end
|
|
536
|
+
|
|
537
|
+
def close
|
|
538
|
+
if auto_width?
|
|
539
|
+
@column_widths.each do |num, width|
|
|
540
|
+
set_column_width(num, width + 0.2)
|
|
541
|
+
end
|
|
542
|
+
end
|
|
543
|
+
end
|
|
438
544
|
end
|
|
439
545
|
|
|
440
546
|
module FormatExt
|
data/lib/fast_excel/binding.rb
CHANGED
|
@@ -7,6 +7,8 @@ module Libxlsxwriter
|
|
|
7
7
|
|
|
8
8
|
LIB_FILENAME = if RUBY_PLATFORM =~ /darwin/
|
|
9
9
|
"libxlsxwriter.dylib"
|
|
10
|
+
elsif ['x64-mingw32', 'i386-mingw32'].include? RUBY_PLATFORM
|
|
11
|
+
"libxlsxwriter.dll"
|
|
10
12
|
else
|
|
11
13
|
"libxlsxwriter.so"
|
|
12
14
|
end
|
|
@@ -119,6 +121,10 @@ module Libxlsxwriter
|
|
|
119
121
|
|
|
120
122
|
SCHEMA_ROOT = "http://schemas.openxmlformats.org"
|
|
121
123
|
|
|
124
|
+
|
|
125
|
+
PORTRAIT = 1
|
|
126
|
+
LANDSCAPE = 0
|
|
127
|
+
|
|
122
128
|
def error(message)
|
|
123
129
|
fprintf(STDERR, "[ERROR][%s:%d]: \"message\"\n", FILE, LINE)
|
|
124
130
|
end
|
|
@@ -317,24 +323,31 @@ module Libxlsxwriter
|
|
|
317
323
|
:error_memory_malloc_failed, 1,
|
|
318
324
|
:error_creating_xlsx_file, 2,
|
|
319
325
|
:error_creating_tmpfile, 3,
|
|
320
|
-
:
|
|
321
|
-
:
|
|
322
|
-
:
|
|
323
|
-
:
|
|
324
|
-
:
|
|
325
|
-
:
|
|
326
|
-
:
|
|
327
|
-
:
|
|
328
|
-
:
|
|
329
|
-
:
|
|
330
|
-
:
|
|
331
|
-
:
|
|
332
|
-
:
|
|
333
|
-
:
|
|
334
|
-
:
|
|
335
|
-
:
|
|
326
|
+
:error_reading_tmpfile, 4,
|
|
327
|
+
:error_zip_file_operation, 5,
|
|
328
|
+
:error_zip_parameter_error, 6,
|
|
329
|
+
:error_zip_bad_zip_file, 7,
|
|
330
|
+
:error_zip_internal_error, 8,
|
|
331
|
+
:error_zip_file_add, 9,
|
|
332
|
+
:error_zip_close, 10,
|
|
333
|
+
:error_null_parameter_ignored, 11,
|
|
334
|
+
:error_parameter_validation, 12,
|
|
335
|
+
:error_sheetname_length_exceeded, 13,
|
|
336
|
+
:error_invalid_sheetname_character, 14,
|
|
337
|
+
:error_sheetname_start_end_apostrophe, 15,
|
|
338
|
+
:error_sheetname_already_used, 16,
|
|
339
|
+
:error_sheetname_reserved, 17,
|
|
340
|
+
:error_32_string_length_exceeded, 18,
|
|
341
|
+
:error_128_string_length_exceeded, 19,
|
|
342
|
+
:error_255_string_length_exceeded, 20,
|
|
343
|
+
:error_max_string_length_exceeded, 21,
|
|
344
|
+
:error_shared_string_index_not_found, 22,
|
|
345
|
+
:error_worksheet_index_out_of_range, 23,
|
|
346
|
+
:error_worksheet_max_number_urls_exceeded, 24,
|
|
347
|
+
:error_image_dimensions, 25,
|
|
348
|
+
:max_errno, 26
|
|
336
349
|
]
|
|
337
|
-
|
|
350
|
+
|
|
338
351
|
# = Fields:
|
|
339
352
|
# :year ::
|
|
340
353
|
# (Integer) Year : 1900 - 9999
|
|
@@ -887,6 +900,7 @@ module Libxlsxwriter
|
|
|
887
900
|
include DrawingWrappers
|
|
888
901
|
layout :file, :pointer,
|
|
889
902
|
:embedded, :uchar,
|
|
903
|
+
:orientation, :uchar,
|
|
890
904
|
:drawing_objects, DrawingObjects
|
|
891
905
|
end
|
|
892
906
|
|
|
@@ -2610,9 +2624,7 @@ module Libxlsxwriter
|
|
|
2610
2624
|
:zipfile_info, ZipFileinfo.by_value,
|
|
2611
2625
|
:filename, :string,
|
|
2612
2626
|
:buffer, :string,
|
|
2613
|
-
:tmpdir, :string
|
|
2614
|
-
:chart_count, :ushort,
|
|
2615
|
-
:drawing_count, :ushort
|
|
2627
|
+
:tmpdir, :string
|
|
2616
2628
|
end
|
|
2617
2629
|
|
|
2618
2630
|
# @method packager_new(filename, tmpdir)
|
|
@@ -2620,7 +2632,7 @@ module Libxlsxwriter
|
|
|
2620
2632
|
# @param [String] tmpdir
|
|
2621
2633
|
# @return [Packager]
|
|
2622
2634
|
# @scope class
|
|
2623
|
-
attach_function :packager_new, :lxw_packager_new, [:string, :string], Packager
|
|
2635
|
+
attach_function :packager_new, :lxw_packager_new, [:string, :string, :uchar], Packager
|
|
2624
2636
|
|
|
2625
2637
|
# @method packager_free(packager)
|
|
2626
2638
|
# @param [Packager] packager
|