write_xlsx 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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