write_xlsx 0.99.0 → 1.07.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/.gitignore +1 -0
- data/.travis.yml +0 -1
- data/Changes +70 -0
- data/README.md +1 -1
- data/examples/a_simple.rb +1 -1
- 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_labels.rb +320 -0
- 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 +90 -12
- 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/data_validate.rb +1 -1
- data/examples/date_time.rb +1 -1
- data/examples/demo.rb +4 -1
- 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 +1 -1
- 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 +78 -43
- data/lib/write_xlsx/chart.rb +163 -34
- data/lib/write_xlsx/chart/area.rb +1 -1
- data/lib/write_xlsx/chart/bar.rb +1 -1
- data/lib/write_xlsx/chart/column.rb +1 -1
- data/lib/write_xlsx/chart/doughnut.rb +1 -1
- data/lib/write_xlsx/chart/line.rb +16 -2
- data/lib/write_xlsx/chart/pie.rb +21 -8
- 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 +100 -0
- data/lib/write_xlsx/chart/stock.rb +1 -1
- data/lib/write_xlsx/chartsheet.rb +5 -5
- data/lib/write_xlsx/drawing.rb +86 -30
- data/lib/write_xlsx/format.rb +5 -5
- data/lib/write_xlsx/package/comments.rb +11 -11
- data/lib/write_xlsx/package/relationships.rb +4 -4
- data/lib/write_xlsx/package/styles.rb +26 -8
- data/lib/write_xlsx/package/table.rb +8 -7
- data/lib/write_xlsx/package/vml.rb +20 -19
- data/lib/write_xlsx/shape.rb +4 -3
- data/lib/write_xlsx/sheets.rb +18 -16
- data/lib/write_xlsx/sparkline.rb +1 -1
- data/lib/write_xlsx/utility.rb +40 -7
- data/lib/write_xlsx/version.rb +1 -1
- data/lib/write_xlsx/workbook.rb +69 -44
- data/lib/write_xlsx/worksheet.rb +206 -138
- data/lib/write_xlsx/worksheet/hyperlink.rb +16 -37
- 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/perl_output/chart_data_labels.xlsx +0 -0
- data/test/perl_output/chart_gauge.xlsx +0 -0
- data/test/perl_output/chart_line.xlsx +0 -0
- data/test/perl_output/comments2.xlsx +0 -0
- data/test/perl_output/tables.xlsx +0 -0
- data/test/regression/images/red2.png +0 -0
- data/test/regression/test_array_formula04.rb +31 -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_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_combined10.rb +43 -0
- data/test/regression/test_chart_combined11.rb +63 -0
- data/test/regression/test_chart_data_labels25.rb +1 -1
- data/test/regression/test_chart_data_labels26.rb +44 -0
- data/test/regression/test_chart_data_labels27.rb +44 -0
- data/test/regression/test_chart_data_labels28.rb +52 -0
- data/test/regression/test_chart_data_labels29.rb +43 -0
- data/test/regression/test_chart_data_labels30.rb +46 -0
- data/test/regression/test_chart_data_labels31.rb +49 -0
- data/test/regression/test_chart_data_labels32.rb +54 -0
- data/test/regression/test_chart_data_labels33.rb +52 -0
- data/test/regression/test_chart_data_labels34.rb +54 -0
- data/test/regression/test_chart_data_labels35.rb +46 -0
- data/test/regression/test_chart_data_labels36.rb +54 -0
- data/test/regression/test_chart_data_labels37.rb +51 -0
- data/test/regression/test_chart_data_labels38.rb +54 -0
- data/test/regression/test_chart_data_labels39.rb +53 -0
- data/test/regression/test_chart_data_labels40.rb +53 -0
- data/test/regression/test_chart_data_labels41.rb +54 -0
- data/test/regression/test_chart_data_labels42.rb +58 -0
- data/test/regression/test_chart_data_labels43.rb +58 -0
- data/test/regression/test_chart_data_labels44.rb +56 -0
- data/test/regression/test_chart_data_labels45.rb +57 -0
- data/test/regression/test_chart_data_labels46.rb +61 -0
- data/test/regression/test_chart_data_labels47.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_line05.rb +43 -0
- data/test/regression/test_chart_line06.rb +43 -0
- data/test/regression/test_chart_size03.rb +4 -1
- data/test/regression/test_comment14.rb +29 -0
- data/test/regression/test_comment15.rb +28 -0
- data/test/regression/test_comment16.rb +34 -0
- data/test/regression/test_header_image15.rb +36 -0
- data/test/regression/test_header_image16.rb +42 -0
- data/test/regression/test_header_image17.rb +46 -0
- data/test/regression/test_header_image18.rb +48 -0
- data/test/regression/test_header_image19.rb +36 -0
- data/test/regression/test_hyperlink32.rb +27 -0
- data/test/regression/test_hyperlink33.rb +28 -0
- data/test/regression/test_hyperlink34.rb +33 -0
- data/test/regression/test_hyperlink35.rb +39 -0
- data/test/regression/test_hyperlink36.rb +34 -0
- data/test/regression/test_hyperlink37.rb +33 -0
- data/test/regression/test_hyperlink38.rb +27 -0
- data/test/regression/test_hyperlink39.rb +27 -0
- data/test/regression/test_hyperlink40.rb +27 -0
- data/test/regression/test_hyperlink41.rb +27 -0
- data/test/regression/test_hyperlink42.rb +27 -0
- data/test/regression/test_hyperlink43.rb +27 -0
- data/test/regression/test_hyperlink44.rb +27 -0
- data/test/regression/test_hyperlink45.rb +27 -0
- data/test/regression/test_hyperlink47.rb +27 -0
- data/test/regression/test_hyperlink48.rb +31 -0
- data/test/regression/test_hyperlink49.rb +29 -0
- data/test/regression/test_image06.rb +5 -5
- 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_image44.rb +28 -0
- data/test/regression/test_image45.rb +29 -0
- data/test/regression/test_image46.rb +29 -0
- data/test/regression/test_image47.rb +28 -0
- data/test/regression/test_image48.rb +32 -0
- data/test/regression/test_image49.rb +38 -0
- data/test/regression/test_image50.rb +24 -0
- data/test/regression/test_image51.rb +30 -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_object_position12.rb +25 -0
- data/test/regression/test_object_position13.rb +25 -0
- data/test/regression/test_object_position14.rb +25 -0
- data/test/regression/test_object_position15.rb +29 -0
- data/test/regression/test_object_position16.rb +29 -0
- data/test/regression/test_object_position17.rb +29 -0
- data/test/regression/test_object_position18.rb +29 -0
- data/test/regression/test_object_position19.rb +29 -0
- data/test/regression/test_object_position20.rb +29 -0
- data/test/regression/test_shape_connect01.rb +4 -2
- data/test/regression/test_table24.rb +27 -0
- data/test/regression/test_table25.rb +27 -0
- data/test/regression/xlsx_files/array_formula04.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_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_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_data_labels26.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels27.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels28.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels29.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels30.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels31.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels32.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels33.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels34.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels35.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels36.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels37.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels38.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels39.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels40.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels41.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels42.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels43.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels44.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels45.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels46.xlsx +0 -0
- data/test/regression/xlsx_files/chart_data_labels47.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_line05.xlsx +0 -0
- data/test/regression/xlsx_files/chart_line06.xlsx +0 -0
- data/test/regression/xlsx_files/comment14.xlsx +0 -0
- data/test/regression/xlsx_files/comment15.xlsx +0 -0
- data/test/regression/xlsx_files/comment16.xlsx +0 -0
- data/test/regression/xlsx_files/header_image15.xlsx +0 -0
- data/test/regression/xlsx_files/header_image16.xlsx +0 -0
- data/test/regression/xlsx_files/header_image17.xlsx +0 -0
- data/test/regression/xlsx_files/header_image18.xlsx +0 -0
- data/test/regression/xlsx_files/header_image19.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink32.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink33.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink34.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink35.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink36.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink37.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink38.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink39.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink40.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink41.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink42.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink43.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink44.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink45.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink46.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink47.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink48.xlsx +0 -0
- data/test/regression/xlsx_files/hyperlink49.xlsx +0 -0
- data/test/regression/xlsx_files/image06.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/image48.xlsx +0 -0
- data/test/regression/xlsx_files/image49.xlsx +0 -0
- data/test/regression/xlsx_files/image50.xlsx +0 -0
- data/test/regression/xlsx_files/image51.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/object_position12.xlsx +0 -0
- data/test/regression/xlsx_files/object_position13.xlsx +0 -0
- data/test/regression/xlsx_files/object_position14.xlsx +0 -0
- data/test/regression/xlsx_files/object_position15.xlsx +0 -0
- data/test/regression/xlsx_files/object_position16.xlsx +0 -0
- data/test/regression/xlsx_files/object_position17.xlsx +0 -0
- data/test/regression/xlsx_files/object_position18.xlsx +0 -0
- data/test/regression/xlsx_files/object_position19.xlsx +0 -0
- data/test/regression/xlsx_files/object_position20.xlsx +0 -0
- data/test/regression/xlsx_files/table24.xlsx +0 -0
- data/test/regression/xlsx_files/table25.xlsx +0 -0
- data/test/test_example_match.rb +1268 -780
- data/test/workbook/test_check_sheetname.rb +51 -0
- data/write_xlsx.gemspec +1 -0
- metadata +367 -5
data/lib/write_xlsx/format.rb
CHANGED
@@ -248,11 +248,11 @@ def initialize(formats, params = {}) # :nodoc:
|
|
248
248
|
#
|
249
249
|
def copy(other)
|
250
250
|
reserve = [
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
251
|
+
:xf_index,
|
252
|
+
:dxf_index,
|
253
|
+
:xdf_format_indices,
|
254
|
+
:palette
|
255
|
+
]
|
256
256
|
(instance_variables - reserve).each do |v|
|
257
257
|
instance_variable_set(v, other.instance_variable_get(v))
|
258
258
|
end
|
@@ -155,7 +155,7 @@ def visibility
|
|
155
155
|
#
|
156
156
|
def fill_attributes
|
157
157
|
[
|
158
|
-
|
158
|
+
['color2', '#ffffe1']
|
159
159
|
]
|
160
160
|
end
|
161
161
|
|
@@ -164,9 +164,9 @@ def fill_attributes
|
|
164
164
|
#
|
165
165
|
def write_shadow
|
166
166
|
attributes = [
|
167
|
-
|
168
|
-
|
169
|
-
|
167
|
+
['on', 't'],
|
168
|
+
['color', 'black'],
|
169
|
+
['obscured', 't']
|
170
170
|
]
|
171
171
|
|
172
172
|
@writer.empty_tag('v:shadow', attributes)
|
@@ -257,13 +257,9 @@ def [](row)
|
|
257
257
|
@comments[row]
|
258
258
|
end
|
259
259
|
|
260
|
-
def add(
|
261
|
-
|
262
|
-
|
263
|
-
else
|
264
|
-
@comments[comment.row] = {}
|
265
|
-
@comments[comment.row][comment.col] = comment
|
266
|
-
end
|
260
|
+
def add(workbook, worksheet, row, col, string, options)
|
261
|
+
@comments[row] ||= {}
|
262
|
+
@comments[row][col] = [workbook, worksheet, row, col, string, options]
|
267
263
|
end
|
268
264
|
|
269
265
|
def empty?
|
@@ -293,6 +289,10 @@ def sorted_comments
|
|
293
289
|
# We sort the comments by row and column but that isn't strictly required.
|
294
290
|
@comments.keys.sort.each do |row|
|
295
291
|
@comments[row].keys.sort.each do |col|
|
292
|
+
user_options = @comments[row][col]
|
293
|
+
comment = Comment.new(*user_options)
|
294
|
+
@comments[row][col] = comment
|
295
|
+
|
296
296
|
# Set comment visibility if required and not already user defined.
|
297
297
|
@comments[row][col].visible ||= 1 if comments_visible?
|
298
298
|
|
@@ -31,8 +31,8 @@ def assemble_xml_file
|
|
31
31
|
#
|
32
32
|
# Add container relationship to XLSX .rels xml files.
|
33
33
|
#
|
34
|
-
def add_document_relationship(type, target)
|
35
|
-
@rels.push([Document_schema + type, target])
|
34
|
+
def add_document_relationship(type, target, target_mode = nil)
|
35
|
+
@rels.push([Document_schema + type, target, target_mode])
|
36
36
|
end
|
37
37
|
|
38
38
|
#
|
@@ -64,8 +64,8 @@ def add_worksheet_relationship(type, target, target_mode = nil)
|
|
64
64
|
#
|
65
65
|
def write_relationships
|
66
66
|
attributes = [
|
67
|
-
|
68
|
-
|
67
|
+
['xmlns', Package_schema]
|
68
|
+
]
|
69
69
|
|
70
70
|
@writer.tag_elements('Relationships', attributes) do
|
71
71
|
@rels.each { |rel| write_relationship(*rel) }
|
@@ -20,6 +20,7 @@ def initialize
|
|
20
20
|
@dxf_formats = []
|
21
21
|
@has_hyperlink = 0
|
22
22
|
@hyperlink_font_id = 0
|
23
|
+
@has_comments = false
|
23
24
|
end
|
24
25
|
|
25
26
|
def set_xml_writer(filename)
|
@@ -37,7 +38,7 @@ def assemble_xml_file
|
|
37
38
|
#
|
38
39
|
def set_style_properties(
|
39
40
|
xf_formats, palette, font_count, num_format_count, border_count,
|
40
|
-
fill_count, custom_colors, dxf_formats
|
41
|
+
fill_count, custom_colors, dxf_formats, has_comments
|
41
42
|
)
|
42
43
|
@xf_formats = xf_formats
|
43
44
|
@palette = palette
|
@@ -47,6 +48,7 @@ def set_style_properties(
|
|
47
48
|
@fill_count = fill_count
|
48
49
|
@custom_colors = custom_colors
|
49
50
|
@dxf_formats = dxf_formats
|
51
|
+
@has_comments = has_comments
|
50
52
|
end
|
51
53
|
|
52
54
|
#
|
@@ -148,7 +150,14 @@ def write_num_fmt(num_fmt_id, format_code)
|
|
148
150
|
# Write the <fonts> element.
|
149
151
|
#
|
150
152
|
def write_fonts
|
151
|
-
|
153
|
+
count = @font_count
|
154
|
+
|
155
|
+
if @has_comments
|
156
|
+
# Add an extra font for comments.
|
157
|
+
count += 1
|
158
|
+
end
|
159
|
+
|
160
|
+
write_format_elements('fonts', count) do
|
152
161
|
write_font_base
|
153
162
|
end
|
154
163
|
end
|
@@ -161,6 +170,21 @@ def write_font_base
|
|
161
170
|
@hyperlink_font_id = format.font_index unless ptrue?(@hyperlink_font_id)
|
162
171
|
end
|
163
172
|
end
|
173
|
+
if @has_comments
|
174
|
+
write_comment_font
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
#
|
179
|
+
# Write the <font> element used for comments.
|
180
|
+
#
|
181
|
+
def write_comment_font
|
182
|
+
@writer.tag_elements('font') do
|
183
|
+
@writer.empty_tag('sz', [['val', 8]])
|
184
|
+
write_color('indexed', 81)
|
185
|
+
@writer.empty_tag( 'name', [['val', 'Tahoma']])
|
186
|
+
@writer.empty_tag( 'family', [['val', 2]])
|
187
|
+
end
|
164
188
|
end
|
165
189
|
|
166
190
|
#
|
@@ -394,12 +418,6 @@ def write_cell_style_xfs
|
|
394
418
|
def write_cell_xfs
|
395
419
|
formats = @xf_formats
|
396
420
|
|
397
|
-
# Workaround for when the last format is used for the comment font
|
398
|
-
# and shouldn't be used for cellXfs.
|
399
|
-
last_format = formats[-1]
|
400
|
-
|
401
|
-
formats.pop if last_format && last_format.font_only != 0
|
402
|
-
|
403
421
|
attributes = [ ['count', formats.size] ]
|
404
422
|
|
405
423
|
@writer.tag_elements('cellXfs', attributes) do
|
@@ -398,13 +398,14 @@ def write_table_column(col_data)
|
|
398
398
|
# Write the <tableStyleInfo> element.
|
399
399
|
#
|
400
400
|
def write_table_style_info
|
401
|
-
attributes = [
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
401
|
+
attributes = []
|
402
|
+
if @style && @style != '' && @style != 'None'
|
403
|
+
attributes << ['name', @style]
|
404
|
+
end
|
405
|
+
attributes << ['showFirstColumn', @show_first_col]
|
406
|
+
attributes << ['showLastColumn', @show_last_col]
|
407
|
+
attributes << ['showRowStripes', @show_row_stripes]
|
408
|
+
attributes << ['showColumnStripes', @show_col_stripes]
|
408
409
|
|
409
410
|
@writer.empty_tag('tableStyleInfo', attributes)
|
410
411
|
end
|
@@ -17,9 +17,9 @@ def set_xml_writer(filename)
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def assemble_xml_file(
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
data_id, vml_shape_id, comments_data,
|
21
|
+
buttons_data, header_images_data = []
|
22
|
+
)
|
23
23
|
return unless @writer
|
24
24
|
|
25
25
|
write_xml_namespace do
|
@@ -29,9 +29,9 @@ def assemble_xml_file(
|
|
29
29
|
z_index = 1
|
30
30
|
unless buttons_data.empty?
|
31
31
|
vml_shape_id, z_index =
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
write_shape_type_and_shape(
|
33
|
+
buttons_data,
|
34
|
+
vml_shape_id, z_index) do
|
35
35
|
write_button_shapetype
|
36
36
|
end
|
37
37
|
end
|
@@ -277,6 +277,7 @@ def write_image_shape(id, index, image_data)
|
|
277
277
|
position = image_data[3]
|
278
278
|
x_dpi = image_data[4]
|
279
279
|
y_dpi = image_data[5]
|
280
|
+
ref_id = image_data[6]
|
280
281
|
|
281
282
|
# Scale the height/width by the resolution, relative to 72dpi.
|
282
283
|
width = width * 72.0 / x_dpi
|
@@ -294,20 +295,20 @@ def write_image_shape(id, index, image_data)
|
|
294
295
|
end
|
295
296
|
|
296
297
|
style = [
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
298
|
+
"position:absolute", "margin-left:0", "margin-top:0",
|
299
|
+
"width:#{width}pt", "height:#{height}pt",
|
300
|
+
"z-index:#{index}"
|
301
|
+
].join(';')
|
301
302
|
attributes = [
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
303
|
+
['id', position],
|
304
|
+
['o:spid', "_x0000_s#{id}"],
|
305
|
+
['type', type],
|
306
|
+
['style', style]
|
307
|
+
]
|
307
308
|
|
308
309
|
@writer.tag_elements('v:shape', attributes) do
|
309
310
|
# Write the v:imagedata element.
|
310
|
-
write_imagedata(
|
311
|
+
write_imagedata(ref_id, name)
|
311
312
|
|
312
313
|
# Write the o:lock element.
|
313
314
|
write_rotation_lock
|
@@ -319,9 +320,9 @@ def write_image_shape(id, index, image_data)
|
|
319
320
|
#
|
320
321
|
def write_imagedata(index, o_title)
|
321
322
|
attributes = [
|
322
|
-
|
323
|
-
|
324
|
-
|
323
|
+
['o:relid', "rId#{index}"],
|
324
|
+
['o:title', o_title]
|
325
|
+
]
|
325
326
|
|
326
327
|
@writer.empty_tag('v:imagedata', attributes)
|
327
328
|
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.
|
data/lib/write_xlsx/sheets.rb
CHANGED
@@ -67,18 +67,18 @@ def write_vml_files(package_dir)
|
|
67
67
|
vml = Package::Vml.new
|
68
68
|
vml.set_xml_writer("#{dir}/vmlDrawing#{index}.vml")
|
69
69
|
vml.assemble_xml_file(
|
70
|
-
|
71
|
-
|
72
|
-
|
70
|
+
sheet.vml_data_id, sheet.vml_shape_id,
|
71
|
+
sheet.sorted_comments, sheet.buttons_data
|
72
|
+
)
|
73
73
|
index += 1
|
74
74
|
end
|
75
75
|
if sheet.has_header_vml?
|
76
76
|
vml = Package::Vml.new
|
77
77
|
vml.set_xml_writer("#{dir}/vmlDrawing#{index}.vml")
|
78
78
|
vml.assemble_xml_file(
|
79
|
-
|
80
|
-
|
81
|
-
|
79
|
+
sheet.vml_header_id, sheet.vml_header_id * 1024,
|
80
|
+
[], [], sheet.header_images_data
|
81
|
+
)
|
82
82
|
write_vml_drawing_rels_files(package_dir, sheet, index)
|
83
83
|
index += 1
|
84
84
|
end
|
@@ -106,16 +106,12 @@ def write_table_files(package_dir)
|
|
106
106
|
end
|
107
107
|
|
108
108
|
def write_chartsheet_rels_files(package_dir)
|
109
|
-
write_sheet_rels_files_base(
|
110
|
-
|
109
|
+
write_sheet_rels_files_base(
|
110
|
+
chartsheets, "#{package_dir}/xl/chartsheets/_rels", 'sheet'
|
111
|
+
)
|
111
112
|
end
|
112
113
|
|
113
114
|
def write_drawing_rels_files(package_dir)
|
114
|
-
# write_rels_files_base(
|
115
|
-
# self.reject { |sheet| sheet.drawing_links[0].empty? },
|
116
|
-
# "#{package_dir}/xl/drawings/_rels",
|
117
|
-
|
118
|
-
# )
|
119
115
|
dir = "#{package_dir}/xl/drawings/_rels"
|
120
116
|
|
121
117
|
index = 0
|
@@ -159,8 +155,9 @@ def write_vml_drawing_rels_files(package_dir, worksheet, index)
|
|
159
155
|
end
|
160
156
|
|
161
157
|
def write_worksheet_rels_files(package_dir)
|
162
|
-
write_sheet_rels_files_base(
|
163
|
-
|
158
|
+
write_sheet_rels_files_base(
|
159
|
+
worksheets, "#{package_dir}/xl/worksheets/_rels", 'sheet'
|
160
|
+
)
|
164
161
|
end
|
165
162
|
|
166
163
|
def write_sheet_rels_files_base(sheets, dir, body)
|
@@ -230,10 +227,15 @@ def check_valid_sheetname(name)
|
|
230
227
|
raise 'Invalid character []:*?/\\ in worksheet name: ' + name
|
231
228
|
end
|
232
229
|
|
230
|
+
# Check that sheetname doesn't start or end with an apostrophe.
|
231
|
+
if name =~ /^'/ || name =~ /'$/
|
232
|
+
raise "Worksheet name #{name} cannot start or end with an "
|
233
|
+
end
|
234
|
+
|
233
235
|
# Check that the worksheet name doesn't already exist since this is a fatal
|
234
236
|
# error in Excel 97. The check must also exclude case insensitive matches.
|
235
237
|
unless is_sheetname_uniq?(name)
|
236
|
-
raise "
|
238
|
+
raise "apostropheWorksheet name '#{name}', with case ignored, is already used."
|
237
239
|
end
|
238
240
|
end
|
239
241
|
|
data/lib/write_xlsx/sparkline.rb
CHANGED
@@ -9,7 +9,7 @@ module Writexlsx
|
|
9
9
|
# Used in conjunction with WriteXLSX.
|
10
10
|
#
|
11
11
|
# Copyright 2000-2012, John McNamara, jmcnamara@cpan.org
|
12
|
-
# Converted to ruby by Hideo NAKAMURA,
|
12
|
+
# Converted to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
|
13
13
|
#
|
14
14
|
class Sparkline
|
15
15
|
include Writexlsx::Utility
|
data/lib/write_xlsx/utility.rb
CHANGED
@@ -218,6 +218,25 @@ def convert_date_time(date_time_string) #:nodoc:
|
|
218
218
|
end
|
219
219
|
end
|
220
220
|
|
221
|
+
def escape_url(url)
|
222
|
+
unless url =~ /%[0-9a-fA-F]{2}/
|
223
|
+
# Escape the URL escape symbol.
|
224
|
+
url = url.gsub(/%/, "%25")
|
225
|
+
|
226
|
+
# Escape whitespae in URL.
|
227
|
+
url = url.gsub(/[\s\x00]/, '%20')
|
228
|
+
|
229
|
+
# Escape other special characters in URL.
|
230
|
+
re = /(["<>\[\]`^{}])/
|
231
|
+
while re =~ url
|
232
|
+
match = $~[1]
|
233
|
+
url = url.sub(re, sprintf("%%%x", match.ord))
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
url
|
238
|
+
end
|
239
|
+
|
221
240
|
def absolute_char(absolute)
|
222
241
|
absolute ? '$' : ''
|
223
242
|
end
|
@@ -785,14 +804,14 @@ def params_to_font(params)
|
|
785
804
|
#
|
786
805
|
# Write the <c:txPr> element.
|
787
806
|
#
|
788
|
-
def write_tx_pr(
|
807
|
+
def write_tx_pr(font, is_y_axis = nil) # :nodoc:
|
789
808
|
rotation = nil
|
790
|
-
if font && font[:_rotation]
|
809
|
+
if font && font.respond_to?(:[]) && font[:_rotation]
|
791
810
|
rotation = font[:_rotation]
|
792
811
|
end
|
793
812
|
@writer.tag_elements('c:txPr') do
|
794
813
|
# Write the a:bodyPr element.
|
795
|
-
write_a_body_pr(rotation,
|
814
|
+
write_a_body_pr(rotation, is_y_axis)
|
796
815
|
# Write the a:lstStyle element.
|
797
816
|
write_a_lst_style
|
798
817
|
# Write the a:p element.
|
@@ -803,11 +822,23 @@ def write_tx_pr(horiz, font) # :nodoc:
|
|
803
822
|
#
|
804
823
|
# Write the <a:bodyPr> element.
|
805
824
|
#
|
806
|
-
def write_a_body_pr(rot,
|
807
|
-
rot = -5400000 if !rot && ptrue?(
|
825
|
+
def write_a_body_pr(rot, is_y_axis = nil) # :nodoc:
|
826
|
+
rot = -5400000 if !rot && ptrue?(is_y_axis)
|
808
827
|
attributes = []
|
809
|
-
|
810
|
-
|
828
|
+
if rot
|
829
|
+
if rot == 16_200_000
|
830
|
+
# 270 deg/stacked angle.
|
831
|
+
attributes << ['rot', 0]
|
832
|
+
attributes << ['vert', 'wordArtVert']
|
833
|
+
elsif rot == 16_260_000
|
834
|
+
# 271 deg/stacked angle.
|
835
|
+
attributes << ['rot', 0]
|
836
|
+
attributes << ['vert', 'eaVert']
|
837
|
+
else
|
838
|
+
attributes << ['rot', rot]
|
839
|
+
attributes << ['vert', 'horz']
|
840
|
+
end
|
841
|
+
end
|
811
842
|
|
812
843
|
@writer.empty_tag('a:bodyPr', attributes)
|
813
844
|
end
|
@@ -872,6 +903,7 @@ def write_def_rpr_r_pr_common(font, style_attributes, tag) # :nodoc:
|
|
872
903
|
#
|
873
904
|
def get_font_latin_attributes(font)
|
874
905
|
return [] unless font
|
906
|
+
return [] unless font.respond_to?(:[])
|
875
907
|
|
876
908
|
attributes = []
|
877
909
|
attributes << ['typeface', font[:_name]] if ptrue?(font[:_name])
|
@@ -928,6 +960,7 @@ def color(color_code) # :nodoc:
|
|
928
960
|
#
|
929
961
|
def get_font_style_attributes(font)
|
930
962
|
return [] unless font
|
963
|
+
return [] unless font.respond_to?(:[])
|
931
964
|
|
932
965
|
attributes = []
|
933
966
|
attributes << ['sz', font[:_size]] if ptrue?(font[:_size])
|