axlsx 1.1.7 → 1.1.8

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 (130) hide show
  1. data/README.md +41 -5
  2. data/Rakefile +3 -2
  3. data/examples/chart_colors.rb +18 -3
  4. data/examples/example.rb +100 -46
  5. data/examples/extractive.pdf +0 -0
  6. data/lib/axlsx.rb +7 -6
  7. data/lib/axlsx/content_type/content_type.rb +2 -0
  8. data/lib/axlsx/content_type/default.rb +21 -12
  9. data/lib/axlsx/content_type/override.rb +22 -11
  10. data/lib/axlsx/doc_props/app.rb +36 -32
  11. data/lib/axlsx/doc_props/core.rb +9 -5
  12. data/lib/axlsx/drawing/ax_data_source.rb +7 -6
  13. data/lib/axlsx/drawing/axis.rb +48 -27
  14. data/lib/axlsx/drawing/bar_3D_chart.rb +47 -37
  15. data/lib/axlsx/drawing/bar_series.rb +1 -0
  16. data/lib/axlsx/drawing/cat_axis.rb +42 -38
  17. data/lib/axlsx/drawing/chart.rb +34 -27
  18. data/lib/axlsx/drawing/drawing.rb +5 -4
  19. data/lib/axlsx/drawing/line_3D_chart.rb +1 -1
  20. data/lib/axlsx/drawing/num_data_source.rb +1 -1
  21. data/lib/axlsx/drawing/pie_3D_chart.rb +7 -7
  22. data/lib/axlsx/drawing/two_cell_anchor.rb +3 -8
  23. data/lib/axlsx/drawing/view_3D.rb +41 -31
  24. data/lib/axlsx/drawing/vml_drawing.rb +1 -1
  25. data/lib/axlsx/package.rb +11 -11
  26. data/lib/axlsx/rels/relationship.rb +3 -3
  27. data/lib/axlsx/stylesheet/styles.rb +1 -1
  28. data/lib/axlsx/util/constants.rb +4 -0
  29. data/lib/axlsx/util/simple_typed_list.rb +2 -2
  30. data/lib/axlsx/util/validators.rb +2 -2
  31. data/lib/axlsx/version.rb +1 -1
  32. data/lib/axlsx/workbook/workbook.rb +1 -2
  33. data/lib/axlsx/workbook/worksheet/cell.rb +1 -1
  34. data/lib/axlsx/workbook/worksheet/data_bar.rb +1 -1
  35. data/lib/axlsx/workbook/worksheet/page_setup.rb +9 -0
  36. data/lib/axlsx/workbook/worksheet/protected_range.rb +46 -0
  37. data/lib/axlsx/workbook/worksheet/worksheet.rb +180 -56
  38. data/test/content_type/tc_content_type.rb +1 -6
  39. data/test/doc_props/tc_core.rb +1 -1
  40. data/test/drawing/tc_axis.rb +8 -0
  41. data/test/drawing/tc_bar_3D_chart.rb +12 -12
  42. data/test/drawing/tc_bar_series.rb +0 -1
  43. data/test/drawing/tc_chart.rb +1 -5
  44. data/test/drawing/tc_pie_3D_chart.rb +3 -7
  45. data/test/drawing/tc_view_3D.rb +18 -18
  46. data/test/tc_package.rb +2 -0
  47. data/test/workbook/worksheet/tc_page_setup.rb +20 -3
  48. data/test/workbook/worksheet/tc_protected_range.rb +18 -0
  49. data/test/workbook/worksheet/tc_selection.rb +1 -1
  50. data/test/workbook/worksheet/tc_worksheet.rb +39 -18
  51. metadata +54 -103
  52. data/examples/axis-titles.xlsx +0 -0
  53. data/examples/basic_charts.xlsx +0 -0
  54. data/examples/chart_colors.xlsx +0 -0
  55. data/examples/charts.xlsx +0 -0
  56. data/examples/conditional_formatting/getting_barred.xlsx +0 -0
  57. data/examples/doc/_index.html +0 -84
  58. data/examples/doc/class_list.html +0 -47
  59. data/examples/doc/css/common.css +0 -1
  60. data/examples/doc/css/full_list.css +0 -55
  61. data/examples/doc/css/style.css +0 -322
  62. data/examples/doc/file_list.html +0 -46
  63. data/examples/doc/frames.html +0 -13
  64. data/examples/doc/index.html +0 -84
  65. data/examples/doc/js/app.js +0 -205
  66. data/examples/doc/js/full_list.js +0 -173
  67. data/examples/doc/js/jquery.js +0 -16
  68. data/examples/doc/method_list.html +0 -46
  69. data/examples/doc/top-level-namespace.html +0 -95
  70. data/examples/example.xlsx +0 -0
  71. data/examples/example_streamed.xlsx +0 -0
  72. data/examples/examples_saved.xlsx +0 -0
  73. data/examples/extractive.xlsx +0 -0
  74. data/examples/fish.xlsx +0 -0
  75. data/examples/no-use_autowidth.xlsx +0 -0
  76. data/examples/pareto.rb +0 -28
  77. data/examples/pareto.xlsx +0 -0
  78. data/examples/pie_chart_excel.xlsx +0 -0
  79. data/examples/pie_chart_saved.xlsx +0 -0
  80. data/examples/shared_strings_example.xlsx +0 -0
  81. data/examples/sheet_protection.xlsx +0 -0
  82. data/examples/sheet_view.xlsx +0 -0
  83. data/examples/two_cell_anchor_image.xlsx +0 -0
  84. data/examples/~$example.xlsx +0 -0
  85. data/lib/axlsx/drawing/ax_data_source.rb~ +0 -55
  86. data/lib/axlsx/drawing/data_source.rb~ +0 -51
  87. data/lib/axlsx/drawing/hlink_click.rb~ +0 -0
  88. data/lib/axlsx/drawing/hyperlink.rb~ +0 -64
  89. data/lib/axlsx/drawing/num_data.rb~ +0 -51
  90. data/lib/axlsx/drawing/num_data_source.rb~ +0 -54
  91. data/lib/axlsx/drawing/num_val.rb~ +0 -40
  92. data/lib/axlsx/drawing/picture_locking.rb~ +0 -36
  93. data/lib/axlsx/drawing/ref.rb~ +0 -41
  94. data/lib/axlsx/drawing/str_data.rb~ +0 -58
  95. data/lib/axlsx/drawing/str_val.rb~ +0 -35
  96. data/lib/axlsx/drawing/vml_drawing.rb~ +0 -6
  97. data/lib/axlsx/drawing/vml_shape.rb~ +0 -61
  98. data/lib/axlsx/util/cbf.rb +0 -333
  99. data/lib/axlsx/util/cfb.rb~ +0 -201
  100. data/lib/axlsx/util/font_tables.rb~ +0 -0
  101. data/lib/axlsx/util/ms_off_crypto.rb +0 -189
  102. data/lib/axlsx/util/ms_off_crypto.rb~ +0 -3
  103. data/lib/axlsx/util/ms_offcrypto.rb~ +0 -0
  104. data/lib/axlsx/util/parser.rb~ +0 -6
  105. data/lib/axlsx/util/storage.rb~ +0 -0
  106. data/lib/axlsx/workbook/shared_strings_table.rb~ +0 -69
  107. data/lib/axlsx/workbook/worksheet/cfvo.rb~ +0 -0
  108. data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
  109. data/lib/axlsx/workbook/worksheet/color_scale.rb~ +0 -46
  110. data/lib/axlsx/workbook/worksheet/comment.rb~ +0 -91
  111. data/lib/axlsx/workbook/worksheet/comments.rb~ +0 -86
  112. data/lib/axlsx/workbook/worksheet/data_bar.rb~ +0 -0
  113. data/lib/axlsx/workbook/worksheet/icon_set.rb~ +0 -95
  114. data/lib/axlsx/workbook/worksheet/shared_strings_table.rb~ +0 -0
  115. data/lib/axlsx/workbook/worksheet/table.rb~ +0 -97
  116. data/lib/schema/dc.xsd~ +0 -118
  117. data/lib/schema/dcterms.xsd~ +0 -331
  118. data/lib/schema/opc-coreProperties.xsd~ +0 -50
  119. data/test/drawing/tc_data_source.rb~ +0 -30
  120. data/test/drawing/tc_num_data.rb~ +0 -35
  121. data/test/drawing/tc_num_val.rb~ +0 -29
  122. data/test/drawing/tc_str_data.rb~ +0 -30
  123. data/test/drawing/tc_str_val.rb~ +0 -26
  124. data/test/drawing/tc_vml_drawing.rb~ +0 -0
  125. data/test/workbook/worksheet/table/tc_table.rb~ +0 -72
  126. data/test/workbook/worksheet/tc_cfvo.rb~ +0 -20
  127. data/test/workbook/worksheet/tc_col.rb~ +0 -10
  128. data/test/workbook/worksheet/tc_color_scale.rb~ +0 -0
  129. data/test/workbook/worksheet/tc_data_bar.rb~ +0 -0
  130. data/test/workbook/worksheet/tc_icon_set.rb~ +0 -0
