axlsx 1.0.18 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (167) hide show
  1. data/CHANGELOG.md +11 -3
  2. data/README.md +93 -18
  3. data/examples/example.csv +1000 -0
  4. data/examples/example.rb +97 -5
  5. data/examples/example.xlsx +0 -0
  6. data/examples/example_streamed.xlsx +0 -0
  7. data/examples/no-use_autowidth.xlsx +0 -0
  8. data/examples/shared_strings_example.xlsx +0 -0
  9. data/lib/axlsx.rb +30 -9
  10. data/lib/axlsx/content_type/content_type.rb +9 -9
  11. data/lib/axlsx/content_type/default.rb +9 -6
  12. data/lib/axlsx/content_type/override.rb +12 -8
  13. data/lib/axlsx/doc_props/app.rb +37 -40
  14. data/lib/axlsx/doc_props/core.rb +12 -17
  15. data/lib/axlsx/drawing/axis.rb +38 -19
  16. data/lib/axlsx/drawing/bar_3D_chart.rb +33 -32
  17. data/lib/axlsx/drawing/bar_series.rb +13 -14
  18. data/lib/axlsx/drawing/cat_axis.rb +15 -14
  19. data/lib/axlsx/drawing/cat_axis_data.rb +16 -18
  20. data/lib/axlsx/drawing/chart.rb +37 -38
  21. data/lib/axlsx/drawing/drawing.rb +15 -12
  22. data/lib/axlsx/drawing/graphic_frame.rb +21 -21
  23. data/lib/axlsx/drawing/hyperlink.rb +12 -11
  24. data/lib/axlsx/drawing/line_3D_chart.rb +30 -28
  25. data/lib/axlsx/drawing/line_series.rb +11 -11
  26. data/lib/axlsx/drawing/marker.rb +10 -8
  27. data/lib/axlsx/drawing/named_axis_data.rb +36 -0
  28. data/lib/axlsx/drawing/one_cell_anchor.rb +17 -16
  29. data/lib/axlsx/drawing/pic.rb +24 -37
  30. data/lib/axlsx/drawing/picture_locking.rb +21 -18
  31. data/lib/axlsx/drawing/pie_3D_chart.rb +10 -8
  32. data/lib/axlsx/drawing/pie_series.rb +15 -12
  33. data/lib/axlsx/drawing/scaling.rb +10 -10
  34. data/lib/axlsx/drawing/scatter_chart.rb +69 -0
  35. data/lib/axlsx/drawing/scatter_series.rb +39 -0
  36. data/lib/axlsx/drawing/ser_axis.rb +10 -10
  37. data/lib/axlsx/drawing/series.rb +15 -15
  38. data/lib/axlsx/drawing/series_title.rb +14 -14
  39. data/lib/axlsx/drawing/title.rb +26 -26
  40. data/lib/axlsx/drawing/two_cell_anchor.rb +18 -20
  41. data/lib/axlsx/drawing/val_axis.rb +8 -7
  42. data/lib/axlsx/drawing/val_axis_data.rb +17 -17
  43. data/lib/axlsx/drawing/view_3D.rb +22 -20
  44. data/lib/axlsx/package.rb +32 -15
  45. data/lib/axlsx/rels/relationship.rb +9 -6
  46. data/lib/axlsx/rels/relationships.rb +7 -1
  47. data/lib/axlsx/stylesheet/#num_fmt.rb# +69 -0
  48. data/lib/axlsx/stylesheet/border.rb +27 -23
  49. data/lib/axlsx/stylesheet/border_pr.rb +16 -15
  50. data/lib/axlsx/stylesheet/cell_alignment.rb +23 -21
  51. data/lib/axlsx/stylesheet/cell_protection.rb +10 -7
  52. data/lib/axlsx/stylesheet/cell_style.rb +8 -5
  53. data/lib/axlsx/stylesheet/color.rb +20 -14
  54. data/lib/axlsx/stylesheet/fill.rb +7 -5
  55. data/lib/axlsx/stylesheet/font.rb +14 -14
  56. data/lib/axlsx/stylesheet/gradient_fill.rb +19 -16
  57. data/lib/axlsx/stylesheet/gradient_stop.rb +9 -5
  58. data/lib/axlsx/stylesheet/num_fmt.rb +12 -6
  59. data/lib/axlsx/stylesheet/pattern_fill.rb +25 -10
  60. data/lib/axlsx/stylesheet/styles.rb +41 -32
  61. data/lib/axlsx/stylesheet/table_style.rb +9 -4
  62. data/lib/axlsx/stylesheet/table_style_element.rb +10 -7
  63. data/lib/axlsx/stylesheet/table_styles.rb +11 -8
  64. data/lib/axlsx/stylesheet/xf.rb +29 -25
  65. data/lib/axlsx/util/constants.rb +4 -0
  66. data/lib/axlsx/util/simple_typed_list.rb +18 -9
  67. data/lib/axlsx/util/validators.rb +13 -6
  68. data/lib/axlsx/version.rb +1 -1
  69. data/lib/axlsx/workbook/shared_strings_table.rb +19 -21
  70. data/lib/axlsx/workbook/workbook.rb +43 -19
  71. data/lib/axlsx/workbook/worksheet/cell.rb +93 -91
  72. data/lib/axlsx/workbook/worksheet/col.rb +114 -0
  73. data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
  74. data/lib/axlsx/workbook/worksheet/page_margins.rb +16 -13
  75. data/lib/axlsx/workbook/worksheet/row.rb +13 -13
  76. data/lib/axlsx/workbook/worksheet/table.rb +96 -0
  77. data/lib/axlsx/workbook/worksheet/table.rb~ +97 -0
  78. data/lib/axlsx/workbook/worksheet/worksheet.rb +152 -118
  79. data/lib/schema/dc.xsd +5 -5
  80. data/lib/schema/dcmitype.xsd +5 -3
  81. data/lib/schema/dcterms.xsd +15 -15
  82. data/lib/schema/opc-coreProperties.xsd +6 -2
  83. data/lib/schema/xml.xsd +7 -8
  84. data/test/#benchmark.txt# +7 -0
  85. data/test/#tc_helper.rb# +3 -0
  86. data/test/benchmark.rb +81 -0
  87. data/test/benchmark.rb~ +0 -0
  88. data/test/benchmark.txt +6 -0
  89. data/test/benchmark.txt~ +6 -0
  90. data/test/content_type/tc_content_type.rb +30 -32
  91. data/test/content_type/tc_default.rb +8 -23
  92. data/test/content_type/tc_override.rb +7 -21
  93. data/test/doc_props/tc_app.rb +2 -8
  94. data/test/doc_props/tc_core.rb +6 -7
  95. data/test/drawing/tc_axis.rb +7 -3
  96. data/test/drawing/tc_bar_3D_chart.rb +6 -7
  97. data/test/drawing/tc_bar_series.rb +4 -5
  98. data/test/drawing/tc_cat_axis.rb +2 -3
  99. data/test/drawing/tc_cat_axis_data.rb +2 -3
  100. data/test/drawing/tc_chart.rb +11 -12
  101. data/test/drawing/tc_drawing.rb +7 -8
  102. data/test/drawing/tc_graphic_frame.rb +3 -4
  103. data/test/drawing/tc_hyperlink.rb +2 -3
  104. data/test/drawing/tc_line_3d_chart.rb +5 -6
  105. data/test/drawing/tc_line_series.rb +3 -4
  106. data/test/drawing/tc_marker.rb +3 -4
  107. data/test/drawing/tc_one_cell_anchor.rb +6 -7
  108. data/test/drawing/tc_pic.rb +8 -9
  109. data/test/drawing/tc_picture_locking.rb +2 -3
  110. data/test/drawing/tc_pie_3D_chart.rb +5 -6
  111. data/test/drawing/tc_pie_series.rb +4 -5
  112. data/test/drawing/tc_scaling.rb +3 -4
  113. data/test/drawing/tc_scatter_chart.rb +43 -0
  114. data/test/drawing/tc_scatter_series.rb +20 -0
  115. data/test/drawing/tc_ser_axis.rb +2 -3
  116. data/test/drawing/tc_series.rb +4 -5
  117. data/test/drawing/tc_series_title.rb +4 -5
  118. data/test/drawing/tc_title.rb +4 -5
  119. data/test/drawing/tc_two_cell_anchor.rb +4 -5
  120. data/test/drawing/tc_val_axis.rb +2 -3
  121. data/test/drawing/tc_val_axis_data.rb +2 -3
  122. data/test/drawing/tc_view_3D.rb +6 -7
  123. data/test/example.csv +1000 -0
  124. data/test/example.xlsx +0 -0
  125. data/test/example_streamed.xlsx +0 -0
  126. data/test/profile.rb +33 -0
  127. data/test/rels/tc_relationship.rb +5 -6
  128. data/test/rels/tc_relationships.rb +4 -5
  129. data/test/stylesheet/tc_border.rb +3 -4
  130. data/test/stylesheet/tc_border_pr.rb +3 -4
  131. data/test/stylesheet/tc_cell_alignment.rb +4 -5
  132. data/test/stylesheet/tc_cell_protection.rb +2 -3
  133. data/test/stylesheet/tc_cell_style.rb +2 -3
  134. data/test/stylesheet/tc_color.rb +2 -3
  135. data/test/stylesheet/tc_fill.rb +1 -2
  136. data/test/stylesheet/tc_font.rb +5 -6
  137. data/test/stylesheet/tc_gradient_fill.rb +1 -2
  138. data/test/stylesheet/tc_gradient_stop.rb +1 -2
  139. data/test/stylesheet/tc_num_fmt.rb +1 -2
  140. data/test/stylesheet/tc_pattern_fill.rb +3 -4
  141. data/test/stylesheet/tc_styles.rb +15 -9
  142. data/test/stylesheet/tc_table_style.rb +2 -3
  143. data/test/stylesheet/tc_table_style_element.rb +2 -3
  144. data/test/stylesheet/tc_table_styles.rb +3 -4
  145. data/test/stylesheet/tc_xf.rb +16 -17
  146. data/test/tc_axlsx.rb +39 -0
  147. data/test/tc_axlsx.rb~ +0 -0
  148. data/test/tc_helper.rb +3 -0
  149. data/test/tc_helper.rb~ +3 -0
  150. data/test/tc_package.rb +13 -10
  151. data/test/util/tc_simple_typed_list.rb +8 -9
  152. data/test/util/tc_validators.rb +7 -8
  153. data/test/workbook/tc_shared_strings_table.rb +5 -6
  154. data/test/workbook/tc_workbook.rb +24 -6
  155. data/test/workbook/worksheet/table/tc_table.rb +71 -0
  156. data/test/workbook/worksheet/table/tc_table.rb~ +72 -0
  157. data/test/workbook/worksheet/tc_cell.rb +24 -10
  158. data/test/workbook/worksheet/tc_col.rb +59 -0
  159. data/test/workbook/worksheet/tc_col.rb~ +10 -0
  160. data/test/workbook/worksheet/tc_date_time_converter.rb +1 -2
  161. data/test/workbook/worksheet/tc_page_margins.rb +6 -9
  162. data/test/workbook/worksheet/tc_row.rb +26 -12
  163. data/test/workbook/worksheet/tc_worksheet.rb +134 -68
  164. metadata +150 -90
  165. data/test/drawing/tc_hyperlink.rb~ +0 -71
  166. data/test/workbook/tc_shared_strings_table.rb~ +0 -8
  167. data/test/workbook/worksheet/tc_date_time_converter.rb~ +0 -69
