write_xlsx 0.0.2

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.
Files changed (261) hide show
  1. data/.document +5 -0
  2. data/.gitattributes +1 -0
  3. data/Gemfile +12 -0
  4. data/LICENSE.txt +20 -0
  5. data/README.rdoc +82 -0
  6. data/Rakefile +78 -0
  7. data/VERSION +1 -0
  8. data/examples/a_simple.rb +45 -0
  9. data/examples/array_formula.rb +33 -0
  10. data/examples/autofilter.rb +235 -0
  11. data/examples/chart_area.rb +59 -0
  12. data/examples/chart_bar.rb +59 -0
  13. data/examples/chart_column.rb +58 -0
  14. data/examples/chart_line.rb +59 -0
  15. data/examples/chart_pie.rb +49 -0
  16. data/examples/chart_scatter.rb +59 -0
  17. data/examples/chart_stock.rb +65 -0
  18. data/examples/colors.rb +130 -0
  19. data/examples/comments1.rb +12 -0
  20. data/examples/comments2.rb +335 -0
  21. data/examples/conditional_format.rb +67 -0
  22. data/examples/data_validate.rb +279 -0
  23. data/examples/defined_name.rb +28 -0
  24. data/examples/demo.rb +104 -0
  25. data/examples/diag_border.rb +26 -0
  26. data/examples/headers.rb +119 -0
  27. data/examples/hide_sheet.rb +30 -0
  28. data/examples/hyperlink1.rb +58 -0
  29. data/examples/indent.rb +28 -0
  30. data/examples/merge1.rb +38 -0
  31. data/examples/merge2.rb +48 -0
  32. data/examples/merge3.rb +43 -0
  33. data/examples/merge4.rb +82 -0
  34. data/examples/merge5.rb +70 -0
  35. data/examples/merge6.rb +48 -0
  36. data/examples/outline.rb +252 -0
  37. data/examples/properties.rb +33 -0
  38. data/examples/protection.rb +34 -0
  39. data/examples/rich_strings.rb +42 -0
  40. data/examples/right_to_left.rb +24 -0
  41. data/examples/tab_colors.rb +26 -0
  42. data/lib/write_xlsx.rb +77 -0
  43. data/lib/write_xlsx/chart.rb +3027 -0
  44. data/lib/write_xlsx/chart/area.rb +52 -0
  45. data/lib/write_xlsx/chart/bar.rb +126 -0
  46. data/lib/write_xlsx/chart/column.rb +132 -0
  47. data/lib/write_xlsx/chart/line.rb +51 -0
  48. data/lib/write_xlsx/chart/pie.rb +210 -0
  49. data/lib/write_xlsx/chart/scatter.rb +252 -0
  50. data/lib/write_xlsx/chart/stock.rb +134 -0
  51. data/lib/write_xlsx/chartsheet.rb +173 -0
  52. data/lib/write_xlsx/colors.rb +65 -0
  53. data/lib/write_xlsx/compatibility.rb +71 -0
  54. data/lib/write_xlsx/drawing.rb +547 -0
  55. data/lib/write_xlsx/format.rb +683 -0
  56. data/lib/write_xlsx/package/app.rb +218 -0
  57. data/lib/write_xlsx/package/comments.rb +221 -0
  58. data/lib/write_xlsx/package/content_types.rb +189 -0
  59. data/lib/write_xlsx/package/core.rb +196 -0
  60. data/lib/write_xlsx/package/packager.rb +510 -0
  61. data/lib/write_xlsx/package/relationships.rb +98 -0
  62. data/lib/write_xlsx/package/shared_strings.rb +96 -0
  63. data/lib/write_xlsx/package/styles.rb +705 -0
  64. data/lib/write_xlsx/package/theme.rb +45 -0
  65. data/lib/write_xlsx/package/vml.rb +386 -0
  66. data/lib/write_xlsx/package/xml_writer_simple.rb +90 -0
  67. data/lib/write_xlsx/utility.rb +113 -0
  68. data/lib/write_xlsx/workbook.rb +1488 -0
  69. data/lib/write_xlsx/worksheet.rb +6578 -0
  70. data/lib/write_xlsx/zip_file_utils.rb +98 -0
  71. data/test/chart/test_add_series.rb +113 -0
  72. data/test/chart/test_process_names.rb +27 -0
  73. data/test/chart/test_write_auto.rb +15 -0
  74. data/test/chart/test_write_ax_id.rb +15 -0
  75. data/test/chart/test_write_ax_pos.rb +15 -0
  76. data/test/chart/test_write_chart_space.rb +15 -0
  77. data/test/chart/test_write_cross_ax.rb +15 -0
  78. data/test/chart/test_write_crosses.rb +15 -0
  79. data/test/chart/test_write_format_code.rb +15 -0
  80. data/test/chart/test_write_idx.rb +15 -0
  81. data/test/chart/test_write_label_align.rb +15 -0
  82. data/test/chart/test_write_label_offset.rb +15 -0
  83. data/test/chart/test_write_lang.rb +15 -0
  84. data/test/chart/test_write_layout.rb +15 -0
  85. data/test/chart/test_write_legend.rb +16 -0
  86. data/test/chart/test_write_legend_pos.rb +15 -0
  87. data/test/chart/test_write_major_gridlines.rb +15 -0
  88. data/test/chart/test_write_marker.rb +17 -0
  89. data/test/chart/test_write_marker_size.rb +15 -0
  90. data/test/chart/test_write_marker_value.rb +16 -0
  91. data/test/chart/test_write_num_cache.rb +16 -0
  92. data/test/chart/test_write_num_fmt.rb +16 -0
  93. data/test/chart/test_write_number_format.rb +15 -0
  94. data/test/chart/test_write_order.rb +15 -0
  95. data/test/chart/test_write_orientation.rb +15 -0
  96. data/test/chart/test_write_page_margins.rb +15 -0
  97. data/test/chart/test_write_page_setup.rb +15 -0
  98. data/test/chart/test_write_plot_vis_only.rb +15 -0
  99. data/test/chart/test_write_pt.rb +16 -0
  100. data/test/chart/test_write_pt_count.rb +16 -0
  101. data/test/chart/test_write_series_formula.rb +16 -0
  102. data/test/chart/test_write_style.rb +41 -0
  103. data/test/chart/test_write_symbol.rb +16 -0
  104. data/test/chart/test_write_tick_lbl_pos.rb +16 -0
  105. data/test/chart/test_write_v.rb +16 -0
  106. data/test/drawing/test_drawing_chart_01.rb +50 -0
  107. data/test/drawing/test_drawing_image_01.rb +59 -0
  108. data/test/helper.rb +90 -0
  109. data/test/package/app/test_app01.rb +44 -0
  110. data/test/package/app/test_app02.rb +46 -0
  111. data/test/package/app/test_app03.rb +53 -0
  112. data/test/package/comments/test_comments01.rb +36 -0
  113. data/test/package/comments/test_write_text_t.rb +44 -0
  114. data/test/package/content_types/test_content_types.rb +35 -0
  115. data/test/package/content_types/test_write_default.rb +13 -0
  116. data/test/package/content_types/test_write_override.rb +13 -0
  117. data/test/package/core/test_core01.rb +28 -0
  118. data/test/package/core/test_core02.rb +42 -0
  119. data/test/package/relationships/test_relationships.rb +28 -0
  120. data/test/package/relationships/test_sheet_rels.rb +22 -0
  121. data/test/package/shared_strings/test_shared_strings01.rb +30 -0
  122. data/test/package/shared_strings/test_shared_strings02.rb +30 -0
  123. data/test/package/shared_strings/test_write_si.rb +13 -0
  124. data/test/package/shared_strings/test_write_sst.rb +15 -0
  125. data/test/package/styles/test_styles_01.rb +69 -0
  126. data/test/package/styles/test_styles_02.rb +104 -0
  127. data/test/package/styles/test_styles_03.rb +90 -0
  128. data/test/package/styles/test_styles_04.rb +216 -0
  129. data/test/package/styles/test_styles_05.rb +150 -0
  130. data/test/package/styles/test_styles_06.rb +104 -0
  131. data/test/package/styles/test_styles_07.rb +104 -0
  132. data/test/package/styles/test_styles_08.rb +109 -0
  133. data/test/package/styles/test_styles_09.rb +95 -0
  134. data/test/package/vml/test_vml_01.rb +42 -0
  135. data/test/package/vml/test_write_anchor.rb +14 -0
  136. data/test/package/vml/test_write_auto_fill.rb +14 -0
  137. data/test/package/vml/test_write_column.rb +14 -0
  138. data/test/package/vml/test_write_div.rb +14 -0
  139. data/test/package/vml/test_write_fill.rb +14 -0
  140. data/test/package/vml/test_write_idmap.rb +14 -0
  141. data/test/package/vml/test_write_move_with_cells.rb +14 -0
  142. data/test/package/vml/test_write_path.rb +22 -0
  143. data/test/package/vml/test_write_row.rb +14 -0
  144. data/test/package/vml/test_write_shadow.rb +14 -0
  145. data/test/package/vml/test_write_shapelayout.rb +14 -0
  146. data/test/package/vml/test_write_shapetype.rb +14 -0
  147. data/test/package/vml/test_write_size_with_cells.rb +14 -0
  148. data/test/package/vml/test_write_stroke.rb +14 -0
  149. data/test/package/vml/test_write_textbox.rb +14 -0
  150. data/test/perl_output/a_simple.xlsx +0 -0
  151. data/test/perl_output/array_formula.xlsx +0 -0
  152. data/test/perl_output/autofilter.xlsx +0 -0
  153. data/test/perl_output/chart_area.xlsx +0 -0
  154. data/test/perl_output/chart_bar.xlsx +0 -0
  155. data/test/perl_output/chart_column.xlsx +0 -0
  156. data/test/perl_output/chart_line.xlsx +0 -0
  157. data/test/perl_output/chart_pie.xlsx +0 -0
  158. data/test/perl_output/chart_scatter.xlsx +0 -0
  159. data/test/perl_output/chart_stock.xlsx +0 -0
  160. data/test/perl_output/comments1.xlsx +0 -0
  161. data/test/perl_output/comments2.xlsx +0 -0
  162. data/test/perl_output/conditional_format.xlsx +0 -0
  163. data/test/perl_output/data_validate.xlsx +0 -0
  164. data/test/perl_output/defined_name.xlsx +0 -0
  165. data/test/perl_output/demo.xlsx +0 -0
  166. data/test/perl_output/diag_border.xlsx +0 -0
  167. data/test/perl_output/fit_to_pages.xlsx +0 -0
  168. data/test/perl_output/headers.xlsx +0 -0
  169. data/test/perl_output/hide_sheet.xlsx +0 -0
  170. data/test/perl_output/hyperlink.xlsx +0 -0
  171. data/test/perl_output/indent.xlsx +0 -0
  172. data/test/perl_output/merge1.xlsx +0 -0
  173. data/test/perl_output/merge2.xlsx +0 -0
  174. data/test/perl_output/merge3.xlsx +0 -0
  175. data/test/perl_output/merge4.xlsx +0 -0
  176. data/test/perl_output/merge5.xlsx +0 -0
  177. data/test/perl_output/merge6.xlsx +0 -0
  178. data/test/perl_output/outline.xlsx +0 -0
  179. data/test/perl_output/print_scale.xlsx +0 -0
  180. data/test/perl_output/properties.xlsx +0 -0
  181. data/test/perl_output/protection.xlsx +0 -0
  182. data/test/perl_output/rich_strings.xlsx +0 -0
  183. data/test/perl_output/right_to_left.xlsx +0 -0
  184. data/test/perl_output/tab_colors.xlsx +0 -0
  185. data/test/test_delete_files.rb +37 -0
  186. data/test/test_example_match.rb +2281 -0
  187. data/test/test_xml_writer_simple.rb +63 -0
  188. data/test/workbook/test_get_chart_range.rb +59 -0
  189. data/test/workbook/test_sort_defined_names.rb +77 -0
  190. data/test/workbook/test_workbook_01.rb +29 -0
  191. data/test/workbook/test_workbook_02.rb +31 -0
  192. data/test/workbook/test_workbook_03.rb +31 -0
  193. data/test/workbook/test_workbook_new.rb +18 -0
  194. data/test/workbook/test_write_defined_name.rb +17 -0
  195. data/test/workbook/test_write_defined_names.rb +41 -0
  196. data/test/worksheet/test_calculate_spans.rb +58 -0
  197. data/test/worksheet/test_convert_date_time_01.rb +439 -0
  198. data/test/worksheet/test_convert_date_time_02.rb +478 -0
  199. data/test/worksheet/test_convert_date_time_03.rb +435 -0
  200. data/test/worksheet/test_extract_filter_tokens.rb +109 -0
  201. data/test/worksheet/test_parse_filter_expression.rb +143 -0
  202. data/test/worksheet/test_position_object.rb +50 -0
  203. data/test/worksheet/test_repeat_formula.rb +55 -0
  204. data/test/worksheet/test_worksheet_01.rb +32 -0
  205. data/test/worksheet/test_worksheet_02.rb +38 -0
  206. data/test/worksheet/test_worksheet_03.rb +44 -0
  207. data/test/worksheet/test_worksheet_04.rb +45 -0
  208. data/test/worksheet/test_write_array_formula_01.rb +99 -0
  209. data/test/worksheet/test_write_autofilter.rb +260 -0
  210. data/test/worksheet/test_write_brk.rb +18 -0
  211. data/test/worksheet/test_write_cell.rb +49 -0
  212. data/test/worksheet/test_write_cell_value.rb +33 -0
  213. data/test/worksheet/test_write_col_breaks.rb +27 -0
  214. data/test/worksheet/test_write_col_info.rb +95 -0
  215. data/test/worksheet/test_write_conditional_formatting.rb +72 -0
  216. data/test/worksheet/test_write_custom_filter.rb +18 -0
  217. data/test/worksheet/test_write_custom_filters.rb +25 -0
  218. data/test/worksheet/test_write_data_validation_01.rb +113 -0
  219. data/test/worksheet/test_write_data_validation_02.rb +528 -0
  220. data/test/worksheet/test_write_dimension.rb +94 -0
  221. data/test/worksheet/test_write_ext.rb +18 -0
  222. data/test/worksheet/test_write_ext_lst.rb +18 -0
  223. data/test/worksheet/test_write_filter.rb +18 -0
  224. data/test/worksheet/test_write_filter_column.rb +18 -0
  225. data/test/worksheet/test_write_filters.rb +32 -0
  226. data/test/worksheet/test_write_header_footer.rb +53 -0
  227. data/test/worksheet/test_write_hyperlink.rb +39 -0
  228. data/test/worksheet/test_write_hyperlinks.rb +27 -0
  229. data/test/worksheet/test_write_legacy_drawing.rb +19 -0
  230. data/test/worksheet/test_write_merge_cell.rb +18 -0
  231. data/test/worksheet/test_write_merge_cells.rb +192 -0
  232. data/test/worksheet/test_write_methods.rb +353 -0
  233. data/test/worksheet/test_write_mx_plv.rb +19 -0
  234. data/test/worksheet/test_write_page_margins.rb +98 -0
  235. data/test/worksheet/test_write_page_set_up_pr.rb +19 -0
  236. data/test/worksheet/test_write_page_setup.rb +54 -0
  237. data/test/worksheet/test_write_pane.rb +123 -0
  238. data/test/worksheet/test_write_phonetic_pr.rb +19 -0
  239. data/test/worksheet/test_write_print_options.rb +77 -0
  240. data/test/worksheet/test_write_row_breaks.rb +27 -0
  241. data/test/worksheet/test_write_row_element.rb +69 -0
  242. data/test/worksheet/test_write_selection.rb +18 -0
  243. data/test/worksheet/test_write_sheet_calc_pr.rb +18 -0
  244. data/test/worksheet/test_write_sheet_data.rb +18 -0
  245. data/test/worksheet/test_write_sheet_format_pr.rb +18 -0
  246. data/test/worksheet/test_write_sheet_pr.rb +36 -0
  247. data/test/worksheet/test_write_sheet_protection.rb +174 -0
  248. data/test/worksheet/test_write_sheet_view.rb +62 -0
  249. data/test/worksheet/test_write_sheet_view1.rb +64 -0
  250. data/test/worksheet/test_write_sheet_view2.rb +56 -0
  251. data/test/worksheet/test_write_sheet_view3.rb +83 -0
  252. data/test/worksheet/test_write_sheet_view4.rb +83 -0
  253. data/test/worksheet/test_write_sheet_view5.rb +74 -0
  254. data/test/worksheet/test_write_sheet_view6.rb +51 -0
  255. data/test/worksheet/test_write_sheet_view7.rb +71 -0
  256. data/test/worksheet/test_write_sheet_view8.rb +51 -0
  257. data/test/worksheet/test_write_sheet_view9.rb +51 -0
  258. data/test/worksheet/test_write_tab_color.rb +23 -0
  259. data/test/worksheet/test_write_worksheet.rb +19 -0
  260. data/write_xlsx.gemspec +308 -0
  261. metadata +363 -0
