writeexcel 0.6.6 → 0.6.7

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 (230) hide show
  1. data/.document +0 -0
  2. data/.gitattributes +0 -0
  3. data/README.rdoc +9 -35
  4. data/Rakefile +0 -0
  5. data/VERSION +1 -1
  6. data/charts/chartex.rb +0 -0
  7. data/charts/demo1.rb +0 -0
  8. data/charts/demo101.bin +0 -0
  9. data/charts/demo2.rb +0 -0
  10. data/charts/demo201.bin +0 -0
  11. data/charts/demo3.rb +0 -0
  12. data/charts/demo301.bin +0 -0
  13. data/charts/demo4.rb +0 -0
  14. data/charts/demo401.bin +0 -0
  15. data/charts/demo5.rb +0 -0
  16. data/charts/demo501.bin +0 -0
  17. data/examples/a_simple.rb +0 -0
  18. data/examples/autofilter.rb +0 -0
  19. data/examples/bigfile.rb +0 -0
  20. data/examples/chart_area.rb +0 -0
  21. data/examples/chart_bar.rb +0 -0
  22. data/examples/chart_column.rb +0 -0
  23. data/examples/chart_line.rb +0 -0
  24. data/examples/chart_pie.rb +0 -0
  25. data/examples/chart_scatter.rb +0 -0
  26. data/examples/chart_stock.rb +0 -0
  27. data/examples/chess.rb +0 -0
  28. data/examples/colors.rb +0 -0
  29. data/examples/comments1.rb +0 -0
  30. data/examples/comments2.rb +0 -0
  31. data/examples/copyformat.rb +0 -0
  32. data/examples/data_validate.rb +0 -0
  33. data/examples/date_time.rb +0 -0
  34. data/examples/defined_name.rb +0 -0
  35. data/examples/demo.rb +0 -0
  36. data/examples/diag_border.rb +0 -0
  37. data/examples/formats.rb +0 -0
  38. data/examples/formula_result.rb +0 -0
  39. data/examples/header.rb +0 -0
  40. data/examples/hide_sheet.rb +0 -0
  41. data/examples/hyperlink.rb +0 -0
  42. data/examples/images.rb +0 -0
  43. data/examples/indent.rb +0 -0
  44. data/examples/merge1.rb +0 -0
  45. data/examples/merge2.rb +0 -0
  46. data/examples/merge3.rb +0 -0
  47. data/examples/merge4.rb +0 -0
  48. data/examples/merge5.rb +0 -0
  49. data/examples/merge6.rb +0 -0
  50. data/examples/outline.rb +0 -0
  51. data/examples/outline_collapsed.rb +0 -0
  52. data/examples/panes.rb +0 -0
  53. data/examples/properties.rb +0 -0
  54. data/examples/properties_jp.rb +0 -0
  55. data/examples/protection.rb +0 -0
  56. data/examples/regions.rb +0 -0
  57. data/examples/repeat.rb +0 -0
  58. data/examples/republic.png +0 -0
  59. data/examples/right_to_left.rb +0 -0
  60. data/examples/row_wrap.rb +0 -0
  61. data/examples/set_first_sheet.rb +14 -0
  62. data/examples/stats.rb +0 -0
  63. data/examples/stocks.rb +0 -0
  64. data/examples/tab_colors.rb +0 -0
  65. data/examples/utf8.rb +0 -0
  66. data/examples/write_arrays.rb +0 -0
  67. data/html/en/doc_en.html +5941 -0
  68. data/html/images/a_simple.jpg +0 -0
  69. data/html/images/area1.jpg +0 -0
  70. data/html/images/bar1.jpg +0 -0
  71. data/html/images/chart_area.xls +0 -0
  72. data/html/images/column1.jpg +0 -0
  73. data/html/images/data_validation.jpg +0 -0
  74. data/html/images/line1.jpg +0 -0
  75. data/html/images/pie1.jpg +0 -0
  76. data/html/images/regions.jpg +0 -0
  77. data/html/images/scatter1.jpg +0 -0
  78. data/html/images/stats.jpg +0 -0
  79. data/html/images/stock1.jpg +0 -0
  80. data/html/images/stocks.jpg +0 -0
  81. data/html/index.html +16 -0
  82. data/html/style.css +433 -0
  83. data/lib/writeexcel/biffwriter.rb +5 -0
  84. data/lib/writeexcel/caller_info.rb +0 -0
  85. data/lib/writeexcel/chart.rb +8 -219
  86. data/lib/writeexcel/charts/area.rb +0 -0
  87. data/lib/writeexcel/charts/bar.rb +0 -0
  88. data/lib/writeexcel/charts/column.rb +0 -0
  89. data/lib/writeexcel/charts/external.rb +0 -0
  90. data/lib/writeexcel/charts/line.rb +0 -0
  91. data/lib/writeexcel/charts/pie.rb +0 -0
  92. data/lib/writeexcel/charts/scatter.rb +0 -0
  93. data/lib/writeexcel/charts/stock.rb +0 -0
  94. data/lib/writeexcel/colors.rb +4 -0
  95. data/lib/writeexcel/compatibility.rb +0 -0
  96. data/lib/writeexcel/debug_info.rb +0 -0
  97. data/lib/writeexcel/excelformula.y +0 -0
  98. data/lib/writeexcel/excelformulaparser.rb +0 -0
  99. data/lib/writeexcel/format.rb +2 -28
  100. data/lib/writeexcel/formula.rb +4 -70
  101. data/lib/writeexcel/helper.rb +0 -0
  102. data/lib/writeexcel/image.rb +158 -0
  103. data/lib/writeexcel/olewriter.rb +0 -0
  104. data/lib/writeexcel/properties.rb +0 -0
  105. data/lib/writeexcel/storage_lite.rb +0 -0
  106. data/lib/writeexcel/workbook.rb +434 -824
  107. data/lib/writeexcel/worksheet.rb +4194 -4718
  108. data/lib/writeexcel/write_file.rb +0 -0
  109. data/lib/writeexcel.rb +0 -0
  110. data/test/excelfile/Chart1.xls +0 -0
  111. data/test/excelfile/Chart2.xls +0 -0
  112. data/test/excelfile/Chart3.xls +0 -0
  113. data/test/excelfile/Chart4.xls +0 -0
  114. data/test/excelfile/Chart5.xls +0 -0
  115. data/test/helper.rb +0 -0
  116. data/test/perl_output/Chart1.xls.data +0 -0
  117. data/test/perl_output/Chart2.xls.data +0 -0
  118. data/test/perl_output/Chart3.xls.data +0 -0
  119. data/test/perl_output/Chart4.xls.data +0 -0
  120. data/test/perl_output/Chart5.xls.data +0 -0
  121. data/test/perl_output/README +0 -0
  122. data/test/perl_output/a_simple.xls +0 -0
  123. data/test/perl_output/autofilter.xls +0 -0
  124. data/test/perl_output/biff_add_continue_testdata +0 -0
  125. data/test/perl_output/chart_area.xls +0 -0
  126. data/test/perl_output/chart_bar.xls +0 -0
  127. data/test/perl_output/chart_column.xls +0 -0
  128. data/test/perl_output/chart_line.xls +0 -0
  129. data/test/perl_output/chess.xls +0 -0
  130. data/test/perl_output/colors.xls +0 -0
  131. data/test/perl_output/comments1.xls +0 -0
  132. data/test/perl_output/comments2.xls +0 -0
  133. data/test/perl_output/data_validate.xls +0 -0
  134. data/test/perl_output/date_time.xls +0 -0
  135. data/test/perl_output/defined_name.xls +0 -0
  136. data/test/perl_output/demo.xls +0 -0
  137. data/test/perl_output/demo101.bin +0 -0
  138. data/test/perl_output/demo201.bin +0 -0
  139. data/test/perl_output/demo301.bin +0 -0
  140. data/test/perl_output/demo401.bin +0 -0
  141. data/test/perl_output/demo501.bin +0 -0
  142. data/test/perl_output/diag_border.xls +0 -0
  143. data/test/perl_output/f_font_biff +0 -0
  144. data/test/perl_output/f_font_key +0 -0
  145. data/test/perl_output/f_xf_biff +0 -0
  146. data/test/perl_output/file_font_biff +0 -0
  147. data/test/perl_output/file_font_key +0 -0
  148. data/test/perl_output/file_xf_biff +0 -0
  149. data/test/perl_output/formula_result.xls +0 -0
  150. data/test/perl_output/headers.xls +0 -0
  151. data/test/perl_output/hidden.xls +0 -0
  152. data/test/perl_output/hide_zero.xls +0 -0
  153. data/test/perl_output/hyperlink.xls +0 -0
  154. data/test/perl_output/images.xls +0 -0
  155. data/test/perl_output/indent.xls +0 -0
  156. data/test/perl_output/merge1.xls +0 -0
  157. data/test/perl_output/merge2.xls +0 -0
  158. data/test/perl_output/merge3.xls +0 -0
  159. data/test/perl_output/merge4.xls +0 -0
  160. data/test/perl_output/merge5.xls +0 -0
  161. data/test/perl_output/merge6.xls +0 -0
  162. data/test/perl_output/ole_write_header +0 -0
  163. data/test/perl_output/outline.xls +0 -0
  164. data/test/perl_output/outline_collapsed.xls +0 -0
  165. data/test/perl_output/panes.xls +0 -0
  166. data/test/perl_output/protection.xls +0 -0
  167. data/test/perl_output/regions.xls +0 -0
  168. data/test/perl_output/right_to_left.xls +0 -0
  169. data/test/perl_output/set_first_sheet.xls +0 -0
  170. data/test/perl_output/stats.xls +0 -0
  171. data/test/perl_output/stocks.xls +0 -0
  172. data/test/perl_output/tab_colors.xls +0 -0
  173. data/test/perl_output/unicode_cyrillic.xls +0 -0
  174. data/test/perl_output/utf8.xls +0 -0
  175. data/test/perl_output/workbook1.xls +0 -0
  176. data/test/perl_output/workbook2.xls +0 -0
  177. data/test/perl_output/ws_colinfo +0 -0
  178. data/test/perl_output/ws_store_colinfo +0 -0
  179. data/test/perl_output/ws_store_dimensions +0 -0
  180. data/test/perl_output/ws_store_filtermode +0 -0
  181. data/test/perl_output/ws_store_filtermode_off +0 -0
  182. data/test/perl_output/ws_store_filtermode_on +0 -0
  183. data/test/perl_output/ws_store_selection +0 -0
  184. data/test/perl_output/ws_store_window2 +0 -0
  185. data/test/republic.png +0 -0
  186. data/test/test_00_IEEE_double.rb +0 -0
  187. data/test/test_01_add_worksheet.rb +0 -0
  188. data/test/test_02_merge_formats.rb +0 -0
  189. data/test/test_04_dimensions.rb +27 -27
  190. data/test/test_05_rows.rb +0 -0
  191. data/test/test_06_extsst.rb +1 -1
  192. data/test/test_11_date_time.rb +3 -3
  193. data/test/test_12_date_only.rb +7 -14
  194. data/test/test_13_date_seconds.rb +5 -5
  195. data/test/test_21_escher.rb +138 -138
  196. data/test/test_22_mso_drawing_group.rb +0 -0
  197. data/test/test_23_note.rb +4 -4
  198. data/test/test_24_txo.rb +3 -3
  199. data/test/test_25_position_object.rb +1 -1
  200. data/test/test_26_autofilter.rb +3 -3
  201. data/test/test_27_autofilter.rb +1 -1
  202. data/test/test_28_autofilter.rb +2 -2
  203. data/test/test_29_process_jpg.rb +16 -29
  204. data/test/test_30_validation_dval.rb +3 -3
  205. data/test/test_31_validation_dv_strings.rb +6 -6
  206. data/test/test_32_validation_dv_formula.rb +12 -12
  207. data/test/test_40_property_types.rb +0 -0
  208. data/test/test_41_properties.rb +0 -0
  209. data/test/test_42_set_properties.rb +0 -0
  210. data/test/test_50_name_stored.rb +8 -8
  211. data/test/test_51_name_print_area.rb +18 -18
  212. data/test/test_52_name_print_titles.rb +27 -27
  213. data/test/test_53_autofilter.rb +6 -6
  214. data/test/test_60_chart_generic.rb +1 -1
  215. data/test/test_61_chart_subclasses.rb +7 -14
  216. data/test/test_62_chart_formats.rb +0 -0
  217. data/test/test_63_chart_area_formats.rb +0 -0
  218. data/test/test_biff.rb +0 -0
  219. data/test/test_compatibility.rb +0 -0
  220. data/test/test_example_match.rb +31 -0
  221. data/test/test_format.rb +0 -0
  222. data/test/test_formula.rb +0 -0
  223. data/test/test_ole.rb +0 -0
  224. data/test/test_storage_lite.rb +0 -0
  225. data/test/test_workbook.rb +6 -0
  226. data/test/test_worksheet.rb +5 -5
  227. data/utils/add_magic_comment.rb +0 -0
  228. data/writeexcel.gemspec +263 -243
  229. data/writeexcel.rdoc +3 -3
  230. metadata +42 -39
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -58,6 +58,10 @@ class Colors
58
58
  0x7FFF