@@ -26,7 +26,7 @@ module Axlsx
26
26
  attr_reader :drawing
27
27
 
28
28
 
29
- # Creates a new TwoCellAnchor object and sets up a reference to the from and to markers in the
29
+ # Creates a new TwoCellAnchor object and sets up a reference to the from and to markers in the
30
30
  # graphic_frame's chart. That means that you can do stuff like
31
31
  # c = worksheet.add_chart Axlsx::Chart
32
32
  # c.start_at 5, 9
@@ -38,13 +38,13 @@ module Axlsx
38
38
  # @option options [Array] end_at the col, row to end at
39
39
  def initialize(drawing, options={})
40
40
  @drawing = drawing
41
- drawing.anchors << self
41
+ drawing.anchors << self
42
42
  @from, @to = Marker.new, Marker.new(:col => 5, :row=>10)
43
43
  end
44
44
 
45
45
  # Creates a graphic frame and chart object associated with this anchor
46
46
  # @return [Chart]
47
- def add_chart(chart_type, options)
47
+ def add_chart(chart_type, options)
48
48
  @object = GraphicFrame.new(self, chart_type, options)
49
49
  @object.chart
50
50
  end
@@ -54,24 +54,22 @@ module Axlsx
54
54
  def index
55
55
  @drawing.anchors.index(self)
