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,683 @@
1
+ # -*- coding: utf-8 -*-
2
+ module Writexlsx
3
+ # ==CELL FORMATTING
4
+ #
5
+ # This section describes the methods and properties that are available
6
+ # for formatting cells in Excel. The properties of a cell that can be
7
+ # formatted include: fonts, colours, patterns, borders, alignment and
8
+ # number formatting.
9
+ #
10
+ # ===Creating and using a Format object
11
+ #
12
+ # Cell formatting is defined through a Format object. Format objects
13
+ # are created by calling the workbook add_format() method as follows:
14
+ #
15
+ # format1 = workbook.add_format # Set properties later
16
+ # format2 = workbook.add_format(props_hash) # Set at creation
17
+ #
18
+ # The format object holds all the formatting properties that can be applied
19
+ # to a cell, a row or a column. The process of setting these properties is
20
+ # discussed in the next section.
21
+ #
22
+ # Once a Format object has been constructed and its properties have been
23
+ # set it can be passed as an argument to the worksheet write methods as
24
+ # follows:
25
+ #
26
+ # worksheet.write( 0, 0, 'One', format )
27
+ # worksheet.write_string( 1, 0, 'Two', format )
28
+ # worksheet.write_number( 2, 0, 3, format )
29
+ # worksheet.write_blank( 3, 0, format )
30
+ #
31
+ # Formats can also be passed to the worksheet set_row() and set_column()
32
+ # methods to define the default property for a row or column.
33
+ #
34
+ # worksheet.set_row( 0, 15, format )
35
+ # worksheet.set_column( 0, 0, 15, format )
36
+ #
37
+ # ===Format methods and Format properties
38
+ #
39
+ # The following table shows the Excel format categories, the formatting
40
+ # properties that can be applied and the equivalent object method:
41
+ #
42
+ # Category Description Property Method Name
43
+ # -------- ----------- -------- -----------
44
+ # Font Font type font set_font()
45
+ # Font size size set_size()
46
+ # Font color color set_color()
47
+ # Bold bold set_bold()
48
+ # Italic italic set_italic()
49
+ # Underline underline set_underline()
50
+ # Strikeout font_strikeout set_font_strikeout()
51
+ # Super/Subscript font_script set_font_script()
52
+ # Outline font_outline set_font_outline()
53
+ # Shadow font_shadow set_font_shadow()
54
+ #
55
+ # Number Numeric format num_format set_num_format()
56
+ #
57
+ # Protection Lock cells locked set_locked()
58
+ # Hide formulas hidden set_hidden()
59
+ #
60
+ # Alignment Horizontal align align set_align()
61
+ # Vertical align valign set_align()
62
+ # Rotation rotation set_rotation()
63
+ # Text wrap text_wrap set_text_wrap()
64
+ # Justify last text_justlast set_text_justlast()
65
+ # Center across center_across set_center_across()
66
+ # Indentation indent set_indent()
67
+ # Shrink to fit shrink set_shrink()
68
+ #
69
+ # Pattern Cell pattern pattern set_pattern()
70
+ # Background color bg_color set_bg_color()
71
+ # Foreground color fg_color set_fg_color()
72
+ #
73
+ # Border Cell border border set_border()
74
+ # Bottom border bottom set_bottom()
75
+ # Top border top set_top()
76
+ # Left border left set_left()
77
+ # Right border right set_right()
78
+ # Border color border_color set_border_color()
79
+ # Bottom color bottom_color set_bottom_color()
80
+ # Top color top_color set_top_color()
81
+ # Left color left_color set_left_color()
82
+ # Right color right_color set_right_color()
83
+ #
84
+ # There are two ways of setting Format properties: by using the object
85
+ # method interface or by setting the property directly. For example,
86
+ # a typical use of the method interface would be as follows:
87
+ #
88
+ # format = workbook.add_format
89
+ # format.set_bold
90
+ # format.set_color( 'red' )
91
+ #
92
+ # By comparison the properties can be set directly by passing a hash
93
+ # of properties to the Format constructor:
94
+ #
95
+ # format = workbook.add_format( :bold => 1, :color => 'red' )
96
+ #
97
+ # or after the Format has been constructed by means of the
98
+ # set_format_properties() method as follows:
99
+ #
100
+ # format = workbook.add_format
101
+ # format.set_format_properties( :bold => 1, :color => 'red' )
102
+ #
103
+ # You can also store the properties in one or more named hashes and pass
104
+ # them to the required method:
105
+ #
106
+ # font = {
107
+ # :font => 'Arial',
108
+ # :size => 12,
109
+ # :color => 'blue',
110
+ # :bold => 1
111
+ # }
112
+ #
113
+ # shading = {
114
+ # :bg_color => 'green',
115
+ # :pattern => 1
116
+ # }
117
+ #
118
+ # format1 = workbook.add_format( font ) # Font only
119
+ # format2 = workbook.add_format( font, shading ) # Font and shading
120
+ #
121
+ # The provision of two ways of setting properties might lead you to wonder
122
+ # which is the best way. The method mechanism may be better is you prefer
123
+ # setting properties via method calls (which the author did when the code
124
+ # was first written) otherwise passing properties to the constructor has
125
+ # proved to be a little more flexible and self documenting in practice.
126
+ # An additional advantage of working with property hashes is that it allows
127
+ # you to share formatting between workbook objects as shown in the example
128
+ # above.
129
+ #
130
+ # ===Working with formats
131
+ #
132
+ # The default format is Arial 10 with all other properties off.
133
+ #
134
+ # Each unique format in Excel::Writer::XLSX must have a corresponding Format
135
+ # object. It isn't possible to use a Format with a write() method and then
136
+ # redefine the Format for use at a later stage. This is because a Format
137
+ # is applied to a cell not in its current state but in its final state.
138
+ # Consider the following example:
139
+ #
140
+ # format = workbook.add_format
141
+ # format.set_bold
142
+ # format.set_color( 'red' )
143
+ # worksheet.write( 'A1', 'Cell A1', format )
144
+ # format.set_color( 'green' )
145
+ # worksheet.write( 'B1', 'Cell B1', format )
146
+ #
147
+ # Cell A1 is assigned the Format format which is initially set to the colour
148
+ # red. However, the colour is subsequently set to green. When Excel displays
149
+ # Cell A1 it will display the final state of the Format which in this case
150
+ # will be the colour green.
151
+ #
152
+ # In general a method call without an argument will turn a property on,
153
+ # for example:
154
+ #
155
+ # format1 = workbook.add_format
156
+ # format1.set_bold # Turns bold on
157
+ # format1.set_bold( 1 ) # Also turns bold on
158
+ # format1.set_bold( 0 ) # Turns bold off
159
+ #
160
+ class Format
161
+ attr_reader :xf_index, :dxf_index, :num_format # :nodoc:
162
+ attr_reader :underline, :font_script, :size, :theme, :font, :font_family, :hyperlink # :nodoc:
163
+ attr_reader :diag_type, :diag_color, :font_only, :color, :color_indexed # :nodoc:
164
+ attr_reader :left, :left_color, :right, :right_color, :top, :top_color, :bottom, :bottom_color # :nodoc:
165
+ attr_reader :font_scheme # :nodoc:
166
+ attr_accessor :font_index, :has_font, :has_dxf_font, :has_dxf_fill, :has_dxf_border # :nodoc:
167
+ attr_accessor :num_format_index, :border_index, :has_border # :nodoc:
168
+ attr_accessor :fill_index, :has_fill, :font_condense, :font_extend, :diag_border # :nodoc:
169
+ attr_accessor :bg_color, :fg_color, :pattern # :nodoc:
170
+
171
+ def initialize(xf_format_indices = {}, dxf_format_indices = {}, params = {}) # :nodoc:
172
+ @xf_format_indices = xf_format_indices
173
+ @dxf_format_indices = dxf_format_indices
174
+
175
+ @xf_index = nil
176
+ @dxf_index = nil
177
+
178
+ @num_format = 0
179
+ @num_format_index = 0
180
+ @font_index = 0
181
+ @has_font = 0
182
+ @has_dxf_font = 0
183
+ @font = 'Calibri'
184
+ @size = 11
185
+ @bold = 0
186
+ @italic = 0
187
+ @color = 0x0
188
+ @underline = 0
189
+ @font_strikeout = 0
190
+ @font_outline = 0
191
+ @font_shadow = 0
192
+ @font_script = 0
193
+ @font_family = 2
194
+ @font_charset = 0
195
+ @font_scheme = 'minor'
196
+ @font_condense = 0
197
+ @font_extend = 0
198
+ @theme = 0
199
+ @hyperlink = 0
200
+
201
+ @hidden = 0
202
+ @locked = 1
203
+
204
+ @text_h_align = 0
205
+ @text_wrap = 0
206
+ @text_v_align = 0
207
+ @text_justlast = 0
208
+ @rotation = 0
209
+
210
+ @fg_color = 0x00
211
+ @bg_color = 0x00
212
+ @pattern = 0
213
+ @has_fill = 0
214
+ @has_dxf_fill = 0
215
+ @fill_index = 0
216
+ @fill_count = 0
217
+
218
+ @border_index = 0
219
+ @has_border = 0
220
+ @has_dxf_border = 0
221
+ @border_count = 0
222
+
223
+ @bottom = 0
224
+ @bottom_color = 0x0
225
+ @diag_border = 0
226
+ @diag_color = 0x0
227
+ @diag_type = 0
228
+ @left = 0
229
+ @left_color = 0x0
230
+ @right = 0
231
+ @right_color = 0x0
232
+ @top = 0
233
+ @top_color = 0x0
234
+
235
+ @indent = 0
236
+ @shrink = 0
237
+ @merge_range = 0
238
+ @reading_order = 0
239
+ @just_distrib = 0
240
+ @color_indexed = 0
241
+ @font_only = 0
242
+
243
+ set_format_properties(params) unless params.empty?
244
+ end
245
+
246
+ #
247
+ # :call-seq:
248
+ # set_format_properties( :bold => 1 [, :color => 'red'..] )
249
+ # set_format_properties( font [, shade, ..])
250
+ # set_format_properties( :bold => 1, font, ...)
251
+ # *) font = { :color => 'red', :bold => 1 }
252
+ # shade = { :bg_color => 'green', :pattern => 1 }
253
+ #
254
+ # Convert hashes of properties to method calls.
255
+ #
256
+ # The properties of an existing Format object can be also be set by means
257
+ # of set_format_properties():
258
+ #
259
+ # format = workbook.add_format
260
+ # format.set_format_properties(:bold => 1, :color => 'red');
261
+ #
262
+ # However, this method is here mainly for legacy reasons. It is preferable
263
+ # to set the properties in the format constructor:
264
+ #
265
+ # format = workbook.add_format(:bold => 1, :color => 'red');
266
+ #
267
+ def set_format_properties(*properties) # :nodoc:
268
+ return if properties.empty?
269
+ properties.each do |property|
270
+ property.each do |key, value|
271
+ # Strip leading "-" from Tk style properties e.g. "-color" => 'red'.
272
+ key = key.sub(/^-/, '') if key.respond_to?(:to_str)
273
+
274
+ # Create a sub to set the property.
275
+ if value.respond_to?(:to_str) || !value.respond_to?(:+)
276
+ s = "set_#{key}('#{value}')"
277
+ else
278
+ s = "set_#{key}(#{value})"
279
+ end
280
+ eval s
281
+ end
282
+ end
283
+ end
284
+
285
+ #
286
+ # Return properties for an Style xf <alignment> sub-element.
287
+ #
288
+ def get_align_properties
289
+ align = [] # Attributes to return
290
+
291
+ # Check if any alignment options in the format have been changed.
292
+ if @text_h_align != 0 || @text_v_align != 0 || @indent != 0 ||
293
+ @rotation != 0 || @text_wrap != 0 || @shrink != 0 || @reading_order != 0
294
+ changed = 1
295
+ else
296
+ return
297
+ end
298
+
299
+ # Indent is only allowed for horizontal left, right and distributed. If it
300
+ # is defined for any other alignment or no alignment has been set then
301
+ # default to left alignment.
302
+ @text_h_align = 1 if @indent != 0 && ![1, 3, 7].include?(@text_h_align)
303
+
304
+ # Check for properties that are mutually exclusive.
305
+ @shrink = 0 if @text_wrap != 0
306
+ @shrink = 0 if @text_h_align == 4 # Fill
307
+ @shrink = 0 if @text_h_align == 5 # Justify
308
+ @shrink = 0 if @text_h_align == 7 # Distributed
309
+ @just_distrib = 0 if @text_h_align != 7 # Distributed
310
+ @just_distrib = 0 if @indent != 0
311
+
312
+ continuous = 'centerContinuous'
313
+
314
+ align << 'horizontal' << 'left' if @text_h_align == 1
315
+ align << 'horizontal' << 'center' if @text_h_align == 2
316
+ align << 'horizontal' << 'right' if @text_h_align == 3
317
+ align << 'horizontal' << 'fill' if @text_h_align == 4
318
+ align << 'horizontal' << 'justify' if @text_h_align == 5
319
+ align << 'horizontal' << continuous if @text_h_align == 6
320
+ align << 'horizontal' << 'distributed' if @text_h_align == 7
321
+
322
+ align << 'justifyLastLine' << 1 if @just_distrib != 0
323
+
324
+ # Property 'vertical' => 'bottom' is a default. It sets applyAlignment
325
+ # without an alignment sub-element.
326
+ align << 'vertical' << 'top' if @text_v_align == 1
327
+ align << 'vertical' << 'center' if @text_v_align == 2
328
+ align << 'vertical' << 'justify' if @text_v_align == 4
329
+ align << 'vertical' << 'distributed' if @text_v_align == 5
330
+
331
+ align << 'indent' << @indent if @indent != 0
332
+ align << 'textRotation' << @rotation if @rotation != 0
333
+
334
+ align << 'wrapText' << 1 if @text_wrap != 0
335
+ align << 'shrinkToFit' << 1 if @shrink != 0
336
+
337
+ align << 'readingOrder' << 1 if @reading_order == 1
338
+ align << 'readingOrder' << 2 if @reading_order == 2
339
+
340
+ return changed, align
341
+ end
342
+
343
+ #
344
+ # Return properties for an Excel XML <Protection> element.
345
+ #
346
+ def get_protection_properties
347
+ attributes = []
348
+
349
+ attributes << 'locked' << 0 if @locked == 0
350
+ attributes << 'hidden' << 1 unless @hidden == 0
351
+
352
+ attributes.empty? ? nil : attributes
353
+ end
354
+
355
+ def set_bold(bold = 1)
356
+ @bold = (bold && bold != 0) ? 1 : 0
357
+ end
358
+
359
+ def inspect
360
+ to_s
361
+ end
362
+
363
+ #
364
+ # Returns a unique hash key for the Format object.
365
+ #
366
+ def get_format_key
367
+ [get_font_key, get_border_key, get_fill_key, @num_format].join(':')
368
+ end
369
+
370
+ #
371
+ # Returns a unique hash key for a font. Used by Workbook.
372
+ #
373
+ def get_font_key
374
+ [
375
+ @bold,
376
+ @color,
377
+ @font_charset,
378
+ @font_family,
379
+ @font_outline,
380
+ @font_script,
381
+ @font_shadow,
382
+ @font_strikeout,
383
+ @font,
384
+ @italic,
385
+ @size,
386
+ @underline
387
+ ].join(':')
388
+ end
389
+
390
+ #
391
+ # Returns a unique hash key for a border style. Used by Workbook.
392
+ #
393
+ def get_border_key
394
+ [
395
+ @bottom,
396
+ @bottom_color,
397
+ @diag_border,
398
+ @diag_color,
399
+ @diag_type,
400
+ @left,
401
+ @left_color,
402
+ @right,
403
+ @right_color,
404
+ @top,
405
+ @top_color
406
+ ].join(':')
407
+ end
408
+
409
+ #
410
+ # Returns a unique hash key for a fill style. Used by Workbook.
411
+ #
412
+ def get_fill_key
413
+ [
414
+ @pattern,
415
+ @bg_color,
416
+ @fg_color
417
+ ].join(':')
418
+ end
419
+
420
+ #
421
+ # Returns the index used by Worksheet->_XF()
422
+ #
423
+ def get_xf_index
424
+ if @xf_index
425
+ @xf_index
426
+ else
427
+ key = get_format_key
428
+ indices_href = @xf_format_indices
429
+
430
+ if indices_href[key]
431
+ indices_href[key]
432
+ else
433
+ index = 1 + indices_href.keys.size
434
+ indices_href[key] = index
435
+ @xf_index = index
436
+ index
437
+ end
438
+ end
439
+ end
440
+
441
+ #
442
+ # Returns the index used by Worksheet->_XF()
443
+ #
444
+ def get_dxf_index
445
+ if @dxf_index
446
+ @dxf_index
447
+ else
448
+ key = get_format_key
449
+ indices = @dxf_format_indices
450
+
451
+ if indices[key]
452
+ indices[key]
453
+ else
454
+ index = indices.size
455
+ indices[key] = index
456
+ @dxf_index = index
457
+ index
458
+ end
459
+ end
460
+ end
461
+
462
+ def get_color(color)
463
+ Format.get_color(color)
464
+ end
465
+
466
+ #
467
+ # Used in conjunction with the set_xxx_color methods to convert a color
468
+ # string into a number. Color range is 0..63 but we will restrict it
469
+ # to 8..63 to comply with Gnumeric. Colors 0..7 are repeated in 8..15.
470
+ #
471
+ def self.get_color(color)
472
+
473
+ colors = {
474
+ :aqua => 0x0F,
475
+ :cyan => 0x0F,
476
+ :black => 0x08,
477
+ :blue => 0x0C,
478
+ :brown => 0x10,
479
+ :magenta => 0x0E,
480
+ :fuchsia => 0x0E,
481
+ :gray => 0x17,
482
+ :grey => 0x17,
483
+ :green => 0x11,
484
+ :lime => 0x0B,
485
+ :navy => 0x12,
486
+ :orange => 0x35,
487
+ :pink => 0x21,
488
+ :purple => 0x14,
489
+ :red => 0x0A,
490
+ :silver => 0x16,
491
+ :white => 0x09,
492
+ :yellow => 0x0D,
493
+ }
494
+
495
+ if color.respond_to?(:to_str)
496
+ # Return RGB style colors for processing later.
497
+ return color if color =~ /^#[0-9A-F]{6}$/i
498
+
499
+ # Return the default color if undef,
500
+ return 0x00 unless color
501
+
502
+ # or the color string converted to an integer,
503
+ return colors[color.downcase.to_sym] if colors[color.downcase.to_sym]
504
+
505
+ # or the default color if string is unrecognised,
506
+ return 0x00 if color =~ /\D/
507
+ else
508
+ # or an index < 8 mapped into the correct range,
509
+ return color + 8 if color < 8
510
+
511
+ # or the default color if arg is outside range,
512
+ return 0x00 if color > 63
513
+
514
+ # or an integer in the valid range
515
+ return color
516
+ end
517
+ end
518
+
519
+ #
520
+ # Set cell alignment.
521
+ #
522
+ def set_align(location)
523
+ return unless location # No default
524
+
525
+ location.downcase!
526
+
527
+ set_text_h_align(1) if location == 'left'
528
+ set_text_h_align(2) if location == 'centre'
529
+ set_text_h_align(2) if location == 'center'
530
+ set_text_h_align(3) if location == 'right'
531
+ set_text_h_align(4) if location == 'fill'
532
+ set_text_h_align(5) if location == 'justify'
533
+ set_text_h_align(6) if location == 'center_across'
534
+ set_text_h_align(6) if location == 'centre_across'
535
+ set_text_h_align(6) if location == 'merge' # Legacy.
536
+ set_text_h_align(7) if location == 'distributed'
537
+ set_text_h_align(7) if location == 'equal_space' # S::PE.
538
+ set_text_h_align(7) if location == 'justify_distributed'
539
+
540
+ @just_distrib = 1 if location == 'justify_distributed'
541
+
542
+ set_text_v_align(1) if location == 'top'
543
+ set_text_v_align(2) if location == 'vcentre'
544
+ set_text_v_align(2) if location == 'vcenter'
545
+ set_text_v_align(3) if location == 'bottom'
546
+ set_text_v_align(4) if location == 'vjustify'
547
+ set_text_v_align(5) if location == 'vdistributed'
548
+ set_text_v_align(5) if location == 'vequal_space' # S::PE.
549
+ end
550
+
551
+ #
552
+ # Set vertical cell alignment. This is required by the set_properties() method
553
+ # to differentiate between the vertical and horizontal properties.
554
+ #
555
+ def set_valign(location)
556
+ set_align(location)
557
+ end
558
+
559
+ #
560
+ # Implements the Excel5 style "merge".
561
+ #
562
+ def set_center_across(flag = 1)
563
+ set_text_h_align(6)
564
+ end
565
+
566
+ #
567
+ # This was the way to implement a merge in Excel5. However it should have been
568
+ # called "center_across" and not "merge".
569
+ # This is now deprecated. Use set_center_across() or better merge_range().
570
+ #
571
+ def set_merge(merge = 1)
572
+ set_text_h_align(6)
573
+ end
574
+
575
+ #
576
+ # Set cells borders to the same style
577
+ #
578
+ def set_border(style)
579
+ set_bottom(style)
580
+ set_top(style)
581
+ set_left(style)
582
+ set_right(style)
583
+ end
584
+
585
+ #
586
+ # Set cells border to the same color
587
+ #
588
+ def set_border_color(color)
589
+ set_bottom_color(color)
590
+ set_top_color(color)
591
+ set_left_color(color)
592
+ set_right_color(color)
593
+ end
594
+
595
+ #
596
+ # Set the rotation angle of the text. An alignment property.
597
+ #
598
+ def set_rotation(rotation)
599
+ if rotation == 270
600
+ rotation = 255
601
+ elsif rotation >= -90 || rotation <= 90
602
+ rotation = -rotation + 90 if rotation < 0
603
+ else
604
+ raise "Rotation #{rotation} outside range: -90 <= angle <= 90"
605
+ rotation = 0
606
+ end
607
+
608
+ @rotation = rotation
609
+ end
610
+
611
+ #
612
+ # Set the properties for the hyperlink style. TODO. This doesn't currently
613
+ # work. Fix it when styles are supported.
614
+ #
615
+ def set_hyperlink
616
+ @hyperlink = 1
617
+
618
+ set_underline(1)
619
+ set_theme(10)
620
+ set_align('top')
621
+ end
622
+
623
+ def method_missing(name, *args) # :nodoc:
624
+ method = "#{name}"
625
+
626
+ # Check for a valid method names, i.e. "set_xxx_yyy".
627
+ method =~ /set_(\w+)/ or raise "Unknown method: #{method}\n"
628
+
629
+ # Match the attribute, i.e. "@xxx_yyy".
630
+ attribute = "@#{$1}"
631
+
632
+ # Check that the attribute exists
633
+ # ........
634
+ if method =~ /set\w+color$/ # for "set_property_color" methods
635
+ value = get_color(args[0])
636
+ else # for "set_xxx" methods
637
+ value = args[0].nil? ? 1 : args[0]
638
+ end
639
+ if value.respond_to?(:to_str) || !value.respond_to?(:+)
640
+ s = %Q!#{attribute} = "#{value.to_s}"!
641
+ else
642
+ s = %Q!#{attribute} = #{value.to_s}!
643
+ end
644
+ eval s
645
+ end
646
+
647
+ def bold?
648
+ return false unless @bold
649
+ return false if @bold == 0
650
+ true
651
+ end
652
+
653
+ def italic?
654
+ return false unless @italic
655
+ return false if @italic == 0
656
+ true
657
+ end
658
+
659
+ def strikeout?
660
+ return false unless @font_strikeout
661
+ return false if @font_strikeout == 0
662
+ true
663
+ end
664
+
665
+ def outline?
666
+ return false unless @font_outline
667
+ return false if @font_outline == 0
668
+ true
669
+ end
670
+
671
+ def shadow?
672
+ return false unless @font_shadow
673
+ return false if @font_shadow == 0
674
+ true
675
+ end
676
+
677
+ def underline?
678
+ return false unless @underline
679
+ return false if @underline == 0
680
+ true
681
+ end
682
+ end
683
+ end