@@ -0,0 +1,218 @@
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 App
8
+
9
+ include Writexlsx::Utility
10
+
11
+ def initialize
12
+ @writer = Package::XMLWriterSimple.new
13
+ @part_names = []
14
+ @heading_pairs = []
15
+ @properties = {}
16
+ end
17
+
18
+ def set_xml_writer(filename)
19
+ @writer.set_xml_writer(filename)
20
+ end
21
+
22
+ def assemble_xml_file
23
+ write_xml_declaration
24
+ write_properties
25
+ write_application
26
+ write_doc_security
27
+ write_scale_crop
28
+ write_heading_pairs
29
+ write_titles_of_parts
30
+ write_manager
31
+ write_company
32
+ write_links_up_to_date
33
+ write_shared_doc
34
+ write_hyperlinks_changed
35
+ write_app_version
36
+
37
+ @writer.end_tag('Properties')
38
+ @writer.crlf
39
+ @writer.close
40
+ end
41
+
42
+ def add_part_name(part_name)
43
+ @part_names.push(part_name)
44
+ end
45
+
46
+ def add_heading_pair(heading_pair)
47
+ return if heading_pair[1] == 0
48
+
49
+ @heading_pairs.push(['lpstr', heading_pair[0]], ['i4', heading_pair[1]])
50
+ end
51
+
52
+ #
53
+ # Set the document properties.
54
+ #
55
+ def set_properties(properties)
56
+ @properties = properties
57
+ end
58
+
59
+ private
60
+
61
+ def write_xml_declaration
62
+ @writer.xml_decl
63
+ end
64
+
65
+ #
66
+ # Write the <Properties> element.
67
+ #
68
+ def write_properties
69
+ schema = 'http://schemas.openxmlformats.org/officeDocument/2006/'
70
+ xmlns = "#{schema}extended-properties"
71
+ xmlns_vt = "#{schema}docPropsVTypes"
72
+
73
+ attributes = [
74
+ 'xmlns', xmlns,
75
+ 'xmlns:vt', xmlns_vt
76
+ ]
77
+
78
+ @writer.start_tag('Properties', attributes)
79
+ end
80
+
81
+ #
82
+ # Write the <Application> element.
83
+ #
84
+ def write_application
85
+ data = 'Microsoft Excel'
86
+
87
+ @writer.data_element('Application', data)
88
+ end
89
+
90
+ #
91
+ # Write the <DocSecurity> element.
92
+ #
93
+ def write_doc_security
94
+ data = 0
95
+
96
+ @writer.data_element('DocSecurity', data)
97
+ end
98
+
99
+ #
100
+ # Write the <ScaleCrop> element.
101
+ #
102
+ def write_scale_crop
103
+ data = 'false'
104
+
105
+ @writer.data_element('ScaleCrop', data)
106
+ end
107
+
108
+ #
109
+ # Write the <HeadingPairs> element.
110
+ #
111
+ def write_heading_pairs
112
+ @writer.start_tag('HeadingPairs')
113
+
114
+ write_vt_vector('variant', @heading_pairs)
115
+
116
+ @writer.end_tag('HeadingPairs')
117
+ end
118
+
119
+ #
120
+ # Write the <TitlesOfParts> element.
121
+ #
122
+ def write_titles_of_parts
123
+ @writer.start_tag('TitlesOfParts')
124
+ parts_data = []
125
+ @part_names.each { |part_name| parts_data.push(['lpstr', part_name]) }
126
+
127
+ write_vt_vector('lpstr', parts_data)
128
+
129
+ @writer.end_tag('TitlesOfParts')
130
+ end
131
+
132
+ #
133
+ # Write the <vt:vector> element.
134
+ #
135
+ def write_vt_vector(base_type, data)
136
+ size = data.size
137
+
138
+ attributes = [
139
+ 'size', size,
140
+ 'baseType', base_type
141
+ ]
142
+
143
+ @writer.start_tag('vt:vector', attributes)
144
+
145
+ data.each do |a|
146
+ @writer.start_tag('vt:variant') if base_type == 'variant'
147
+ write_vt_data(*a)
148
+ @writer.end_tag('vt:variant') if base_type == 'variant'
149
+ end
150
+
151
+ @writer.end_tag('vt:vector')
152
+ end
153
+
154
+ #
155
+ # Write the <vt:*> elements such as <vt:lpstr> and <vt:if>.
156
+ #
157
+ def write_vt_data(type, data)
158
+ @writer.data_element("vt:#{type}", data)
159
+ end
160
+
161
+ #
162
+ # Write the <Company> element.
163
+ #
164
+ def write_company
165
+ data = @properties[:company] || ''
166
+
167
+ @writer.data_element('Company', data)
168
+ end
169
+
170
+ #
171
+ # Write the <Manager> element.
172
+ #
173
+ def write_manager
174
+ data = @properties[:manager]
175
+
176
+ return unless data
177
+
178
+ @writer.data_element('Manager', data)
179
+ end
180
+
181
+ #
182
+ # Write the <LinksUpToDate> element.
183
+ #
184
+ def write_links_up_to_date
185
+ data = 'false'
186
+
187
+ @writer.data_element('LinksUpToDate', data)
188
+ end
189
+
190
+ #
191
+ # Write the <SharedDoc> element.
192
+ #
193
+ def write_shared_doc
194
+ data = 'false'
195
+
196
+ @writer.data_element('SharedDoc', data)
197
+ end
198
+
199
+ #
200
+ # Write the <HyperlinksChanged> element.
201
+ #
202
+ def write_hyperlinks_changed
203
+ data = 'false'
204
+
205
+ @writer.data_element('HyperlinksChanged', data)
206
+ end
207
+
208
+ #
209
+ # Write the <AppVersion> element.
210
+ #
211
+ def write_app_version
212
+ data = '12.0000'
213
+
214
+ @writer.data_element('AppVersion', data)
215
+ end
216
+ end
217
+ end
218
+ end
@@ -0,0 +1,221 @@
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 Comments
8
+
9
+ include Writexlsx::Utility
10
+
11
+ def initialize
12
+ @writer = Package::XMLWriterSimple.new
13
+ @author_ids = {}
14
+ end
15
+
16
+ def set_xml_writer(filename)
17
+ @writer.set_xml_writer(filename)
18
+ end
19
+
20
+ def assemble_xml_file(comments_data)
21
+ write_xml_declaration
22
+ write_comments
23
+ write_authors(comments_data)
24
+ write_comment_list(comments_data)
25
+
26
+ @writer.end_tag('comments')
27
+ @writer.crlf
28
+ @writer.close
29
+ end
30
+
31
+ private
32
+
33
+ def write_xml_declaration
34
+ @writer.xml_decl
35
+ end
36
+
37
+ #
38
+ # Write the <comments> element.
39
+ #
40
+ def write_comments
41
+ xmlns = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'
42
+
43
+ attributes = [ 'xmlns', xmlns]
44
+
45
+ @writer.start_tag('comments', attributes)
46
+ end
47
+
48
+ #
49
+ # Write the <authors> element.
50
+ #
51
+ def write_authors(comment_data)
52
+ author_count = 0
53
+
54
+ @writer.start_tag('authors')
55
+ comment_data.each do |comment|
56
+ author = comment[3] || ''
57
+
58
+ if author && !@author_ids[author]
59
+ # Store the author id.
60
+ @author_ids[author] = author_count
61
+ author_count += 1
62
+
63
+ # Write the author element.
64
+ write_author(author)
65
+ end
66
+ end
67
+
68
+ @writer.end_tag('authors')
69
+ end
70
+
71
+ #
72
+ # Write the <author> element.
73
+ #
74
+ def write_author(data)
75
+ @writer.data_element('author', data)
76
+ end
77
+
78
+ #
79
+ # Write the <commentList> element.
80
+ #
81
+ def write_comment_list(comment_data)
82
+ @writer.start_tag('commentList')
83
+
84
+ comment_data.each do |comment|
85
+ row = comment[0]
86
+ col = comment[1]
87
+ text = comment[2]
88
+ author = comment[3]
89
+
90
+ # Look up the author id.
91
+ author_id = nil
92
+ author_id = @author_ids[author] if author
93
+
94
+ # Write the comment element.
95
+ write_comment(row, col, text, author_id)
96
+ end
97
+
98
+ @writer.end_tag( 'commentList' )
99
+ end
100
+
101
+ #
102
+ # Write the <comment> element.
103
+ #
104
+ def write_comment(row, col, text, author_id)
105
+ ref = xl_rowcol_to_cell( row, col )
106
+ author_id ||= 0
107
+
108
+ attributes = ['ref', ref]
109
+
110
+ (attributes << 'authorId' << author_id ) if author_id
111
+
112
+ @writer.start_tag('comment', attributes)
113
+ write_text(text)
114
+ @writer.end_tag('comment')
115
+ end
116
+
117
+ #
118
+ # Write the <text> element.
119
+ #
120
+ def write_text(text)
121
+ @writer.start_tag('text')
122
+
123
+ # Write the text r element.
124
+ write_text_r(text)
125
+
126
+ @writer.end_tag('text')
127
+ end
128
+
129
+ #
130
+ # Write the <r> element.
131
+ #
132
+ def write_text_r(text)
133
+ @writer.start_tag('r')
134
+
135
+ # Write the rPr element.
136
+ write_r_pr
137
+
138
+ # Write the text r element.
139
+ write_text_t(text)
140
+
141
+ @writer.end_tag('r')
142
+ end
143
+
144
+ #
145
+ # Write the text <t> element.
146
+ #
147
+ def write_text_t(text)
148
+ attributes = []
149
+
150
+ (attributes << 'xml:space' << 'preserve') if text =~ /^\s/ || text =~ /\s$/
151
+
152
+ @writer.data_element('t', text, attributes)
153
+ end
154
+
155
+ #
156
+ # Write the <rPr> element.
157
+ #
158
+ def write_r_pr
159
+ @writer.start_tag('rPr')
160
+
161
+ # Write the sz element.
162
+ write_sz
163
+
164
+ # Write the color element.
165
+ write_color
166
+
167
+ # Write the rFont element.
168
+ write_r_font
169
+
170
+ # Write the family element.
171
+ write_family
172
+
173
+ @writer.end_tag('rPr')
174
+ end
175
+
176
+ #
177
+ # Write the <sz> element.
178
+ #
179
+ def write_sz
180
+ val = 8
181
+
182
+ attributes = ['val', val]
183
+
184
+ @writer.empty_tag('sz', attributes)
185
+ end
186
+
187
+ #
188
+ # Write the <color> element.
189
+ #
190
+ def write_color
191
+ indexed = 81
192
+
193
+ attributes = ['indexed', indexed]
194
+
195
+ @writer.empty_tag('color', attributes)
196
+ end
197
+
198
+ #
199
+ # Write the <rFont> element.
200
+ #
201
+ def write_r_font
202
+ val = 'Tahoma'
203
+
204
+ attributes = ['val', val]
205
+
206
+ @writer.empty_tag('rFont', attributes)
207
+ end
208
+
209
+ #
210
+ # Write the <family> element.
211
+ #
212
+ def write_family
213
+ val = 2
214
+
215
+ attributes = ['val', val]
216
+
217
+ @writer.empty_tag('family', attributes)
218
+ end
219
+ end
220
+ end
221
+ end
@@ -0,0 +1,189 @@
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 ContentTypes
8
+
9
+ include Writexlsx::Utility
10
+
11
+ App_package = 'application/vnd.openxmlformats-package.'
12
+ App_document = 'application/vnd.openxmlformats-officedocument.'
13
+
14
+ def initialize
15
+ @writer = Package::XMLWriterSimple.new
16
+ @defaults = [
17
+ [ 'rels', "#{App_package}relationships+xml" ],
18
+ [ 'xml', 'application/xml' ]
19
+ ]
20
+ @overrides = [
21
+ [ '/docProps/app.xml', "#{App_document}extended-properties+xml" ],
22
+ [ '/docProps/core.xml', "#{App_package}core-properties+xml" ],
23
+ [ '/xl/styles.xml', "#{App_document}spreadsheetml.styles+xml" ],
24
+ [ '/xl/theme/theme1.xml', "#{App_document}theme+xml" ],
25
+ [ '/xl/workbook.xml', "#{App_document}spreadsheetml.sheet.main+xml" ]
26
+ ]
27
+ end
28
+
29
+ def set_xml_writer(filename)
30
+ @writer.set_xml_writer(filename)
31
+ end
32
+
33
+ def assemble_xml_file
34
+ write_xml_declaration
35
+ write_types
36
+ write_defaults
37
+ write_overrides
38
+
39
+ @writer.end_tag('Types')
40
+ @writer.crlf
41
+ @writer.close
42
+ end
43
+ #
44
+ # Add elements to the ContentTypes defaults.
45
+ #
46
+ def add_default(part_name, content_type)
47
+ @defaults.push([part_name, content_type])
48
+ end
49
+
50
+ #
51
+ # Add elements to the ContentTypes overrides.
52
+ #
53
+ def add_override(part_name, content_type)
54
+ @overrides.push([part_name, content_type])
55
+ end
56
+
57
+ #
58
+ # Add the name of a worksheet to the ContentTypes overrides.
59
+ #
60
+ def add_worksheet_name(name)
61
+ worksheet_name = "/xl/worksheets/#{name}.xml"
62
+
63
+ add_override(worksheet_name, "#{App_document}spreadsheetml.worksheet+xml")
64
+ end
65
+
66
+ #
67
+ # Add the name of a chartsheet to the ContentTypes overrides.
68
+ #
69
+ def add_chartsheet_name(name)
70
+ chartsheet_name = "/xl/chartsheets/#{name}.xml"
71
+
72
+ add_override(chartsheet_name, "#{App_document}spreadsheetml.chartsheet+xml")
73
+ end
74
+
75
+ #
76
+ # Add the name of a chart to the ContentTypes overrides.
77
+ #
78
+ def add_chart_name(name)
79
+ chart_name = "/xl/charts/#{name}.xml"
80
+
81
+ add_override(chart_name, "#{App_document}drawingml.chart+xml")
82
+ end
83
+
84
+ #
85
+ # Add the name of a drawing to the ContentTypes overrides.
86
+ #
87
+ def add_drawing_name(name)
88
+ drawing_name = "/xl/drawings/#{name}.xml"
89
+
90
+ add_override( drawing_name, "#{App_document}drawing+xml")
91
+ end
92
+
93
+ #
94
+ # Add the name of a VML drawing to the ContentTypes defaults.
95
+ #
96
+ def add_vml_name
97
+ add_default('vml', "#{App_document}vmlDrawing")
98
+ end
99
+
100
+ #
101
+ # Add the name of a comment to the ContentTypes overrides.
102
+ #
103
+ def add_comment_name(name)
104
+ comment_name = "/xl/#{name}.xml"
105
+
106
+ add_override( comment_name, "#{App_document}spreadsheetml.comments+xml")
107
+ end
108
+
109
+ #
110
+ # Add the sharedStrings link to the ContentTypes overrides.
111
+ #
112
+ def add_shared_strings
113
+ add_override('/xl/sharedStrings.xml', "#{App_document}spreadsheetml.sharedStrings+xml")
114
+ end
115
+
116
+ #
117
+ # Add the calcChain link to the ContentTypes overrides.
118
+ #
119
+ def add_calc_chain
120
+ add_override('/xl/calcChain.xml', "#{App_document}spreadsheetml.calcChain+xml")
121
+ end
122
+
123
+ #
124
+ # Add the image default types.
125
+ #
126
+ def add_image_types(types)
127
+ types.each_key { |type| add_default(type, "image/#{type}") }
128
+ end
129
+
130
+ private
131
+
132
+ def write_xml_declaration
133
+ @writer.xml_decl
134
+ end
135
+
136
+ #
137
+ # Write out all of the <Default> types.
138
+ #
139
+ def write_defaults
140
+ @defaults.each do |a|
141
+ @writer.empty_tag('Default', ['Extension', a[0], 'ContentType', a[1]])
142
+ end
143
+ end
144
+
145
+ #
146
+ # Write out all of the <Override> types.
147
+ #
148
+ def write_overrides
149
+ @overrides.each do |a|
150
+ @writer.empty_tag('Override', ['PartName', a[0], 'ContentType', a[1]])
151
+ end
152
+ end
153
+
154
+ #
155
+ # Write the <Types> element.
156
+ #
157
+ def write_types
158
+ xmlns = 'http://schemas.openxmlformats.org/package/2006/content-types'
159
+ attributes = ['xmlns', xmlns]
160
+
161
+ @writer.start_tag('Types', attributes)
162
+ end
163
+
164
+ #
165
+ # Write the <Default> element.
166
+ #
167
+ def write_default(extension, content_type)
168
+ attributes = [
169
+ 'Extension', extension,
170
+ 'ContentType', content_type
171
+ ]
172
+
173
+ @writer.empty_tag('Default', attributes)
174
+ end
175
+
176
+ #
177
+ # Write the <Override> element.
178
+ #
179
+ def write_override(part_name, content_type)
180
+ attributes = [
181
+ 'PartName', part_name,
182
+ 'ContentType', content_type
183
+ ]
184
+
185
+ @writer.empty_tag('Override', attributes)
186
+ end
187
+ end
188
+ end
189
+ end