56
56
  end
57
- # Serializes the two cell anchor
58
- # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
59
- # @return [String]
60
- def to_xml(xml)
61
- #build it for now, break it down later!
62
- xml[:xdr].twoCellAnchor {
63
- xml.from {
64
- from.to_xml(xml)
65
- }
66
- xml.to {
67
- to.to_xml(xml)
68
- }
69
- @object.to_xml(xml)
70
- xml.clientData
71
- }
72
- end
73
57
 
74
- private
58
+ # Serializes the object
59
+ # @param [String] str
60
+ # @return [String]
61
+ def to_xml_string(str = '')
62
+ str << '<xdr:twoCellAnchor>'
63
+ str << '<xdr:from>'
64
+ from.to_xml_string str
65
+ str << '</xdr:from>'
66
+ str << '<xdr:to>'
67
+ to.to_xml_string str
68
+ str << '</xdr:to>'
69
+ object.to_xml_string(str)
70
+ str << '<xdr:clientData/>'
71
+ str << '</xdr:twoCellAnchor>'
72
+ end
75
73
 
76
74
  end
77
75
  end
@@ -22,14 +22,15 @@ module Axlsx
22
22
  # @see crossBetween
23
23
  def crossBetween=(v) RestrictionValidator.validate "ValAxis.crossBetween", [:between, :midCat], v; @crossBetween = v; end
