write_xlsx 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. data/.document +5 -0
  2. data/.gitattributes +1 -0
  3. data/Gemfile +12 -0
  4. data/LICENSE.txt +20 -0
  5. data/README.rdoc +82 -0
  6. data/Rakefile +78 -0
  7. data/VERSION +1 -0
  8. data/examples/a_simple.rb +45 -0
  9. data/examples/array_formula.rb +33 -0
  10. data/examples/autofilter.rb +235 -0
  11. data/examples/chart_area.rb +59 -0
  12. data/examples/chart_bar.rb +59 -0
  13. data/examples/chart_column.rb +58 -0
  14. data/examples/chart_line.rb +59 -0
  15. data/examples/chart_pie.rb +49 -0
  16. data/examples/chart_scatter.rb +59 -0
  17. data/examples/chart_stock.rb +65 -0
  18. data/examples/colors.rb +130 -0
  19. data/examples/comments1.rb +12 -0
  20. data/examples/comments2.rb +335 -0
  21. data/examples/conditional_format.rb +67 -0
  22. data/examples/data_validate.rb +279 -0
  23. data/examples/defined_name.rb +28 -0
  24. data/examples/demo.rb +104 -0
  25. data/examples/diag_border.rb +26 -0
  26. data/examples/headers.rb +119 -0
  27. data/examples/hide_sheet.rb +30 -0
  28. data/examples/hyperlink1.rb +58 -0
  29. data/examples/indent.rb +28 -0
  30. data/examples/merge1.rb +38 -0
  31. data/examples/merge2.rb +48 -0
  32. data/examples/merge3.rb +43 -0
  33. data/examples/merge4.rb +82 -0
  34. data/examples/merge5.rb +70 -0
  35. data/examples/merge6.rb +48 -0
  36. data/examples/outline.rb +252 -0
  37. data/examples/properties.rb +33 -0
  38. data/examples/protection.rb +34 -0
  39. data/examples/rich_strings.rb +42 -0
  40. data/examples/right_to_left.rb +24 -0
  41. data/examples/tab_colors.rb +26 -0
  42. data/lib/write_xlsx.rb +77 -0
  43. data/lib/write_xlsx/chart.rb +3027 -0
  44. data/lib/write_xlsx/chart/area.rb +52 -0
  45. data/lib/write_xlsx/chart/bar.rb +126 -0
  46. data/lib/write_xlsx/chart/column.rb +132 -0
  47. data/lib/write_xlsx/chart/line.rb +51 -0
  48. data/lib/write_xlsx/chart/pie.rb +210 -0
  49. data/lib/write_xlsx/chart/scatter.rb +252 -0
  50. data/lib/write_xlsx/chart/stock.rb +134 -0
  51. data/lib/write_xlsx/chartsheet.rb +173 -0
  52. data/lib/write_xlsx/colors.rb +65 -0
  53. data/lib/write_xlsx/compatibility.rb +71 -0
  54. data/lib/write_xlsx/drawing.rb +547 -0
  55. data/lib/write_xlsx/format.rb +683 -0
  56. data/lib/write_xlsx/package/app.rb +218 -0
  57. data/lib/write_xlsx/package/comments.rb +221 -0
  58. data/lib/write_xlsx/package/content_types.rb +189 -0
  59. data/lib/write_xlsx/package/core.rb +196 -0
  60. data/lib/write_xlsx/package/packager.rb +510 -0
  61. data/lib/write_xlsx/package/relationships.rb +98 -0
  62. data/lib/write_xlsx/package/shared_strings.rb +96 -0
  63. data/lib/write_xlsx/package/styles.rb +705 -0
  64. data/lib/write_xlsx/package/theme.rb +45 -0
  65. data/lib/write_xlsx/package/vml.rb +386 -0
  66. data/lib/write_xlsx/package/xml_writer_simple.rb +90 -0
  67. data/lib/write_xlsx/utility.rb +113 -0
  68. data/lib/write_xlsx/workbook.rb +1488 -0
  69. data/lib/write_xlsx/worksheet.rb +6578 -0
  70. data/lib/write_xlsx/zip_file_utils.rb +98 -0
  71. data/test/chart/test_add_series.rb +113 -0
  72. data/test/chart/test_process_names.rb +27 -0
  73. data/test/chart/test_write_auto.rb +15 -0
  74. data/test/chart/test_write_ax_id.rb +15 -0
  75. data/test/chart/test_write_ax_pos.rb +15 -0
  76. data/test/chart/test_write_chart_space.rb +15 -0
  77. data/test/chart/test_write_cross_ax.rb +15 -0
  78. data/test/chart/test_write_crosses.rb +15 -0
  79. data/test/chart/test_write_format_code.rb +15 -0
  80. data/test/chart/test_write_idx.rb +15 -0
  81. data/test/chart/test_write_label_align.rb +15 -0
  82. data/test/chart/test_write_label_offset.rb +15 -0
  83. data/test/chart/test_write_lang.rb +15 -0
  84. data/test/chart/test_write_layout.rb +15 -0
  85. data/test/chart/test_write_legend.rb +16 -0
  86. data/test/chart/test_write_legend_pos.rb +15 -0
  87. data/test/chart/test_write_major_gridlines.rb +15 -0
  88. data/test/chart/test_write_marker.rb +17 -0
  89. data/test/chart/test_write_marker_size.rb +15 -0
  90. data/test/chart/test_write_marker_value.rb +16 -0
  91. data/test/chart/test_write_num_cache.rb +16 -0
  92. data/test/chart/test_write_num_fmt.rb +16 -0
  93. data/test/chart/test_write_number_format.rb +15 -0
  94. data/test/chart/test_write_order.rb +15 -0
  95. data/test/chart/test_write_orientation.rb +15 -0
  96. data/test/chart/test_write_page_margins.rb +15 -0
  97. data/test/chart/test_write_page_setup.rb +15 -0
  98. data/test/chart/test_write_plot_vis_only.rb +15 -0
  99. data/test/chart/test_write_pt.rb +16 -0
  100. data/test/chart/test_write_pt_count.rb +16 -0
  101. data/test/chart/test_write_series_formula.rb +16 -0
  102. data/test/chart/test_write_style.rb +41 -0
  103. data/test/chart/test_write_symbol.rb +16 -0
  104. data/test/chart/test_write_tick_lbl_pos.rb +16 -0
  105. data/test/chart/test_write_v.rb +16 -0
  106. data/test/drawing/test_drawing_chart_01.rb +50 -0
  107. data/test/drawing/test_drawing_image_01.rb +59 -0
  108. data/test/helper.rb +90 -0
  109. data/test/package/app/test_app01.rb +44 -0
  110. data/test/package/app/test_app02.rb +46 -0
  111. data/test/package/app/test_app03.rb +53 -0
  112. data/test/package/comments/test_comments01.rb +36 -0
  113. data/test/package/comments/test_write_text_t.rb +44 -0
  114. data/test/package/content_types/test_content_types.rb +35 -0
  115. data/test/package/content_types/test_write_default.rb +13 -0
  116. data/test/package/content_types/test_write_override.rb +13 -0
  117. data/test/package/core/test_core01.rb +28 -0
  118. data/test/package/core/test_core02.rb +42 -0
  119. data/test/package/relationships/test_relationships.rb +28 -0
  120. data/test/package/relationships/test_sheet_rels.rb +22 -0
  121. data/test/package/shared_strings/test_shared_strings01.rb +30 -0
  122. data/test/package/shared_strings/test_shared_strings02.rb +30 -0
  123. data/test/package/shared_strings/test_write_si.rb +13 -0
  124. data/test/package/shared_strings/test_write_sst.rb +15 -0
  125. data/test/package/styles/test_styles_01.rb +69 -0
  126. data/test/package/styles/test_styles_02.rb +104 -0
  127. data/test/package/styles/test_styles_03.rb +90 -0
  128. data/test/package/styles/test_styles_04.rb +216 -0
  129. data/test/package/styles/test_styles_05.rb +150 -0
  130. data/test/package/styles/test_styles_06.rb +104 -0
  131. data/test/package/styles/test_styles_07.rb +104 -0
  132. data/test/package/styles/test_styles_08.rb +109 -0
  133. data/test/package/styles/test_styles_09.rb +95 -0
  134. data/test/package/vml/test_vml_01.rb +42 -0
  135. data/test/package/vml/test_write_anchor.rb +14 -0
  136. data/test/package/vml/test_write_auto_fill.rb +14 -0
  137. data/test/package/vml/test_write_column.rb +14 -0
  138. data/test/package/vml/test_write_div.rb +14 -0
  139. data/test/package/vml/test_write_fill.rb +14 -0
  140. data/test/package/vml/test_write_idmap.rb +14 -0
  141. data/test/package/vml/test_write_move_with_cells.rb +14 -0
  142. data/test/package/vml/test_write_path.rb +22 -0
  143. data/test/package/vml/test_write_row.rb +14 -0
  144. data/test/package/vml/test_write_shadow.rb +14 -0
  145. data/test/package/vml/test_write_shapelayout.rb +14 -0
  146. data/test/package/vml/test_write_shapetype.rb +14 -0
  147. data/test/package/vml/test_write_size_with_cells.rb +14 -0
  148. data/test/package/vml/test_write_stroke.rb +14 -0
  149. data/test/package/vml/test_write_textbox.rb +14 -0
  150. data/test/perl_output/a_simple.xlsx +0 -0
  151. data/test/perl_output/array_formula.xlsx +0 -0
  152. data/test/perl_output/autofilter.xlsx +0 -0
  153. data/test/perl_output/chart_area.xlsx +0 -0
  154. data/test/perl_output/chart_bar.xlsx +0 -0
  155. data/test/perl_output/chart_column.xlsx +0 -0
  156. data/test/perl_output/chart_line.xlsx +0 -0
  157. data/test/perl_output/chart_pie.xlsx +0 -0
  158. data/test/perl_output/chart_scatter.xlsx +0 -0
  159. data/test/perl_output/chart_stock.xlsx +0 -0
  160. data/test/perl_output/comments1.xlsx +0 -0
  161. data/test/perl_output/comments2.xlsx +0 -0
  162. data/test/perl_output/conditional_format.xlsx +0 -0
  163. data/test/perl_output/data_validate.xlsx +0 -0
  164. data/test/perl_output/defined_name.xlsx +0 -0
  165. data/test/perl_output/demo.xlsx +0 -0
  166. data/test/perl_output/diag_border.xlsx +0 -0
  167. data/test/perl_output/fit_to_pages.xlsx +0 -0
  168. data/test/perl_output/headers.xlsx +0 -0
  169. data/test/perl_output/hide_sheet.xlsx +0 -0
  170. data/test/perl_output/hyperlink.xlsx +0 -0
  171. data/test/perl_output/indent.xlsx +0 -0
  172. data/test/perl_output/merge1.xlsx +0 -0
  173. data/test/perl_output/merge2.xlsx +0 -0
  174. data/test/perl_output/merge3.xlsx +0 -0
  175. data/test/perl_output/merge4.xlsx +0 -0
  176. data/test/perl_output/merge5.xlsx +0 -0
  177. data/test/perl_output/merge6.xlsx +0 -0
  178. data/test/perl_output/outline.xlsx +0 -0
  179. data/test/perl_output/print_scale.xlsx +0 -0
  180. data/test/perl_output/properties.xlsx +0 -0
  181. data/test/perl_output/protection.xlsx +0 -0
  182. data/test/perl_output/rich_strings.xlsx +0 -0
  183. data/test/perl_output/right_to_left.xlsx +0 -0
  184. data/test/perl_output/tab_colors.xlsx +0 -0
  185. data/test/test_delete_files.rb +37 -0
  186. data/test/test_example_match.rb +2281 -0
  187. data/test/test_xml_writer_simple.rb +63 -0
  188. data/test/workbook/test_get_chart_range.rb +59 -0
  189. data/test/workbook/test_sort_defined_names.rb +77 -0
  190. data/test/workbook/test_workbook_01.rb +29 -0
  191. data/test/workbook/test_workbook_02.rb +31 -0
  192. data/test/workbook/test_workbook_03.rb +31 -0
  193. data/test/workbook/test_workbook_new.rb +18 -0
  194. data/test/workbook/test_write_defined_name.rb +17 -0
  195. data/test/workbook/test_write_defined_names.rb +41 -0
  196. data/test/worksheet/test_calculate_spans.rb +58 -0
  197. data/test/worksheet/test_convert_date_time_01.rb +439 -0
  198. data/test/worksheet/test_convert_date_time_02.rb +478 -0
  199. data/test/worksheet/test_convert_date_time_03.rb +435 -0
  200. data/test/worksheet/test_extract_filter_tokens.rb +109 -0
  201. data/test/worksheet/test_parse_filter_expression.rb +143 -0
  202. data/test/worksheet/test_position_object.rb +50 -0
  203. data/test/worksheet/test_repeat_formula.rb +55 -0
  204. data/test/worksheet/test_worksheet_01.rb +32 -0
  205. data/test/worksheet/test_worksheet_02.rb +38 -0
  206. data/test/worksheet/test_worksheet_03.rb +44 -0
  207. data/test/worksheet/test_worksheet_04.rb +45 -0
  208. data/test/worksheet/test_write_array_formula_01.rb +99 -0
  209. data/test/worksheet/test_write_autofilter.rb +260 -0
  210. data/test/worksheet/test_write_brk.rb +18 -0
  211. data/test/worksheet/test_write_cell.rb +49 -0
  212. data/test/worksheet/test_write_cell_value.rb +33 -0
  213. data/test/worksheet/test_write_col_breaks.rb +27 -0
  214. data/test/worksheet/test_write_col_info.rb +95 -0
  215. data/test/worksheet/test_write_conditional_formatting.rb +72 -0
  216. data/test/worksheet/test_write_custom_filter.rb +18 -0
  217. data/test/worksheet/test_write_custom_filters.rb +25 -0
  218. data/test/worksheet/test_write_data_validation_01.rb +113 -0
  219. data/test/worksheet/test_write_data_validation_02.rb +528 -0
  220. data/test/worksheet/test_write_dimension.rb +94 -0
  221. data/test/worksheet/test_write_ext.rb +18 -0
  222. data/test/worksheet/test_write_ext_lst.rb +18 -0
  223. data/test/worksheet/test_write_filter.rb +18 -0
  224. data/test/worksheet/test_write_filter_column.rb +18 -0
  225. data/test/worksheet/test_write_filters.rb +32 -0
  226. data/test/worksheet/test_write_header_footer.rb +53 -0
  227. data/test/worksheet/test_write_hyperlink.rb +39 -0
  228. data/test/worksheet/test_write_hyperlinks.rb +27 -0
  229. data/test/worksheet/test_write_legacy_drawing.rb +19 -0
  230. data/test/worksheet/test_write_merge_cell.rb +18 -0
  231. data/test/worksheet/test_write_merge_cells.rb +192 -0
  232. data/test/worksheet/test_write_methods.rb +353 -0
  233. data/test/worksheet/test_write_mx_plv.rb +19 -0
  234. data/test/worksheet/test_write_page_margins.rb +98 -0
  235. data/test/worksheet/test_write_page_set_up_pr.rb +19 -0
  236. data/test/worksheet/test_write_page_setup.rb +54 -0
  237. data/test/worksheet/test_write_pane.rb +123 -0
  238. data/test/worksheet/test_write_phonetic_pr.rb +19 -0
  239. data/test/worksheet/test_write_print_options.rb +77 -0
  240. data/test/worksheet/test_write_row_breaks.rb +27 -0
  241. data/test/worksheet/test_write_row_element.rb +69 -0
  242. data/test/worksheet/test_write_selection.rb +18 -0
  243. data/test/worksheet/test_write_sheet_calc_pr.rb +18 -0
  244. data/test/worksheet/test_write_sheet_data.rb +18 -0
  245. data/test/worksheet/test_write_sheet_format_pr.rb +18 -0
  246. data/test/worksheet/test_write_sheet_pr.rb +36 -0
  247. data/test/worksheet/test_write_sheet_protection.rb +174 -0
  248. data/test/worksheet/test_write_sheet_view.rb +62 -0
  249. data/test/worksheet/test_write_sheet_view1.rb +64 -0
  250. data/test/worksheet/test_write_sheet_view2.rb +56 -0
  251. data/test/worksheet/test_write_sheet_view3.rb +83 -0
  252. data/test/worksheet/test_write_sheet_view4.rb +83 -0
  253. data/test/worksheet/test_write_sheet_view5.rb +74 -0
  254. data/test/worksheet/test_write_sheet_view6.rb +51 -0
  255. data/test/worksheet/test_write_sheet_view7.rb +71 -0
  256. data/test/worksheet/test_write_sheet_view8.rb +51 -0
  257. data/test/worksheet/test_write_sheet_view9.rb +51 -0
  258. data/test/worksheet/test_write_tab_color.rb +23 -0
  259. data/test/worksheet/test_write_worksheet.rb +19 -0
  260. data/write_xlsx.gemspec +308 -0
  261. metadata +363 -0
