caxlsx 3.2.0 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +9 -9
- data/.yardopts_guide +18 -18
- data/CHANGELOG.md +385 -354
- data/LICENSE +21 -21
- data/README.md +165 -168
- data/Rakefile +29 -29
- data/examples/generate.rb +15 -15
- data/lib/axlsx/content_type/abstract_content_type.rb +32 -32
- data/lib/axlsx/content_type/content_type.rb +26 -26
- data/lib/axlsx/content_type/default.rb +25 -25
- data/lib/axlsx/content_type/override.rb +25 -25
- data/lib/axlsx/doc_props/app.rb +235 -235
- data/lib/axlsx/doc_props/core.rb +39 -39
- data/lib/axlsx/drawing/area_chart.rb +99 -99
- data/lib/axlsx/drawing/area_series.rb +110 -110
- data/lib/axlsx/drawing/ax_data_source.rb +26 -26
- data/lib/axlsx/drawing/axes.rb +61 -61
- data/lib/axlsx/drawing/axis.rb +190 -190
- data/lib/axlsx/drawing/bar_3D_chart.rb +148 -148
- data/lib/axlsx/drawing/bar_chart.rb +138 -138
- data/lib/axlsx/drawing/bar_series.rb +97 -97
- data/lib/axlsx/drawing/bubble_chart.rb +59 -59
- data/lib/axlsx/drawing/bubble_series.rb +63 -63
- data/lib/axlsx/drawing/cat_axis.rb +85 -85
- data/lib/axlsx/drawing/chart.rb +299 -276
- data/lib/axlsx/drawing/d_lbls.rb +91 -90
- data/lib/axlsx/drawing/drawing.rb +167 -167
- data/lib/axlsx/drawing/graphic_frame.rb +54 -54
- data/lib/axlsx/drawing/hyperlink.rb +100 -100
- data/lib/axlsx/drawing/line_3D_chart.rb +68 -68
- data/lib/axlsx/drawing/line_chart.rb +99 -99
- data/lib/axlsx/drawing/line_series.rb +110 -110
- data/lib/axlsx/drawing/marker.rb +84 -84
- data/lib/axlsx/drawing/num_data.rb +52 -52
- data/lib/axlsx/drawing/num_data_source.rb +62 -62
- data/lib/axlsx/drawing/num_val.rb +34 -34
- data/lib/axlsx/drawing/one_cell_anchor.rb +99 -99
- data/lib/axlsx/drawing/pic.rb +211 -211
- data/lib/axlsx/drawing/picture_locking.rb +42 -42
- data/lib/axlsx/drawing/pie_3D_chart.rb +47 -47
- data/lib/axlsx/drawing/pie_series.rb +74 -74
- data/lib/axlsx/drawing/scaling.rb +60 -60
- data/lib/axlsx/drawing/scatter_chart.rb +74 -74
- data/lib/axlsx/drawing/scatter_series.rb +129 -129
- data/lib/axlsx/drawing/ser_axis.rb +45 -45
- data/lib/axlsx/drawing/series.rb +69 -69
- data/lib/axlsx/drawing/series_title.rb +25 -25
- data/lib/axlsx/drawing/str_data.rb +42 -42
- data/lib/axlsx/drawing/str_val.rb +34 -34
- data/lib/axlsx/drawing/title.rb +107 -97
- data/lib/axlsx/drawing/two_cell_anchor.rb +97 -97
- data/lib/axlsx/drawing/val_axis.rb +37 -37
- data/lib/axlsx/drawing/view_3D.rb +115 -115
- data/lib/axlsx/drawing/vml_drawing.rb +42 -42
- data/lib/axlsx/drawing/vml_shape.rb +66 -66
- data/lib/axlsx/package.rb +398 -388
- data/lib/axlsx/rels/relationship.rb +130 -130
- data/lib/axlsx/rels/relationships.rb +32 -32
- data/lib/axlsx/stylesheet/border.rb +73 -73
- data/lib/axlsx/stylesheet/border_pr.rb +71 -71
- data/lib/axlsx/stylesheet/cell_alignment.rb +132 -132
- data/lib/axlsx/stylesheet/cell_protection.rb +41 -41
- data/lib/axlsx/stylesheet/cell_style.rb +72 -72
- data/lib/axlsx/stylesheet/color.rb +76 -76
- data/lib/axlsx/stylesheet/dxf.rb +79 -79
- data/lib/axlsx/stylesheet/fill.rb +35 -35
- data/lib/axlsx/stylesheet/font.rb +156 -156
- data/lib/axlsx/stylesheet/gradient_fill.rb +103 -103
- data/lib/axlsx/stylesheet/gradient_stop.rb +37 -37
- data/lib/axlsx/stylesheet/num_fmt.rb +86 -86
- data/lib/axlsx/stylesheet/pattern_fill.rb +73 -73
- data/lib/axlsx/stylesheet/styles.rb +535 -494
- data/lib/axlsx/stylesheet/table_style.rb +54 -54
- data/lib/axlsx/stylesheet/table_style_element.rb +77 -77
- data/lib/axlsx/stylesheet/table_styles.rb +46 -46
- data/lib/axlsx/stylesheet/xf.rb +147 -147
- data/lib/axlsx/util/accessors.rb +64 -64
- data/lib/axlsx/util/constants.rb +416 -410
- data/lib/axlsx/util/mime_type_utils.rb +11 -11
- data/lib/axlsx/util/options_parser.rb +16 -16
- data/lib/axlsx/util/serialized_attributes.rb +89 -89
- data/lib/axlsx/util/simple_typed_list.rb +179 -179
- data/lib/axlsx/util/storage.rb +146 -146
- data/lib/axlsx/util/validators.rb +312 -312
- data/lib/axlsx/util/zip_command.rb +73 -73
- data/lib/axlsx/version.rb +5 -5
- data/lib/axlsx/workbook/defined_name.rb +128 -128
- data/lib/axlsx/workbook/defined_names.rb +21 -21
- data/lib/axlsx/workbook/shared_strings_table.rb +77 -77
- data/lib/axlsx/workbook/workbook.rb +425 -395
- data/lib/axlsx/workbook/workbook_view.rb +80 -80
- data/lib/axlsx/workbook/workbook_views.rb +22 -22
- data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +77 -77
- data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -94
- data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +244 -244
- data/lib/axlsx/workbook/worksheet/border_creator.rb +76 -0
- data/lib/axlsx/workbook/worksheet/break.rb +35 -35
- data/lib/axlsx/workbook/worksheet/cell.rb +532 -506
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +164 -164
- data/lib/axlsx/workbook/worksheet/cfvo.rb +60 -60
- data/lib/axlsx/workbook/worksheet/cfvos.rb +18 -18
- data/lib/axlsx/workbook/worksheet/col.rb +145 -145
- data/lib/axlsx/workbook/worksheet/col_breaks.rb +35 -35
- data/lib/axlsx/workbook/worksheet/color_scale.rb +110 -110
- data/lib/axlsx/workbook/worksheet/cols.rb +23 -23
- data/lib/axlsx/workbook/worksheet/comment.rb +91 -91
- data/lib/axlsx/workbook/worksheet/comments.rb +82 -82
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +82 -82
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +220 -220
- data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -25
- data/lib/axlsx/workbook/worksheet/data_bar.rb +129 -129
- data/lib/axlsx/workbook/worksheet/data_validation.rb +267 -246
- data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -28
- data/lib/axlsx/workbook/worksheet/date_time_converter.rb +30 -30
- data/lib/axlsx/workbook/worksheet/dimension.rb +64 -64
- data/lib/axlsx/workbook/worksheet/header_footer.rb +52 -52
- data/lib/axlsx/workbook/worksheet/icon_set.rb +81 -81
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +37 -37
- data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -33
- data/lib/axlsx/workbook/worksheet/page_margins.rb +97 -97
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +44 -44
- data/lib/axlsx/workbook/worksheet/page_setup.rb +240 -240
- data/lib/axlsx/workbook/worksheet/pane.rb +139 -139
- data/lib/axlsx/workbook/worksheet/pivot_table.rb +335 -296
- data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +66 -66
- data/lib/axlsx/workbook/worksheet/pivot_tables.rb +24 -24
- data/lib/axlsx/workbook/worksheet/print_options.rb +39 -39
- data/lib/axlsx/workbook/worksheet/protected_range.rb +47 -47
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +37 -37
- data/lib/axlsx/workbook/worksheet/rich_text.rb +55 -55
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +250 -250
- data/lib/axlsx/workbook/worksheet/row.rb +164 -164
- data/lib/axlsx/workbook/worksheet/row_breaks.rb +33 -33
- data/lib/axlsx/workbook/worksheet/selection.rb +101 -101
- data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +29 -29
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +27 -27
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +87 -87
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +118 -118
- data/lib/axlsx/workbook/worksheet/sheet_view.rb +213 -213
- data/lib/axlsx/workbook/worksheet/table.rb +102 -102
- data/lib/axlsx/workbook/worksheet/table_style_info.rb +49 -49
- data/lib/axlsx/workbook/worksheet/tables.rb +34 -34
- data/lib/axlsx/workbook/worksheet/worksheet.rb +829 -786
- data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +58 -58
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +58 -58
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +74 -74
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -38
- data/lib/axlsx.rb +204 -185
- data/lib/caxlsx.rb +2 -2
- data/lib/schema/dc.xsd +118 -118
- data/lib/schema/dcmitype.xsd +51 -51
- data/lib/schema/dcterms.xsd +331 -331
- data/lib/schema/dml-chartDrawing.xsd +146 -146
- data/lib/schema/dml-compatibility.xsd +14 -14
- data/lib/schema/dml-lockedCanvas.xsd +11 -11
- data/lib/schema/dml-main.xsd +3048 -3048
- data/lib/schema/dml-picture.xsd +23 -23
- data/lib/schema/dml-spreadsheetDrawing.xsd +185 -185
- data/lib/schema/dml-wordprocessingDrawing.xsd +185 -185
- data/lib/schema/shared-additionalCharacteristics.xsd +28 -28
- data/lib/schema/shared-bibliography.xsd +144 -144
- data/lib/schema/shared-commonSimpleTypes.xsd +166 -166
- data/lib/schema/shared-customXmlDataProperties.xsd +25 -25
- data/lib/schema/shared-customXmlSchemaProperties.xsd +18 -18
- data/lib/schema/shared-documentPropertiesCustom.xsd +59 -59
- data/lib/schema/shared-documentPropertiesExtended.xsd +56 -56
- data/lib/schema/shared-documentPropertiesVariantTypes.xsd +195 -195
- data/lib/schema/shared-relationshipReference.xsd +25 -25
- data/lib/schema/vml-main.xsd +569 -569
- data/lib/schema/vml-officeDrawing.xsd +509 -509
- data/lib/schema/vml-presentationDrawing.xsd +12 -12
- data/lib/schema/vml-spreadsheetDrawing.xsd +108 -108
- data/lib/schema/vml-wordprocessingDrawing.xsd +96 -96
- data/lib/schema/xml.xsd +116 -116
- metadata +5 -252
- data/test/benchmark.rb +0 -72
- data/test/content_type/tc_content_type.rb +0 -76
- data/test/content_type/tc_default.rb +0 -16
- data/test/content_type/tc_override.rb +0 -14
- data/test/doc_props/tc_app.rb +0 -43
- data/test/doc_props/tc_core.rb +0 -42
- data/test/drawing/tc_area_chart.rb +0 -39
- data/test/drawing/tc_area_series.rb +0 -71
- data/test/drawing/tc_axes.rb +0 -8
- data/test/drawing/tc_axis.rb +0 -112
- data/test/drawing/tc_bar_3D_chart.rb +0 -86
- data/test/drawing/tc_bar_chart.rb +0 -86
- data/test/drawing/tc_bar_series.rb +0 -46
- data/test/drawing/tc_bubble_chart.rb +0 -44
- data/test/drawing/tc_bubble_series.rb +0 -21
- data/test/drawing/tc_cat_axis.rb +0 -31
- data/test/drawing/tc_cat_axis_data.rb +0 -27
- data/test/drawing/tc_chart.rb +0 -123
- data/test/drawing/tc_d_lbls.rb +0 -57
- data/test/drawing/tc_data_source.rb +0 -23
- data/test/drawing/tc_drawing.rb +0 -80
- data/test/drawing/tc_graphic_frame.rb +0 -27
- data/test/drawing/tc_hyperlink.rb +0 -64
- data/test/drawing/tc_line_3d_chart.rb +0 -47
- data/test/drawing/tc_line_chart.rb +0 -39
- data/test/drawing/tc_line_series.rb +0 -71
- data/test/drawing/tc_marker.rb +0 -44
- data/test/drawing/tc_named_axis_data.rb +0 -27
- data/test/drawing/tc_num_data.rb +0 -31
- data/test/drawing/tc_num_val.rb +0 -29
- data/test/drawing/tc_one_cell_anchor.rb +0 -66
- data/test/drawing/tc_pic.rb +0 -103
- data/test/drawing/tc_picture_locking.rb +0 -72
- data/test/drawing/tc_pie_3D_chart.rb +0 -28
- data/test/drawing/tc_pie_series.rb +0 -33
- data/test/drawing/tc_scaling.rb +0 -36
- data/test/drawing/tc_scatter_chart.rb +0 -48
- data/test/drawing/tc_scatter_series.rb +0 -74
- data/test/drawing/tc_ser_axis.rb +0 -31
- data/test/drawing/tc_series.rb +0 -23
- data/test/drawing/tc_series_title.rb +0 -54
- data/test/drawing/tc_str_data.rb +0 -18
- data/test/drawing/tc_str_val.rb +0 -30
- data/test/drawing/tc_title.rb +0 -70
- data/test/drawing/tc_two_cell_anchor.rb +0 -36
- data/test/drawing/tc_val_axis.rb +0 -24
- data/test/drawing/tc_view_3D.rb +0 -54
- data/test/drawing/tc_vml_drawing.rb +0 -25
- data/test/drawing/tc_vml_shape.rb +0 -106
- data/test/fixtures/image1.gif +0 -0
- data/test/fixtures/image1.jpeg +0 -0
- data/test/fixtures/image1.jpg +0 -0
- data/test/fixtures/image1.png +0 -0
- data/test/fixtures/image1_fake.jpg +0 -0
- data/test/profile.rb +0 -24
- data/test/rels/tc_relationship.rb +0 -52
- data/test/rels/tc_relationships.rb +0 -37
- data/test/stylesheet/tc_border.rb +0 -37
- data/test/stylesheet/tc_border_pr.rb +0 -32
- data/test/stylesheet/tc_cell_alignment.rb +0 -81
- data/test/stylesheet/tc_cell_protection.rb +0 -29
- data/test/stylesheet/tc_cell_style.rb +0 -57
- data/test/stylesheet/tc_color.rb +0 -43
- data/test/stylesheet/tc_dxf.rb +0 -81
- data/test/stylesheet/tc_fill.rb +0 -18
- data/test/stylesheet/tc_font.rb +0 -133
- data/test/stylesheet/tc_gradient_fill.rb +0 -72
- data/test/stylesheet/tc_gradient_stop.rb +0 -31
- data/test/stylesheet/tc_num_fmt.rb +0 -30
- data/test/stylesheet/tc_pattern_fill.rb +0 -43
- data/test/stylesheet/tc_styles.rb +0 -309
- data/test/stylesheet/tc_table_style.rb +0 -44
- data/test/stylesheet/tc_table_style_element.rb +0 -45
- data/test/stylesheet/tc_table_styles.rb +0 -29
- data/test/stylesheet/tc_xf.rb +0 -120
- data/test/tc_axlsx.rb +0 -109
- data/test/tc_helper.rb +0 -10
- data/test/tc_package.rb +0 -317
- data/test/util/tc_mime_type_utils.rb +0 -13
- data/test/util/tc_serialized_attributes.rb +0 -19
- data/test/util/tc_simple_typed_list.rb +0 -77
- data/test/util/tc_validators.rb +0 -210
- data/test/workbook/tc_defined_name.rb +0 -49
- data/test/workbook/tc_shared_strings_table.rb +0 -59
- data/test/workbook/tc_workbook.rb +0 -165
- data/test/workbook/tc_workbook_view.rb +0 -50
- data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +0 -38
- data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +0 -76
- data/test/workbook/worksheet/auto_filter/tc_filters.rb +0 -50
- data/test/workbook/worksheet/tc_break.rb +0 -49
- data/test/workbook/worksheet/tc_cell.rb +0 -465
- data/test/workbook/worksheet/tc_cfvo.rb +0 -31
- data/test/workbook/worksheet/tc_col.rb +0 -93
- data/test/workbook/worksheet/tc_color_scale.rb +0 -58
- data/test/workbook/worksheet/tc_comment.rb +0 -72
- data/test/workbook/worksheet/tc_comments.rb +0 -57
- data/test/workbook/worksheet/tc_conditional_formatting.rb +0 -224
- data/test/workbook/worksheet/tc_data_bar.rb +0 -46
- data/test/workbook/worksheet/tc_data_validation.rb +0 -265
- data/test/workbook/worksheet/tc_date_time_converter.rb +0 -124
- data/test/workbook/worksheet/tc_header_footer.rb +0 -151
- data/test/workbook/worksheet/tc_icon_set.rb +0 -45
- data/test/workbook/worksheet/tc_outline_pr.rb +0 -19
- data/test/workbook/worksheet/tc_page_margins.rb +0 -97
- data/test/workbook/worksheet/tc_page_set_up_pr.rb +0 -15
- data/test/workbook/worksheet/tc_page_setup.rb +0 -143
- data/test/workbook/worksheet/tc_pane.rb +0 -54
- data/test/workbook/worksheet/tc_pivot_table.rb +0 -180
- data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +0 -62
- data/test/workbook/worksheet/tc_print_options.rb +0 -72
- data/test/workbook/worksheet/tc_protected_range.rb +0 -17
- data/test/workbook/worksheet/tc_rich_text.rb +0 -44
- data/test/workbook/worksheet/tc_rich_text_run.rb +0 -173
- data/test/workbook/worksheet/tc_row.rb +0 -160
- data/test/workbook/worksheet/tc_selection.rb +0 -55
- data/test/workbook/worksheet/tc_sheet_calc_pr.rb +0 -18
- data/test/workbook/worksheet/tc_sheet_format_pr.rb +0 -88
- data/test/workbook/worksheet/tc_sheet_pr.rb +0 -49
- data/test/workbook/worksheet/tc_sheet_protection.rb +0 -117
- data/test/workbook/worksheet/tc_sheet_view.rb +0 -214
- data/test/workbook/worksheet/tc_table.rb +0 -77
- data/test/workbook/worksheet/tc_table_style_info.rb +0 -53
- data/test/workbook/worksheet/tc_worksheet.rb +0 -632
- data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +0 -55
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
# encoding: UTF-8
|
|
2
|
-
require 'open3'
|
|
3
|
-
require 'shellwords'
|
|
4
|
-
|
|
5
|
-
module Axlsx
|
|
6
|
-
|
|
7
|
-
# The ZipCommand class supports zipping the Excel file contents using
|
|
8
|
-
# a binary zip program instead of RubyZip's `Zip::OutputStream`.
|
|
9
|
-
#
|
|
10
|
-
# The methods provided here mimic `Zip::OutputStream` so that `ZipCommand` can
|
|
11
|
-
# be used as a drop-in replacement. Note that method signatures are not
|
|
12
|
-
# identical to `Zip::OutputStream`, they are only sufficiently close so that
|
|
13
|
-
# `ZipCommand` and `Zip::OutputStream` can be interchangeably used within
|
|
14
|
-
# `caxlsx`.
|
|
15
|
-
class ZipCommand
|
|
16
|
-
# Raised when the zip command exits with a non-zero status.
|
|
17
|
-
class ZipError < StandardError; end
|
|
18
|
-
|
|
19
|
-
def initialize(zip_command)
|
|
20
|
-
@current_file = nil
|
|
21
|
-
@files = []
|
|
22
|
-
@zip_command = zip_command
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Create a temporary directory for writing files to.
|
|
26
|
-
#
|
|
27
|
-
# The directory and its contents are removed at the end of the block.
|
|
28
|
-
def open(output, &block)
|
|
29
|
-
Dir.mktmpdir do |dir|
|
|
30
|
-
@dir = dir
|
|
31
|
-
block.call(self)
|
|
32
|
-
write_file
|
|
33
|
-
zip_parts(output)
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# Closes the current entry and opens a new for writing.
|
|
38
|
-
def put_next_entry(entry)
|
|
39
|
-
write_file
|
|
40
|
-
@current_file = "#{@dir}/#{entry.name}"
|
|
41
|
-
@files << entry.name
|
|
42
|
-
FileUtils.mkdir_p(File.dirname(@current_file))
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# Write to a buffer that will be written to the current entry
|
|
46
|
-
def write(content)
|
|
47
|
-
@buffer << content
|
|
48
|
-
end
|
|
49
|
-
alias << write
|
|
50
|
-
|
|
51
|
-
private
|
|
52
|
-
|
|
53
|
-
def write_file
|
|
54
|
-
if @current_file
|
|
55
|
-
@buffer.rewind
|
|
56
|
-
File.open(@current_file, "wb") { |f| f.write @buffer.read }
|
|
57
|
-
end
|
|
58
|
-
@current_file = nil
|
|
59
|
-
@buffer = StringIO.new
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def zip_parts(output)
|
|
63
|
-
output = Shellwords.shellescape(File.absolute_path(output))
|
|
64
|
-
inputs = Shellwords.shelljoin(@files)
|
|
65
|
-
escaped_dir = Shellwords.shellescape(@dir)
|
|
66
|
-
command = "cd #{escaped_dir} && #{@zip_command} #{output} #{inputs}"
|
|
67
|
-
stdout_and_stderr, status = Open3.capture2e(command)
|
|
68
|
-
if !status.success?
|
|
69
|
-
raise(ZipError.new(stdout_and_stderr))
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
require 'open3'
|
|
3
|
+
require 'shellwords'
|
|
4
|
+
|
|
5
|
+
module Axlsx
|
|
6
|
+
|
|
7
|
+
# The ZipCommand class supports zipping the Excel file contents using
|
|
8
|
+
# a binary zip program instead of RubyZip's `Zip::OutputStream`.
|
|
9
|
+
#
|
|
10
|
+
# The methods provided here mimic `Zip::OutputStream` so that `ZipCommand` can
|
|
11
|
+
# be used as a drop-in replacement. Note that method signatures are not
|
|
12
|
+
# identical to `Zip::OutputStream`, they are only sufficiently close so that
|
|
13
|
+
# `ZipCommand` and `Zip::OutputStream` can be interchangeably used within
|
|
14
|
+
# `caxlsx`.
|
|
15
|
+
class ZipCommand
|
|
16
|
+
# Raised when the zip command exits with a non-zero status.
|
|
17
|
+
class ZipError < StandardError; end
|
|
18
|
+
|
|
19
|
+
def initialize(zip_command)
|
|
20
|
+
@current_file = nil
|
|
21
|
+
@files = []
|
|
22
|
+
@zip_command = zip_command
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Create a temporary directory for writing files to.
|
|
26
|
+
#
|
|
27
|
+
# The directory and its contents are removed at the end of the block.
|
|
28
|
+
def open(output, &block)
|
|
29
|
+
Dir.mktmpdir do |dir|
|
|
30
|
+
@dir = dir
|
|
31
|
+
block.call(self)
|
|
32
|
+
write_file
|
|
33
|
+
zip_parts(output)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Closes the current entry and opens a new for writing.
|
|
38
|
+
def put_next_entry(entry)
|
|
39
|
+
write_file
|
|
40
|
+
@current_file = "#{@dir}/#{entry.name}"
|
|
41
|
+
@files << entry.name
|
|
42
|
+
FileUtils.mkdir_p(File.dirname(@current_file))
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Write to a buffer that will be written to the current entry
|
|
46
|
+
def write(content)
|
|
47
|
+
@buffer << content
|
|
48
|
+
end
|
|
49
|
+
alias << write
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
def write_file
|
|
54
|
+
if @current_file
|
|
55
|
+
@buffer.rewind
|
|
56
|
+
File.open(@current_file, "wb") { |f| f.write @buffer.read }
|
|
57
|
+
end
|
|
58
|
+
@current_file = nil
|
|
59
|
+
@buffer = StringIO.new
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def zip_parts(output)
|
|
63
|
+
output = Shellwords.shellescape(File.absolute_path(output))
|
|
64
|
+
inputs = Shellwords.shelljoin(@files)
|
|
65
|
+
escaped_dir = Shellwords.shellescape(@dir)
|
|
66
|
+
command = "cd #{escaped_dir} && #{@zip_command} #{output} #{inputs}"
|
|
67
|
+
stdout_and_stderr, status = Open3.capture2e(command)
|
|
68
|
+
if !status.success?
|
|
69
|
+
raise(ZipError.new(stdout_and_stderr))
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
data/lib/axlsx/version.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
module Axlsx
|
|
2
|
-
|
|
3
|
-
# The current version
|
|
4
|
-
VERSION = "3.
|
|
5
|
-
end
|
|
1
|
+
module Axlsx
|
|
2
|
+
|
|
3
|
+
# The current version
|
|
4
|
+
VERSION = "3.3.0"
|
|
5
|
+
end
|
|
@@ -1,128 +1,128 @@
|
|
|
1
|
-
# <definedNames>
|
|
2
|
-
# <definedName name="_xlnm.Print_Titles" localSheetId="0">Sheet1!$1:$1</definedName>
|
|
3
|
-
# </definedNames>
|
|
4
|
-
|
|
5
|
-
#<xsd:complexType name="CT_DefinedName">
|
|
6
|
-
# <xsd:simpleContent>
|
|
7
|
-
# <xsd:extension base="ST_Formula">
|
|
8
|
-
# <xsd:attribute name="name" type="s:ST_Xstring" use="required"/>
|
|
9
|
-
# <xsd:attribute name="comment" type="s:ST_Xstring" use="optional"/>
|
|
10
|
-
# <xsd:attribute name="customMenu" type="s:ST_Xstring" use="optional"/>
|
|
11
|
-
# <xsd:attribute name="description" type="s:ST_Xstring" use="optional"/>
|
|
12
|
-
# <xsd:attribute name="help" type="s:ST_Xstring" use="optional"/>
|
|
13
|
-
# <xsd:attribute name="statusBar" type="s:ST_Xstring" use="optional"/>
|
|
14
|
-
# <xsd:attribute name="localSheetId" type="xsd:unsignedInt" use="optional"/>
|
|
15
|
-
# <xsd:attribute name="hidden" type="xsd:boolean" use="optional" default="false"/>
|
|
16
|
-
# <xsd:attribute name="function" type="xsd:boolean" use="optional" default="false"/>
|
|
17
|
-
# <xsd:attribute name="vbProcedure" type="xsd:boolean" use="optional" default="false"/>
|
|
18
|
-
# <xsd:attribute name="xlm" type="xsd:boolean" use="optional" default="false"/>
|
|
19
|
-
# <xsd:attribute name="functionGroupId" type="xsd:unsignedInt" use="optional"/>
|
|
20
|
-
# <xsd:attribute name="shortcutKey" type="s:ST_Xstring" use="optional"/>
|
|
21
|
-
# <xsd:attribute name="publishToServer" type="xsd:boolean" use="optional" default="false"/>
|
|
22
|
-
# <xsd:attribute name="workbookParameter" type="xsd:boolean" use="optional" default="false"/>
|
|
23
|
-
# </xsd:extenstion>
|
|
24
|
-
# </xsd:simpleContent>
|
|
25
|
-
|
|
26
|
-
module Axlsx
|
|
27
|
-
# This element defines the defined names that are defined within this workbook.
|
|
28
|
-
# Defined names are descriptive text that is used to represents a cell, range of cells, formula, or constant value.
|
|
29
|
-
# Use easy-to-understand names, such as Products, to refer to hard to understand ranges, such as Sales!C20:C30.
|
|
30
|
-
# A defined name in a formula can make it easier to understand the purpose of the formula.
|
|
31
|
-
# @example
|
|
32
|
-
# The formula =SUM(FirstQuarterSales) might be easier to identify than =SUM(C20:C30
|
|
33
|
-
#
|
|
34
|
-
# Names are available to any sheet.
|
|
35
|
-
# @example
|
|
36
|
-
# If the name ProjectedSales refers to the range A20:A30 on the first worksheet in a workbook,
|
|
37
|
-
# you can use the name ProjectedSales on any other sheet in the same workbook to refer to range A20:A30 on the first worksheet.
|
|
38
|
-
# Names can also be used to represent formulas or values that do not change (constants).
|
|
39
|
-
#
|
|
40
|
-
# @example
|
|
41
|
-
# The name SalesTax can be used to represent the sales tax amount (such as 6.2 percent) applied to sales transactions.
|
|
42
|
-
# You can also link to a defined name in another workbook, or define a name that refers to cells in another workbook.
|
|
43
|
-
#
|
|
44
|
-
# @example
|
|
45
|
-
# The formula =SUM(Sales.xls!ProjectedSales) refers to the named range ProjectedSales in the workbook named Sales.
|
|
46
|
-
# A compliant producer or consumer considers a defined name in the range A1-XFD1048576 to be an error.
|
|
47
|
-
# All other names outside this range can be defined as names and overrides a cell reference if an ambiguity exists.
|
|
48
|
-
#
|
|
49
|
-
# @example
|
|
50
|
-
# For clarification: LOG10 is always a cell reference, LOG10() is always formula, LOGO1000 can be a defined name that overrides a cell reference.
|
|
51
|
-
class DefinedName
|
|
52
|
-
include Axlsx::SerializedAttributes
|
|
53
|
-
include Axlsx::OptionsParser
|
|
54
|
-
include Axlsx::Accessors
|
|
55
|
-
# creates a new DefinedName.
|
|
56
|
-
# @param [String] formula - the formula the defined name references
|
|
57
|
-
# @param [Hash] options - A hash of key/value pairs that will be mapped to this instances attributes.
|
|
58
|
-
#
|
|
59
|
-
# @option [String] name - Specifies the name that appears in the user interface for the defined name.
|
|
60
|
-
# This attribute is required.
|
|
61
|
-
# The following built-in names are defined in this SpreadsheetML specification:
|
|
62
|
-
# Print
|
|
63
|
-
# _xlnm.Print_Area: this defined name specifies the workbook's print area.
|
|
64
|
-
# _xlnm.Print_Titles: this defined name specifies the row(s) or column(s) to repeat
|
|
65
|
-
# the top of each printed page.
|
|
66
|
-
# Filter & Advanced Filter
|
|
67
|
-
# _xlnm.Criteria: this defined name refers to a range containing the criteria values
|
|
68
|
-
# to be used in applying an advanced filter to a range of data.
|
|
69
|
-
# _xlnm._FilterDatabase: can be one of the following
|
|
70
|
-
# a. this defined name refers to a range to which an advanced filter has been
|
|
71
|
-
# applied. This represents the source data range, unfiltered.
|
|
72
|
-
# b. This defined name refers to a range to which an AutoFilter has been
|
|
73
|
-
# applied.
|
|
74
|
-
# _xlnm.Extract: this defined name refers to the range containing the filtered output
|
|
75
|
-
# values resulting from applying an advanced filter criteria to a source range.
|
|
76
|
-
# Miscellaneous
|
|
77
|
-
# _xlnm.Consolidate_Area: the defined name refers to a consolidation area.
|
|
78
|
-
# _xlnm.Database: the range specified in the defined name is from a database data source.
|
|
79
|
-
# _xlnm.Sheet_Title: the defined name refers to a sheet title.
|
|
80
|
-
# @option [String] comment - A comment to optionally associate with the name
|
|
81
|
-
# @option [String] custom_menu - The menu text for the defined name
|
|
82
|
-
# @option [String] description - An optional description for the defined name
|
|
83
|
-
# @option [String] help - The help topic to display for this defined name
|
|
84
|
-
# @option [String] status_bar - The text to display on the application status bar when this defined name has focus
|
|
85
|
-
# @option [String] local_sheet_id - Specifies the sheet index in this workbook where data from an external reference is displayed
|
|
86
|
-
# @option [Boolean] hidden - Specifies a boolean value that indicates whether the defined name is hidden in the user interface.
|
|
87
|
-
# @option [Boolean] function - Specifies a boolean value that indicates that the defined name refers to a user-defined function.
|
|
88
|
-
# This attribute is used when there is an add-in or other code project associated with the file.
|
|
89
|
-
# @option [Boolean] vb_proceedure - Specifies a boolean value that indicates whether the defined name is related to an external function, command, or other executable code.
|
|
90
|
-
# @option [Boolean] xlm - Specifies a boolean value that indicates whether the defined name is related to an external function, command, or other executable code.
|
|
91
|
-
# @option [Integer] function_group_id - Specifies the function group index if the defined name refers to a function.
|
|
92
|
-
# The function group defines the general category for the function.
|
|
93
|
-
# This attribute is used when there is an add-in or other code project associated with the file.
|
|
94
|
-
# See Open Office XML Part 1 for more info.
|
|
95
|
-
# @option [String] short_cut_key - Specifies the keyboard shortcut for the defined name.
|
|
96
|
-
# @option [Boolean] publish_to_server - Specifies a boolean value that indicates whether the defined name is included in the
|
|
97
|
-
# version of the workbook that is published to or rendered on a Web or application server.
|
|
98
|
-
# @option [Boolean] workbook_parameter - Specifies a boolean value that indicates that the name is used as a workbook parameter on a
|
|
99
|
-
# version of the workbook that is published to or rendered on a Web or application server.
|
|
100
|
-
def initialize(formula, options={})
|
|
101
|
-
@formula = formula
|
|
102
|
-
parse_options options
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
attr_reader :local_sheet_id
|
|
106
|
-
|
|
107
|
-
# The local sheet index (0-based)
|
|
108
|
-
# @param [Integer] value the unsigned integer index of the sheet this defined_name applies to.
|
|
109
|
-
def local_sheet_id=(value)
|
|
110
|
-
Axlsx::validate_unsigned_int(value)
|
|
111
|
-
@local_sheet_id = value
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
string_attr_accessor :short_cut_key, :status_bar, :help, :description, :custom_menu, :comment, :name, :formula
|
|
115
|
-
|
|
116
|
-
boolean_attr_accessor :workbook_parameter, :publish_to_server, :xlm, :vb_proceedure, :function, :hidden
|
|
117
|
-
|
|
118
|
-
serializable_attributes :short_cut_key, :status_bar, :help, :description, :custom_menu, :comment,
|
|
119
|
-
:workbook_parameter, :publish_to_server, :xlm, :vb_proceedure, :function, :hidden, :local_sheet_id
|
|
120
|
-
|
|
121
|
-
def to_xml_string(str='')
|
|
122
|
-
raise ArgumentError, 'you must specify the name for this defined name. Please read the documentation for Axlsx::DefinedName for more details' unless name
|
|
123
|
-
str << ('<definedName ' << 'name="' << name << '" ')
|
|
124
|
-
serialized_attributes str
|
|
125
|
-
str << ('>' << @formula << '</definedName>')
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
-
end
|
|
1
|
+
# <definedNames>
|
|
2
|
+
# <definedName name="_xlnm.Print_Titles" localSheetId="0">Sheet1!$1:$1</definedName>
|
|
3
|
+
# </definedNames>
|
|
4
|
+
|
|
5
|
+
#<xsd:complexType name="CT_DefinedName">
|
|
6
|
+
# <xsd:simpleContent>
|
|
7
|
+
# <xsd:extension base="ST_Formula">
|
|
8
|
+
# <xsd:attribute name="name" type="s:ST_Xstring" use="required"/>
|
|
9
|
+
# <xsd:attribute name="comment" type="s:ST_Xstring" use="optional"/>
|
|
10
|
+
# <xsd:attribute name="customMenu" type="s:ST_Xstring" use="optional"/>
|
|
11
|
+
# <xsd:attribute name="description" type="s:ST_Xstring" use="optional"/>
|
|
12
|
+
# <xsd:attribute name="help" type="s:ST_Xstring" use="optional"/>
|
|
13
|
+
# <xsd:attribute name="statusBar" type="s:ST_Xstring" use="optional"/>
|
|
14
|
+
# <xsd:attribute name="localSheetId" type="xsd:unsignedInt" use="optional"/>
|
|
15
|
+
# <xsd:attribute name="hidden" type="xsd:boolean" use="optional" default="false"/>
|
|
16
|
+
# <xsd:attribute name="function" type="xsd:boolean" use="optional" default="false"/>
|
|
17
|
+
# <xsd:attribute name="vbProcedure" type="xsd:boolean" use="optional" default="false"/>
|
|
18
|
+
# <xsd:attribute name="xlm" type="xsd:boolean" use="optional" default="false"/>
|
|
19
|
+
# <xsd:attribute name="functionGroupId" type="xsd:unsignedInt" use="optional"/>
|
|
20
|
+
# <xsd:attribute name="shortcutKey" type="s:ST_Xstring" use="optional"/>
|
|
21
|
+
# <xsd:attribute name="publishToServer" type="xsd:boolean" use="optional" default="false"/>
|
|
22
|
+
# <xsd:attribute name="workbookParameter" type="xsd:boolean" use="optional" default="false"/>
|
|
23
|
+
# </xsd:extenstion>
|
|
24
|
+
# </xsd:simpleContent>
|
|
25
|
+
|
|
26
|
+
module Axlsx
|
|
27
|
+
# This element defines the defined names that are defined within this workbook.
|
|
28
|
+
# Defined names are descriptive text that is used to represents a cell, range of cells, formula, or constant value.
|
|
29
|
+
# Use easy-to-understand names, such as Products, to refer to hard to understand ranges, such as Sales!C20:C30.
|
|
30
|
+
# A defined name in a formula can make it easier to understand the purpose of the formula.
|
|
31
|
+
# @example
|
|
32
|
+
# The formula =SUM(FirstQuarterSales) might be easier to identify than =SUM(C20:C30
|
|
33
|
+
#
|
|
34
|
+
# Names are available to any sheet.
|
|
35
|
+
# @example
|
|
36
|
+
# If the name ProjectedSales refers to the range A20:A30 on the first worksheet in a workbook,
|
|
37
|
+
# you can use the name ProjectedSales on any other sheet in the same workbook to refer to range A20:A30 on the first worksheet.
|
|
38
|
+
# Names can also be used to represent formulas or values that do not change (constants).
|
|
39
|
+
#
|
|
40
|
+
# @example
|
|
41
|
+
# The name SalesTax can be used to represent the sales tax amount (such as 6.2 percent) applied to sales transactions.
|
|
42
|
+
# You can also link to a defined name in another workbook, or define a name that refers to cells in another workbook.
|
|
43
|
+
#
|
|
44
|
+
# @example
|
|
45
|
+
# The formula =SUM(Sales.xls!ProjectedSales) refers to the named range ProjectedSales in the workbook named Sales.
|
|
46
|
+
# A compliant producer or consumer considers a defined name in the range A1-XFD1048576 to be an error.
|
|
47
|
+
# All other names outside this range can be defined as names and overrides a cell reference if an ambiguity exists.
|
|
48
|
+
#
|
|
49
|
+
# @example
|
|
50
|
+
# For clarification: LOG10 is always a cell reference, LOG10() is always formula, LOGO1000 can be a defined name that overrides a cell reference.
|
|
51
|
+
class DefinedName
|
|
52
|
+
include Axlsx::SerializedAttributes
|
|
53
|
+
include Axlsx::OptionsParser
|
|
54
|
+
include Axlsx::Accessors
|
|
55
|
+
# creates a new DefinedName.
|
|
56
|
+
# @param [String] formula - the formula the defined name references
|
|
57
|
+
# @param [Hash] options - A hash of key/value pairs that will be mapped to this instances attributes.
|
|
58
|
+
#
|
|
59
|
+
# @option [String] name - Specifies the name that appears in the user interface for the defined name.
|
|
60
|
+
# This attribute is required.
|
|
61
|
+
# The following built-in names are defined in this SpreadsheetML specification:
|
|
62
|
+
# Print
|
|
63
|
+
# _xlnm.Print_Area: this defined name specifies the workbook's print area.
|
|
64
|
+
# _xlnm.Print_Titles: this defined name specifies the row(s) or column(s) to repeat
|
|
65
|
+
# the top of each printed page.
|
|
66
|
+
# Filter & Advanced Filter
|
|
67
|
+
# _xlnm.Criteria: this defined name refers to a range containing the criteria values
|
|
68
|
+
# to be used in applying an advanced filter to a range of data.
|
|
69
|
+
# _xlnm._FilterDatabase: can be one of the following
|
|
70
|
+
# a. this defined name refers to a range to which an advanced filter has been
|
|
71
|
+
# applied. This represents the source data range, unfiltered.
|
|
72
|
+
# b. This defined name refers to a range to which an AutoFilter has been
|
|
73
|
+
# applied.
|
|
74
|
+
# _xlnm.Extract: this defined name refers to the range containing the filtered output
|
|
75
|
+
# values resulting from applying an advanced filter criteria to a source range.
|
|
76
|
+
# Miscellaneous
|
|
77
|
+
# _xlnm.Consolidate_Area: the defined name refers to a consolidation area.
|
|
78
|
+
# _xlnm.Database: the range specified in the defined name is from a database data source.
|
|
79
|
+
# _xlnm.Sheet_Title: the defined name refers to a sheet title.
|
|
80
|
+
# @option [String] comment - A comment to optionally associate with the name
|
|
81
|
+
# @option [String] custom_menu - The menu text for the defined name
|
|
82
|
+
# @option [String] description - An optional description for the defined name
|
|
83
|
+
# @option [String] help - The help topic to display for this defined name
|
|
84
|
+
# @option [String] status_bar - The text to display on the application status bar when this defined name has focus
|
|
85
|
+
# @option [String] local_sheet_id - Specifies the sheet index in this workbook where data from an external reference is displayed
|
|
86
|
+
# @option [Boolean] hidden - Specifies a boolean value that indicates whether the defined name is hidden in the user interface.
|
|
87
|
+
# @option [Boolean] function - Specifies a boolean value that indicates that the defined name refers to a user-defined function.
|
|
88
|
+
# This attribute is used when there is an add-in or other code project associated with the file.
|
|
89
|
+
# @option [Boolean] vb_proceedure - Specifies a boolean value that indicates whether the defined name is related to an external function, command, or other executable code.
|
|
90
|
+
# @option [Boolean] xlm - Specifies a boolean value that indicates whether the defined name is related to an external function, command, or other executable code.
|
|
91
|
+
# @option [Integer] function_group_id - Specifies the function group index if the defined name refers to a function.
|
|
92
|
+
# The function group defines the general category for the function.
|
|
93
|
+
# This attribute is used when there is an add-in or other code project associated with the file.
|
|
94
|
+
# See Open Office XML Part 1 for more info.
|
|
95
|
+
# @option [String] short_cut_key - Specifies the keyboard shortcut for the defined name.
|
|
96
|
+
# @option [Boolean] publish_to_server - Specifies a boolean value that indicates whether the defined name is included in the
|
|
97
|
+
# version of the workbook that is published to or rendered on a Web or application server.
|
|
98
|
+
# @option [Boolean] workbook_parameter - Specifies a boolean value that indicates that the name is used as a workbook parameter on a
|
|
99
|
+
# version of the workbook that is published to or rendered on a Web or application server.
|
|
100
|
+
def initialize(formula, options={})
|
|
101
|
+
@formula = formula
|
|
102
|
+
parse_options options
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
attr_reader :local_sheet_id
|
|
106
|
+
|
|
107
|
+
# The local sheet index (0-based)
|
|
108
|
+
# @param [Integer] value the unsigned integer index of the sheet this defined_name applies to.
|
|
109
|
+
def local_sheet_id=(value)
|
|
110
|
+
Axlsx::validate_unsigned_int(value)
|
|
111
|
+
@local_sheet_id = value
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
string_attr_accessor :short_cut_key, :status_bar, :help, :description, :custom_menu, :comment, :name, :formula
|
|
115
|
+
|
|
116
|
+
boolean_attr_accessor :workbook_parameter, :publish_to_server, :xlm, :vb_proceedure, :function, :hidden
|
|
117
|
+
|
|
118
|
+
serializable_attributes :short_cut_key, :status_bar, :help, :description, :custom_menu, :comment,
|
|
119
|
+
:workbook_parameter, :publish_to_server, :xlm, :vb_proceedure, :function, :hidden, :local_sheet_id
|
|
120
|
+
|
|
121
|
+
def to_xml_string(str='')
|
|
122
|
+
raise ArgumentError, 'you must specify the name for this defined name. Please read the documentation for Axlsx::DefinedName for more details' unless name
|
|
123
|
+
str << ('<definedName ' << 'name="' << name << '" ')
|
|
124
|
+
serialized_attributes str
|
|
125
|
+
str << ('>' << @formula << '</definedName>')
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
module Axlsx
|
|
2
|
-
# a simple types list of DefinedName objects
|
|
3
|
-
class DefinedNames < SimpleTypedList
|
|
4
|
-
|
|
5
|
-
# creates the DefinedNames object
|
|
6
|
-
def initialize
|
|
7
|
-
super DefinedName
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
# Serialize to xml
|
|
11
|
-
# @param [String] str
|
|
12
|
-
# @return [String]
|
|
13
|
-
def to_xml_string(str = '')
|
|
14
|
-
return if empty?
|
|
15
|
-
str << '<definedNames>'
|
|
16
|
-
each { |defined_name| defined_name.to_xml_string(str) }
|
|
17
|
-
str << '</definedNames>'
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
1
|
+
module Axlsx
|
|
2
|
+
# a simple types list of DefinedName objects
|
|
3
|
+
class DefinedNames < SimpleTypedList
|
|
4
|
+
|
|
5
|
+
# creates the DefinedNames object
|
|
6
|
+
def initialize
|
|
7
|
+
super DefinedName
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Serialize to xml
|
|
11
|
+
# @param [String] str
|
|
12
|
+
# @return [String]
|
|
13
|
+
def to_xml_string(str = '')
|
|
14
|
+
return if empty?
|
|
15
|
+
str << '<definedNames>'
|
|
16
|
+
each { |defined_name| defined_name.to_xml_string(str) }
|
|
17
|
+
str << '</definedNames>'
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
@@ -1,77 +1,77 @@
|
|
|
1
|
-
# encoding: UTF-8
|
|
2
|
-
module Axlsx
|
|
3
|
-
|
|
4
|
-
# The Shared String Table class is responsible for managing and serializing common strings in a workbook.
|
|
5
|
-
# While the ECMA-376 spec allows for both inline and shared strings it seems that at least some applications like iWorks Numbers
|
|
6
|
-
# and Google Docs require that the shared string table is populated in order to interoperate properly.
|
|
7
|
-
# As a developer, you should never need to directly work against this class. Simply set 'use_shared_strings'
|
|
8
|
-
# on the package or workbook to generate a package that uses the shared strings table instead of inline strings.
|
|
9
|
-
# @note Serialization performance is affected by using this serialization method so if you do not need interoperability
|
|
10
|
-
# it is recomended that you use the default inline string method of serialization.
|
|
11
|
-
class SharedStringsTable
|
|
12
|
-
|
|
13
|
-
# The total number of strings in the workbook including duplicates
|
|
14
|
-
# Empty cells are treated as blank strings
|
|
15
|
-
# @return [Integer]
|
|
16
|
-
attr_reader :count
|
|
17
|
-
|
|
18
|
-
# The total number of unique strings in the workbook.
|
|
19
|
-
# @return [Integer]
|
|
20
|
-
def unique_count
|
|
21
|
-
@unique_cells.size
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# An array of unique cells. Multiple attributes of the cell are used in comparison
|
|
25
|
-
# each of these unique cells is parsed into the shared string table.
|
|
26
|
-
# @see Cell#sharable
|
|
27
|
-
attr_reader :unique_cells
|
|
28
|
-
|
|
29
|
-
# The xml:space attribute
|
|
30
|
-
# @see Workbook#xml_space
|
|
31
|
-
attr_reader :xml_space
|
|
32
|
-
|
|
33
|
-
# Creates a new Shared Strings Table agains an array of cells
|
|
34
|
-
# @param [Array] cells This is an array of all of the cells in the workbook
|
|
35
|
-
# @param [Symbol] xml_space The xml:space behavior for the shared string table.
|
|
36
|
-
def initialize(cells, xml_space=:preserve)
|
|
37
|
-
@index = 0
|
|
38
|
-
@xml_space = xml_space
|
|
39
|
-
@unique_cells = {}
|
|
40
|
-
@shared_xml_string = ""
|
|
41
|
-
shareable_cells = cells.flatten.select{ |cell| cell.plain_string? || cell.contains_rich_text? }
|
|
42
|
-
@count = shareable_cells.size
|
|
43
|
-
resolve(shareable_cells)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# Serializes the object
|
|
47
|
-
# @param [String] str
|
|
48
|
-
# @return [String]
|
|
49
|
-
def to_xml_string(str='')
|
|
50
|
-
Axlsx::sanitize(@shared_xml_string)
|
|
51
|
-
str << ('<?xml version="1.0" encoding="UTF-8"?><sst xmlns="' << XML_NS << '"')
|
|
52
|
-
str << (' count="' << @count.to_s << '" uniqueCount="' << unique_count.to_s << '"')
|
|
53
|
-
str << (' xml:space="' << xml_space.to_s << '">' << @shared_xml_string << '</sst>')
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
private
|
|
57
|
-
|
|
58
|
-
# Interate over all of the cells in the array.
|
|
59
|
-
# if our unique cells array does not contain a sharable cell,
|
|
60
|
-
# add the cell to our unique cells array and set the ssti attribute on the index of this cell in the shared strings table
|
|
61
|
-
# if a sharable cell already exists in our unique_cells array, set the ssti attribute of the cell and move on.
|
|
62
|
-
# @return [Array] unique cells
|
|
63
|
-
def resolve(cells)
|
|
64
|
-
cells.each do |cell|
|
|
65
|
-
cell_hash = cell.value
|
|
66
|
-
if index = @unique_cells[cell_hash]
|
|
67
|
-
cell.send :ssti=, index
|
|
68
|
-
else
|
|
69
|
-
cell.send :ssti=, @index
|
|
70
|
-
@shared_xml_string << '<si>' << CellSerializer.run_xml_string(cell) << '</si>'
|
|
71
|
-
@unique_cells[cell_hash] = @index
|
|
72
|
-
@index += 1
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
module Axlsx
|
|
3
|
+
|
|
4
|
+
# The Shared String Table class is responsible for managing and serializing common strings in a workbook.
|
|
5
|
+
# While the ECMA-376 spec allows for both inline and shared strings it seems that at least some applications like iWorks Numbers
|
|
6
|
+
# and Google Docs require that the shared string table is populated in order to interoperate properly.
|
|
7
|
+
# As a developer, you should never need to directly work against this class. Simply set 'use_shared_strings'
|
|
8
|
+
# on the package or workbook to generate a package that uses the shared strings table instead of inline strings.
|
|
9
|
+
# @note Serialization performance is affected by using this serialization method so if you do not need interoperability
|
|
10
|
+
# it is recomended that you use the default inline string method of serialization.
|
|
11
|
+
class SharedStringsTable
|
|
12
|
+
|
|
13
|
+
# The total number of strings in the workbook including duplicates
|
|
14
|
+
# Empty cells are treated as blank strings
|
|
15
|
+
# @return [Integer]
|
|
16
|
+
attr_reader :count
|
|
17
|
+
|
|
18
|
+
# The total number of unique strings in the workbook.
|
|
19
|
+
# @return [Integer]
|
|
20
|
+
def unique_count
|
|
21
|
+
@unique_cells.size
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# An array of unique cells. Multiple attributes of the cell are used in comparison
|
|
25
|
+
# each of these unique cells is parsed into the shared string table.
|
|
26
|
+
# @see Cell#sharable
|
|
27
|
+
attr_reader :unique_cells
|
|
28
|
+
|
|
29
|
+
# The xml:space attribute
|
|
30
|
+
# @see Workbook#xml_space
|
|
31
|
+
attr_reader :xml_space
|
|
32
|
+
|
|
33
|
+
# Creates a new Shared Strings Table agains an array of cells
|
|
34
|
+
# @param [Array] cells This is an array of all of the cells in the workbook
|
|
35
|
+
# @param [Symbol] xml_space The xml:space behavior for the shared string table.
|
|
36
|
+
def initialize(cells, xml_space=:preserve)
|
|
37
|
+
@index = 0
|
|
38
|
+
@xml_space = xml_space
|
|
39
|
+
@unique_cells = {}
|
|
40
|
+
@shared_xml_string = ""
|
|
41
|
+
shareable_cells = cells.flatten.select{ |cell| cell.plain_string? || cell.contains_rich_text? }
|
|
42
|
+
@count = shareable_cells.size
|
|
43
|
+
resolve(shareable_cells)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Serializes the object
|
|
47
|
+
# @param [String] str
|
|
48
|
+
# @return [String]
|
|
49
|
+
def to_xml_string(str='')
|
|
50
|
+
Axlsx::sanitize(@shared_xml_string)
|
|
51
|
+
str << ('<?xml version="1.0" encoding="UTF-8"?><sst xmlns="' << XML_NS << '"')
|
|
52
|
+
str << (' count="' << @count.to_s << '" uniqueCount="' << unique_count.to_s << '"')
|
|
53
|
+
str << (' xml:space="' << xml_space.to_s << '">' << @shared_xml_string << '</sst>')
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
# Interate over all of the cells in the array.
|
|
59
|
+
# if our unique cells array does not contain a sharable cell,
|
|
60
|
+
# add the cell to our unique cells array and set the ssti attribute on the index of this cell in the shared strings table
|
|
61
|
+
# if a sharable cell already exists in our unique_cells array, set the ssti attribute of the cell and move on.
|
|
62
|
+
# @return [Array] unique cells
|
|
63
|
+
def resolve(cells)
|
|
64
|
+
cells.each do |cell|
|
|
65
|
+
cell_hash = cell.value
|
|
66
|
+
if index = @unique_cells[cell_hash]
|
|
67
|
+
cell.send :ssti=, index
|
|
68
|
+
else
|
|
69
|
+
cell.send :ssti=, @index
|
|
70
|
+
@shared_xml_string << '<si>' << CellSerializer.run_xml_string(cell) << '</si>'
|
|
71
|
+
@unique_cells[cell_hash] = @index
|
|
72
|
+
@index += 1
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|