24
24
 
25
- # Serializes the value axis
26
- # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
25
+ # Serializes the object
26
+ # @param [String] str
27
27
  # @return [String]
28
- def to_xml(xml)
29
- xml.valAx {
30
- super(xml)
31
- xml.crossBetween :val=>@crossBetween
32
- }
28
+ def to_xml_string(str = '')
29
+ str << '<c:valAx>'
30
+ super(str)
31
+ str << '<c:crossBetween val="' << @crossBetween.to_s << '"/>'
32
+ str << '</c:valAx>'
33
33
  end
34
+
34
35
  end
35
36
  end
@@ -3,25 +3,25 @@ module Axlsx
3
3
  # The ValAxisData class manages the values for a chart value series.
4
4
  class ValAxisData < CatAxisData
5
5
 
6
- # Serializes the value axis data
7
- # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
6
+ # Serializes the object
7
+ # @param [String] str
8
8
  # @return [String]
9
- def to_xml(xml)
10
- xml.val {
11
- xml.numRef {
12
- xml.f Axlsx::cell_range(@list)
13
- xml.numCache {
14
- xml.formatCode 'General'
15
- xml.ptCount :val=>size
16
- each_with_index do |item, index|
17
- v = item.is_a?(Cell) ? item.value : item
18
- xml.pt(:idx=>index) { xml.v v }
19
- end
20
- }
21
- }
22
- }
9
+ def to_xml_string(str = '')
10
+ str << '<c:val>'
11
+ str << '<c:numRef>'
12
+ str << '<c:f>' << Axlsx::cell_range(@list) << '</c:f>'
13
+ str << '<c:numCache>'
14
+ str << '<c:formatCode>General</c:formatCode>'
15
+ str << '<c:ptCount val="' << size.to_s << '"/>'
16
+ each_with_index do |item, index|
17
+ v = item.is_a?(Cell) ? item.value.to_s : item
18
+ str << '<c:pt idx="' << index.to_s << '"><c:v>' << v << '</c:v></c:pt>'
19
+ end
20
+ str << '</c:numCache>'
21
+ str << '</c:numRef>'
22
+ str << '</c:val>'
23
23
  end
24
24
 
25
25
  end
26
-
26
+
27
27
  end
@@ -5,34 +5,34 @@ module Axlsx
5
5
 
6
6
  # Validation for hPercent
7
7
  H_PERCENT_REGEX = /0*(([5-9])|([1-9][0-9])|([1-4][0-9][0-9])|500)%/
8
-
8
+
9
9
  # validation for depthPercent
10
10
  DEPTH_PERCENT_REGEX = /0*(([2-9][0-9])|([1-9][0-9][0-9])|(1[0-9][0-9][0-9])|2000)%/
11
11
 
12
- # x rotation for the chart
12
+ # x rotation for the chart
13
13
  # must be between -90 and 90
14
14
  # @return [Integer]
15
15
  attr_reader :rotX
16
-
16
+
17
17
  # height of chart as % of chart
18
18
  # must be between 5% and 500%
19
19
  # @return [String]
20
20
  attr_reader :hPercent
21
-
21
+
22
22
  # y rotation for the chart
23
23
  # must be between 0 and 360
24
24
  # @return [Integer]
25
25
  attr_reader :rotY
26
-
26
+
27
27
  # depth or chart as % of chart width
28
28
  # must be between 20% and 2000%
29
29
  # @return [String]
30
30
  attr_reader :depthPercent
31
-
31
+
32
32
  # Chart axis are at right angles
33
33
  # @return [Boolean]
34
34
  attr_reader :rAngAx
35
-
35
+
36
36
  # field of view angle
