ricardoo27-writeexcel 0.6.12.1

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 (245) hide show
  1. data/.document +5 -0
  2. data/.gitattributes +1 -0
  3. data/README.rdoc +136 -0
  4. data/Rakefile +52 -0
  5. data/VERSION +1 -0
  6. data/charts/chartex.rb +316 -0
  7. data/charts/demo1.rb +46 -0
  8. data/charts/demo101.bin +0 -0
  9. data/charts/demo2.rb +65 -0
  10. data/charts/demo201.bin +0 -0
  11. data/charts/demo3.rb +117 -0
  12. data/charts/demo301.bin +0 -0
  13. data/charts/demo4.rb +119 -0
  14. data/charts/demo401.bin +0 -0
  15. data/charts/demo5.rb +48 -0
  16. data/charts/demo501.bin +0 -0
  17. data/examples/a_simple.rb +43 -0
  18. data/examples/autofilter.rb +265 -0
  19. data/examples/bigfile.rb +30 -0
  20. data/examples/chart_area.rb +121 -0
  21. data/examples/chart_bar.rb +120 -0
  22. data/examples/chart_column.rb +120 -0
  23. data/examples/chart_line.rb +120 -0
  24. data/examples/chart_pie.rb +108 -0
  25. data/examples/chart_scatter.rb +121 -0
  26. data/examples/chart_stock.rb +148 -0
  27. data/examples/chess.rb +142 -0
  28. data/examples/colors.rb +129 -0
  29. data/examples/comments1.rb +27 -0
  30. data/examples/comments2.rb +352 -0
  31. data/examples/copyformat.rb +52 -0
  32. data/examples/data_validate.rb +279 -0
  33. data/examples/date_time.rb +87 -0
  34. data/examples/defined_name.rb +32 -0
  35. data/examples/demo.rb +124 -0
  36. data/examples/diag_border.rb +36 -0
  37. data/examples/formats.rb +490 -0
  38. data/examples/formula_result.rb +30 -0
  39. data/examples/header.rb +137 -0
  40. data/examples/hide_sheet.rb +29 -0
  41. data/examples/hyperlink.rb +43 -0
  42. data/examples/images.rb +63 -0
  43. data/examples/indent.rb +31 -0
  44. data/examples/merge1.rb +40 -0
  45. data/examples/merge2.rb +45 -0
  46. data/examples/merge3.rb +66 -0
  47. data/examples/merge4.rb +83 -0
  48. data/examples/merge5.rb +80 -0
  49. data/examples/merge6.rb +67 -0
  50. data/examples/outline.rb +255 -0
  51. data/examples/outline_collapsed.rb +209 -0
  52. data/examples/panes.rb +113 -0
  53. data/examples/password_protection.rb +33 -0
  54. data/examples/properties.rb +34 -0
  55. data/examples/properties_jp.rb +33 -0
  56. data/examples/protection.rb +47 -0
  57. data/examples/regions.rb +53 -0
  58. data/examples/repeat.rb +43 -0
  59. data/examples/republic.png +0 -0
  60. data/examples/right_to_left.rb +27 -0
  61. data/examples/row_wrap.rb +53 -0
  62. data/examples/set_first_sheet.rb +14 -0
  63. data/examples/stats.rb +74 -0
  64. data/examples/stocks.rb +81 -0
  65. data/examples/store_formula.rb +15 -0
  66. data/examples/tab_colors.rb +31 -0
  67. data/examples/utf8.rb +15 -0
  68. data/examples/write_arrays.rb +83 -0
  69. data/html/en/doc_en.html +5946 -0
  70. data/html/images/a_simple.jpg +0 -0
  71. data/html/images/area1.jpg +0 -0
  72. data/html/images/bar1.jpg +0 -0
  73. data/html/images/chart_area.xls +0 -0
  74. data/html/images/column1.jpg +0 -0
  75. data/html/images/data_validation.jpg +0 -0
  76. data/html/images/line1.jpg +0 -0
  77. data/html/images/pie1.jpg +0 -0
  78. data/html/images/regions.jpg +0 -0
  79. data/html/images/scatter1.jpg +0 -0
  80. data/html/images/stats.jpg +0 -0
  81. data/html/images/stock1.jpg +0 -0
  82. data/html/images/stocks.jpg +0 -0
  83. data/html/index.html +16 -0
  84. data/html/style.css +433 -0
  85. data/lib/writeexcel.rb +1159 -0
  86. data/lib/writeexcel/biffwriter.rb +223 -0
  87. data/lib/writeexcel/caller_info.rb +12 -0
  88. data/lib/writeexcel/cell_range.rb +332 -0
  89. data/lib/writeexcel/chart.rb +1968 -0
  90. data/lib/writeexcel/charts/area.rb +154 -0
  91. data/lib/writeexcel/charts/bar.rb +177 -0
  92. data/lib/writeexcel/charts/column.rb +156 -0
  93. data/lib/writeexcel/charts/external.rb +66 -0
  94. data/lib/writeexcel/charts/line.rb +154 -0
  95. data/lib/writeexcel/charts/pie.rb +169 -0
  96. data/lib/writeexcel/charts/scatter.rb +192 -0
  97. data/lib/writeexcel/charts/stock.rb +213 -0
  98. data/lib/writeexcel/col_info.rb +87 -0
  99. data/lib/writeexcel/colors.rb +68 -0
  100. data/lib/writeexcel/comments.rb +460 -0
  101. data/lib/writeexcel/compatibility.rb +65 -0
  102. data/lib/writeexcel/convert_date_time.rb +117 -0
  103. data/lib/writeexcel/data_validations.rb +370 -0
  104. data/lib/writeexcel/debug_info.rb +41 -0
  105. data/lib/writeexcel/embedded_chart.rb +35 -0
  106. data/lib/writeexcel/excelformula.y +139 -0
  107. data/lib/writeexcel/excelformulaparser.rb +587 -0
  108. data/lib/writeexcel/format.rb +1575 -0
  109. data/lib/writeexcel/formula.rb +987 -0
  110. data/lib/writeexcel/helper.rb +78 -0
  111. data/lib/writeexcel/image.rb +218 -0
  112. data/lib/writeexcel/olewriter.rb +305 -0
  113. data/lib/writeexcel/outline.rb +24 -0
  114. data/lib/writeexcel/properties.rb +242 -0
  115. data/lib/writeexcel/shared_string_table.rb +153 -0
  116. data/lib/writeexcel/storage_lite.rb +984 -0
  117. data/lib/writeexcel/workbook.rb +2478 -0
  118. data/lib/writeexcel/worksheet.rb +6925 -0
  119. data/lib/writeexcel/worksheets.rb +25 -0
  120. data/lib/writeexcel/write_file.rb +63 -0
  121. data/test/excelfile/Chart1.xls +0 -0
  122. data/test/excelfile/Chart2.xls +0 -0
  123. data/test/excelfile/Chart3.xls +0 -0
  124. data/test/excelfile/Chart4.xls +0 -0
  125. data/test/excelfile/Chart5.xls +0 -0
  126. data/test/helper.rb +31 -0
  127. data/test/perl_output/Chart1.xls.data +0 -0
  128. data/test/perl_output/Chart2.xls.data +0 -0
  129. data/test/perl_output/Chart3.xls.data +0 -0
  130. data/test/perl_output/Chart4.xls.data +0 -0
  131. data/test/perl_output/Chart5.xls.data +0 -0
  132. data/test/perl_output/README +31 -0
  133. data/test/perl_output/a_simple.xls +0 -0
  134. data/test/perl_output/autofilter.xls +0 -0
  135. data/test/perl_output/biff_add_continue_testdata +0 -0
  136. data/test/perl_output/chart_area.xls +0 -0
  137. data/test/perl_output/chart_bar.xls +0 -0
  138. data/test/perl_output/chart_column.xls +0 -0
  139. data/test/perl_output/chart_line.xls +0 -0
  140. data/test/perl_output/chess.xls +0 -0
  141. data/test/perl_output/colors.xls +0 -0
  142. data/test/perl_output/comments0.xls +0 -0
  143. data/test/perl_output/comments1.xls +0 -0
  144. data/test/perl_output/comments2.xls +0 -0
  145. data/test/perl_output/data_validate.xls +0 -0
  146. data/test/perl_output/date_time.xls +0 -0
  147. data/test/perl_output/defined_name.xls +0 -0
  148. data/test/perl_output/demo.xls +0 -0
  149. data/test/perl_output/demo101.bin +0 -0
  150. data/test/perl_output/demo201.bin +0 -0
  151. data/test/perl_output/demo301.bin +0 -0
  152. data/test/perl_output/demo401.bin +0 -0
  153. data/test/perl_output/demo501.bin +0 -0
  154. data/test/perl_output/diag_border.xls +0 -0
  155. data/test/perl_output/f_font_biff +0 -0
  156. data/test/perl_output/f_font_key +1 -0
  157. data/test/perl_output/f_xf_biff +0 -0
  158. data/test/perl_output/file_font_biff +0 -0
  159. data/test/perl_output/file_font_key +1 -0
  160. data/test/perl_output/file_xf_biff +0 -0
  161. data/test/perl_output/formula_result.xls +0 -0
  162. data/test/perl_output/headers.xls +0 -0
  163. data/test/perl_output/hidden.xls +0 -0
  164. data/test/perl_output/hide_zero.xls +0 -0
  165. data/test/perl_output/hyperlink.xls +0 -0
  166. data/test/perl_output/images.xls +0 -0
  167. data/test/perl_output/indent.xls +0 -0
  168. data/test/perl_output/merge1.xls +0 -0
  169. data/test/perl_output/merge2.xls +0 -0
  170. data/test/perl_output/merge3.xls +0 -0
  171. data/test/perl_output/merge4.xls +0 -0
  172. data/test/perl_output/merge5.xls +0 -0
  173. data/test/perl_output/merge6.xls +0 -0
  174. data/test/perl_output/ole_write_header +0 -0
  175. data/test/perl_output/outline.xls +0 -0
  176. data/test/perl_output/outline_collapsed.xls +0 -0
  177. data/test/perl_output/panes.xls +0 -0
  178. data/test/perl_output/password_protection.xls +0 -0
  179. data/test/perl_output/protection.xls +0 -0
  180. data/test/perl_output/regions.xls +0 -0
  181. data/test/perl_output/right_to_left.xls +0 -0
  182. data/test/perl_output/set_first_sheet.xls +0 -0
  183. data/test/perl_output/stats.xls +0 -0
  184. data/test/perl_output/stocks.xls +0 -0
  185. data/test/perl_output/store_formula.xls +0 -0
  186. data/test/perl_output/tab_colors.xls +0 -0
  187. data/test/perl_output/unicode_cyrillic.xls +0 -0
  188. data/test/perl_output/utf8.xls +0 -0
  189. data/test/perl_output/workbook1.xls +0 -0
  190. data/test/perl_output/workbook2.xls +0 -0
  191. data/test/perl_output/ws_colinfo +1 -0
  192. data/test/perl_output/ws_store_colinfo +0 -0
  193. data/test/perl_output/ws_store_dimensions +0 -0
  194. data/test/perl_output/ws_store_filtermode +0 -0
  195. data/test/perl_output/ws_store_filtermode_off +0 -0
  196. data/test/perl_output/ws_store_filtermode_on +0 -0
  197. data/test/perl_output/ws_store_selection +0 -0
  198. data/test/perl_output/ws_store_window2 +1 -0
  199. data/test/republic.png +0 -0
  200. data/test/test_00_IEEE_double.rb +13 -0
  201. data/test/test_01_add_worksheet.rb +10 -0
  202. data/test/test_02_merge_formats.rb +49 -0
  203. data/test/test_04_dimensions.rb +388 -0
  204. data/test/test_05_rows.rb +175 -0
  205. data/test/test_06_extsst.rb +74 -0
  206. data/test/test_11_date_time.rb +475 -0
  207. data/test/test_12_date_only.rb +525 -0
  208. data/test/test_13_date_seconds.rb +477 -0
  209. data/test/test_21_escher.rb +624 -0
  210. data/test/test_22_mso_drawing_group.rb +741 -0
  211. data/test/test_23_note.rb +57 -0
  212. data/test/test_24_txo.rb +74 -0
  213. data/test/test_25_position_object.rb +80 -0
  214. data/test/test_26_autofilter.rb +309 -0
  215. data/test/test_27_autofilter.rb +126 -0
  216. data/test/test_28_autofilter.rb +156 -0
  217. data/test/test_29_process_jpg.rb +670 -0
  218. data/test/test_30_validation_dval.rb +74 -0
  219. data/test/test_31_validation_dv_strings.rb +123 -0
  220. data/test/test_32_validation_dv_formula.rb +203 -0
  221. data/test/test_40_property_types.rb +188 -0
  222. data/test/test_41_properties.rb +235 -0
  223. data/test/test_42_set_properties.rb +434 -0
  224. data/test/test_50_name_stored.rb +295 -0
  225. data/test/test_51_name_print_area.rb +353 -0
  226. data/test/test_52_name_print_titles.rb +450 -0
  227. data/test/test_53_autofilter.rb +199 -0
  228. data/test/test_60_chart_generic.rb +574 -0
  229. data/test/test_61_chart_subclasses.rb +84 -0
  230. data/test/test_62_chart_formats.rb +268 -0
  231. data/test/test_63_chart_area_formats.rb +645 -0
  232. data/test/test_biff.rb +71 -0
  233. data/test/test_big_workbook.rb +17 -0
  234. data/test/test_compatibility.rb +12 -0
  235. data/test/test_example_match.rb +3246 -0
  236. data/test/test_format.rb +1189 -0
  237. data/test/test_formula.rb +61 -0
  238. data/test/test_ole.rb +102 -0
  239. data/test/test_storage_lite.rb +116 -0
  240. data/test/test_workbook.rb +146 -0
  241. data/test/test_worksheet.rb +106 -0
  242. data/utils/add_magic_comment.rb +80 -0
  243. data/writeexcel.gemspec +278 -0
  244. data/writeexcel.rdoc +1425 -0
  245. metadata +292 -0
