axlsx 1.0.15 → 1.1.1

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 (184) hide show
  1. data/.yardopts +1 -0
  2. data/CHANGELOG.md +58 -2
  3. data/README.md +425 -207
  4. data/Rakefile +6 -2
  5. data/examples/axlsx.xlsx +0 -0
  6. data/examples/example.csv +1000 -0
  7. data/examples/example.rb +266 -132
  8. data/examples/example.xlsx +0 -0
  9. data/examples/example_streamed.xlsx +0 -0
  10. data/examples/no-use_autowidth.xlsx +0 -0
  11. data/examples/real_example.rb +63 -0
  12. data/examples/sample.png +0 -0
  13. data/examples/shared_strings_example.xlsx +0 -0
  14. data/lib/axlsx/content_type/content_type.rb +13 -12
  15. data/lib/axlsx/content_type/default.rb +10 -6
  16. data/lib/axlsx/content_type/override.rb +13 -8
  17. data/lib/axlsx/doc_props/app.rb +38 -41
  18. data/lib/axlsx/doc_props/core.rb +13 -17
  19. data/lib/axlsx/drawing/axis.rb +39 -19
  20. data/lib/axlsx/drawing/bar_3D_chart.rb +34 -32
  21. data/lib/axlsx/drawing/bar_series.rb +14 -14
  22. data/lib/axlsx/drawing/cat_axis.rb +16 -14
  23. data/lib/axlsx/drawing/cat_axis_data.rb +17 -18
  24. data/lib/axlsx/drawing/chart.rb +40 -41
  25. data/lib/axlsx/drawing/drawing.rb +27 -12
  26. data/lib/axlsx/drawing/graphic_frame.rb +22 -21
  27. data/lib/axlsx/drawing/hlink_click.rb~ +0 -0
  28. data/lib/axlsx/drawing/hyperlink.rb +96 -0
  29. data/lib/axlsx/drawing/hyperlink.rb~ +64 -0
  30. data/lib/axlsx/drawing/line_3D_chart.rb +31 -28
  31. data/lib/axlsx/drawing/line_series.rb +12 -11
  32. data/lib/axlsx/drawing/marker.rb +11 -8
  33. data/lib/axlsx/drawing/named_axis_data.rb +36 -0
  34. data/lib/axlsx/drawing/one_cell_anchor.rb +18 -16
  35. data/lib/axlsx/drawing/pic.rb +47 -33
  36. data/lib/axlsx/drawing/picture_locking.rb +22 -18
  37. data/lib/axlsx/drawing/pie_3D_chart.rb +11 -8
  38. data/lib/axlsx/drawing/pie_series.rb +16 -12
  39. data/lib/axlsx/drawing/scaling.rb +11 -10
  40. data/lib/axlsx/drawing/scatter_chart.rb +69 -0
  41. data/lib/axlsx/drawing/scatter_series.rb +39 -0
  42. data/lib/axlsx/drawing/ser_axis.rb +11 -10
  43. data/lib/axlsx/drawing/series.rb +16 -15
  44. data/lib/axlsx/drawing/series_title.rb +15 -14
  45. data/lib/axlsx/drawing/title.rb +27 -26
  46. data/lib/axlsx/drawing/two_cell_anchor.rb +19 -20
  47. data/lib/axlsx/drawing/val_axis.rb +9 -7
  48. data/lib/axlsx/drawing/val_axis_data.rb +18 -17
  49. data/lib/axlsx/drawing/view_3D.rb +23 -20
  50. data/lib/axlsx/package.rb +117 -52
  51. data/lib/axlsx/rels/relationship.rb +27 -8
  52. data/lib/axlsx/rels/relationships.rb +9 -2
  53. data/lib/axlsx/stylesheet/border.rb +28 -23
  54. data/lib/axlsx/stylesheet/border_pr.rb +17 -15
  55. data/lib/axlsx/stylesheet/cell_alignment.rb +24 -21
  56. data/lib/axlsx/stylesheet/cell_protection.rb +11 -7
  57. data/lib/axlsx/stylesheet/cell_style.rb +9 -5
  58. data/lib/axlsx/stylesheet/color.rb +20 -14
  59. data/lib/axlsx/stylesheet/fill.rb +8 -5
  60. data/lib/axlsx/stylesheet/font.rb +22 -14
  61. data/lib/axlsx/stylesheet/gradient_fill.rb +20 -17
  62. data/lib/axlsx/stylesheet/gradient_stop.rb +10 -6
  63. data/lib/axlsx/stylesheet/num_fmt.rb +13 -6
  64. data/lib/axlsx/stylesheet/pattern_fill.rb +26 -10
  65. data/lib/axlsx/stylesheet/styles.rb +55 -41
  66. data/lib/axlsx/stylesheet/table_style.rb +10 -4
  67. data/lib/axlsx/stylesheet/table_style_element.rb +11 -7
  68. data/lib/axlsx/stylesheet/table_styles.rb +12 -8
  69. data/lib/axlsx/stylesheet/xf.rb +30 -25
  70. data/lib/axlsx/util/cbf.rb +69 -33
  71. data/lib/axlsx/util/constants.rb +39 -20
  72. data/lib/axlsx/util/doc/_index.html +84 -0
  73. data/lib/axlsx/util/doc/class_list.html +47 -0
  74. data/lib/axlsx/util/doc/css/common.css +1 -0
  75. data/lib/axlsx/util/doc/css/full_list.css +55 -0
  76. data/lib/axlsx/util/doc/css/style.css +322 -0
  77. data/lib/axlsx/util/doc/file_list.html +46 -0
  78. data/lib/axlsx/util/doc/frames.html +13 -0
  79. data/lib/axlsx/util/doc/index.html +84 -0
  80. data/lib/axlsx/util/doc/js/app.js +205 -0
  81. data/lib/axlsx/util/doc/js/full_list.js +173 -0
  82. data/lib/axlsx/util/doc/js/jquery.js +16 -0
  83. data/lib/axlsx/util/doc/method_list.html +46 -0
  84. data/lib/axlsx/util/doc/top-level-namespace.html +95 -0
  85. data/lib/axlsx/util/font_tables.rb~ +0 -0
  86. data/lib/axlsx/util/ms_off_crypto.rb +10 -10
  87. data/lib/axlsx/util/parser.rb +1 -0
  88. data/lib/axlsx/util/simple_typed_list.rb +20 -10
  89. data/lib/axlsx/util/storage.rb +1 -1
  90. data/lib/axlsx/util/validators.rb +23 -7
  91. data/lib/axlsx/version.rb +5 -2
  92. data/lib/axlsx/workbook/shared_strings_table.rb +68 -0
  93. data/lib/axlsx/workbook/shared_strings_table.rb~ +69 -0
  94. data/lib/axlsx/workbook/workbook.rb +82 -26
  95. data/lib/axlsx/workbook/worksheet/cell.rb +166 -130
  96. data/lib/axlsx/workbook/worksheet/col.rb +114 -0
  97. data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
  98. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +29 -0
  99. data/lib/axlsx/workbook/worksheet/page_margins.rb +97 -0
  100. data/lib/axlsx/workbook/worksheet/row.rb +53 -21
  101. data/lib/axlsx/workbook/worksheet/shared_strings_table.rb~ +0 -0
  102. data/lib/axlsx/workbook/worksheet/table.rb +96 -0
  103. data/lib/axlsx/workbook/worksheet/table.rb~ +97 -0
  104. data/lib/axlsx/workbook/worksheet/worksheet.rb +275 -124
  105. data/lib/axlsx.rb +41 -14
  106. data/lib/schema/dc.xsd +5 -5
  107. data/lib/schema/dcmitype.xsd +5 -3
  108. data/lib/schema/dcterms.xsd +15 -15
  109. data/lib/schema/opc-coreProperties.xsd +6 -2
  110. data/lib/schema/xml.xsd +7 -8
  111. data/test/benchmark.rb +73 -0
  112. data/test/content_type/tc_content_type.rb +31 -31
  113. data/test/content_type/tc_default.rb +9 -22
  114. data/test/content_type/tc_override.rb +8 -21
  115. data/test/doc_props/tc_app.rb +2 -8
  116. data/test/doc_props/tc_core.rb +6 -7
  117. data/test/drawing/tc_axis.rb +7 -3
  118. data/test/drawing/tc_bar_3D_chart.rb +6 -7
  119. data/test/drawing/tc_bar_series.rb +4 -5
  120. data/test/drawing/tc_cat_axis.rb +2 -3
  121. data/test/drawing/tc_cat_axis_data.rb +2 -3
  122. data/test/drawing/tc_chart.rb +13 -14
  123. data/test/drawing/tc_drawing.rb +7 -8
  124. data/test/drawing/tc_graphic_frame.rb +3 -4
  125. data/test/drawing/tc_hyperlink.rb +69 -0
  126. data/test/drawing/tc_line_3d_chart.rb +5 -6
  127. data/test/drawing/tc_line_series.rb +3 -4
  128. data/test/drawing/tc_marker.rb +3 -4
  129. data/test/drawing/tc_one_cell_anchor.rb +6 -7
  130. data/test/drawing/tc_pic.rb +13 -8
  131. data/test/drawing/tc_picture_locking.rb +2 -3
  132. data/test/drawing/tc_pie_3D_chart.rb +5 -6
  133. data/test/drawing/tc_pie_series.rb +4 -5
  134. data/test/drawing/tc_scaling.rb +3 -4
  135. data/test/drawing/tc_scatter_chart.rb +43 -0
  136. data/test/drawing/tc_scatter_series.rb +20 -0
  137. data/test/drawing/tc_ser_axis.rb +2 -3
  138. data/test/drawing/tc_series.rb +4 -5
  139. data/test/drawing/tc_series_title.rb +4 -5
  140. data/test/drawing/tc_title.rb +4 -5
  141. data/test/drawing/tc_two_cell_anchor.rb +4 -5
  142. data/test/drawing/tc_val_axis.rb +2 -3
  143. data/test/drawing/tc_val_axis_data.rb +2 -3
  144. data/test/drawing/tc_view_3D.rb +6 -7
  145. data/test/profile.rb +34 -0
  146. data/test/rels/tc_relationship.rb +10 -6
  147. data/test/rels/tc_relationships.rb +4 -5
  148. data/test/stylesheet/tc_border.rb +3 -4
  149. data/test/stylesheet/tc_border_pr.rb +3 -4
  150. data/test/stylesheet/tc_cell_alignment.rb +10 -6
  151. data/test/stylesheet/tc_cell_protection.rb +2 -3
  152. data/test/stylesheet/tc_cell_style.rb +2 -3
  153. data/test/stylesheet/tc_color.rb +2 -3
  154. data/test/stylesheet/tc_fill.rb +1 -2
  155. data/test/stylesheet/tc_font.rb +12 -5
  156. data/test/stylesheet/tc_gradient_fill.rb +1 -2
  157. data/test/stylesheet/tc_gradient_stop.rb +1 -2
  158. data/test/stylesheet/tc_num_fmt.rb +1 -2
  159. data/test/stylesheet/tc_pattern_fill.rb +3 -4
  160. data/test/stylesheet/tc_styles.rb +31 -6
  161. data/test/stylesheet/tc_table_style.rb +2 -3
  162. data/test/stylesheet/tc_table_style_element.rb +2 -3
  163. data/test/stylesheet/tc_table_styles.rb +3 -4
  164. data/test/stylesheet/tc_xf.rb +16 -17
  165. data/test/tc_axlsx.rb +39 -0
  166. data/test/tc_helper.rb +3 -0
  167. data/test/tc_package.rb +43 -9
  168. data/test/util/tc_simple_typed_list.rb +8 -9
  169. data/test/util/tc_validators.rb +7 -8
  170. data/test/workbook/tc_shared_strings_table.rb +38 -0
  171. data/test/workbook/tc_workbook.rb +32 -6
  172. data/test/workbook/worksheet/table/tc_table.rb +71 -0
  173. data/test/workbook/worksheet/table/tc_table.rb~ +72 -0
  174. data/test/workbook/worksheet/tc_cell.rb +80 -13
  175. data/test/workbook/worksheet/tc_col.rb +59 -0
  176. data/test/workbook/worksheet/tc_col.rb~ +10 -0
  177. data/test/workbook/worksheet/tc_date_time_converter.rb +132 -0
  178. data/test/workbook/worksheet/tc_page_margins.rb +97 -0
  179. data/test/workbook/worksheet/tc_row.rb +54 -4
  180. data/test/workbook/worksheet/tc_worksheet.rb +205 -31
  181. metadata +78 -84
  182. data/examples/example.rb~ +0 -112
  183. data/test/drawing/tc_line_series.tc~ +0 -34
  184. data/test/drawing/tc_picture_locking.rb~ +0 -77
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module Axlsx
2
3
 