59
59
  end
60
60
  end
61
+
62
+ def inspect
63
+ to_s
64
+ end
61
65
  end # class Colors
62
66
 
63
67
  end # module Writeexcel
File without changes
File without changes
File without changes
File without changes
@@ -25,14 +25,12 @@ module Writeexcel
25
25
  class Format < Colors
26
26
  require 'writeexcel/helper'
27
27
 
28
- ###############################################################################
29
28
  #
30
- # initialize(xf_index=0, properties = {})
29
+ # Constructor
30
+ #
31
31
  # xf_index :
32
32
  # properties : Hash of property => value
33
33
  #
34
- # Constructor
35
- #
36
34
  def initialize(xf_index = 0, properties = {}) # :nodoc:
37
35
  @xf_index = xf_index
38
36
 
@@ -179,9 +177,6 @@ class Format < Colors
179
177
  @font_only = other.font_only
180
178
  end
181
179
 
182
- ###############################################################################
183
- #
184
- # get_xf($style)
185
180
  #
186
181
  # Generate an Excel BIFF XF record.
187
182
  #
@@ -335,9 +330,6 @@ class Format < Colors
335
330
  header + data
336
331
  end
337
332
 
338
- ###############################################################################
339
- #
340
- # get_font()
341
333
  #
342
334
  # Generate an Excel BIFF FONT record.