37
37
  # @return [Integer]
38
38
  attr_reader :perspective
@@ -45,10 +45,10 @@ module Axlsx
45
45
  # @option options [Boolean] rAngAx
46
46
  # @option options [Integer] perspective
47
47
  def initialize(options={})
48
- @rotX, @hPercent, @rotY, @depthPercent, @rAngAx, @perspective = nil, nil, nil, nil, nil, nil
48
+ @rotX, @hPercent, @rotY, @depthPercent, @rAngAx, @perspective = nil, nil, nil, nil, nil, nil
49
49
  options.each do |o|
50
50
  self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
51
- end
51
+ end
52
52
  end
53
53
 
54
54
  # @see rotX
@@ -69,18 +69,20 @@ module Axlsx
69
69
  # @see perspective
70
70
  def perspective=(v) DataTypeValidator.validate "#{self.class}.perspective", [Integer, Fixnum], v, lambda {|arg| arg >= 0 && arg <= 240 }; @perspective = v; end
71
71
 
72
- # Serializes the view3D properties
73
- # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
72
+
73
+ # Serializes the object
74
+ # @param [String] str
74
75
  # @return [String]
75
- def to_xml(xml)
76
- xml[:c].view3D {
77
- xml[:c].rotX :val=>@rotX unless @rotX.nil?
78
- xml[:c].hPercent :val=>@hPercent unless @hPercent.nil?
79
- xml[:c].rotY :val=>@rotY unless @rotY.nil?
80
- xml[:c].depthPercent :val=>@depthPercent unless @depthPercent.nil?
81
- xml[:c].rAngAx :val=>@rAngAx unless @rAngAx.nil?
82
- xml[:c].perspective :val=>@perspective unless @perspective.nil?
83
- }
76
+ def to_xml_string(str = '')
77
+ str << '<c:view3D>'
78
+ str << '<c:rotX val="' << @rotX.to_s << '"/>' unless @rotX.nil?
79
+ str << '<c:hPercent val="' << @hPercent.to_s << '"/>' unless @hPercent.nil?
80
+ str << '<c:rotY val="' << @rotY.to_s << '"/>' unless @rotY.nil?
81
+ str << '<c:depthPercent val="' << @depthPercent.to_s << '"/>' unless @depthPercent.nil?
82
+ str << '<c:rAngAx val="' << @rAngAx.to_s << '"/>' unless @rAngAx.nil?
83
+ str << '<c:perspective val="' << @perspective.to_s << '"/>' unless @perspective.nil?
84
+ str << '</c:view3D>'
84
85
  end
86
+
85
87
  end
86
88
  end
@@ -29,6 +29,14 @@ module Axlsx
29
29
  yield self if block_given?
30
30
  end
31
31
 
32
+ # Shortcut to specify that the workbook should use autowidth
33
+ # @see Workbook#use_autowidth
34
+ def use_autowidth=(v)
35
+ Axlsx::validate_boolean(v);
36
+ workbook.use_autowidth = v
37
+ end
38
+
39
+
32
40
  # Shortcut to specify that the workbook should use shared strings
33
41
  # @see Workbook#use_shared_strings
34
42
  def use_shared_strings=(v)
@@ -131,7 +139,9 @@ module Axlsx
131
139
  # p.validate.each { |error| puts error.message }
132
140
  def validate
133
141
  errors = []
134
- parts.each { |part| errors.concat validate_single_doc(part[:schema], part[:doc]) unless part[:schema].nil? }
142
+ parts.each do |part|
143
+ errors.concat validate_single_doc(part[:schema], part[:doc]) unless part[:schema].nil?
144
+ end
135
145
  errors
136
146
  end
137
147
 
@@ -162,21 +172,25 @@ module Axlsx
162
172
  # @private
163
173
  def parts