3
4
  # 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.
@@ -10,13 +11,13 @@ module Axlsx
10
11
  VERSION_PACKING = 'l s30 l3'
11
12
 
12
13
  # The serialization for the MS-OFF-CRYPTO dataspace map stream
13
- DATA_SPACE_MAP_PACKING = 'l6 s16 l s25'
14
+ DATA_SPACE_MAP_PACKING = 'l6 s16 l s25 x2'
14
15
 
15
16
  # The serialization for the MS-OFF-CRYPTO strong encrytion data space stream
16
- STRONG_ENCRYPTION_DATA_SPACE_PACKING = 'l3 s25'
17
+ STRONG_ENCRYPTION_DATA_SPACE_PACKING = 'l3 s26'
17
18
 
18
19
  # The serialization for the MS-OFF-CRYPTO primary stream
19
- PRIMARY_PACKING = 'l3 s38 l s39 l3 x12 l x2'
20
+ PRIMARY_PACKING = 'l3 s38 l s40 l3 x12 l'
20
21
 
21
22
  # The cutoff size that determines if a stream should be in the mini-fat or the fat
22
23
  MINI_CUTOFF = 4096
@@ -28,6 +29,7 @@ module Axlsx
28
29
  # @param [MsOffCrypto] ms_off_crypto