343
335
  #
@@ -406,9 +398,6 @@ class Format < Colors
406
398
  header + data + rgch
407
399
  end
408
400
 
409
- ###############################################################################
410
- #
411
- # get_font_key()
412
401
  #
413
402
  # Returns a unique hash key for a font. Used by Workbook->_store_all_fonts()
414
403
  #
@@ -422,9 +411,6 @@ class Format < Colors
422
411
  key.gsub(' ', '_') # Convert the key to a single word
423
412
  end
424
413
 
425
- ###############################################################################
426
- #
427
- # xf_index()
428
414
  #
429
415
  # Returns the used by Worksheet->_XF()
430
416
  #
@@ -616,9 +602,6 @@ class Format < Colors
616
602
  @font_only
617
603
  end
618
604
 
619
- ###############################################################################
620
- #
621
- # class method Format._get_color(colour)
622
605
  #
623
606
  # used from Worksheet.rb
624
607
  #
@@ -628,9 +611,6 @@ class Format < Colors
628
611
  Colors.new.get_color(color)
629
612
  end
630
613
 
631
- ###############################################################################
632
- #
633
- # set_type()
634
614
  #
635
615
  # Set the XF object type as 0 = cell XF or 0xFFF5 = style XF.
636
616
  #
@@ -986,9 +966,6 @@ class Format < Colors
986
966
  end