164
174
  @parts = [
165
- {:entry => RELS_PN, :doc => relationships.to_xml, :schema => RELS_XSD},
166
- {:entry => "xl/#{STYLES_PN}", :doc => workbook.styles.to_xml, :schema => SML_XSD},
167
- {:entry => CORE_PN, :doc => @core.to_xml, :schema => CORE_XSD},
168
- {:entry => APP_PN, :doc => @app.to_xml, :schema => APP_XSD},
169
- {:entry => WORKBOOK_RELS_PN, :doc => workbook.relationships.to_xml, :schema => RELS_XSD},
170
- {:entry => CONTENT_TYPES_PN, :doc => content_types.to_xml, :schema => CONTENT_TYPES_XSD},
171
- {:entry => WORKBOOK_PN, :doc => workbook.to_xml, :schema => SML_XSD}
175
+ {:entry => RELS_PN, :doc => relationships.to_xml_string, :schema => RELS_XSD},
176
+ {:entry => "xl/#{STYLES_PN}", :doc => workbook.styles.to_xml_string, :schema => SML_XSD},
177
+ {:entry => CORE_PN, :doc => @core.to_xml_string, :schema => CORE_XSD},
178
+ {:entry => APP_PN, :doc => @app.to_xml_string, :schema => APP_XSD},
179
+ {:entry => WORKBOOK_RELS_PN, :doc => workbook.relationships.to_xml_string, :schema => RELS_XSD},
180
+ {:entry => CONTENT_TYPES_PN, :doc => content_types.to_xml_string, :schema => CONTENT_TYPES_XSD},
181
+ {:entry => WORKBOOK_PN, :doc => workbook.to_xml_string, :schema => SML_XSD}
172
182
  ]
173
183
  workbook.drawings.each do |drawing|
174
- @parts << {:entry => "xl/#{drawing.rels_pn}", :doc => drawing.relationships.to_xml, :schema => RELS_XSD}
175
- @parts << {:entry => "xl/#{drawing.pn}", :doc => drawing.to_xml, :schema => DRAWING_XSD}
184
+ @parts << {:entry => "xl/#{drawing.rels_pn}", :doc => drawing.relationships.to_xml_string, :schema => RELS_XSD}
185
+ @parts << {:entry => "xl/#{drawing.pn}", :doc => drawing.to_xml_string, :schema => DRAWING_XSD}
186
+ end
187
+
188
+ workbook.tables.each do |table|
189
+ @parts << {:entry => "xl/#{table.pn}", :doc => table.to_xml_string, :schema => SML_XSD}
176
190
  end
177
191
 
178
192
  workbook.charts.each do |chart|
179
- @parts << {:entry => "xl/#{chart.pn}", :doc => chart.to_xml, :schema => DRAWING_XSD}
193
+ @parts << {:entry => "xl/#{chart.pn}", :doc => chart.to_xml_string, :schema => DRAWING_XSD}
180
194
  end
181
195
 
182
196
  workbook.images.each do |image|
@@ -184,12 +198,12 @@ module Axlsx
184
198
  end
185
199
 
186
200
  if use_shared_strings
187
- @parts << {:entry => "xl/#{SHARED_STRINGS_PN}", :doc => workbook.shared_strings.to_xml, :schema => SML_XSD}
201
+ @parts << {:entry => "xl/#{SHARED_STRINGS_PN}", :doc => workbook.shared_strings.to_xml_string, :schema => SML_XSD}
188
202
  end
189
203
 
190
204
  workbook.worksheets.each do |sheet|
191
- @parts << {:entry => "xl/#{sheet.rels_pn}", :doc => sheet.relationships.to_xml, :schema => RELS_XSD}
192
- @parts << {:entry => "xl/#{sheet.pn}", :doc => sheet.to_xml, :schema => SML_XSD}
205
+ @parts << {:entry => "xl/#{sheet.rels_pn}", :doc => sheet.relationships.to_xml_string, :schema => RELS_XSD}
206
+ @parts << {:entry => "xl/#{sheet.pn}", :doc => sheet.to_xml_string, :schema => SML_XSD}
193
207
  end
194
208
  @parts
195
209
  end
@@ -203,7 +217,6 @@ module Axlsx
203
217
  def validate_single_doc(schema, doc)
204
218
  schema = Nokogiri::XML::Schema(File.open(schema))
205
219
  doc = Nokogiri::XML(doc)
206
-
207
220
  errors = []
208
221
  schema.validate(doc).each do |error|
209
222
  errors << error
@@ -224,6 +237,10 @@ module Axlsx
224
237
  c_types << Axlsx::Override.new(:PartName => "/xl/#{chart.pn}",
225
238
  :ContentType => CHART_CT)
226
239
  end
240
+ workbook.tables.each do |table|
241
+ c_types << Axlsx::Override.new(:PartName => "/xl/#{table.pn}",
242
+ :ContentType => TABLE_CT)
243
+ end
227
244
  workbook.worksheets.each do |sheet|
228
245
  c_types << Axlsx::Override.new(:PartName => "/xl/#{sheet.pn}",
229
246
  :ContentType => WORKSHEET_CT)
@@ -47,14 +47,17 @@ module Axlsx
47
47
  # @see TargetMode