29
30
  def initialize(ms_off_crypto)
30
31
  @file_name = ms_off_crypto.file_name
32
+ @ms_off_crypto = ms_off_crypto
31
33
  create_storages
32
34
  mini_fat_stream
33
35
  mini_fat
@@ -95,6 +97,17 @@ module Axlsx
95
97
  @header ||= create_header
96
98
  end
97
99
 
100
+ # returns the encryption info from the ms_off_crypt object provided during intialization
101
+ # @return [String] encryption info
102
+ def encryption_info
103
+ @ms_off_crypto.encryption_info
104
+ end
105
+
106
+ # returns the encrypted package from the ms_off_crypt object provided during initalization
107
+ # @return [String] encrypted package
108
+ def encrypted_package
109
+ @ms_off_crypto.encrypted_package
110
+ end
98
111
 
99
112
  # writes the compound binary file to disk
100
113
  def save
@@ -114,12 +127,11 @@ module Axlsx
114
127
  # Generates the storages required for ms-office-cryptography cfb
115
128
  def create_storages
116
129
  @storages = []
117
- @encryption_info = ms_off_crypto.encryption_info
118
- @encrypted_package = ms_off_crypto.encrypted_package
119
- @storages << Storage.new('R', :type=>Storage::TYPES[:root], :color=>Storage::COLORS[:red], :child=>1, :modified=>129685612742510730)
120
- @storages.last.name_size = 2
121
- @storages << Storage.new('EncryptionInfo', :data=>@encryption_info, :left=>3, :size => @encryption_info.size) # example shows right child. do we need the summary info????
122
- @storages << Storage.new('EncryptedPackage', :data=>@encrypted_package, :color=>Storage::COLORS[:red], :size=>@encrypted_package.size)
130
+ @encryption_info = @ms_off_crypto.encryption_info
131
+ @encrypted_package = @ms_off_crypto.encrypted_package
132
+
133
+ @storages << Storage.new('EncryptionInfo', :data=>encryption_info, :left=>3, :right=>11) # example shows right child. do we need the summary info????
134
+ @storages << Storage.new('EncryptedPackage', :data=>encrypted_package, :color=>Storage::COLORS[:red])
123
135
  @storages << Storage.new([6].pack("c")+"DataSpaces", :child=>5, :modified =>129685612740945580, :created=>129685612740819979)
124
136
  @storages << version
125
137
  @storages << data_space_map
@@ -128,6 +140,12 @@ module Axlsx
128
140
  @storages << Storage.new('TransformInfo', :color => Storage::COLORS[:red], :child=>9, :created=>129685612740834130, :modified=>129685612740943959)
129
141
  @storages << Storage.new('StrongEncryptionTransform', :child=>10, :created=>129685612740834169, :modified=>129685612740942280)
130
142
  @storages << primary