987
967
  end
988
968
 
989
- ###############################################################################
990
- #
991
- # set_valign()
992
969
  #
993
970
  # Set vertical cell alignment. This is required by the set_format_properties()
994
971
  # method to differentiate between the vertical and horizontal properties.
@@ -1023,9 +1000,6 @@ class Format < Colors
1023
1000
  set_text_h_align(6)
1024
1001
  end
1025
1002
 
1026
- ###############################################################################
1027
- #
1028
- # set_merge()
1029
1003
  #
1030
1004
  # This was the way to implement a merge in Excel5. However it should have been
1031
1005
  # called "center_across" and not "merge".
@@ -31,9 +31,6 @@ class Formula < ExcelFormulaParser #:nodoc:
31
31
  initialize_hashes
32
32
  end
33
33
 
34
- ###############################################################################
35
- #
36
- # parse_formula()
37
34
  #
38
35
  # Takes a textual description of a formula and returns a RPN encoded byte
39
36
  # string.
@@ -60,9 +57,6 @@ class Formula < ExcelFormulaParser #:nodoc:
60
57
  end
61
58
  end
62
59
 
63
- ###############################################################################
64
- #
65
- # parse_tokens()
66
60
  #
67
61
  # Convert each token or token pair to its Excel 'ptg' equivalent.
