ricardoo27-writeexcel 0.6.12.1

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