143
+ # @storages << summary_information
144
+ # @storages << document_summary_information
145
+
146
+ # we do this at the end as we need to build the minifat stream to determine the size. #HOWEVER - it looks like the size should not include the padding?
147
+ @storages.unshift Storage.new('Root Entry', :type=>Storage::TYPES[:root], :color=>Storage::COLORS[:red], :child=>1, :data => mini_fat_stream)
148
+
131
149
  end
132
150
 
133
151
  # generates the mini fat stream
@@ -135,10 +153,11 @@ module Axlsx
135
153
  def create_mini_fat_stream
136
154
  mfs = []
137
155
  @storages.select{ |s| s.type == Storage::TYPES[:stream] && s.size < MINI_CUTOFF}.each_with_index do |stream, index|
156
+ puts "#{stream.name.pack('c*')}: #{stream.data.size}"
138
157
  mfs.concat stream.data
139
- mfs.concat Array.new(64 - (mfs.size % 64), 0) if mfs.size % 64
158
+ mfs.concat Array.new(64 - (mfs.size % 64), 0) if mfs.size % 64 > 0
159
+ puts "mini fat stream size: #{mfs.size}"
140
160
  end
141
- @storages[0].size = mfs.size
142
161
  mfs.concat(Array.new(512 - (mfs.size % 512), 0))
143
162
  mfs.pack 'c*'
144
163
  end
@@ -149,7 +168,7 @@ module Axlsx
149
168
  mfs = []
150
169
  @storages.select{ |s| s.type == Storage::TYPES[:stream] && s.size >= MINI_CUTOFF}.each_with_index do |stream, index|
151
170
  mfs.concat stream.data
152
- mfs.concat Array.new(512 - (mfs.size % 512), 0) if mfs.size % 512
171
+ mfs.concat Array.new(512 - (mfs.size % 512), 0) if mfs.size % 512 > 0
153
172
  end
154
173
  mfs.pack 'c*'
155
174
  end
@@ -214,7 +233,7 @@ module Axlsx
214
233
  # creates the stron encryption data space storage
215
234
  # @return [Storgae]
216
235
  def create_strong_encryption_data_space
217
- v_stream = [8,1,50,"StrongEncryptionTransform".bytes.to_a].flatten.pack STRONG_ENCRYPTION_DATA_SPACE_PACKING
236
+ v_stream = [8,1,50,"StrongEncryptionTransform".bytes.to_a,0].flatten.pack STRONG_ENCRYPTION_DATA_SPACE_PACKING
218
237
  Storage.new("StrongEncryptionDataSpace", :data=>v_stream, :size => v_stream.size)
219
238
  end
220
239
 
@@ -222,41 +241,58 @@ module Axlsx
222
241
  # @return [Storgae]
223
242
  def create_primary
224
243
  v_stream = [88,1,76,"{FF9A3F03-56EF-4613-BDD5-5A41C1D07246}".bytes.to_a].flatten
225
- v_stream.concat [78, "Microsoft.Container.EncryptionTransform".bytes.to_a,1,1,1,4].flatten
244
+ v_stream.concat [78, "Microsoft.Container.EncryptionTransform".bytes.to_a,0,1,1,1,4].flatten
226
245
  v_stream = v_stream.pack PRIMARY_PACKING
227
246
  Storage.new([6].pack("c")+"Primary", :data=>v_stream)
228
247
  end
229
248
 
230
249
 
231
- SUMMARY_INFORMATION_PACKING = ""
232
250
  # creates the summary information storage
233
251
  # @return [Storage]
234
252
  def create_summary_information
235
- # FEFF 0000 030A 0100 0000 0000 0000 0000
236
- # 0000 0000 0000 0000 0100 0000 E085 9FF2
237
- # F94F 6810 AB91 0800 2B27 B3D9 3000 0000
238
- # AC00 0000 0700 0000 0100 0000 4000 0000
239
- # 0400 0000 4800 0000 0800 0000 5800 0000
240
- # 1200 0000 6800 0000 0C00 0000 8C00 0000
241
- # 0D00 0000 9800 0000 1300 0000 A400 0000
242
- # 0200 0000 E9FD 0000 1E00 0000 0800 0000
243
- # 7261 6E64 796D 0000 1E00 0000 0800 0000
244
- # 7261 6E64 796D 0000 1E00 0000 1C00 0000
245
- # 4D69 6372 6F73 6F66 7420 4D61 6369 6E74
246
- # 6F73 6820 4578 6365 6C00 0000 4000 0000
247
- # 10AC 5396 60BC CC01 4000 0000 40F4 FDAF
248
- # 60BC CC01 0300 0000 0100 0000
249
253
  v_stream = []