@@ -0,0 +1,295 @@
1
+ # -*- coding: utf-8 -*-
2
+ ##########################################################################
3
+ # test_50_name_stored.rb
4
+ #
5
+ # Tests for the Excel EXTERNSHEET and NAME records created by print_are()..
6
+ #
7
+ # reverse('ゥ'), September 2008, John McNamara, jmcnamara@cpan.org
8
+ #
9
+ # original written in Perl by John McNamara
10
+ # converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
11
+ #
12
+ #########################################################################
13
+ require 'helper'
14
+ require 'stringio'
15
+
16
+ class TC_Name_Stored < Test::Unit::TestCase
17
+ def setup
18
+ @test_file = StringIO.new
19
+ @workbook = WriteExcel.new(@test_file)
20
+ @worksheet = @workbook.add_worksheet
21
+ end
22
+
23
+ def test_print_area_name_with_simple_range
24
+ caption = " \tNAME for worksheet1.print_area('A1:B12')"
25
+ name = [0x06].pack('C')
26
+ encoding = 0
27
+ sheet_index = 1
28
+ formula = ['3B000000000B0000000100'].pack('H*')
29
+
30
+ result = @workbook.__send__("store_name",
31
+ name,
32
+ encoding,
33
+ sheet_index,
34
+ formula
35
+ )
36
+ target = [%w(
37
+ 18 00 1B 00 20 00 00 01 0B 00 00 00 01 00 00 00
38
+ 00 00 00 06 3B 00 00 00 00 0B 00 00 00 01 00
39
+ ).join('')].pack('H*')
40
+
41
+ # result = _unpack_name(result)
42
+ # target = _unpack_name(target)
43
+ assert_equal(unpack_record(target), unpack_record(result))
44
+ end
45
+
46
+ def test_print_area_name_with_simple_range_in_sheet_3
47
+ caption = " \tNAME for worksheet3.print_area('G7:H8')"
48
+ name = [0x06].pack('C')
49
+ encoding = 0
50
+ sheet_index = 3
51
+ formula = ['3B02000600070006000700'].pack('H*')
52
+
53
+ result = @workbook.__send__("store_name",
54
+ name,
55
+ encoding,
56
+ sheet_index,
57
+ formula
58
+ )
59
+
60
+ target = [%w(
61
+ 18 00 1B 00 20 00 00 01 0B 00 00 00 03 00 00 00
62
+ 00 00 00 06 3B 02 00 06 00 07 00 06 00 07 00
63
+ ).join('')].pack('H*')
64
+
65
+ # result = _unpack_name(result)
66
+ # target = _unpack_name(target)
67
+ assert_equal(unpack_record(target), unpack_record(result))
68
+ end
69
+
70
+ def test_for_repeat_rows_name
71
+ caption = " \tNAME for worksheet1.repeat_rows(0, 9)"
72
+ name = [0x07].pack('C')
73
+ encoding = 0
74
+ sheet_index = 1
75
+ formula = ['3B0000000009000000FF00'].pack('H*')
76
+
77
+ result = @workbook.__send__("store_name",
78
+ name,
79
+ encoding,
80
+ sheet_index,
81
+ formula
82
+ )
83
+
84
+ target = [%w(
85
+ 18 00 1B 00 20 00 00 01 0B 00 00 00 01 00 00 00
86
+ 00 00 00 07 3B 00 00 00 00 09 00 00 00 FF 00
87
+ ).join('')].pack('H*')
88
+
89
+ # result = _unpack_name(result)
90
+ # target = _unpack_name(target)
91
+ assert_equal(unpack_record(target), unpack_record(result))
92
+ end
93
+
94
+ def test_for_repeat_rows_name_on_sheet_3
95
+ caption = " \tNAME for worksheet3.repeat_rows(6, 7)"
96
+ name = [0x07].pack('C')
97
+ encoding = 0
98
+ sheet_index = 1
99
+ formula = ['3B0000000009000000FF00'].pack('H*')
100
+
101
+ result = @workbook.__send__("store_name",
102
+ name,
103
+ encoding,
104
+ sheet_index,
105
+ formula
106
+ )
107
+
108
+ target = [%w(
109
+ 18 00 1B 00 20 00 00 01 0B 00 00 00 01 00 00 00
110
+ 00 00 00 07 3B 00 00 00 00 09 00 00 00 FF 00
111
+ ).join('')].pack('H*')
112
+
113
+ # result = _unpack_name(result)
114
+ # target = _unpack_name(target)
115
+ assert_equal(unpack_record(target), unpack_record(result))
116
+ end
117
+
118
+ def test_for_repeat_columns_name
119
+ caption = " \tNAME for worksheet1.repeat_columns('A:J')"
120
+ name = [0x07].pack('C')
121
+ encoding = 0
122
+ sheet_index = 1
123
+ formula = ['3B00000000FFFF00000900'].pack('H*')
124
+
125
+ result = @workbook.__send__("store_name",
126
+ name,
127
+ encoding,
128
+ sheet_index,
129
+ formula
130
+ )
131
+
132
+ target = [%w(
133
+ 18 00 1B 00 20 00 00 01 0B 00 00 00 01 00 00 00
134
+ 00 00 00 07 3B 00 00 00 00 FF FF 00 00 09 00
135
+ ).join('')].pack('H*')
136
+
137
+ # result = _unpack_name(result)
138
+ # target = _unpack_name(target)
139
+ assert_equal(unpack_record(target), unpack_record(result))
140
+ end
141
+
142
+ def test_for_repeat_rows_and_repeat_columns_together_name
143
+ caption = " \tNAME for repeat_rows(1, 2) repeat_columns(3, 4)"
144
+ name = [0x07].pack('C')
145
+ encoding = 0
146
+ sheet_index = 1
147
+ formula = ['2917003B00000000FFFF030004003B0000010002000000FF0010'].pack('H*')
148
+
149
+ result = @workbook.__send__("store_name",
150
+ name,
151
+ encoding,
152
+ sheet_index,
153
+ formula
154
+ )
155
+
156
+ target = [%w(
157
+ 18 00 2A 00 20 00 00 01 1A 00 00 00 01 00 00 00
158
+ 00 00 00 07 29 17 00 3B 00 00 00 00 FF FF 03 00
159
+ 04 00 3B 00 00 01 00 02 00 00 00 FF 00 10
160
+ ).join('')].pack('H*')
161
+
162
+ # result = _unpack_name(result)
163
+ # target = _unpack_name(target)
164
+ assert_equal(unpack_record(target), unpack_record(result))
165
+ end
166
+
167
+ def test_for_print_area_name_with_simple_range
168
+ caption = " \tNAME for worksheet1.autofilter('A1:C5')"
169
+ name = [0x0D].pack('C')
170
+ encoding = 0
171
+ sheet_index = 1
172
+ formula = ['3B00000000040000000200'].pack('H*')
173
+
174
+ result = @workbook.__send__("store_name",
175
+ name,
176
+ encoding,
177
+ sheet_index,
178
+ formula
179
+ )
180
+
181
+ target = [%w(
182
+ 18 00 1B 00 21 00 00 01 0B 00 00 00 01 00 00 00
183
+ 00 00 00 0D 3B 00 00 00 00 04 00 00 00 02 00
184
+ ).join('')].pack('H*')
185
+
186
+ # result = _unpack_name(result)
187
+ # target = _unpack_name(target)
188
+ assert_equal(unpack_record(target), unpack_record(result))
189
+ end
190
+
191
+ def test_for_define_name_global_name
192
+ caption = " \tNAME for worksheet1.define_name('Foo', ...)"
193
+ name = 'Foo'
194
+ encoding = 0
195
+ sheet_index = 0
196
+ formula = ['3A000007000100'].pack('H*')
197
+
198
+ result = @workbook.__send__("store_name",
199
+ name,
200
+ encoding,
201
+ sheet_index,
202
+ formula
203
+ )
204
+
205
+ target = [%w(
206
+ 18 00 19 00 00 00 00 03 07 00 00 00 00 00 00 00
207
+ 00 00 00 46 6F 6F 3A 00 00 07 00 01 00
208
+ ).join('')].pack('H*')
209
+
210
+ # result = _unpack_name(result)
211
+ # target = _unpack_name(target)
212
+ assert_equal(unpack_record(target), unpack_record(result))
213
+ end
214
+
215
+ ###############################################################################
216
+ #
217
+ # _unpack_name()
218
+ #
219
+ # Unpack 1 or more NAME structures into a AoH for easier comparison.
220
+ #
221
+ def _unpack_name(data)
222
+ names = Array.new
223
+ while data.length > 0
224
+ name = Hash.new
225
+
226
+ name['record'] = data[0, 2].unpack('v')[0]
227
+ data[0, 2] = ''
228
+ name['length'] = data[0, 2].unpack('v')[0]
229
+ data[0, 2] = ''
230
+ name['flags'] = data[0, 2].unpack('v')[0]
231
+ data[0, 2] = ''
232
+ name['shortcut'] = data[0, 1].unpack('C')[0]
233
+ data[0, 1] = ''
234
+ name['str_len'] = data[0, 1].unpack('C')[0]
235
+ data[0, 1] = ''
236
+ name['formula_len'] = data[0, 2].unpack('v')[0]
237
+ data[0, 2] = ''
238
+ name['itals'] = data[0, 2].unpack('v')[0]
239
+ data[0, 2] = ''
240
+ name['sheet_index'] = data[0, 2].unpack('v')[0]
241
+ data[0, 2] = ''
242
+ name['menu_len'] = data[0, 1].unpack('C')[0]
243
+ data[0, 1] = ''
244
+ name['desc_len'] = data[0, 1].unpack('C')[0]
245
+ data[0, 1] = ''
246
+ name['help_len'] = data[0, 1].unpack('C')[0]
247
+ data[0, 1] = ''
248
+ name['status_len'] = data[0, 1].unpack('C')[0]
249
+ data[0, 1] = ''
250
+ name['encoding'] = data[0, 1].unpack('C')[0]
251
+ data[0, 1] = ''
252
+
253
+ # Decode the individual flag fields.
254
+ flag = Hash.new
255
+ flag['hidden'] = name['flags'] & 0x0001
256
+ flag['function'] = name['flags'] & 0x0002
257
+ flag['vb'] = name['flags'] & 0x0004
258
+ flag['macro'] = name['flags'] & 0x0008
259
+ flag['complex'] = name['flags'] & 0x0010
260
+ flag['builtin'] = name['flags'] & 0x0020
261
+ flag['group'] = name['flags'] & 0x0FC0
262
+ flag['binary'] = name['flags'] & 0x1000
263
+ name['flags'] = flag
264
+
265
+ # Decode the string part of the NAME structure.
266
+ if name['encoding'] == 1
267
+ # UTF-16 name. Leave in hex.
268
+ name['string'] = data[0, 2 * name['str_len']].unpack('H*')[0].upcase
269
+ data[0, 2 * name['str_len']] = ''
270
+ elsif flag['builtin'] != 0
271
+ # 1 digit builtin name. Leave in hex.
272
+ name['string'] = data[0, name['str_len']].unpack('H*')[0].upcase
273
+ data[0, name['str_len']] = ''
274
+ else
275
+ # ASCII name.
276
+ name['string'] = data[0, name['str_len']].unpack('C*').pack('C*')
277
+ data[0, name['str_len']] = ''
278
+ end
279
+
280
+ # Keep the formula as a hex string.
281
+ name['formula'] = data[0, name['formula_len']].unpack('H*')[0].upcase
282
+ data[0, name['formula_len']] = ''
283
+
284
+ names << name
285
+ end
286
+ names
287
+ end
288
+
289
+ def assert_hash_equal?(result, target)
290
+ assert_equal(result.keys.sort, target.keys.sort)
291
+ result.each_key do |key|
292
+ assert_equal(result[key], target[key])
293
+ end
294
+ end
295
+ end
@@ -0,0 +1,353 @@
1
+ # -*- coding: utf-8 -*-
2
+ ##########################################################################
3
+ # test_51_name_print_area.rb
4
+ #
5
+ # Tests for the Excel EXTERNSHEET and NAME records created by print_are()..
6
+ #
7
+ # reverse('ゥ'), September 2008, John McNamara, jmcnamara@cpan.org
8
+ #
9
+ # original written in Perl by John McNamara
10
+ # converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
11
+ #
12
+ #########################################################################
13
+ require 'helper'
14
+ require 'stringio'
15
+
16
+ class TC_Name_Print_Area < Test::Unit::TestCase
17
+ def setup
18
+ @test_file = StringIO.new
19
+ @workbook = WriteExcel.new(@test_file)
20
+ @workbook.not_using_tmpfile
21
+ end
22
+
23
+ def test_print_area_name_for_a_simple_range
24
+ worksheet1 = @workbook.add_worksheet
25
+ area = 'A1:B12'
26
+
27
+ worksheet1.print_area(area)
28
+
29
+ # Test the EXTERNSHEET record.
30
+ @workbook.__send__("calculate_extern_sizes")
31
+ @workbook.__send__("store_externsheet")
32
+
33
+ target = [%w(
34
+ 17 00 08 00 01 00 00 00 00 00 00 00
35
+ ).join('')].pack('H*')
36
+
37
+ caption = " \tExternsheet"
38
+ result = _unpack_externsheet(@workbook.data)
39
+ target = _unpack_externsheet(target)
40
+ assert_equal(target, result)
41
+
42
+ # Test the NAME record.
43
+ @workbook.clear_data_for_test
44
+ @workbook.__send__("store_names")
45
+
46
+ target = [%w(
47
+ 18 00 1B 00 20 00 00 01 0B 00 00 00 01 00 00 00
48
+ 00 00 00 06 3B 00 00 00 00 0B 00 00 00 01 00
49
+ ).join('')].pack('H*')
50
+
51
+ caption = " \t+ Name ( Sheet1!#{area} )";
52
+ result = _unpack_name(@workbook.data)
53
+ target = _unpack_name(target)
54
+ assert_equal(target, result)
55
+ end
56
+
57
+ def test_print_area_name_for_a_simple_row
58
+ worksheet1 = @workbook.add_worksheet
59
+ area = 'A1:IV1'
60
+
61
+ worksheet1.print_area(area)
62
+
63
+ # Test the EXTERNSHEET record.
64
+ @workbook.__send__("calculate_extern_sizes")
65
+ @workbook.__send__("store_externsheet")
66
+
67
+ target = [%w(
68
+ 17 00 08 00 01 00 00 00 00 00 00 00
69
+ ).join('')].pack('H*')
70
+
71
+ caption = " \tExternsheet"
72
+ result = _unpack_externsheet(@workbook.data)
73
+ target = _unpack_externsheet(target)
74
+ assert_equal(target, result, caption)
75
+
76
+ # Test the NAME record.
77
+ @workbook.clear_data_for_test
78
+ @workbook.__send__("store_names")
79
+
80
+ target = [%w(
81
+ 18 00 1B 00 20 00 00 01 0B 00 00 00 01 00 00 00
82
+ 00 00 00 06 3B 00 00 00 00 00 00 00 00 FF 00
83
+ ).join('')].pack('H*')
84
+
85
+ caption = " \t+ Name ( Sheet1!#{area} )";
86
+ result = _unpack_name(@workbook.data)
87
+ target = _unpack_name(target)
88
+ assert_equal(target, result, caption)
89
+ end
90
+
91
+ def test_print_area_name_for_a_simple_column
92
+ worksheet1 = @workbook.add_worksheet
93
+ area = 'A1:A65536'
94
+
95
+ worksheet1.print_area(area)
96
+
97
+ # Test the EXTERNSHEET record.
98
+ @workbook.__send__("calculate_extern_sizes")
99
+ @workbook.__send__("store_externsheet")
100
+
101
+ target = [%w(
102
+ 17 00 08 00 01 00 00 00 00 00 00 00
103
+ ).join('')].pack('H*')
104
+
105
+ caption = " \tExternsheet"
106
+ result = _unpack_externsheet(@workbook.data)
107
+ target = _unpack_externsheet(target)
108
+ assert_equal(target, result)
109
+
110
+ # Test the NAME record.
111
+ @workbook.clear_data_for_test
112
+ @workbook.__send__("store_names")
113
+
114
+ target = [%w(
115
+ 18 00 1B 00 20 00 00 01 0B 00 00 00 01 00 00 00
116
+ 00 00 00 06 3B 00 00 00 00 FF FF 00 00 00 00
117
+ ).join('')].pack('H*')
118
+
119
+ caption = " \t+ Name ( Sheet1!#{area} )";
120
+ result = _unpack_name(@workbook.data)
121
+ target = _unpack_name(target)
122
+ assert_equal(target, result)
123
+ end
124
+
125
+ def test_print_area_name_for_a_multiple_column
126
+ worksheet1 = @workbook.add_worksheet
127
+ area = 'A:H'
128
+
129
+ worksheet1.print_area(area)
130
+
131
+ # Test the EXTERNSHEET record.
132
+ @workbook.__send__("calculate_extern_sizes")
133
+ @workbook.__send__("store_externsheet")
134
+
135
+ target = [%w(
136
+ 17 00 08 00 01 00 00 00 00 00 00 00
137
+ ).join('')].pack('H*')
138
+
139
+ caption = " \tExternsheet"
140
+ result = _unpack_externsheet(@workbook.data)
141
+ target = _unpack_externsheet(target)
142
+ assert_equal(target, result)
143
+
144
+ # Test the NAME record.
145
+ @workbook.clear_data_for_test
146
+ @workbook.__send__("store_names")
147
+
148
+ target = [%w(
149
+ 18 00 1B 00 20 00 00 01 0B 00 00 00 01 00 00 00
150
+ 00 00 00 06 3B 00 00 00 00 FF FF 00 00 07 00
151
+ ).join('')].pack('H*')
152
+
153
+ caption = " \t+ Name ( Sheet1!#{area} )";
154
+ result = _unpack_name(@workbook.data)
155
+ target = _unpack_name(target)
156
+ assert_equal(target, result)
157
+ end
158
+
159
+ def test_ranges_on_multiple_sheets
160
+ worksheet1 = @workbook.add_worksheet
161
+ worksheet2 = @workbook.add_worksheet
162
+ worksheet3 = @workbook.add_worksheet
163
+
164
+ worksheet1.print_area('A1:B2')
165
+ worksheet2.print_area('D4:E5')
166
+ worksheet3.print_area('G7:H8')
167
+
168
+ # Test the EXTERNSHEET record.
169
+ @workbook.__send__("calculate_extern_sizes")
170
+ @workbook.__send__("store_externsheet")
171
+
172
+ target = [%w(
173
+ 17 00 14 00 03 00 00 00 00 00 00 00 00 00 01 00
174
+ 01 00 00 00 02 00 02 00
175
+ ).join('')].pack('H*')
176
+
177
+ caption = " \tExternsheet"
178
+ result = _unpack_externsheet(@workbook.data)
179
+ target = _unpack_externsheet(target)
180
+ assert_equal(target, result)
181
+
182
+ # Test the NAME record.
183
+ @workbook.clear_data_for_test
184
+ @workbook.__send__("store_names")
185
+
186
+ target = [%w(
187
+ 18 00 1B 00 20 00 00 01 0B 00 00 00 01 00 00 00
188
+ 00 00 00 06 3B 00 00 00 00 01 00 00 00 01 00
189
+
190
+ 18 00 1B 00 20 00 00 01 0B 00 00 00 02 00 00 00
191
+ 00 00 00 06 3B 01 00 03 00 04 00 03 00 04 00
192
+
193
+ 18 00 1B 00 20 00 00 01 0B 00 00 00 03 00 00 00
194
+ 00 00 00 06 3B 02 00 06 00 07 00 06 00 07 00
195
+ ).join('')].pack('H*')
196
+
197
+ caption = " \t+ Name ( Sheet1!A1:B2, Sheet2!D4:E5, Sheet3!G7:H8 )";
198
+ result = _unpack_name(@workbook.data)
199
+ target = _unpack_name(target)
200
+ assert_equal(target, result)
201
+ end
202
+
203
+ def test_ranges_on_multiple_sheets_with_sheets_spaced_out
204
+ worksheet1 = @workbook.add_worksheet
205
+ worksheet2 = @workbook.add_worksheet
206
+ worksheet3 = @workbook.add_worksheet
207
+ worksheet4 = @workbook.add_worksheet
208
+ worksheet5 = @workbook.add_worksheet
209
+
210
+ worksheet1.print_area('A1:B2')
211
+ worksheet3.print_area('D4:E5')
212
+ worksheet5.print_area('G7:H8')
213
+
214
+ # Test the EXTERNSHEET record.
215
+ @workbook.__send__("calculate_extern_sizes")
216
+ @workbook.__send__("store_externsheet")
217
+
218
+ target = [%w(
219
+ 17 00 14 00 03 00 00 00 00 00 00 00 00 00 02 00
220
+ 02 00 00 00 04 00 04 00
221
+ ).join('')].pack('H*')
222
+
223
+ caption = " \tExternsheet"
224
+ result = _unpack_externsheet(@workbook.data)
225
+ target = _unpack_externsheet(target)
226
+ assert_equal(target, result)
227
+
228
+ # Test the NAME record.
229
+ @workbook.clear_data_for_test
230
+ @workbook.__send__("store_names")
231
+
232
+ target = [%w(
233
+ 18 00 1B 00 20 00 00 01 0B 00 00 00 01 00 00 00
234
+ 00 00 00 06 3B 00 00 00 00 01 00 00 00 01 00
235
+
236
+ 18 00 1B 00 20 00 00 01 0B 00 00 00 03 00 00 00
237
+ 00 00 00 06 3B 01 00 03 00 04 00 03 00 04 00
238
+
239
+ 18 00 1B 00 20 00 00 01 0B 00 00 00 05 00 00 00
240
+ 00 00 00 06 3B 02 00 06 00 07 00 06 00 07 00
241
+ ).join('')].pack('H*')
242
+
243
+ caption = " \t+ Name ( Sheet1!A1:B2, Sheet3!D4:E5, Sheet5!G7:H8 )";
244
+ result = _unpack_name(@workbook.data)
245
+ target = _unpack_name(target)
246
+ assert_equal(target, result)
247
+ end
248
+
249
+ ###############################################################################
250
+ #
251
+ # _unpack_externsheet()
252
+ #
253
+ # Unpack the EXTERNSHEET recordfor easier comparison.
254
+ #
255
+ def _unpack_externsheet(data)
256
+ externsheet = Hash.new
257
+
258
+ externsheet['record'] = data[0, 2].unpack('v')[0]
259
+ data[0, 2] = ''
260
+ externsheet['length'] = data[0, 2].unpack('v')[0]
261
+ data[0, 2] = ''
262
+ externsheet['count'] = data[0, 2].unpack('v')[0]
263
+ data[0, 2] = ''
264
+ externsheet['array'] = [];
265
+
266
+ externsheet['count'].times do
267
+ externsheet['array'] << data[0, 6].unpack('vvv')
268
+ data[0, 6] = ''
269
+ end
270
+ externsheet
271
+ end
272
+
273
+ ###############################################################################
274
+ #
275
+ # _unpack_name()
276
+ #
277
+ # Unpack 1 or more NAME structures into a AoH for easier comparison.
278
+ #
279
+ def _unpack_name(data)
280
+ names = Array.new
281
+ while data.length > 0
282
+ name = Hash.new
283
+
284
+ name['record'] = data[0, 2].unpack('v')[0]
285
+ data[0, 2] = ''
286
+ name['length'] = data[0, 2].unpack('v')[0]
287
+ data[0, 2] = ''
288
+ name['flags'] = data[0, 2].unpack('v')[0]
289
+ data[0, 2] = ''
290
+ name['shortcut'] = data[0, 1].unpack('C')[0]
291
+ data[0, 1] = ''
292
+ name['str_len'] = data[0, 1].unpack('C')[0]
293
+ data[0, 1] = ''
294
+ name['formula_len'] = data[0, 2].unpack('v')[0]
295
+ data[0, 2] = ''
296
+ name['itals'] = data[0, 2].unpack('v')[0]
297
+ data[0, 2] = ''
298
+ name['sheet_index'] = data[0, 2].unpack('v')[0]
299
+ data[0, 2] = ''
300
+ name['menu_len'] = data[0, 1].unpack('C')[0]
301
+ data[0, 1] = ''
302
+ name['desc_len'] = data[0, 1].unpack('C')[0]
303
+ data[0, 1] = ''
304
+ name['help_len'] = data[0, 1].unpack('C')[0]
305
+ data[0, 1] = ''
306
+ name['status_len'] = data[0, 1].unpack('C')[0]
307
+ data[0, 1] = ''
308
+ name['encoding'] = data[0, 1].unpack('C')[0]
309
+ data[0, 1] = ''
310
+
311
+ # Decode the individual flag fields.
312
+ flag = Hash.new
313
+ flag['hidden'] = name['flags'] & 0x0001
314
+ flag['function'] = name['flags'] & 0x0002
315
+ flag['vb'] = name['flags'] & 0x0004
316
+ flag['macro'] = name['flags'] & 0x0008
317
+ flag['complex'] = name['flags'] & 0x0010
318
+ flag['builtin'] = name['flags'] & 0x0020
319
+ flag['group'] = name['flags'] & 0x0FC0
320
+ flag['binary'] = name['flags'] & 0x1000
321
+ name['flags'] = flag
322
+
323
+ # Decode the string part of the NAME structure.
324
+ if name['encoding'] == 1
325
+ # UTF-16 name. Leave in hex.
326
+ name['string'] = data[0, 2 * name['str_len']].unpack('H*')[0].upcase
327
+ data[0, 2 * name['str_len']] = ''
328
+ elsif flag['builtin'] != 0
329
+ # 1 digit builtin name. Leave in hex.
330
+ name['string'] = data[0, name['str_len']].unpack('H*')[0].upcase
331
+ data[0, name['str_len']] = ''
332
+ else
333
+ # ASCII name.
334
+ name['string'] = data[0, name['str_len']].unpack('C*').pack('C*')
335
+ data[0, name['str_len']] = ''
336
+ end
337
+
338
+ # Keep the formula as a hex string.
339
+ name['formula'] = data[0, name['formula_len']].unpack('H*')[0].upcase
340
+ data[0, name['formula_len']] = ''
341
+
342
+ names << name
343
+ end
344
+ names
345
+ end
346
+
347
+ def assert_hash_equal?(result, target)
348
+ assert_equal(result.keys.sort, target.keys.sort)
349
+ result.each_key do |key|
350
+ assert_equal(result[key], target[key])
351
+ end
352
+ end
353
+ end