48
48
  def TargetMode=(v) RestrictionValidator.validate 'Relationship.TargetMode', [:External, :Internal], v; @TargetMode = v; end
49
49
 
50
- # Serializes the relationship
51
- # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
52
- # @param [String] rId the reference id of the object.
50
+ # serialize relationship
51
+ # @param [String] str
52
+ # @param [Integer] rId the id for this relationship
53
53
  # @return [String]
54
- def to_xml(xml, rId)
54
+ def to_xml_string(rId, str = '')
55
55
  h = self.instance_values
56
- h[:Id] = rId
57
- xml.Relationship(h)
56
+ h[:Id] = 'rId' << rId.to_s
57
+ str << '<Relationship '
58
+ str << h.map { |key, value| '' << key.to_s << '="' << value.to_s << '"'}.join(' ')
59
+ str << '/>'
58
60
  end
61
+
59
62
  end
60
63
  end
@@ -11,6 +11,12 @@ require 'axlsx/rels/relationship.rb'
11
11
  super Relationship
12
12
  end
13
13
 
14
+ def to_xml_string(str = '')
15
+ str << '<?xml version="1.0" encoding="UTF-8"?>'
16
+ str << '<Relationships xmlns="' << RELS_R << '">'
17
+ each_with_index { |rel, index| rel.to_xml_string(index+1, str) }
18
+ str << '</Relationships>'
19
+ end
14
20
  # Serializes the relationships document.
15
21
  # @return [String]
16
22
  def to_xml()
@@ -21,6 +27,6 @@ require 'axlsx/rels/relationship.rb'
21
27
  end
22
28
  builder.to_xml(:save_with => 0)
23
29
  end
24
-
30
+
25
31
  end
26
32
  end
@@ -0,0 +1,69 @@
1
+ # encoding: UTF-8
2
+ module Axlsx
3
+ # A NumFmt object defines an identifier and formatting code for data in cells.
4
+ # @note The recommended way to manage styles is Styles#add_style
5
+ class NumFmt
6
+ # @return [Integer] An unsinged integer referencing a standard or custom number format.
7
+ # @note
8
+ # These are the known formats I can dig up. The constant NUM_FMT_PERCENT is 9, and uses the default % formatting. Axlsx also defines a few formats for date and time that are commonly used in asia as NUM_FMT_YYYYMMDD and NUM_FRM_YYYYMMDDHHMMSS.
9
+ # 1 0
10
+ # 2 0.00
11
+ # 3 #,##0
12
+ # 4 #,##0.00
13
+ # 5 $#,##0_);($#,##0)
14
+ # 6 $#,##0_);[Red]($#,##0)
15
+ # 7 $#,##0.00_);($#,##0.00)
16
+ # 8 $#,##0.00_);[Red]($#,##0.00)
17
+ # 9 0%
18
+ # 10 0.00%
19
+ # 11 0.00E+00
20
+ # 12 # ?/?
21
+ # 13 # ??/??
22
+ # 14 m/d/yyyy
23
+ # 15 d-mmm-yy
24
+ # 16 d-mmm
25
+ # 17 mmm-yy
26
+ # 18 h:mm AM/PM
27
+ # 19 h:mm:ss AM/PM
28
+ # 20 h:mm
29
+ # 21 h:mm:ss
30
+ # 22 m/d/yyyy h:mm
31
+ # 37 #,##0_);(#,##0)
32
+ # 38 #,##0_);[Red](#,##0)
33
+ # 39 #,##0.00_);(#,##0.00)
34
+ # 40 #,##0.00_);[Red](#,##0.00)
35
+ # 45 mm:ss
36
+ # 46 [h]:mm:ss
37
+ # 47 mm:ss.0
38
+ # 48 ##0.0E+0
39
+ # 49 @
40
+ # @see Axlsx
41
+ attr_reader :numFmtId
42
+
43
+ # @return [String] The formatting to use for this number format.
44
+ # @see http://support.microsoft.com/kb/264372
45
+ attr_reader :formatCode
46
+ def initialize(options={})
47
+ @numFmtId = 0
48
+ @formatCode = ""
49
+ options.each do |o|
50
+ self.send("#{o[0]}=", o[1]) if self.respond_to? o[0]
51
+ end
52
+ end
53
+
54
+ # @see numFmtId
55
+ def numFmtId=(v) Axlsx::validate_unsigned_int v; @numFmtId = v end
56
+ # @see formatCode
57
+ def formatCode=(v) Axlsx::validate_string v; @formatCode = v end
58
+
59
+ # Serializes the object
60
+ # @param [String] str
61
+ # @return [String]
62
+ def to_xml_string(str = '')
63
+ str << '<numFmt '
64
+ str << instance_values.map { |key, value| '' << key.to_s << '="' << value.to_s << '"' }.join(' ')
65
+ str << '/>'
66
+ end
67
+
68
+ end
69
+ end
@@ -3,38 +3,37 @@ module Axlsx
3
3
  # This class details a border used in Office Open XML spreadsheet styles.