68
62
  #
@@ -227,9 +221,6 @@ class Formula < ExcelFormulaParser #:nodoc:
227
221
  ###############################################################################
228
222
 
229
223
 
230
- ###############################################################################
231
- #
232
- # _check_volatile()
233
224
  #
234
225
  # Check if the formula contains a volatile function, i.e. a function that must
235
226
  # be recalculated each time a cell is updated. These formulas require a ptgAttr
@@ -251,9 +242,6 @@ class Formula < ExcelFormulaParser #:nodoc:
251
242
  volatile
252
243
  end
253
244
 
254
- ###############################################################################
255
- #
256
- # _convert_volatile()
257
245
  #
258
246
  # Convert _vol to a ptgAttr tag formatted to indicate that the formula contains
259
247
  # a volatile function. See _check_volatile()
@@ -263,9 +251,6 @@ class Formula < ExcelFormulaParser #:nodoc:
263
251
  return [@ptg['ptgAttr'], 0x1, 0x0].pack("CCv")
264
252
  end
265
253
 
266
- ###############################################################################
267
- #
268
- # _convert_bool()
269
254
  #
270
255
  # Convert a boolean token to ptgBool
271
256
  #
@@ -274,9 +259,6 @@ class Formula < ExcelFormulaParser #:nodoc:
274
259
  end
275
260
 
276
261
 
277
- ###############################################################################
278
- #
279
- # _convert_number()
280
262
  #
281
263
  # Convert a number token to ptgInt or ptgNum
282
264
  #
@@ -291,9 +273,6 @@ class Formula < ExcelFormulaParser #:nodoc:
291
273
  end
292
274
  end
293
275
 
294
- ###############################################################################
295
- #
296
- # _convert_string()
297
276
  #
298
277
  # Convert a string to a ptg Str.
299
278
  #
@@ -322,9 +301,6 @@ class Formula < ExcelFormulaParser #:nodoc:
322
301
  [@ptg['ptgStr'], length, encoding].pack("CCC") + str
323
302
  end
324
303
 
325
- ###############################################################################
326
- #
327
- # _convert_ref2d()
328
304
  #
329
305
  # Convert an Excel reference such as A1, $B2, C$3 or $D$4 to a ptgRefV.
330
306
  #
@@ -346,9 +322,6 @@ class Formula < ExcelFormulaParser #:nodoc:
346
322
  ptgref + row + col
347
323
  end
348
324
 
349
- ###############################################################################
350
- #
351
- # _convert_ref3d
352
325
  #
353
326
  # Convert an Excel 3d reference such as "Sheet1!A1" or "Sheet1:Sheet2!A1" to a
354
327
  # ptgRef3dV.
@@ -377,9 +350,6 @@ class Formula < ExcelFormulaParser #:nodoc:
377
350
  ptgref + ext_ref + row + col
