axlsx 1.0.18 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +11 -3
- data/README.md +93 -18
- data/examples/example.csv +1000 -0
- data/examples/example.rb +97 -5
- data/examples/example.xlsx +0 -0
- data/examples/example_streamed.xlsx +0 -0
- data/examples/no-use_autowidth.xlsx +0 -0
- data/examples/shared_strings_example.xlsx +0 -0
- data/lib/axlsx.rb +30 -9
- data/lib/axlsx/content_type/content_type.rb +9 -9
- data/lib/axlsx/content_type/default.rb +9 -6
- data/lib/axlsx/content_type/override.rb +12 -8
- data/lib/axlsx/doc_props/app.rb +37 -40
- data/lib/axlsx/doc_props/core.rb +12 -17
- data/lib/axlsx/drawing/axis.rb +38 -19
- data/lib/axlsx/drawing/bar_3D_chart.rb +33 -32
- data/lib/axlsx/drawing/bar_series.rb +13 -14
- data/lib/axlsx/drawing/cat_axis.rb +15 -14
- data/lib/axlsx/drawing/cat_axis_data.rb +16 -18
- data/lib/axlsx/drawing/chart.rb +37 -38
- data/lib/axlsx/drawing/drawing.rb +15 -12
- data/lib/axlsx/drawing/graphic_frame.rb +21 -21
- data/lib/axlsx/drawing/hyperlink.rb +12 -11
- data/lib/axlsx/drawing/line_3D_chart.rb +30 -28
- data/lib/axlsx/drawing/line_series.rb +11 -11
- data/lib/axlsx/drawing/marker.rb +10 -8
- data/lib/axlsx/drawing/named_axis_data.rb +36 -0
- data/lib/axlsx/drawing/one_cell_anchor.rb +17 -16
- data/lib/axlsx/drawing/pic.rb +24 -37
- data/lib/axlsx/drawing/picture_locking.rb +21 -18
- data/lib/axlsx/drawing/pie_3D_chart.rb +10 -8
- data/lib/axlsx/drawing/pie_series.rb +15 -12
- data/lib/axlsx/drawing/scaling.rb +10 -10
- data/lib/axlsx/drawing/scatter_chart.rb +69 -0
- data/lib/axlsx/drawing/scatter_series.rb +39 -0
- data/lib/axlsx/drawing/ser_axis.rb +10 -10
- data/lib/axlsx/drawing/series.rb +15 -15
- data/lib/axlsx/drawing/series_title.rb +14 -14
- data/lib/axlsx/drawing/title.rb +26 -26
- data/lib/axlsx/drawing/two_cell_anchor.rb +18 -20
- data/lib/axlsx/drawing/val_axis.rb +8 -7
- data/lib/axlsx/drawing/val_axis_data.rb +17 -17
- data/lib/axlsx/drawing/view_3D.rb +22 -20
- data/lib/axlsx/package.rb +32 -15
- data/lib/axlsx/rels/relationship.rb +9 -6
- data/lib/axlsx/rels/relationships.rb +7 -1
- data/lib/axlsx/stylesheet/#num_fmt.rb# +69 -0
- data/lib/axlsx/stylesheet/border.rb +27 -23
- data/lib/axlsx/stylesheet/border_pr.rb +16 -15
- data/lib/axlsx/stylesheet/cell_alignment.rb +23 -21
- data/lib/axlsx/stylesheet/cell_protection.rb +10 -7
- data/lib/axlsx/stylesheet/cell_style.rb +8 -5
- data/lib/axlsx/stylesheet/color.rb +20 -14
- data/lib/axlsx/stylesheet/fill.rb +7 -5
- data/lib/axlsx/stylesheet/font.rb +14 -14
- data/lib/axlsx/stylesheet/gradient_fill.rb +19 -16
- data/lib/axlsx/stylesheet/gradient_stop.rb +9 -5
- data/lib/axlsx/stylesheet/num_fmt.rb +12 -6
- data/lib/axlsx/stylesheet/pattern_fill.rb +25 -10
- data/lib/axlsx/stylesheet/styles.rb +41 -32
- data/lib/axlsx/stylesheet/table_style.rb +9 -4
- data/lib/axlsx/stylesheet/table_style_element.rb +10 -7
- data/lib/axlsx/stylesheet/table_styles.rb +11 -8
- data/lib/axlsx/stylesheet/xf.rb +29 -25
- data/lib/axlsx/util/constants.rb +4 -0
- data/lib/axlsx/util/simple_typed_list.rb +18 -9
- data/lib/axlsx/util/validators.rb +13 -6
- data/lib/axlsx/version.rb +1 -1
- data/lib/axlsx/workbook/shared_strings_table.rb +19 -21
- data/lib/axlsx/workbook/workbook.rb +43 -19
- data/lib/axlsx/workbook/worksheet/cell.rb +93 -91
- data/lib/axlsx/workbook/worksheet/col.rb +114 -0
- data/lib/axlsx/workbook/worksheet/col.rb~ +0 -0
- data/lib/axlsx/workbook/worksheet/page_margins.rb +16 -13
- data/lib/axlsx/workbook/worksheet/row.rb +13 -13
- data/lib/axlsx/workbook/worksheet/table.rb +96 -0
- data/lib/axlsx/workbook/worksheet/table.rb~ +97 -0
- data/lib/axlsx/workbook/worksheet/worksheet.rb +152 -118
- data/lib/schema/dc.xsd +5 -5
- data/lib/schema/dcmitype.xsd +5 -3
- data/lib/schema/dcterms.xsd +15 -15
- data/lib/schema/opc-coreProperties.xsd +6 -2
- data/lib/schema/xml.xsd +7 -8
- data/test/#benchmark.txt# +7 -0
- data/test/#tc_helper.rb# +3 -0
- data/test/benchmark.rb +81 -0
- data/test/benchmark.rb~ +0 -0
- data/test/benchmark.txt +6 -0
- data/test/benchmark.txt~ +6 -0
- data/test/content_type/tc_content_type.rb +30 -32
- data/test/content_type/tc_default.rb +8 -23
- data/test/content_type/tc_override.rb +7 -21
- data/test/doc_props/tc_app.rb +2 -8
- data/test/doc_props/tc_core.rb +6 -7
- data/test/drawing/tc_axis.rb +7 -3
- data/test/drawing/tc_bar_3D_chart.rb +6 -7
- data/test/drawing/tc_bar_series.rb +4 -5
- data/test/drawing/tc_cat_axis.rb +2 -3
- data/test/drawing/tc_cat_axis_data.rb +2 -3
- data/test/drawing/tc_chart.rb +11 -12
- data/test/drawing/tc_drawing.rb +7 -8
- data/test/drawing/tc_graphic_frame.rb +3 -4
- data/test/drawing/tc_hyperlink.rb +2 -3
- data/test/drawing/tc_line_3d_chart.rb +5 -6
- data/test/drawing/tc_line_series.rb +3 -4
- data/test/drawing/tc_marker.rb +3 -4
- data/test/drawing/tc_one_cell_anchor.rb +6 -7
- data/test/drawing/tc_pic.rb +8 -9
- data/test/drawing/tc_picture_locking.rb +2 -3
- data/test/drawing/tc_pie_3D_chart.rb +5 -6
- data/test/drawing/tc_pie_series.rb +4 -5
- data/test/drawing/tc_scaling.rb +3 -4
- data/test/drawing/tc_scatter_chart.rb +43 -0
- data/test/drawing/tc_scatter_series.rb +20 -0
- data/test/drawing/tc_ser_axis.rb +2 -3
- data/test/drawing/tc_series.rb +4 -5
- data/test/drawing/tc_series_title.rb +4 -5
- data/test/drawing/tc_title.rb +4 -5
- data/test/drawing/tc_two_cell_anchor.rb +4 -5
- data/test/drawing/tc_val_axis.rb +2 -3
- data/test/drawing/tc_val_axis_data.rb +2 -3
- data/test/drawing/tc_view_3D.rb +6 -7
- data/test/example.csv +1000 -0
- data/test/example.xlsx +0 -0
- data/test/example_streamed.xlsx +0 -0
- data/test/profile.rb +33 -0
- data/test/rels/tc_relationship.rb +5 -6
- data/test/rels/tc_relationships.rb +4 -5
- data/test/stylesheet/tc_border.rb +3 -4
- data/test/stylesheet/tc_border_pr.rb +3 -4
- data/test/stylesheet/tc_cell_alignment.rb +4 -5
- data/test/stylesheet/tc_cell_protection.rb +2 -3
- data/test/stylesheet/tc_cell_style.rb +2 -3
- data/test/stylesheet/tc_color.rb +2 -3
- data/test/stylesheet/tc_fill.rb +1 -2
- data/test/stylesheet/tc_font.rb +5 -6
- data/test/stylesheet/tc_gradient_fill.rb +1 -2
- data/test/stylesheet/tc_gradient_stop.rb +1 -2
- data/test/stylesheet/tc_num_fmt.rb +1 -2
- data/test/stylesheet/tc_pattern_fill.rb +3 -4
- data/test/stylesheet/tc_styles.rb +15 -9
- data/test/stylesheet/tc_table_style.rb +2 -3
- data/test/stylesheet/tc_table_style_element.rb +2 -3
- data/test/stylesheet/tc_table_styles.rb +3 -4
- data/test/stylesheet/tc_xf.rb +16 -17
- data/test/tc_axlsx.rb +39 -0
- data/test/tc_axlsx.rb~ +0 -0
- data/test/tc_helper.rb +3 -0
- data/test/tc_helper.rb~ +3 -0
- data/test/tc_package.rb +13 -10
- data/test/util/tc_simple_typed_list.rb +8 -9
- data/test/util/tc_validators.rb +7 -8
- data/test/workbook/tc_shared_strings_table.rb +5 -6
- data/test/workbook/tc_workbook.rb +24 -6
- data/test/workbook/worksheet/table/tc_table.rb +71 -0
- data/test/workbook/worksheet/table/tc_table.rb~ +72 -0
- data/test/workbook/worksheet/tc_cell.rb +24 -10
- data/test/workbook/worksheet/tc_col.rb +59 -0
- data/test/workbook/worksheet/tc_col.rb~ +10 -0
- data/test/workbook/worksheet/tc_date_time_converter.rb +1 -2
- data/test/workbook/worksheet/tc_page_margins.rb +6 -9
- data/test/workbook/worksheet/tc_row.rb +26 -12
- data/test/workbook/worksheet/tc_worksheet.rb +134 -68
- metadata +150 -90
- data/test/drawing/tc_hyperlink.rb~ +0 -71
- data/test/workbook/tc_shared_strings_table.rb~ +0 -8
- 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
|
-
|
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
|
26
|
-
# @param [
|
25
|
+
# Serializes the object
|
26
|
+
# @param [String] str
|
27
27
|
# @return [String]
|
28
|
-
def
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
7
|
-
# @param [
|
6
|
+
# Serializes the object
|
7
|
+
# @param [String] str
|
8
8
|
# @return [String]
|
9
|
-
def
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
-
|
73
|
-
#
|
72
|
+
|
73
|
+
# Serializes the object
|
74
|
+
# @param [String] str
|
74
75
|
# @return [String]
|
75
|
-
def
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
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
|
data/lib/axlsx/package.rb
CHANGED
@@ -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
|
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.
|
166
|
-
{:entry => "xl/#{STYLES_PN}", :doc => workbook.styles.
|
167
|
-
{:entry => CORE_PN, :doc => @core.
|
168
|
-
{:entry => APP_PN, :doc => @app.
|
169
|
-
{:entry => WORKBOOK_RELS_PN, :doc => workbook.relationships.
|
170
|
-
{:entry => CONTENT_TYPES_PN, :doc => content_types.
|
171
|
-
{:entry => WORKBOOK_PN, :doc => workbook.
|
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.
|
175
|
-
@parts << {:entry => "xl/#{drawing.pn}", :doc => drawing.
|
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.
|
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.
|
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.
|
192
|
-
@parts << {:entry => "xl/#{sheet.pn}", :doc => sheet.
|
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
|
-
#
|
51
|
-
# @param [
|
52
|
-
# @param [
|
50
|
+
# serialize relationship
|
51
|
+
# @param [String] str
|
52
|
+
# @param [Integer] rId the id for this relationship
|
53
53
|
# @return [String]
|
54
|
-
def
|
54
|
+
def to_xml_string(rId, str = '')
|
55
55
|
h = self.instance_values
|
56
|
-
h[:Id] = rId
|
57
|
-
|
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 =
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
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
|
47
|
-
# @param [
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
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
|