@@ -0,0 +1,63 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+ require 'write_xlsx/package/xml_writer_simple'
4
+
5
+ class TestXMLWriterSimple < Test::Unit::TestCase
6
+ def setup
7
+ @obj = Writexlsx::Package::XMLWriterSimple.new
8
+ end
9
+
10
+ def test_xml_decl
11
+ assert_equal(
12
+ %Q!<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n!,
13
+ @obj.xml_decl
14
+ )
15
+ end
16
+
17
+ def test_empty_tag
18
+ assert_equal('<foo />', @obj.empty_tag('foo'))
19
+ end
20
+
21
+ def test_empty_tag_with_xml_decl
22
+ expected = <<EOS
23
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
24
+ <foo />
25
+ EOS
26
+ assert_equal(expected, @obj.xml_decl << @obj.empty_tag('foo') << "\n")
27
+ end
28
+
29
+ def test_start_end_tag
30
+ assert_equal("<foo></foo>", @obj.start_tag('foo') << @obj.end_tag('foo'))
31
+ end
32
+
33
+ def test_attribute
34
+ assert_equal(
35
+ "<foo x=\"1&gt;2\" />", @obj.empty_tag("foo", ['x', '1>2'])
36
+ )
37
+ end
38
+
39
+ def test_character_data
40
+ assert_equal(
41
+ "<foo>&lt;tag&gt;&amp;amp;&lt;/tag&gt;</foo>",
42
+ @obj.start_tag('foo') << @obj.characters("<tag>&amp;</tag>") << @obj.end_tag('foo')
43
+ )
44
+ end
45
+
46
+ def test_data_element_with_empty_attr
47
+ assert_equal(
48
+ "<foo>data</foo>",
49
+ @obj.data_element('foo', 'data')
50
+ )
51
+ end
52
+
53
+ def test_data_element
54
+ attributes = [
55
+ 'name', '_xlnm.Print_Titles',
56
+ 'localSheetId', 0
57
+ ]
58
+ assert_equal(
59
+ "<definedName name=\"_xlnm.Print_Titles\" localSheetId=\"0\">Sheet1!$1:$1</definedName>",
60
+ @obj.data_element('definedName', 'Sheet1!$1:$1', attributes)
61
+ )
62
+ end
63
+ end
@@ -0,0 +1,59 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+ require 'write_xlsx'
4
+ require 'stringio'
5
+
6
+ class TestGetChartRange < Test::Unit::TestCase
7
+ def setup
8
+ @workbook = WriteXLSX.new(StringIO.new)
9
+ end
10
+
11
+ def test_get_chart_range_simple_formula
12
+ formula = 'Sheet1!$B$1:$B$5'
13
+ result = @workbook.__send__('get_chart_range', formula)
14
+ expected = ['Sheet1', 0, 1, 4, 1]
15
+ assert_equal(expected, result)
16
+ end
17
+
18
+ def test_get_chart_range_sheetname_with_space
19
+ formula = "'Sheet 1'!$B$1:$B$5"
20
+ result = @workbook.__send__('get_chart_range', formula)
21
+ expected = ['Sheet 1', 0, 1, 4, 1]
22
+ assert_equal(expected, result)
23
+ end
24
+
25
+ def test_get_chart_range_single_cell_range
26
+ formula = 'Sheet1!$B$1'
27
+ result = @workbook.__send__('get_chart_range', formula)
28
+ expected = ['Sheet1', 0, 1, 0, 1]
29
+ assert_equal(expected, result)
30
+ end
31
+
32
+ def test_get_chart_range_sheet_name_with_an_apostrophe
33
+ formula = "'Don''t'!$B$1:$B$5"
34
+ result = @workbook.__send__('get_chart_range', formula)
35
+ expected = ["Don't", 0, 1, 4, 1]
36
+ assert_equal(expected, result)
37
+ end
38
+
39
+ def test_get_chart_range_sheet_name_with_exclamation_mark
40
+ formula = "'aa!bb'!$B$1:$B$5"
41
+ result = @workbook.__send__('get_chart_range', formula)
42
+ expected = ['aa!bb', 0, 1, 4, 1]
43
+ assert_equal(expected, result)
44
+ end
45
+
46
+ def test_get_chart_range_sheet_name_with_invalid_range
47
+ formula = ''
48
+ result = @workbook.__send__('get_chart_range', formula)
49
+ expected = nil
50
+ assert_equal(expected, result)
51
+ end
52
+
53
+ def test_get_chart_range_sheet_name_with_invalid_2d_range
54
+ formula = 'Sheet1!$B$1:$F$5'
55
+ result = @workbook.__send__('get_chart_range', formula)
56
+ expected = nil
57
+ assert_equal(expected, result)
58
+ end
59
+ end
@@ -0,0 +1,77 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+ require 'write_xlsx'
4
+ require 'stringio'
5
+
6
+ class TestSortDefinedNames < Test::Unit::TestCase
7
+ def setup
8
+ @workbook = WriteXLSX.new(StringIO.new)
9
+ end
10
+
11
+ def test_sort_defined_names
12
+ sorted = @workbook.__send__('sort_defined_names', unsorted)
13
+ assert_equal(expected, sorted)
14
+ end
15
+
16
+ def test_extract_named_ranges
17
+ sorted = @workbook.__send__('sort_defined_names', unsorted)
18
+ assert_equal(@workbook.__send__('extract_named_ranges', sorted), named_ranges)
19
+ end
20
+
21
+ def unsorted
22
+ [
23
+ [ "Bar", 1, %q(Sheet2!$A$1) ],
24
+ [ "Bar", 0, %q(Sheet1!$A$1) ],
25
+ [ "Abc", -1, %q(Sheet1!$A$1) ],
26
+ [ "Baz", -1, %q(0.98) ],
27
+ [ "Bar", 2, %q('Sheet 3'!$A$1) ],
28
+ [ "Foo", -1, %q(Sheet1!$A$1) ],
29
+ [ "Print_Titler", -1, %q(Sheet1!$A$1) ],
30
+ [ "Print_Titlet", -1, %q(Sheet1!$A$1) ],
31
+ [ "_Fog", -1, %q(Sheet1!$A$1) ],
32
+ [ "_Egg", -1, %q(Sheet1!$A$1) ],
33
+ [ "_xlnm.Print_Titles", 0, %q(Sheet1!$1:$1) ],
34
+ [ "_xlnm._FilterDatabase", 0, %q(Sheet1!$G$1) ],
35
+ [ "aaa", 1, %q(Sheet2!$A$1) ],
36
+ [ "_xlnm.Print_Area", 0, %q(Sheet1!$A$1:$H$10) ],
37
+ [ "Car", 2, %q("Saab 900") ]
38
+ ]
39
+ end
40
+
41
+ def expected
42
+ [
43
+ [ "_Egg", -1, %q(Sheet1!$A$1) ],
44
+ [ "_xlnm._FilterDatabase", 0, %q(Sheet1!$G$1) ],
45
+ [ "_Fog", -1, %q(Sheet1!$A$1) ],
46
+ [ "aaa", 1, %q(Sheet2!$A$1) ],
47
+ [ "Abc", -1, %q(Sheet1!$A$1) ],
48
+ [ "Bar", 2, %q('Sheet 3'!$A$1) ],
49
+ [ "Bar", 0, %q(Sheet1!$A$1) ],
50
+ [ "Bar", 1, %q(Sheet2!$A$1) ],
51
+ [ "Baz", -1, %q(0.98) ],
52
+ [ "Car", 2, %q("Saab 900") ],
53
+ [ "Foo", -1, %q(Sheet1!$A$1) ],
54
+ [ "_xlnm.Print_Area", 0, %q(Sheet1!$A$1:$H$10) ],
55
+ [ "Print_Titler", -1, %q(Sheet1!$A$1) ],
56
+ [ "_xlnm.Print_Titles", 0, %q(Sheet1!$1:$1) ],
57
+ [ "Print_Titlet", -1, %q(Sheet1!$A$1) ]
58
+ ]
59
+ end
60
+
61
+ def named_ranges
62
+ [
63
+ %q(_Egg),
64
+ %q(_Fog),
65
+ %q(Sheet2!aaa),
66
+ %q(Abc),
67
+ %q('Sheet 3'!Bar),
68
+ %q(Sheet1!Bar),
69
+ %q(Sheet2!Bar),
70
+ %q(Foo),
71
+ %q(Sheet1!Print_Area),
72
+ %q(Print_Titler),
73
+ %q(Sheet1!Print_Titles),
74
+ %q(Print_Titlet)
75
+ ]
76
+ end
77
+ end
@@ -0,0 +1,29 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+ require 'write_xlsx/workbook'
4
+ require 'stringio'
5
+
6
+ class TestWorkbook01 < Test::Unit::TestCase
7
+ def test_workbook_01
8
+ workbook = Writexlsx::Workbook.new(StringIO.new)
9
+ workbook.add_worksheet
10
+ workbook.__send__('assemble_xml_file')
11
+ result = got_to_array(workbook.xml_str)
12
+ expected = expected_to_array(<<EOS
13
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
14
+ <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
15
+ <fileVersion appName="xl" lastEdited="4" lowestEdited="4" rupBuild="4505"/>
16
+ <workbookPr defaultThemeVersion="124226"/>
17
+ <bookViews>
18
+ <workbookView xWindow="240" yWindow="15" windowWidth="16095" windowHeight="9660"/>
19
+ </bookViews>
20
+ <sheets>
21
+ <sheet name="Sheet1" sheetId="1" r:id="rId1"/>
22
+ </sheets>
23
+ <calcPr calcId="124519"/>
24
+ </workbook>
25
+ EOS
26
+ )
27
+ assert_equal(expected, result)
28
+ end
29
+ end
@@ -0,0 +1,31 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+ require 'write_xlsx/workbook'
4
+ require 'stringio'
5
+
6
+ class TestWorkbook02 < Test::Unit::TestCase
7
+ def test_workbook_01
8
+ workbook = Writexlsx::Workbook.new(StringIO.new)
9
+ workbook.add_worksheet
10
+ workbook.add_worksheet
11
+ workbook.__send__('assemble_xml_file')
12
+ result = got_to_array(workbook.xml_str)
13
+ expected = expected_to_array(<<EOS
14
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
15
+ <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
16
+ <fileVersion appName="xl" lastEdited="4" lowestEdited="4" rupBuild="4505"/>
17
+ <workbookPr defaultThemeVersion="124226"/>
18
+ <bookViews>
19
+ <workbookView xWindow="240" yWindow="15" windowWidth="16095" windowHeight="9660"/>
20
+ </bookViews>
21
+ <sheets>
22
+ <sheet name="Sheet1" sheetId="1" r:id="rId1"/>
23
+ <sheet name="Sheet2" sheetId="2" r:id="rId2"/>
24
+ </sheets>
25
+ <calcPr calcId="124519"/>
26
+ </workbook>
27
+ EOS
28
+ )
29
+ assert_equal(expected, result)
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+ require 'write_xlsx/workbook'
4
+ require 'stringio'
5
+
6
+ class TestWorkbook03 < Test::Unit::TestCase
7
+ def test_workbook_03
8
+ workbook = Writexlsx::Workbook.new(StringIO.new)
9
+ workbook.add_worksheet('Non Default Name')
10
+ workbook.add_worksheet('Another Name')
11
+ workbook.__send__('assemble_xml_file')
12
+ result = got_to_array(workbook.xml_str)
13
+ expected = expected_to_array(<<EOS
14
+ <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
15
+ <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
16
+ <fileVersion appName="xl" lastEdited="4" lowestEdited="4" rupBuild="4505"/>
17
+ <workbookPr defaultThemeVersion="124226"/>
18
+ <bookViews>
19
+ <workbookView xWindow="240" yWindow="15" windowWidth="16095" windowHeight="9660"/>
20
+ </bookViews>
21
+ <sheets>
22
+ <sheet name="Non Default Name" sheetId="1" r:id="rId1"/>
23
+ <sheet name="Another Name" sheetId="2" r:id="rId2"/>
24
+ </sheets>
25
+ <calcPr calcId="124519"/>
26
+ </workbook>
27
+ EOS
28
+ )
29
+ assert_equal(expected, result)
30
+ end
31
+ end
@@ -0,0 +1,18 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+ require 'write_xlsx/workbook'
4
+ require 'stringio'
5
+
6
+ class TestWorkbookNew < Test::Unit::TestCase
7
+ def test_workbook_new_without_param_raise
8
+ assert_raise(ArgumentError) do
9
+ WriteXLSX.new()
10
+ end
11
+ end
12
+
13
+ def test_workbook_new_with_null_string_raise
14
+ assert_raise(RuntimeError) do
15
+ WriteXLSX.new('')
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+ require 'write_xlsx'
4
+ require 'stringio'
5
+
6
+ class TestWriteDefinedName < Test::Unit::TestCase
7
+ def setup
8
+ @workbook = WriteXLSX.new(StringIO.new)
9
+ end
10
+
11
+ def test_write_defined_name
12
+ @workbook.__send__('write_defined_name', ['_xlnm.Print_Titles', 0, 'Sheet1!$1:$1'])
13
+ result = @workbook.xml_str
14
+ expected = '<definedName name="_xlnm.Print_Titles" localSheetId="0">Sheet1!$1:$1</definedName>'
15
+ assert_equal(expected, result)
16
+ end
17
+ end
@@ -0,0 +1,41 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+ require 'write_xlsx'
4
+ require 'stringio'
5
+
6
+ class TestWriteDefinedNames < Test::Unit::TestCase
7
+ def setup
8
+ @workbook = WriteXLSX.new(StringIO.new)
9
+ end
10
+
11
+ def test_write_defined_names_simple
12
+ @workbook.instance_variable_set(:@defined_names, [ [ '_xlnm.Print_Titles', 0, 'Sheet1!$1:$1' ] ])
13
+ @workbook.__send__('write_defined_names')
14
+ result = @workbook.xml_str
15
+ expected = '<definedNames><definedName name="_xlnm.Print_Titles" localSheetId="0">Sheet1!$1:$1</definedName></definedNames>'
16
+ assert_equal(expected, result)
17
+ end
18
+
19
+ def test_write_defined_names_multiple_range
20
+ @workbook.add_worksheet
21
+ @workbook.add_worksheet
22
+ @workbook.add_worksheet('Sheet 3')
23
+
24
+ @workbook.define_name( %q('Sheet 3'!Bar), %q(='Sheet 3'!$A$1) )
25
+ @workbook.define_name( %q(Abc), %q(=Sheet1!$A$1) )
26
+ @workbook.define_name( %q(Baz), %q(=0.98) )
27
+ @workbook.define_name( %q(Sheet1!Bar), %q(=Sheet1!$A$1) )
28
+ @workbook.define_name( %q(Sheet2!Bar), %q(=Sheet2!$A$1) )
29
+ @workbook.define_name( %q(Sheet2!aaa), %q(=Sheet2!$A$1) )
30
+ @workbook.define_name( %q('Sheet 3'!car), %q(="Saab 900") )
31
+ @workbook.define_name( %q(_Egg), %q(=Sheet1!$A$1) )
32
+ @workbook.define_name( %q(_Fog), %q(=Sheet1!$A$1) )
33
+
34
+ @workbook.__send__('prepare_defined_names')
35
+ @workbook.__send__('write_defined_names')
36
+
37
+ result = got_to_array(@workbook.xml_str).join('')
38
+ expected = %q(<definedNames><definedName name="_Egg">Sheet1!$A$1</definedName><definedName name="_Fog">Sheet1!$A$1</definedName><definedName name="aaa" localSheetId="1">Sheet2!$A$1</definedName><definedName name="Abc">Sheet1!$A$1</definedName><definedName name="Bar" localSheetId="2">'Sheet 3'!$A$1</definedName><definedName name="Bar" localSheetId="0">Sheet1!$A$1</definedName><definedName name="Bar" localSheetId="1">Sheet2!$A$1</definedName><definedName name="Baz">0.98</definedName><definedName name="car" localSheetId="2">&quot;Saab 900&quot;</definedName></definedNames>)
39
+ assert_equal(expected, result)
40
+ end
41
+ end
@@ -0,0 +1,58 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+ require 'write_xlsx'
4
+ require 'stringio'
5
+
6
+ #
7
+ # class for test_calculate_spans
8
+ #
9
+ class CalcSpansTC
10
+ attr_reader :row, :col, :expected
11
+ def initialize(row, col, expected)
12
+ @row = row
13
+ @col = col
14
+ @expected = expected
15
+ end
16
+ end
17
+
18
+ class TestCalculateSpans < Test::Unit::TestCase
19
+ def setup
20
+ @workbook = WriteXLSX.new(StringIO.new)
21
+ @worksheet = @workbook.add_worksheet('')
22
+ end
23
+
24
+ def test_calculate_spans
25
+ [
26
+ CalcSpansTC.new( 0, 0, [ '1:16', '17:17' ]),
27
+ CalcSpansTC.new( 1, 0, [ '1:15', '16:17' ]),
28
+ CalcSpansTC.new( 2, 0, [ '1:14', '15:17' ]),
29
+ CalcSpansTC.new( 3, 0, [ '1:13', '14:17' ]),
30
+ CalcSpansTC.new( 4, 0, [ '1:12', '13:17' ]),
31
+ CalcSpansTC.new( 5, 0, [ '1:11', '12:17' ]),
32
+ CalcSpansTC.new( 6, 0, [ '1:10', '11:17' ]),
33
+ CalcSpansTC.new( 7, 0, [ '1:9', '10:17' ]),
34
+ CalcSpansTC.new( 8, 0, [ '1:8', '9:17' ]),
35
+ CalcSpansTC.new( 9, 0, [ '1:7', '8:17' ]),
36
+ CalcSpansTC.new(10, 0, [ '1:6', '7:17' ]),
37
+ CalcSpansTC.new(11, 0, [ '1:5', '6:17' ]),
38
+ CalcSpansTC.new(12, 0, [ '1:4', '5:17' ]),
39
+ CalcSpansTC.new(13, 0, [ '1:3', '4:17' ]),
40
+ CalcSpansTC.new(14, 0, [ '1:2', '3:17' ]),
41
+ CalcSpansTC.new(15, 0, [ '1:1', '2:17' ]),
42
+ CalcSpansTC.new(16, 0, [ nil, '1:16', '17:17' ]),
43
+ CalcSpansTC.new(16, 1, [ nil, '2:17', '18:18' ])
44
+ ].each do |t|
45
+ worksheet = @workbook.add_worksheet('')
46
+ r = t.row
47
+ col = t.col
48
+ (r .. r + 16).each do |row|
49
+ worksheet.write(row, col, 1)
50
+ col += 1
51
+ end
52
+ worksheet.__send__('calculate_spans')
53
+ result = worksheet.instance_variable_get(:@row_spans)
54
+ expected = t.expected
55
+ assert_equal(expected, result, "WHEN row: #{t.row}, col: #{t.col}")
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,439 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'helper'
3
+ require 'write_xlsx/workbook'
4
+ require 'write_xlsx/worksheet'
5
+ require 'stringio'
6
+
7
+ class TestConvertDateTime01 < Test::Unit::TestCase
8
+ def setup
9
+ @workbook = WriteXLSX.new(StringIO.new)
10
+ @worksheet = @workbook.add_worksheet('')
11
+ end
12
+
13
+ def test_convert_date_time
14
+ lines = data_for_test.split(/\n/)
15
+ until lines.empty?
16
+ line = lines.shift
17
+ if line =~ /"DateTime">([^<]+)/
18
+ date_time = $1
19
+ if lines.shift =~ /"Number">([^<]+)/
20
+ number = 0 + $1.to_f
21
+ result = @worksheet.convert_date_time(date_time)
22
+ assert fit_cmp(number, result)
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ def data_for_test
29
+ <<EOS
30
+ # Test data taken from Excel in XML format.
31
+ <Row>
32
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">1899-12-31T00:00:00.000</Data></Cell>
33
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">0</Data></Cell>
34
+ </Row>
35
+ <Row>
36
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">1982-08-25T00:15:20.213</Data></Cell>
37
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">30188.010650613425</Data></Cell>
38
+ </Row>
39
+ <Row>
40
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">2065-04-19T00:16:48.290</Data></Cell>
41
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">60376.011670023145</Data></Cell>
42
+ </Row>
43
+ <Row>
44
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">2147-12-15T00:55:25.446</Data></Cell>
45
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">90565.038488958337</Data></Cell>
46
+ </Row>
47
+ <Row>
48
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">2230-08-10T01:02:46.891</Data></Cell>
49
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">120753.04359827546</Data></Cell>
50
+ </Row>
51
+ <Row>
52
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">2313-04-06T01:04:15.597</Data></Cell>
53
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">150942.04462496529</Data></Cell>
54
+ </Row>
55
+ <Row>
56
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">2395-11-30T01:09:40.889</Data></Cell>
57
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">181130.04838991899</Data></Cell>
58
+ </Row>
59
+ <Row>
60
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">2478-07-25T01:11:32.560</Data></Cell>
61
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">211318.04968240741</Data></Cell>
62
+ </Row>
63
+ <Row>
64
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">2561-03-21T01:30:19.169</Data></Cell>
65
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">241507.06272186342</Data></Cell>
66
+ </Row>
67
+ <Row>
68
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">2643-11-15T01:48:25.580</Data></Cell>
69
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">271695.07529606484</Data></Cell>
70
+ </Row>
71
+ <Row>
72
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">2726-07-12T02:03:31.919</Data></Cell>
73
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">301884.08578609955</Data></Cell>
74
+ </Row>
75
+ <Row>
76
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">2809-03-06T02:11:11.986</Data></Cell>
77
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">332072.09111094906</Data></Cell>
78
+ </Row>
79
+ <Row>
80
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">2891-10-31T02:24:37.095</Data></Cell>
81
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">362261.10042934027</Data></Cell>
82
+ </Row>
83
+ <Row>
84
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">2974-06-26T02:35:07.220</Data></Cell>
85
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">392449.10772245371</Data></Cell>
86
+ </Row>
87
+ <Row>
88
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">3057-02-19T02:45:12.109</Data></Cell>
89
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">422637.1147234838</Data></Cell>
90
+ </Row>
91
+ <Row>
92
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">3139-10-17T03:06:39.990</Data></Cell>
93
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">452826.12962951389</Data></Cell>
94
+ </Row>
95
+ <Row>
96
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">3222-06-11T03:08:08.251</Data></Cell>
97
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">483014.13065105322</Data></Cell>
98
+ </Row>
99
+ <Row>
100
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">3305-02-05T03:19:12.576</Data></Cell>
101
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">513203.13834</Data></Cell>
102
+ </Row>
103
+ <Row>
104
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">3387-10-01T03:29:42.574</Data></Cell>
105
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">543391.14563164348</Data></Cell>
106
+ </Row>
107
+ <Row>
108
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">3470-05-27T03:37:30.813</Data></Cell>
109
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">573579.15105107636</Data></Cell>
110
+ </Row>
111
+ <Row>
112
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">3553-01-21T04:14:38.231</Data></Cell>
113
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">603768.17683137732</Data></Cell>
114
+ </Row>
115
+ <Row>
116
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">3635-09-16T04:16:28.559</Data></Cell>
117
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">633956.17810832174</Data></Cell>
118
+ </Row>
119
+ <Row>
120
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">3718-05-13T04:17:58.222</Data></Cell>
121
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">664145.17914608796</Data></Cell>
122
+ </Row>
123
+ <Row>
124
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">3801-01-06T04:21:41.794</Data></Cell>
125
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">694333.18173372687</Data></Cell>
126
+ </Row>
127
+ <Row>
128
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">3883-09-02T04:56:35.792</Data></Cell>
129
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">724522.20596981479</Data></Cell>
130
+ </Row>
131
+ <Row>
132
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">3966-04-28T05:25:14.885</Data></Cell>
133
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">754710.2258667245</Data></Cell>
134
+ </Row>
135
+ <Row>
136
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">4048-12-21T05:26:05.724</Data></Cell>
137
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">784898.22645513888</Data></Cell>
138
+ </Row>
139
+ <Row>
140
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">4131-08-18T05:46:44.068</Data></Cell>
141
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">815087.24078782403</Data></Cell>
142
+ </Row>
143
+ <Row>
144
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">4214-04-13T05:48:01.141</Data></Cell>
145
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">845275.24167987274</Data></Cell>
146
+ </Row>
147
+ <Row>
148
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">4296-12-07T05:53:52.315</Data></Cell>
149
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">875464.24574438657</Data></Cell>
150
+ </Row>
151
+ <Row>
152
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">4379-08-03T06:14:48.580</Data></Cell>
153
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">905652.26028449077</Data></Cell>
154
+ </Row>
155
+ <Row>
156
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">4462-03-28T06:46:15.738</Data></Cell>
157
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">935840.28212659725</Data></Cell>
158
+ </Row>
159
+ <Row>
160
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">4544-11-22T07:31:20.407</Data></Cell>
161
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">966029.31343063654</Data></Cell>
162
+ </Row>
163
+ <Row>
164
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">4627-07-19T07:58:33.754</Data></Cell>
165
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">996217.33233511576</Data></Cell>
166
+ </Row>
167
+ <Row>
168
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">4710-03-15T08:07:43.130</Data></Cell>
169
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1026406.3386936343</Data></Cell>
170
+ </Row>
171
+ <Row>
172
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">4792-11-07T08:29:11.091</Data></Cell>
173
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1056594.3536005903</Data></Cell>
174
+ </Row>
175
+ <Row>
176
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">4875-07-04T09:08:15.328</Data></Cell>
177
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1086783.3807329629</Data></Cell>
178
+ </Row>
179
+ <Row>
180
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">4958-02-27T09:30:41.781</Data></Cell>
181
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1116971.3963169097</Data></Cell>
182
+ </Row>
183
+ <Row>
184
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">5040-10-23T09:34:04.462</Data></Cell>
185
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1147159.3986627546</Data></Cell>
186
+ </Row>
187
+ <Row>
188
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">5123-06-20T09:37:23.945</Data></Cell>
189
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1177348.4009715857</Data></Cell>
190
+ </Row>
191
+ <Row>
192
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">5206-02-12T09:37:56.655</Data></Cell>
193
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1207536.4013501736</Data></Cell>
194
+ </Row>
195
+ <Row>
196
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">5288-10-08T09:45:12.230</Data></Cell>
197
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1237725.406391551</Data></Cell>
198
+ </Row>
199
+ <Row>
200
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">5371-06-04T09:54:14.782</Data></Cell>
201
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1267913.412671088</Data></Cell>
202
+ </Row>
203
+ <Row>
204
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">5454-01-28T09:54:22.108</Data></Cell>
205
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1298101.4127558796</Data></Cell>
206
+ </Row>
207
+ <Row>
208
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">5536-09-24T10:01:36.151</Data></Cell>
209
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1328290.4177795255</Data></Cell>
210
+ </Row>
211
+ <Row>
212
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">5619-05-20T12:09:48.602</Data></Cell>
213
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1358478.5068125231</Data></Cell>
214
+ </Row>
215
+ <Row>
216
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">5702-01-14T12:34:08.549</Data></Cell>
217
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1388667.5237100578</Data></Cell>
218
+ </Row>
219
+ <Row>
220
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">5784-09-08T12:56:06.495</Data></Cell>
221
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1418855.5389640625</Data></Cell>
222
+ </Row>
223
+ <Row>
224
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">5867-05-06T12:58:58.217</Data></Cell>
225
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1449044.5409515856</Data></Cell>
226
+ </Row>
227
+ <Row>
228
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">5949-12-30T12:59:54.263</Data></Cell>
229
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1479232.5416002662</Data></Cell>
230
+ </Row>
231
+ <Row>
232
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">6032-08-24T13:34:41.331</Data></Cell>
233
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1509420.5657561459</Data></Cell>
234
+ </Row>
235
+ <Row>
236
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">6115-04-21T13:58:28.601</Data></Cell>
237
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1539609.5822754744</Data></Cell>
238
+ </Row>
239
+ <Row>
240
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">6197-12-14T14:02:16.899</Data></Cell>
241
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1569797.5849178126</Data></Cell>
242
+ </Row>
243
+ <Row>
244
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">6280-08-10T14:36:17.444</Data></Cell>
245
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1599986.6085352316</Data></Cell>
246
+ </Row>
247
+ <Row>
248
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">6363-04-06T14:37:57.451</Data></Cell>
249
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1630174.60969272</Data></Cell>
250
+ </Row>
251
+ <Row>
252
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">6445-11-30T14:57:42.757</Data></Cell>
253
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1660363.6234115392</Data></Cell>
254
+ </Row>
255
+ <Row>
256
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">6528-07-26T15:10:48.307</Data></Cell>
257
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1690551.6325035533</Data></Cell>
258
+ </Row>
259
+ <Row>
260
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">6611-03-22T15:14:39.890</Data></Cell>
261
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1720739.635183912</Data></Cell>
262
+ </Row>
263
+ <Row>
264
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">6693-11-15T15:19:47.988</Data></Cell>
265
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1750928.6387498612</Data></Cell>
266
+ </Row>
267
+ <Row>
268
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">6776-07-11T16:04:24.344</Data></Cell>
269
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1781116.6697262037</Data></Cell>
270
+ </Row>
271
+ <Row>
272
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">6859-03-07T16:22:23.952</Data></Cell>
273
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1811305.6822216667</Data></Cell>
274
+ </Row>
275
+ <Row>
276
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">6941-10-31T16:29:55.999</Data></Cell>
277
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1841493.6874536921</Data></Cell>
278
+ </Row>
279
+ <Row>
280
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">7024-06-26T16:58:20.259</Data></Cell>
281
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1871681.7071789235</Data></Cell>
282
+ </Row>
283
+ <Row>
284
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">7107-02-21T17:04:02.415</Data></Cell>
285
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1901870.7111390624</Data></Cell>
286
+ </Row>
287
+ <Row>
288
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">7189-10-16T17:18:29.630</Data></Cell>
289
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1932058.7211762732</Data></Cell>
290
+ </Row>
291
+ <Row>
292
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">7272-06-11T17:47:21.323</Data></Cell>
293
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1962247.7412190163</Data></Cell>
294
+ </Row>
295
+ <Row>
296
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">7355-02-05T17:53:29.866</Data></Cell>
297
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">1992435.7454845603</Data></Cell>
298
+ </Row>
299
+ <Row>
300
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">7437-10-02T17:53:41.076</Data></Cell>
301
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2022624.7456143056</Data></Cell>
302
+ </Row>
303
+ <Row>
304
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">7520-05-28T17:55:06.044</Data></Cell>
305
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2052812.7465977315</Data></Cell>
306
+ </Row>
307
+ <Row>
308
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">7603-01-21T18:14:49.151</Data></Cell>
309
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2083000.7602910995</Data></Cell>
310
+ </Row>
311
+ <Row>
312
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">7685-09-16T18:17:45.738</Data></Cell>
313
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2113189.7623349307</Data></Cell>
314
+ </Row>
315
+ <Row>
316
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">7768-05-12T18:29:59.700</Data></Cell>
317
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2143377.7708298611</Data></Cell>
318
+ </Row>
319
+ <Row>
320
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">7851-01-07T18:33:21.233</Data></Cell>
321
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2173566.773162419</Data></Cell>
322
+ </Row>
323
+ <Row>
324
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">7933-09-02T19:14:24.673</Data></Cell>
325
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2203754.8016744559</Data></Cell>
326
+ </Row>
327
+ <Row>
328
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">8016-04-27T19:17:12.816</Data></Cell>
329
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2233942.8036205554</Data></Cell>
330
+ </Row>
331
+ <Row>
332
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">8098-12-22T19:23:36.418</Data></Cell>
333
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2264131.8080603937</Data></Cell>
334
+ </Row>
335
+ <Row>
336
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">8181-08-17T19:46:25.908</Data></Cell>
337
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2294319.8239109721</Data></Cell>
338
+ </Row>
339
+ <Row>
340
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">8264-04-13T20:07:47.314</Data></Cell>
341
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2324508.8387420601</Data></Cell>
342
+ </Row>
343
+ <Row>
344
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">8346-12-08T20:31:37.603</Data></Cell>
345
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2354696.855296331</Data></Cell>
346
+ </Row>
347
+ <Row>
348
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">8429-08-03T20:39:57.770</Data></Cell>
349
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2384885.8610853008</Data></Cell>
350
+ </Row>
351
+ <Row>
352
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">8512-03-29T20:50:17.067</Data></Cell>
353
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2415073.8682530904</Data></Cell>
354
+ </Row>
355
+ <Row>
356
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">8594-11-22T21:02:57.827</Data></Cell>
357
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2445261.8770581828</Data></Cell>
358
+ </Row>
359
+ <Row>
360
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">8677-07-19T21:23:05.519</Data></Cell>
361
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2475450.8910360998</Data></Cell>
362
+ </Row>
363
+ <Row>
364
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">8760-03-14T21:34:49.572</Data></Cell>
365
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2505638.8991848612</Data></Cell>
366
+ </Row>
367
+ <Row>
368
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">8842-11-08T21:39:05.944</Data></Cell>
369
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2535827.9021521294</Data></Cell>
370
+ </Row>
371
+ <Row>
372
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">8925-07-04T21:39:18.426</Data></Cell>
373
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2566015.9022965971</Data></Cell>
374
+ </Row>
375
+ <Row>
376
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">9008-02-28T21:46:07.769</Data></Cell>
377
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2596203.9070343636</Data></Cell>
378
+ </Row>
379
+ <Row>
380
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">9090-10-24T21:57:55.662</Data></Cell>
381
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2626392.9152275696</Data></Cell>
382
+ </Row>
383
+ <Row>
384
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">9173-06-19T22:19:11.732</Data></Cell>
385
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2656580.9299968979</Data></Cell>
386
+ </Row>
387
+ <Row>
388
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">9256-02-13T22:23:51.376</Data></Cell>
389
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2686769.9332335186</Data></Cell>
390
+ </Row>
391
+ <Row>
392
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">9338-10-09T22:27:58.771</Data></Cell>
393
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2716957.9360968866</Data></Cell>
394
+ </Row>
395
+ <Row>
396
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">9421-06-05T22:43:30.392</Data></Cell>
397
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2747146.9468795368</Data></Cell>
398
+ </Row>
399
+ <Row>
400
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">9504-01-30T22:48:25.834</Data></Cell>
401
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2777334.9502990046</Data></Cell>
402
+ </Row>
403
+ <Row>
404
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">9586-09-24T22:53:51.727</Data></Cell>
405
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2807522.9540709145</Data></Cell>
406
+ </Row>
407
+ <Row>
408
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">9669-05-20T23:12:56.536</Data></Cell>
409
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2837711.9673210187</Data></Cell>
410
+ </Row>
411
+ <Row>
412
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">9752-01-14T23:15:54.109</Data></Cell>
413
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2867899.9693762613</Data></Cell>
414
+ </Row>
415
+ <Row>
416
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">9834-09-10T23:17:12.632</Data></Cell>
417
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2898088.9702850925</Data></Cell>
418
+ </Row>
419
+ <Row>
420
+ <Cell ss:StyleID="s21"><Data ss:Type="DateTime">9999-12-31T23:59:59.000</Data></Cell>
421
+ <Cell ss:StyleID="s22" ss:Formula="=RC[-1]"><Data ss:Type="Number">2958465.999988426</Data></Cell>
422
+ </Row>
423
+ EOS
424
+ end
425
+
426
+ def test_fit_cmp_pass
427
+ result = @worksheet.convert_date_time('1899-12-31T00:00:00.0004')
428
+ assert fit_cmp(0, result)
429
+ end
430
+
431
+ def test_fit_cmp_fail
432
+ result = @worksheet.convert_date_time('1899-12-31T00:00:00.0005')
433
+ assert !fit_cmp(0, result)
434
+ end
435
+
436
+ def fit_cmp(a, b)
437
+ (a - b).abs < 0.5 / ( 24 * 60 * 60 * 1000 )
438
+ end
439
+ end