@@ -1,201 +0,0 @@
1
- module Axlsx
2
-
3
- # The Cfb class is a MS-OFF-CRYPTOGRAPHY specific OLE (MS-CBF) writer implementation. No attempt is made to re-invent the wheel for read/write of compound binary files.
4
- class Cbf
5
-
6
- # the serialization for the CBF FAT
7
- FAT_PACKING = "s128"
8
-
9
- # the serialization for the MS-OFF-CRYPTO version stream
10
- VERSION_PACKING = 'l s30 l3'
11
-
12
- # The serialization for the MS-OFF-CRYPTO dataspace map stream
13
- DATA_SPACE_MAP_PACKING = 'l6 s16 l s25'
14
-
15
- # The serialization for the MS-OFF-CRYPTO strong encrytion data space stream
16
- STRONG_ENCRYPTION_DATA_SPACE_PACKING = 'l3 s25'
17
-
18
- # The serialization for the MS-OFF-CRYPTO primary stream
19
- PRIMARY_PACKING = 'l3 s38 l s39 l3 x12 l x2'
20
-
21
- # The cutoff size that determines if a stream should be in the mini-fat or the fat
22
- MINI_CUTOFF = 4096
23
-
24
- # Creates a new Cbf object based on a package.
25
- def initialize(ms_off_crypto)
26
- @file_name = ms_off_crypto.file_name
27
- @storages = []
28
- @encryption_info = ms_off_crypto.encryption_info
29
- @encrypted_package = ms_off_crypto.encrypted_package
30
- @storages << Storage.new('R', :type=>Storage::TYPES[:root], :color=>Storage::COLORS[:red], :child=>1, :modified=>129685612742510730)
31
- @storages.last.name_size = 2
32
- @storages << Storage.new('EncryptionInfo', :data=>@encryption_info, :left=>3, :size => @encryption_info.size) # example shows right child. do we need the summary info????
33
- @storages << Storage.new('EncryptedPackage', :data=>@encrypted_package, :color=>Storage::COLORS[:red], :size=>@encrypted_package.size)
34
- @storages << Storage.new([6].pack("c")+"DataSpaces", :child=>5, :modified =>129685612740945580, :created=>129685612740819979)
35
- @storages << version
36
- @storages << data_space_map
37
- @storages << Storage.new('DataSpaceInfo', :right=>8, :child=>7, :created=>129685612740828880,:modified=>129685612740831800)
38
- @storages << strong_encryption_data_space
39
- @storages << Storage.new('TransformInfo', :color => Storage::COLORS[:red], :child=>9, :created=>129685612740834130, :modified=>129685612740943959)
40
- @storages << Storage.new('StrongEncryptionTransform', :child=>10, :created=>129685612740834169, :modified=>129685612740942280)
41
- @storages << primary
42
- mini_fat_stream
43
- mini_fat
44
- fat
45
- header
46
- end
47
-
48
- def version
49
- @version ||= create_version
50
- end
51
-
52
- def data_space_map
53
- @data_space_map ||= create_data_space_map
54
- end
55
-
56
- def strong_encryption_data_space
57
- @strong_encryption_data_space ||= create_strong_encryption_data_space
58
- end
59
-
60
- def primary
61
- @primary ||= create_primary
62
- end
63
-
64
-
65
- def create_primary
66
- v_stream = [88,1,76,"{FF9A3F03-56EF-4613-BDD5-5A41C1D07246}".bytes.to_a].flatten
67
- v_stream.concat [78, "Microsoft.Container.EncryptionTransform".bytes.to_a,1,1,1,4].flatten
68
- v_stream = v_stream.pack PRIMARY_PACKING
69
- Storage.new([6].pack("c")+"Primary", :data=>v_stream, :size=>v_stream.size)
70
- end
71
-
72
- def create_strong_encryption_data_space
73
- v_stream = [8,1,50,"StrongEncryptionTransform".bytes.to_a].flatten.pack STRONG_ENCRYPTION_DATA_SPACE_PACKING
74
- Storage.new("StrongEncryptionDataSpace", :data=>v_stream, :size => v_stream.size)
75
- end
76
-
77
- # Create the version storage
78
- def create_version
79
- v_stream= [60, "Microsoft.Container.DataSpaces".bytes.to_a, 1, 1, 1].flatten!.pack VERSION_PACKING
80
- Storage.new('Version', :data=>v_stream, :size=>v_stream.size)
81
- end
82
-
83
- def create_data_space_map
84
- v_stream = [8,1,104, 1,0, 32, "EncryptedPackage".bytes.to_a, 50, "StrongEncryptionDataSpace".bytes.to_a].flatten!.pack DATA_SPACE_MAP_PACKING
85
- Storage.new('DataSpaceMap', :data=>v_stream, :left => 4, :right => 6, :size=>v_stream.size)
86
- end
87
-
88
- def allocate_stream(table, stream, size)
89
- stream.sector = table.size if stream.respond_to?(:sector)
90
- ((stream.size / size.to_f).ceil).times { table << table.size }
91
- table[table.size-1] = -2
92
- end
93
-
94
- def fat_stream
95
- @fat_stream ||= create_fat_stream
96
- end
97
- def create_fat_stream
98
- mfs = []
99
- @storages.select{ |s| s.type == Storage::TYPES[:stream] && s.size >= MINI_CUTOFF}.each_with_index do |stream, index|
100
- mfs.concat stream.data
101
- mfs.concat Array.new(512 - (mfs.size % 512), 0) if mfs.size % 512
102
- end
103
- mfs.pack 'c*'
104
- end
105
-
106
- def mini_fat_stream
107
- @mini_fat_stream ||= create_mini_fat_stream
108
- end
109
-
110
- def create_mini_fat_stream
111
- mfs = []
112
- @storages.select{ |s| s.type == Storage::TYPES[:stream] && s.size < MINI_CUTOFF}.each_with_index do |stream, index|
113
- mfs.concat stream.data
114
- mfs.concat Array.new(64 - (mfs.size % 64), 0) if mfs.size % 64
115
- end
116
- @storages[0].size = mfs.size
117
- mfs.concat(Array.new(512 - (mfs.size % 512), 0))
118
- mfs.pack 'c*'
119
- end
120
-
121
- def mini_fat
122
- @mini_fat ||= create_mini_fat
123
- end
124
-
125
- def create_mini_fat
126
- v_mf = []
127
- @storages.select{ |s| s.type == Storage::TYPES[:stream] && s.size < MINI_CUTOFF}.each do |stream|
128
- allocate_stream(v_mf, stream, 64)
129
- end
130
- v_mf.concat Array.new(128 - v_mf.size, -1)
131
- v_mf.pack 'l*'
132
- end
133
-
134
- def fat
135
- @fat ||= create_fat
136
- end
137
-
138
- def create_fat
139
- v_fat = [-3]
140
- # storages four per sector, allocation forces directories to start at sector ID 0
141
- allocate_stream(v_fat, @storages, 4)
142
- # fat entry for minifat
143
- allocate_stream(v_fat, 0, 512)
144
- # fat entry for minifat stream
145
- @storages[0].sector = v_fat.size
146
- allocate_stream(v_fat, mini_fat_stream, 512)
147
- # fat entries for encrypted package storage
148
- # what to do about DIFAT for larger packages...
149
- if @encrypted_package.size > (109 - v_fat.size) * 512
150
- raise ArgumentError, "Your package is too big!"
151
- end
152
-
153
- if @encrypted_package.size >= MINI_CUTOFF
154
- allocate_stream(v_fat, @encrypted_package, 512)
155
- end
156
-
157
- v_fat.concat Array.new(128 - v_fat.size, -1) if v_fat.size < 128 #pack in unused sectors
158
- v_fat.pack 'l*'
159
- end
160
-
161
- def header
162
- @header ||= create_header
163
- end
164
-
165
- # The serialization for CBF header
166
- HEADER_PACKING = "q x16 l s3 x10 l l x4 l*"
167
-
168
- def create_header
169
- header = []
170
- header << -2226271756974174256 # identifier pack as q
171
- header << 196670 # version pack as L
172
- header << 65534 # byte order pack as s
173
- header << 9 # sector shift
174
- header << 6 # mini-sector shift
175
- header << (fat.size/512.0).ceil # this is the number of FAT sectors in the file at index 6 pack as L
176
- header << header.last # this is the first directory sector, index of 7 pack as L
177
- header << MINI_CUTOFF # minfat cutoff pack as L
178
- # MiniFat starts after directories
179
- header << (fat.size/512.0).ceil + (@storages.size/4.0).ceil # this is the sector id for the first minifat index 10 pack as L
180
- header << (mini_fat.size/512.0).ceil # minifat sector count index 11 pack as L
181
- header << -2 # the first DIFAT - set to end of chain until we exceed a single FAT pack as L
182
- header << 0 # number of DIFAT sectors, unless we go beyond 109 FAT sectors this will always be 0 pack as L
183
- header << 0 # first FAT sector defined in the DIFAT pack as L
184
- header.concat Array.new(108, -1) # Difat sectors pack as L108
185
- end
186
-
187
- def save
188
-
189
- ole = File.open(@file_name, 'w')
190
- ole << header.pack(HEADER_PACKING)
191
- ole << fat
192
- @storages.each { |s| ole << s.to_s }
193
- ole << Array.new((512-(ole.pos % 512)), 0).pack('c*')
194
- ole << mini_fat
195
- ole << mini_fat_stream
196
- ole << fat_stream
197
- ole.close
198
- end
199
-
200
- end
201
- end
File without changes
@@ -1,189 +0,0 @@
1
- # encoding: UTF-8
2
- require 'digest'
3
- require 'base64'
4
- require 'openssl'
5
-
6
- module Axlsx
7
-
8
- # The MsOffCrypto class implements ECMA-367 encryption based on the MS-OFF-CRYPTO specification
9
- class MsOffCrypto
10
-
11
- # Creates a new MsOffCrypto Object
12
- # @param [String] file_name the location of the file you want to encrypt
13
- # @param [String] pwd the password to use when encrypting the file
14
- def initialize(file_name, pwd)
15
- self.password = pwd
16
- self.file_name = file_name
17
- end
18
-
19
- # Generates a new CBF file based on this instance of ms-off-crypto and overwrites the unencrypted file.
20
- def save
21
- cfb = Cbf.new(self)
22
- cfb.save
23
- end
24
-
25
- # returns the raw password used in encryption
26
- # @return [String]
27
- attr_reader :password
28
-
29
- # sets the password to be used for encryption
30
- # @param [String] v the password, @default 'password'
31
- # @return [String]
32
- def password=(v)
33
- @password = v || 'password'
34
- end
35
-
36
- # retruns the file name of the archive to be encrypted
37
- # @return [String]
38
- attr_reader :file_name
39
-
40
- # sets the filename
41
- # @return [String]
42
- def file_name=(v)
43
- #TODO verfify that the file specified exists and is an unencrypted xlsx archive
44
- @file_name = v
45
- end
46
-
47
-
48
- # encrypts and returns the package specified by the file name
49
- # @return [String]
50
- def encrypted_package
51
- @encrypted_package ||= encrypt_package(file_name)
52
- end
53
-
54
- # returns the encryption info for this instance of ms-off-crypto
55
- # @return [String]
56
- def encryption_info
57
- @encryption_info ||= create_encryption_info
58
- end
59
-
60
- # returns a random salt
61
- # @return [String]
62
- def salt
63
- @salt ||= Digest::SHA1.digest(rand(16**16).to_s)
64
- end
65
-
66
- # returns a random verifier
67
- # @return [String]
68
- def verifier
69
- @verifier ||= rand(16**16).to_s
70
- end
71
-
72
- # returns the verifier encrytped
73
- # @return [String]
74
- def encrypted_verifier
75
- @encrypted_verifier ||= encrypt(verifier)
76
- end
77
-
78
- # returns the verifier hash encrypted
79
- # @return [String]
80
- def encrypted_verifier_hash
81
- @encrypted_verifier_hash ||= encrypt(verifier_hash)
82
- end
83
-
84
- # returns a verifier hash
85
- # @return [String]
86
- def verifier_hash
87
- @verifier_hash ||= create_verifier_hash
88
- end
89
-
90
- # returns an encryption key
91
- # @return [String]
92
- def key
93
- @key ||= create_key
94
- end
95
-
96
- # size of unencrypted package? concated with encrypted package
97
- def encrypt_package(file_name)
98
- package = File.open(file_name, 'r')
99
- crypt_pack = encrypt(package.read)
100
- [crypt_pack.size].pack('q') + crypt_pack
101
- end
102
-
103
- # Generates an encryption info structure
104
- # @return [String]
105
- def create_encryption_info
106
- header = [3, 0, 2, 0] # version
107
- # Header flags copy
108
- header.concat [0x24, 0, 0, 0] #flags -- VERY UNSURE ABOUT THIS STILL
109
- # header.concat [0, 0, 0, 0] #unused
110
- header.concat [0xA4, 0, 0, 0] #length
111
- # Header
112
- header.concat [0x24, 0, 0, 0] #flags again
113
- # header.concat [0, 0, 0, 0] #unused again,
114
- header.concat [0x0E, 0x66, 0, 0] #alg id
115
- header.concat [0x04, 0x80, 0, 0] #alg hash id
116
- header.concat [key.size, 0, 0, 0] #key size
117
- header.concat [0x18, 0, 0, 0] #provider type
118
- # header.concat [0, 0, 0, 0] #reserved 1
119
- # header.concat [0, 0, 0, 0] #reserved 2
120
- header.concat [0xA0, 0xC7, 0xDC, 0x2, 0, 0, 0, 0]
121
- header.concat "Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)".bytes.to_a.pack('s*').bytes.to_a
122
- header.concat [0, 0] #null terminator
123
-
124
- #Salt Size
125
- header.concat [salt.bytes.to_a.size].pack('l').bytes.to_a
126
- #Salt
127
- header.concat salt.bytes.to_a.pack('c*').bytes.to_a
128
- # encryption verifier
129
- header.concat encrypted_verifier.bytes.to_a.pack('c*').bytes.to_a
130
-
131
- # verifier hash size -- MUST BE 32 bytes
132
- header.concat [verifier_hash.bytes.to_a.size].pack('l').bytes.to_a
133
-
134
- #encryption verifier hash
135
- header.concat encrypted_verifier_hash.bytes.to_a.pack('c*').bytes.to_a
136
-
137
- header.flatten!
138
- header.pack('c*')
139
- end
140
-
141
- # 2.3.3
142
- def create_verifier_hash
143
- vh = Digest::SHA1.digest(verifier)
144
- vh << Array.new(32 - vh.size, 0).join('')
145
- end
146
-
147
- # 2.3.4.7 ECMA-376 Document Encryption Key Generation (Standard Encryption)
148
- def create_key
149
- sha = Digest::SHA1.new() << (salt + @password)
150
- (0..49999).each { |i| sha.update(i.to_s+sha.to_s) }
151
- key = sha.update(sha.to_s+'0').digest
152
- a = key.bytes.each_with_index.map { |item, i| 0x36 ^ item }
153
- x1 = Digest::SHA1.digest((a.concat Array.new(64 - key.size, 0x36)).to_s)
154
- a = key.bytes.each_with_index.map { |item, i| 0x5C ^ item }
155
- x2 = Digest::SHA1.digest( (a.concat Array.new(64 - key.size, 0x5C) ).to_s)
156
- x3 = x1 + x2
157
- x3.bytes.to_a[(0..31)].pack('c*')
158
- end
159
-
160
- # ensures that the a hashed decryption of the encryption verifier matches the decrypted verifier hash.
161
- # @return [Boolean]
162
- def verify_password
163
- v = Digest::SHA1.digest decrypt(@encrypted_verifier)
164
- vh = decrypt(@encrypted_verifier_hash)
165
- vh[0..15] == v[0..15]
166
- end
167
-
168
- # encrypts the data proved
169
- # @param [String] data
170
- # @return [String] the encrypted data
171
- def encrypt(data)
172
- aes = OpenSSL::Cipher.new("AES-128-ECB")
173
- aes.encrypt
174
- aes.key = key
175
- aes.update(data) << aes.final
176
- end
177
-
178
- # dencrypts the data proved
179
- # @param [String] data
180
- # @return [String] the dencrypted data
181
- def decrypt(data)
182
- aes = OpenSSL::Cipher.new("AES-128-ECB")
183
- aes.decrypt
184
- aes.key = key
185
- aes.update(data) << aes.final
186
- end
187
-
188
- end
189
- end
@@ -1,3 +0,0 @@
1
- module Axlsx
2
- class MsOffcrypto
3
- end
File without changes
@@ -1,6 +0,0 @@
1
- module Axlsx
2
- # THe Parser class unzips an xlsx spread sheet and populates a new axlsx package from it.
3
- class Parser
4
-
5
- end
6
- end
File without changes
@@ -1,69 +0,0 @@
1
- # encoding: UTF--8
2
- module Axlsx
3
-
4
- # The Shared String Table class is responsible for managing and serializing common strings in a workbook.
5
- # While the ECMA-376 spec allows for both inline and shared strings it seems that at least some applications like Numbers (Mac)
6
- # and Google Docs require that the shared string table is populated in order to interoperate properly.
7
- # As a developer, you should never need to directly work against this class. Simply set 'use_shared_strings'
8
- # on the package or workbook to generate a package that uses the shared strings table instead of inline strings.
9
- # @note Serialization performance is affected by using this serialization method so if you do not need interoperability
10
- # it is recomended that you use the default inline string method of serialization.
11
- class SharedStringsTable
12
-
13
- # The total number of strings in the workbook including duplicates
14
- # Empty cells are treated as blank strings
15
- # @return [Integer]
16
- attr_reader :count
17
-
18
- # The total number of unique strings in the workbook.
19
- # @return [Integer]
20
- def unique_count
21
- @unique_cells.size
22
- end
23
-
24
- # An array of unique cells. Multiple attributes of the cell are used in comparison
25
- # each of these unique cells is parsed into the shared string table.
26
- # @see Cell#sharable
27
- attr_reader :unique_cells
28
-
29
- # Creates a new Shared Strings Table agains an array of cells
30
- # @param [Array] cells This is an array of all of the cells in the workbook
31
- def initialize(cells)
32
- cells = cells.reject { |c| c.type != :string }
33
- @count = cells.size
34
- @unique_cells = []
35
- resolve cells
36
- end
37
-
38
- # Interate over all of the cells in the array.
39
- # if our unique cells array does not contain a sharable cell,
40
- # add the cell to our unique cells array and set the ssti attribute on the index of this cell in the shared strings table
41
- # if a sharable cell already exists in our unique_cells array, set the ssti attribute of the cell and move on.
42
- # @return [Array] unique cells
43
- def resolve(cells)
44
- cells.each do |cell|
45
- index = @unique_cells.index { |item| item.sharable(cell) }
46
- if index == nil
47
- cell.ssti = @unique_cells.size
48
- @unique_cells << cell
49
- else
50
- cell.ssti = index
51
- end
52
- end
53
- end
54
-
55
- # Generate the xml document for the Shared Strings Table
56
- # @return [String]
57
- def to_xml
58
- builder = Nokogiri::XML::Builder.new(:encoding => ENCODING) do |xml|
59
- xml.sst(:xmlns => Axlsx::XML_NS, :count => count, :uniqueCount => unique_count) {
60
- @unique_cells.each do |cell|
61
- xml.si { xml.t cell.value.to_s }
62
- end
63
- }
64
- end
65
- builder.to_xml(:save_with => 0)
66
- end
67
- end
68
-
69
- end