378
351
  end
379
352
 
380
- ###############################################################################
381
- #
382
- # _convert_range2d()
383
353
  #
384
354
  # Convert an Excel range such as A1:D4 or A:D to a ptgRefV.
385
355
  #
@@ -409,9 +379,6 @@ class Formula < ExcelFormulaParser #:nodoc:
409
379
  ptgarea + row1 + row2 + col1 + col2
410
380
  end
411
381
 
412
- ###############################################################################
413
- #
414
- # _convert_range3d
415
382
  #
416
383
  # Convert an Excel 3d range such as "Sheet1!A1:D4" or "Sheet1:Sheet2!A1:D4" to
417
384
  # a ptgArea3dV.
@@ -448,9 +415,6 @@ class Formula < ExcelFormulaParser #:nodoc:
448
415
  ptgarea + ext_ref + row1 + row2 + col1+ col2
449
416
  end
450
417
 
451
- ###############################################################################
452
- #
453
- # _pack_ext_ref()
454
418
  #
455
419
  # Convert the sheet name part of an external reference, for example "Sheet1" or
456
420
  # "Sheet1:Sheet2", to a packed structure.
@@ -491,9 +455,6 @@ class Formula < ExcelFormulaParser #:nodoc:
491
455
  [index].pack("v")
492
456
  end
493
457
 
494
- ###############################################################################
495
- #
496
- # _get_sheet_index()
497
458
  #
498
459
  # Look up the index that corresponds to an external sheet name. The hash of
499
460
  # sheet names is updated by the add_worksheet() method of the Workbook class.
@@ -515,9 +476,6 @@ class Formula < ExcelFormulaParser #:nodoc:
515
476
  end
516
477
  public :get_sheet_index
517
478
 
518
- ###############################################################################
519
- #
520
- # set_ext_sheets()
521
479
  #
522
480
  # This semi-public method is used to update the hash of sheet names. It is
523
481
  # updated by the add_worksheet() method of the Workbook class.
@@ -529,9 +487,6 @@ class Formula < ExcelFormulaParser #:nodoc:
529
487
  end
530
488
  public :set_ext_sheets
531
489
 
532
- ###############################################################################
533
- #
534
- # get_ext_sheets()
535
490
  #
536
491
  # This semi-public method is used to get the worksheet references that were
537
492
  # used in formulas for inclusion in the EXTERNSHEET Workbook record.
@@ -541,9 +496,6 @@ class Formula < ExcelFormulaParser #:nodoc:
541
496
  end
542
497
  public :get_ext_sheets
543
498
 
544
- ###############################################################################
545
- #
546
- # get_ext_ref_count()
547
499
  #
548
500
  # TODO This semi-public method is used to update the hash of sheet names. It is
549
501
  # updated by the add_worksheet() method of the Workbook class.
@@ -552,9 +504,6 @@ class Formula < ExcelFormulaParser #:nodoc:
552
504
  @ext_ref_count
553
505
  end
554
506
 
555
- ###############################################################################
556
- #
557
- # _get_name_index()
558
507
  #
559
508
  # Look up the index that corresponds to an external defined name. The hash of
560
509
  # defined names is updated by the define_name() method in the Workbook class.
@@ -568,9 +517,6 @@ class Formula < ExcelFormulaParser #:nodoc:
568
517
  end
569
518
  private :get_name_index
570
519
 
571
- ###############################################################################
572
- #
573
- # set_ext_name()
574
520
  #
575
521
  # This semi-public method is used to update the hash of defined names.
576
522
  #
@@ -579,9 +525,6 @@ class Formula < ExcelFormulaParser #:nodoc:
579
525
  end
580
526
  public :set_ext_name
581
527
 
582
- ###############################################################################
583
- #
584
- # _convert_function()
585
528
  #
586
529
  # Convert a function to a ptgFunc or ptgFuncVarV depending on the number of
587
530
  # args that it takes.
@@ -607,9 +550,6 @@ class Formula < ExcelFormulaParser #:nodoc:
607
550
  end
608
551
  end
