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.
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