250
- v_stream = v_stream.pack SUMMARY_INFORMATION_PACKING
251
- Storage.new([5].pack('c')+"SummaryInformation", :data=>v_stream)
254
+ v_stream.concat [0xFEFF, 0x0000, 0x030A, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000]
255
+ v_stream.concat [0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0xE085, 0x9FF2]
256
+ v_stream.concat [0xF94F, 0x6810, 0xAB91, 0x0800, 0x2B27, 0xB3D9, 0x3000, 0x0000]
257
+ v_stream.concat [0xAC00, 0x0000, 0x0700, 0x0000, 0x0100, 0x0000, 0x4000, 0x0000]
258
+ v_stream.concat [0x0400, 0x0000, 0x4800, 0x0000, 0x0800, 0x0000, 0x5800, 0x0000]
259
+ v_stream.concat [0x1200, 0x0000, 0x6800, 0x0000, 0x0C00, 0x0000, 0x8C00, 0x0000]
260
+ v_stream.concat [0x0D00, 0x0000, 0x9800, 0x0000, 0x1300, 0x0000, 0xA400, 0x0000]
261
+ v_stream.concat [0x0200, 0x0000, 0xE9FD, 0x0000, 0x1E00, 0x0000, 0x0800, 0x0000]
262
+ v_stream.concat [0x7261, 0x6E64, 0x796D, 0x0000, 0x1E00, 0x0000, 0x0800, 0x0000]
263
+ v_stream.concat [0x7261, 0x6E64, 0x796D, 0x0000, 0x1E00, 0x0000, 0x1C00, 0x0000]
264
+ v_stream.concat [0x4D69, 0x6372, 0x6F73, 0x6F66, 0x7420, 0x4D61, 0x6369, 0x6E74]
265
+ v_stream.concat [0x6F73, 0x6820, 0x4578, 0x6365, 0x6C00, 0x0000, 0x4000, 0x0000]
266
+ v_stream.concat [0x10AC, 0x5396, 0x60BC, 0xCC01, 0x4000, 0x0000, 0x40F4, 0xFDAF]
267
+ v_stream.concat [0x60BC, 0xCC01, 0x0300, 0x0000, 0x0100, 0x0000]
268
+
269
+ v_stream = v_stream.pack "s*"
270
+
271
+ Storage.new([5].pack('c')+"SummaryInformation", :data=>v_stream, :left => 2)
252
272
  end
253
273
 
254
- DOCUMENT_SUMMARY_INFORMATION_PACKING = ""
274
+
255
275
  # creates the document summary information storage
256
276
  # @return [Storage]
257
277
  def create_document_summary_information
258
278
  v_stream = []
259
- v_stream = v_stream.pack DOCUMENT_SUMMARY_INFORMATION_PACKING
279
+ v_stream.concat [0xFEFF, 0x0000, 0x030A, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000]
280
+ v_stream.concat [0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x02D5, 0xCDD5]
281
+ v_stream.concat [0x9C2E, 0x1B10, 0x9397, 0x0800, 0x2B2C, 0xF9AE, 0x3000, 0x0000]
282
+ v_stream.concat [0xCC00, 0x0000, 0x0900, 0x0000, 0x0100, 0x0000, 0x5000, 0x0000]
283
+ v_stream.concat [0x0F00, 0x0000, 0x5800, 0x0000, 0x1700, 0x0000, 0x6400, 0x0000]
284
+ v_stream.concat [0x0B00, 0x0000, 0x6C00, 0x0000, 0x1000, 0x0000, 0x7400, 0x0000]
285
+ v_stream.concat [0x1300, 0x0000, 0x7C00, 0x0000, 0x1600, 0x0000, 0x8400, 0x0000]
286
+ v_stream.concat [0x0D00, 0x0000, 0x8C00, 0x0000, 0x0C00, 0x0000, 0x9F00, 0x0000]
287
+ v_stream.concat [0x0200, 0x0000, 0xE9FD, 0x0000, 0x1E00, 0x0000, 0x0400, 0x0000]
288
+ v_stream.concat [0x0000, 0x0000, 0x0300, 0x0000, 0x0000, 0x0C00, 0x0B00, 0x0000]
289
+ v_stream.concat [0x0000, 0x0000, 0x0B00, 0x0000, 0x0000, 0x0000, 0x0B00, 0x0000]
290
+ v_stream.concat [0x0000, 0x0000, 0x0B00, 0x0000, 0x0000, 0x0000, 0x1E10, 0x0000]
291
+ v_stream.concat [0x0100, 0x0000, 0x0700, 0x0000, 0x5368, 0x6565, 0x7431, 0x000C]
292
+ v_stream.concat [0x1000, 0x0002, 0x0000, 0x001E, 0x0000, 0x0013, 0x0000, 0x00E3]
293
+ v_stream.concat [0x83AF, 0xE383, 0xBCE3, 0x82AF, 0xE382, 0xB7E3, 0x83BC, 0xE383]
294
+ v_stream.concat [0x8800, 0x0300, 0x0000, 0x0100, 0x0000, 0x0000]
295
+ v_stream = v_stream.pack 'c*'
260
296
  Storage.new([5].pack('c')+"DocumentSummaryInformation", :data=>v_stream)
261
297
  end
262
298
 
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
  module Axlsx
2
3
 
3
4
  # XML Encoding
@@ -20,7 +21,7 @@ module Axlsx
20
21
 
21
22
  # dc elements (core) namespace
22
23
  CORE_NS_DC = "http://purl.org/dc/elements/1.1/"
23
-
24
+
24
25
  # dcmit (core) namespcace
25
26
  CORE_NS_DCMIT = "http://purl.org/dc/dcmitype/"
26
27
 
@@ -29,10 +30,10 @@ module Axlsx
29
30
 
30
31
  # xml schema namespace
31
32
  CORE_NS_XSI = "http://www.w3.org/2001/XMLSchema-instance"
32
-
33
+
33
34
  # spreadsheet drawing namespace
34
35
  XML_NS_XDR = "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
35
-
36
+
36
37
  # drawing namespace
37
38
  XML_NS_A = "http://schemas.openxmlformats.org/drawingml/2006/main"
38
39
 
@@ -42,13 +43,12 @@ module Axlsx
42
43
  # relationships namespace
43
44
  XML_NS_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships"
44
45
 
45
-
46
46
  # relationships name space
47
47
  RELS_R = "http://schemas.openxmlformats.org/package/2006/relationships"
48
48
 
49
49
  # table rels namespace
50
50
  TABLE_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/table"
51
-
51
+
52
52
  # workbook rels namespace
53
53
  WORKBOOK_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
54
54
 
@@ -64,6 +64,9 @@ module Axlsx
64
64
  # styles rels namespace
65
65
  STYLES_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"
66
66
 
67
+ # shared strings namespace
68
+ SHARED_STRINGS_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings"
69
+
67
70
  # drawing rels namespace