609
552
 
610
- ###############################################################################
611
- #
612
- # _convert_name()
613
553
  #
614
554
  # Convert a symbolic name into a name reference.
615
555
  #
@@ -629,9 +569,6 @@ class Formula < ExcelFormulaParser #:nodoc:
629
569
  end
630
570
  private :convert_name
631
571
 
632
- ###############################################################################
633
- #
634
- # _cell_to_rowcol($cell_ref)
635
572
  #
636
573
  # Convert an Excel cell reference such as A1 or $B2 or C$3 or $D$4 to a zero
637
574
  # indexed row and column number. Also returns two boolean values to indicate
@@ -654,9 +591,6 @@ class Formula < ExcelFormulaParser #:nodoc:
654
591
  [row, col, row_rel, col_rel]
655
592
  end
656
593
 
657
- ###############################################################################
658
- #
659
- # _cell_to_packed_rowcol($row, $col, $row_rel, $col_rel)
660
594
  #
661
595
  # pack() row and column into the required 3 byte format.
662
596
  #
@@ -676,10 +610,6 @@ class Formula < ExcelFormulaParser #:nodoc:
676
610
  [row, col]
677
611
  end
678
612
 
679
- ###############################################################################
680
- #
681
- # _initialize_hashes()
682
- #
683
613
  def initialize_hashes
684
614
 
685
615
  # The Excel ptg indices
@@ -1024,6 +954,10 @@ class Formula < ExcelFormulaParser #:nodoc:
1024
954
  }
1025
955
 
1026
956
  end
957
+
958
+ def inspect
959
+ to_s
960
+ end
1027
961
  end
1028
962
 
1029
963
  if $0 ==__FILE__
