From 6739c249e7bf3cf7d2132b2aa49b6faf6bebec29 Mon Sep 17 00:00:00 2001 From: Randy Morgan Date: Wed, 23 Nov 2011 12:28:10 +0900 Subject: [PATCH] -refactoring chart position and axis data/category for chart. -additional specs and documentation improvements. --- .yardoc/checksums | 44 +- .yardoc/objects/root.dat | Bin 425341 -> 427683 bytes .yardoc/proxy_types | Bin 38 -> 53 bytes .yardopts_guide | 19 + README.md | 23 +- doc/Axlsx.html | 6 +- doc/Axlsx/App.html | 2 +- doc/Axlsx/Axis.html | 64 +- doc/Axlsx/Bar3DChart.html | 241 ++--- doc/Axlsx/BarSeries.html | 70 +- doc/Axlsx/Border.html | 2 +- doc/Axlsx/BorderPr.html | 2 +- doc/Axlsx/CatAxis.html | 65 +- doc/Axlsx/CatAxisData.html | 400 ++++++++ doc/Axlsx/Cell.html | 2 +- doc/Axlsx/CellAlignment.html | 2 +- doc/Axlsx/CellProtection.html | 2 +- doc/Axlsx/CellStyle.html | 2 +- doc/Axlsx/Chart.html | 661 ++++++++----- doc/Axlsx/Color.html | 2 +- doc/Axlsx/ContentType.html | 4 +- doc/Axlsx/Core.html | 2 +- doc/Axlsx/DataTypeValidator.html | 2 +- doc/Axlsx/Default.html | 2 +- doc/Axlsx/Drawing.html | 156 ++- doc/Axlsx/Fill.html | 2 +- doc/Axlsx/Font.html | 2 +- doc/Axlsx/GradientFill.html | 2 +- doc/Axlsx/GradientStop.html | 2 +- doc/Axlsx/GraphicFrame.html | 12 +- doc/Axlsx/Line3DChart.html | 137 ++- doc/Axlsx/LineSeries.html | 90 +- doc/Axlsx/Marker.html | 2 +- doc/Axlsx/NumFmt.html | 2 +- doc/Axlsx/Override.html | 2 +- doc/Axlsx/Package.html | 2 +- doc/Axlsx/PatternFill.html | 2 +- doc/Axlsx/Pie3DChart.html | 184 ++-- doc/Axlsx/PieSeries.html | 119 +-- doc/Axlsx/RegexValidator.html | 2 +- doc/Axlsx/Relationship.html | 2 +- doc/Axlsx/Relationships.html | 4 +- doc/Axlsx/RestrictionValidator.html | 2 +- doc/Axlsx/Row.html | 2 +- doc/Axlsx/Scaling.html | 2 +- doc/Axlsx/SerAxis.html | 89 +- doc/Axlsx/Series.html | 35 +- doc/Axlsx/SeriesTitle.html | 5 +- doc/Axlsx/SimpleTypedList.html | 103 +- doc/Axlsx/Styles.html | 2 +- doc/Axlsx/TableStyle.html | 4 +- doc/Axlsx/TableStyleElement.html | 2 +- doc/Axlsx/TableStyles.html | 4 +- doc/Axlsx/Title.html | 2 +- doc/Axlsx/TwoCellAnchor.html | 320 +------ doc/Axlsx/ValAxis.html | 15 +- doc/Axlsx/ValAxisData.html | 326 +++++++ doc/Axlsx/View3D.html | 78 +- doc/Axlsx/Workbook.html | 2 +- doc/Axlsx/Worksheet.html | 123 ++- doc/Axlsx/Xf.html | 2 +- doc/_index.html | 16 +- doc/class_list.html | 2 +- doc/file.README.html | 24 +- doc/index.html | 24 +- doc/method_list.html | 894 +++++++++--------- doc/top-level-namespace.html | 2 +- examples/example.rb | 5 +- lib/axlsx/drawing/axis.rb | 13 +- lib/axlsx/drawing/bar_3D_chart.rb | 42 +- lib/axlsx/drawing/bar_series.rb | 41 +- lib/axlsx/drawing/cat_axis.rb | 18 +- lib/axlsx/drawing/cat_axis_data.rb | 34 + lib/axlsx/drawing/chart.rb | 69 +- lib/axlsx/drawing/drawing.rb | 26 +- lib/axlsx/drawing/graphic_frame.rb | 1 + lib/axlsx/drawing/line_3D_chart.rb | 12 +- lib/axlsx/drawing/line_series.rb | 50 +- lib/axlsx/drawing/pie_3D_chart.rb | 51 +- lib/axlsx/drawing/pie_series.rb | 56 +- lib/axlsx/drawing/ser_axis.rb | 27 +- lib/axlsx/drawing/series.rb | 5 +- lib/axlsx/drawing/series_title.rb | 2 +- lib/axlsx/drawing/two_cell_anchor.rb | 44 +- lib/axlsx/drawing/val_axis.rb | 8 +- lib/axlsx/drawing/val_axis_data.rb | 28 + lib/axlsx/drawing/view_3D.rb | 18 +- lib/axlsx/util/simple_typed_list.rb | 9 +- lib/axlsx/workbook/worksheet/worksheet.rb | 10 +- test/drawing/tc_axis.rb | 1 + test/drawing/tc_cat_axis_data.rb | 18 + test/drawing/tc_chart.rb | 12 + .../{tc_line_series.tc => tc_line_series.rb} | 7 - test/drawing/tc_ser_axis.rb | 18 +- test/drawing/tc_two_cell_anchor.rb | 35 +- test/drawing/tc_val_axis.rb | 5 + test/drawing/tc_val_axis_data.rb | 18 + test/drawing/tc_view_3D.rb | 11 +- 98 files changed, 3040 insertions(+), 2077 deletions(-) create mode 100644 .yardopts_guide create mode 100644 doc/Axlsx/CatAxisData.html create mode 100644 doc/Axlsx/ValAxisData.html create mode 100644 lib/axlsx/drawing/cat_axis_data.rb create mode 100644 lib/axlsx/drawing/val_axis_data.rb create mode 100644 test/drawing/tc_cat_axis_data.rb rename test/drawing/{tc_line_series.tc => tc_line_series.rb} (72%) create mode 100644 test/drawing/tc_val_axis_data.rb diff --git a/.yardoc/checksums b/.yardoc/checksums index 5e186a00..4281ee7b 100644 --- a/.yardoc/checksums +++ b/.yardoc/checksums @@ -1,54 +1,56 @@ lib/axlsx/stylesheet/table_styles.rb 04b778652c29d612f63e93080d06c3936e48d765 lib/axlsx/stylesheet/table_style.rb b592135b8b02969a29bd24c28a13282f6af76f30 -lib/axlsx/drawing/pie_3D_chart.rb dd669c8dc9ef1f762d45a9589260c8c17308d944 +lib/axlsx/drawing/pie_3D_chart.rb 9370e48b73000c96ebd50712dc4b4a958ad8527d lib/axlsx/stylesheet/border_pr.rb 09dcb61ec7b0cf49f2da4c4f8ccba8f7e0df7b07 lib/axlsx/stylesheet/color.rb 4927aaebe27dda42d78bb7baf9a44edc1753c77f lib/axlsx/drawing/marker.rb 3507738522c02a3733a01f115d9ef22fae4ea542 lib/axlsx/util/constants.rb 20e4a98177305d407b77eb62f0bca5ecc29b234c lib/axlsx/stylesheet/cell_protection.rb ce494f9add6de0a51407ddd9122fffe95759a48a lib/axlsx/stylesheet/cell_style.rb 46c6ff183bce5c6b1ab6228823257d638007b03c -lib/axlsx/drawing/series_title.rb 7ace4ba7c7835db5a7c69d2319cd59ed8c45908a -lib/axlsx/drawing/line_series.rb 80f2c27edafacbc5de9bb4fac9916b0ad0030a63 -lib/axlsx/drawing/series.rb b35c182d9e3b09d99f743d3828344c4e5ac9c373 +lib/axlsx/drawing/series_title.rb 8f088942649b5b5cc351b621bf8fb252f33cb510 +lib/axlsx/drawing/line_series.rb ada7cbca0d561c2e2f6bad56c1eb5d8ea2c1f071 +lib/axlsx/drawing/series.rb 1cf010706e32e7e51affbc9edb9d4862a26b33ef lib/axlsx/package.rb eea7499e09e0936eeb8e08d10823f05990722023 lib/axlsx/stylesheet/cell_alignment.rb f67f6a0bc16bf13669ed7b18714e4de23825ed94 lib/axlsx/content_type/default.rb 8ec0d9d1e6bf261735739823acd460c271e3f5ed lib/axlsx/drawing/title.rb b46fb082e3bea936d129c8aa0998f3b71c9838cc -lib/axlsx/drawing/axis.rb 5316065040d08d4f15e5da2751a2ee90185dad61 +lib/axlsx/drawing/axis.rb 5e37bac9f4dd258265213d5621522eed3c614954 lib/axlsx/stylesheet/table_style_element.rb bee66d743e3113fb14adc7ebdecbeb606bfb49fc lib/axlsx/content_type/content_type.rb 6c576e1618f99f7163fffa6b6e89e964653dcb5f -lib/axlsx/rels/relationships.rb 9c741e180796259bb378a789fd484fa1d8f04425 lib/axlsx/stylesheet/num_fmt.rb dc830c6540465afa824881efa2f1ce4070957c47 +lib/axlsx/rels/relationships.rb 9c741e180796259bb378a789fd484fa1d8f04425 lib/axlsx.rb 7d8c589a0bdc16acf8774ae1b77d5177b030a80c -lib/axlsx/drawing/graphic_frame.rb 5ff7476b8fa3e2101fde200d1c65844084fb42f7 +lib/axlsx/drawing/graphic_frame.rb 43496359fac0e990ded62f04254232f3cec8f736 lib/axlsx/content_type/override.rb 72245683bca868f181d709a515f9152485653229 -lib/axlsx/drawing/bar_series.rb 48eb4533dd8fa89c40a8ab05e78cdb7b8061fd62 -lib/axlsx/drawing/pie_series.rb 76c67a0227e913fb14eb70d756323974718e204a +lib/axlsx/drawing/pie_series.rb df339ed3eeb5692077e3a134339d04e77c9bc89b +lib/axlsx/drawing/bar_series.rb 044a3c42d3781755012c863ca138257b85ff5c0a lib/axlsx/stylesheet/gradient_fill.rb 5fd260ec2b94ab75a970159035528548a9d21cd6 lib/axlsx/workbook/worksheet/row.rb f866a98341ce4e604908e42d00f2af09e58c75d2 -lib/axlsx/util/simple_typed_list.rb 2ae647d5305acd9181c3303d5638db46d190b786 +lib/axlsx/util/simple_typed_list.rb b95f7e8d8958361cb1946b8545126b9384ff9fd2 lib/axlsx/workbook/workbook.rb ec98ed826e6c3ca9c6e3303dbfbe00c0b5fb9aee lib/axlsx/stylesheet/fill.rb 35966285f5d759d63451005ceae3a5ae5ba2ceca -lib/axlsx/drawing/view_3D.rb aca4d987f0c2cd5d0a653c96ac2bc1df9392583a +lib/axlsx/drawing/view_3D.rb c8e25d57901dd7d679fe7d1ed674d5549ab6f1b3 lib/axlsx/stylesheet/xf.rb e3d6e2e4c3b0b33c91de4c3db16c73aca3db4473 -lib/axlsx/drawing/two_cell_anchor.rb cc320f580ff9c639daa670f7ba1a1648bf26c157 +lib/axlsx/drawing/two_cell_anchor.rb a9400212ca7ed64263fd77826c3d336115cae185 lib/axlsx/stylesheet/styles.rb 3679a8fe86270bdef96f02bcf76f2eac27b1c2ef -lib/axlsx/drawing/val_axis.rb 710e67120c1262ef4cbbb56b632a568731df3215 -lib/axlsx/drawing/cat_axis.rb bf9eae6efae39b003a98b44cc437e6e9b4c51985 -lib/axlsx/stylesheet/font.rb 8b002d5fcba2fb0979858517f5254aadf96c7e58 +lib/axlsx/drawing/val_axis.rb da067622f8b09e6caf5067955b277d75ab3c8943 +lib/axlsx/drawing/cat_axis.rb f046262d1e8d04ff697fe29b88725225cd406cb2 lib/axlsx/util/validators.rb 2320eee50ceee29cc0dbab95721a6c633dc660e1 +lib/axlsx/stylesheet/font.rb 8b002d5fcba2fb0979858517f5254aadf96c7e58 lib/axlsx/doc_props/app.rb 52f01e985a33253987177798d4e79ed208649b30 -lib/axlsx/workbook/worksheet/worksheet.rb 1af6b7e4a54b41e770709c26ad7100ed516448b8 +lib/axlsx/workbook/worksheet/worksheet.rb ba299b3a4f1e82f7da4fb6e28fad264dd6e2fbed lib/axlsx/workbook/worksheet/cell.rb 939623ffc2065e9ec26bc56d9e289d9137fe57d3 lib/axlsx/rels/relationship.rb a160c998acf7fd0ab8195ea6162b1eb2eab4963c lib/axlsx/stylesheet/border.rb 517bfcb43380919ce7abef494d5d3e50911b7c19 -lib/axlsx/drawing/ser_axis.rb e1072fa920f084e22fc6ef4697d3f7d455fb0550 -lib/axlsx/drawing/drawing.rb ca457723c04ec7f2c9d3d16846b4cf0a9045da07 -lib/axlsx/drawing/chart.rb 059fa0f1af9e145f2b28871ea4aaa70653ec589f +lib/axlsx/drawing/ser_axis.rb 6d15f6cc2092ef5c3baa314ed1af793247418d9b +lib/axlsx/drawing/drawing.rb a5d71d9c7e86f15fdea03754ab258009035151dd +lib/axlsx/drawing/chart.rb 2907d74c75580cd5f029a71140a750d4e69c869e lib/axlsx/version.rb eb4274097b7f8f3f60e4e3dd8d57fb6bf6148f36 lib/axlsx/stylesheet/gradient_stop.rb de34e289aeccb4abd9a3b7e60e816a0b12ffacff +lib/axlsx/drawing/cat_axis_data.rb efc95067f90bf8d0bb4ce0fa6e35b7b9d642e8b5 +lib/axlsx/drawing/val_axis_data.rb c57c0abf5abb4aca9fba774f20e2f2c04d3020e8 lib/axlsx/doc_props/core.rb 90ebc8086f6606af02275c27068c359a5647faf0 -lib/axlsx/drawing/bar_3D_chart.rb 90ee990d00f63aaa8bfa23805580b3fea16a74ac +lib/axlsx/drawing/bar_3D_chart.rb e5199cf0a33e416ea5ddf66677031ee08e5c116f lib/axlsx/drawing/scaling.rb d3b59eed1897dc2b07bb41b2245c6e4b3e274d7e lib/axlsx/stylesheet/pattern_fill.rb 817cf55beb3db160b2b56edb6c94de1ecf1ecee7 -lib/axlsx/drawing/line_3D_chart.rb 062b83115dccb3b67c737faea1adf5f0cfce1cea +lib/axlsx/drawing/line_3D_chart.rb de0a2c8a49259e0348fd2c642c08eb4c567bcf1b diff --git a/.yardoc/objects/root.dat b/.yardoc/objects/root.dat index ddb44a40cf243e41f97d8f87a36347ad8802d439..489afdf0365c8309b51961a27936ff71ad13f811 100644 GIT binary patch literal 427683 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

$HZzs|$Ry1sz|i+YRi(WPe8q7L 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 [0,2], :end_at => [10, 15], :title=>"example 6: Line Chart") do |chart| + sheet.add_chart(Axlsx::Line3DChart, :title=>"example 6: Line Chart") do |chart| + chart.start_at 0, 2 + chart.end_at 10, 15 chart.add_series :data=>sheet.rows.first.cells[(1..-1)], :title=> sheet.rows.first.cells.first chart.add_series :data=>sheet.rows.last.cells[(1..-1)], :title=> sheet.rows.last.cells.first end + end p.serialize("example6.xlsx") @@ -147,19 +150,19 @@ This gem has 100% test coverage using test/unit. To execute tests for this gem, Changelog --------- -- **October.22.11**: 1.0.7 release +- **October.23.11**: 1.0.7 release preparation + - Added support for 3D options when creating a new chart. This lets you set the persective, rotation and other 3D attributes when using worksheet.add_chart - Updated serialization write test to verify write permissions and warn if it cannot run the test due to permission restrcitions. - - updated rake to include build, genoc and deploy commands. + - updated rake to include build, genoc and deploy tasks. - rebuilt documentation. - moved version constant to its own file - + - fixed bug in SerAxis that was requiring tickLblSkip and tickMarkSkip to be boolean. Should be unsigned int. + - Review and improve docs + - rebuild of anchor positioning to remove some spagetti code. Chart now supports a start_at and end_at method that accept an arrar for col/row positioning. See example6 for an example. You can still pass :start_at and :end_at options to worksheet.add_chart. + - Refactored cat and val axis data to keep series serialization a bit more DRY + Please see the {file:CHANGELOG.md} document for past release information. -On Deck -------- - -- Verification with ruby 1.9.3 -- Active Record support via package::serialize_ar so you can dump an AR result into a worksheet in one go. Copyright --------- diff --git a/doc/Axlsx.html b/doc/Axlsx.html index 1ec19a9a..02a04a9a 100644 --- a/doc/Axlsx.html +++ b/doc/Axlsx.html @@ -73,7 +73,7 @@

Defined in:
lib/axlsx/package.rb,
- lib/axlsx.rb,
lib/axlsx/version.rb,
lib/axlsx/drawing/axis.rb,
lib/axlsx/stylesheet/xf.rb,
lib/axlsx/doc_props/app.rb,
lib/axlsx/drawing/title.rb,
lib/axlsx/drawing/chart.rb,
lib/axlsx/drawing/series.rb,
lib/axlsx/util/constants.rb,
lib/axlsx/doc_props/core.rb,
lib/axlsx/drawing/marker.rb,
lib/axlsx/drawing/drawing.rb,
lib/axlsx/drawing/view_3D.rb,
lib/axlsx/stylesheet/fill.rb,
lib/axlsx/util/validators.rb,
lib/axlsx/drawing/scaling.rb,
lib/axlsx/stylesheet/font.rb,
lib/axlsx/drawing/ser_axis.rb,
lib/axlsx/stylesheet/color.rb,
lib/axlsx/drawing/cat_axis.rb,
lib/axlsx/drawing/val_axis.rb,
lib/axlsx/stylesheet/border.rb,
lib/axlsx/rels/relationship.rb,
lib/axlsx/stylesheet/styles.rb,
lib/axlsx/workbook/workbook.rb,
lib/axlsx/drawing/pie_series.rb,
lib/axlsx/drawing/bar_series.rb,
lib/axlsx/stylesheet/num_fmt.rb,
lib/axlsx/rels/relationships.rb,
lib/axlsx/drawing/line_series.rb,
lib/axlsx/drawing/bar_3D_chart.rb,
lib/axlsx/drawing/series_title.rb,
lib/axlsx/stylesheet/border_pr.rb,
lib/axlsx/drawing/pie_3D_chart.rb,
lib/axlsx/content_type/default.rb,
lib/axlsx/drawing/line_3D_chart.rb,
lib/axlsx/content_type/override.rb,
lib/axlsx/drawing/graphic_frame.rb,
lib/axlsx/stylesheet/cell_style.rb,
lib/axlsx/util/simple_typed_list.rb,
lib/axlsx/workbook/worksheet/row.rb,
lib/axlsx/stylesheet/table_style.rb,
lib/axlsx/workbook/worksheet/cell.rb,
lib/axlsx/stylesheet/pattern_fill.rb,
lib/axlsx/drawing/two_cell_anchor.rb,
lib/axlsx/stylesheet/table_styles.rb,
lib/axlsx/stylesheet/gradient_fill.rb,
lib/axlsx/stylesheet/gradient_stop.rb,
lib/axlsx/stylesheet/cell_alignment.rb,
lib/axlsx/content_type/content_type.rb,
lib/axlsx/stylesheet/cell_protection.rb,
lib/axlsx/workbook/worksheet/worksheet.rb,
lib/axlsx/stylesheet/table_style_element.rb
+ lib/axlsx.rb,
lib/axlsx/version.rb,
lib/axlsx/drawing/axis.rb,
lib/axlsx/doc_props/app.rb,
lib/axlsx/drawing/title.rb,
lib/axlsx/stylesheet/xf.rb,
lib/axlsx/drawing/chart.rb,
lib/axlsx/drawing/series.rb,
lib/axlsx/util/constants.rb,
lib/axlsx/drawing/marker.rb,
lib/axlsx/doc_props/core.rb,
lib/axlsx/drawing/view_3D.rb,
lib/axlsx/stylesheet/font.rb,
lib/axlsx/drawing/drawing.rb,
lib/axlsx/util/validators.rb,
lib/axlsx/drawing/scaling.rb,
lib/axlsx/stylesheet/fill.rb,
lib/axlsx/stylesheet/color.rb,
lib/axlsx/drawing/ser_axis.rb,
lib/axlsx/drawing/cat_axis.rb,
lib/axlsx/drawing/val_axis.rb,
lib/axlsx/stylesheet/border.rb,
lib/axlsx/workbook/workbook.rb,
lib/axlsx/stylesheet/styles.rb,
lib/axlsx/rels/relationship.rb,
lib/axlsx/drawing/bar_series.rb,
lib/axlsx/drawing/pie_series.rb,
lib/axlsx/rels/relationships.rb,
lib/axlsx/stylesheet/num_fmt.rb,
lib/axlsx/drawing/line_series.rb,
lib/axlsx/stylesheet/border_pr.rb,
lib/axlsx/drawing/series_title.rb,
lib/axlsx/content_type/default.rb,
lib/axlsx/drawing/bar_3D_chart.rb,
lib/axlsx/drawing/pie_3D_chart.rb,
lib/axlsx/drawing/line_3D_chart.rb,
lib/axlsx/stylesheet/cell_style.rb,
lib/axlsx/drawing/val_axis_data.rb,
lib/axlsx/content_type/override.rb,
lib/axlsx/drawing/cat_axis_data.rb,
lib/axlsx/drawing/graphic_frame.rb,
lib/axlsx/util/simple_typed_list.rb,
lib/axlsx/stylesheet/table_style.rb,
lib/axlsx/workbook/worksheet/row.rb,
lib/axlsx/stylesheet/table_styles.rb,
lib/axlsx/drawing/two_cell_anchor.rb,
lib/axlsx/workbook/worksheet/cell.rb,
lib/axlsx/stylesheet/pattern_fill.rb,
lib/axlsx/stylesheet/gradient_fill.rb,
lib/axlsx/stylesheet/gradient_stop.rb,
lib/axlsx/content_type/content_type.rb,
lib/axlsx/stylesheet/cell_alignment.rb,
lib/axlsx/stylesheet/cell_protection.rb,
lib/axlsx/workbook/worksheet/worksheet.rb,
lib/axlsx/stylesheet/table_style_element.rb
@@ -98,7 +98,7 @@

Overview

diff --git a/doc/Axlsx/App.html b/doc/Axlsx/App.html index ead90508..fcbd72ee 100644 --- a/doc/Axlsx/App.html +++ b/doc/Axlsx/App.html @@ -2631,7 +2631,7 @@

Returns:

diff --git a/doc/Axlsx/Axis.html b/doc/Axlsx/Axis.html index 7f4d1e0b..4ae315c3 100644 --- a/doc/Axlsx/Axis.html +++ b/doc/Axlsx/Axis.html @@ -95,7 +95,7 @@

Overview

-the access class defines common properties and values for chart axis +the access class defines common properties and values for a chart axis.

@@ -242,7 +242,7 @@

