write_xlsx 0.89.0 → 1.01.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Changes +98 -0
- data/LICENSE.txt +1 -1
- data/README.md +2 -2
- data/examples/a_simple.rb +2 -7
- data/examples/add_vba_project.rb +1 -1
- data/examples/array_formula.rb +1 -1
- data/examples/chart_area.rb +5 -2
- data/examples/chart_bar.rb +5 -2
- data/examples/chart_clustered.rb +1 -1
- data/examples/chart_column.rb +5 -2
- data/examples/chart_combined.rb +1 -1
- data/examples/chart_data_table.rb +9 -3
- data/examples/chart_data_tools.rb +25 -7
- data/examples/chart_doughnut.rb +17 -5
- data/examples/chart_gauge.rb +73 -0
- data/examples/chart_line.rb +5 -2
- data/examples/chart_pareto.rb +1 -1
- data/examples/chart_pie.rb +9 -3
- data/examples/chart_radar.rb +13 -4
- data/examples/chart_scatter.rb +5 -2
- data/examples/chart_secondary_axis.rb +5 -2
- data/examples/chart_stock.rb +1 -1
- data/examples/chart_styles.rb +1 -1
- data/examples/colors.rb +1 -1
- data/examples/conditional_format.rb +73 -46
- data/examples/data_validate.rb +1 -1
- data/examples/date_time.rb +1 -1
- data/examples/demo.rb +5 -8
- data/examples/formats.rb +1 -1
- data/examples/headers.rb +1 -1
- data/examples/hide_row_col.rb +1 -1
- data/examples/hide_sheet.rb +1 -1
- data/examples/hyperlink1.rb +5 -12
- data/examples/indent.rb +1 -1
- data/examples/macros.rb +1 -1
- data/examples/merge1.rb +1 -1
- data/examples/merge2.rb +1 -1
- data/examples/merge3.rb +1 -1
- data/examples/merge4.rb +1 -1
- data/examples/merge5.rb +1 -1
- data/examples/merge6.rb +1 -1
- data/examples/outline.rb +1 -1
- data/examples/outline_collapsed.rb +1 -1
- data/examples/panes.rb +1 -1
- data/examples/properties.rb +1 -1
- data/examples/regions.rb +1 -1
- data/examples/rich_strings.rb +1 -1
- data/examples/right_to_left.rb +1 -1
- data/examples/shape1.rb +1 -1
- data/examples/shape2.rb +1 -1
- data/examples/shape3.rb +1 -1
- data/examples/shape4.rb +1 -1
- data/examples/shape5.rb +1 -1
- data/examples/shape6.rb +1 -1
- data/examples/shape7.rb +1 -1
- data/examples/shape8.rb +1 -1
- data/examples/shape_all.rb +1 -1
- data/examples/sparklines1.rb +1 -1
- data/examples/sparklines2.rb +1 -1
- data/examples/stats.rb +1 -1
- data/examples/stats_ext.rb +1 -1
- data/examples/stocks.rb +1 -1
- data/examples/tab_colors.rb +1 -1
- data/examples/tables.rb +1 -1
- data/lib/write_xlsx/chart.rb +124 -240
- data/lib/write_xlsx/chart/area.rb +1 -1
- data/lib/write_xlsx/chart/axis.rb +4 -4
- data/lib/write_xlsx/chart/bar.rb +1 -1
- data/lib/write_xlsx/chart/caption.rb +3 -1
- data/lib/write_xlsx/chart/column.rb +1 -1
- data/lib/write_xlsx/chart/doughnut.rb +1 -1
- data/lib/write_xlsx/chart/legend.rb +14 -0
- data/lib/write_xlsx/chart/line.rb +1 -1
- data/lib/write_xlsx/chart/pie.rb +32 -15
- data/lib/write_xlsx/chart/radar.rb +1 -1
- data/lib/write_xlsx/chart/scatter.rb +1 -1
- data/lib/write_xlsx/chart/series.rb +11 -7
- data/lib/write_xlsx/chart/stock.rb +1 -1
- data/lib/write_xlsx/chartsheet.rb +35 -7
- data/lib/write_xlsx/drawing.rb +28 -8
- data/lib/write_xlsx/format.rb +19 -15
- data/lib/write_xlsx/package/comments.rb +57 -54
- data/lib/write_xlsx/package/conditional_format.rb +360 -39
- data/lib/write_xlsx/package/content_types.rb +10 -0
- data/lib/write_xlsx/package/core.rb +8 -6
- data/lib/write_xlsx/package/custom.rb +125 -0
- data/lib/write_xlsx/package/packager.rb +26 -0
- data/lib/write_xlsx/package/styles.rb +53 -21
- data/lib/write_xlsx/package/table.rb +16 -4
- data/lib/write_xlsx/shape.rb +4 -3
- data/lib/write_xlsx/sheets.rb +11 -1
- data/lib/write_xlsx/sparkline.rb +1 -1
- data/lib/write_xlsx/utility.rb +305 -35
- data/lib/write_xlsx/version.rb +1 -1
- data/lib/write_xlsx/workbook.rb +132 -12
- data/lib/write_xlsx/worksheet.rb +397 -163
- data/lib/write_xlsx/worksheet/data_validation.rb +10 -14
- data/lib/write_xlsx/worksheet/hyperlink.rb +4 -13
- data/test/chart/test_write_legend_pos.rb +9 -1
- data/test/chartsheet/test_write_sheet_protection.rb +91 -0
- data/test/drawing/test_drawing_chart_01.rb +6 -2
- data/test/drawing/test_drawing_image_01.rb +12 -3
- data/test/drawing/test_drawing_shape_01.rb +8 -5
- data/test/drawing/test_drawing_shape_02.rb +12 -5
- data/test/drawing/test_drawing_shape_03.rb +8 -5
- data/test/drawing/test_drawing_shape_04.rb +8 -24
- data/test/drawing/test_drawing_shape_05.rb +8 -5
- data/test/drawing/test_drawing_shape_06.rb +11 -6
- data/test/drawing/test_drawing_shape_07.rb +11 -6
- data/test/drawing/test_write_a_graphic_frame_locks.rb +1 -1
- data/test/drawing/test_write_c_chart.rb +1 -1
- data/test/drawing/test_write_c_nv_graphic_frame_pr.rb +1 -1
- data/test/drawing/test_write_c_nv_pr.rb +1 -1
- data/test/drawing/test_write_col.rb +1 -1
- data/test/drawing/test_write_col_off.rb +1 -1
- data/test/drawing/test_write_ext.rb +1 -1
- data/test/drawing/test_write_pos.rb +1 -1
- data/test/drawing/test_write_row.rb +1 -1
- data/test/drawing/test_write_row_off.rb +1 -1
- data/test/drawing/test_write_xfrm_extension.rb +1 -1
- data/test/drawing/test_write_xfrm_offset.rb +1 -1
- data/test/helper.rb +6 -1
- data/test/package/comments/test_comments_01.rb +54 -0
- data/test/package/comments/test_comments_02.rb +54 -0
- data/test/perl_output/chart_gauge.xlsx +0 -0
- data/test/perl_output/formats.xlsx +0 -0
- data/test/regression/_test_hyperlink31.rb +26 -0
- data/test/regression/images/happy.jpg +0 -0
- data/test/regression/images/zero_dpi.jpg +0 -0
- data/test/regression/test_array_formula03.rb +36 -0
- data/test/regression/test_autofilter08.rb +110 -0
- data/test/regression/test_autofilter09.rb +110 -0
- data/test/regression/test_autofilter10.rb +110 -0
- data/test/regression/test_chart_axis26.rb +10 -8
- data/test/regression/test_chart_axis27.rb +1 -1
- data/test/regression/test_chart_axis28.rb +1 -1
- data/test/regression/test_chart_axis29.rb +1 -1
- data/test/regression/test_chart_axis33.rb +1 -1
- data/test/regression/test_chart_axis42.rb +44 -0
- data/test/regression/test_chart_axis43.rb +44 -0
- data/test/regression/test_chart_axis44.rb +54 -0
- data/test/regression/test_chart_axis45.rb +54 -0
- data/test/regression/test_chart_axis46.rb +54 -0
- data/test/regression/test_chart_bar08.rb +3 -0
- data/test/regression/test_chart_bar11.rb +3 -0
- data/test/regression/test_chart_bar14.rb +3 -0
- data/test/regression/test_chart_chartarea05.rb +16 -17
- data/test/regression/test_chart_chartarea06.rb +49 -0
- data/test/regression/test_chart_combined10.rb +43 -0
- data/test/regression/test_chart_combined11.rb +63 -0
- data/test/regression/test_chart_data_labels25.rb +61 -0
- data/test/regression/test_chart_doughnut07.rb +37 -0
- data/test/regression/test_chart_font09.rb +1 -1
- data/test/regression/test_chart_format26.rb +48 -0
- data/test/regression/test_chart_format27.rb +58 -0
- data/test/regression/test_chart_format28.rb +52 -0
- data/test/regression/test_chart_format29.rb +59 -0
- data/test/regression/test_chart_format30.rb +53 -0
- data/test/regression/test_chart_format31.rb +60 -0
- data/test/regression/test_chart_legend03.rb +41 -0
- data/test/regression/test_chart_legend04.rb +41 -0
- data/test/regression/test_chart_legend05.rb +41 -0
- data/test/regression/test_chart_legend06.rb +41 -0
- data/test/regression/test_chart_legend07.rb +38 -0
- data/test/regression/test_chart_size03.rb +4 -1
- data/test/regression/test_chart_table03.rb +56 -0
- data/test/regression/test_comment13.rb +36 -0
- data/test/regression/test_comment14.rb +29 -0
- data/test/regression/test_cond_format14.rb +42 -0
- data/test/regression/test_cond_format15.rb +53 -0
- data/test/regression/test_cond_format16.rb +53 -0
- data/test/regression/test_cond_format17.rb +37 -0
- data/test/regression/test_cond_format18.rb +136 -0
- data/test/regression/test_cond_format19.rb +64 -0
- data/test/regression/test_cond_format20.rb +43 -0
- data/test/regression/test_date_1904_01.rb +1 -1
- data/test/regression/test_escapes04.rb +3 -0
- data/test/regression/test_escapes05.rb +3 -0
- data/test/regression/test_escapes07.rb +3 -0
- data/test/regression/test_escapes08.rb +3 -0
- data/test/regression/test_format15.rb +26 -0
- data/test/regression/test_hyperlink01.rb +3 -0
- data/test/regression/test_hyperlink02.rb +3 -0
- data/test/regression/test_hyperlink03.rb +4 -0
- data/test/regression/test_hyperlink04.rb +3 -0
- data/test/regression/test_hyperlink05.rb +3 -0
- data/test/regression/test_hyperlink06.rb +3 -0
- data/test/regression/test_hyperlink07.rb +3 -0
- data/test/regression/test_hyperlink08.rb +3 -0
- data/test/regression/test_hyperlink09.rb +3 -0
- data/test/regression/test_hyperlink10.rb +3 -0
- data/test/regression/test_hyperlink11.rb +3 -0
- data/test/regression/test_hyperlink12.rb +3 -0
- data/test/regression/test_hyperlink13.rb +3 -0
- data/test/regression/test_hyperlink14.rb +3 -0
- data/test/regression/test_hyperlink15.rb +3 -0
- data/test/regression/test_hyperlink16.rb +3 -0
- data/test/regression/test_hyperlink17.rb +3 -0
- data/test/regression/test_hyperlink18.rb +3 -0
- data/test/regression/test_hyperlink20.rb +3 -0
- data/test/regression/test_hyperlink21.rb +3 -0
- data/test/regression/test_hyperlink22.rb +3 -0
- data/test/regression/test_hyperlink23.rb +3 -0
- data/test/regression/test_hyperlink24.rb +3 -0
- data/test/regression/test_hyperlink25.rb +3 -0
- data/test/regression/test_hyperlink26.rb +3 -0
- data/test/regression/test_hyperlink27.rb +27 -0
- data/test/regression/test_hyperlink28.rb +50 -0
- data/test/regression/test_hyperlink29.rb +27 -0
- data/test/regression/test_hyperlink30.rb +36 -0
- data/test/regression/test_image08.rb +5 -4
- data/test/regression/test_image15.rb +4 -2
- data/test/regression/test_image28.rb +1 -1
- data/test/regression/test_image35.rb +26 -0
- data/test/regression/test_image36.rb +26 -0
- data/test/regression/test_image44.rb +28 -0
- data/test/regression/test_image45.rb +28 -0
- data/test/regression/test_image46.rb +29 -0
- data/test/regression/test_image47.rb +28 -0
- data/test/regression/test_object_position01.rb +26 -0
- data/test/regression/test_object_position02.rb +26 -0
- data/test/regression/test_object_position03.rb +26 -0
- data/test/regression/test_object_position04.rb +44 -0
- data/test/regression/test_object_position06.rb +28 -0
- data/test/regression/test_object_position07.rb +28 -0
- data/test/regression/test_object_position08.rb +47 -0
- data/test/regression/test_object_position09.rb +50 -0
- data/test/regression/test_object_position10.rb +28 -0
- data/test/regression/test_properties01.rb +1 -4
- data/test/regression/test_properties02.rb +1 -4
- data/test/regression/test_properties03.rb +26 -0
- data/test/regression/test_properties04.rb +61 -0
- data/test/regression/test_properties05.rb +30 -0
- data/test/regression/test_shape_connect01.rb +4 -2
- data/test/regression/test_table03.rb +3 -0
- data/test/regression/test_table04.rb +3 -0
- data/test/regression/test_table05.rb +3 -0
- data/test/regression/test_table06.rb +3 -0
- data/test/regression/test_table20.rb +34 -0
- data/test/regression/test_table21.rb +36 -0
- data/test/regression/test_table22.rb +32 -0
- data/test/regression/test_table23.rb +56 -0
- data/test/regression/test_utf8_11.rb +23 -0
- data/test/regression/xlsx_files/array_formula03.xlsx +0 -0
- data/test/regression/xlsx_files/autofilter08.xlsx +0 -0
- data/test/regression/xlsx_files/autofilter09.xlsx +0 -0
- data/test/regression/xlsx_files/autofilter10.xlsx +0 -0
- data/test/regression/xlsx_files/chart_axis26.xlsx +0 -0
- data/test/regression/xlsx_files/chart_axis27.xlsx +0 -0
- data/test/regression/xlsx_files/chart_axis28.xlsx +0 -0
- data/test/regression/xlsx_files/chart_axis29.xlsx +0 -0
- data/test/regression/xlsx_files/chart_axis33.xlsx +0 -0
- data/test/regression/xlsx_files/chart_axis42.xlsx +0 -0
- data/test/regression/xlsx_files/chart_axis43.xlsx +0 -0
- data/test/regression/xlsx_files/chart_axis44.xlsx +0 -0
- data/test/regression/xlsx_files/chart_axis45.xlsx +0 -0
- data/test/regression/xlsx_files/chart_axis46.xlsx +0 -0
- data/test/regression/xlsx_files/chart_chartarea05.xlsx +0 -0
- data/test/regression/xlsx_files/chart_chartarea06.xlsx +0 -0
- data/test/regression/xlsx_files/chart_combined10.xlsx +0 -0
- data/test/regression/xlsx_files/chart_combined11.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels25.xlsx +0 -0
- data/test/regression/xlsx_files/chart_doughnut07.xlsx +0 -0
- data/test/regression/xlsx_files/chart_font09.xlsx +0 -0
- data/test/regression/xlsx_files/chart_format26.xlsx +0 -0
- data/test/regression/xlsx_files/chart_format27.xlsx +0 -0
- data/test/regression/xlsx_files/chart_format28.xlsx +0 -0
- data/test/regression/xlsx_files/chart_format29.xlsx +0 -0
- data/test/regression/xlsx_files/chart_format30.xlsx +0 -0
- data/test/regression/xlsx_files/chart_format31.xlsx +0 -0
- data/test/regression/xlsx_files/chart_legend03.xlsx +0 -0
- data/test/regression/xlsx_files/chart_legend04.xlsx +0 -0
- data/test/regression/xlsx_files/chart_legend05.xlsx +0 -0
- data/test/regression/xlsx_files/chart_legend06.xlsx +0 -0
- data/test/regression/xlsx_files/chart_legend07.xlsx +0 -0
- data/test/regression/xlsx_files/chart_table03.xlsx +0 -0
- data/test/regression/xlsx_files/comment13.xlsx +0 -0
- data/test/regression/xlsx_files/comment14.xlsx +0 -0
- data/test/regression/xlsx_files/cond_format14.xlsx +0 -0
- data/test/regression/xlsx_files/cond_format15.xlsx +0 -0
- data/test/regression/xlsx_files/cond_format16.xlsx +0 -0
- data/test/regression/xlsx_files/cond_format17.xlsx +0 -0
- data/test/regression/xlsx_files/cond_format18.xlsx +0 -0
- data/test/regression/xlsx_files/cond_format19.xlsx +0 -0
- data/test/regression/xlsx_files/cond_format20.xlsx +0 -0
- data/test/regression/xlsx_files/date_1904_01.xlsx +0 -0
- data/test/regression/xlsx_files/format15.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink27.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink28.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink29.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink30.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink31.xlsx +0 -0
- data/test/regression/xlsx_files/image35.xlsx +0 -0
- data/test/regression/xlsx_files/image36.xlsx +0 -0
- data/test/regression/xlsx_files/image44.xlsx +0 -0
- data/test/regression/xlsx_files/image45.xlsx +0 -0
- data/test/regression/xlsx_files/image46.xlsx +0 -0
- data/test/regression/xlsx_files/image47.xlsx +0 -0
- data/test/regression/xlsx_files/object_position01.xlsx +0 -0
- data/test/regression/xlsx_files/object_position02.xlsx +0 -0
- data/test/regression/xlsx_files/object_position03.xlsx +0 -0
- data/test/regression/xlsx_files/object_position04.xlsx +0 -0
- data/test/regression/xlsx_files/object_position06.xlsx +0 -0
- data/test/regression/xlsx_files/object_position07.xlsx +0 -0
- data/test/regression/xlsx_files/object_position08.xlsx +0 -0
- data/test/regression/xlsx_files/object_position09.xlsx +0 -0
- data/test/regression/xlsx_files/object_position10.xlsx +0 -0
- data/test/regression/xlsx_files/properties03.xlsx +0 -0
- data/test/regression/xlsx_files/properties04.xlsx +0 -0
- data/test/regression/xlsx_files/properties05.xlsx +0 -0
- data/test/regression/xlsx_files/table21.xlsx +0 -0
- data/test/regression/xlsx_files/table22.xlsx +0 -0
- data/test/regression/xlsx_files/table23.xlsx +0 -0
- data/test/regression/xlsx_files/utf8_11.xlsx +0 -0
- data/test/test_example_match.rb +836 -771
- data/test/workbook/test_check_sheetname.rb +61 -0
- data/test/workbook/test_worksheet_by_name.rb +35 -0
- data/test/workbook/test_write_workbook_view.rb +117 -0
- data/test/worksheet/test_cond_format_22.rb +266 -0
- data/test/worksheet/test_cond_format_23.rb +242 -0
- data/test/worksheet/test_cond_format_24.rb +303 -0
- data/test/worksheet/test_data_bar_01.rb +53 -0
- data/test/worksheet/test_data_bar_02.rb +79 -0
- data/test/worksheet/test_data_bar_03.rb +147 -0
- data/test/worksheet/test_data_bar_04.rb +145 -0
- data/test/worksheet/test_data_bar_05.rb +147 -0
- data/test/worksheet/test_data_bar_06.rb +145 -0
- data/test/worksheet/test_data_bar_07.rb +146 -0
- data/test/worksheet/test_data_bar_08.rb +54 -0
- data/test/worksheet/test_data_bar_09.rb +80 -0
- data/test/worksheet/test_data_bar_10.rb +165 -0
- data/test/worksheet/test_data_bar_11.rb +167 -0
- data/test/worksheet/test_data_bar_12.rb +104 -0
- data/test/worksheet/test_write_data_validation_02.rb +44 -0
- data/test/worksheet/test_write_hyperlink.rb +0 -7
- data/test/worksheet/test_write_sheet_view.rb +19 -1
- metadata +308 -5
- data/test/package/comments/test_write_text_t.rb +0 -44
@@ -178,6 +178,16 @@ def add_vba_project
|
|
178
178
|
add_default('bin', 'application/vnd.ms-office.vbaProject')
|
179
179
|
end
|
180
180
|
|
181
|
+
#
|
182
|
+
# Add the name of a table to the ContentTypes overrides.
|
183
|
+
#
|
184
|
+
def add_custom_properties
|
185
|
+
custom = "/docProps/custom.xml"
|
186
|
+
|
187
|
+
add_override(custom, "#{App_document}custom-properties+xml")
|
188
|
+
end
|
189
|
+
|
190
|
+
|
181
191
|
private
|
182
192
|
|
183
193
|
def change_the_workbook_xml_content_type_from_xlsx_to_xlsm
|
@@ -14,7 +14,7 @@ class Core
|
|
14
14
|
def initialize
|
15
15
|
@writer = Package::XMLWriterSimple.new
|
16
16
|
@properties = {}
|
17
|
-
@
|
17
|
+
@createtime = [Time.now.gmtime]
|
18
18
|
end
|
19
19
|
|
20
20
|
def set_xml_writer(filename)
|
@@ -47,12 +47,14 @@ def write_cp_core_properties_base
|
|
47
47
|
end
|
48
48
|
|
49
49
|
#
|
50
|
-
# Convert a localtime() date to a ISO 8601 style
|
50
|
+
# Convert a gmtime/localtime() date to a ISO 8601 style
|
51
|
+
# "2010-01-01T00:00:00Z" date. Excel always treats this as
|
52
|
+
# a utc date/time.
|
51
53
|
#
|
52
|
-
def
|
53
|
-
|
54
|
+
def datetime_to_iso8601_date(gm_time = nil)
|
55
|
+
gm_time ||= Time.now.gmtime
|
54
56
|
|
55
|
-
|
57
|
+
gm_time.strftime('%Y-%m-%dT%H:%M:%SZ')
|
56
58
|
end
|
57
59
|
|
58
60
|
#
|
@@ -109,7 +111,7 @@ def write_dcterms(tag)
|
|
109
111
|
end
|
110
112
|
|
111
113
|
def dcterms_date
|
112
|
-
|
114
|
+
datetime_to_iso8601_date(@properties[:created])
|
113
115
|
end
|
114
116
|
|
115
117
|
#
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'write_xlsx/package/xml_writer_simple'
|
3
|
+
require 'write_xlsx/utility'
|
4
|
+
|
5
|
+
module Writexlsx
|
6
|
+
module Package
|
7
|
+
class Custom
|
8
|
+
|
9
|
+
include Writexlsx::Utility
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@writer = Package::XMLWriterSimple.new
|
13
|
+
@properties = []
|
14
|
+
@pid = 1
|
15
|
+
end
|
16
|
+
|
17
|
+
def set_xml_writer(filename)
|
18
|
+
@writer.set_xml_writer(filename)
|
19
|
+
end
|
20
|
+
|
21
|
+
def assemble_xml_file
|
22
|
+
write_xml_declaration do
|
23
|
+
write_properties
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
# Set the document properties.
|
29
|
+
#
|
30
|
+
def set_properties(properties)
|
31
|
+
@properties = properties
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def write_properties
|
37
|
+
schema = 'http://schemas.openxmlformats.org/officeDocument/2006/'
|
38
|
+
xmlns = "#{schema}custom-properties"
|
39
|
+
xmlns_vt = "#{schema}docPropsVTypes"
|
40
|
+
|
41
|
+
attributes = [
|
42
|
+
['xmlns', xmlns],
|
43
|
+
['xmlns:vt', xmlns_vt]
|
44
|
+
]
|
45
|
+
|
46
|
+
@writer.tag_elements('Properties', attributes ) do
|
47
|
+
@properties.each do |property|
|
48
|
+
# Write the property element.
|
49
|
+
write_property(property)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def write_property(property)
|
55
|
+
fmtid = '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}'
|
56
|
+
|
57
|
+
@pid += 1
|
58
|
+
name, value, type = property
|
59
|
+
|
60
|
+
attributes = [
|
61
|
+
['fmtid', fmtid],
|
62
|
+
['pid', @pid],
|
63
|
+
['name', name]
|
64
|
+
]
|
65
|
+
|
66
|
+
@writer.tag_elements('property', attributes) do
|
67
|
+
if type == 'date'
|
68
|
+
# Write the vt:filetime element.
|
69
|
+
write_vt_filetime(value)
|
70
|
+
elsif type == 'number'
|
71
|
+
# Write the vt:r8 element.
|
72
|
+
write_vt_r8(value)
|
73
|
+
elsif type == 'number_int'
|
74
|
+
# Write the vt:i4 element.
|
75
|
+
write_vt_i4(value)
|
76
|
+
elsif type == 'bool'
|
77
|
+
# Write the vt:bool element.
|
78
|
+
write_vt_bool(value)
|
79
|
+
else
|
80
|
+
# Write the vt:lpwstr element.
|
81
|
+
write_vt_lpwstr(value)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def write_vt_lpwstr(data)
|
87
|
+
@writer.data_element('vt:lpwstr', data)
|
88
|
+
end
|
89
|
+
|
90
|
+
#
|
91
|
+
# Write the <vt:i4> element.
|
92
|
+
#
|
93
|
+
def write_vt_i4(data)
|
94
|
+
@writer.data_element('vt:i4', data)
|
95
|
+
end
|
96
|
+
|
97
|
+
#
|
98
|
+
# Write the <vt:r8> element.
|
99
|
+
#
|
100
|
+
def write_vt_r8(data)
|
101
|
+
@writer.data_element('vt:r8', data)
|
102
|
+
end
|
103
|
+
|
104
|
+
#
|
105
|
+
# Write the <vt:bool> element.
|
106
|
+
#
|
107
|
+
def write_vt_bool(data)
|
108
|
+
if ptrue?(data)
|
109
|
+
data = 'true'
|
110
|
+
else
|
111
|
+
data = 'false'
|
112
|
+
end
|
113
|
+
|
114
|
+
@writer.data_element('vt:bool', data)
|
115
|
+
end
|
116
|
+
|
117
|
+
#
|
118
|
+
# Write the <vt:filetime> element.
|
119
|
+
#
|
120
|
+
def write_vt_filetime(data)
|
121
|
+
@writer.data_element('vt:filetime', data)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -5,6 +5,7 @@
|
|
5
5
|
require 'write_xlsx/package/comments'
|
6
6
|
require 'write_xlsx/package/content_types'
|
7
7
|
require 'write_xlsx/package/core'
|
8
|
+
require 'write_xlsx/package/custom'
|
8
9
|
require 'write_xlsx/package/relationships'
|
9
10
|
require 'write_xlsx/package/shared_strings'
|
10
11
|
require 'write_xlsx/package/styles'
|
@@ -44,6 +45,7 @@ def create_package
|
|
44
45
|
write_shared_strings_file
|
45
46
|
write_app_file
|
46
47
|
write_core_file
|
48
|
+
write_custom_file
|
47
49
|
write_content_types_file
|
48
50
|
write_styles_file
|
49
51
|
write_theme_file
|
@@ -172,6 +174,22 @@ def write_core_file
|
|
172
174
|
core.assemble_xml_file
|
173
175
|
end
|
174
176
|
|
177
|
+
#
|
178
|
+
# Write the custom.xml file.
|
179
|
+
#
|
180
|
+
def write_custom_file
|
181
|
+
properties = @workbook.custom_properties
|
182
|
+
custom = Package::Custom.new
|
183
|
+
|
184
|
+
return if properties.empty?
|
185
|
+
|
186
|
+
FileUtils.mkdir_p("#{@package_dir}/docProps")
|
187
|
+
|
188
|
+
custom.set_properties(properties)
|
189
|
+
custom.set_xml_writer("#{@package_dir}/docProps/custom.xml")
|
190
|
+
custom.assemble_xml_file
|
191
|
+
end
|
192
|
+
|
175
193
|
#
|
176
194
|
# Write the ContentTypes.xml file.
|
177
195
|
#
|
@@ -190,6 +208,8 @@ def write_content_types_file
|
|
190
208
|
content.add_shared_strings unless @workbook.shared_strings_empty?
|
191
209
|
# Add vbaProject if present.
|
192
210
|
content.add_vba_project if @workbook.vba_project
|
211
|
+
# Add the custom properties if present.
|
212
|
+
content.add_custom_properties unless @workbook.custom_properties.empty?
|
193
213
|
|
194
214
|
content.set_xml_writer("#{@package_dir}/[Content_Types].xml")
|
195
215
|
content.assemble_xml_file
|
@@ -239,9 +259,15 @@ def write_root_rels_file
|
|
239
259
|
FileUtils.mkdir_p("#{@package_dir}/_rels")
|
240
260
|
|
241
261
|
rels.add_document_relationship('/officeDocument', 'xl/workbook.xml')
|
262
|
+
|
242
263
|
rels.add_package_relationship('/metadata/core-properties',
|
243
264
|
'docProps/core.xml')
|
265
|
+
|
244
266
|
rels.add_document_relationship('/extended-properties', 'docProps/app.xml')
|
267
|
+
|
268
|
+
unless @workbook.custom_properties.empty?
|
269
|
+
rels.add_document_relationship('/custom-properties', 'docProps/custom.xml')
|
270
|
+
end
|
245
271
|
rels.set_xml_writer("#{@package_dir}/_rels/.rels" )
|
246
272
|
rels.assemble_xml_file
|
247
273
|
end
|
@@ -10,14 +10,16 @@ class Styles
|
|
10
10
|
|
11
11
|
def initialize
|
12
12
|
@writer = Package::XMLWriterSimple.new
|
13
|
-
@xf_formats
|
14
|
-
@palette
|
15
|
-
@font_count
|
16
|
-
@num_format_count
|
17
|
-
@border_count
|
18
|
-
@fill_count
|
19
|
-
@custom_colors
|
20
|
-
@dxf_formats
|
13
|
+
@xf_formats = nil
|
14
|
+
@palette = []
|
15
|
+
@font_count = 0
|
16
|
+
@num_format_count = 0
|
17
|
+
@border_count = 0
|
18
|
+
@fill_count = 0
|
19
|
+
@custom_colors = []
|
20
|
+
@dxf_formats = []
|
21
|
+
@has_hyperlink = 0
|
22
|
+
@hyperlink_font_id = 0
|
21
23
|
end
|
22
24
|
|
23
25
|
def set_xml_writer(filename)
|
@@ -33,7 +35,10 @@ def assemble_xml_file
|
|
33
35
|
#
|
34
36
|
# Pass in the Format objects and other properties used to set the styles.
|
35
37
|
#
|
36
|
-
def set_style_properties(
|
38
|
+
def set_style_properties(
|
39
|
+
xf_formats, palette, font_count, num_format_count, border_count,
|
40
|
+
fill_count, custom_colors, dxf_formats
|
41
|
+
)
|
37
42
|
@xf_formats = xf_formats
|
38
43
|
@palette = palette
|
39
44
|
@font_count = font_count
|
@@ -150,7 +155,11 @@ def write_fonts
|
|
150
155
|
|
151
156
|
def write_font_base
|
152
157
|
@xf_formats.each do |format|
|
153
|
-
|
158
|
+
if format.has_font?
|
159
|
+
format.write_font(@writer, self)
|
160
|
+
@has_hyperlink = 1 if ptrue?(format.hyperlink)
|
161
|
+
@hyperlink_font_id = format.font_index unless ptrue?(@hyperlink_font_id)
|
162
|
+
end
|
154
163
|
end
|
155
164
|
end
|
156
165
|
|
@@ -365,11 +374,17 @@ def write_sub_border(type, style = 0, color = nil)
|
|
365
374
|
# Write the <cellStyleXfs> element.
|
366
375
|
#
|
367
376
|
def write_cell_style_xfs
|
368
|
-
|
377
|
+
count = ptrue?(@has_hyperlink) ? 2 : 1
|
378
|
+
|
379
|
+
attributes = [ ['count', count] ]
|
369
380
|
|
370
381
|
@writer.tag_elements('cellStyleXfs', attributes) do
|
371
382
|
# Write the style_xf element.
|
372
|
-
write_style_xf
|
383
|
+
write_style_xf(0, 0)
|
384
|
+
|
385
|
+
if ptrue?(@has_hyperlink)
|
386
|
+
write_style_xf(1, @hyperlink_font_id)
|
387
|
+
end
|
373
388
|
end
|
374
389
|
end
|
375
390
|
|
@@ -396,15 +411,27 @@ def write_cell_xfs
|
|
396
411
|
#
|
397
412
|
# Write the style <xf> element.
|
398
413
|
#
|
399
|
-
def write_style_xf
|
414
|
+
def write_style_xf(has_hyperlink, font_id)
|
400
415
|
attributes = [
|
401
416
|
['numFmtId', 0],
|
402
|
-
['fontId',
|
417
|
+
['fontId', font_id],
|
403
418
|
['fillId', 0],
|
404
419
|
['borderId', 0]
|
405
420
|
]
|
406
421
|
|
407
|
-
|
422
|
+
if ptrue?(has_hyperlink)
|
423
|
+
attributes << ['applyNumberFormat', 0]
|
424
|
+
attributes << ['applyFill', 0]
|
425
|
+
attributes << ['applyBorder', 0]
|
426
|
+
attributes << ['applyAlignment', 0]
|
427
|
+
attributes << ['applyProtection', 0]
|
428
|
+
@writer.tag_elements('xf', attributes) do
|
429
|
+
@writer.empty_tag('alignment', [ ['vertical', 'top'] ])
|
430
|
+
@writer.empty_tag('protection', [ ['locked', 0] ])
|
431
|
+
end
|
432
|
+
else
|
433
|
+
@writer.empty_tag('xf', attributes)
|
434
|
+
end
|
408
435
|
end
|
409
436
|
|
410
437
|
private
|
@@ -450,22 +477,27 @@ def write_xf(format)
|
|
450
477
|
# Write the <cellStyles> element.
|
451
478
|
#
|
452
479
|
def write_cell_styles
|
453
|
-
|
480
|
+
count = ptrue?(@has_hyperlink) ? 2 : 1
|
481
|
+
|
482
|
+
attributes = [ ['count', count] ]
|
454
483
|
|
455
484
|
@writer.tag_elements('cellStyles', attributes) do
|
456
485
|
# Write the cellStyle element.
|
457
|
-
|
486
|
+
if ptrue?(@has_hyperlink)
|
487
|
+
write_cell_style('Hyperlink', 1, 8)
|
488
|
+
end
|
489
|
+
write_cell_style('Normal', 0, 0)
|
458
490
|
end
|
459
491
|
end
|
460
492
|
|
461
493
|
#
|
462
494
|
# Write the <cellStyle> element.
|
463
495
|
#
|
464
|
-
def write_cell_style
|
496
|
+
def write_cell_style(name, xf_id, builtin_id)
|
465
497
|
attributes = [
|
466
|
-
['name',
|
467
|
-
['xfId',
|
468
|
-
['builtinId',
|
498
|
+
['name', name],
|
499
|
+
['xfId', xf_id],
|
500
|
+
['builtinId', builtin_id]
|
469
501
|
]
|
470
502
|
|
471
503
|
@writer.empty_tag('cellStyle', attributes)
|
@@ -32,8 +32,9 @@ def initialize(worksheet, *args)
|
|
32
32
|
@writer = Package::XMLWriterSimple.new
|
33
33
|
|
34
34
|
@row1, @row2, @col1, @col2, @param = handle_args(*args)
|
35
|
-
@columns
|
35
|
+
@columns = []
|
36
36
|
@col_formats = []
|
37
|
+
@seen_name = {}
|
37
38
|
|
38
39
|
# Set the data range rows (without the header and footer).
|
39
40
|
@first_data_row = @row1
|
@@ -95,9 +96,15 @@ def overrite_the_defaults_with_any_use_defined_values(col_id, col_data, col_num)
|
|
95
96
|
col_data.name = user_data[:header]
|
96
97
|
end
|
97
98
|
|
99
|
+
# Excel requires unique case insensitive header names.
|
100
|
+
if @seen_name[col_data.name.downcase]
|
101
|
+
raise "add_table() contains duplicate name: '#{col_data.name}'"
|
102
|
+
else
|
103
|
+
@seen_name[col_data.name.downcase] = true
|
104
|
+
end
|
98
105
|
# Get the header format if defined.
|
99
106
|
col_data.name_format = user_data[:header_format]
|
100
|
-
|
107
|
+
|
101
108
|
# Handle the column formula.
|
102
109
|
handle_the_column_formula(
|
103
110
|
col_data, col_num, user_data[:formula], user_data[:format]
|
@@ -233,6 +240,11 @@ def handle_the_function_for_the_table_row(row2, col_data, col_num, user_data)
|
|
233
240
|
# Convert a table total function to a worksheet formula.
|
234
241
|
#
|
235
242
|
def table_function_to_formula(function, col_name)
|
243
|
+
col_name = col_name.gsub(/'/, "''").
|
244
|
+
gsub(/#/, "'#").
|
245
|
+
gsub(/\[/, "'[").
|
246
|
+
gsub(/\]/, "']")
|
247
|
+
|
236
248
|
subtotals = {
|
237
249
|
:average => 101,
|
238
250
|
:countNums => 102,
|
@@ -291,8 +303,8 @@ def set_the_table_name
|
|
291
303
|
# Raise if the name looks like a R1C1.
|
292
304
|
if name =~ /^[rcRC]$/ || name =~ /^[rcRC]\d+[rcRC]\d+$/
|
293
305
|
raise "Invalid name '#{name}' like a RC cell ref in add_table()"
|
294
|
-
end
|
295
|
-
|
306
|
+
end
|
307
|
+
|
296
308
|
@name = @param[:name]
|
297
309
|
end
|
298
310
|
end
|
data/lib/write_xlsx/shape.rb
CHANGED
@@ -8,14 +8,14 @@ module Writexlsx
|
|
8
8
|
# Used in conjunction with WriteXLSX.
|
9
9
|
#
|
10
10
|
# Copyright 2000-2012, John McNamara, jmcnamara@cpan.org
|
11
|
-
# Converted to ruby by Hideo NAKAMURA,
|
11
|
+
# Converted to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
|
12
12
|
#
|
13
13
|
class Shape
|
14
14
|
include Writexlsx::Utility
|
15
15
|
|
16
16
|
attr_reader :edit_as, :type, :drawing
|
17
17
|
attr_reader :tx_box, :fill, :line, :format
|
18
|
-
attr_reader :align, :valign
|
18
|
+
attr_reader :align, :valign, :anchor
|
19
19
|
attr_accessor :name, :connect, :type, :id, :start, :end, :rotation
|
20
20
|
attr_accessor :flip_h, :flip_v, :adjustments, :palette, :text, :stencil
|
21
21
|
attr_accessor :row_start, :row_end, :column_start, :column_end
|
@@ -183,11 +183,12 @@ def calc_position_emus(worksheet)
|
|
183
183
|
@y_abs = (y_abslt * 9_525).to_i
|
184
184
|
end
|
185
185
|
|
186
|
-
def set_position(row_start, column_start, x_offset, y_offset, x_scale, y_scale)
|
186
|
+
def set_position(row_start, column_start, x_offset, y_offset, x_scale, y_scale, anchor)
|
187
187
|
@row_start = row_start
|
188
188
|
@column_start = column_start
|
189
189
|
@x_offset = x_offset || 0
|
190
190
|
@y_offset = y_offset || 0
|
191
|
+
@anchor = anchor || 1
|
191
192
|
|
192
193
|
# Override shape scale if supplied as an argument. Otherwise, use the
|
193
194
|
# existing shape scale factors.
|