fast_excel 0.2.2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|