Instance Attribute Summary (collap

-The number format format code for this axis. +The number format format code for this axis default :General.

@@ -487,6 +487,25 @@

Options Hash (options):

+

Raises:

+
    + +
  • + + + (ArgumentError) + + + + — +

    +If axId or crossAx are not unsigned integers +

    +
    + +
  • + +

@@ -494,7 +513,6 @@

Options Hash (options):

 
 
-44
 45
 46
 47
@@ -507,20 +525,21 @@ 

Options Hash (options):

54 55 56 -57
+57 +58
-
# File 'lib/axlsx/drawing/axis.rb', line 44
+      
# File 'lib/axlsx/drawing/axis.rb', line 45
 
 def initialize(axId, crossAx, options={})
   Axlsx::validate_unsigned_int(axId)
   Axlsx::validate_unsigned_int(crossAx)
   @axId = axId
   @crossAx = crossAx
+  @scaling = Scaling.new(:orientation=>:minMax)
   self.axPos = :l
   self.tickLblPos = :nextTo
-  @scaling = Scaling.new(:orientation=>:minMax)
-  @formatCode = ""
+  self.format_code = "General"
   self.crosses = :autoZero
   options.each do |o|
     self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
@@ -550,7 +569,7 @@ 

Instance Attribute Details

-the id of the axis +the id of the axis.

@@ -578,12 +597,12 @@

Returns:

 
 
+7
 8
-9
-10
+9
-
# File 'lib/axlsx/drawing/axis.rb', line 8
+      
# File 'lib/axlsx/drawing/axis.rb', line 7
 
 def axId
   @axId
@@ -692,12 +711,12 @@ 

Returns:

 
 
+11
 12
-13
-14
+13
-
# File 'lib/axlsx/drawing/axis.rb', line 12
+      
# File 'lib/axlsx/drawing/axis.rb', line 11
 
 def crossAx
   @crossAx
@@ -779,7 +798,7 @@ 

Returns:

-The number format format code for this axis +The number format format code for this axis default :General

@@ -858,6 +877,13 @@

Returns:

+

See Also:

+ +
@@ -1003,7 +1029,6 @@

Returns:

 
 
-67
 68
 69
 70
@@ -1012,10 +1037,11 @@ 

Returns:

73 74 75 -76
+76 +77
-
# File 'lib/axlsx/drawing/axis.rb', line 67
+      
# File 'lib/axlsx/drawing/axis.rb', line 68
 
 def to_xml(xml)
   xml.send('c:axId', :val=>@axId)
@@ -1038,7 +1064,7 @@ 

Returns:

diff --git a/doc/Axlsx/Bar3DChart.html b/doc/Axlsx/Bar3DChart.html index 8cb43ac0..fcee1a86 100644 --- a/doc/Axlsx/Bar3DChart.html +++ b/doc/Axlsx/Bar3DChart.html @@ -106,54 +106,18 @@

Overview

-
-

Examples:

- -

-Creating a chart -

-

-
# This example creates two charts in a single sheet.
-# The first uses data directly fed to the sheet, while the second references cells withing the worksheet for data.
-
-require "rubygems" # if that is your preferred way to manage gems!
-require "axlsx"
-
-p = Axlsx::Package.new
-ws = p.workbook.add_worksheet
-ws.add_row :values => ["This is a chart with no data in the sheet"]
-
-chart = ws.add_chart(Axlsx::Bar3DChart, :start_at=> [0,1], :end_at=>[0,6], :title=>"Most Popular Pets")
-chart.add_series :data => [1, 9, 10], :labels => ["Slimy Reptiles", "Fuzzy Bunnies", "Rottweiler"]
-
-ws.add_row :values => ["This chart uses the data below"]
-title_row = ws.add_row :values => ["Least Popular Pets"]
-label_row = ws.add_row :values => ["", "Dry Skinned Reptiles", "Bald Cats", "Violent Parrots"]
-data_row = ws.add_row :values => ["Votes", 6, 4, 1]
-
-chart = ws.add_chart(Axlsx::Pie3DChart, :start_at => [0,11], :end_at =>[0,16], :title => title_row.cells.last)
-chart.add_series :data => data_row.cells[(1..-1)], :labels => label_row.cells  
-
-f = File.open('example_pie_3d_chart.xlsx', 'w')
-p.serialize(f)
-
- -
-

See Also:

@@ -347,8 +311,8 @@

Instance Attribute Summary (collap

-The shabe of the bars or columns must be one of [:percentStacked, -:clustered, :standard, :stacked]. +The shabe of the bars or columns must be one of [:cone, :coneToMax, :box, +:cylinder, :pyramid, :pyramidToMax].

@@ -375,7 +339,7 @@

Instance Attribute Summary (collap

-the category axis. +the valueaxis.

@@ -392,7 +356,7 @@

Instance Attribute Summary (collap

Attributes inherited from Chart

-

end_at, graphic_frame, index, pn, series, series_type, show_legend, start_at, style, title, view3D

+

graphic_frame, index, pn, series, series_type, show_legend, style, title, view3D

@@ -465,7 +429,7 @@

Methods inherited from Chart

-

#add_series

+

#add_series, #end_at, #from, #start_at, #to

Constructor Details

@@ -598,30 +562,93 @@

Options Hash (options):

+
  • + rotX + (Integer) + + + + +
  • + +
  • + hPercent + (String) + + + + +
  • + +
  • + rotY + (Integer) + + + + +
  • + +
  • + depthPercent + (String) + + + + +
  • + +
  • + rAngAx + (Boolean) + + + + +
  • + +
  • + perspective + (Integer) + + + + +
  • + +

    See Also:

    + +
    @@ -686,12 +713,12 @@

    Returns:

     
     
    -47
    -48
    -49
    +21 +22 +23 @@ -674,73 +674,15 @@

    Returns:

    46 47 48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 +49 @@ -529,12 +532,12 @@

    Returns:

     
     
    -6
     7
    -8
    +8 +9 @@ -1137,19 +1138,19 @@

    Returns:

    - - + +
    -

    +

    - - (Integer) style + - (Title) title

    -The style for the chart. see ECMA Part 1 §21.2.2.196 +The title object for the chart.

    @@ -1163,7 +1164,7 @@

    Returns:

  • - (Integer) + (Title) @@ -1177,15 +1178,15 @@

    Returns:

     
     
    -14
    -15
    -16
    +37 +38 +39
  • @@ -1194,19 +1195,67 @@

    Returns:

    - - + +
    -

    +

    - - (Title) title + - (Object) view3D

    -The title object for the chart. +The 3D view properties for the chart +

    + + +
    +
    +
    + + +
     
     
    -79
    -80
    -81
    -82
    -83
    -84
    -85
    -86
    -87
    -88
    -89
    +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71
    -
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 79
    +      
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 61
     
     def initialize(frame, options={})
       @barDir = :bar
    @@ -630,9 +657,9 @@ 

    Options Hash (options):

    @valAxId = rand(8 ** 8) @catAxis = CatAxis.new(@catAxId, @valAxId) @valAxis = ValAxis.new(@valAxId, @catAxId) - @view3D = View3D.new(:rAngAx=>1) super(frame, options) @series_type = BarSeries + @view3D = View3D.new({:rAngAx=>1}.merge(options)) end
    -
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 47
    +      
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 21
     
     def barDir
       @barDir
    @@ -743,12 +770,12 @@ 

    Returns:

     
     
    -38
    -39
    -40
    +12 +13 +14
    -
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 38
    +      
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 12
     
     def catAxis
       @catAxis
    @@ -801,12 +828,12 @@ 

    Returns:

     
     
    -51
    -52
    -53
    +25 +26 +27
    -
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 51
    +      
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 25
     
     def gapDepth
       @gapDepth
    @@ -859,12 +886,12 @@ 

    Returns:

     
     
    -55
    -56
    -57
    +29 +30 +31
    -
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 55
    +      
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 29
     
     def gapWidth
       @gapWidth
    @@ -917,12 +944,12 @@ 

    Returns:

     
     
    -60
    -61
    -62
    +34 +35 +36
    -
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 60
    +      
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 34
     
     def grouping
       @grouping
    @@ -946,8 +973,8 @@ 

    Returns:

    -The shabe of the bars or columns must be one of [:percentStacked, -:clustered, :standard, :stacked] +The shabe of the bars or columns must be one of [:cone, :coneToMax, :box, +:cylinder, :pyramid, :pyramidToMax]

    @@ -975,12 +1002,12 @@

    Returns:

     
     
    -65
    -66
    -67
    +39 +40 +41
    -
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 65
    +      
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 39
     
     def shape
       @shape
    @@ -1004,7 +1031,7 @@ 

    Returns:

    -the category axis +the valueaxis

    @@ -1032,12 +1059,12 @@

    Returns:

     
     
    -42
    -43
    -44
    +16 +17 +18
    -
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 42
    +      
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 16
     
     def valAxis
       @valAxis
    @@ -1093,27 +1120,27 @@ 

    Returns:

     
     
    -119
    -120
    -121
    -122
    -123
    -124
    -125
    -126
    -127
    -128
    -129
    -130
    -131
    -132
    -133
    -134
    -135
    -136
    +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118
    -
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 119
    +      
    # File 'lib/axlsx/drawing/bar_3D_chart.rb', line 101
     
     def to_xml
       super() do |xml|
    @@ -1144,7 +1171,7 @@ 

    Returns:

    diff --git a/doc/Axlsx/BarSeries.html b/doc/Axlsx/BarSeries.html index 749762da..303d12f3 100644 --- a/doc/Axlsx/BarSeries.html +++ b/doc/Axlsx/BarSeries.html @@ -416,8 +416,8 @@

    Options Hash (options):

    def initialize(chart, options={}) @shape = :box super(chart, options) - self.data = options[:data] || [] - self.labels = options[:labels] || [] + self.labels = CatAxisData.new(options[:labels]) unless options[:labels].nil? + self.data = ValAxisData.new(options[:data]) unless options[:data].nil? end
    # File 'lib/axlsx/drawing/bar_series.rb', line 43
     
     def to_xml(xml)
       super(xml) do |xml|
    -    if !labels.empty?
    -      xml.send('c:cat') {
    -        xml.send('c:strRef') {
    -          xml.send('c:f', Axlsx::cell_range(labels))
    -          xml.send('c:strCache') {
    -            xml.send('c:ptCount', :val=>labels.size)
    -            labels.each_with_index do |cell, index|
    -              v = cell.is_a?(Cell) ? cell.value : cell
    -              xml.send('c:pt', :idx=>index) {
    -                xml.send('c:v', v)
    -              }                          
    -            end
    -          }
    -        }
    -      }
    -    end
    -    xml.send('c:val') {
    -      xml.send('c:numRef') {
    -        xml.send('c:f', Axlsx::cell_range(data))
    -        xml.send('c:numCache') {
    -          xml.send('c:formatCode', 'General')
    -          xml.send('c:ptCount', :val=>data.size)
    -          data.each_with_index do |cell, index|
    -            v = cell.is_a?(Cell) ? cell.value : cell
    -            xml.send('c:pt', :idx=>index) {
    -              xml.send('c:v', v) 
    -            }
    -          end
    -        }                        
    -      }
    -    }
    +    @labels.to_xml(xml) unless @labels.nil?
    +    @data.to_xml(xml) unless @data.nil?
         xml.send('c:shape', :val=>@shape)
       end      
     end
    @@ -755,7 +697,7 @@ 

    Returns:

    diff --git a/doc/Axlsx/Border.html b/doc/Axlsx/Border.html index acb2adbc..209a4388 100644 --- a/doc/Axlsx/Border.html +++ b/doc/Axlsx/Border.html @@ -766,7 +766,7 @@

    Parameters:

    diff --git a/doc/Axlsx/BorderPr.html b/doc/Axlsx/BorderPr.html index cbacb66f..e4bcb6ab 100644 --- a/doc/Axlsx/BorderPr.html +++ b/doc/Axlsx/BorderPr.html @@ -700,7 +700,7 @@

    Returns:

    diff --git a/doc/Axlsx/CatAxis.html b/doc/Axlsx/CatAxis.html index 82f7c980..5babf097 100644 --- a/doc/Axlsx/CatAxis.html +++ b/doc/Axlsx/CatAxis.html @@ -336,7 +336,7 @@

    Parameters:

    -the id of this axis +the id of this axis. Inherited

    @@ -353,7 +353,7 @@

    Parameters:

    -the id of the perpendicular axis +the id of the perpendicular axis. Inherited

    @@ -391,30 +391,39 @@

    Options Hash (options):

    • - axPos + axPos. (Symbol) - + —

      +Inherited +

      +
    • - tickLblPos + tickLblPos. (Symbol) - + —

      +Inherited +

      +
    • - crosses + crosses. (Symbol) - + —

      +Inherited +

      +
    • @@ -454,27 +463,21 @@

      Options Hash (options):

       
       
      -30
       31
       32
       33
       34
       35
      -36
      -37
      -38
      +36
    -
    # File 'lib/axlsx/drawing/cat_axis.rb', line 30
    +      
    # File 'lib/axlsx/drawing/cat_axis.rb', line 31
     
     def initialize(axId, crossAx, options={})
    -  super(axId, crossAx, options)
       self.auto = true
       self.lblAlgn = :ctr
       self.lblOffset = "100%"
    -  options.each do |o|
    -    self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
    -  end
    +  super(axId, crossAx, options)
     end
     
    -
    # File 'lib/axlsx/drawing/cat_axis.rb', line 6
    +      
    # File 'lib/axlsx/drawing/cat_axis.rb', line 7
     
     def auto
       @auto
    @@ -587,12 +590,12 @@ 

    Returns:

     
     
    -11
     12
    -13
    +13 +14
    -
    # File 'lib/axlsx/drawing/cat_axis.rb', line 11
    +      
    # File 'lib/axlsx/drawing/cat_axis.rb', line 12
     
     def lblAlgn
       @lblAlgn
    @@ -644,12 +647,12 @@ 

    Returns:

     
     
    -16
     17
    -18
    +18 +19
    -
    # File 'lib/axlsx/drawing/cat_axis.rb', line 16
    +      
    # File 'lib/axlsx/drawing/cat_axis.rb', line 17
     
     def lblOffset
       @lblOffset
    @@ -726,17 +729,17 @@ 

    Returns:

     
     
    +45
    +46
     47
     48
     49
     50
     51
    -52
    -53
    -54
    +52
    -
    # File 'lib/axlsx/drawing/cat_axis.rb', line 47
    +      
    # File 'lib/axlsx/drawing/cat_axis.rb', line 45
     
     def to_xml(xml)
       xml.send('c:catAx') {
    @@ -757,7 +760,7 @@ 

    Returns:

    diff --git a/doc/Axlsx/CatAxisData.html b/doc/Axlsx/CatAxisData.html new file mode 100644 index 00000000..fd0ea3aa --- /dev/null +++ b/doc/Axlsx/CatAxisData.html @@ -0,0 +1,400 @@ + + + + + + Class: Axlsx::CatAxisData + + — Documentation by YARD 0.7.3 + + + + + + + + + + + + + + + + + + + + + + +

    Class: Axlsx::CatAxisData + + + +

    + +
    + +
    Inherits:
    +
    + SimpleTypedList + + + show all + +
    + + + + + + + + + +
    Defined in:
    +
    lib/axlsx/drawing/cat_axis_data.rb
    + +
    +
    + +

    Overview

    +
    +

    +The CatAxisData class serializes the category axis data for a chart +

    + + +
    +
    +
    + + +
    +

    Direct Known Subclasses

    +

    ValAxisData

    +
    + + + + + + + + + + + +

    Instance Attribute Summary

    + +

    Attributes inherited from SimpleTypedList

    +

    allowed_types, locked_at, serialize_as

    + + + +

    + Instance Method Summary + (collapse) +

    + + + + + + + + + + + + +

    Methods inherited from SimpleTypedList

    +

    #<<, #==, #[]=, #delete, #delete_at, #lock, #method_missing, #protected?, #push, #unlock

    +
    +

    Constructor Details

    + +
    +

    + + - (CatAxisData) initialize(data = []) + + + +

    +
    +

    +Create a new CatAxisData object +

    + + +
    +
    +
    +

    Parameters:

    +
      + +
    • + + data + + + (Array, SimpleTypedList) + + + (defaults to: []) + + + — +

      +the data for this category axis. This can be a simple array or a simple +typed list of cells. +

      +
      + +
    • + +
    + + +
    + + + + +
    +
    +
    +
    +7
    +8
    +9
    +10
    +
    +
    # File 'lib/axlsx/drawing/cat_axis_data.rb', line 7
    +
    +def initialize(data=[])
    +  super Object
    +  @list.concat data if data.is_a?(Array)
    +end
    +
    +
    +
    + +
    +
    +

    Dynamic Method Handling

    +

    + This class handles dynamic methods through the method_missing method + + in the class Axlsx::SimpleTypedList + +

    + +
    + + +
    +

    Instance Method Details

    + + +
    +

    + + - (String) to_xml(xml) + + + +

    +
    +

    +Serializes the category axis data +

    + + +
    +
    +
    +

    Parameters:

    +
      + +
    • + + xml + + + (Nokogiri::XML::Builder) + + + + — +

      +The document builder instance this objects xml will be added to. +

      +
      + +
    • + +
    + +

    Returns:

    +
      + +
    • + + + (String) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +
    +
    # File 'lib/axlsx/drawing/cat_axis_data.rb', line 15
    +
    +def to_xml(xml)
    +  xml.send('c:cat') {
    +    xml.send('c:strRef') {
    +      xml.send('c:f', Axlsx::cell_range(@list))
    +      xml.send('c:strCache') {
    +        xml.send('c:ptCount', :val=>size)
    +        each_with_index do |item, index|
    +          v = item.is_a?(Cell) ? item.value : item
    +          xml.send('c:pt', :idx=>index) {
    +            xml.send('c:v', v)
    +          }                          
    +        end
    +      }
    +    }
    +  }
    +end
    +
    +
    +
    + +
    + +
    + + + + + \ No newline at end of file diff --git a/doc/Axlsx/Cell.html b/doc/Axlsx/Cell.html index 44da43ed..bef1219e 100644 --- a/doc/Axlsx/Cell.html +++ b/doc/Axlsx/Cell.html @@ -1614,7 +1614,7 @@

    Returns:

    diff --git a/doc/Axlsx/CellAlignment.html b/doc/Axlsx/CellAlignment.html index 3da3113f..4ac86068 100644 --- a/doc/Axlsx/CellAlignment.html +++ b/doc/Axlsx/CellAlignment.html @@ -1238,7 +1238,7 @@

    Returns:

    diff --git a/doc/Axlsx/CellProtection.html b/doc/Axlsx/CellProtection.html index 9088a55b..267d5865 100644 --- a/doc/Axlsx/CellProtection.html +++ b/doc/Axlsx/CellProtection.html @@ -556,7 +556,7 @@

    Returns:

    diff --git a/doc/Axlsx/CellStyle.html b/doc/Axlsx/CellStyle.html index a8769cbe..26d4d512 100644 --- a/doc/Axlsx/CellStyle.html +++ b/doc/Axlsx/CellStyle.html @@ -940,7 +940,7 @@

    Returns:

    diff --git a/doc/Axlsx/Chart.html b/doc/Axlsx/Chart.html index 2f1a6465..6665f8a0 100644 --- a/doc/Axlsx/Chart.html +++ b/doc/Axlsx/Chart.html @@ -114,6 +114,13 @@

    Overview

    +

    See Also:

    +
      + +
    • for examples
    • + +
    +

    Direct Known Subclasses

    Bar3DChart, Line3DChart, Pie3DChart

    @@ -126,14 +133,14 @@

    Instance Attribute Summary (collap
  • - - (Marker) end_at + - (GraphicFrame) graphic_frame - + readonly @@ -143,7 +150,7 @@

    Instance Attribute Summary (collap

    -The ending marker for this chart. +A reference to the graphic frame that owns this chart.

    @@ -153,7 +160,7 @@

    Instance Attribute Summary (collap
  • - - (GraphicFrame) graphic_frame + - (Integer) index @@ -170,7 +177,7 @@

    Instance Attribute Summary (collap

    -A reference to the graphic frame that owns this chart. +The index of this chart in the workbooks charts collection.

    @@ -180,7 +187,7 @@

    Instance Attribute Summary (collap
  • - - (Integer) index + - (String) pn @@ -197,7 +204,7 @@

    Instance Attribute Summary (collap

    -The index of this chart in the workbooks charts collection. +The part name for this chart.

    @@ -207,7 +214,7 @@

    Instance Attribute Summary (collap
  • - - (String) pn + - (SimpleTypedList) series @@ -224,7 +231,7 @@

    Instance Attribute Summary (collap

    -The part name for this chart. +A collection of series objects that are applied to the chart.

    @@ -234,7 +241,7 @@

    Instance Attribute Summary (collap
  • - - (SimpleTypedList) series + - (Series) series_type @@ -251,7 +258,7 @@

    Instance Attribute Summary (collap

    -A collection of series objects that are applied to the chart. +The type of series to use for this chart.

    @@ -261,14 +268,14 @@

    Instance Attribute Summary (collap
  • - - (Series) series_type + - (Boolean) show_legend - readonly + @@ -278,7 +285,7 @@

    Instance Attribute Summary (collap

    -The type of series to use for this chart. +Show the legend in the chart.

    @@ -288,7 +295,7 @@

    Instance Attribute Summary (collap
  • - - (Boolean) show_legend + - (Integer) style @@ -305,7 +312,7 @@

    Instance Attribute Summary (collap

    -Show the legend in the chart. +The style for the chart.

    @@ -315,7 +322,7 @@

    Instance Attribute Summary (collap
  • - - (Marker) start_at + - (Title) title @@ -332,7 +339,7 @@

    Instance Attribute Summary (collap

    -The starting marker for this chart. +The title object for the chart.

    @@ -342,7 +349,7 @@

    Instance Attribute Summary (collap
  • - - (Integer) style + - (Object) view3D @@ -359,26 +366,36 @@

    Instance Attribute Summary (collap

    -The style for the chart. +The 3D view properties for the chart.

  • -
  • + + + + + + +

    + Instance Method Summary + (collapse) +

    + + - - + + + + constructor + + + + + + -

    - Instance Method Summary - (collapse) -

    +

    +Creates a new chart object. +

    +
    + +
  • -
    • - - (Series) add_series(options = {}) + - (Marker) start_at(x, y) @@ -450,7 +503,9 @@

      -Adds a new series to the chart’s series collection. +This is a short cut method to set the start anchor position If you need +finer granularity in positioning use graphic_frame.anchor.from.colOff / +rowOff.

      @@ -460,14 +515,12 @@

    • - - (Chart) initialize(frame, options = {}) {|_self| ... } + - (Object) to - constructor - @@ -476,7 +529,8 @@

      -Creates a new chart object. +backwards compatibility to allow chart.to and chart.from access to anchor +markers.

      @@ -641,6 +695,12 @@

      Yield Parameters:

       
       
      +52
      +53
      +54
      +55
      +56
      +57
       58
       59
       60
      @@ -648,14 +708,10 @@ 

      Yield Parameters:

      62 63 64 -65 -66 -67 -68 -69
      +65

  • -
    # File 'lib/axlsx/drawing/chart.rb', line 58
    +      
    # File 'lib/axlsx/drawing/chart.rb', line 52
     
     def initialize(frame, options={})
       @style = 2
    @@ -667,6 +723,8 @@ 

    Yield Parameters:

    options.each do |o| self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}=" end + start_at *options[:start_at] if options[:start_at] + end_at *options[:end_at] if options[:start_at] yield self if block_given? end
    @@ -681,67 +739,10 @@

    Yield Parameters:

    Instance Attribute Details

    - - -
    -

    - - - (Marker) end_at - - - -

    -
    -

    -The ending marker for this chart -

    - - -
    -
    -
    - -

    Returns:

    -
      - -
    • - - - (Marker) - - - -
    • - -
    - -
    - - - - -
    -
    -
    -
    -48
    -49
    -50
    -
    -
    # File 'lib/axlsx/drawing/chart.rb', line 48
    -
    -def end_at
    -  @end_at
    -end
    -
    -
    -
    - - -
    -

    +

    +

    - (GraphicFrame) graphic_frame (readonly) @@ -778,12 +779,12 @@

    Returns:

     
     
    -21
    -22
    -23
    +14 +15 +16
    -
    # File 'lib/axlsx/drawing/chart.rb', line 21
    +      
    # File 'lib/axlsx/drawing/chart.rb', line 14
     
     def graphic_frame
       @graphic_frame
    @@ -835,12 +836,12 @@ 

    Returns:

     
     
    -33
    -34
    -35
    +26 +27 +28
    -
    # File 'lib/axlsx/drawing/chart.rb', line 33
    +      
    # File 'lib/axlsx/drawing/chart.rb', line 26
     
     def index
       @graphic_frame.anchor.drawing.worksheet.workbook.charts.index(self)
    @@ -892,12 +893,12 @@ 

    Returns:

     
     
    -37
    -38
    -39
    +30 +31 +32
    -
    # File 'lib/axlsx/drawing/chart.rb', line 37
    +      
    # File 'lib/axlsx/drawing/chart.rb', line 30
     
     def pn
       "#{CHART_PN % (index+1)}"
    @@ -949,12 +950,12 @@ 

    Returns:

     
     
    -25
    -26
    -27
    +18 +19 +20
    -
    # File 'lib/axlsx/drawing/chart.rb', line 25
    +      
    # File 'lib/axlsx/drawing/chart.rb', line 18
     
     def series
       @series
    @@ -978,7 +979,7 @@ 

    Returns:

    -The type of series to use for this chart +The type of series to use for this chart.

    @@ -1006,12 +1007,12 @@

    Returns:

     
     
    -29
    -30
    -31
    +22 +23 +24
    -
    # File 'lib/axlsx/drawing/chart.rb', line 29
    +      
    # File 'lib/axlsx/drawing/chart.rb', line 22
     
     def series_type
       @series_type
    @@ -1063,12 +1064,12 @@ 

    Returns:

     
     
    -52
    -53
    -54
    +46 +47 +48
    -
    # File 'lib/axlsx/drawing/chart.rb', line 52
    +      
    # File 'lib/axlsx/drawing/chart.rb', line 46
     
     def show_legend
       @show_legend
    @@ -1080,19 +1081,19 @@ 

    Returns:

    - - + +
    -

    +

    - - (Marker) start_at + - (Integer) style

    -The starting marker for this chart +The style for the chart. see ECMA Part 1 §21.2.2.196

    @@ -1106,7 +1107,7 @@

    Returns:

  • - (Marker) + (Integer) @@ -1120,15 +1121,15 @@

    Returns:

     
     
    -44
    -45
    -46
    +42 +43 +44
  • -
    # File 'lib/axlsx/drawing/chart.rb', line 44
    +      
    # File 'lib/axlsx/drawing/chart.rb', line 42
     
    -def start_at
    -  @start_at
    +def style
    +  @style
     end
     
    -
    # File 'lib/axlsx/drawing/chart.rb', line 14
    +      
    # File 'lib/axlsx/drawing/chart.rb', line 37
     
    -def style
    -  @style
    +def title
    +  @title
     end
     
    + + + + +
    +
    +
    +
    +10
    +11
    +12
    +
    +
    # File 'lib/axlsx/drawing/chart.rb', line 10
    +
    +def view3D
    +  @view3D
    +end
    +
    +
    + + + + + +
    +

    Instance Method Details

    + + +
    +

    + + - (Series) add_series(options = {}) + + + +

    +
    +

    +Adds a new series to the chart’s series collection.

    @@ -1220,7 +1269,7 @@

    Returns:

  • - (Title) + (Series) @@ -1228,21 +1277,30 @@

    Returns:

    +

    See Also:

    + +
  • @@ -1250,27 +1308,76 @@

    Returns:

     
     
    -9
    -10
    -11
    +101 +102 +103 +104
    -
    # File 'lib/axlsx/drawing/chart.rb', line 9
    +      
    # File 'lib/axlsx/drawing/chart.rb', line 101
     
    -def title
    -  @title
    +def add_series(options={})
    +  @series_type.new(self, options)
    +  @series.last
     end
     
    - - -
    -

    +

    - - (Object) view3D + - (Marker) end_at(x, y)

    -The 3D view properties for the chart +This is a short cut method to set the end anchor position If you need finer +granularity in positioning use graphic_frame.anchor.to.colOff / rowOff

    +

    Parameters:

    +
      + +
    • + + x + + + (Integer) + + + + — +

      +The column +

      +
      + +
    • + +
    • + + y + + + (Integer) + + + + — +

      +The row +

      +
      + +
    • +
    + +

    Returns:

    +
      + +
    • + + + (Marker) + + + +
    • + +
    @@ -1278,15 +1385,17 @@

    Returns:

     
     
    -17
    -18
    -19
    +149 +150 +151 +152 @@ -1294,38 +1403,122 @@

    Returns:

    -
    # File 'lib/axlsx/drawing/chart.rb', line 17
    +      
    # File 'lib/axlsx/drawing/chart.rb', line 149
     
    -def view3D
    -  @view3D
    +def end_at(x, y)
    +  @graphic_frame.anchor.to.col = x
    +  @graphic_frame.anchor.to.row = y
     end
     
    +
    +

    + + - (Object) from + + + +

    +
    + +
    + Note: +

    +This will be disconinued in version 2.0.0. please use the start_at method +

    +
    +

    +backwards compatibility to allow chart.to and chart.from access to anchor +markers +

    -
    -

    Instance Method Details

    - + +
    +
    +
    + + +
    + + + + +
    +
    +
    +
    +94
    +95
    +96
    +
    +
    # File 'lib/axlsx/drawing/chart.rb', line 94
    +
    +def from
    +  @graphic_frame.anchor.from
    +end
    +
    +
    +
    -
    -

    +

    +

    - - (Series) add_series(options = {}) + - (Marker) start_at(x, y)

    -Adds a new series to the chart’s series collection. +This is a short cut method to set the start anchor position If you need +finer granularity in positioning use graphic_frame.anchor.from.colOff / +rowOff

    +

    Parameters:

    +
      +
    • + + x + + + (Integer) + + + + — +

      +The column +

      +
      + +
    • + +
    • + + y + + + (Integer) + + + + — +

      +The row +

      +
      + +
    • + +
    +

    Returns:

    -

    See Also:

    -
      +
    + + + + +
    +
    +
    +
    +138
    +139
    +140
    +141
    +
    +
    # File 'lib/axlsx/drawing/chart.rb', line 138
    +
    +def start_at(x, y)
    +  @graphic_frame.anchor.from.col = x
    +  @graphic_frame.anchor.from.row = y
    +end
    +
    +
    +
    -
  • Series
  • +
    +

    + + - (Object) to + + + +

    +
    - +
    + Note: +

    +This will be disconinued in version 2.0.0. Please use the end_at method +

    +
    +
    + +

    +backwards compatibility to allow chart.to and chart.from access to anchor +markers +

    + + +
    +
    +
    +
    @@ -1346,17 +1585,15 @@

    See Also:

     
     
    -94
    -95
    -96
    -97
    +87 +88 +89 @@ -1389,13 +1626,6 @@

    See Also:

     
     
    -101
    -102
    -103
    -104
    -105
    -106
    -107
     108
     109
     110
    @@ -1411,10 +1641,17 @@ 

    See Also:

    120 121 122 -123
    +123 +124 +125 +126 +127 +128 +129 +130
    -
    # File 'lib/axlsx/drawing/chart.rb', line 94
    +      
    # File 'lib/axlsx/drawing/chart.rb', line 87
     
    -def add_series(options={})
    -  @series_type.new(self, options)
    -  @series.last
    +def to
    +  @graphic_frame.anchor.to
     end
     
    -
    # File 'lib/axlsx/drawing/chart.rb', line 101
    +      
    # File 'lib/axlsx/drawing/chart.rb', line 108
     
     def to_xml
       builder = Nokogiri::XML::Builder.new(:encoding => ENCODING) do |xml|
    @@ -1450,7 +1687,7 @@ 

    See Also:

    diff --git a/doc/Axlsx/Color.html b/doc/Axlsx/Color.html index e856e81f..e1479faf 100644 --- a/doc/Axlsx/Color.html +++ b/doc/Axlsx/Color.html @@ -656,7 +656,7 @@

    Returns:

    diff --git a/doc/Axlsx/ContentType.html b/doc/Axlsx/ContentType.html index 293926d4..21d7c70d 100644 --- a/doc/Axlsx/ContentType.html +++ b/doc/Axlsx/ContentType.html @@ -194,7 +194,7 @@

    Methods inherited from SimpleTypedList

    -

    #<<, #[]=, #delete, #delete_at, #lock, #method_missing, #protected?, #push, #unlock

    +

    #<<, #==, #[]=, #delete, #delete_at, #lock, #method_missing, #protected?, #push, #unlock

    Constructor Details

    @@ -331,7 +331,7 @@

    Returns:

    diff --git a/doc/Axlsx/Core.html b/doc/Axlsx/Core.html index 1271d383..ed241c2b 100644 --- a/doc/Axlsx/Core.html +++ b/doc/Axlsx/Core.html @@ -456,7 +456,7 @@

    Returns:

    diff --git a/doc/Axlsx/DataTypeValidator.html b/doc/Axlsx/DataTypeValidator.html index dedc619a..6f2f98ac 100644 --- a/doc/Axlsx/DataTypeValidator.html +++ b/doc/Axlsx/DataTypeValidator.html @@ -315,7 +315,7 @@

    See Also:

    diff --git a/doc/Axlsx/Default.html b/doc/Axlsx/Default.html index 27bf8b21..b53c8ea5 100644 --- a/doc/Axlsx/Default.html +++ b/doc/Axlsx/Default.html @@ -566,7 +566,7 @@

    Returns:

    diff --git a/doc/Axlsx/Drawing.html b/doc/Axlsx/Drawing.html index 82b6dd0a..1d2bce32 100644 --- a/doc/Axlsx/Drawing.html +++ b/doc/Axlsx/Drawing.html @@ -99,14 +99,16 @@

    Overview

    Note:

    The recommended way to manage drawings is to use the Worksheet.add_chart -method, specifying the chart class, start and end marker locations. +method.

    A Drawing is a canvas for charts. Each worksheet has a single drawing that -can specify multiple anchors which reference charts. +manages anchors. The anchors reference the charts via graphical frames. +This is not a trivial relationship so please do follow the advice in the +note. see README for an example of how to create a chart.

    @@ -120,8 +122,6 @@

    See Also:

  • Worksheet#add_chart
  • -
  • TwoCellAnchor
  • -
  • Chart
  • @@ -151,7 +151,8 @@

    Instance Attribute Summary (collap

    -A collection of anchors for this drawing. +A collection of anchors for this drawing only TwoCellAnchors are supported +in this version.

    @@ -487,15 +488,15 @@

    Parameters:

     
     
    -67
    -68
    -69
    -70
     71
    -72
    +72 +73 +74 +75 +76

    -
    # File 'lib/axlsx/drawing/drawing.rb', line 67
    +      
    # File 'lib/axlsx/drawing/drawing.rb', line 71
     
     def initialize(worksheet)
       DataTypeValidator.validate "Drawing.worksheet", Worksheet, worksheet
    @@ -527,7 +528,8 @@ 

    Instance Attribute Details

    -A collection of anchors for this drawing +A collection of anchors for this drawing only TwoCellAnchors are supported +in this version

    @@ -555,12 +557,12 @@

    Returns:

     
     
    -39
    -40
    -41
    +43 +44 +45
    -
    # File 'lib/axlsx/drawing/drawing.rb', line 39
    +      
    # File 'lib/axlsx/drawing/drawing.rb', line 43
     
     def anchors
       @anchors
    @@ -612,12 +614,12 @@ 

    Returns:

     
     
    -43
    -44
    -45
    +47 +48 +49
    -
    # File 'lib/axlsx/drawing/drawing.rb', line 43
    +      
    # File 'lib/axlsx/drawing/drawing.rb', line 47
     
     def charts
       @anchors.map { |a| a.graphic_frame.chart }
    @@ -670,12 +672,12 @@ 

    Returns:

     
     
    -47
    -48
    -49
    +51 +52 +53
    -
    # File 'lib/axlsx/drawing/drawing.rb', line 47
    +      
    # File 'lib/axlsx/drawing/drawing.rb', line 51
     
     def index
       @worksheet.workbook.drawings.index(self)
    @@ -727,12 +729,12 @@ 

    Returns:

     
     
    -55
    -56
    -57
    +59 +60 +61
    -
    # File 'lib/axlsx/drawing/drawing.rb', line 55
    +      
    # File 'lib/axlsx/drawing/drawing.rb', line 59
     
     def pn
       "#{DRAWING_PN % (index+1)}"
    @@ -784,17 +786,17 @@ 

    Returns:

     
     
    -63
    -64
    -65
    -66
     67
     68
     69
    -70
    +70 +71 +72 +73 +74
    -
    # File 'lib/axlsx/drawing/drawing.rb', line 63
    +      
    # File 'lib/axlsx/drawing/drawing.rb', line 67
     
     def relationships
       r = Relationships.new
    @@ -851,12 +853,12 @@ 

    Returns:

     
     
    -59
    -60
    -61
    +63 +64 +65
    -
    # File 'lib/axlsx/drawing/drawing.rb', line 59
    +      
    # File 'lib/axlsx/drawing/drawing.rb', line 63
     
     def rels_pn
       "#{DRAWING_RELS_PN % (index+1)}"
    @@ -908,12 +910,12 @@ 

    Returns:

     
     
    -51
    -52
    -53
    +55 +56 +57
    -
    # File 'lib/axlsx/drawing/drawing.rb', line 51
    +      
    # File 'lib/axlsx/drawing/drawing.rb', line 55
     
     def rId
       "rId#{index+1}"
    @@ -965,12 +967,12 @@ 

    Returns:

     
     
    -34
    -35
    -36
    +38 +39 +40
    -
    # File 'lib/axlsx/drawing/drawing.rb', line 34
    +      
    # File 'lib/axlsx/drawing/drawing.rb', line 38
     
     def worksheet
       @worksheet
    @@ -1001,7 +1003,8 @@ 

    Instance Method Details

    Note:

    -The recommended way to manage charts is to use Worksheet.add_chart. +The recommended way to manage charts is to use Worksheet.add_chart. Please +refer to that method for documentation.

    @@ -1014,41 +1017,14 @@

    Instance Method Details

    -

    Parameters:

    -
      -
    • - - chart_type - - - (Chart) - - - - — -

      -The class of the chart to be added to the drawing -

      -
      - -
    • - -
    • - - options - - - (Hash) - - - (defaults to: {}) - - -
    • - -
    +

    See Also:

    +
    @@ -1056,17 +1032,15 @@

    Parameters:

     
     
    -79
    -80
    -81
     82
    -83
    +83 +84 +85
    -
    # File 'lib/axlsx/drawing/drawing.rb', line 79
    +      
    # File 'lib/axlsx/drawing/drawing.rb', line 82
     
     def add_chart(chart_type, options={})
    -  DataTypeValidator.validate "Drawing.chart_type", Chart, chart_type 
       TwoCellAnchor.new(self, chart_type, options)
       @anchors.last.graphic_frame.chart
     end
    @@ -1114,17 +1088,17 @@ 

    Returns:

     
     
    -116
    -117
     118
     119
     120
     121
     122
    -123
    +123 +124 +125
    -
    # File 'lib/axlsx/drawing/drawing.rb', line 116
    +      
    # File 'lib/axlsx/drawing/drawing.rb', line 118
     
     def to_xml
       builder = Nokogiri::XML::Builder.new(:encoding => ENCODING) do |xml|
    @@ -1145,7 +1119,7 @@ 

    Returns:

    diff --git a/doc/Axlsx/Fill.html b/doc/Axlsx/Fill.html index da35b662..f5c9b6fa 100644 --- a/doc/Axlsx/Fill.html +++ b/doc/Axlsx/Fill.html @@ -451,7 +451,7 @@

    Returns:

    diff --git a/doc/Axlsx/Font.html b/doc/Axlsx/Font.html index ee723a16..0091cf69 100644 --- a/doc/Axlsx/Font.html +++ b/doc/Axlsx/Font.html @@ -1545,7 +1545,7 @@

    Returns:

    diff --git a/doc/Axlsx/GradientFill.html b/doc/Axlsx/GradientFill.html index 7fa542ec..7cb1494f 100644 --- a/doc/Axlsx/GradientFill.html +++ b/doc/Axlsx/GradientFill.html @@ -1017,7 +1017,7 @@

    Returns:

    diff --git a/doc/Axlsx/GradientStop.html b/doc/Axlsx/GradientStop.html index 6f5ca4d4..89bc1e26 100644 --- a/doc/Axlsx/GradientStop.html +++ b/doc/Axlsx/GradientStop.html @@ -517,7 +517,7 @@

    Returns:

    diff --git a/doc/Axlsx/GraphicFrame.html b/doc/Axlsx/GraphicFrame.html index f7e91018..0c328ab9 100644 --- a/doc/Axlsx/GraphicFrame.html +++ b/doc/Axlsx/GraphicFrame.html @@ -329,12 +329,14 @@

    Parameters:

    24 25 26 -27
    +27 +28
    # File 'lib/axlsx/drawing/graphic_frame.rb', line 24
     
     def initialize(anchor, chart_type, options)
    +  DataTypeValidator.validate "Drawing.chart_type", Chart, chart_type 
       @anchor = anchor
       @chart = chart_type.new(self, options)
     end
    @@ -586,7 +588,6 @@ 

    Returns:

     
     
    -36
     37
     38
     39
    @@ -603,10 +604,11 @@ 

    Returns:

    50 51 52 -53
    +53 +54
    -
    # File 'lib/axlsx/drawing/graphic_frame.rb', line 36
    +      
    # File 'lib/axlsx/drawing/graphic_frame.rb', line 37
     
     def to_xml(xml)
       xml.send('xdr:graphicFrame') {        
    @@ -637,7 +639,7 @@ 

    Returns:

    diff --git a/doc/Axlsx/Line3DChart.html b/doc/Axlsx/Line3DChart.html index 589a6d54..3512d2a7 100644 --- a/doc/Axlsx/Line3DChart.html +++ b/doc/Axlsx/Line3DChart.html @@ -323,7 +323,7 @@

    Instance Attribute Summary (collap

    Attributes inherited from Chart

    -

    end_at, graphic_frame, index, pn, series, series_type, show_legend, start_at, style, title, view3D

    +

    graphic_frame, index, pn, series, series_type, show_legend, style, title, view3D

    @@ -396,7 +396,7 @@

    Methods inherited from Chart

    -

    #add_series

    +

    #add_series, #end_at, #from, #start_at, #to

    Constructor Details

    @@ -466,6 +466,24 @@

    Parameters:

    Options Hash (options):

      +
    • + title + (Cell, String) + + + + +
    • + +
    • + show_legend + (Boolean) + + + + +
    • +
    • grouping (Symbol) @@ -484,31 +502,94 @@

      Options Hash (options):

    • +
    • + rotX + (Integer) + + + + +
    • + +
    • + hPercent + (String) + + + + +
    • + +
    • + rotY + (Integer) + + + + +
    • + +
    • + depthPercent + (String) + + + + +
    • + +
    • + rAngAx + (Boolean) + + + + +
    • + +
    • + perspective + (Integer) + + + + +
    • +
    +

    See Also:

    + +
    @@ -865,25 +946,25 @@

    Returns:

     
     
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    -83
    -84
    -85
     86
     87
     88
     89
     90
    -91
    +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 @@ -388,7 +389,7 @@

    Instance Attribute Details

    - - (Array, SimpleTypedList) data + - (ValAxisData) data @@ -409,7 +410,7 @@

    Returns:

  • - (Array, SimpleTypedList) + (ValAxisData) @@ -445,7 +446,7 @@

    Returns:

    - - (Array, SimpleTypedList) labels + - (CatAxisData) labels @@ -466,7 +467,7 @@

    Returns:

  • - (Array, SimpleTypedList) + (CatAxisData) @@ -513,7 +514,8 @@

    Instance Method Details

    -Serializes the series +Serializes the series TODO create series_cat and series_val classes as this +serialization is duplicated

    @@ -562,78 +564,20 @@

    Returns:

     
     
    -29
     30
     31
     32
     33
     34
    -35
    -36
    -37
    -38
    -39
    -40
    -41
    -42
    -43
    -44
    -45
    -46
    -47
    -48
    -49
    -50
    -51
    -52
    -53
    -54
    -55
    -56
    -57
    -58
    -59
    -60
    -61
    -62
    -63
    +35
  •  
     
    -51
    -52
    -53
    -54
    -55
    -56
    -57
    -58
    -59
    -60
     61
    -62
    +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72
    -
    # File 'lib/axlsx/drawing/line_3D_chart.rb', line 51
    +      
    # File 'lib/axlsx/drawing/line_3D_chart.rb', line 61
     
     def initialize(frame, options={})
       @grouping = :standard
    @@ -518,9 +599,9 @@ 

    Options Hash (options):

    @catAxis = CatAxis.new(@catAxId, @valAxId) @valAxis = ValAxis.new(@valAxId, @catAxId) @serAxis = SerAxis.new(@serAxId, @valAxId) - @view3D = View3D.new(:perspective=>30) super(frame, options) @series_type = LineSeries + @view3D = View3D.new({:perspective=>30}.merge(options)) end
    -
    # File 'lib/axlsx/drawing/line_3D_chart.rb', line 76
    +      
    # File 'lib/axlsx/drawing/line_3D_chart.rb', line 86
     
     def to_xml
       super() do |xml|
    @@ -912,7 +993,7 @@ 

    Returns:

    diff --git a/doc/Axlsx/LineSeries.html b/doc/Axlsx/LineSeries.html index f6d997da..b1b59a0b 100644 --- a/doc/Axlsx/LineSeries.html +++ b/doc/Axlsx/LineSeries.html @@ -136,7 +136,7 @@

    Instance Attribute Summary (collap
  • - - (Array, SimpleTypedList) data + - (ValAxisData) data @@ -163,7 +163,7 @@

    Instance Attribute Summary (collap
  • - - (Array, SimpleTypedList) labels + - (CatAxisData) labels @@ -251,7 +251,8 @@

    -Serializes the series. +Serializes the series TODO create series_cat and series_val classes as this +serialization is duplicated.

    @@ -368,8 +369,8 @@

    Options Hash (options):

    def initialize(chart, options={}) super(chart, options) - self.data = options[:data] || [] - self.labels = options[:labels] || [] + self.labels = CatAxisData.new(options[:labels]) unless options[:labels].nil? + self.data = ValAxisData.new(options[:data]) unless options[:data].nil? end
  • -
    # File 'lib/axlsx/drawing/line_series.rb', line 29
    +      
    # File 'lib/axlsx/drawing/line_series.rb', line 30
     
     def to_xml(xml)
       super(xml) do |xml|
    -    if !labels.empty?
    -      xml.send('c:cat') {
    -        xml.send('c:strRef') {
    -          xml.send('c:f', Axlsx::cell_range(labels))
    -          xml.send('c:strCache') {
    -            xml.send('c:ptCount', :val=>labels.size)
    -            labels.each_with_index do |cell, index|
    -              v = cell.is_a?(Cell) ? cell.value : cell
    -              xml.send('c:pt', :idx=>index) {
    -                xml.send('c:v', v)
    -              }                          
    -            end
    -          }
    -        }
    -      }
    -    end
    -    xml.send('c:val') {
    -      xml.send('c:numRef') {
    -        xml.send('c:f', Axlsx::cell_range(data))
    -        xml.send('c:numCache') {
    -          xml.send('c:formatCode', 'General')
    -          xml.send('c:ptCount', :val=>data.size)
    -          data.each_with_index do |cell, index|
    -            v = cell.is_a?(Cell) ? cell.value : cell
    -            xml.send('c:pt', :idx=>index) {
    -              xml.send('c:v', v) 
    -            }
    -          end
    -        }                        
    -      }
    -    }
    +    @labels.to_xml(xml) unless @labels.nil?
    +    @data.to_xml(xml) unless @data.nil?
       end      
     end
     
    @@ -647,7 +591,7 @@

    Returns:

    diff --git a/doc/Axlsx/Marker.html b/doc/Axlsx/Marker.html index 3a5e0864..a35500f7 100644 --- a/doc/Axlsx/Marker.html +++ b/doc/Axlsx/Marker.html @@ -848,7 +848,7 @@

    Returns:

    diff --git a/doc/Axlsx/NumFmt.html b/doc/Axlsx/NumFmt.html index b530f49a..2fe65d34 100644 --- a/doc/Axlsx/NumFmt.html +++ b/doc/Axlsx/NumFmt.html @@ -553,7 +553,7 @@

    Parameters:

    diff --git a/doc/Axlsx/Override.html b/doc/Axlsx/Override.html index 0eeec0b6..2157fc29 100644 --- a/doc/Axlsx/Override.html +++ b/doc/Axlsx/Override.html @@ -559,7 +559,7 @@

    Parameters:

    diff --git a/doc/Axlsx/Package.html b/doc/Axlsx/Package.html index a8875b81..dccd861b 100644 --- a/doc/Axlsx/Package.html +++ b/doc/Axlsx/Package.html @@ -1284,7 +1284,7 @@

    Returns:

    diff --git a/doc/Axlsx/PatternFill.html b/doc/Axlsx/PatternFill.html index 00371bc9..22009d77 100644 --- a/doc/Axlsx/PatternFill.html +++ b/doc/Axlsx/PatternFill.html @@ -672,7 +672,7 @@

    Returns:

    diff --git a/doc/Axlsx/Pie3DChart.html b/doc/Axlsx/Pie3DChart.html index f34d11e8..668d4797 100644 --- a/doc/Axlsx/Pie3DChart.html +++ b/doc/Axlsx/Pie3DChart.html @@ -106,53 +106,15 @@

    Overview

    -
    -

    Examples:

    - -

    -Creating a chart -

    -

    -
    # This example creates two charts in a single sheet.
    -# The first uses data directly fed to the sheet, while the second references cells withing the worksheet for data.
    -
    -require "rubygems" # if that is your preferred way to manage gems!
    -require "axlsx"
    -
    -p = Axlsx::Package.new
    -ws = p.workbook.add_worksheet
    -ws.add_row :values => ["This is a chart with no data in the sheet"]
    -
    -chart = ws.add_chart(Axlsx::Pie3DChart, :start_at=> [0,1], :end_at=>[0,6], :title=>"Most Popular Pets")
    -chart.add_series :data => [1, 9, 10], :labels => ["Slimy Reptiles", "Fuzzy Bunnies", "Rottweiler"]
    -
    -ws.add_row :values => ["This chart uses the data below"]
    -title_row = ws.add_row :values => ["Least Popular Pets"]
    -label_row = ws.add_row :values => ["", "Dry Skinned Reptiles", "Bald Cats", "Violent Parrots"]
    -data_row = ws.add_row :values => ["Votes", 6, 4, 1]
    -
    -chart = ws.add_chart(Axlsx::Pie3DChart, :start_at => [0,11], :end_at =>[0,16], :title => title_row.cells.last)
    -chart.add_series :data => data_row.cells[(1..-1)], :labels => label_row.cells  
    -
    -f = File.open('example_pie_3d_chart.xlsx', 'w')
    -p.serialize(f)
    -
    - -
    -

    See Also:

    @@ -170,7 +132,7 @@

    See Also:

    Instance Attribute Summary

    Attributes inherited from Chart

    -

    end_at, graphic_frame, index, pn, series, series_type, show_legend, start_at, style, title, view3D

    +

    graphic_frame, index, pn, series, series_type, show_legend, style, title, view3D

    @@ -184,7 +146,7 @@

  • - - (Pie3DChart) initialize(workbook, options = {}) + - (Pie3DChart) initialize(frame, options = {}) @@ -243,14 +205,14 @@

    Methods inherited from Chart

    -

    #add_series

    +

    #add_series, #end_at, #from, #start_at, #to

    Constructor Details

    - - (Pie3DChart) initialize(workbook, options = {}) + - (Pie3DChart) initialize(frame, options = {}) @@ -269,10 +231,10 @@

    Parameters:

  • - workbook + frame - (Workbook) + (GraphicFrame) @@ -322,31 +284,121 @@

    Options Hash (options):

  • +
  • + show_legend + (Boolean) + + + + +
  • + +
  • + grouping + (Symbol) + + + + +
  • + +
  • + gapDepth + (String) + + + + +
  • + +
  • + rotX + (Integer) + + + + +
  • + +
  • + hPercent + (String) + + + + +
  • + +
  • + rotY + (Integer) + + + + +
  • + +
  • + depthPercent + (String) + + + + +
  • + +
  • + rAngAx + (Boolean) + + + + +
  • + +
  • + perspective + (Integer) + + + + +
  • + +

    See Also:

    + +
    @@ -399,17 +451,17 @@

    Returns:

     
     
    -50
    -51
    -52
    -53
    -54
    -55
    -56
    -57
    +33 +34 +35 +36 +37 +38 +39 +40 @@ -433,7 +434,7 @@

    Instance Attribute Details

    - - (Array, SimpleTypedList) data + - (SimpleTypedList) data @@ -454,7 +455,7 @@

    Returns:

  • - (Array, SimpleTypedList) + (SimpleTypedList) @@ -490,7 +491,7 @@

    Returns:

    - - (Array, SimpleTypedList) explosion + - (Integert) explosion @@ -511,7 +512,7 @@

    Returns:

  • - (Array, SimpleTypedList) + (Integert) @@ -525,12 +526,12 @@

    Returns:

     
     
    -20
    -21
    -22
    +18 +19 +20
  • @@ -418,13 +427,16 @@

    Instance Attribute Details

    - - (Boolean) tickLblSkip + - (Integer) tickLblSkip

    - +

    +The number of tick lables to skip between labels +

    +
    @@ -436,7 +448,7 @@

    Returns:

  • - (Boolean) + (Integer) @@ -450,12 +462,12 @@

    Returns:

     
     
    -6
     7
    -8
    +8 +9
  • @@ -815,199 +767,7 @@

    Instance Method Details

    -

    - - - (Marker) end_at(x, y) - - - -

    -
    -

    -This is a short cut method to set the end anchor position -

    - - -
    -
    -
    -

    Parameters:

    -
      - -
    • - - x - - - (Integer) - - - - — -

      -The column -

      -
      - -
    • - -
    • - - y - - - (Integer) - - - - — -

      -The row -

      -
      - -
    • - -
    - -

    Returns:

    -
      - -
    • - - - (Marker) - - - -
    • - -
    - -
     
     
    -41
    -42
    -43
    -44
    -45
    -46
    +24 +25 +26 +27 +28 +29
    -
    # File 'lib/axlsx/drawing/pie_3D_chart.rb', line 41
    +      
    # File 'lib/axlsx/drawing/pie_3D_chart.rb', line 24
     
    -def initialize(workbook, options={})
    -  # this charts series type
    -  super(workbook, options)
    +def initialize(frame, options={})
    +  super(frame, options)
       @series_type = PieSeries
    -  @view3D = View3D.new(:rotX => 30, :perspective => 30)
    +  @view3D = View3D.new({:rotX=>30, :perspective=>30}.merge(options))
    +
     end
     
    -
    # File 'lib/axlsx/drawing/pie_3D_chart.rb', line 50
    +      
    # File 'lib/axlsx/drawing/pie_3D_chart.rb', line 33
     
     def to_xml
       super() do |xml|
    @@ -430,7 +482,7 @@ 

    Returns:

    diff --git a/doc/Axlsx/PieSeries.html b/doc/Axlsx/PieSeries.html index 7e5d747b..07ca6f75 100644 --- a/doc/Axlsx/PieSeries.html +++ b/doc/Axlsx/PieSeries.html @@ -106,7 +106,8 @@

    Overview

    -A PieSeries defines the title, data and labels for pie charts +A PieSeries defines the data and labels and explosion for pie charts +series.

    @@ -136,7 +137,7 @@

    Instance Attribute Summary (collap
  • - - (Array, SimpleTypedList) data + - (SimpleTypedList) data @@ -163,7 +164,7 @@

    Instance Attribute Summary (collap
  • - - (Array, SimpleTypedList) explosion + - (Integert) explosion @@ -190,7 +191,7 @@

    Instance Attribute Summary (collap
  • - - (Array, SimpleTypedList) labels + - (SimpleTypedList) labels @@ -402,19 +403,19 @@

    Options Hash (options):

     
     
    +26
    +27
     28
     29
    -30
    -31
    -32
    +30
  • -
    # File 'lib/axlsx/drawing/pie_series.rb', line 28
    +      
    # File 'lib/axlsx/drawing/pie_series.rb', line 26
     
     def initialize(chart, options={})
       super(chart, options)
    -  self.data = options[:data]  || []
    -  self.labels = options[:labels] || []
    +  self.labels = CatAxisData.new(options[:labels]) unless options[:labels].nil?
    +  self.data = ValAxisData.new(options[:data]) unless options[:data].nil?
     end
     
    -
    # File 'lib/axlsx/drawing/pie_series.rb', line 20
    +      
    # File 'lib/axlsx/drawing/pie_series.rb', line 18
     
     def explosion
       @explosion
    @@ -547,7 +548,7 @@ 

    Returns:

    - - (Array, SimpleTypedList) labels + - (SimpleTypedList) labels @@ -568,7 +569,7 @@

    Returns:

  • - (Array, SimpleTypedList) + (SimpleTypedList) @@ -582,12 +583,12 @@

    Returns:

     
     
    +14
     15
    -16
    -17
    +16
  • -
    # File 'lib/axlsx/drawing/pie_series.rb', line 15
    +      
    # File 'lib/axlsx/drawing/pie_series.rb', line 14
     
     def labels
       @labels
    @@ -664,82 +665,22 @@ 

    Returns:

     
     
    +37
     38
     39
     40
     41
     42
    -43
    -44
    -45
    -46
    -47
    -48
    -49
    -50
    -51
    -52
    -53
    -54
    -55
    -56
    -57
    -58
    -59
    -60
    -61
    -62
    -63
    -64
    -65
    -66
    -67
    -68
    -69
    -70
    -71
    -72
    -73
    -74
    +43
    -
    # File 'lib/axlsx/drawing/pie_series.rb', line 38
    +      
    # File 'lib/axlsx/drawing/pie_series.rb', line 37
     
     def to_xml(xml)
       super(xml) do  |xml|
         xml.send('c:explosion', :val=>@explosion) unless @explosion.nil?
    -    if !labels.empty?
    -      xml.send('c:cat') {
    -        xml.send('c:strRef') {
    -          xml.send('c:f', Axlsx::cell_range(labels))
    -          xml.send('c:strCache') {
    -            xml.send('c:ptCount', :val=>labels.size)
    -            labels.each_with_index do |cell, index|
    -              v = cell.is_a?(Cell) ? cell.value : cell
    -              xml.send('c:pt', :idx=>index) {
    -                xml.send('c:v', v)
    -              }                          
    -            end
    -          }
    -        }
    -      }
    -    end
    -    xml.send('c:val') {
    -      xml.send('c:numRef') {
    -        xml.send('c:f', Axlsx::cell_range(data))
    -        xml.send('c:numCache') {
    -          xml.send('c:formatCode', 'General')
    -          xml.send('c:ptCount', :val=>data.size)
    -          data.each_with_index do |cell, index|
    -            v = cell.is_a?(Cell) ? cell.value : cell
    -            xml.send('c:pt', :idx=>index) {
    -              xml.send('c:v', v) 
    -            }
    -          end
    -        }                        
    -      }
    -    }
    -    
    +    @labels.to_xml(xml) unless @labels.nil?
    +    @data.to_xml(xml) unless @data.nil?
       end      
     end
     
    @@ -753,7 +694,7 @@

    Returns:

    diff --git a/doc/Axlsx/RegexValidator.html b/doc/Axlsx/RegexValidator.html index c3ad45b1..f644c404 100644 --- a/doc/Axlsx/RegexValidator.html +++ b/doc/Axlsx/RegexValidator.html @@ -259,7 +259,7 @@

    Raises:

    diff --git a/doc/Axlsx/Relationship.html b/doc/Axlsx/Relationship.html index 486b348c..f9786c69 100644 --- a/doc/Axlsx/Relationship.html +++ b/doc/Axlsx/Relationship.html @@ -545,7 +545,7 @@

    Returns:

    diff --git a/doc/Axlsx/Relationships.html b/doc/Axlsx/Relationships.html index b1687dcb..95e4f3b3 100644 --- a/doc/Axlsx/Relationships.html +++ b/doc/Axlsx/Relationships.html @@ -203,7 +203,7 @@

    Methods inherited from SimpleTypedList

    -

    #<<, #[]=, #delete, #delete_at, #lock, #method_missing, #protected?, #push, #unlock

    +

    #<<, #==, #[]=, #delete, #delete_at, #lock, #method_missing, #protected?, #push, #unlock

    Constructor Details

    @@ -334,7 +334,7 @@

    Returns:

    diff --git a/doc/Axlsx/RestrictionValidator.html b/doc/Axlsx/RestrictionValidator.html index 1ea8d71f..dcb9402f 100644 --- a/doc/Axlsx/RestrictionValidator.html +++ b/doc/Axlsx/RestrictionValidator.html @@ -291,7 +291,7 @@

    Raises:

    diff --git a/doc/Axlsx/Row.html b/doc/Axlsx/Row.html index 2d7802f0..cd95e0ec 100644 --- a/doc/Axlsx/Row.html +++ b/doc/Axlsx/Row.html @@ -762,7 +762,7 @@

    Returns:

    diff --git a/doc/Axlsx/Scaling.html b/doc/Axlsx/Scaling.html index 540ac273..341bd7d8 100644 --- a/doc/Axlsx/Scaling.html +++ b/doc/Axlsx/Scaling.html @@ -731,7 +731,7 @@

    Returns:

    diff --git a/doc/Axlsx/SerAxis.html b/doc/Axlsx/SerAxis.html index 17fe2a43..e46afa7e 100644 --- a/doc/Axlsx/SerAxis.html +++ b/doc/Axlsx/SerAxis.html @@ -97,7 +97,7 @@

    Overview

    -
    # File 'lib/axlsx/drawing/ser_axis.rb', line 19
    +      
    # File 'lib/axlsx/drawing/ser_axis.rb', line 21
     
     def initialize(axId, crossAx, options={})
       super(axId, crossAx, options)
    -  options.each do |o|
    -    self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}="
    -  end
     end
     
    -
    # File 'lib/axlsx/drawing/ser_axis.rb', line 6
    +      
    # File 'lib/axlsx/drawing/ser_axis.rb', line 7
     
     def tickLblSkip
       @tickLblSkip
    @@ -478,7 +490,10 @@ 

    Returns:

    - +

    +The number of tickmarks to be skipped before the next one is rendered. +

    +
    @@ -504,12 +519,12 @@

    Returns:

     
     
    -9
    -10
    -11
    +11 +12 +13
    -
    # File 'lib/axlsx/drawing/ser_axis.rb', line 9
    +      
    # File 'lib/axlsx/drawing/ser_axis.rb', line 11
     
     def tickMarkSkip
       @tickMarkSkip
    @@ -586,16 +601,16 @@ 

    Returns:

     
     
    +31
     32
     33
     34
     35
     36
    -37
    -38
    +37
    -
    # File 'lib/axlsx/drawing/ser_axis.rb', line 32
    +      
    # File 'lib/axlsx/drawing/ser_axis.rb', line 31
     
     def to_xml(xml)
       xml.send('c:serAx') {
    @@ -615,7 +630,7 @@ 

    Returns:

    diff --git a/doc/Axlsx/Series.html b/doc/Axlsx/Series.html index 668ede03..32106681 100644 --- a/doc/Axlsx/Series.html +++ b/doc/Axlsx/Series.html @@ -104,7 +104,8 @@

    Overview

    -A Series defines the title, data and labels for chart data. +A Series defines the common series attributes and is the super class for +all concrete series types.

    @@ -161,7 +162,7 @@

    Instance Attribute Summary (collap
  • - - (Object) index + - (Integer) index @@ -178,7 +179,7 @@

    Instance Attribute Summary (collap

    -retrieves the series index in the chart’s series collection. +The index of this series in the chart’s series.

    @@ -488,14 +489,14 @@

    Returns:

    - - (Object) index (readonly) + - (Integer) index (readonly)

    -retrieves the series index in the chart’s series collection +The index of this series in the chart’s series.

    @@ -503,6 +504,19 @@

    Returns:

    +

    Returns:

    +
      + +
    • + + + (Integer) + + + +
    • + +
    @@ -539,7 +553,8 @@

    Returns:

    -The order of this series in the chart’s series. +The order of this series in the chart’s series. By default the order +is the index of the series.

    @@ -706,17 +721,17 @@

    Returns:

     
     
    +60
     61
     62
     63
     64
     65
     66
    -67
    -68
    +67
    -
    # File 'lib/axlsx/drawing/series.rb', line 61
    +      
    # File 'lib/axlsx/drawing/series.rb', line 60
     
     def to_xml(xml)
       xml.send('c:ser') {
    @@ -737,7 +752,7 @@ 

    Returns:

    diff --git a/doc/Axlsx/SeriesTitle.html b/doc/Axlsx/SeriesTitle.html index 8c6e2377..46224b97 100644 --- a/doc/Axlsx/SeriesTitle.html +++ b/doc/Axlsx/SeriesTitle.html @@ -97,7 +97,8 @@

    Overview

    -A series title is a Title with a slightly different serialization +A series title is a Title with a slightly different serialization than +chart titles.

    @@ -280,7 +281,7 @@

    Returns:

    diff --git a/doc/Axlsx/SimpleTypedList.html b/doc/Axlsx/SimpleTypedList.html index d28079f3..72ff9c07 100644 --- a/doc/Axlsx/SimpleTypedList.html +++ b/doc/Axlsx/SimpleTypedList.html @@ -107,7 +107,7 @@

    Overview

    @@ -231,6 +231,31 @@

    + + + +
  • + + + - (Object) ==(v) + + + + + + + + + + + + +

    +override the equality method so that this object can be compared to a +simple array. +

    +
    +
  • @@ -643,7 +668,6 @@

    Dynamic Method Handling

    :drop_while :delete_if :clear - :concat
    @@ -677,23 +701,25 @@

    Raises:

     
     
    -127
    -128
    -129
    -130
     131
     132
     133
    -134
    +134 +135 +136 +137 +138 +139
    -
    # File 'lib/axlsx/util/simple_typed_list.rb', line 127
    +      
    # File 'lib/axlsx/util/simple_typed_list.rb', line 131
     
     def method_missing(meth, *args, &block)
    -  raise ArgumentError, "#{meth} not supported" if [:replace, :insert, :collect!, :map!, :pop, :delete_if, :reverse!, :shift, :shuffle!, :slice!, :sort!, :uniq!, :unshift, :zip, :flatten!, :fill, :drop, :drop_while, :delete_if, :clear, :concat].include? meth.to_sym        
    +  raise ArgumentError, "#{meth} not supported" if [:replace, :insert, :collect!, :map!, :pop, :delete_if, :reverse!, :shift, :shuffle!, :slice!, :sort!, :uniq!, :unshift, :zip, :flatten!, :fill, :drop, :drop_while, :delete_if, :clear].include? meth.to_sym        
       if @list.respond_to? meth
         @list.send(meth, *args, &block)      
       else
    +    puts "method:#{meth.inspect}"
         super
       end
     end
    @@ -990,6 +1016,49 @@ 

    Raises:

    +
    + +
    +

    + + - (Object) ==(v) + + + +

    +
    +

    +override the equality method so that this object can be compared to a +simple array. if this object’s list is equal to the specifiec array, +we return true. +

    + + +
    +
    +
    + + +
    + + + + +
    +
    +
    +
    +105
    +106
    +107
    +
    +
    # File 'lib/axlsx/util/simple_typed_list.rb', line 105
    +
    +def ==(v)
    +  v == @list
    +end
    +
    +
    @@ -1523,16 +1592,16 @@

    Returns:

     
     
    -141
    -142
    -143
    -144
    -145
     146
    -147
    +147 +148 +149 +150 +151 +152

  • -
    # File 'lib/axlsx/util/simple_typed_list.rb', line 141
    +      
    # File 'lib/axlsx/util/simple_typed_list.rb', line 146
     
     def to_xml(xml)
       classname = @allowed_types[0].name.split('::').last
    @@ -1608,7 +1677,7 @@ 

    Returns:

    diff --git a/doc/Axlsx/Styles.html b/doc/Axlsx/Styles.html index a11d4454..8044712f 100644 --- a/doc/Axlsx/Styles.html +++ b/doc/Axlsx/Styles.html @@ -1745,7 +1745,7 @@

    Returns:

    diff --git a/doc/Axlsx/TableStyle.html b/doc/Axlsx/TableStyle.html index 0bd012be..5318b1d7 100644 --- a/doc/Axlsx/TableStyle.html +++ b/doc/Axlsx/TableStyle.html @@ -289,7 +289,7 @@

    Methods inherited from SimpleTypedList

    -

    #<<, #[]=, #delete, #delete_at, #lock, #method_missing, #protected?, #push, #unlock

    +

    #<<, #==, #[]=, #delete, #delete_at, #lock, #method_missing, #protected?, #push, #unlock

    Constructor Details

    @@ -701,7 +701,7 @@

    Returns:

    diff --git a/doc/Axlsx/TableStyleElement.html b/doc/Axlsx/TableStyleElement.html index 4f2ed657..7616bef5 100644 --- a/doc/Axlsx/TableStyleElement.html +++ b/doc/Axlsx/TableStyleElement.html @@ -668,7 +668,7 @@

    Returns:

    diff --git a/doc/Axlsx/TableStyles.html b/doc/Axlsx/TableStyles.html index be8a4c84..2458c69b 100644 --- a/doc/Axlsx/TableStyles.html +++ b/doc/Axlsx/TableStyles.html @@ -265,7 +265,7 @@

    Methods inherited from SimpleTypedList

    -

    #<<, #[]=, #delete, #delete_at, #lock, #method_missing, #protected?, #push, #unlock

    +

    #<<, #==, #[]=, #delete, #delete_at, #lock, #method_missing, #protected?, #push, #unlock

    Constructor Details

    @@ -590,7 +590,7 @@

    Returns:

    diff --git a/doc/Axlsx/Title.html b/doc/Axlsx/Title.html index 9a97f09c..f66f1339 100644 --- a/doc/Axlsx/Title.html +++ b/doc/Axlsx/Title.html @@ -616,7 +616,7 @@

    Returns:

    diff --git a/doc/Axlsx/TwoCellAnchor.html b/doc/Axlsx/TwoCellAnchor.html index fc8e86a3..20e6e8c8 100644 --- a/doc/Axlsx/TwoCellAnchor.html +++ b/doc/Axlsx/TwoCellAnchor.html @@ -277,30 +277,6 @@

  • - - (Marker) end_at(x, y) - - - - - - - - - - - - -

    -This is a short cut method to set the end anchor position. -

    -
    - -
  • - - -
  • - - - (TwoCellAnchor) initialize(drawing, chart_type, options) @@ -317,31 +293,8 @@

    -Creates a new TwoCellAnchor object. -

    -
    - -

  • - - -
  • - - - - (Marker) start_at(x, y) - - - - - - - - - - - - -

    -This is a short cut method to set the start anchor position. +Creates a new TwoCellAnchor object and sets up a reference to the from and +to markers in the graphic_frame’s chart.

    @@ -388,7 +341,9 @@

    Constructor Details

    -Creates a new TwoCellAnchor object +Creates a new TwoCellAnchor object and sets up a reference to the from and +to markers in the graphic_frame’s chart. That means that you can do +stuff like c = worksheet.add_chart Axlsx::Chart c.start_at 5, 9

    @@ -411,13 +366,20 @@

    Parameters:

  • - chart + chart_type - (Chart) + (Class) + — +

    +This is passed to the graphic frame for instantiation. must be Chart or a +subclass of Chart +

    +
    +
  • @@ -455,7 +417,10 @@

    Options Hash (options):

    - + —

    +the col, row to start at +

    +
  • @@ -464,7 +429,10 @@

    Options Hash (options):

    - + —

    +the col, row to end at +

    +
  • @@ -477,37 +445,21 @@

    Options Hash (options):

     
     
    -31
    -32
    -33
     34
     35
     36
     37
     38
    -39
    -40
    -41
    -42
    -43
    -44
    +39
    -
    # File 'lib/axlsx/drawing/two_cell_anchor.rb', line 31
    +      
    # File 'lib/axlsx/drawing/two_cell_anchor.rb', line 34
     
     def initialize(drawing, chart_type, options)
       @drawing = drawing
       drawing.anchors << self      
    -
       @from, @to =  Marker.new, Marker.new(:col => 5, :row=>10)
       @graphic_frame = GraphicFrame.new(self, chart_type, options)
    -
    -  self.start_at(options[:start_at][0], options[:start_at][1]) if options[:start_at].is_a?(Array)
    -  self.end_at(options[:end_at][0], options[:end_at][1]) if options[:end_at].is_a?(Array)
    -  # passing a reference to our start and end markers for convenience
    -  # this lets us access the markers directly from the chart.
    -  @graphic_frame.chart.send(:start_at=, @from)
    -  @graphic_frame.chart.send(:end_at=, @to)
     end
     
    - - - - -
    -
    -
    -
    -65
    -66
    -67
    -68
    -69
    -
    -
    # File 'lib/axlsx/drawing/two_cell_anchor.rb', line 65
    -
    -def end_at(x, y)
    -  @to.col = x
    -  @to.row = y
    -  @to
    -end
    -
    -
    - - -
    -

    - - - (Marker) start_at(x, y) - - - -

    -
    -

    -This is a short cut method to set the start anchor position -

    - - -
    -
    -
    -

    Parameters:

    -
      - -
    • - - x - - - (Integer) - - - - — -

      -The column -

      -
      - -
    • - -
    • - - y - - - (Integer) - - - - — -

      -The row -

      -
      - -
    • - -
    - -

    Returns:

    -
      - -
    • - - - (Marker) - - - -
    • - -
    - -
    - - - - -
    -
    -
    -
    -55
    -56
    -57
    -58
    -59
    -
    -
    # File 'lib/axlsx/drawing/two_cell_anchor.rb', line 55
    -
    -def start_at(x, y)
    -  @from.col = x
    -  @from.row = y
    -  @from
    -end
    -
    -
    -
    - -
    -

    +

    - (String) to_xml(xml) @@ -1065,22 +825,22 @@

    Returns:

     
     
    -74
    -75
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    -83
    -84
    -85
    -86
    +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59
    -
    # File 'lib/axlsx/drawing/two_cell_anchor.rb', line 74
    +      
    # File 'lib/axlsx/drawing/two_cell_anchor.rb', line 47
     
     def to_xml(xml)
       #build it for now, break it down later!
    @@ -1106,7 +866,7 @@ 

    Returns:

    diff --git a/doc/Axlsx/ValAxis.html b/doc/Axlsx/ValAxis.html index f5101e70..6275d10b 100644 --- a/doc/Axlsx/ValAxis.html +++ b/doc/Axlsx/ValAxis.html @@ -135,8 +135,7 @@

    Instance Attribute Summary (collap

    -This element specifies whether the value axis crosses the category axis -between categories. +This element specifies how the value axis crosses the category axis.

    @@ -320,7 +319,7 @@

    Options Hash (options):

  • - crosses + tickLblPos (Symbol) @@ -329,7 +328,7 @@

    Options Hash (options):

  • - tickLblPos + crosses (Symbol) @@ -365,7 +364,7 @@

    Options Hash (options):

    # File 'lib/axlsx/drawing/val_axis.rb', line 17
     
     def initialize(axId, crossAx, options={})
    -  @crossBetween = :between
    +  self.crossBetween = :between
       super(axId, crossAx, options)
     end
     
    @@ -392,8 +391,8 @@

    Instance Attribute Details

    -This element specifies whether the value axis crosses the category axis -between categories. must be one of [:between, :midCat] +This element specifies how the value axis crosses the category axis. must +be one of [:between, :midCat]

    @@ -530,7 +529,7 @@

    Returns:

    diff --git a/doc/Axlsx/ValAxisData.html b/doc/Axlsx/ValAxisData.html new file mode 100644 index 00000000..25145718 --- /dev/null +++ b/doc/Axlsx/ValAxisData.html @@ -0,0 +1,326 @@ + + + + + + Class: Axlsx::ValAxisData + + — Documentation by YARD 0.7.3 + + + + + + + + + + + + + + + + + + + + + + +

    Class: Axlsx::ValAxisData + + + +

    + +
    + +
    Inherits:
    +
    + CatAxisData + + + show all + +
    + + + + + + + + + +
    Defined in:
    +
    lib/axlsx/drawing/val_axis_data.rb
    + +
    +
    + +

    Overview

    +
    +

    +The ValAxisData class manages the values for a chart value series. +

    + + +
    +
    +
    + + +
    + + + + + + + + + + + + + + + + + +

    Instance Attribute Summary

    + +

    Attributes inherited from SimpleTypedList

    +

    allowed_types, locked_at, serialize_as

    + + + +

    + Instance Method Summary + (collapse) +

    + + + + + + + + + + + + +

    Methods inherited from CatAxisData

    +

    #initialize

    + + + + + + + + +

    Methods inherited from SimpleTypedList

    +

    #<<, #==, #[]=, #delete, #delete_at, #initialize, #lock, #method_missing, #protected?, #push, #unlock

    +
    +

    Constructor Details

    + +

    This class inherits a constructor from Axlsx::CatAxisData

    + +
    +
    +

    Dynamic Method Handling

    +

    + This class handles dynamic methods through the method_missing method + + in the class Axlsx::SimpleTypedList + +

    + +
    + + +
    +

    Instance Method Details

    + + +
    +

    + + - (String) to_xml(xml) + + + +

    +
    +

    +Serializes the value axis data +

    + + +
    +
    +
    +

    Parameters:

    +
      + +
    • + + xml + + + (Nokogiri::XML::Builder) + + + + — +

      +The document builder instance this objects xml will be added to. +

      +
      + +
    • + +
    + +

    Returns:

    +
      + +
    • + + + (String) + + + +
    • + +
    + +
    + + + + +
    +
    +
    +
    +8
    +9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +
    +
    # File 'lib/axlsx/drawing/val_axis_data.rb', line 8
    +
    +def to_xml(xml)
    +  xml.send('c:val') {
    +    xml.send('c:numRef') {
    +      xml.send('c:f', Axlsx::cell_range(@list))
    +      xml.send('c:numCache') {
    +        xml.send('c:formatCode', 'General')
    +        xml.send('c:ptCount', :val=>size)
    +        each_with_index do |item, index|
    +          v = item.is_a?(Cell) ? item.value : item
    +          xml.send('c:pt', :idx=>index) {
    +            xml.send('c:v', v) 
    +          }
    +        end
    +      }                        
    +    }
    +  }
    +end
    +
    +
    +
    + +
    + +
    + + + + + \ No newline at end of file diff --git a/doc/Axlsx/View3D.html b/doc/Axlsx/View3D.html index 73bfd8bf..cdc5599f 100644 --- a/doc/Axlsx/View3D.html +++ b/doc/Axlsx/View3D.html @@ -494,14 +494,14 @@

    Options Hash (options):

     
     
    -39
    -40
    -41
    -42
    -43
    +46 +47 +48 +49 +50
  • -
    # File 'lib/axlsx/drawing/view_3D.rb', line 39
    +      
    # File 'lib/axlsx/drawing/view_3D.rb', line 46
     
     def initialize(options={})
       options.each do |o|
    @@ -560,12 +560,12 @@ 

    Returns:

     
     
    -22
    -23
    -24
    +29 +30 +31
    -
    # File 'lib/axlsx/drawing/view_3D.rb', line 22
    +      
    # File 'lib/axlsx/drawing/view_3D.rb', line 29
     
     def depthPercent
       @depthPercent
    @@ -617,12 +617,12 @@ 

    Returns:

     
     
    -12
    -13
    -14
    +19 +20 +21
    -
    # File 'lib/axlsx/drawing/view_3D.rb', line 12
    +      
    # File 'lib/axlsx/drawing/view_3D.rb', line 19
     
     def hPercent
       @hPercent
    @@ -674,12 +674,12 @@ 

    Returns:

     
     
    -30
    -31
    -32
    +37 +38 +39
    -
    # File 'lib/axlsx/drawing/view_3D.rb', line 30
    +      
    # File 'lib/axlsx/drawing/view_3D.rb', line 37
     
     def perspective
       @perspective
    @@ -731,12 +731,12 @@ 

    Returns:

     
     
    -26
    -27
    -28
    +33 +34 +35
    -
    # File 'lib/axlsx/drawing/view_3D.rb', line 26
    +      
    # File 'lib/axlsx/drawing/view_3D.rb', line 33
     
     def rAngAx
       @rAngAx
    @@ -788,12 +788,12 @@ 

    Returns:

     
     
    -7
    -8
    -9
    +14 +15 +16
    -
    # File 'lib/axlsx/drawing/view_3D.rb', line 7
    +      
    # File 'lib/axlsx/drawing/view_3D.rb', line 14
     
     def rotX
       @rotX
    @@ -845,12 +845,12 @@ 

    Returns:

     
     
    -17
    -18
    -19
    +24 +25 +26
    -
    # File 'lib/axlsx/drawing/view_3D.rb', line 17
    +      
    # File 'lib/axlsx/drawing/view_3D.rb', line 24
     
     def rotY
       @rotY
    @@ -927,19 +927,19 @@ 

    Returns:

     
     
    -61
    -62
    -63
    -64
    -65
    -66
     67
     68
     69
    -70
    +70 +71 +72 +73 +74 +75 +76
    -
    # File 'lib/axlsx/drawing/view_3D.rb', line 61
    +      
    # File 'lib/axlsx/drawing/view_3D.rb', line 67
     
     def to_xml(xml)
       xml.send('c:view3D') {
    @@ -962,7 +962,7 @@ 

    Returns:

    diff --git a/doc/Axlsx/Workbook.html b/doc/Axlsx/Workbook.html index 134092c7..37e81c09 100644 --- a/doc/Axlsx/Workbook.html +++ b/doc/Axlsx/Workbook.html @@ -1338,7 +1338,7 @@

    Returns:

    diff --git a/doc/Axlsx/Worksheet.html b/doc/Axlsx/Worksheet.html index f3131f16..93e90793 100644 --- a/doc/Axlsx/Worksheet.html +++ b/doc/Axlsx/Worksheet.html @@ -1287,8 +1287,20 @@

    Instance Method Details

    -

    -Adds a chart to this worksheets drawing. + +

    + Note: +

    +each chart type also specifies additional options +

    +
    +
    + +

    +Adds a chart to this worksheets drawing. This is the recommended way to +create charts for your worksheet. This method wraps the complexity of +dealing with ooxml drawing, anchors, markers graphic frames chart objects +and all the other dirty details.

    @@ -1365,6 +1377,24 @@

    Options Hash (options):

    +
  • + show_legend + (Boolean) + + + + +
  • + +
  • + style + (Integer) + + + + +
  • + @@ -1382,20 +1412,35 @@

    Yields:

    +

    See Also:

    + +
     
     
    -108
    -109
    -110
    -111
    -112
    +116 +117 +118 +119 +120
    -
    # File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 108
    +      
    # File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 116
     
     def add_chart(chart_type, options={})
       chart = drawing.add_chart(chart_type, options)
    @@ -1615,19 +1660,19 @@ 

    Returns:

     
     
    -182
    -183
    -184
    -185
    -186
    -187
    -188
    -189
     190
    -191
    +191 +192 +193 +194 +195 +196 +197 +198 +199
    -
    # File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 182
    +      
    # File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 190
     
     def auto_width(col)
       mdw = 6.0 # maximum digit with is always 6.0 in testable fonts so instead of beating RMagick every time, I am hardcoding it here.
    @@ -1683,14 +1728,6 @@ 

    Returns:

     
     
    -116
    -117
    -118
    -119
    -120
    -121
    -122
    -123
     124
     125
     126
    @@ -1703,10 +1740,18 @@ 

    Returns:

    133 134 135 -136
    +136 +137 +138 +139 +140 +141 +142 +143 +144
    -
    # File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 116
    +      
    # File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 124
     
     def to_xml
       builder = Nokogiri::XML::Builder.new(:encoding => ENCODING) do |xml|
    @@ -1802,14 +1847,6 @@ 

    Returns:

     
     
    -154
    -155
    -156
    -157
    -158
    -159
    -160
    -161
     162
     163
     164
    @@ -1820,10 +1857,18 @@ 

    Returns:

    169 170 171 -172
    +172 +173 +174 +175 +176 +177 +178 +179 +180
    -
    # File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 154
    +      
    # File 'lib/axlsx/workbook/worksheet/worksheet.rb', line 162
     
     def update_auto_fit_data(cells)
       styles = self.workbook.styles
    @@ -1855,7 +1900,7 @@ 

    Returns:

    diff --git a/doc/Axlsx/Xf.html b/doc/Axlsx/Xf.html index 17c94f7f..f92867c7 100644 --- a/doc/Axlsx/Xf.html +++ b/doc/Axlsx/Xf.html @@ -1672,7 +1672,7 @@

    Returns:

    diff --git a/doc/_index.html b/doc/_index.html index 6f891d0a..dc411c2f 100644 --- a/doc/_index.html +++ b/doc/_index.html @@ -150,6 +150,13 @@

    Namespace Listing A-Z

    +
  • + CatAxisData + + (Axlsx) + +
  • +
  • Cell @@ -543,6 +550,13 @@

    Namespace Listing A-Z

  • +
  • + ValAxisData + + (Axlsx) + +
  • +
  • View3D @@ -602,7 +616,7 @@

    Namespace Listing A-Z

    diff --git a/doc/class_list.html b/doc/class_list.html index d2d0c201..768281a5 100644 --- a/doc/class_list.html +++ b/doc/class_list.html @@ -39,7 +39,7 @@

    Class List

    diff --git a/doc/file.README.html b/doc/file.README.html index e4129686..312220af 100644 --- a/doc/file.README.html +++ b/doc/file.README.html @@ -99,7 +99,7 @@

    Examples

    require 'axlsx'
  • -

    A Simple Workbooka

    +

    A Simple Workbook

      p = Axlsx::Package.new
       p.workbook.add_worksheet do |sheet|
    @@ -205,10 +205,18 @@ 

    Specs

    Changelog

      -
    • October.22.11: 1.0.7 release +
    • October.?.13: 1.0.7 release preparation
        -
      • Updated serialization write test to verify write permissions and warn if it cannot run the test
      • +
      • Updated serialization write test to verify write permissions and warn if it cannot run the test due to permission restrcitions.
      • +
      • updated rake to include build, genoc and deploy tasks.
      • +
      • rebuilt documentation.
      • +
      • moved version constant to its own file
      • +
      • fixed bug in SerAxis that was requiring tickLblSkip and tickMarkSkip to be boolean. Should be unsigned int.
      • +
      • Review and improve docs
      • +
      • rebuild of anchor positioning to remove some spagetti code. Chart now supports a start_at and end_at method that accept an arrar for col/row positioning. See example6 for an example. You can still pass :start_at and :end_at options to worksheet.add_chart.
      • +
      • Added support for 3D options when creating a new chart. This lets you set the persective, rotation and other 3D attributes when using worksheet.add_chart
      • +
      • Refactored cat and val axis data to keep series serialization a bit more DRY
    @@ -216,14 +224,6 @@

    Changelog

    Please see the CHANGELOG document for past release information.

    -

    On Deck

    - -
      -
    • Verification with ruby 1.9.3
    • -
    • Active Record support via package::serialize_ar so you can dump an AR result into a worksheet in one go.
    • -
    - -

    Copyright

    Axlsx © 2011 by Randy Morgan. Axlsx is @@ -231,7 +231,7 @@

    Copyright

    diff --git a/doc/index.html b/doc/index.html index e4129686..312220af 100644 --- a/doc/index.html +++ b/doc/index.html @@ -99,7 +99,7 @@

    Examples

    require 'axlsx'
    -

    A Simple Workbooka

    +

    A Simple Workbook

      p = Axlsx::Package.new
       p.workbook.add_worksheet do |sheet|
    @@ -205,10 +205,18 @@ 

    Specs

    Changelog

      -
    • October.22.11: 1.0.7 release +
    • October.?.13: 1.0.7 release preparation
        -
      • Updated serialization write test to verify write permissions and warn if it cannot run the test
      • +
      • Updated serialization write test to verify write permissions and warn if it cannot run the test due to permission restrcitions.
      • +
      • updated rake to include build, genoc and deploy tasks.
      • +
      • rebuilt documentation.
      • +
      • moved version constant to its own file
      • +
      • fixed bug in SerAxis that was requiring tickLblSkip and tickMarkSkip to be boolean. Should be unsigned int.
      • +
      • Review and improve docs
      • +
      • rebuild of anchor positioning to remove some spagetti code. Chart now supports a start_at and end_at method that accept an arrar for col/row positioning. See example6 for an example. You can still pass :start_at and :end_at options to worksheet.add_chart.
      • +
      • Added support for 3D options when creating a new chart. This lets you set the persective, rotation and other 3D attributes when using worksheet.add_chart
      • +
      • Refactored cat and val axis data to keep series serialization a bit more DRY
    @@ -216,14 +224,6 @@

    Changelog

    Please see the CHANGELOG document for past release information.

    -

    On Deck

    - -
      -
    • Verification with ruby 1.9.3
    • -
    • Active Record support via package::serialize_ar so you can dump an AR result into a worksheet in one go.
    • -
    - -

    Copyright

    Axlsx © 2011 by Randy Morgan. Axlsx is @@ -231,7 +231,7 @@

    Copyright

    diff --git a/doc/method_list.html b/doc/method_list.html index 0e0fa86c..8b35aedf 100644 --- a/doc/method_list.html +++ b/doc/method_list.html @@ -49,15 +49,15 @@

    Method List

  • - #AppVersion + #== - Axlsx::App + Axlsx::SimpleTypedList
  • - #Application + #AppVersion Axlsx::App @@ -65,7 +65,7 @@

    Method List

  • - #Characters + #Application Axlsx::App @@ -73,7 +73,7 @@

    Method List

  • - #CharactersWithSpaces + #Characters Axlsx::App @@ -81,7 +81,7 @@

    Method List

  • - #Company + #CharactersWithSpaces Axlsx::App @@ -89,9 +89,9 @@

    Method List

  • - #ContentType + #Company - Axlsx::Override + Axlsx::App
  • @@ -105,6 +105,14 @@

    Method List

  • + #ContentType + + Axlsx::Override + +
  • + + +
  • #DocSecurity Axlsx::App @@ -112,7 +120,7 @@

    Method List

  • -
  • +
  • #Extension Axlsx::Default @@ -120,7 +128,7 @@

    Method List

  • -
  • +
  • #HiddenSlides Axlsx::App @@ -128,7 +136,7 @@

    Method List

  • -
  • +
  • #HyperLinkBase Axlsx::App @@ -136,7 +144,7 @@

    Method List

  • -
  • +
  • #HyperlinksChanged Axlsx::App @@ -144,7 +152,7 @@

    Method List

  • -
  • +
  • #Lines Axlsx::App @@ -152,7 +160,7 @@

    Method List

  • -
  • +
  • #LinksUpToDate Axlsx::App @@ -160,7 +168,7 @@

    Method List

  • -
  • +
  • #MMClips Axlsx::App @@ -168,7 +176,7 @@

    Method List

  • -
  • +
  • #Manager Axlsx::App @@ -176,7 +184,7 @@

    Method List

  • -
  • +
  • #Notes Axlsx::App @@ -184,7 +192,7 @@

    Method List

  • -
  • +
  • #Pages Axlsx::App @@ -192,7 +200,7 @@

    Method List

  • -
  • +
  • #Paragraphs Axlsx::App @@ -200,7 +208,7 @@

    Method List

  • -
  • +
  • #PartName Axlsx::Override @@ -208,7 +216,7 @@

    Method List

  • -
  • +
  • #PresentationFormat Axlsx::App @@ -216,7 +224,7 @@

    Method List

  • -
  • +
  • #ScaleCrop Axlsx::App @@ -224,7 +232,7 @@

    Method List

  • -
  • +
  • #ShareDoc Axlsx::App @@ -232,7 +240,7 @@

    Method List

  • -
  • +
  • #Slides Axlsx::App @@ -240,7 +248,7 @@

    Method List

  • -
  • +
  • #Target Axlsx::Relationship @@ -248,7 +256,7 @@

    Method List

  • -
  • +
  • #Template Axlsx::App @@ -256,7 +264,7 @@

    Method List

  • -
  • +
  • #TotalTime Axlsx::App @@ -264,7 +272,7 @@

    Method List

  • -
  • +
  • #Type Axlsx::Relationship @@ -272,7 +280,7 @@

    Method List

  • -
  • +
  • #Words Axlsx::App @@ -280,7 +288,7 @@

    Method List

  • -
  • +
  • #[]= Axlsx::SimpleTypedList @@ -288,7 +296,7 @@

    Method List

  • -
  • +
  • #add_cell Axlsx::Row @@ -296,7 +304,7 @@

    Method List

  • -
  • +
  • #add_chart Axlsx::Worksheet @@ -304,7 +312,7 @@

    Method List

  • -
  • +
  • #add_chart Axlsx::Drawing @@ -312,7 +320,7 @@

    Method List

  • -
  • +
  • #add_row Axlsx::Worksheet @@ -320,7 +328,7 @@

    Method List

  • -
  • +
  • #add_series Axlsx::Chart @@ -328,7 +336,7 @@

    Method List

  • -
  • +
  • #add_style Axlsx::Styles @@ -336,7 +344,7 @@

    Method List

  • -
  • +
  • #add_worksheet Axlsx::Workbook @@ -344,7 +352,7 @@

    Method List

  • -
  • +
  • #alignment Axlsx::Xf @@ -352,7 +360,7 @@

    Method List

  • -
  • +
  • #allowed_types Axlsx::SimpleTypedList @@ -360,7 +368,7 @@

    Method List

  • -
  • +
  • #anchor Axlsx::GraphicFrame @@ -368,7 +376,7 @@

    Method List

  • -
  • +
  • #anchors Axlsx::Drawing @@ -376,7 +384,7 @@

    Method List

  • -
  • +
  • #applyAlignment Axlsx::Xf @@ -384,7 +392,7 @@

    Method List

  • -
  • +
  • #applyBorder Axlsx::Xf @@ -392,7 +400,7 @@

    Method List

  • -
  • +
  • #applyFill Axlsx::Xf @@ -400,7 +408,7 @@

    Method List

  • -
  • +
  • #applyFont Axlsx::Xf @@ -408,7 +416,7 @@

    Method List

  • -
  • +
  • #applyNumberFormat Axlsx::Xf @@ -416,7 +424,7 @@

    Method List

  • -
  • +
  • #applyProtection Axlsx::Xf @@ -424,7 +432,7 @@

    Method List

  • -
  • +
  • #auto Axlsx::CatAxis @@ -432,7 +440,7 @@

    Method List

  • -
  • +
  • #auto Axlsx::Color @@ -440,7 +448,7 @@

    Method List

  • -
  • +
  • #auto_fit_data Axlsx::Worksheet @@ -448,7 +456,7 @@

    Method List

  • -
  • +
  • #auto_width Axlsx::Worksheet @@ -456,7 +464,7 @@

    Method List

  • -
  • +
  • #axId Axlsx::Axis @@ -464,7 +472,7 @@

    Method List

  • -
  • +
  • #axPos Axlsx::Axis @@ -472,7 +480,7 @@

    Method List

  • -
  • +
  • #b Axlsx::Font @@ -480,7 +488,7 @@

    Method List

  • -
  • +
  • #barDir Axlsx::Bar3DChart @@ -488,7 +496,7 @@

    Method List

  • -
  • +
  • #base_content_types Axlsx::Package @@ -496,7 +504,7 @@

    Method List

  • -
  • +
  • #bgColor Axlsx::PatternFill @@ -504,7 +512,7 @@

    Method List

  • -
  • +
  • #borderId Axlsx::Xf @@ -512,7 +520,7 @@

    Method List

  • -
  • +
  • #borders Axlsx::Styles @@ -520,7 +528,7 @@

    Method List

  • -
  • +
  • #bottom Axlsx::GradientFill @@ -528,7 +536,7 @@

    Method List

  • -
  • +
  • #builtinId Axlsx::CellStyle @@ -536,7 +544,7 @@

    Method List

  • -
  • +
  • #cast_value Axlsx::Cell @@ -544,23 +552,23 @@

    Method List

  • -
  • - #catAxis +
  • + #catAxis - Axlsx::Line3DChart + Axlsx::Bar3DChart
  • -
  • - #catAxis +
  • + #catAxis - Axlsx::Bar3DChart + Axlsx::Line3DChart
  • -
  • +
  • #cell Axlsx::Title @@ -568,7 +576,7 @@

    Method List

  • -
  • +
  • #cellStyleXfs Axlsx::Styles @@ -576,7 +584,7 @@

    Method List

  • -
  • +
  • #cellStyles Axlsx::Styles @@ -584,7 +592,7 @@

    Method List

  • -
  • +
  • #cellXfs Axlsx::Styles @@ -592,7 +600,7 @@

    Method List

  • -
  • +
  • cell_range Axlsx @@ -600,7 +608,7 @@

    Method List

  • -
  • +
  • #cell_type_from_value Axlsx::Cell @@ -608,7 +616,7 @@

    Method List

  • -
  • +
  • #cells Axlsx::Row @@ -616,7 +624,7 @@

    Method List

  • -
  • +
  • #charset Axlsx::Font @@ -624,7 +632,7 @@

    Method List

  • -
  • +
  • #chart Axlsx::Series @@ -632,7 +640,7 @@

    Method List

  • -
  • +
  • #chart Axlsx::GraphicFrame @@ -640,14 +648,6 @@

    Method List

  • -
  • - #charts - - Axlsx::Drawing - -
  • - -
  • #charts @@ -657,15 +657,15 @@

    Method List

  • - #col + #charts - Axlsx::Marker + Axlsx::Drawing
  • - #colOff + #col Axlsx::Marker @@ -673,17 +673,17 @@

    Method List

  • - #col_ref + #colOff - Axlsx::Cell + Axlsx::Marker
  • - #color + #col_ref - Axlsx::Font + Axlsx::Cell
  • @@ -697,6 +697,14 @@

    Method List

  • + #color + + Axlsx::Font + +
  • + + +
  • #color Axlsx::BorderPr @@ -704,7 +712,7 @@

    Method List

  • -
  • +
  • #condense Axlsx::Font @@ -712,7 +720,7 @@

    Method List

  • -
  • +
  • #content_types Axlsx::Package @@ -720,7 +728,7 @@

    Method List

  • -
  • +
  • #coord Axlsx::Marker @@ -728,7 +736,7 @@

    Method List

  • -
  • +
  • #creator Axlsx::Core @@ -736,7 +744,7 @@

    Method List

  • -
  • +
  • #crossAx Axlsx::Axis @@ -744,7 +752,7 @@

    Method List

  • -
  • +
  • #crossBetween Axlsx::ValAxis @@ -752,7 +760,7 @@

    Method List

  • -
  • +
  • #crosses Axlsx::Axis @@ -760,7 +768,7 @@

    Method List

  • -
  • +
  • #customBuiltin Axlsx::CellStyle @@ -768,23 +776,23 @@

    Method List

  • -
  • - #data +
  • + #data - Axlsx::BarSeries + Axlsx::PieSeries
  • -
  • - #data +
  • + #data - Axlsx::PieSeries + Axlsx::BarSeries
  • -
  • +
  • #data Axlsx::LineSeries @@ -792,7 +800,7 @@

    Method List

  • -
  • +
  • date1904 Axlsx::Workbook @@ -800,7 +808,7 @@

    Method List

  • -
  • +
  • #date1904 Axlsx::Workbook @@ -808,7 +816,7 @@

    Method List

  • -
  • +
  • date1904= Axlsx::Workbook @@ -816,7 +824,7 @@

    Method List

  • -
  • +
  • #defaultPivotStyle Axlsx::TableStyles @@ -824,7 +832,7 @@

    Method List

  • -
  • +
  • #defaultTableStyle Axlsx::TableStyles @@ -832,7 +840,7 @@

    Method List

  • -
  • +
  • #degree Axlsx::GradientFill @@ -840,7 +848,7 @@

    Method List

  • -
  • +
  • #delete Axlsx::SimpleTypedList @@ -848,7 +856,7 @@

    Method List

  • -
  • +
  • #delete_at Axlsx::SimpleTypedList @@ -856,7 +864,7 @@

    Method List

  • -
  • +
  • #depthPercent Axlsx::View3D @@ -864,7 +872,7 @@

    Method List

  • -
  • +
  • #diagonalDown Axlsx::Border @@ -872,7 +880,7 @@

    Method List

  • -
  • +
  • #diagonalUp Axlsx::Border @@ -880,7 +888,7 @@

    Method List

  • -
  • +
  • #drawing Axlsx::Worksheet @@ -888,7 +896,7 @@

    Method List

  • -
  • +
  • #drawing Axlsx::TwoCellAnchor @@ -896,7 +904,7 @@

    Method List

  • -
  • +
  • #drawings Axlsx::Workbook @@ -904,7 +912,7 @@

    Method List

  • -
  • +
  • #dxfId Axlsx::TableStyleElement @@ -912,7 +920,7 @@

    Method List

  • -
  • +
  • #dxfs Axlsx::Styles @@ -920,7 +928,7 @@

    Method List

  • -
  • +
  • #end_at Axlsx::Chart @@ -928,14 +936,6 @@

    Method List

  • -
  • - #end_at - - Axlsx::TwoCellAnchor - -
  • - -
  • #explosion @@ -1025,17 +1025,17 @@

    Method List

  • - #from + #from - Axlsx::TwoCellAnchor + Axlsx::Chart
  • - #gapDepth + #from - Axlsx::Bar3DChart + Axlsx::TwoCellAnchor
  • @@ -1049,7 +1049,7 @@

    Method List

  • - #gapWidth + #gapDepth Axlsx::Bar3DChart @@ -1057,9 +1057,9 @@

    Method List

  • - #graphic_frame + #gapWidth - Axlsx::TwoCellAnchor + Axlsx::Bar3DChart
  • @@ -1073,9 +1073,9 @@

    Method List

  • - #grouping + #graphic_frame - Axlsx::Bar3DChart + Axlsx::TwoCellAnchor
  • @@ -1089,6 +1089,14 @@

    Method List

  • + #grouping + + Axlsx::Bar3DChart + +
  • + + +
  • #hPercent Axlsx::View3D @@ -1096,7 +1104,7 @@

    Method List

  • -
  • +
  • #hidden Axlsx::CellProtection @@ -1104,7 +1112,7 @@

    Method List

  • -
  • +
  • #hidden Axlsx::CellStyle @@ -1112,7 +1120,7 @@

    Method List

  • -
  • +
  • #horizontal Axlsx::CellAlignment @@ -1120,7 +1128,7 @@

    Method List

  • -
  • +
  • #i Axlsx::Font @@ -1128,7 +1136,7 @@

    Method List

  • -
  • +
  • #iLevel Axlsx::CellStyle @@ -1136,7 +1144,7 @@

    Method List

  • -
  • +
  • #indent Axlsx::CellAlignment @@ -1144,7 +1152,7 @@

    Method List

  • -
  • +
  • #index Axlsx::TwoCellAnchor @@ -1152,18 +1160,10 @@

    Method List

  • -
  • - #index - - Axlsx::Cell - -
  • - -
  • - #index + #index - Axlsx::Row + Axlsx::Series
  • @@ -1193,14 +1193,22 @@

    Method List

  • - #index + #index - Axlsx::Series + Axlsx::Row
  • + #index + + Axlsx::Cell + +
  • + + +
  • #initalize Axlsx::App @@ -1208,106 +1216,114 @@

    Method List

  • +
  • + #initialize + + Axlsx::SerAxis + +
  • + +
  • - #initialize + #initialize - Axlsx::Package + Axlsx::Fill
  • - #initialize + #initialize - Axlsx::Title + Axlsx::TableStyles
  • - #initialize + #initialize - Axlsx::ValAxis + Axlsx::SimpleTypedList
  • - #initialize + #initialize - Axlsx::TwoCellAnchor + Axlsx::Relationship
  • - #initialize + #initialize - Axlsx::Core + Axlsx::CellStyle
  • - #initialize + #initialize - Axlsx::PieSeries + Axlsx::Bar3DChart
  • - #initialize + #initialize - Axlsx::BorderPr + Axlsx::Marker
  • - #initialize + #initialize - Axlsx::LineSeries + Axlsx::View3D
  • - #initialize + #initialize - Axlsx::Fill + Axlsx::Core
  • - #initialize + #initialize - Axlsx::Cell + Axlsx::TableStyle
  • - #initialize + #initialize - Axlsx::Scaling + Axlsx::Axis
  • - #initialize + #initialize - Axlsx::SimpleTypedList + Axlsx::GradientStop
  • - #initialize + #initialize - Axlsx::Drawing + Axlsx::Pie3DChart
  • @@ -1321,161 +1337,161 @@

    Method List

  • - #initialize + #initialize - Axlsx::Styles + Axlsx::Xf
  • - #initialize + #initialize - Axlsx::Row + Axlsx::BarSeries
  • - #initialize + #initialize - Axlsx::NumFmt + Axlsx::GradientFill
  • - #initialize + #initialize - Axlsx::Border + Axlsx::Package
  • - #initialize + #initialize - Axlsx::Workbook + Axlsx::TableStyleElement
  • - #initialize + #initialize - Axlsx::Line3DChart + Axlsx::Drawing
  • - #initialize + #initialize - Axlsx::TableStyle + Axlsx::Series
  • - #initialize + #initialize - Axlsx::PatternFill + Axlsx::TwoCellAnchor
  • - #initialize + #initialize - Axlsx::GraphicFrame + Axlsx::Chart
  • - #initialize + #initialize - Axlsx::Xf + Axlsx::Default
  • - #initialize + #initialize - Axlsx::GradientStop + Axlsx::CatAxis
  • - #initialize + #initialize - Axlsx::Override + Axlsx::Color
  • - #initialize + #initialize - Axlsx::TableStyles + Axlsx::Border
  • - #initialize + #initialize - Axlsx::Marker + Axlsx::PatternFill
  • - #initialize + #initialize - Axlsx::ContentType + Axlsx::CatAxisData
  • - #initialize + #initialize - Axlsx::GradientFill + Axlsx::Relationships
  • - #initialize + #initialize - Axlsx::Color + Axlsx::Row
  • - #initialize + #initialize - Axlsx::CellStyle + Axlsx::Scaling
  • - #initialize + #initialize - Axlsx::Chart + Axlsx::Workbook
  • - #initialize + #initialize - Axlsx::Font + Axlsx::NumFmt
  • @@ -1489,105 +1505,105 @@

    Method List

  • - #initialize + #initialize - Axlsx::Pie3DChart + Axlsx::Title
  • - #initialize + #initialize - Axlsx::Series + Axlsx::Worksheet
  • - #initialize + #initialize - Axlsx::View3D + Axlsx::GraphicFrame
  • - #initialize + #initialize - Axlsx::SerAxis + Axlsx::Font
  • - #initialize + #initialize - Axlsx::Relationship + Axlsx::Styles
  • - #initialize + #initialize - Axlsx::Worksheet + Axlsx::ValAxis
  • - #initialize + #initialize - Axlsx::Bar3DChart + Axlsx::PieSeries
  • - #initialize + #initialize - Axlsx::Default + Axlsx::Cell
  • - #initialize + #initialize - Axlsx::CatAxis + Axlsx::LineSeries
  • - #initialize + #initialize - Axlsx::Relationships + Axlsx::Override
  • - #initialize + #initialize - Axlsx::BarSeries + Axlsx::BorderPr
  • - #initialize + #initialize - Axlsx::TableStyleElement + Axlsx::ContentType
  • - #initialize + #initialize - Axlsx::Axis + Axlsx::Line3DChart
  • @@ -1609,17 +1625,17 @@

    Method List

  • - #labels + #labels - Axlsx::PieSeries + Axlsx::BarSeries
  • - #labels + #labels - Axlsx::BarSeries + Axlsx::PieSeries
  • @@ -1713,25 +1729,25 @@

    Method List

  • - #name + #name - Axlsx::Font + Axlsx::TableStyle
  • - #name + #name - Axlsx::Worksheet + Axlsx::Font
  • - #name + #name - Axlsx::TableStyle + Axlsx::Worksheet
  • @@ -1929,25 +1945,25 @@

    Method List

  • - #rId + #rId - Axlsx::Worksheet + Axlsx::Drawing
  • - #rId + #rId - Axlsx::Drawing + Axlsx::GraphicFrame
  • - #rId + #rId - Axlsx::GraphicFrame + Axlsx::Worksheet
  • @@ -1977,9 +1993,9 @@

    Method List

  • - #relationships + #relationships - Axlsx::Workbook + Axlsx::Worksheet
  • @@ -1993,9 +2009,9 @@

    Method List

  • - #relationships + #relationships - Axlsx::Worksheet + Axlsx::Workbook
  • @@ -2017,17 +2033,17 @@

    Method List

  • - #rels_pn + #rels_pn - Axlsx::Worksheet + Axlsx::Drawing
  • - #rels_pn + #rels_pn - Axlsx::Drawing + Axlsx::Worksheet
  • @@ -2193,14 +2209,6 @@

    Method List

  • - #start_at - - Axlsx::TwoCellAnchor - -
  • - - -
  • #start_at Axlsx::Chart @@ -2208,7 +2216,7 @@

    Method List

  • -
  • +
  • #stop Axlsx::GradientFill @@ -2216,7 +2224,7 @@

    Method List

  • -
  • +
  • #strike Axlsx::Font @@ -2224,14 +2232,6 @@

    Method List

  • -
  • - #style - - Axlsx::Chart - -
  • - -
  • #style @@ -2249,6 +2249,14 @@

    Method List

  • + #style + + Axlsx::Chart + +
  • + + +
  • #styles Axlsx::Workbook @@ -2256,7 +2264,7 @@

    Method List

  • -
  • +
  • #sz Axlsx::Font @@ -2264,7 +2272,7 @@

    Method List

  • -
  • +
  • #table Axlsx::TableStyle @@ -2272,7 +2280,7 @@

    Method List

  • -
  • +
  • #tableStyles Axlsx::Styles @@ -2280,7 +2288,7 @@

    Method List

  • -
  • +
  • #text Axlsx::Title @@ -2288,7 +2296,7 @@

    Method List

  • -
  • +
  • #textRotation Axlsx::CellAlignment @@ -2296,7 +2304,7 @@

    Method List

  • -
  • +
  • #tickLblPos Axlsx::Axis @@ -2304,442 +2312,466 @@

    Method List

  • +
  • + #tickLblSkip + + Axlsx::SerAxis + +
  • + + +
  • + #tickMarkSkip + + Axlsx::SerAxis + +
  • + + +
  • + #tint + + Axlsx::Color + +
  • + +
  • - #tickLblSkip + #title - Axlsx::SerAxis + Axlsx::Chart
  • - #tickMarkSkip + #title - Axlsx::SerAxis + Axlsx::Series
  • - #tint + #to - Axlsx::Color + Axlsx::Chart
  • - #title + #to - Axlsx::Chart + Axlsx::TwoCellAnchor
  • - #title + #to_xml - Axlsx::Series + Axlsx::SimpleTypedList
  • - #to + #to_xml - Axlsx::TwoCellAnchor + Axlsx::Drawing
  • - #to_xml + #to_xml - Axlsx::Xf + Axlsx::Relationship
  • - #to_xml + #to_xml - Axlsx::Line3DChart + Axlsx::CellStyle
  • - #to_xml + #to_xml - Axlsx::Styles + Axlsx::View3D
  • - #to_xml + #to_xml - Axlsx::Relationship + Axlsx::Bar3DChart
  • - #to_xml + #to_xml - Axlsx::Workbook + Axlsx::Fill
  • - #to_xml + #to_xml - Axlsx::GraphicFrame + Axlsx::Default
  • - #to_xml + #to_xml - Axlsx::Cell + Axlsx::App
  • - #to_xml + #to_xml - Axlsx::Override + Axlsx::Core
  • - #to_xml + #to_xml - Axlsx::Color + Axlsx::Row
  • - #to_xml + #to_xml - Axlsx::GradientFill + Axlsx::Axis
  • - #to_xml + #to_xml - Axlsx::Font + Axlsx::BorderPr
  • - #to_xml + #to_xml - Axlsx::View3D + Axlsx::Relationships
  • - #to_xml + #to_xml - Axlsx::GradientStop + Axlsx::Series
  • - #to_xml + #to_xml - Axlsx::CellAlignment + Axlsx::Override
  • - #to_xml + #to_xml - Axlsx::TableStyleElement + Axlsx::PatternFill
  • - #to_xml + #to_xml - Axlsx::BorderPr + Axlsx::TableStyle
  • - #to_xml + #to_xml - Axlsx::Bar3DChart + Axlsx::GraphicFrame
  • - #to_xml + #to_xml - Axlsx::SimpleTypedList + Axlsx::Font
  • - #to_xml + #to_xml - Axlsx::Row + Axlsx::BarSeries
  • - #to_xml + #to_xml - Axlsx::CatAxis + Axlsx::Worksheet
  • - #to_xml + #to_xml - Axlsx::Fill + Axlsx::Pie3DChart
  • - #to_xml + #to_xml - Axlsx::CellProtection + Axlsx::SeriesTitle
  • - #to_xml + #to_xml - Axlsx::Chart + Axlsx::TableStyles
  • - #to_xml + #to_xml - Axlsx::Relationships + Axlsx::ContentType
  • - #to_xml + #to_xml - Axlsx::Marker + Axlsx::ValAxisData
  • - #to_xml + #to_xml - Axlsx::Worksheet + Axlsx::GradientFill
  • - #to_xml + #to_xml - Axlsx::Title + Axlsx::Line3DChart
  • - #to_xml + #to_xml - Axlsx::PatternFill + Axlsx::LineSeries
  • - #to_xml + #to_xml - Axlsx::TableStyles + Axlsx::ValAxis
  • - #to_xml + #to_xml - Axlsx::Axis + Axlsx::Chart
  • - #to_xml + #to_xml - Axlsx::NumFmt + Axlsx::TwoCellAnchor
  • - #to_xml + #to_xml - Axlsx::Series + Axlsx::Workbook
  • - #to_xml + #to_xml - Axlsx::SerAxis + Axlsx::CellAlignment
  • - #to_xml + #to_xml - Axlsx::Pie3DChart + Axlsx::Scaling
  • - #to_xml + #to_xml - Axlsx::Drawing + Axlsx::Title
  • - #to_xml + #to_xml - Axlsx::App + Axlsx::Cell
  • - #to_xml + #to_xml - Axlsx::Border + Axlsx::CatAxisData
  • - #to_xml + #to_xml - Axlsx::Scaling + Axlsx::Marker
  • - #to_xml + #to_xml - Axlsx::TableStyle + Axlsx::GradientStop
  • - #to_xml + #to_xml - Axlsx::ValAxis + Axlsx::CellProtection
  • - #to_xml + #to_xml - Axlsx::Default + Axlsx::SerAxis
  • - #to_xml + #to_xml - Axlsx::LineSeries + Axlsx::Styles
  • - #to_xml + #to_xml - Axlsx::CellStyle + Axlsx::PieSeries
  • - #to_xml + #to_xml - Axlsx::SeriesTitle + Axlsx::CatAxis
  • - #to_xml + #to_xml - Axlsx::BarSeries + Axlsx::Xf
  • - #to_xml + #to_xml - Axlsx::TwoCellAnchor + Axlsx::NumFmt
  • - #to_xml + #to_xml - Axlsx::ContentType + Axlsx::Color
  • - #to_xml + #to_xml - Axlsx::Core + Axlsx::TableStyleElement
  • - #to_xml + #to_xml - Axlsx::PieSeries + Axlsx::Border
  • @@ -2761,17 +2793,17 @@

    Method List

  • - #type + #type - Axlsx::Cell + Axlsx::TableStyleElement
  • - #type + #type - Axlsx::TableStyleElement + Axlsx::Cell
  • @@ -2809,9 +2841,9 @@

    Method List

  • - validate + #validate - Axlsx::DataTypeValidator + Axlsx::Package
  • @@ -2833,9 +2865,9 @@

    Method List

  • - #validate + validate - Axlsx::Package + Axlsx::DataTypeValidator
  • @@ -2969,33 +3001,33 @@

    Method List

  • - #workbook + #workbook - Axlsx::Package + Axlsx::Worksheet
  • - #workbook + #workbook - Axlsx::Worksheet + Axlsx::Package
  • - #worksheet + #worksheet - Axlsx::Drawing + Axlsx::Row
  • - #worksheet + #worksheet - Axlsx::Row + Axlsx::Drawing
  • @@ -3017,17 +3049,17 @@

    Method List

  • - #xfId + #xfId - Axlsx::CellStyle + Axlsx::Xf
  • - #xfId + #xfId - Axlsx::Xf + Axlsx::CellStyle
  • diff --git a/doc/top-level-namespace.html b/doc/top-level-namespace.html index 8b0754bc..da01b08a 100644 --- a/doc/top-level-namespace.html +++ b/doc/top-level-namespace.html @@ -94,7 +94,7 @@

    Defined Under Namespace

    diff --git a/examples/example.rb b/examples/example.rb index fd889556..cb405fe2 100644 --- a/examples/example.rb +++ b/examples/example.rb @@ -59,6 +59,7 @@ p.serialize("example5.xlsx") #Validation + p = Axlsx::Package.new p.workbook.add_worksheet do |sheet| sheet.add_row ["First", "Second", "Third"] @@ -75,7 +76,9 @@ p.workbook.add_worksheet do |sheet| sheet.add_row ["First", 1, 5, 7, 9] sheet.add_row ["Second", 5, 2, 14, 9] - sheet.add_chart(Axlsx::Line3DChart, :start_at => [0,2], :end_at => [10, 15], :title=>"example 6: Line Chart") do |chart| + sheet.add_chart(Axlsx::Line3DChart, :title=>"example 6: Line Chart") do |chart| + chart.start_at 0, 2 + chart.end_at 10, 15 chart.add_series :data=>sheet.rows.first.cells[(1..-1)], :title=> sheet.rows.first.cells.first chart.add_series :data=>sheet.rows.last.cells[(1..-1)], :title=> sheet.rows.last.cells.first end diff --git a/lib/axlsx/drawing/axis.rb b/lib/axlsx/drawing/axis.rb index facc2a67..7e48801a 100644 --- a/lib/axlsx/drawing/axis.rb +++ b/lib/axlsx/drawing/axis.rb @@ -1,9 +1,8 @@ module Axlsx - # the access class defines common properties and values for chart axis + # the access class defines common properties and values for a chart axis. class Axis - - # the id of the axis + # the id of the axis. # @return [Integer] attr_reader :axId @@ -12,6 +11,7 @@ class Axis attr_reader :crossAx # The scaling of the axis + # @see Scaling # @return [Scaling] attr_reader :scaling @@ -25,8 +25,8 @@ class Axis # @return [Symbol] attr_accessor :tickLblPos - # The number format format code for this axis + # default :General # @return [String] attr_accessor :format_code @@ -41,15 +41,16 @@ class Axis # @option options [Symbol] axPos # @option options [Symbol] crosses # @option options [Symbol] tickLblPos + # @raise [ArgumentError] If axId or crossAx are not unsigned integers def initialize(axId, crossAx, options={}) Axlsx::validate_unsigned_int(axId) Axlsx::validate_unsigned_int(crossAx) @axId = axId @crossAx = crossAx + @scaling = Scaling.new(:orientation=>:minMax) self.axPos = :l self.tickLblPos = :nextTo - @scaling = Scaling.new(:orientation=>:minMax) - @formatCode = "" + self.format_code = "General" self.crosses = :autoZero options.each do |o| self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}=" diff --git a/lib/axlsx/drawing/bar_3D_chart.rb b/lib/axlsx/drawing/bar_3D_chart.rb index 1d7e2bba..3d7f6296 100644 --- a/lib/axlsx/drawing/bar_3D_chart.rb +++ b/lib/axlsx/drawing/bar_3D_chart.rb @@ -1,43 +1,17 @@ module Axlsx # The Bar3DChart is a three dimentional barchart (who would have guessed?) that you can add to your worksheet. - # @example Creating a chart - # # This example creates two charts in a single sheet. - # # The first uses data directly fed to the sheet, while the second references cells withing the worksheet for data. - # - # require "rubygems" # if that is your preferred way to manage gems! - # require "axlsx" - # - # p = Axlsx::Package.new - # ws = p.workbook.add_worksheet - # ws.add_row :values => ["This is a chart with no data in the sheet"] - # - # chart = ws.add_chart(Axlsx::Bar3DChart, :start_at=> [0,1], :end_at=>[0,6], :title=>"Most Popular Pets") - # chart.add_series :data => [1, 9, 10], :labels => ["Slimy Reptiles", "Fuzzy Bunnies", "Rottweiler"] - # - # ws.add_row :values => ["This chart uses the data below"] - # title_row = ws.add_row :values => ["Least Popular Pets"] - # label_row = ws.add_row :values => ["", "Dry Skinned Reptiles", "Bald Cats", "Violent Parrots"] - # data_row = ws.add_row :values => ["Votes", 6, 4, 1] - # - # chart = ws.add_chart(Axlsx::Pie3DChart, :start_at => [0,11], :end_at =>[0,16], :title => title_row.cells.last) - # chart.add_series :data => data_row.cells[(1..-1)], :labels => label_row.cells - # - # f = File.open('example_pie_3d_chart.xlsx', 'w') - # p.serialize(f) - # # @see Worksheet#add_chart - # @see Worksheet#add_row # @see Chart#add_series - # @see Series # @see Package#serialize + # @see README for an example class Bar3DChart < Chart # the category axis # @return [CatAxis] attr_reader :catAxis - # the category axis + # the valueaxis # @return [ValAxis] attr_reader :valAxis @@ -60,7 +34,7 @@ class Bar3DChart < Chart attr_accessor :grouping # The shabe of the bars or columns - # must be one of [:percentStacked, :clustered, :standard, :stacked] + # must be one of [:cone, :coneToMax, :box, :cylinder, :pyramid, :pyramidToMax] # @return [Symbol] attr_accessor :shape @@ -76,6 +50,14 @@ class Bar3DChart < Chart # @option options [String] gapWidth # @option options [String] gapDepth # @option options [Symbol] shape + # @option options [Integer] rotX + # @option options [String] hPercent + # @option options [Integer] rotY + # @option options [String] depthPercent + # @option options [Boolean] rAngAx + # @option options [Integer] perspective + # @see Chart + # @see View3D def initialize(frame, options={}) @barDir = :bar @grouping = :clustered @@ -83,9 +65,9 @@ def initialize(frame, options={}) @valAxId = rand(8 ** 8) @catAxis = CatAxis.new(@catAxId, @valAxId) @valAxis = ValAxis.new(@valAxId, @catAxId) - @view3D = View3D.new(:rAngAx=>1) super(frame, options) @series_type = BarSeries + @view3D = View3D.new({:rAngAx=>1}.merge(options)) end def barDir=(v) diff --git a/lib/axlsx/drawing/bar_series.rb b/lib/axlsx/drawing/bar_series.rb index 0f46af15..5e10eb0e 100644 --- a/lib/axlsx/drawing/bar_series.rb +++ b/lib/axlsx/drawing/bar_series.rb @@ -28,8 +28,8 @@ class BarSeries < Series def initialize(chart, options={}) @shape = :box super(chart, options) - self.data = options[:data] || [] - self.labels = options[:labels] || [] + self.labels = CatAxisData.new(options[:labels]) unless options[:labels].nil? + self.data = ValAxisData.new(options[:data]) unless options[:data].nil? end def shape=(v) @@ -42,37 +42,8 @@ def shape=(v) # @return [String] def to_xml(xml) super(xml) do |xml| - if !labels.empty? - xml.send('c:cat') { - xml.send('c:strRef') { - xml.send('c:f', Axlsx::cell_range(labels)) - xml.send('c:strCache') { - xml.send('c:ptCount', :val=>labels.size) - labels.each_with_index do |cell, index| - v = cell.is_a?(Cell) ? cell.value : cell - xml.send('c:pt', :idx=>index) { - xml.send('c:v', v) - } - end - } - } - } - end - xml.send('c:val') { - xml.send('c:numRef') { - xml.send('c:f', Axlsx::cell_range(data)) - xml.send('c:numCache') { - xml.send('c:formatCode', 'General') - xml.send('c:ptCount', :val=>data.size) - data.each_with_index do |cell, index| - v = cell.is_a?(Cell) ? cell.value : cell - xml.send('c:pt', :idx=>index) { - xml.send('c:v', v) - } - end - } - } - } + @labels.to_xml(xml) unless @labels.nil? + @data.to_xml(xml) unless @data.nil? xml.send('c:shape', :val=>@shape) end end @@ -82,10 +53,10 @@ def to_xml(xml) # assigns the data for this series - def data=(v) DataTypeValidator.validate "Series.data", [Array, SimpleTypedList], v; @data = v; end + def data=(v) DataTypeValidator.validate "Series.data", [SimpleTypedList], v; @data = v; end # assigns the labels for this series - def labels=(v) DataTypeValidator.validate "Series.labels", [Array, SimpleTypedList], v; @labels = v; end + def labels=(v) DataTypeValidator.validate "Series.labels", [SimpleTypedList], v; @labels = v; end end diff --git a/lib/axlsx/drawing/cat_axis.rb b/lib/axlsx/drawing/cat_axis.rb index f2458ffc..083eac68 100644 --- a/lib/axlsx/drawing/cat_axis.rb +++ b/lib/axlsx/drawing/cat_axis.rb @@ -1,6 +1,7 @@ module Axlsx #A CatAxis object defines a chart category axis class CatAxis < Axis + # From the docs: This element specifies that this axis is a date or text axis based on the data that is used for the axis labels, not a specific choice. # @return [Boolean] attr_accessor :auto @@ -18,23 +19,20 @@ class CatAxis < Axis # regex for validating label offset LBL_OFFSET_REGEX = /0*(([0-9])|([1-9][0-9])|([1-9][0-9][0-9])|1000)%/ - # Creates a new CatAxis object - # @param [Integer] axId the id of this axis - # @param [Integer] crossAx the id of the perpendicular axis - # @option options [Symbol] axPos - # @option options [Symbol] tickLblPos - # @option options [Symbol] crosses + # Creates a new CatAxis object + # @param [Integer] axId the id of this axis. Inherited + # @param [Integer] crossAx the id of the perpendicular axis. Inherited + # @option options [Symbol] axPos. Inherited + # @option options [Symbol] tickLblPos. Inherited + # @option options [Symbol] crosses. Inherited # @option options [Boolean] auto # @option options [Symbol] lblAlgn # @option options [Integer] lblOffset def initialize(axId, crossAx, options={}) - super(axId, crossAx, options) self.auto = true self.lblAlgn = :ctr self.lblOffset = "100%" - options.each do |o| - self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}=" - end + super(axId, crossAx, options) end def auto=(v) Axlsx::validate_boolean(v); @auto = v; end diff --git a/lib/axlsx/drawing/cat_axis_data.rb b/lib/axlsx/drawing/cat_axis_data.rb new file mode 100644 index 00000000..83dfa56e --- /dev/null +++ b/lib/axlsx/drawing/cat_axis_data.rb @@ -0,0 +1,34 @@ +module Axlsx + # The CatAxisData class serializes the category axis data for a chart + class CatAxisData < SimpleTypedList + + # Create a new CatAxisData object + # @param [Array, SimpleTypedList] data the data for this category axis. This can be a simple array or a simple typed list of cells. + def initialize(data=[]) + super Object + @list.concat data if data.is_a?(Array) + end + + # Serializes the category axis data + # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to. + # @return [String] + def to_xml(xml) + xml.send('c:cat') { + xml.send('c:strRef') { + xml.send('c:f', Axlsx::cell_range(@list)) + xml.send('c:strCache') { + xml.send('c:ptCount', :val=>size) + each_with_index do |item, index| + v = item.is_a?(Cell) ? item.value : item + xml.send('c:pt', :idx=>index) { + xml.send('c:v', v) + } + end + } + } + } + end + + end + +end diff --git a/lib/axlsx/drawing/chart.rb b/lib/axlsx/drawing/chart.rb index 315d9499..bf4a1bff 100644 --- a/lib/axlsx/drawing/chart.rb +++ b/lib/axlsx/drawing/chart.rb @@ -2,19 +2,12 @@ module Axlsx # A Chart is the superclass for specific charts # @note Worksheet#add_chart is the recommended way to create charts for your worksheets. + # @see README for examples class Chart - # The title object for the chart. - # @return [Title] - attr_accessor :title - - # The style for the chart. - # see ECMA Part 1 §21.2.2.196 - # @return [Integer] - attr_accessor :style # The 3D view properties for the chart - attr_accessor :view3D + attr_reader :view3D # A reference to the graphic frame that owns this chart # @return [GraphicFrame] @@ -24,7 +17,7 @@ class Chart # @return [SimpleTypedList] attr_reader :series - # The type of series to use for this chart + # The type of series to use for this chart. # @return [Series] attr_reader :series_type @@ -39,13 +32,14 @@ class Chart #TODO data labels! #attr_accessor :dLabls - # The starting marker for this chart - # @return [Marker] - attr_reader :start_at + # The title object for the chart. + # @return [Title] + attr_accessor :title - # The ending marker for this chart - # @return [Marker] - attr_reader :end_at + # The style for the chart. + # see ECMA Part 1 §21.2.2.196 + # @return [Integer] + attr_accessor :style # Show the legend in the chart # @return [Boolean] @@ -65,6 +59,8 @@ def initialize(frame, options={}) options.each do |o| self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}=" end + start_at *options[:start_at] if options[:start_at] + end_at *options[:end_at] if options[:start_at] yield self if block_given? end @@ -76,8 +72,6 @@ def pn "#{CHART_PN % (index+1)}" end - def view3D=(v) DataTypeValidator.validate "#{self.class}.view3D", View3D, v; @view3D = v; end - def title=(v) v = Title.new(v) if v.is_a?(String) || v.is_a?(Cell) DataTypeValidator.validate "#{self.class}.title", Title, v @@ -88,6 +82,19 @@ def show_legend=(v) Axlsx::validate_boolean(v); @show_legend = v; end def style=(v) DataTypeValidator.validate "Chart.style", Integer, v, lambda { |v| v >= 1 && v <= 48 }; @style = v; end + # backwards compatibility to allow chart.to and chart.from access to anchor markers + # @note This will be disconinued in version 2.0.0. Please use the end_at method + def to + @graphic_frame.anchor.to + end + + # backwards compatibility to allow chart.to and chart.from access to anchor markers + # @note This will be disconinued in version 2.0.0. please use the start_at method + # + def from + @graphic_frame.anchor.from + end + # Adds a new series to the chart's series collection. # @return [Series] # @see Series @@ -122,10 +129,30 @@ def to_xml builder.to_xml end + # This is a short cut method to set the start anchor position + # If you need finer granularity in positioning use + # graphic_frame.anchor.from.colOff / rowOff + # @param [Integer] x The column + # @param [Integer] y The row + # @return [Marker] + def start_at(x, y) + @graphic_frame.anchor.from.col = x + @graphic_frame.anchor.from.row = y + end + + # This is a short cut method to set the end anchor position + # If you need finer granularity in positioning use + # graphic_frame.anchor.to.colOff / rowOff + # @param [Integer] x The column + # @param [Integer] y The row + # @return [Marker] + def end_at(x, y) + @graphic_frame.anchor.to.col = x + @graphic_frame.anchor.to.row = y + end + private - - def start_at=(v) DataTypeValidator.validate "#{self.class}.start_at", Marker, v; @start_at = v; end - def end_at=(v) DataTypeValidator.validate "#{self.class}.end_at", Marker, v; @end_at = v; end + def view3D=(v) DataTypeValidator.validate "#{self.class}.view3D", View3D, v; @view3D = v; end end end diff --git a/lib/axlsx/drawing/drawing.rb b/lib/axlsx/drawing/drawing.rb index 83902143..385cd592 100644 --- a/lib/axlsx/drawing/drawing.rb +++ b/lib/axlsx/drawing/drawing.rb @@ -6,35 +6,39 @@ module Axlsx require 'axlsx/drawing/bar_series.rb' require 'axlsx/drawing/line_series.rb' + require 'axlsx/drawing/scaling.rb' require 'axlsx/drawing/axis.rb' require 'axlsx/drawing/ser_axis.rb' require 'axlsx/drawing/cat_axis.rb' require 'axlsx/drawing/val_axis.rb' - require 'axlsx/drawing/view_3D.rb' - require 'axlsx/drawing/scaling.rb' - require 'axlsx/drawing/graphic_frame.rb' + require 'axlsx/drawing/cat_axis_data.rb' + require 'axlsx/drawing/val_axis_data.rb' + require 'axlsx/drawing/marker.rb' require 'axlsx/drawing/two_cell_anchor.rb' + require 'axlsx/drawing/graphic_frame.rb' + require 'axlsx/drawing/view_3D.rb' require 'axlsx/drawing/chart.rb' require 'axlsx/drawing/pie_3D_chart.rb' require 'axlsx/drawing/bar_3D_chart.rb' require 'axlsx/drawing/line_3D_chart.rb' - # A Drawing is a canvas for charts. Each worksheet has a single drawing that can specify multiple anchors which reference charts. - # @note The recommended way to manage drawings is to use the Worksheet.add_chart method, specifying the chart class, start and end marker locations. + # A Drawing is a canvas for charts. Each worksheet has a single drawing that manages anchors. + # The anchors reference the charts via graphical frames. This is not a trivial relationship so please do follow the advice in the note. + # @note The recommended way to manage drawings is to use the Worksheet.add_chart method. # @see Worksheet#add_chart - # @see TwoCellAnchor # @see Chart + # see README for an example of how to create a chart. class Drawing # The worksheet that owns the drawing # @return [Worksheet] attr_reader :worksheet - # A collection of anchors for this drawing + # only TwoCellAnchors are supported in this version # @return [SimpleTypedList] attr_reader :anchors @@ -72,12 +76,10 @@ def initialize(worksheet) end - # Adds a chart to the drawing. - # @note The recommended way to manage charts is to use Worksheet.add_chart. - # @param [Chart] chart_type The class of the chart to be added to the drawing - # @param [Hash] options + # Adds a chart to the drawing. + # @note The recommended way to manage charts is to use Worksheet.add_chart. Please refer to that method for documentation. + # @see Worksheet#add_chart def add_chart(chart_type, options={}) - DataTypeValidator.validate "Drawing.chart_type", Chart, chart_type TwoCellAnchor.new(self, chart_type, options) @anchors.last.graphic_frame.chart end diff --git a/lib/axlsx/drawing/graphic_frame.rb b/lib/axlsx/drawing/graphic_frame.rb index 3fe71976..5e09fb8a 100644 --- a/lib/axlsx/drawing/graphic_frame.rb +++ b/lib/axlsx/drawing/graphic_frame.rb @@ -22,6 +22,7 @@ class GraphicFrame # @param [TwoCellAnchor] anchor # @param [Class] chart_type def initialize(anchor, chart_type, options) + DataTypeValidator.validate "Drawing.chart_type", Chart, chart_type @anchor = anchor @chart = chart_type.new(self, options) end diff --git a/lib/axlsx/drawing/line_3D_chart.rb b/lib/axlsx/drawing/line_3D_chart.rb index 39500f75..6fb34afb 100644 --- a/lib/axlsx/drawing/line_3D_chart.rb +++ b/lib/axlsx/drawing/line_3D_chart.rb @@ -46,8 +46,18 @@ class Line3DChart < Chart # Creates a new line chart object # @param [GraphicFrame] frame The workbook that owns this chart. + # @option options [Cell, String] title + # @option options [Boolean] show_legend # @option options [Symbol] grouping # @option options [String] gapDepth + # @option options [Integer] rotX + # @option options [String] hPercent + # @option options [Integer] rotY + # @option options [String] depthPercent + # @option options [Boolean] rAngAx + # @option options [Integer] perspective + # @see Chart + # @see View3D def initialize(frame, options={}) @grouping = :standard @catAxId = rand(8 ** 8) @@ -56,9 +66,9 @@ def initialize(frame, options={}) @catAxis = CatAxis.new(@catAxId, @valAxId) @valAxis = ValAxis.new(@valAxId, @catAxId) @serAxis = SerAxis.new(@serAxId, @valAxId) - @view3D = View3D.new(:perspective=>30) super(frame, options) @series_type = LineSeries + @view3D = View3D.new({:perspective=>30}.merge(options)) end def grouping=(v) diff --git a/lib/axlsx/drawing/line_series.rb b/lib/axlsx/drawing/line_series.rb index db509d38..eea1e0ee 100644 --- a/lib/axlsx/drawing/line_series.rb +++ b/lib/axlsx/drawing/line_series.rb @@ -6,11 +6,11 @@ module Axlsx class LineSeries < Series # The data for this series. - # @return [Array, SimpleTypedList] + # @return [ValAxisData] attr_reader :data # The labels for this series. - # @return [Array, SimpleTypedList] + # @return [CatAxisData] attr_reader :labels # Creates a new series @@ -19,58 +19,28 @@ class LineSeries < Series # @param [Chart] chart def initialize(chart, options={}) super(chart, options) - self.data = options[:data] || [] - self.labels = options[:labels] || [] + self.labels = CatAxisData.new(options[:labels]) unless options[:labels].nil? + self.data = ValAxisData.new(options[:data]) unless options[:data].nil? end # Serializes the series # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to. # @return [String] + # TODO create series_cat and series_val classes as this serialization is duplicated def to_xml(xml) super(xml) do |xml| - if !labels.empty? - xml.send('c:cat') { - xml.send('c:strRef') { - xml.send('c:f', Axlsx::cell_range(labels)) - xml.send('c:strCache') { - xml.send('c:ptCount', :val=>labels.size) - labels.each_with_index do |cell, index| - v = cell.is_a?(Cell) ? cell.value : cell - xml.send('c:pt', :idx=>index) { - xml.send('c:v', v) - } - end - } - } - } - end - xml.send('c:val') { - xml.send('c:numRef') { - xml.send('c:f', Axlsx::cell_range(data)) - xml.send('c:numCache') { - xml.send('c:formatCode', 'General') - xml.send('c:ptCount', :val=>data.size) - data.each_with_index do |cell, index| - v = cell.is_a?(Cell) ? cell.value : cell - xml.send('c:pt', :idx=>index) { - xml.send('c:v', v) - } - end - } - } - } + @labels.to_xml(xml) unless @labels.nil? + @data.to_xml(xml) unless @data.nil? end end - - private + private # assigns the data for this series - def data=(v) DataTypeValidator.validate "Series.data", [Array, SimpleTypedList], v; @data = v; end + def data=(v) DataTypeValidator.validate "Series.data", [SimpleTypedList], v; @data = v; end # assigns the labels for this series - def labels=(v) DataTypeValidator.validate "Series.labels", [Array, SimpleTypedList], v; @labels = v; end + def labels=(v) DataTypeValidator.validate "Series.labels", [SimpleTypedList], v; @labels = v; end end - end diff --git a/lib/axlsx/drawing/pie_3D_chart.rb b/lib/axlsx/drawing/pie_3D_chart.rb index cf835bfd..dacba313 100644 --- a/lib/axlsx/drawing/pie_3D_chart.rb +++ b/lib/axlsx/drawing/pie_3D_chart.rb @@ -2,47 +2,30 @@ module Axlsx # The Pie3DChart is a three dimentional piechart (who would have guessed?) that you can add to your worksheet. - # @example Creating a chart - # # This example creates two charts in a single sheet. - # # The first uses data directly fed to the sheet, while the second references cells withing the worksheet for data. - # - # require "rubygems" # if that is your preferred way to manage gems! - # require "axlsx" - # - # p = Axlsx::Package.new - # ws = p.workbook.add_worksheet - # ws.add_row :values => ["This is a chart with no data in the sheet"] - # - # chart = ws.add_chart(Axlsx::Pie3DChart, :start_at=> [0,1], :end_at=>[0,6], :title=>"Most Popular Pets") - # chart.add_series :data => [1, 9, 10], :labels => ["Slimy Reptiles", "Fuzzy Bunnies", "Rottweiler"] - # - # ws.add_row :values => ["This chart uses the data below"] - # title_row = ws.add_row :values => ["Least Popular Pets"] - # label_row = ws.add_row :values => ["", "Dry Skinned Reptiles", "Bald Cats", "Violent Parrots"] - # data_row = ws.add_row :values => ["Votes", 6, 4, 1] - # - # chart = ws.add_chart(Axlsx::Pie3DChart, :start_at => [0,11], :end_at =>[0,16], :title => title_row.cells.last) - # chart.add_series :data => data_row.cells[(1..-1)], :labels => label_row.cells - # - # f = File.open('example_pie_3d_chart.xlsx', 'w') - # p.serialize(f) - # # @see Worksheet#add_chart - # @see Worksheet#add_row # @see Chart#add_series - # @see Series - # @see Package#serialize + # @see README for an example class Pie3DChart < Chart - # Creates a new pie chart object - # @param [Workbook] workbook The workbook that owns this chart. + # @param [GraphicFrame] frame The workbook that owns this chart. # @option options [Cell, String] title - def initialize(workbook, options={}) - # this charts series type - super(workbook, options) + # @option options [Boolean] show_legend + # @option options [Symbol] grouping + # @option options [String] gapDepth + # @option options [Integer] rotX + # @option options [String] hPercent + # @option options [Integer] rotY + # @option options [String] depthPercent + # @option options [Boolean] rAngAx + # @option options [Integer] perspective + # @see Chart + # @see View3D + def initialize(frame, options={}) + super(frame, options) @series_type = PieSeries - @view3D = View3D.new(:rotX => 30, :perspective => 30) + @view3D = View3D.new({:rotX=>30, :perspective=>30}.merge(options)) + end # Serializes the pie chart diff --git a/lib/axlsx/drawing/pie_series.rb b/lib/axlsx/drawing/pie_series.rb index 98b61728..1f20058d 100644 --- a/lib/axlsx/drawing/pie_series.rb +++ b/lib/axlsx/drawing/pie_series.rb @@ -1,22 +1,20 @@ module Axlsx - # A PieSeries defines the title, data and labels for pie charts + # A PieSeries defines the data and labels and explosion for pie charts series. # @note The recommended way to manage series is to use Chart#add_series # @see Worksheet#add_chart # @see Chart#add_series class PieSeries < Series # The data for this series. - # @return [Array, SimpleTypedList] + # @return [SimpleTypedList] attr_reader :data - # The labels for this series. - # @return [Array, SimpleTypedList] + # @return [SimpleTypedList] attr_reader :labels - # The explosion for this series - # @return [Array, SimpleTypedList] + # @return [Integert] attr_accessor :explosion # Creates a new series @@ -27,61 +25,29 @@ class PieSeries < Series # @param [Chart] chart def initialize(chart, options={}) super(chart, options) - self.data = options[:data] || [] - self.labels = options[:labels] || [] + self.labels = CatAxisData.new(options[:labels]) unless options[:labels].nil? + self.data = ValAxisData.new(options[:data]) unless options[:data].nil? end def explosion=(v) Axlsx::validate_unsigned_int(v); @explosion = v; end + # Serializes the series # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to. # @return [String] def to_xml(xml) super(xml) do |xml| xml.send('c:explosion', :val=>@explosion) unless @explosion.nil? - if !labels.empty? - xml.send('c:cat') { - xml.send('c:strRef') { - xml.send('c:f', Axlsx::cell_range(labels)) - xml.send('c:strCache') { - xml.send('c:ptCount', :val=>labels.size) - labels.each_with_index do |cell, index| - v = cell.is_a?(Cell) ? cell.value : cell - xml.send('c:pt', :idx=>index) { - xml.send('c:v', v) - } - end - } - } - } - end - xml.send('c:val') { - xml.send('c:numRef') { - xml.send('c:f', Axlsx::cell_range(data)) - xml.send('c:numCache') { - xml.send('c:formatCode', 'General') - xml.send('c:ptCount', :val=>data.size) - data.each_with_index do |cell, index| - v = cell.is_a?(Cell) ? cell.value : cell - xml.send('c:pt', :idx=>index) { - xml.send('c:v', v) - } - end - } - } - } - + @labels.to_xml(xml) unless @labels.nil? + @data.to_xml(xml) unless @data.nil? end end - - private - # assigns the data for this series - def data=(v) DataTypeValidator.validate "Series.data", [Array, SimpleTypedList], v; @data = v; end + def data=(v) DataTypeValidator.validate "Series.data", [SimpleTypedList], v; @data = v; end # assigns the labels for this series - def labels=(v) DataTypeValidator.validate "Series.labels", [Array, SimpleTypedList], v; @labels = v; end + def labels=(v) DataTypeValidator.validate "Series.labels", [SimpleTypedList], v; @labels = v; end end diff --git a/lib/axlsx/drawing/ser_axis.rb b/lib/axlsx/drawing/ser_axis.rb index 091a7d64..a086b23c 100644 --- a/lib/axlsx/drawing/ser_axis.rb +++ b/lib/axlsx/drawing/ser_axis.rb @@ -1,30 +1,29 @@ module Axlsx - #A SarAxis object defines a series axis + #A SerAxis object defines a series axis class SerAxis < Axis - # @return [Boolean] + # The number of tick lables to skip between labels + # @return [Integer] attr_accessor :tickLblSkip + # The number of tickmarks to be skipped before the next one is rendered. # @return [Boolean] attr_accessor :tickMarkSkip # Creates a new SerAxis object - # @param [Integer] axId the id of this axis - # @param [Integer] crossAx the id of the perpendicular axis - # @option options [Symbol] axPos - # @option options [Symbol] tickLblPos - # @option options [Symbol] crosses - # @option options [Boolean] tickLblSkip - # @option options [Symbol] tickMarkSkip + # @param [Integer] axId the id of this axis. Inherited + # @param [Integer] crossAx the id of the perpendicular axis. Inherited + # @option options [Symbol] axPos. Inherited + # @option options [Symbol] tickLblPos. Inherited + # @option options [Symbol] crosses. Inherited + # @option options [Integer] tickLblSkip + # @option options [Integer] tickMarkSkip def initialize(axId, crossAx, options={}) super(axId, crossAx, options) - options.each do |o| - self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}=" - end end - def tickLblSkip=(v) Axlsx::validate_boolean(v); @tickLblSkip = v; end - def tickMarkSkip=(v) Axlsx::validate_boolean(v); @tickMarkSkip = v; end + def tickLblSkip=(v) Axlsx::validate_unsigned_int(v); @tickLblSkip = v; end + def tickMarkSkip=(v) Axlsx::validate_unsigned_int(v); @tickMarkSkip = v; end # Serializes the series axis # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to. diff --git a/lib/axlsx/drawing/series.rb b/lib/axlsx/drawing/series.rb index 51957acc..cb5d6a8d 100644 --- a/lib/axlsx/drawing/series.rb +++ b/lib/axlsx/drawing/series.rb @@ -1,5 +1,5 @@ module Axlsx - # A Series defines the title, data and labels for chart data. + # A Series defines the common series attributes and is the super class for all concrete series types. # @note The recommended way to manage series is to use Chart#add_series # @see Worksheet#add_chart # @see Chart#add_series @@ -13,7 +13,7 @@ class Series # @return [Integer] attr_reader :index - # The order of this series in the chart's series. + # The order of this series in the chart's series. By default the order is the index of the series. # @return [Integer] attr_accessor :order @@ -33,7 +33,6 @@ def initialize(chart, options={}) end end - # retrieves the series index in the chart's series collection def index @chart.series.index(self) end diff --git a/lib/axlsx/drawing/series_title.rb b/lib/axlsx/drawing/series_title.rb index 32b5b102..bfb1b56f 100644 --- a/lib/axlsx/drawing/series_title.rb +++ b/lib/axlsx/drawing/series_title.rb @@ -1,5 +1,5 @@ module Axlsx - # A series title is a Title with a slightly different serialization + # A series title is a Title with a slightly different serialization than chart titles. class SeriesTitle < Title # Serializes the series title diff --git a/lib/axlsx/drawing/two_cell_anchor.rb b/lib/axlsx/drawing/two_cell_anchor.rb index aa9c04aa..62491b8c 100644 --- a/lib/axlsx/drawing/two_cell_anchor.rb +++ b/lib/axlsx/drawing/two_cell_anchor.rb @@ -23,51 +23,24 @@ class TwoCellAnchor # @return [Integer] attr_reader :index - # Creates a new TwoCellAnchor object + # Creates a new TwoCellAnchor object and sets up a reference to the from and to markers in the + # graphic_frame's chart. That means that you can do stuff like + # c = worksheet.add_chart Axlsx::Chart + # c.start_at 5, 9 # @param [Drawing] drawing - # @param [Chart] chart - # @option options [Array] start_at - # @option options [Array] end_at + # @param [Class] chart_type This is passed to the graphic frame for instantiation. must be Chart or a subclass of Chart + # @option options [Array] start_at the col, row to start at + # @option options [Array] end_at the col, row to end at def initialize(drawing, chart_type, options) @drawing = drawing drawing.anchors << self - @from, @to = Marker.new, Marker.new(:col => 5, :row=>10) @graphic_frame = GraphicFrame.new(self, chart_type, options) - - self.start_at(options[:start_at][0], options[:start_at][1]) if options[:start_at].is_a?(Array) - self.end_at(options[:end_at][0], options[:end_at][1]) if options[:end_at].is_a?(Array) - # passing a reference to our start and end markers for convenience - # this lets us access the markers directly from the chart. - @graphic_frame.chart.send(:start_at=, @from) - @graphic_frame.chart.send(:end_at=, @to) end def index @drawing.anchors.index(self) end - - - # This is a short cut method to set the start anchor position - # @param [Integer] x The column - # @param [Integer] y The row - # @return [Marker] - def start_at(x, y) - @from.col = x - @from.row = y - @from - end - - # This is a short cut method to set the end anchor position - # @param [Integer] x The column - # @param [Integer] y The row - # @return [Marker] - def end_at(x, y) - @to.col = x - @to.row = y - @to - end - # Serializes the two cell anchor # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to. # @return [String] @@ -84,5 +57,8 @@ def to_xml(xml) xml.send('xdr:clientData') } end + + private + end end diff --git a/lib/axlsx/drawing/val_axis.rb b/lib/axlsx/drawing/val_axis.rb index fae6adec..10a070f6 100644 --- a/lib/axlsx/drawing/val_axis.rb +++ b/lib/axlsx/drawing/val_axis.rb @@ -2,7 +2,7 @@ module Axlsx # the ValAxis class defines a chart value axis. class ValAxis < Axis - # This element specifies whether the value axis crosses the category axis between categories. + # This element specifies how the value axis crosses the category axis. # must be one of [:between, :midCat] # @return [Symbol] attr_accessor :crossBetween @@ -11,17 +11,17 @@ class ValAxis < Axis # @param [Integer] axId the id of this axis # @param [Integer] crossAx the id of the perpendicular axis # @option options [Symbol] axPos - # @option options [Symbol] crosses # @option options [Symbol] tickLblPos + # @option options [Symbol] crosses # @option options [Symbol] crossesBetween def initialize(axId, crossAx, options={}) - @crossBetween = :between + self.crossBetween = :between super(axId, crossAx, options) end def crossBetween=(v) RestrictionValidator.validate "ValAxis.crossBetween", [:between, :midCat], v; @crossBetween = v; end - # Serializes the value axis + # Serializes the value axis # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to. # @return [String] def to_xml(xml) diff --git a/lib/axlsx/drawing/val_axis_data.rb b/lib/axlsx/drawing/val_axis_data.rb new file mode 100644 index 00000000..6a24a1ef --- /dev/null +++ b/lib/axlsx/drawing/val_axis_data.rb @@ -0,0 +1,28 @@ +module Axlsx + # The ValAxisData class manages the values for a chart value series. + class ValAxisData < CatAxisData + + # Serializes the value axis data + # @param [Nokogiri::XML::Builder] xml The document builder instance this objects xml will be added to. + # @return [String] + def to_xml(xml) + xml.send('c:val') { + xml.send('c:numRef') { + xml.send('c:f', Axlsx::cell_range(@list)) + xml.send('c:numCache') { + xml.send('c:formatCode', 'General') + xml.send('c:ptCount', :val=>size) + each_with_index do |item, index| + v = item.is_a?(Cell) ? item.value : item + xml.send('c:pt', :idx=>index) { + xml.send('c:v', v) + } + end + } + } + } + end + + end + +end diff --git a/lib/axlsx/drawing/view_3D.rb b/lib/axlsx/drawing/view_3D.rb index 36a869cf..1065d778 100644 --- a/lib/axlsx/drawing/view_3D.rb +++ b/lib/axlsx/drawing/view_3D.rb @@ -1,6 +1,13 @@ module Axlsx # 3D attributes for a chart. class View3D + + # Validation for hPercent + H_PERCENT_REGEX = /0*(([5-9])|([1-9][0-9])|([1-4][0-9][0-9])|500)%/ + + # validation for depthPercent + DEPTH_PERCENT_REGEX = /0*(([2-9][0-9])|([1-9][0-9][0-9])|(1[0-9][0-9][0-9])|2000)%/ + # x rotation for the chart # must be between -90 and 90 # @return [Integer] @@ -41,18 +48,17 @@ def initialize(options={}) self.send("#{o[0]}=", o[1]) if self.respond_to? "#{o[0]}=" end end - - # Validation for hPercent - H_PERCENT_REGEX = /0*(([5-9])|([1-9][0-9])|([1-4][0-9][0-9])|500)%/ - - # validation for depthPercent - DEPTH_PERCENT_REGEX = /0*(([2-9][0-9])|([1-9][0-9][0-9])|(1[0-9][0-9][0-9])|2000)%/ def rotX=(v) DataTypeValidator.validate "#{self.class}.rotX", [Integer, Fixnum], v, lambda {|v| v >= -90 && v <= 90 }; @rotX = v; end + def hPercent=(v) RegexValidator.validate "#{self.class}.rotX", H_PERCENT_REGEX, v; @hPercent = v; end + def rotY=(v) DataTypeValidator.validate "#{self.class}.rotY", [Integer, Fixnum], v, lambda {|v| v >= 0 && v <= 360 }; @rotY = v; end + def depthPercent=(v) RegexValidator.validate "#{self.class}.depthPercent", DEPTH_PERCENT_REGEX, v; @depthPercent = v; end + def rAngAx=(v) Axlsx::validate_boolean(v); @rAngAx = v; end + def perspective=(v) DataTypeValidator.validate "#{self.class}.perspective", [Integer, Fixnum], v, lambda {|v| v >= 0 && v <= 240 }; @perspective = v; end # Serializes the view3D properties diff --git a/lib/axlsx/util/simple_typed_list.rb b/lib/axlsx/util/simple_typed_list.rb index 7bb656cd..53b7b994 100644 --- a/lib/axlsx/util/simple_typed_list.rb +++ b/lib/axlsx/util/simple_typed_list.rb @@ -100,6 +100,11 @@ def protected? index index < @locked_at end + # override the equality method so that this object can be compared to a simple array. + # if this object's list is equal to the specifiec array, we return true. + def ==(v) + v == @list + end # method_mission override to pass allowed methods to the list. # @note # the following methods are not allowed @@ -123,12 +128,12 @@ def protected? index # :drop_while # :delete_if # :clear - # :concat def method_missing(meth, *args, &block) - raise ArgumentError, "#{meth} not supported" if [:replace, :insert, :collect!, :map!, :pop, :delete_if, :reverse!, :shift, :shuffle!, :slice!, :sort!, :uniq!, :unshift, :zip, :flatten!, :fill, :drop, :drop_while, :delete_if, :clear, :concat].include? meth.to_sym + raise ArgumentError, "#{meth} not supported" if [:replace, :insert, :collect!, :map!, :pop, :delete_if, :reverse!, :shift, :shuffle!, :slice!, :sort!, :uniq!, :unshift, :zip, :flatten!, :fill, :drop, :drop_while, :delete_if, :clear].include? meth.to_sym if @list.respond_to? meth @list.send(meth, *args, &block) else + puts "method:#{meth.inspect}" super end end diff --git a/lib/axlsx/workbook/worksheet/worksheet.rb b/lib/axlsx/workbook/worksheet/worksheet.rb index 4cc9d783..c82dbde9 100644 --- a/lib/axlsx/workbook/worksheet/worksheet.rb +++ b/lib/axlsx/workbook/worksheet/worksheet.rb @@ -100,11 +100,19 @@ def add_row(values=[], options={}) @rows.last end - # Adds a chart to this worksheets drawing. + # Adds a chart to this worksheets drawing. This is the recommended way to create charts for your worksheet. This method wraps the complexity of dealing with ooxml drawing, anchors, markers graphic frames chart objects and all the other dirty details. # @param [Class] chart_type # @option options [Array] start_at # @option options [Array] end_at # @option options [Cell, String] title + # @option options [Boolean] show_legend + # @option options [Integer] style + # @note each chart type also specifies additional options + # @see Chart + # @see Pie3DChart + # @see Bar3DChart + # @see Line3DChart + # @see README for examples def add_chart(chart_type, options={}) chart = drawing.add_chart(chart_type, options) yield chart if block_given? diff --git a/test/drawing/tc_axis.rb b/test/drawing/tc_axis.rb index 6b08d842..426bf4ad 100644 --- a/test/drawing/tc_axis.rb +++ b/test/drawing/tc_axis.rb @@ -14,6 +14,7 @@ def test_initialization assert_equal(@axis.tickLblPos, :nextTo, "tick label position default incorrect") assert_equal(@axis.crosses, :autoZero, "tick label position default incorrect") assert(@axis.scaling.is_a?(Axlsx::Scaling) && @axis.scaling.orientation == :minMax, "scaling default incorrect") + assert_raise(ArgumentError) { Axlsx::Axis.new -1234, 'abcd' } end def test_axis_position diff --git a/test/drawing/tc_cat_axis_data.rb b/test/drawing/tc_cat_axis_data.rb new file mode 100644 index 00000000..e8a71fb1 --- /dev/null +++ b/test/drawing/tc_cat_axis_data.rb @@ -0,0 +1,18 @@ +require 'test/unit' +require 'axlsx.rb' + +class TestCatAxisData < Test::Unit::TestCase + + def setup + p = Axlsx::Package.new + @ws = p.workbook.add_worksheet + chart = @ws.drawing.add_chart Axlsx::Bar3DChart + @series = chart.add_series :labels=>["zero", "one", "two"] + end + + def test_initialize + assert(@series.labels.is_a?Axlsx::SimpleTypedList) + assert_equal(@series.labels, ["zero", "one", "two"]) + end + +end diff --git a/test/drawing/tc_chart.rb b/test/drawing/tc_chart.rb index 586df2c5..f303fab9 100644 --- a/test/drawing/tc_chart.rb +++ b/test/drawing/tc_chart.rb @@ -34,6 +34,18 @@ def test_style assert_equal(@chart.style, 2) end + def test_start_at + @chart.start_at 15,25 + assert_equal(@chart.graphic_frame.anchor.from.col, 15) + assert_equal(@chart.graphic_frame.anchor.from.row, 25) + + end + + def end_at + @chart.end_at 25, 90 + assert_equal(@chart.graphic_frame.anchor.from.col, 25) + assert_equal(@chart.graphic_frame.anchor.to.row, 90) + end def test_add_series s = @chart.add_series :data=>[0,1,2,3], :labels => ["one", 1, "anything"], :title=>"bob" diff --git a/test/drawing/tc_line_series.tc b/test/drawing/tc_line_series.rb similarity index 72% rename from test/drawing/tc_line_series.tc rename to test/drawing/tc_line_series.rb index 54cbc256..602e7770 100644 --- a/test/drawing/tc_line_series.tc +++ b/test/drawing/tc_line_series.rb @@ -14,7 +14,6 @@ def test_initialize assert_equal(@series.title.text, "bob", "series title has been applied") assert_equal(@series.data, [0,1,2], "data option applied") assert_equal(@series.labels, ["zero", "one","two"], "labels option applied") - assert_equal(@series.shape, :box, "series shape has been applied") end def test_data @@ -25,10 +24,4 @@ def test_labels assert_equal(@series.labels, ["zero", "one", "two"]) end - def test_shape - assert_raise(ArgumentError, "require valid shape") { @series.shape = :teardropt } - assert_nothing_raised("allow valid shape") { @series.shape = :cone } - assert(@series.shape == :cone) - end - end diff --git a/test/drawing/tc_ser_axis.rb b/test/drawing/tc_ser_axis.rb index 1882e1f1..3d744907 100644 --- a/test/drawing/tc_ser_axis.rb +++ b/test/drawing/tc_ser_axis.rb @@ -8,16 +8,24 @@ def setup def teardown end + def test_options + a = Axlsx::SerAxis.new 12345, 54321, :tickLblSkip => 9, :tickMarkSkip => 7 + assert_equal(a.tickLblSkip, 9) + assert_equal(a.tickMarkSkip, 7) + end + + def test_tickLblSkip - assert_raise(ArgumentError, "requires valid tickLblSkip") { @axis.tickLblSkip = :my_eyes } - assert_nothing_raised("accepts valid tickLblSkip") { @axis.tickLblSkip = false } - assert_equal(@axis.tickLblSkip, false) + assert_raise(ArgumentError, "requires valid tickLblSkip") { @axis.tickLblSkip = -1 } + assert_nothing_raised("accepts valid tickLblSkip") { @axis.tickLblSkip = 1 } + assert_equal(@axis.tickLblSkip, 1) end + def test_tickMarkSkip assert_raise(ArgumentError, "requires valid tickMarkSkip") { @axis.tickMarkSkip = :my_eyes } - assert_nothing_raised("accepts valid tickMarkSkip") { @axis.tickMarkSkip = false } - assert_equal(@axis.tickMarkSkip, false) + assert_nothing_raised("accepts valid tickMarkSkip") { @axis.tickMarkSkip = 2 } + assert_equal(@axis.tickMarkSkip, 2) end end diff --git a/test/drawing/tc_two_cell_anchor.rb b/test/drawing/tc_two_cell_anchor.rb index 1c6e6882..2d87b6a7 100644 --- a/test/drawing/tc_two_cell_anchor.rb +++ b/test/drawing/tc_two_cell_anchor.rb @@ -2,13 +2,14 @@ require 'axlsx.rb' class TestTwoCellAnchor < Test::Unit::TestCase + def setup - @p = Axlsx::Package.new - ws = @p.workbook.add_worksheet - @row = ws.add_row ["one", 1, Time.now] - @title = Axlsx::Title.new - @chart = ws.add_chart Axlsx::Bar3DChart - @anchor = @chart.graphic_frame.anchor + p = Axlsx::Package.new + @ws = p.workbook.add_worksheet + row = @ws.add_row ["one", 1, Time.now] + title = Axlsx::Title.new + chart = @ws.add_chart Axlsx::Bar3DChart + @anchor = chart.graphic_frame.anchor end def teardown @@ -20,18 +21,18 @@ def test_initialization assert(@anchor.to.col == 5) assert(@anchor.to.row == 10) end + - def test_start_at - @anchor.start_at 5, 10 - assert(@anchor.from.col == 5) - assert(@anchor.from.row == 10) - end - - def test_end_at - @anchor.end_at 10, 15 - assert(@anchor.to.col == 10) - assert(@anchor.to.row == 15) + def test_options + assert_raise(ArgumentError, 'invalid start_at') { @ws.add_chart Axlsx::Chart, :start_at=>[1] } + assert_raise(ArgumentError, 'invalid end_at') { @ws.add_chart Axlsx::Chart, :start_at=>[1,2], :end_at => ["a", 4] } + # this is actually raised in the graphic frame + assert_raise(ArgumentError, 'invalid Chart') { @ws.add_chart Axlsx::TwoCellAnchor } + a = @ws.add_chart Axlsx::Chart, :start_at => [15, 35], :end_at => [90, 45] + assert_equal(a.graphic_frame.anchor.from.col, 15) + assert_equal(a.graphic_frame.anchor.from.row, 35) + assert_equal(a.graphic_frame.anchor.to.col, 90) + assert_equal(a.graphic_frame.anchor.to.row, 45) end - end diff --git a/test/drawing/tc_val_axis.rb b/test/drawing/tc_val_axis.rb index 2dcdd416..4bd8b883 100644 --- a/test/drawing/tc_val_axis.rb +++ b/test/drawing/tc_val_axis.rb @@ -12,6 +12,11 @@ def test_initialization assert_equal(@axis.crossBetween, :between, "axis crossBetween default incorrect") end + def test_options + a = Axlsx::ValAxis.new 2345, 4321, :crossBetween => :midCat + assert_equal(a.crossBetween, :midCat) + end + def test_crossBetween assert_raise(ArgumentError, "requires valid crossBetween") { @axis.crossBetween = :my_eyes } assert_nothing_raised("accepts valid crossBetween") { @axis.crossBetween = :midCat } diff --git a/test/drawing/tc_val_axis_data.rb b/test/drawing/tc_val_axis_data.rb new file mode 100644 index 00000000..cb39176d --- /dev/null +++ b/test/drawing/tc_val_axis_data.rb @@ -0,0 +1,18 @@ +require 'test/unit' +require 'axlsx.rb' + +class TestValAxisData < Test::Unit::TestCase + + def setup + p = Axlsx::Package.new + @ws = p.workbook.add_worksheet + chart = @ws.drawing.add_chart Axlsx::Line3DChart + @series = chart.add_series :data=>[0,1,2] + end + + def test_initialize + assert(@series.data.is_a?Axlsx::SimpleTypedList) + assert_equal(@series.data, [0,1,2]) + end + +end diff --git a/test/drawing/tc_view_3D.rb b/test/drawing/tc_view_3D.rb index 909550b5..40d8982f 100644 --- a/test/drawing/tc_view_3D.rb +++ b/test/drawing/tc_view_3D.rb @@ -8,7 +8,16 @@ def setup def teardown end - + + def test_options + v = Axlsx::View3D.new :rotX => 10, :rotY => 5, :hPercent => "30%", :depthPercent => "45%", :rAngAx => false, :perspective => 10 + assert_equal(v.rotX, 10) + assert_equal(v.rotY, 5) + assert_equal(v.hPercent, "30%") + assert_equal(v.depthPercent, "45%") + assert_equal(v.rAngAx, false) + assert_equal(v.perspective, 10) + end def test_rotX assert_raise(ArgumentError) {@view.rotX = "bob"}