File without changes
@@ -0,0 +1,158 @@
1
+ # -*- coding:utf-8 -*-
2
+ require 'digest/md5'
3
+
4
+ module Writeexcel
5
+ class Image
6
+ attr_reader :row, :col, :filename, :x_offset, :y_offset, :scale_x, :scale_y
7
+ attr_reader :data, :size, :checksum1, :checksum2
8
+ attr_accessor :id, :type, :width, :height, :ref_count
9
+
10
+ def initialize(row, col, filename, x_offset = 0, y_offset = 0, scale_x = 1, scale_y = 1)
11
+ @row = row
12
+ @col = col
13
+ @filename = filename
14
+ @x_offset = x_offset
15
+ @y_offset = y_offset
16
+ @scale_x = scale_x
17
+ @scale_y = scale_y
18
+ get_checksum_method
19
+ end
20
+
21
+ def import
22
+ File.open(@filename, "rb") do |fh|
23
+ raise "Couldn't import #{@filename}: #{$!}" unless fh
24
+ @data = fh.read
25
+ end
26
+ @size = data.bytesize
27
+ @checksum1 = image_checksum(@data)
28
+ @checksum2 = @checksum1
29
+ process
30
+ end
31
+
32
+ private
33
+
34
+ # Process the image and extract dimensions.
35
+ def process
36
+ case filetype
37
+ when 'PNG'
38
+ process_png(@data)
39
+ when 'JPG'
40
+ process_jpg(@data)
41
+ when 'BMP'
42
+ process_bmp(@data)
43
+ # The 14 byte header of the BMP is stripped off.
44
+ @data[0, 13] = ''
45
+ # A checksum of the new image data is also required.
46
+ @checksum2 = image_checksum(@data, @id, @id)
47
+ # Adjust size -14 (header) + 16 (extra checksum).
48
+ @size += 2
49
+ end
50
+ end
51
+
52
+ def filetype
53
+ return 'PNG' if @data.unpack('x A3')[0] == 'PNG'
54
+ return 'BMP' if @data.unpack('A2')[0] == 'BM'
55
+ if data.unpack('n')[0] == 0xFFD8
56
+ return 'JPG' if @data.unpack('x6 A4')[0] == 'JFIF' || @data.unpack('x6 A4')[0] == 'Exif'
57
+ else
58
+ raise "Unsupported image format for file: #{@filename}\n"
59
+ end
60
+ end
61
+
62
+ # Extract width and height information from a PNG file.
63
+ def process_png(data)
64
+ @type = 6 # Excel Blip type (MSOBLIPTYPE).
65
+ @width = data[16, 4].unpack("N")[0]
66
+ @height = data[20, 4].unpack("N")[0]
67
+ end
68
+
69
+ # Extract width and height information from a BMP file.
70
+ def process_bmp(data) #:nodoc:
71
+ @type = 7 # Excel Blip type (MSOBLIPTYPE).
72
+ # Read the bitmap width and height. Verify the sizes.
73
+ @width, @height = data.unpack("x18 V2")
74
+ check_verify(data)
75
+ end
76
+
77
+ def check_verify(data)
78
+ # Check that the file is big enough to be a bitmap.
79
+ raise "#{@filename} doesn't contain enough data." if data.bytesize <= 0x36
80
+ raise "#{@filename}: largest image width #{width} supported is 65k." if @width > 0xFFFF
81
+ raise "#{@filename}: largest image height supported is 65k." if @height > 0xFFFF
82
+
83
+ # Read the bitmap planes and bpp data. Verify them.
84
+ planes, bitcount = data.unpack("x26 v2")
85
+ raise "#{@filename} isn't a 24bit true color bitmap." unless bitcount == 24
86
+ raise "#{@filename}: only 1 plane supported in bitmap image." unless planes == 1
87
+
88
+ # Read the bitmap compression. Verify compression.
89
+ compression = data.unpack("x30 V")
90
+ raise "#{@filename}: compression not supported in bitmap image." unless compression == 0
91
+ end
92
+
93
+ # Extract width and height information from a JPEG file.
94
+ def process_jpg(data)
95
+ @type = 5 # Excel Blip type (MSOBLIPTYPE).
96
+
97
+ offset = 2
98
+ data_length = data.bytesize
99
+
100
+ # Search through the image data to find the 0xFFC0 marker. The height and
101
+ # width are contained in the data for that sub element.
102
+ while offset < data_length
103
+ marker = data[offset, 2].unpack("n")
104
+ marker = marker[0]
105
+ length = data[offset+2, 2].unpack("n")
106
+ length = length[0]
107
+
108
+ if marker == 0xFFC0 || marker == 0xFFC2
109
+ height = data[offset+5, 2].unpack("n")
110
+ @height = height[0]
111
+ width = data[offset+7, 2].unpack("n")
112
+ @width = width[0]
113
+ break
114
+ end
115
+
116
+ offset += length + 2
117
+ break if marker == 0xFFDA
118
+ end
119
+
120
+ raise "#{@filename}: no size data found in jpeg image.\n" unless @height
121
+ end
122
+
123
+ #
124
+ # Generate a checksum for the image using whichever module is available. The
125
+ # available modules are checked in get_checksum_method(). Excel uses an MD4
126
+ # checksum but any other will do. In the event of no checksum module being
127
+ # available we simulate a checksum using the image index.
128
+ #
129
+ # index1 and index2 is not used.
130
+ #
131
+ def image_checksum(data, index1 = 0, index2 = 0) #:nodoc:
132
+ case @checksum_method
133
+ when 3
134
+ Digest::MD5.hexdigest(data)
135
+ when 1
136
+ # Digest::MD4
137
+ # return Digest::MD4::md4_hex($data);
138
+ when 2
139
+ # Digest::Perl::MD4
140
+ # return Digest::Perl::MD4::md4_hex($data);
141
+ else
142
+ # Default
143
+ # return sprintf('%016X%016X', index2, index1)
144
+ end
145
+ end
146
+
147
+ #
148
+ # Check for modules available to calculate image checksum. Excel uses MD4 but
149
+ # MD5 will also work.
150
+ #
151
+ # ------- cxn03651 add -------
152
+ # md5 can use in ruby. so, @checksum_method is always 3.
153
+
154
+ def get_checksum_method #:nodoc:
155
+ @checksum_method = 3
156
+ end
157
+ end
158
+ end
File without changes
File without changes
File without changes