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,196 @@
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 Core
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
+ @properties = {}
17
+ @localtime = [Time.now]
18
+ end
19
+
20
+ def set_xml_writer(filename)
21
+ @writer.set_xml_writer(filename)
22
+ end
23
+
24
+ def assemble_xml_file
25
+ write_xml_declaration
26
+ write_cp_core_properties
27
+ write_dc_title
28
+ write_dc_subject
29
+ write_dc_creator
30
+ write_cp_keywords
31
+ write_dc_description
32
+ write_cp_last_modified_by
33
+ write_dcterms_created
34
+ write_dcterms_modified
35
+ write_cp_category
36
+ write_cp_content_status
37
+
38
+ @writer.end_tag('cp:coreProperties')
39
+ @writer.crlf
40
+ @writer.close
41
+ end
42
+
43
+ def set_properties(properties)
44
+ @properties = properties
45
+ end
46
+
47
+ private
48
+
49
+ #
50
+ # Convert a localtime() date to a ISO 8601 style "2010-01-01T00:00:00Z" date.
51
+ #
52
+ def localtime_to_iso8601_date(local_time = nil)
53
+ local_time ||= Time.now
54
+
55
+ date = local_time.strftime('%Y-%m-%dT%H:%M:%SZ')
56
+ end
57
+
58
+ def write_xml_declaration
59
+ @writer.xml_decl
60
+ end
61
+
62
+ #
63
+ # Write the <cp:coreProperties> element.
64
+ #
65
+ def write_cp_core_properties
66
+ xmlns_cp = 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties'
67
+ xmlns_dc = 'http://purl.org/dc/elements/1.1/'
68
+ xmlns_dcterms = 'http://purl.org/dc/terms/'
69
+ xmlns_dcmitype = 'http://purl.org/dc/dcmitype/'
70
+ xmlns_xsi = 'http://www.w3.org/2001/XMLSchema-instance'
71
+
72
+ attributes = [
73
+ 'xmlns:cp', xmlns_cp,
74
+ 'xmlns:dc', xmlns_dc,
75
+ 'xmlns:dcterms', xmlns_dcterms,
76
+ 'xmlns:dcmitype', xmlns_dcmitype,
77
+ 'xmlns:xsi', xmlns_xsi
78
+ ]
79
+
80
+ @writer.start_tag('cp:coreProperties', attributes)
81
+ end
82
+
83
+ #
84
+ # Write the <dc:creator> element.
85
+ #
86
+ def write_dc_creator
87
+ data = @properties[:author] || ''
88
+
89
+ @writer.data_element('dc:creator', data)
90
+ end
91
+
92
+ #
93
+ # Write the <cp:lastModifiedBy> element.
94
+ #
95
+ def write_cp_last_modified_by
96
+ data = @properties[:author] || ''
97
+
98
+ @writer.data_element('cp:lastModifiedBy', data)
99
+ end
100
+
101
+ #
102
+ # Write the <dcterms:created> element.
103
+ #
104
+ def write_dcterms_created
105
+ date = @properties[:created]
106
+ xsi_type = 'dcterms:W3CDTF'
107
+
108
+ date = localtime_to_iso8601_date(date)
109
+
110
+ attributes = ['xsi:type', xsi_type]
111
+
112
+ @writer.data_element('dcterms:created', date, attributes)
113
+ end
114
+
115
+ #
116
+ # Write the <dcterms:modified> element.
117
+ #
118
+ def write_dcterms_modified
119
+ date = @properties[:created]
120
+ xsi_type = 'dcterms:W3CDTF'
121
+
122
+ date = localtime_to_iso8601_date(date)
123
+
124
+ attributes = ['xsi:type', xsi_type]
125
+
126
+ @writer.data_element('dcterms:modified', date, attributes)
127
+ end
128
+
129
+ #
130
+ # Write the <dc:title> element.
131
+ #
132
+ def write_dc_title
133
+ data = @properties[:title]
134
+
135
+ return unless data
136
+
137
+ @writer.data_element('dc:title', data)
138
+ end
139
+
140
+ #
141
+ # Write the <dc:subject> element.
142
+ #
143
+ def write_dc_subject
144
+ data = @properties[:subject]
145
+
146
+ return unless data
147
+
148
+ @writer.data_element('dc:subject', data)
149
+ end
150
+
151
+ #
152
+ # Write the <cp:keywords> element.
153
+ #
154
+ def write_cp_keywords
155
+ data = @properties[:keywords]
156
+
157
+ return unless data
158
+
159
+ @writer.data_element('cp:keywords', data)
160
+ end
161
+
162
+ #
163
+ # Write the <dc:description> element.
164
+ #
165
+ def write_dc_description
166
+ data = @properties[:comments]
167
+
168
+ return unless data
169
+
170
+ @writer.data_element('dc:description', data)
171
+ end
172
+
173
+ #
174
+ # Write the <cp:category> element.
175
+ #
176
+ def write_cp_category
177
+ data = @properties[:category]
178
+
179
+ return unless data
180
+
181
+ @writer.data_element('cp:category', data)
182
+ end
183
+
184
+ #
185
+ # Write the <cp:contentStatus> element.
186
+ #
187
+ def write_cp_content_status
188
+ data = @properties[:status]
189
+
190
+ return unless data
191
+
192
+ @writer.data_element('cp:contentStatus', data)
193
+ end
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,510 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'write_xlsx/package/xml_writer_simple'
3
+ require 'write_xlsx/utility'
4
+ require 'write_xlsx/package/app'
5
+ require 'write_xlsx/package/comments'
6
+ require 'write_xlsx/package/content_types'
7
+ require 'write_xlsx/package/core'
8
+ require 'write_xlsx/package/relationships'
9
+ require 'write_xlsx/package/shared_strings'
10
+ require 'write_xlsx/package/styles'
11
+ require 'write_xlsx/package/theme'
12
+ require 'write_xlsx/package/vml'
13
+
14
+ module Writexlsx
15
+ module Package
16
+ class Packager
17
+
18
+ include Writexlsx::Utility
19
+
20
+ def initialize
21
+ @package_dir = ''
22
+ @workbook = nil
23
+ @sheet_names = []
24
+ @worksheet_count = 0
25
+ @chartsheet_count = 0
26
+ @chart_count = 0
27
+ @drawing_count = 0
28
+ @named_ranges = []
29
+ end
30
+
31
+ def set_package_dir(package_dir)
32
+ @package_dir = package_dir
33
+ end
34
+
35
+ #
36
+ # Add the Workbook object to the package.
37
+ #
38
+ def add_workbook(workbook)
39
+ @workbook = workbook
40
+ @sheet_names = workbook.sheetnames
41
+ @chart_count = workbook.charts.size
42
+ @drawing_count = workbook.drawings.size
43
+ @num_comment_files = workbook.num_comment_files
44
+ @named_ranges = workbook.named_ranges
45
+
46
+ workbook.worksheets.each do |worksheet|
47
+ if worksheet.is_chartsheet?
48
+ @chartsheet_count += 1
49
+ else
50
+ @worksheet_count += 1
51
+ end
52
+ end
53
+ end
54
+
55
+ #
56
+ # Write the xml files that make up the XLXS OPC package.
57
+ #
58
+ def create_package
59
+ write_worksheet_files
60
+ write_chartsheet_files
61
+ write_workbook_file
62
+ write_chart_files
63
+ write_drawing_files
64
+ write_vml_files
65
+ write_comment_files
66
+ write_shared_strings_file
67
+ write_app_file
68
+ write_core_file
69
+ write_content_types_file
70
+ write_styles_file
71
+ write_theme_file
72
+ write_root_rels_file
73
+ write_workbook_rels_file
74
+ write_worksheet_rels_files
75
+ write_chartsheet_rels_files
76
+ write_drawing_rels_files
77
+ add_image_files
78
+ end
79
+
80
+ private
81
+
82
+ #
83
+ # Write the workbook.xml file.
84
+ #
85
+ def write_workbook_file
86
+ FileUtils.mkdir_p("#{@package_dir}/xl")
87
+
88
+ @workbook.set_xml_writer("#{@package_dir}/xl/workbook.xml")
89
+ @workbook.assemble_xml_file
90
+ end
91
+
92
+ #
93
+ # Write the worksheet files.
94
+ #
95
+ def write_worksheet_files
96
+ FileUtils.mkdir_p("#{@package_dir}/xl/worksheets")
97
+
98
+ index = 1
99
+ @workbook.worksheets.each do |worksheet|
100
+ next if worksheet.is_chartsheet?
101
+ worksheet.set_xml_writer("#{@package_dir}/xl/worksheets/sheet#{index}.xml")
102
+ index += 1
103
+ worksheet.assemble_xml_file
104
+ end
105
+ end
106
+
107
+ #
108
+ def write_chartsheet_files
109
+ index = 1
110
+ @workbook.worksheets.each do |worksheet|
111
+ next unless worksheet.is_chartsheet?
112
+ FileUtils.mkdir_p("#{@package_dir}/xl/chartsheets")
113
+ worksheet.set_xml_writer("#{@package_dir}/xl/chartsheets/sheet#{index}.xml")
114
+ index += 1
115
+ worksheet.assemble_xml_file
116
+ end
117
+ end
118
+
119
+ #
120
+ # Write the chart files.
121
+ #
122
+ def write_chart_files
123
+ return if @workbook.charts.empty?
124
+
125
+ FileUtils.mkdir_p("#{@package_dir}/xl/charts")
126
+
127
+ index = 1
128
+ @workbook.charts.each do |chart|
129
+ chart.set_xml_writer("#{@package_dir}/xl/charts/chart#{index}.xml")
130
+ index += 1
131
+ chart.assemble_xml_file
132
+ end
133
+ end
134
+
135
+ #
136
+ # Write the drawing files.
137
+ #
138
+ def write_drawing_files
139
+ return if @workbook.drawings.empty?
140
+
141
+ FileUtils.mkdir_p("#{@package_dir}/xl/drawings")
142
+
143
+ index = 1
144
+ @workbook.drawings.each do |drawing|
145
+ drawing.set_xml_writer("#{@package_dir}/xl/drawings/drawing#{index}.xml")
146
+ index += 1
147
+ drawing.assemble_xml_file
148
+ end
149
+ end
150
+
151
+ #
152
+ # Write the comment VML files.
153
+ #
154
+ def write_vml_files
155
+ index = 1
156
+ @workbook.worksheets.each do |worksheet|
157
+ next unless worksheet.has_comments?
158
+ FileUtils.mkdir_p("#{@package_dir}/xl/drawings")
159
+
160
+ vml = Package::VML.new
161
+ vml.set_xml_writer("#{@package_dir}/xl/drawings/vmlDrawing#{index}.vml")
162
+ index += 1
163
+ vml.assemble_xml_file(
164
+ worksheet.vml_data_id,
165
+ worksheet.vml_shape_id,
166
+ worksheet.comments_array
167
+ )
168
+ end
169
+ end
170
+
171
+ #
172
+ # Write the comment files.
173
+ #
174
+ def write_comment_files
175
+ index = 1
176
+ @workbook.worksheets.each do |worksheet|
177
+ next unless worksheet.has_comments?
178
+
179
+ FileUtils.mkdir_p("#{@package_dir}/xl/drawings")
180
+ comment = Package::Comments.new
181
+
182
+ comment.set_xml_writer("#{@package_dir}/xl/comments#{index}.xml")
183
+ index += 1
184
+
185
+ comment.assemble_xml_file(worksheet.comments_array)
186
+ end
187
+ end
188
+
189
+ #
190
+ # Write the sharedStrings.xml file.
191
+ #
192
+ def write_shared_strings_file
193
+ sst = Package::SharedStrings.new
194
+
195
+ FileUtils.mkdir_p("#{@package_dir}/xl")
196
+
197
+ return unless @workbook.str_total > 0
198
+
199
+ sst.string_count = @workbook.str_total
200
+ sst.unique_count = @workbook.str_unique
201
+ sst.add_strings(@workbook.str_array)
202
+
203
+ sst.set_xml_writer("#{@package_dir}/xl/sharedStrings.xml")
204
+ sst.assemble_xml_file
205
+ end
206
+
207
+ #
208
+ # Write the app.xml file.
209
+ #
210
+ def write_app_file
211
+ dir = @package_dir
212
+ properties = @workbook.doc_properties
213
+ app = Package::App.new
214
+
215
+ FileUtils.mkdir_p("#{@package_dir}/docProps")
216
+
217
+ # Add the Worksheet heading pairs.
218
+ app.add_heading_pair(['Worksheets', @worksheet_count])
219
+
220
+ # Add the Chartsheet heading pairs.
221
+ app.add_heading_pair(['Charts', @chartsheet_count])
222
+
223
+ # Add the Worksheet parts.
224
+ @workbook.worksheets.each do |worksheet|
225
+ next if worksheet.is_chartsheet?
226
+ app.add_part_name(worksheet.name)
227
+ end
228
+
229
+ # Add the Chartsheet parts.
230
+ @workbook.worksheets.each do |worksheet|
231
+ next unless worksheet.is_chartsheet?
232
+ app.add_part_name(worksheet.get_name)
233
+ end
234
+
235
+ # Add the Named Range heading pairs.
236
+ range_count = @named_ranges.size
237
+ if range_count != 0
238
+ app.add_heading_pair([ 'Named Ranges', range_count ])
239
+ end
240
+
241
+ # Add the Named Ranges parts.
242
+ @named_ranges.each { |named_range| app.add_part_name(named_range) }
243
+
244
+ app.set_properties(properties)
245
+
246
+ app.set_xml_writer("#{@package_dir}/docProps/app.xml")
247
+ app.assemble_xml_file
248
+ end
249
+
250
+ #
251
+ # Write the core.xml file.
252
+ #
253
+ def write_core_file
254
+ core = Package::Core.new
255
+
256
+ FileUtils.mkdir_p("#{@package_dir}/docProps")
257
+
258
+ core.set_properties(@workbook.doc_properties)
259
+ core.set_xml_writer("#{@package_dir}/docProps/core.xml")
260
+ core.assemble_xml_file
261
+ end
262
+
263
+ #
264
+ # Write the ContentTypes.xml file.
265
+ #
266
+ def write_content_types_file
267
+ content = Package::ContentTypes.new
268
+
269
+ content.add_image_types(@workbook.image_types)
270
+
271
+ worksheet_index = 1
272
+ chartsheet_index = 1
273
+ @workbook.worksheets.each do |worksheet|
274
+ if worksheet.is_chartsheet?
275
+ content.add_chartsheet_name("sheet#{chartsheet_index}")
276
+ chartsheet_index += 1
277
+ else
278
+ content.add_worksheet_name("sheet#{worksheet_index}")
279
+ worksheet_index += 1
280
+ end
281
+ end
282
+
283
+ (1 .. @chart_count).each { |i| content.add_chart_name("chart#{i}") }
284
+ (1 .. @drawing_count).each { |i| content.add_drawing_name("drawing#{i}") }
285
+
286
+ content.add_vml_name if @num_comment_files > 0
287
+
288
+ (1 .. @num_comment_files).each { |i| content.add_comment_name("comments#{i}") }
289
+
290
+ # Add the sharedString rel if there is string data in the workbook.
291
+ content.add_shared_strings if @workbook.str_total > 0
292
+
293
+ content.set_xml_writer("#{@package_dir}/[Content_Types].xml")
294
+ content.assemble_xml_file
295
+ end
296
+
297
+ #
298
+ # Write the style xml file.
299
+ #
300
+ def write_styles_file
301
+ dir = @package_dir
302
+ xf_formats = @workbook.xf_formats
303
+ palette = @workbook.palette
304
+ font_count = @workbook.font_count
305
+ num_format_count = @workbook.num_format_count
306
+ border_count = @workbook.border_count
307
+ fill_count = @workbook.fill_count
308
+ custom_colors = @workbook.custom_colors
309
+ dxf_formats = @workbook.dxf_formats
310
+
311
+ rels = Package::Styles.new
312
+
313
+ FileUtils.mkdir_p("#{@package_dir}/xl")
314
+
315
+ rels.set_style_properties(
316
+ xf_formats,
317
+ palette,
318
+ font_count,
319
+ num_format_count,
320
+ border_count,
321
+ fill_count,
322
+ custom_colors,
323
+ dxf_formats
324
+ )
325
+
326
+ rels.set_xml_writer("#{@package_dir}/xl/styles.xml" )
327
+ rels.assemble_xml_file
328
+ end
329
+
330
+ #
331
+ # Write the style xml file.
332
+ #
333
+ def write_theme_file
334
+ rels = Package::Theme.new
335
+
336
+ FileUtils.mkdir_p("#{@package_dir}/xl/theme")
337
+
338
+ rels.set_xml_writer("#{@package_dir}/xl/theme/theme1.xml")
339
+ rels.assemble_xml_file
340
+ end
341
+
342
+ #
343
+ # Write the _rels/.rels xml file.
344
+ #
345
+ def write_root_rels_file
346
+ rels = Package::Relationships.new
347
+
348
+ FileUtils.mkdir_p("#{@package_dir}/_rels")
349
+
350
+ rels.add_document_relationship('/officeDocument', 'xl/workbook.xml')
351
+ rels.add_package_relationship('/metadata/core-properties',
352
+ 'docProps/core')
353
+ rels.add_document_relationship('/extended-properties', 'docProps/app.xml')
354
+ rels.set_xml_writer("#{@package_dir}/_rels/.rels" )
355
+ rels.assemble_xml_file
356
+ end
357
+
358
+ #
359
+ # Write the _rels/.rels xml file.
360
+ #
361
+ def write_workbook_rels_file
362
+ rels = Package::Relationships.new
363
+
364
+ FileUtils.mkdir_p("#{@package_dir}/xl/_rels")
365
+
366
+ worksheet_index = 1
367
+ chartsheet_index = 1
368
+
369
+ @workbook.worksheets.each do |worksheet|
370
+ if worksheet.is_chartsheet?
371
+ rels.add_document_relationship('/chartsheet', "chartsheets/sheet#{chartsheet_index}.xml")
372
+ chartsheet_index += 1
373
+ else
374
+ rels.add_document_relationship( '/worksheet', "worksheets/sheet#{worksheet_index}.xml")
375
+ worksheet_index += 1
376
+ end
377
+ end
378
+
379
+ rels.add_document_relationship('/theme', 'theme/theme1.xml')
380
+ rels.add_document_relationship('/styles', 'styles.xml')
381
+
382
+ # Add the sharedString rel if there is string data in the workbook.
383
+ rels.add_document_relationship('/sharedStrings', 'sharedStrings.xml') if @workbook.str_total != 0
384
+ rels.set_xml_writer("#{@package_dir}/xl/_rels/workbook.xml.rels")
385
+ rels.assemble_xml_file
386
+ end
387
+
388
+ #
389
+ # Write the worksheet .rels files for worksheets that contain links to external
390
+ # data such as hyperlinks or drawings.
391
+ #
392
+ def write_worksheet_rels_files
393
+ existing_rels_dir = false
394
+
395
+ index = 0
396
+ @workbook.worksheets.each do |worksheet|
397
+ next if worksheet.is_chartsheet?
398
+
399
+ index += 1
400
+
401
+ external_links = [
402
+ worksheet.external_hyper_links,
403
+ worksheet.external_drawing_links,
404
+ worksheet.external_comment_links
405
+ ].select {|a| a != []}
406
+
407
+ next if external_links.size == 0
408
+
409
+ # Create the worksheet .rels dir if required.
410
+ if !existing_rels_dir
411
+ FileUtils.mkdir_p("#{@package_dir}/xl/worksheets")
412
+ FileUtils.mkdir_p("#{@package_dir}/xl/worksheets/_rels")
413
+ existing_rels_dir = true
414
+ end
415
+
416
+ rels = Package::Relationships.new
417
+
418
+ external_links.each do |link_datas|
419
+ link_datas.each do |link_data|
420
+ type, target, target_mode = link_data
421
+ rels.add_worksheet_relationship(type, target, target_mode)
422
+ end
423
+ end
424
+
425
+ # Create the .rels file such as /xl/worksheets/_rels/sheet1.xml.rels.
426
+ rels.set_xml_writer(
427
+ "#{@package_dir}/xl/worksheets/_rels/sheet#{index}.xml.rels")
428
+ rels.assemble_xml_file
429
+ end
430
+ end
431
+
432
+ #
433
+ # Write the chartsheet .rels files for links to drawing files.
434
+ #
435
+ def write_chartsheet_rels_files
436
+ existing_rels_dir = false
437
+
438
+ @workbook.worksheets.each do |worksheet|
439
+ next unless worksheet.is_chartsheet?
440
+
441
+ external_links = worksheet.external_drawing_links
442
+
443
+ next if external_links.empty?
444
+
445
+ # Create the chartsheet .rels dir if required.
446
+ if existing_rels_dir
447
+ FileUtils.mkdir_p("#{@package_dir}/xl/chartsheets/_rels")
448
+ existing_rels_dir = true
449
+ end
450
+
451
+ rels = Package::Relationships.new
452
+
453
+ external_links.each do |link_data|
454
+ rels.add_worksheet_relationship(link_data)
455
+ end
456
+
457
+ # Create the .rels file such as /xl/chartsheets/_rels/sheet1.xml.rels.
458
+ rels.set_xml_writer(
459
+ "#{@package_dir}/xl/chartsheets/_rels/sheet#{worksheet.index}.xml.rels")
460
+ rels.assemble_xml_file
461
+ end
462
+ end
463
+
464
+ #
465
+ # Write the drawing .rels files for worksheets that contain charts or drawings.
466
+ #
467
+ def write_drawing_rels_files
468
+ index = 0
469
+ @workbook.worksheets.each do |worksheet|
470
+ next if worksheet.drawing_links.empty?
471
+ index += 1
472
+
473
+ # Create the drawing .rels dir if required.
474
+ FileUtils.mkdir_p("#{@package_dir}/xl/drawings/_rels")
475
+
476
+ rels = Package::Relationships.new
477
+
478
+ worksheet.drawing_links.each do |drawing_data|
479
+ rels.add_document_relationship(*drawing_data)
480
+ end
481
+
482
+ # Create the .rels file such as /xl/drawings/_rels/sheet1.xml.rels.
483
+ rels.set_xml_writer(
484
+ "#{@package_dir}/xl/drawings/_rels/drawing#{index}.xml.rels")
485
+ rels.assemble_xml_file
486
+ end
487
+ end
488
+
489
+
490
+ #
491
+ # Write the workbook.xml file.
492
+ #
493
+ def add_image_files
494
+ return if @workbook.images.empty?
495
+
496
+ index = 1
497
+
498
+ FileUtils.mkdir_p("#{@package_dir}/xl/media")
499
+
500
+ @workbook.images.each do |image|
501
+ filename = image[0]
502
+ extension = ".#{image[1]}"
503
+
504
+ copy( filename, "#{@package_dir}/xl/media/image#{index}#{extension}")
505
+ index += 1
506
+ end
507
+ end
508
+ end
509
+ end
510
+ end