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.
Files changed (100) hide show
  1. checksums.yaml +5 -5
  2. data/.dockerignore +2 -0
  3. data/.gitignore +7 -0
  4. data/.travis.yml +32 -9
  5. data/CHANGELOG.md +36 -1
  6. data/Dockerfile.test +17 -0
  7. data/Gemfile +2 -1
  8. data/Gemfile.lock +33 -24
  9. data/LICENSE +21 -0
  10. data/Makefile +13 -0
  11. data/README.md +177 -40
  12. data/Rakefile +11 -1
  13. data/benchmarks/1k_rows.rb +17 -4
  14. data/benchmarks/20k_rows.rb +4 -0
  15. data/benchmarks/auto_width.rb +37 -0
  16. data/benchmarks/init.rb +14 -2
  17. data/benchmarks/memory.rb +8 -0
  18. data/benchmarks/profiler.rb +27 -0
  19. data/benchmarks/write_value.rb +62 -0
  20. data/examples/example.rb +3 -3
  21. data/examples/example_auto_width.rb +26 -0
  22. data/examples/example_filters.rb +36 -0
  23. data/examples/example_formula.rb +1 -3
  24. data/examples/example_hyperlink.rb +20 -0
  25. data/ext/fast_excel/extconf.rb +3 -0
  26. data/ext/fast_excel/text_width_ext.c +460 -0
  27. data/fast_excel.gemspec +3 -4
  28. data/letters.html +114 -0
  29. data/lib/fast_excel.rb +131 -25
  30. data/lib/fast_excel/binding.rb +33 -21
  31. data/lib/fast_excel/binding/chart.rb +20 -1
  32. data/lib/fast_excel/binding/format.rb +11 -4
  33. data/lib/fast_excel/binding/workbook.rb +10 -2
  34. data/lib/fast_excel/binding/worksheet.rb +44 -27
  35. data/libxlsxwriter/.gitignore +1 -0
  36. data/libxlsxwriter/.indent.pro +8 -0
  37. data/libxlsxwriter/.travis.yml +12 -0
  38. data/libxlsxwriter/CMakeLists.txt +338 -0
  39. data/libxlsxwriter/CONTRIBUTING.md +1 -1
  40. data/libxlsxwriter/Changes.txt +162 -0
  41. data/libxlsxwriter/LICENSE.txt +65 -4
  42. data/libxlsxwriter/Makefile +33 -11
  43. data/libxlsxwriter/Readme.md +3 -1
  44. data/libxlsxwriter/cocoapods/libxlsxwriter-umbrella.h +2 -1
  45. data/libxlsxwriter/cocoapods/libxlsxwriter.modulemap +2 -2
  46. data/libxlsxwriter/include/xlsxwriter.h +2 -2
  47. data/libxlsxwriter/include/xlsxwriter/app.h +2 -2
  48. data/libxlsxwriter/include/xlsxwriter/chart.h +164 -13
  49. data/libxlsxwriter/include/xlsxwriter/chartsheet.h +544 -0
  50. data/libxlsxwriter/include/xlsxwriter/common.h +35 -6
  51. data/libxlsxwriter/include/xlsxwriter/content_types.h +5 -2
  52. data/libxlsxwriter/include/xlsxwriter/core.h +2 -2
  53. data/libxlsxwriter/include/xlsxwriter/custom.h +2 -2
  54. data/libxlsxwriter/include/xlsxwriter/drawing.h +3 -2
  55. data/libxlsxwriter/include/xlsxwriter/format.h +8 -8
  56. data/libxlsxwriter/include/xlsxwriter/hash_table.h +1 -1
  57. data/libxlsxwriter/include/xlsxwriter/packager.h +18 -8
  58. data/libxlsxwriter/include/xlsxwriter/relationships.h +2 -2
  59. data/libxlsxwriter/include/xlsxwriter/shared_strings.h +5 -3
  60. data/libxlsxwriter/include/xlsxwriter/styles.h +10 -5
  61. data/libxlsxwriter/include/xlsxwriter/theme.h +2 -2
  62. data/libxlsxwriter/include/xlsxwriter/utility.h +35 -5
  63. data/libxlsxwriter/include/xlsxwriter/workbook.h +234 -57
  64. data/libxlsxwriter/include/xlsxwriter/worksheet.h +780 -91
  65. data/libxlsxwriter/include/xlsxwriter/xmlwriter.h +4 -2
  66. data/libxlsxwriter/libxlsxwriter.podspec +4 -2
  67. data/libxlsxwriter/src/Makefile +31 -6
  68. data/libxlsxwriter/src/app.c +2 -2
  69. data/libxlsxwriter/src/chart.c +116 -23
  70. data/libxlsxwriter/src/chartsheet.c +508 -0
  71. data/libxlsxwriter/src/content_types.c +12 -4
  72. data/libxlsxwriter/src/core.c +11 -11
  73. data/libxlsxwriter/src/custom.c +3 -3
  74. data/libxlsxwriter/src/drawing.c +114 -17
  75. data/libxlsxwriter/src/format.c +5 -5
  76. data/libxlsxwriter/src/hash_table.c +1 -1
  77. data/libxlsxwriter/src/packager.c +378 -61
  78. data/libxlsxwriter/src/relationships.c +2 -2
  79. data/libxlsxwriter/src/shared_strings.c +18 -4
  80. data/libxlsxwriter/src/styles.c +59 -12
  81. data/libxlsxwriter/src/theme.c +2 -2
  82. data/libxlsxwriter/src/utility.c +93 -6
  83. data/libxlsxwriter/src/workbook.c +379 -61
  84. data/libxlsxwriter/src/worksheet.c +1240 -174
  85. data/libxlsxwriter/src/xmlwriter.c +18 -9
  86. data/libxlsxwriter/third_party/minizip/Makefile +6 -1
  87. data/libxlsxwriter/third_party/minizip/ioapi.c +10 -0
  88. data/libxlsxwriter/third_party/minizip/zip.c +2 -0
  89. data/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.c +2 -2
  90. data/libxlsxwriter/version.txt +1 -1
  91. data/test/auto_width_test.rb +19 -0
  92. data/test/date_test.rb +34 -0
  93. data/test/format_test.rb +8 -0
  94. data/test/reopen_test.rb +22 -0
  95. data/test/test_helper.rb +8 -5
  96. data/test/text_width_test.rb +80 -0
  97. data/test/tmpfile_test.rb +1 -0
  98. data/test/validations_test.rb +47 -0
  99. data/test/worksheet_test.rb +44 -1
  100. 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.2.2"
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 Writter}
7
+ s.summary = %q{Ultra Fast Excel Writer}
8
8
  s.description = "Wrapper for libxlsxwriter using ffi"
