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,45 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'write_xlsx/package/xml_writer_simple'
4
+ require 'write_xlsx/utility'
5
+
6
+ module Writexlsx
7
+ module Package
8
+ class Theme
9
+
10
+ include Writexlsx::Utility
11
+
12
+ def initialize
13
+ @writer = nil
14
+ end
15
+
16
+ def assemble_xml_file
17
+ return unless @writer
18
+ write_theme_file
19
+ @writer.write("\n")
20
+ @writer.close
21
+ end
22
+
23
+ #
24
+ # Set the filehandle only. This class doesn't use a real XML writer class.
25
+ #
26
+ def set_xml_writer(filename)
27
+ fh = open(filename, 'wb')
28
+
29
+ @writer = fh
30
+ end
31
+
32
+ private
33
+
34
+ #
35
+ # Write a default theme.xml file.
36
+ #
37
+ def write_theme_file
38
+ theme =
39
+ %Q{<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
40
+ <a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme"><a:themeElements><a:clrScheme name="Office"><a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1><a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1><a:dk2><a:srgbClr val="1F497D"/></a:dk2><a:lt2><a:srgbClr val="EEECE1"/></a:lt2><a:accent1><a:srgbClr val="4F81BD"/></a:accent1><a:accent2><a:srgbClr val="C0504D"/></a:accent2><a:accent3><a:srgbClr val="9BBB59"/></a:accent3><a:accent4><a:srgbClr val="8064A2"/></a:accent4><a:accent5><a:srgbClr val="4BACC6"/></a:accent5><a:accent6><a:srgbClr val="F79646"/></a:accent6><a:hlink><a:srgbClr val="0000FF"/></a:hlink><a:folHlink><a:srgbClr val="800080"/></a:folHlink></a:clrScheme><a:fontScheme name="Office"><a:majorFont><a:latin typeface="Cambria"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Times New Roman"/><a:font script="Hebr" typeface="Times New Roman"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="MoolBoran"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Times New Roman"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:majorFont><a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/><a:font script="Jpan" typeface="MS Pゴシック"/><a:font script="Hang" typeface="맑은 고딕"/><a:font script="Hans" typeface="宋体"/><a:font script="Hant" typeface="新細明體"/><a:font script="Arab" typeface="Arial"/><a:font script="Hebr" typeface="Arial"/><a:font script="Thai" typeface="Tahoma"/><a:font script="Ethi" typeface="Nyala"/><a:font script="Beng" typeface="Vrinda"/><a:font script="Gujr" typeface="Shruti"/><a:font script="Khmr" typeface="DaunPenh"/><a:font script="Knda" typeface="Tunga"/><a:font script="Guru" typeface="Raavi"/><a:font script="Cans" typeface="Euphemia"/><a:font script="Cher" typeface="Plantagenet Cherokee"/><a:font script="Yiii" typeface="Microsoft Yi Baiti"/><a:font script="Tibt" typeface="Microsoft Himalaya"/><a:font script="Thaa" typeface="MV Boli"/><a:font script="Deva" typeface="Mangal"/><a:font script="Telu" typeface="Gautami"/><a:font script="Taml" typeface="Latha"/><a:font script="Syrc" typeface="Estrangelo Edessa"/><a:font script="Orya" typeface="Kalinga"/><a:font script="Mlym" typeface="Kartika"/><a:font script="Laoo" typeface="DokChampa"/><a:font script="Sinh" typeface="Iskoola Pota"/><a:font script="Mong" typeface="Mongolian Baiti"/><a:font script="Viet" typeface="Arial"/><a:font script="Uigh" typeface="Microsoft Uighur"/></a:minorFont></a:fontScheme><a:fmtScheme name="Office"><a:fillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="1"/></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:shade val="51000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="80000"><a:schemeClr val="phClr"><a:shade val="93000"/><a:satMod val="130000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="94000"/><a:satMod val="135000"/></a:schemeClr></a:gs></a:gsLst><a:lin ang="16200000" scaled="0"/></a:gradFill></a:fillStyleLst><a:lnStyleLst><a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln><a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw></a:effectLst><a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d><a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path></a:gradFill><a:gradFill rotWithShape="1"><a:gsLst><a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs></a:gsLst><a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>}
41
+ @writer.write(theme)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,386 @@
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 VML
8
+
9
+ include Writexlsx::Utility
10
+
11
+ def initialize
12
+ @writer = Package::XMLWriterSimple.new
13
+ end
14
+
15
+ def set_xml_writer(filename)
16
+ @writer.set_xml_writer(filename)
17
+ end
18
+
19
+ def assemble_xml_file(data_id, vml_shape_id, comments_data)
20
+ return unless @writer
21
+
22
+ write_xml_namespace
23
+
24
+ # Write the o:shapelayout element.
25
+ write_shapelayout(data_id)
26
+
27
+ # Write the v:shapetype element.
28
+ write_shapetype
29
+
30
+ z_index = 1
31
+ comments_data.each do |comment|
32
+ # Write the v:shape element.
33
+ vml_shape_id += 1
34
+ write_shape(vml_shape_id, z_index, comment)
35
+ z_index += 1
36
+ end
37
+
38
+ @writer.end_tag('xml')
39
+ @writer.crlf
40
+ @writer.close
41
+ end
42
+
43
+ private
44
+
45
+ #
46
+ # Convert comment vertices from pixels to points.
47
+ #
48
+ def pixels_to_points(vertices)
49
+ col_start, row_start, x1, y1,
50
+ col_end, row_end, x2, y2,
51
+ left, top, width, height = vertices.flatten
52
+
53
+ left *= 0.75
54
+ top *= 0.75
55
+ width *= 0.75
56
+ height *= 0.75
57
+
58
+ [left, top, width, height]
59
+ end
60
+
61
+ #
62
+ # Write the <xml> element. This is the root element of VML.
63
+ #
64
+ def write_xml_namespace
65
+ schema = 'urn:schemas-microsoft-com:'
66
+ xmlns = schema + 'vml'
67
+ xmlns_o = schema + 'office:office'
68
+ xmlns_x = schema + 'office:excel'
69
+
70
+ attributes = [
71
+ 'xmlns:v', xmlns,
72
+ 'xmlns:o', xmlns_o,
73
+ 'xmlns:x', xmlns_x
74
+ ]
75
+
76
+ @writer.start_tag('xml', attributes)
77
+ end
78
+
79
+ #
80
+ # Write the <o:shapelayout> element.
81
+ #
82
+ def write_shapelayout(data_id)
83
+ ext = 'edit'
84
+
85
+ attributes = ['v:ext', ext]
86
+
87
+ @writer.start_tag('o:shapelayout', attributes)
88
+
89
+ # Write the o:idmap element.
90
+ write_idmap(data_id)
91
+
92
+ @writer.end_tag('o:shapelayout')
93
+ end
94
+
95
+ #
96
+ # Write the <o:idmap> element.
97
+ #
98
+ def write_idmap(data_id)
99
+ ext = 'edit'
100
+
101
+ attributes = [
102
+ 'v:ext', ext,
103
+ 'data', data_id
104
+ ]
105
+
106
+ @writer.empty_tag('o:idmap', attributes)
107
+ end
108
+
109
+ #
110
+ # Write the <v:shapetype> element.
111
+ #
112
+ def write_shapetype
113
+ id = '_x0000_t202'
114
+ coordsize = '21600,21600'
115
+ spt = 202
116
+ path = 'm,l,21600r21600,l21600,xe'
117
+
118
+ attributes = [
119
+ 'id', id,
120
+ 'coordsize', coordsize,
121
+ 'o:spt', spt,
122
+ 'path', path
123
+ ]
124
+
125
+ @writer.start_tag('v:shapetype', attributes)
126
+
127
+ # Write the v:stroke element.
128
+ write_stroke
129
+
130
+ # Write the v:path element.
131
+ write_path('t', 'rect')
132
+
133
+ @writer.end_tag('v:shapetype')
134
+ end
135
+
136
+ #
137
+ # Write the <v:stroke> element.
138
+ #
139
+ def write_stroke
140
+ joinstyle = 'miter'
141
+
142
+ attributes = ['joinstyle', joinstyle]
143
+
144
+ @writer.empty_tag('v:stroke', attributes)
145
+ end
146
+
147
+ #
148
+ # Write the <v:path> element.
149
+ #
150
+ def write_path(gradientshapeok, connecttype)
151
+ attributes = []
152
+
153
+ attributes << 'gradientshapeok' << 't' if gradientshapeok
154
+ attributes << 'o:connecttype' << connecttype
155
+
156
+ @writer.empty_tag('v:path', attributes)
157
+ end
158
+
159
+ #
160
+ # Write the <v:shape> element.
161
+ #
162
+ def write_shape(id, z_index, comment)
163
+ type = '#_x0000_t202'
164
+ insetmode = 'auto'
165
+ visibility = 'hidden'
166
+
167
+ # Set the shape index.
168
+ id = '_x0000_s' + id.to_s
169
+
170
+ # Get the comment parameters
171
+ row = comment[0]
172
+ col = comment[1]
173
+ string = comment[2]
174
+ author = comment[3]
175
+ visible = comment[4]
176
+ fillcolor = comment[5]
177
+ vertices = comment[6]
178
+
179
+ left, top, width, height = pixels_to_points(vertices)
180
+
181
+ # Set the visibility.
182
+ visibility = 'visible' if visible != 0 && !visible.nil?
183
+
184
+ left_str = float_to_str(left)
185
+ top_str = float_to_str(top)
186
+ width_str = float_to_str(width)
187
+ height_str = float_to_str(height)
188
+ z_index_str = float_to_str(z_index)
189
+
190
+ style =
191
+ 'position:absolute;' +
192
+ 'margin-left:' +
193
+ left_str + 'pt;' +
194
+ 'margin-top:' +
195
+ top_str + 'pt;' +
196
+ 'width:' +
197
+ width_str + 'pt;' +
198
+ 'height:' +
199
+ height_str + 'pt;' +
200
+ 'z-index:' +
201
+ z_index_str + ';' +
202
+ 'visibility:' +
203
+ visibility
204
+
205
+
206
+ attributes = [
207
+ 'id', id,
208
+ 'type', type,
209
+ 'style', style,
210
+ 'fillcolor', fillcolor,
211
+ 'o:insetmode', insetmode
212
+ ]
213
+
214
+ @writer.start_tag('v:shape', attributes)
215
+
216
+ # Write the v:fill element.
217
+ write_fill
218
+
219
+ # Write the v:shadow element.
220
+ write_shadow
221
+
222
+ # Write the v:path element.
223
+ write_path(nil, 'none')
224
+
225
+ # Write the v:textbox element.
226
+ write_textbox
227
+
228
+ # Write the x:ClientData element.
229
+ write_client_data(row, col, visible, vertices)
230
+
231
+ @writer.end_tag('v:shape')
232
+ end
233
+
234
+ def float_to_str(float)
235
+ return '' unless float
236
+ if float == float.to_i
237
+ float.to_i.to_s
238
+ else
239
+ float.to_s
240
+ end
241
+ end
242
+
243
+ #
244
+ # Write the <v:fill> element.
245
+ #
246
+ def write_fill
247
+ color_2 = '#ffffe1'
248
+ attributes = ['color2', color_2]
249
+
250
+ @writer.empty_tag('v:fill', attributes)
251
+ end
252
+
253
+ #
254
+ # Write the <v:shadow> element.
255
+ #
256
+ def write_shadow
257
+ on = 't'
258
+ color = 'black'
259
+ obscured = 't'
260
+
261
+ attributes = [
262
+ 'on', on,
263
+ 'color', color,
264
+ 'obscured', obscured
265
+ ]
266
+
267
+ @writer.empty_tag('v:shadow', attributes)
268
+ end
269
+
270
+ #
271
+ # Write the <v:textbox> element.
272
+ #
273
+ def write_textbox
274
+ style = 'mso-direction-alt:auto'
275
+
276
+ attributes = ['style', style]
277
+
278
+ @writer.start_tag('v:textbox', attributes)
279
+
280
+ # Write the div element.
281
+ write_div
282
+
283
+ @writer.end_tag('v:textbox')
284
+ end
285
+
286
+ #
287
+ # Write the <div> element.
288
+ #
289
+ def write_div
290
+ style = 'text-align:left'
291
+ attributes = ['style', style]
292
+
293
+ @writer.start_tag('div', attributes)
294
+ @writer.end_tag('div')
295
+ end
296
+
297
+ #
298
+ # Write the <x:ClientData> element.
299
+ #
300
+ def write_client_data(row, col, visible, vertices)
301
+ object_type = 'Note'
302
+
303
+ attributes = ['ObjectType', object_type]
304
+
305
+ @writer.start_tag('x:ClientData', attributes)
306
+
307
+ # Write the x:MoveWithCells element.
308
+ write_move_with_cells
309
+
310
+ # Write the x:SizeWithCells element.
311
+ write_size_with_cells
312
+
313
+ # Write the x:Anchor element.
314
+ write_anchor(vertices)
315
+
316
+ # Write the x:AutoFill element.
317
+ write_auto_fill
318
+
319
+ # Write the x:Row element.
320
+ write_row(row)
321
+
322
+ # Write the x:Column element.
323
+ write_column(col)
324
+
325
+ # Write the x:Visible element.
326
+ write_visible if visible != 0 && !visible.nil?
327
+
328
+ @writer.end_tag('x:ClientData')
329
+ end
330
+
331
+ #
332
+ # Write the <x:MoveWithCells> element.
333
+ #
334
+ def write_move_with_cells
335
+ @writer.empty_tag('x:MoveWithCells')
336
+ end
337
+
338
+ #
339
+ # Write the <x:SizeWithCells> element.
340
+ #
341
+ def write_size_with_cells
342
+ @writer.empty_tag('x:SizeWithCells')
343
+ end
344
+
345
+ #
346
+ # Write the <x:Visible> element.
347
+ #
348
+ def write_visible
349
+ @writer.empty_tag('x:Visible')
350
+ end
351
+
352
+ #
353
+ # Write the <x:Anchor> element.
354
+ #
355
+ def write_anchor(vertices)
356
+ col_start, row_start, x1, y1, col_end, row_end, x2, y2 = vertices
357
+ data = [col_start, x1, row_start, y1, col_end, x2, row_end, y2].join(', ')
358
+
359
+ @writer.data_element('x:Anchor', data)
360
+ end
361
+
362
+ #
363
+ # Write the <x:AutoFill> element.
364
+ #
365
+ def write_auto_fill
366
+ data = 'False'
367
+
368
+ @writer.data_element('x:AutoFill', data)
369
+ end
370
+
371
+ #
372
+ # Write the <x:Row> element.
373
+ #
374
+ def write_row(data)
375
+ @writer.data_element('x:Row', data)
376
+ end
377
+
378
+ #
379
+ # Write the <x:Column> element.
380
+ #
381
+ def write_column(data)
382
+ @writer.data_element('x:Column', data)
383
+ end
384
+ end
385
+ end
386
+ end
@@ -0,0 +1,90 @@
1
+ # coding: utf-8
2
+ #
3
+ # XMLWriterSimple
4
+ #
5
+ require 'stringio'
6
+
7
+ module Writexlsx
8
+ module Package
9
+ class XMLWriterSimple
10
+ def initialize
11
+ @io = StringIO.new
12
+ end
13
+
14
+ def set_xml_writer(filename = nil)
15
+ fh = File.open(filename, "wb")
16
+
17
+ @io = fh
18
+ end
19
+
20
+ def xml_decl(encoding = 'UTF-8', standalone = true)
21
+ str = %Q!<?xml version="1.0" encoding="#{encoding}" standalone="#{standalone ? 'yes' : 'no'}"?>\n!
22
+ io_write(str)
23
+ end
24
+
25
+ def start_tag(tag, attr = [])
26
+ str = "<#{tag}#{key_vals(attr)}>"
27
+ io_write(str)
28
+ end
29
+
30
+ def end_tag(tag)
31
+ str = "</#{tag}>"
32
+ io_write(str)
33
+ end
34
+
35
+ def empty_tag(tag, attr = [])
36
+ str = "<#{tag}#{key_vals(attr)} />"
37
+ io_write(str)
38
+ end
39
+
40
+ def data_element(tag, data, attr = [])
41
+ str = start_tag(tag, attr)
42
+ str << io_write("#{characters(data)}")
43
+ str << end_tag(tag)
44
+ end
45
+
46
+ def characters(data)
47
+ escape_xml_chars(data)
48
+ end
49
+
50
+ def crlf
51
+ io_write("\n")
52
+ end
53
+
54
+ def close
55
+ @io.close
56
+ end
57
+
58
+ def string
59
+ @io.string
60
+ end
61
+
62
+ def io_write(str)
63
+ @io << str
64
+ str
65
+ end
66
+
67
+ private
68
+
69
+ def key_val(key, val)
70
+ %Q{ #{key}="#{val}"}
71
+ end
72
+
73
+ def key_vals(attr)
74
+ array = []
75
+ (0 .. attr.size-1).step(2) do |i|
76
+ array << key_val(attr[i], escape_xml_chars(attr[i+1]))
77
+ end
78
+ array.join('')
79
+ end
80
+
81
+ def escape_xml_chars(str = '')
82
+ if str =~ /[&<>"]/
83
+ str.gsub(/&/, '&amp;').gsub(/</, '&lt;').gsub(/>/, '&gt;').gsub(/"/, '&quot;')
84
+ else
85
+ str
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end