68
71
  DRAWING_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing"
69
72
 
@@ -73,7 +76,10 @@ module Axlsx
73
76
  # image rels namespace
74
77
  IMAGE_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"
75
78
 
76
- # table content type
79
+ # image rels namespace
80
+ HYPERLINK_R = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"
81
+
82
+ # table content type
77
83
  TABLE_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml"
78
84
 
79
85
  # workbook content type
@@ -83,14 +89,14 @@ module Axlsx
83
89
  APP_CT = "application/vnd.openxmlformats-officedocument.extended-properties+xml"
84
90
 
85
91
  # rels content type
86
- RELS_CT = "application/vnd.openxmlformats-package.relationships+xml"
92
+ RELS_CT = "application/vnd.openxmlformats-package.relationships+xml"
87
93
 
88
94
  # styles content type
89
95
  STYLES_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"
90
96
 
91
97
  # xml content type
92
98
  XML_CT = "application/xml"
93
-
99
+
94
100
  # worksheet content type
95
101
  WORKSHEET_CT = "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"
96
102
 
@@ -120,7 +126,7 @@ module Axlsx
120
126
 
121
127
  # jpeg extension
122
128
  JPEG_EX = "jpeg"
123
-
129
+
124
130
  # gif extension
125
131
  GIF_EX = "gif"
126
132
 
@@ -135,10 +141,13 @@ module Axlsx
135
141
 
136
142
  # styles part
137
143
  STYLES_PN = "styles.xml"
138
-
144
+
145
+ # shared_strings part
146
+ SHARED_STRINGS_PN = "sharedStrings.xml"
147
+
139
148
  # app part
140
149
  APP_PN = "docProps/app.xml"
141
-
150
+
142
151
  # core part
143
152
  CORE_PN = "docProps/core.xml"
144
153
 
@@ -163,32 +172,38 @@ module Axlsx
163
172
  # drawing rels part
164
173
  DRAWING_RELS_PN = "drawings/_rels/drawing%d.xml.rels"
165
174
 
175
+ # drawing part
176
+ TABLE_PN = "tables/table%d.xml"
177
+
166
178
  # chart part
167
179
  CHART_PN = "charts/chart%d.xml"
168
180
 
169
181
  # chart part
170
182
  IMAGE_PN = "media/image%d.%s"
171
183
 
184
+ # location of schema files for validation
185
+ SCHEMA_BASE = File.dirname(__FILE__)+'/../../schema/'
186
+
172
187
  # App validation schema
173
- APP_XSD = "lib/schema/shared-documentPropertiesExtended.xsd"
188
+ APP_XSD = SCHEMA_BASE + "shared-documentPropertiesExtended.xsd"
174
189
 
175
190
  # core validation schema
176
- CORE_XSD = "lib/schema/opc-coreProperties.xsd"
191
+ CORE_XSD = SCHEMA_BASE + "opc-coreProperties.xsd"
177
192
 
178
193
  # content types validation schema
179
- CONTENT_TYPES_XSD = "lib/schema/opc-contentTypes.xsd"
194
+ CONTENT_TYPES_XSD = SCHEMA_BASE + "opc-contentTypes.xsd"
180
195
 
181
196
  # rels validation schema
182
- RELS_XSD = "lib/schema/opc-relationships.xsd"
197
+ RELS_XSD = SCHEMA_BASE + "opc-relationships.xsd"
183
198
 
184
199
  # spreadsheetML validation schema
185
- SML_XSD = "lib/schema/sml.xsd"
186
-
200
+ SML_XSD = SCHEMA_BASE + "sml.xsd"
201
+
187
202
  # drawing validation schema
188
- DRAWING_XSD = "lib/schema/dml-spreadsheetDrawing.xsd"
203
+ DRAWING_XSD = SCHEMA_BASE + "dml-spreadsheetDrawing.xsd"
189
204
 
190
205
  # number format id for pecentage formatting using the default formatting id.
191
- NUM_FMT_PERCENT = 9
206
+ NUM_FMT_PERCENT = 9
192
207
 
193
208
  # number format id for date format like 2011/11/13
194
209
  NUM_FMT_YYYYMMDD = 100
@@ -203,7 +218,7 @@ module Axlsx
203
218
  STYLE_DATE = 2
204
219
 
205
220
  # error messages RestrictionValidor
206
- ERR_RESTRICTION = "Invalid Data: %s. %s must be one of %s."
221
+ ERR_RESTRICTION = "Invalid Data: %s. %s must be one of %s."
207
222
 
208
223
  # error message DataTypeValidator
209
224
  ERR_TYPE = "Invalid Data %s for %s. must be %s."
@@ -211,6 +226,10 @@ module Axlsx
211
226
  # error message for RegexValidator
212
227
  ERR_REGEX = "Invalid Data. %s does not match %s."
213
228
 
229
+ # error message for sheets that use a name which is longer than 31 bytes
230
+ ERR_SHEET_NAME_TOO_LONG = "Your worksheet name '%s' is too long. Worksheet names must be 31 characters (bytes) or less"
231
+
214
232
  # error message for duplicate sheet names
215
233
  ERR_DUPLICATE_SHEET_NAME = "There is already a worksheet in this workbook named '%s'. Please use a unique name"
234
+
216
235
  end