4
4
  class Border
5
5
 
6
- # @return [Boolean] The diagonal up property for the border that indicates if the border should include a diagonal line from the bottom left to the top right of the cell.
6
+ # @return [Boolean] The diagonal up property for the border that indicates if the border should include a diagonal line from the bottom left to the top right of the cell.
7
7
  attr_reader :diagonalUp
8
-
8
+
9
9
  # @return [Boolean] The diagonal down property for the border that indicates if the border should include a diagonal line from the top left to the top right of the cell.
10
10
  attr_reader :diagonalDown
11
11
 
12
12
  # @return [Boolean] The outline property for the border indicating that top, left, right and bottom borders should only be applied to the outside border of a range of cells.
13
13
  attr_reader :outline
14
14
 
15
- # @return [SimpleTypedList] A list of BorderPr objects for this border.
15
+ # @return [SimpleTypedList] A list of BorderPr objects for this border.
16
16
  attr_reader :prs
17
17
 
18
18
  # Creates a new Border object
19
19
  # @option options [Boolean] diagonalUp
20
20
  # @option options [Boolean] diagonalDown
21
21
  # @option options [Boolean] outline
22
- # @example Making a border
23
- # p = Package.new
24
- # red_border = Border.new
25
- # [:left, :right, :top, :bottom].each do |item|
26
- # red_border.prs << BorderPr.new(:name=>item, :style=>:thin, :color=>Color.new(:rgb=>"FFFF0000")) #
27
- # end
28
- # # this sets red_border to be the index for the created border.
29
- # red_border = p.workbook.styles.@borders << red_border
30
- # #used in row creation as follows. This will add a red border to each of the cells in the row.
31
- # p.workbook.add_worksheet.rows << :values=>[1,2,3] :style=>red_border
22
+ # @example - Making a border
23
+ # p = Axlsx::Package.new
24
+ # red_border = p.workbook.styles.add_style :border => { :style => :thin, :color => "FFFF0000" }
25
+ # ws = p.workbook.add_worksheet
26
+ # ws.add_row [1,2,3], :style => red_border
27
+ # p.serialize('red_border.xlsx')
28
+ #
29
+ # @note The recommended way to manage borders is with Style#add_style
30
+ # @see Style#add_style
32
31
  def initialize(options={})
33
32
  @prs = SimpleTypedList.new BorderPr
34
33
  options.each do |o|
35
34
  self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
36
35
  end
37
- end
36
+ end
38
37
 
39
38
  # @see diagonalUp
40
39
  def diagonalUp=(v) Axlsx::validate_boolean v; @diagonalUp = v end
@@ -43,16 +42,21 @@ module Axlsx
43
42
  # @see outline
44
43
  def outline=(v) Axlsx::validate_boolean v; @outline = v end
45
44
 
46
- # Serializes the border element
47
- # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to.
48
- def to_xml(xml)
49
- xml.border(self.instance_values.select{ |k,v| [:diagonalUp, :diagonalDown, :outline].include? k }) {
50
- [:start, :end, :left, :right, :top, :bottom, :diagonal, :vertical, :horizontal].each do |k|
51
- @prs.select { |pr| pr.name == k }.each do |part|
52
- part.to_xml(xml)
53
- end
45
+ # Serializes the object
46
+ # @param [String] str
47
+ # @return [String]
48
+ def to_xml_string(str = '')
49
+ str << '<border '
50
+ h = self.instance_values.select{ |k,v| [:diagonalUp, :diagonalDown, :outline].include? k }
51
+ str << h.map { |key, value| '' << key.to_s << '="' << value.to_s << '"' }.join(' ')
52
+ str << '>'
53
+ [:start, :end, :left, :right, :top, :bottom, :diagonal, :vertical, :horizontal].each do |k|
54
+ @prs.select { |pr| pr.name == k }.each do |part|
55
+ part.to_xml_string(str)
54
56
  end
55
- }
57
+ end
58
+ str << '</border>'
56
59
  end
60
+
57
61
  end
58
62
  end