9
9
  s.license = 'MIT'
10
- s.has_rdoc = false
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
- unless filename
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
- send("set_#{key}=", value)
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
- sheet = super
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
- remove_tmp_file
397
+ remove_tmp_folder
365
398
  end
366
399
 
367
- def remove_tmp_file
368
- File.delete(filename) if tmp_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?(DateTime) && value.is_a?(DateTime)
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
- write_datetime(row_number, cell_number, FastExcel.lxw_time(value), format)
404
- elsif value.is_a?(Formula)
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
- @last_row_number = row_number > last_row_number ? row_number : last_row_number
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
- increment_last_row_number!
502
+ @last_row_number += 1
415
503
  write_row(last_row_number, values, formats)
416
504
  end
417
505
 
418
- def last_row_number
419
- defined?(@last_row_number) ? @last_row_number : -1
506
+ def <<(values)
507
+ append_row(values)
420
508
  end
421
509
 
422
- def increment_last_row_number!
423
- @last_row_number = last_row_number + 1
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, nil)
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
- set_column(start_col, end_col, width, nil)
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
@@ -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
- :error_zip_file_operation, 4,
321
- :error_zip_file_add, 5,
322
- :error_zip_close, 6,
323
- :error_null_parameter_ignored, 7,
324
- :error_parameter_validation, 8,
325
- :error_sheetname_length_exceeded, 9,
326
- :error_invalid_sheetname_character, 10,
327
- :error_sheetname_already_used, 11,
328
- :error_128_string_length_exceeded, 12,
329
- :error_255_string_length_exceeded, 13,
330
- :error_max_string_length_exceeded, 14,
331
- :error_shared_string_index_not_found, 15,
332
- :error_worksheet_index_out_of_range, 16,
333
- :error_worksheet_max_number_urls_exceeded, 17,
334
- :error_image_dimensions, 18,
335
- :max_errno, 19
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