@@ -0,0 +1,84 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>
7
+ Documentation by YARD 0.7.5
8
+
9
+ </title>
10
+
11
+ <link rel="stylesheet" href="css/style.css" type="text/css" media="screen" charset="utf-8" />
12
+
13
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
14
+
15
+ <script type="text/javascript" charset="utf-8">
16
+ relpath = '';
17
+ if (relpath != '') relpath += '/';
18
+ </script>
19
+
20
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
21
+
22
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
23
+
24
+
25
+ </head>
26
+ <body>
27
+ <script type="text/javascript" charset="utf-8">
28
+ if (window.top.frames.main) document.body.className = 'frames';
29
+ </script>
30
+
31
+ <div id="header">
32
+ <div id="menu">
33
+
34
+
35
+ <span class="title"></span>
36
+
37
+
38
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
39
+ </div>
40
+
41
+ <div id="search">
42
+
43
+ <a id="class_list_link" href="#">Class List</a>
44
+
45
+ <a id="method_list_link" href="#">Method List</a>
46
+
47
+ <a id="file_list_link" href="#">File List</a>
48
+
49
+ </div>
50
+ <div class="clear"></div>
51
+ </div>
52
+
53
+ <iframe id="search_frame"></iframe>
54
+
55
+ <div id="content"><h1 class="noborder title">Documentation by YARD 0.7.5</h1>
56
+ <div id="listing">
57
+ <h1 class="alphaindex">Alphabetic Index</h1>
58
+
59
+ <div class="clear"></div>
60
+ <h2>Namespace Listing A-Z</h2>
61
+
62
+
63
+
64
+
65
+ <table>
66
+ <tr>
67
+ <td valign='top' width="33%">
68
+
69
+ </td>
70
+ </tr>
71
+ </table>
72
+
73
+ </div>
74
+
75
+ </div>
76
+
77
+ <div id="footer">
78
+ Generated on Wed Apr 18 20:10:42 2012 by
79
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
80
+ 0.7.5 (ruby-1.9.3).
81
+ </div>
82
+
83
+ </body>
84
+ </html>
@@ -0,0 +1,47 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html>
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+
7
+ <link rel="stylesheet" href="css/full_list.css" type="text/css" media="screen" charset="utf-8" />
8
+
9
+ <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" />
10
+
11
+
12
+
13
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
14
+
15
+ <script type="text/javascript" charset="utf-8" src="js/full_list.js"></script>
16
+
17
+
18
+ <base id="base_target" target="_parent" />
19
+ </head>
20
+ <body>
21
+ <script type="text/javascript" charset="utf-8">
22
+ if (window.top.frames.main) {
23
+ document.getElementById('base_target').target = 'main';
24
+ document.body.className = 'frames';
25
+ }
26
+ </script>
27
+ <div id="content">
28
+ <h1 id="full_list_header">Class List</h1>
29
+ <div id="nav">
30
+
31
+ <a target="_self" href="class_list.html">Classes</a>
32
+
33
+ <a target="_self" href="method_list.html">Methods</a>
34
+
35
+ <a target="_self" href="file_list.html">Files</a>
36
+
37
+ </div>
38
+ <div id="search">Search: <input type="text" /></div>
39
+
40
+ <ul id="full_list" class="class">
41
+ <li><span class='object_link'><a href="top-level-namespace.html" title=" (root)">Top Level Namespace</a></span></li>
42
+
43
+
44
+ </ul>
45
+ </div>
46
+ </body>
47
+ </html>
@@ -0,0 +1 @@
1
+ /* Override this file with custom rules */
@@ -0,0 +1,55 @@
1
+ body {
2
+ margin: 0;
3
+ font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
4
+ font-size: 13px;
5
+ height: 101%;
6
+ overflow-x: hidden;
7
+ }
8
+
9
+ h1 { padding: 12px 10px; padding-bottom: 0; margin: 0; font-size: 1.4em; }
10
+ .clear { clear: both; }
11
+ #search { position: absolute; right: 5px; top: 9px; padding-left: 24px; }
12
+ #content.insearch #search, #content.insearch #noresults { background: url(data:image/gif;base64,R0lGODlhEAAQAPYAAP///wAAAPr6+pKSkoiIiO7u7sjIyNjY2J6engAAAI6OjsbGxjIyMlJSUuzs7KamppSUlPLy8oKCghwcHLKysqSkpJqamvT09Pj4+KioqM7OzkRERAwMDGBgYN7e3ujo6Ly8vCoqKjY2NkZGRtTU1MTExDw8PE5OTj4+PkhISNDQ0MrKylpaWrS0tOrq6nBwcKysrLi4uLq6ul5eXlxcXGJiYoaGhuDg4H5+fvz8/KKiohgYGCwsLFZWVgQEBFBQUMzMzDg4OFhYWBoaGvDw8NbW1pycnOLi4ubm5kBAQKqqqiQkJCAgIK6urnJyckpKSjQ0NGpqatLS0sDAwCYmJnx8fEJCQlRUVAoKCggICLCwsOTk5ExMTPb29ra2tmZmZmhoaNzc3KCgoBISEiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCAAAACwAAAAAEAAQAAAHaIAAgoMgIiYlg4kACxIaACEJCSiKggYMCRselwkpghGJBJEcFgsjJyoAGBmfggcNEx0flBiKDhQFlIoCCA+5lAORFb4AJIihCRbDxQAFChAXw9HSqb60iREZ1omqrIPdJCTe0SWI09GBACH5BAkIAAAALAAAAAAQABAAAAdrgACCgwc0NTeDiYozCQkvOTo9GTmDKy8aFy+NOBA7CTswgywJDTIuEjYFIY0JNYMtKTEFiRU8Pjwygy4ws4owPyCKwsMAJSTEgiQlgsbIAMrO0dKDGMTViREZ14kYGRGK38nHguHEJcvTyIEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDAggPg4iJAAMJCRUAJRIqiRGCBI0WQEEJJkWDERkYAAUKEBc4Po1GiKKJHkJDNEeKig4URLS0ICImJZAkuQAhjSi/wQyNKcGDCyMnk8u5rYrTgqDVghgZlYjcACTA1sslvtHRgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCQARAtOUoQRGRiFD0kJUYWZhUhKT1OLhR8wBaaFBzQ1NwAlkIszCQkvsbOHL7Y4q4IuEjaqq0ZQD5+GEEsJTDCMmIUhtgk1lo6QFUwJVDKLiYJNUd6/hoEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4uen4ICCA+IkIsDCQkVACWmhwSpFqAABQoQF6ALTkWFnYMrVlhWvIKTlSAiJiVVPqlGhJkhqShHV1lCW4cMqSkAR1ofiwsjJyqGgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCSMhREZGIYYGY2ElYebi56fhyWQniSKAKKfpaCLFlAPhl0gXYNGEwkhGYREUywag1wJwSkHNDU3D0kJYIMZQwk8MjPBLx9eXwuETVEyAC/BOKsuEjYFhoEAIfkECQgAAAAsAAAAABAAEAAAB2eAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4ueICImip6CIQkJKJ4kigynKaqKCyMnKqSEK05StgAGQRxPYZaENqccFgIID4KXmQBhXFkzDgOnFYLNgltaSAAEpxa7BQoQF4aBACH5BAkIAAAALAAAAAAQABAAAAdogACCg4SFggJiPUqCJSWGgkZjCUwZACQkgxGEXAmdT4UYGZqCGWQ+IjKGGIUwPzGPhAc0NTewhDOdL7Ykji+dOLuOLhI2BbaFETICx4MlQitdqoUsCQ2vhKGjglNfU0SWmILaj43M5oEAOwAAAAAAAAAAAA==) no-repeat center left; }
13
+ #full_list { padding: 0; list-style: none; margin-left: 0; }
14
+ #full_list ul { padding: 0; }
15
+ #full_list li { padding: 5px; padding-left: 12px; margin: 0; font-size: 1.1em; list-style: none; }
16
+ #noresults { padding: 7px 12px; }
17
+ #content.insearch #noresults { margin-left: 7px; }
18
+ ul.collapsed ul, ul.collapsed li { display: none; }
19
+ ul.collapsed.search_uncollapsed { display: block; }
20
+ ul.collapsed.search_uncollapsed li { display: list-item; }
21
+ li a.toggle { cursor: default; position: relative; left: -5px; top: 4px; text-indent: -999px; width: 10px; height: 9px; margin-left: -10px; display: block; float: left; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAAVdEVYdENyZWF0aW9uIFRpbWUAMy8xNC8wOeNZPpQAAAE2SURBVDiNrZTBccIwEEXfelIAHUA6CZ24BGaWO+FuzZAK4k6gg5QAdGAq+Bxs2Yqx7BzyL7Llp/VfzZeQhCTc/ezuGzKKnKSzpCxXJM8fwNXda3df5RZETlIt6YUzSQDs93sl8w3wBZxCCE10GM1OcWbWjB2mWgEH4Mfdyxm3PSepBHibgQE2wLe7r4HjEidpnXMYdQPKEMJcsZ4zs2POYQOcaPfwMVOo58zsAdMt18BuoVDPxUJRacELbXv3hUIX2vYmOUvi8C8ydz/ThjXrqKqqLbDIAdsCKBd+Wo7GWa7o9qzOQHVVVXeAbs+yHHCH4aTsaCOQqunmUy1yBUAXkdMIfMlgF5EXLo2OpV/c/Up7jG4hhHcYLgWzAZXUc2b2ixsfvc/RmNNfOXD3Q/oeL9axJE1yT9IOoUu6MGUkAAAAAElFTkSuQmCC) no-repeat bottom left; }
22
+ li.collapsed a.toggle { opacity: 0.5; cursor: default; background-position: top left; }
23
+ li { color: #888; cursor: pointer; }
24
+ li.deprecated { text-decoration: line-through; font-style: italic; }
25
+ li.r1 { background: #f0f0f0; }
26
+ li.r2 { background: #fafafa; }
27
+ li:hover { background: #ddd; }
28
+ li small:before { content: "("; }
29
+ li small:after { content: ")"; }
30
+ li small.search_info { display: none; }
31
+ a:link, a:visited { text-decoration: none; color: #05a; }
32
+ li.clicked { background: #05a; color: #ccc; }
33
+ li.clicked a:link, li.clicked a:visited { color: #eee; }
34
+ li.clicked a.toggle { opacity: 0.5; background-position: bottom right; }
35
+ li.collapsed.clicked a.toggle { background-position: top right; }
36
+ #search input { border: 1px solid #bbb; -moz-border-radius: 3px; -webkit-border-radius: 3px; }
37
+ #nav { margin-left: 10px; font-size: 0.9em; display: none; color: #aaa; }
38
+ #nav a:link, #nav a:visited { color: #358; }
39
+ #nav a:hover { background: transparent; color: #5af; }
40
+
41
+ .frames #content h1 { margin-top: 0; }
42
+ .frames li { white-space: nowrap; cursor: normal; }
43
+ .frames li small { display: block; font-size: 0.8em; }
44
+ .frames li small:before { content: ""; }
45
+ .frames li small:after { content: ""; }
46
+ .frames li small.search_info { display: none; }
47
+ .frames #search { width: 170px; position: static; margin: 3px; margin-left: 10px; font-size: 0.9em; color: #888; padding-left: 0; padding-right: 24px; }
48
+ .frames #content.insearch #search { background-position: center right; }
49
+ .frames #search input { width: 110px; }
50
+ .frames #nav { display: block; }
51
+
52
+ #full_list.insearch li { display: none; }
53
+ #full_list.insearch li.found { display: list-item; padding-left: 10px; }
54
+ #full_list.insearch li a.toggle { display: none; }
55
+ #full_list.insearch li small.search_info { display: block; }