writeexcel 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. data/README +26 -31
  2. data/examples/a_simple.rb +42 -42
  3. data/examples/{autofilters.rb → autofilter.rb} +264 -266
  4. data/examples/bigfile.rb +29 -0
  5. data/examples/chart_area.rb +120 -0
  6. data/examples/chart_bar.rb +119 -0
  7. data/examples/chart_column.rb +119 -0
  8. data/examples/chart_line.rb +119 -0
  9. data/examples/chart_pie.rb +107 -0
  10. data/examples/chart_scatter.rb +120 -0
  11. data/examples/chart_stock.rb +147 -0
  12. data/examples/copyformat.rb +51 -51
  13. data/examples/data_validate.rb +278 -278
  14. data/examples/date_time.rb +86 -86
  15. data/examples/defined_name.rb +31 -0
  16. data/examples/demo.rb +120 -118
  17. data/examples/diag_border.rb +35 -35
  18. data/examples/formats.rb +489 -489
  19. data/examples/header.rb +136 -136
  20. data/examples/hidden.rb +28 -28
  21. data/examples/hyperlink.rb +42 -42
  22. data/examples/images.rb +52 -52
  23. data/examples/merge1.rb +39 -39
  24. data/examples/merge2.rb +44 -44
  25. data/examples/merge3.rb +65 -65
  26. data/examples/merge4.rb +82 -82
  27. data/examples/merge5.rb +79 -79
  28. data/examples/properties.rb +33 -0
  29. data/examples/properties_jp.rb +32 -0
  30. data/examples/protection.rb +46 -46
  31. data/examples/regions.rb +52 -52
  32. data/examples/repeat.rb +42 -42
  33. data/examples/stats.rb +75 -75
  34. data/examples/stocks.rb +80 -80
  35. data/examples/tab_colors.rb +30 -30
  36. data/examples/write_arrays.rb +82 -0
  37. data/lib/writeexcel.rb +1134 -18
  38. data/lib/writeexcel/biffwriter.rb +273 -260
  39. data/lib/writeexcel/chart.rb +2306 -217
  40. data/lib/writeexcel/charts/area.rb +152 -0
  41. data/lib/writeexcel/charts/bar.rb +177 -0
  42. data/lib/writeexcel/charts/column.rb +156 -0
  43. data/lib/writeexcel/charts/external.rb +61 -0
  44. data/lib/writeexcel/charts/line.rb +152 -0
  45. data/lib/writeexcel/charts/pie.rb +169 -0
  46. data/lib/writeexcel/charts/scatter.rb +192 -0
  47. data/lib/writeexcel/charts/stock.rb +211 -0
  48. data/lib/writeexcel/excelformulaparser.rb +208 -195
  49. data/lib/writeexcel/format.rb +1697 -1108
  50. data/lib/writeexcel/formula.rb +1050 -986
  51. data/lib/writeexcel/olewriter.rb +322 -322
  52. data/lib/writeexcel/properties.rb +251 -250
  53. data/lib/writeexcel/storage_lite.rb +968 -0
  54. data/lib/writeexcel/workbook.rb +3294 -2630
  55. data/lib/writeexcel/worksheet.rb +9012 -6377
  56. data/test/excelfile/Chart1.xls +0 -0
  57. data/test/excelfile/Chart2.xls +0 -0
  58. data/test/excelfile/Chart3.xls +0 -0
  59. data/test/excelfile/Chart4.xls +0 -0
  60. data/test/excelfile/Chart5.xls +0 -0
  61. data/test/perl_output/Chart1.xls.data +0 -0
  62. data/test/perl_output/Chart2.xls.data +0 -0
  63. data/test/perl_output/Chart3.xls.data +0 -0
  64. data/test/perl_output/Chart4.xls.data +0 -0
  65. data/test/perl_output/Chart5.xls.data +0 -0
  66. data/test/perl_output/a_simple.xls +0 -0
  67. data/test/perl_output/autofilter.xls +0 -0
  68. data/test/perl_output/chart_area.xls +0 -0
  69. data/test/perl_output/chart_bar.xls +0 -0
  70. data/test/perl_output/chart_column.xls +0 -0
  71. data/test/perl_output/chart_line.xls +0 -0
  72. data/test/perl_output/data_validate.xls +0 -0
  73. data/test/perl_output/date_time.xls +0 -0
  74. data/test/perl_output/demo.xls +0 -0
  75. data/test/perl_output/demo101.bin +0 -0
  76. data/test/perl_output/demo201.bin +0 -0
  77. data/test/perl_output/demo301.bin +0 -0
  78. data/test/perl_output/demo401.bin +0 -0
  79. data/test/perl_output/demo501.bin +0 -0
  80. data/test/perl_output/diag_border.xls +0 -0
  81. data/test/perl_output/headers.xls +0 -0
  82. data/test/perl_output/hyperlink.xls +0 -0
  83. data/test/perl_output/images.xls +0 -0
  84. data/test/perl_output/merge1.xls +0 -0
  85. data/test/perl_output/merge2.xls +0 -0
  86. data/test/perl_output/merge3.xls +0 -0
  87. data/test/perl_output/merge4.xls +0 -0
  88. data/test/perl_output/merge5.xls +0 -0
  89. data/test/perl_output/protection.xls +0 -0
  90. data/test/perl_output/regions.xls +0 -0
  91. data/test/perl_output/stats.xls +0 -0
  92. data/test/perl_output/stocks.xls +0 -0
  93. data/test/perl_output/tab_colors.xls +0 -0
  94. data/test/perl_output/unicode_cyrillic.xls +0 -0
  95. data/test/perl_output/workbook1.xls +0 -0
  96. data/test/perl_output/workbook2.xls +0 -0
  97. data/test/tc_all.rb +32 -31
  98. data/test/tc_biff.rb +104 -104
  99. data/test/tc_chart.rb +22 -22
  100. data/test/tc_example_match.rb +1944 -1280
  101. data/test/tc_format.rb +1254 -1267
  102. data/test/tc_formula.rb +63 -63
  103. data/test/tc_ole.rb +110 -110
  104. data/test/tc_storage_lite.rb +149 -0
  105. data/test/tc_workbook.rb +140 -115
  106. data/test/tc_worksheet.rb +115 -115
  107. data/test/test_00_IEEE_double.rb +14 -14
  108. data/test/test_01_add_worksheet.rb +12 -12
  109. data/test/test_02_merge_formats.rb +58 -58
  110. data/test/test_04_dimensions.rb +397 -397
  111. data/test/test_05_rows.rb +182 -182
  112. data/test/test_06_extsst.rb +80 -80
  113. data/test/test_11_date_time.rb +484 -484
  114. data/test/test_12_date_only.rb +506 -506
  115. data/test/test_13_date_seconds.rb +486 -486
  116. data/test/test_21_escher.rb +642 -629
  117. data/test/test_22_mso_drawing_group.rb +750 -739
  118. data/test/test_23_note.rb +78 -78
  119. data/test/test_24_txo.rb +80 -80
  120. data/test/test_25_position_object.rb +82 -0
  121. data/test/test_26_autofilter.rb +327 -327
  122. data/test/test_27_autofilter.rb +144 -144
  123. data/test/test_28_autofilter.rb +174 -174
  124. data/test/test_29_process_jpg.rb +681 -131
  125. data/test/test_30_validation_dval.rb +82 -82
  126. data/test/test_31_validation_dv_strings.rb +131 -131
  127. data/test/test_32_validation_dv_formula.rb +211 -211
  128. data/test/test_40_property_types.rb +191 -191
  129. data/test/test_41_properties.rb +238 -238
  130. data/test/test_42_set_properties.rb +442 -419
  131. data/test/test_50_name_stored.rb +305 -0
  132. data/test/test_51_name_print_area.rb +363 -0
  133. data/test/test_52_name_print_titles.rb +460 -0
  134. data/test/test_53_autofilter.rb +209 -0
  135. data/test/test_60_chart_generic.rb +576 -0
  136. data/test/test_61_chart_subclasses.rb +97 -0
  137. data/test/test_62_chart_formats.rb +270 -0
  138. data/test/test_63_chart_area_formats.rb +647 -0
  139. data/test/test_chartex.rb +35 -0
  140. data/test/ts_all.rb +46 -34
  141. data/writeexcel.gemspec +18 -0
  142. data/writeexcel.rdoc +583 -0
  143. metadata +162 -108
@@ -0,0 +1,35 @@
1
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
2
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../charts"
3
+
4
+ require "test/unit"
5
+ require 'writeexcel'
6
+ require 'chartex'
7
+
8
+ class TestChartex < Test::Unit::TestCase
9
+ TEST_DIR = File.expand_path(File.dirname(__FILE__))
10
+ PERL_OUTDIR = File.join(TEST_DIR, 'perl_output')
11
+ EXCEL_OUTDIR = File.join(TEST_DIR, 'excelfile')
12
+
13
+ def setup
14
+ @chartex = Chartex.new
15
+ end
16
+
17
+ def test_set_file
18
+ filename = 'filename'
19
+ @chartex.set_file(filename)
20
+ assert_equal(filename, @chartex.file)
21
+ end
22
+
23
+ def test_get_workbook
24
+ files = %w(1 2 3 4 5).collect { |i| "#{EXCEL_OUTDIR}/Chart#{i}.xls" }
25
+ datas = %w(1 2 3 4 5).collect { |i| "#{PERL_OUTDIR}/Chart#{i}.xls.data" }
26
+
27
+ (0...files.size).each do |i|
28
+ @chartex.set_file(files[i])
29
+ workbook = @chartex.get_workbook
30
+ assert(workbook.kind_of?(OLEStorageLitePPS))
31
+ expected = File.open(datas[i], 'rb') { |f| f.read }
32
+ assert_equal(expected, workbook.data, "#{files[i]} failed.")
33
+ end
34
+ end
35
+ end
data/test/ts_all.rb CHANGED
@@ -1,34 +1,46 @@
1
- $LOAD_PATH.unshift(Dir.pwd)
2
- $LOAD_PATH.unshift(Dir.pwd + "/test")
3
-
4
- require "tc_biff"
5
- require "tc_ole"
6
- require "tc_workbook"
7
- require "tc_worksheet"
8
- require "tc_format"
9
- require "tc_formula"
10
- require 'tc_chart'
11
- require "test_00_IEEE_double"
12
- require 'test_01_add_worksheet'
13
- require 'test_02_merge_formats'
14
- require 'test_04_dimensions'
15
- require 'test_05_rows'
16
- require 'test_06_extsst'
17
- require 'test_11_date_time'
18
- require 'test_12_date_only'
19
- require 'test_13_date_seconds'
20
- require 'test_21_escher'
21
- require 'test_22_mso_drawing_group'
22
- require 'test_23_note'
23
- require 'test_24_txo'
24
- require 'test_26_autofilter'
25
- require 'test_27_autofilter'
26
- require 'test_28_autofilter'
27
- require 'test_29_process_jpg'
28
- require 'test_30_validation_dval'
29
- require 'test_31_validation_dv_strings'
30
- require 'test_32_validation_dv_formula'
31
- require 'test_40_property_types'
32
- require 'test_41_properties'
33
- require 'test_42_set_properties'
34
- require 'tc_example_match'
1
+ #!/usr/bin/ruby -w
2
+
3
+ $LOAD_PATH.unshift(Dir.pwd)
4
+ $LOAD_PATH.unshift(Dir.pwd + "/test")
5
+
6
+ require "tc_biff"
7
+ require "tc_ole"
8
+ require "tc_workbook"
9
+ require "tc_worksheet"
10
+ require "tc_format"
11
+ require "tc_formula"
12
+ require 'tc_chart'
13
+ require "test_00_IEEE_double"
14
+ require 'test_01_add_worksheet'
15
+ require 'test_02_merge_formats'
16
+ require 'test_04_dimensions'
17
+ require 'test_05_rows'
18
+ require 'test_06_extsst'
19
+ require 'test_11_date_time'
20
+ require 'test_12_date_only'
21
+ require 'test_13_date_seconds'
22
+ require 'test_21_escher'
23
+ require 'test_22_mso_drawing_group'
24
+ require 'test_23_note'
25
+ require 'test_24_txo'
26
+ require 'test_25_position_object'
27
+ require 'test_26_autofilter'
28
+ require 'test_27_autofilter'
29
+ require 'test_28_autofilter'
30
+ require 'test_29_process_jpg'
31
+ require 'test_30_validation_dval'
32
+ require 'test_31_validation_dv_strings'
33
+ require 'test_32_validation_dv_formula'
34
+ require 'test_40_property_types'
35
+ require 'test_41_properties'
36
+ require 'test_42_set_properties'
37
+ require 'test_50_name_stored'
38
+ require 'test_51_name_print_area'
39
+ require 'test_52_name_print_titles'
40
+ require 'test_53_autofilter'
41
+ require 'test_60_chart_generic'
42
+ require 'test_61_chart_subclasses'
43
+ require 'test_62_chart_formats'
44
+ require 'test_63_chart_area_formats'
45
+ require 'tc_example_match'
46
+ require 'tc_storage_lite'
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+
3
+ version = '0.3.0'
4
+
5
+ spec = Gem::Specification.new do |s|
6
+ s.name = 'writeexcel'
7
+ s.version = version
8
+ s.author = 'Hideo NAKAMURA'
9
+ s.email = 'cxn03651@msj.biglobe.ne.jp'
10
+ s.summary = 'Write to a cross-platform Excel binary file.'
11
+ s.files = Dir['examples/**/*'] + Dir['lib/**/*.rb'] +
12
+ Dir['[A-Z]*'] + Dir['test/**/*']
13
+ s.require_path = 'lib'
14
+ s.test_file = 'test/ts_all.rb'
15
+ s.has_rdoc = true
16
+ s.rdoc_options << 'README'
17
+ s.required_ruby_version = '>=1.8'
18
+ end
data/writeexcel.rdoc ADDED
@@ -0,0 +1,583 @@
1
+ = 説明
2
+
3
+ Spreadsheet::WriteExcelライブラリは、エクセルのバイナリファイルを作成することができます。プラットフォームを問いません。複数のワークシートを作成することができますし、セルの書式を設定することもできます。テキスト、数値、数式、ハイパーリンク、画像を格納することが出来ます。
4
+
5
+ このライブラリで作成されるエクセルファイルは、エクセル97、2000、2002、2003と互換性があります。
6
+
7
+ このライブラリは主要なWindows、UNIX、マッキントッシュプラットフォームで動作します。作成されたファイルは、LinuxやUNIXのスプレッドシートアプリケーションであるGnumericやOpenOffice.orgとも互換性があります。
8
+
9
+ このライブラリは、既存のエクセルファイルの編集には使うことができません。(See "MODIFYING AND REWRITING EXCEL FILES")
10
+ = クイックスタート
11
+
12
+ Spreadsheet::WriteExcelは、エクセルの機能へのできるだけ多くのインターフェイスを提供しようとしています。結果として、インターフェイスに関する多くのドキュメントがあります。最初はどれが重要でどれがそうでないかわかりずらいでしょう。イケアの家具を組み立てるのが好みの人は、まずこの使用説明を読んでください。3つの簡単なステップです。
13
+
14
+ 1.new()メソッドで新規にエクセルのワークブックを作成する。
15
+ 2.add_worksheet()メソッドでこのワークブックにワークシートを加える。
16
+ 3.write()メソッドでこのワークシートにデータを書き込む。
17
+
18
+ こんな感じです。
19
+
20
+ require 'writeexcel' # Step 0
21
+
22
+ workbook = Spreadsheet::WriteExcel.new('ruby.xls') # Step 1
23
+ worksheet = workbook.add_worksheet # Step 2
24
+ worksheet.write('A1', 'Hi Excel!') # Step 3
25
+ workbook.close # ファイルに出力
26
+
27
+ これで、一つのワークシートを持ち、A1セルに'Hi Excel!'というテキストが書き込まれたエクセルファイルが作成されます。これでできあがりです。実際は0番目のステップがありますが、これはgoes without saying. 多くの使用例がgemには含まれていますので、それを参考にすることも出来ます。 See EXAMPLES
28
+
29
+ 最初にこの使用方法を読んで後で家具を作る人は、どうやって進めるかわかるでしょう。;-)
30
+
31
+ = Workbook メソッド
32
+
33
+ Spreadsheet::WriteExcel ライブラリは新規のワークブックへのオブジェクト指向のインターフェイスを提供します。新たなワークブックに対して次のメソッドを使用することが出来ます。
34
+
35
+ new
36
+ add_worksheet
37
+ add_format
38
+ add_chart_ext ※ 未対応
39
+ close
40
+ compatibility_mode
41
+ set_properties ※ 未対応
42
+ set_tempdir
43
+ set_custom_color
44
+ sheets
45
+ set_1904
46
+ set_codepage
47
+
48
+ == new()
49
+
50
+ new コンストラクタは新しいエクセルワークブックを作成します。パラメータとしてファイル名かファイルハンドルを受け取ります。(※ファイル名しか対応していません)
51
+
52
+ workbook = Spreadsheet::WriteExcel.new('filename.xls')
53
+ worksheet = workbook.add_worksheet
54
+ worksheet.write(0, 0, 'Hi Excel!')
55
+
56
+ ※ また、デフォルトのフォーマットを指定することもできます。例えば、MSP ゴシックで11ポイントなど。
57
+
58
+ workbook = Spreadsheet::WriteExcel.new('filename.xls', :font => 'MSP ゴシック', :size = 11)
59
+
60
+ ファイル名を使った別の使用例です。
61
+
62
+ workbook = Spreadsheet::WriteExcel.new(filename)
63
+ workbook = Spreadsheet::WriteExcel.new('/tmp/filename.xls')
64
+ workbook = Spreadsheet::WriteExcel.new("c:\\tmp\\filename.xls")
65
+ workbook = Spreadsheet::WriteExcel.new('c:\tmp\filename.xls')
66
+
67
+ 最後の2つの例は、DOSやWindowsでディレクトリの区切りの「\」をエスケープするか、シングルクォートで囲んでそのまま指定していするかの例です。
68
+
69
+ new() コンストラクタは、Spreadsheet::WriteExcelオブジェクト(ワークブックオブジェクト)を返し、これにワークシートを加えデータを書き込みます。
70
+
71
+ == add_worksheet([sheetname])
72
+
73
+ ワークブックには少なくとも一つのワークシートを加える必要があります。ワークシートはセルにデータを記述するのに用いられます。
74
+
75
+ worksheet1 = workbook.add_worksheet # Sheet1
76
+ worksheet2 = workbook.add_worksheet('Foglio2') # Foglio2
77
+ worksheet3 = workbook.add_worksheet('Data') # Data
78
+ worksheet4 = workbook.add_worksheet # Sheet4
79
+
80
+ sheetname が指定されなければ、Sheet1, Sheet2といったデフォルトのエクセルの慣習に従います。
81
+
82
+ ワークシート名はエクセルのワークシート名として正しいものである必要があります。すなわち、[ ] : * ? / \ といった文字は使用できませんし、32文字以内でなければなりません。加えて、大文字小文字の別なく、同じシート名は使うことが出来ません。
83
+
84
+ シート名sheetnameには、UTF8文字列も使用することが出来ます。
85
+
86
+ worksheet = workbook.add_format('シート1') # UTF8でソースファイルを保存のこと
87
+
88
+ == add_format(properties)
89
+
90
+ add_format()メソッドは、セルに書式を設定するのに使用する新しいFormatオブジェクトを作成します。作成の際にpropertiesのハッシュ引数で指定することも出来ますし、後でメソッドを呼び出して指定することも出来ます。
91
+
92
+ format1 = workbook.add_format(props) # 作成時にプロパティをセットする
93
+ format2 = workbook.add_format # 後でプロパティをセットする
94
+
95
+ 書式プロパティの詳細及び指定方法については、CELL FORMATTING セクションをご覧ください。
96
+
97
+ == close()
98
+
99
+ ※ワークブックをエクセルファイルに書き出します。
100
+
101
+ == compatibility_mode()
102
+
103
+ ※未検証
104
+
105
+ == set_properties()
106
+
107
+ ※未対応
108
+
109
+ == set_tempdir()
110
+
111
+ 速度と効率のため、ワークブックのデータを最後に組み立てる前に、Spreadsheet::WriteExcelはワークシートのデータをテンポラリファイルに置きます。テンポラリファイルを作ることが出来ない場合はメモリ上で作業します。この場合、大きなファイルになると遅くなることがあります。
112
+ この問題はWindows上でIISと併せて使っているときに主として発生しますが、UNIXシステムでも起こることがあります。
113
+ この問題は概して、既定の一時ファイルディレクトリがC:\やその他IISが書き込みを提供していないディレクトリに設定されているのが原因で発生します。
114
+ この問題を避けるために、set_tempdir()メソッドを使って一時ファイルを作成できるディレクトリを指定します。
115
+
116
+ お使いのシステムでどのディレクトリが使用されるかは、以下で知ることが出来ます。
117
+
118
+ ruby -e "print ENV['TMPDIR'] || ENV['TMP'] || ENV['TEMP'] || '/tmp'"
119
+
120
+ デフォルトの一時ファイルディレクトリは使用できる場合でも、セキュリティやメンテナンスの理由から別の場所を指定することもできます。
121
+
122
+ workbook.set_tempdir('/tmp/writeexcel')
123
+ workbook.set_tempdir('c:\windows\temp\writeexcel')
124
+
125
+ この一時ファイル用のディレクトリは実在しなければなりません。set_tempdir()が新たにディレクトリを作成することはしません。
126
+
127
+ set_tempdir()を使う一つの欠点は、Windowsシステムの中にはおおよそ800のコンカレント一時ファイルを限度としているのがあることです。これらのシステムで動かす単一のプログラムは総計で800のワークブックとワークシートオブジェクトを作成するのが上限となります。必要なら複数の、ノン・コンカレントなプログラムを実行してください。
128
+
129
+ == set_custom_color(index, red, green, ble)
130
+
131
+ set_custom_color()メソッドは、ビルトインされているパレットの値に、もう少し好みの色を加えるのに使用します。
132
+ index の値は、8から63の間でなければなりません。See "COLOURS IN EXCEL"
133
+ デフォルトの名前付きカラーは次のようになっています。
134
+
135
+ 8 => black
136
+ 9 => white
137
+ 10 => red
138
+ 11 => lime
139
+ 12 => blue
140
+ 13 => yellow
141
+ 14 => magenta
142
+ 15 => cyan
143
+ 16 => brown
144
+ 17 => green
145
+ 18 => navy
146
+ 20 => purple
147
+ 22 => silver
148
+ 23 => gray
149
+ 33 => pink
150
+ 53 => orange
151
+
152
+ RGB(red green blue)要素を用いて新しい色をセットすることも出来ます。red, green, blue の各値は0から255までの間でなければなりません。エクセルを使ってTools(ツール)->Options(オプション)->Colors(色)->Modify(変更)で必要な値を決めることが出来ます。
153
+
154
+ set_custom_color()メソッドでは、HTMLで用いられる#rrggbb形式の16進数値も使用できます。
155
+
156
+ workbook.set_custom_color(40, 255, 102, 0) # orange
157
+ workbook.set_custom_color(40, 0xFF, 0x66, 0x00) # same thing
158
+ workbook.set_custom_color(40, '#FF6600') # same thing
159
+
160
+ font = workbook.add_format(:color => 40) # use the modified color
161
+
162
+ set_custom_color()は作成された色のindexを返します。
163
+
164
+ ferrari = workbook.set_custom_color(40, 216, 12, 12)
165
+ format = workbook.add_format(
166
+ :bg_color => ferrari,
167
+ :pattern => 1,
168
+ :border => 1
169
+ )
170
+
171
+ == sheets([0, 1, ...])
172
+
173
+ sheets()メソッドはワークブック内のワークシートの全リストあるいは指定されたシートのリストを返します。
174
+ 引数を指定しなければ全てのシートのリストを返します。これはそれぞれのシートに、ある操作を繰り返して行いたいときに便利です。
175
+
176
+ workbook.sheets.each do |worksheet|
177
+ print $worksheet.get_name
178
+ end
179
+
180
+ 一つあるいは複数のワークシートオブジェクトを指定することもできます。
181
+
182
+ worksheet = workbook.sheets(0)
183
+ worksheet.write('A1', 'Hello')
184
+
185
+ workbook.sheets(0).write('A1', 'Hello') # same thing
186
+
187
+ 次の例は、ワークブック内の最初と最後のワークシートを返し、操作します。
188
+
189
+ workbook.sheets(0, -1).each do |worksheet|
190
+ # Do something
191
+ end
192
+
193
+ == set_1904()
194
+
195
+ エクセルは日付を実数で格納しています。その整数部分は「epoch」からの日数を、小数部分は1日のうちのパーセンテージを格納しています。「epoch」は、Windowsのエクセルでは1900年、マッキントッシュのエクセルでは1904年です。ですが、どちらのプラットフォームでもエクセルは自動的にシステム間の相違をコンバートして扱います。
196
+
197
+ Spreadsheet::WriteExcelではデフォルトで1900年を用います。もしも変更したいのであれば、workbookに対してset_1904()メソッドを呼んでください。現在の値を問い合わせるにはget_1904()を呼びます。これは、1900ならば0を、1904ならば1を返します。
198
+
199
+ エクセルの日付の取り扱いについては、"DATES AND TIME IN EXCEL"も見てください。
200
+
201
+ 通常であれば、set_1904()を使う必要はありません。
202
+
203
+ == set_codepage(codepage)
204
+
205
+ Spreadsheet::WriteExcelで使われるデフォルトのコードページ、文字セットはANSIです。これはWindowsのエクセルの既定値でもあります。しかしながら、たまにコードページを変更する必要が生じたときは、set_codepage()メソッドを使って変更します。
206
+
207
+ コードページの変更は、マッキントッシュ上でSpreadsheet::WriteExcelを使用していて、ASCII 128以外の文字セットを使いたい場合に必要になることがあります。
208
+
209
+ workbook.set_codepage(1) # ANSI, MS Windows
210
+ workbook.set_codepage(2) # Apple Macintosh
211
+
212
+ set_codepage()はめったに必要にはなりません。
213
+
214
+ = Worksheet メソッド
215
+
216
+ ワークブックオブジェクトにadd_worksheet()メソッドを呼ぶことで新しいワークシートが作成されます。
217
+
218
+ worksheet1 = workbook.add_worksheet
219
+ worksheet2 = workbook.add_worksheet
220
+
221
+ 新しいワークシートに対して、次のメソッドを使うことが出来ます。
222
+
223
+ write()
224
+ write_number()
225
+ write_string()
226
+ write_utf16be_string()
227
+ write_utf16le_string()
228
+ keep_leading_zeros()
229
+ write_blank()
230
+ write_row()
231
+ write_col()
232
+ write_date_time()
233
+ write_url()
234
+ write_url_range()
235
+ write_formula()
236
+ store_formula()
237
+ repeat_formula()
238
+ write_comment()
239
+ show_comments()
240
+ add_write_handler()
241
+ insert_image()
242
+ embed_chart()
243
+ data_validation()
244
+ get_name()
245
+ activate()
246
+ select()
247
+ hide()
248
+ set_first_sheet()
249
+ protect()
250
+ set_selection()
251
+ set_row()
252
+ set_column()
253
+ outline_settings()
254
+ freeze_panes()
255
+ split_panes()
256
+ merge_range()
257
+ set_zoom()
258
+ right_to_left()
259
+ hide_zero()
260
+ set_tab_color()
261
+ autofilter()
262
+
263
+ == セル・ノーテーション
264
+
265
+ Spreadsheet::WriteExcelはセルの位置を指定するのに2つの表記法、Row-Column法とA1法をサポートしています。
266
+
267
+ Row-Column法は行、桁ともに0から始まるインデックスですが、A1法はエクセルで標準的に用いられる桁を示す英字と行を示す1から始まる数字からなる英数字の並びです。例えば、
268
+
269
+ (0, 0) # The top left cell in row-column notation.
270
+ ('A1') # The top left cell in A1 notation.
271
+
272
+ (1999,29) # Row-column notation.
273
+ ('AD2000') # The same cell in A1 notation.
274
+
275
+ Row-column法はセルをプログラムで扱うのに便利です。
276
+
277
+ 0.upto(9) do |i|
278
+ worksheet.write(i, 0, 'Hello') # Cells A1 to A10
279
+ end
280
+
281
+ A1法はワークシートを手動で設定したり数式を用いるときに便利です。
282
+
283
+ worksheet.write('H1', 200)
284
+ worksheet.write('H2', '=H1+1') # 201
285
+
286
+ 数式中やいくつかのメソッドでは、A:Aカラム法も使用できます。
287
+
288
+ worksheet.write('A1', '=SUM(B:B)')
289
+
290
+ 簡便さのために、以下のワークシートのメソッドではrow-column法で記述していますが、全てA1法も用いることができます。
291
+
292
+ 注:エクセルではR1C1法も使うことができますが、Spreadsheet::WriteExcelではサポートしていません。
293
+
294
+ == write(row, column, [token, format])
295
+
296
+ エクセルは、データのタイプ(文字列、数値、ブランク、数式、ハイパーリンク)によって区別して扱います。データの書き込みを簡単に扱うため、write()メソッドはいくつかのメソッドのエイリアスとして振る舞います。
297
+
298
+ write_string
299
+ write_number
300
+ write_blank
301
+ write_formula
302
+ write_url
303
+ write_row
304
+ write_col
305
+
306
+ 全般的な規則は、データが何かを見て、何を書き込むかを決めます。row-column法とA1法それぞれの例を示します。オリジナルのパール版では'1'や'2.5E-4'といった数値風
307
+ の文字列を書き込むと数値として扱われますが、ruby版では異なるので注意。
308
+
309
+ # same as
310
+ worksheet.write(0, 0, 'Hello' ) # write_string
311
+ worksheet.write(1, 0, '1' ) # write_string
312
+ worksheet.write(2, 0, 2 ) # write_number
313
+ worksheet.write(3, 0, 3.00001 ) # write_number
314
+ worksheet.write(4, 0, "" ) # write_blank
315
+ worksheet.write(5, 0, '' ) # write_blank
316
+ worksheet.write(6, 0, nil ) # write_blank
317
+ worksheet.write(7, 0 ) # write_blank
318
+ worksheet.write(8, 0, 'http://www.ruby-lang.org/') # write_url
319
+ worksheet.write('A9', 'ftp://ftp.ruby-lang.org/' ) # write_url
320
+ worksheet.write('A10', 'internal:Sheet1!A1' ) # write_url
321
+ worksheet.write('A11', 'external:c:\foo.xls' ) # write_url
322
+ worksheet.write('A12', '=A3 + 3*A4' ) # write_formula
323
+ worksheet.write('A13', '=SIN(PI()/4)' ) # write_formula
324
+ worksheet.write('A14', Array ) # write_row
325
+ worksheet.write('A15', [ Array ] ) # write_col
326
+
327
+ オリジナルのパール版にあるkeep_leading_zeros プロパティは無効です。
328
+ 0で始まる数字列を書き込むには、文字列にしてください。
329
+ 数値リテラルで0で始まる数値を書き込むときは、8進数に解釈される
330
+ ので気を付けてください。
331
+
332
+ worksheet.write('A16', 010 ) # write_number 8
333
+ worksheet.write('A17', '010' ) # write_string '010'
334
+ worksheet.write('A18', 000020 ) # write_number 16
335
+
336
+ Arrayを渡すときの挙動は以下の通り。
337
+
338
+ TODO 記述すること
339
+
340
+ 引数formatはオプションです。有効なFormatオブジェクトである必要があります。
341
+ "CELL FORMATTING"を参照。
342
+
343
+ format = workbook.add_format
344
+ format.set_bold
345
+ format.set_color('red')
346
+ format.set_align('center')
347
+ worksheet.write(4, 0, 'Hello', format) # formatted string
348
+
349
+ write()メソッドは空文字列''やnilがtokenとして渡された場合、formatが渡されなければ何もしません。つまり、上記の例では何もしない(無視する)ということです。ですから、空データやnilを扱うのに特別のことを気にする必要はありません。write_blank()メソッドも見てください。
350
+
351
+ add_write_handler()を使って、あなた独自のwrite()メソッドのデータ処理を加えることもできます。(※未検証)
352
+
353
+ UTF8文字列も扱うことが出来ます(※暫定実装)
354
+
355
+ write()メソッドは、次の値を返します。
356
+
357
+ 0 : 成功
358
+ -1 : 引数の数が不足
359
+ -2 : 行や桁が範囲外
360
+ -3 : 文字列が長すぎる(32767バイト以上)
361
+
362
+ == write_number(row, column, number[, format])
363
+
364
+ 指定されたセルに整数又は実数を書き込む。
365
+
366
+ worksheet.write_number(0, 0, 1234556)
367
+ worksheet.write_number('A2', 2.3456)
368
+
369
+ "Cell notation"も参照。formatはオプション。
370
+
371
+ 一般的にはwrite()メソッドを使えばこと足りる。
372
+
373
+ == write_string(row, column, string[, format])
374
+
375
+ 指定されたセルに文字列を書き込む。
376
+
377
+ worksheet.write_string(0, 0, 'Your text here')
378
+ worksheet.write_string('A2', 'or here')
379
+
380
+ 文字列の最大サイズは32767文字。
381
+
382
+ == write_blank(row, column, format)
383
+
384
+ 指定されたセルにブランクを書き込む。
385
+
386
+ worksheet.write_brank(0, 0, format)
387
+
388
+ このメソッドは、文字列も数値もないセルに書式を書き込むのに用いる。
389
+ エクセルでは空(Empty)セルとブランクセルとは異なる。空セルは何のデータも持たないが、ブランクセルは書式情報を持つ。
390
+
391
+ 書式情報を持たない書き込みは無視される。
392
+
393
+ worksheet.write('A1', nil, format) # write_blank('A1', format)
394
+ worksheet.write('A1', nil ) # ignored
395
+
396
+ すなわち、配列にある一連のデータを書き込む際に、nilあるいは空白のセルについて特別の扱いをしなくても良いと言うことである。
397
+
398
+ "Cell notation"も参照。
399
+
400
+ == write_row(row, column, array[, format])
401
+
402
+ write_row()メソッドは、1次元あるいは2次元配列を一度に書き込む際に使用できます。データベースからのクエリ結果をエクセルに書き込む際に便利です。
403
+ 実際は配列の各要素に対してwrite()メソッドを呼び出します。
404
+
405
+ array = ['awk', 'gawk', 'mawk']
406
+ worksheet.write_row(0, 0, array)
407
+
408
+ # この例は次と同じ
409
+ worksheet.write(0, 0, array[0])
410
+ worksheet.write(0, 1, array[1])
411
+ worksheet.write(0, 2, array[2])
412
+
413
+ 注記:利便さのため、配列を渡されたときはwrite()はwrite_row()と同様に振る舞います。ですから、次の二つの例は同じことです。
414
+
415
+ worksheet.write_row('A1', array) # write a row of data
416
+ worksheet.write( 'A1', array) # same thing
417
+
418
+ format引数はオプションです。指定された場合、全ての配列要素の書き込みに際し適用されます。
419
+
420
+ 2次元配列を渡すとこんな感じになります。
421
+
422
+ eec = [
423
+ ['maggie', 'milly', 'molly', 'may' ],
424
+ [13, 14, 15, 16 ],
425
+ ['shell', 'star', 'crab', 'stone']
426
+ ]
427
+
428
+ worksheet.write_row('A1', eec)
429
+
430
+ 以下のワークシートが作成されます。
431
+
432
+ -----------------------------------------------------------
433
+ | | A | B | C | D | E | ...
434
+ -----------------------------------------------------------
435
+ | 1 | maggie | 13 | shell | ... | ... | ...
436
+ | 2 | milly | 14 | star | ... | ... | ...
437
+ | 3 | molly | 15 | crab | ... | ... | ...
438
+ | 4 | may | 16 | stone | ... | ... | ...
439
+ | 5 | ... | ... | ... | ... | ... | ...
440
+ | 6 | ... | ... | ... | ... | ... | ...
441
+
442
+ 縦横を反転して作成するには、下のwrite_col()メソッドを使うか、write()メソッドで2次元配列の配列、[ eec ] を渡してください。
443
+
444
+ nil要素は、formatが指定されていなければ無視されますし、指定されていればブランクセルとして書き込まれます。
445
+
446
+ write_row()メソッドの返値は、無事に終われば0、何か問題があれば最初に発生したエラーコードを返します。上のwrite()に記載された返値を見てください。
447
+
448
+ examplesディレクトリにあるwrite_arrays.rbもご覧ください。
449
+
450
+ == write_col(row, column, array[, format])
451
+
452
+ write_col()メソッドは、1次元あるいは2次元配列を一度に書き込む際に使用できます。データベースからのクエリ結果をエクセルに書き込む際に便利です。
453
+ 実際は配列の各要素に対してwrite()メソッドを呼び出します。
454
+
455
+ array = ['awk', 'gawk', 'mawk']
456
+ worksheet.write_col(0, 0, array)
457
+
458
+ # この例は次と同じ
459
+ worksheet.write(0, 0, array[0])
460
+ worksheet.write(1, 0, array[1])
461
+ worksheet.write(2, 0, array[2])
462
+
463
+ format引数はオプションです。指定された場合、全ての配列要素の書き込みに際し適用されます。
464
+
465
+ 2次元配列を渡すとこんな感じになります。
466
+
467
+ eec = [
468
+ ['maggie', 'milly', 'molly', 'may' ],
469
+ [13, 14, 15, 16 ],
470
+ ['shell', 'star', 'crab', 'stone']
471
+ ]
472
+
473
+ worksheet.write_row('A1', eec)
474
+
475
+ 以下のワークシートが作成されます。
476
+
477
+ -----------------------------------------------------------
478
+ | | A | B | C | D | E | ...
479
+ -----------------------------------------------------------
480
+ | 1 | maggie | milly | molly | may | ... | ...
481
+ | 2 | 13 | 14 | 15 | 16 | ... | ...
482
+ | 3 | shell | star | crab | stone | ... | ...
483
+ | 4 | ... | ... | ... | ... | ... | ...
484
+ | 5 | ... | ... | ... | ... | ... | ...
485
+ | 6 | ... | ... | ... | ... | ... | ...
486
+
487
+ 縦横を反転して作成するには、上のwrite_col()メソッドを使うか、write()メソッドで2次元配列、eec を渡してください。
488
+
489
+ nil要素は、formatが指定されていなければ無視されますし、指定されていればブランクセルとして書き込まれます。
490
+
491
+ write_col()メソッドの返値は、無事に終われば0、何か問題があれば最初に発生したエラーコードを返します。上のwrite()に記載された返値を見てください。
492
+
493
+ examplesディレクトリにあるwrite_arrays.rbもご覧ください。
494
+
495
+ == write_date_time(row, column, date_string, format)
496
+
497
+ write_date_time()メソッドは、指定したセルに日付あるいは時刻を書き込みます。
498
+
499
+ worksheet.write_date_time('A1', '2009-03-25T12:30', date_format)
500
+
501
+ date_stringは次の形式です。
502
+
503
+ yyyy-mm-ddThh:mm:ss.sss
504
+
505
+ これはISO8601に適合していますが、ISO8601全てのフォーマットには適合していないことに留意してください。
506
+
507
+ date_stirngでは、次のバリエーションも使用できます。どの場合でも'T'は必要です。
508
+
509
+ yyyy-mm-ddThh:mm:ss.sss # standard format
510
+ yyyy-mm-ddT # No time
511
+ Thh:mm:ss.sss # No Date
512
+ yyyy-mm-ddThh:mm:ss.sssZ # Additional Z ( but not time zone)
513
+ yyyy-mm-ddThh:mm:ss # No fractal seconds
514
+ yyyy-mm-ddThh:mm # No seconds.
515
+
516
+ 日時には書式(format)が必要です。指定しなければ数値として書き込まれます。"DATES AND TIME IN EXCEL"及び"CELL FORMATTING"を参照ください。
517
+ 典型的な例です。
518
+
519
+ date_format = workbook.add_format(:num_format => 'mm/dd/yy')
520
+ worksheet.write_date_time('A1', '2009-03-25T12:30', date_format) # date
521
+ worksheet.write_date_time('A1', '2009-03-25T12:30' ) # number
522
+
523
+ 日付としては、epochが1900の場合は1900-01-01から9999-12-31まで、epochが1904の場合は1904-01-01から9999-12-31までです。この範囲外の時は文字列が書き込まれます。
524
+
525
+ examplesディレクトリにあるdate_time.rbもご覧ください。
526
+
527
+ == write_url(row, column, url[, label, format])
528
+
529
+ 指定されたセルにURLへのハイパーリンクを書き込みます。ハイパーリンクは、表示されるlabelと表示はされない実際のurlの2つからなります。labelが指定されない場合、urlが表示されます。labelとformatはオプションですし、その順番が入れ替わってもかまいません。
530
+
531
+ labelはwrite()メソッドで書き込まれます。ですから、書き込み可能な文字列、数値または数式でなければなりません。
532
+
533
+ URLの形式は4つ(http://, https://, ftp://, mailto:)をサポートしています。
534
+
535
+ worksheet.write_url(0, 0, 'ftp://www.ruby-lang.org/' )
536
+ worksheet.write_url(1, 0, 'http://www.ruby-lang.org/', 'Ruby home' )
537
+ worksheet.write_url('A3', 'http://www.ruby-lang.org/', format )
538
+ worksheet.write_url('A4', 'http://www.ruby-lang.org/', 'Perl', format)
539
+ worksheet.write_url('A5', 'mailto:foo@bar.com' )
540
+
541
+ このほか、ローカルリンクの2つ(internal:, external:)もサポートしています。これらは同じワークブック内のワークシートへ、あるいは他のワークブックへの参照に用います。
542
+
543
+ worksheet.write_url('A6', 'internal:Sheet2!A1' )
544
+ worksheet.write_url('A7', 'internal:Sheet2!A1', format )
545
+ worksheet.write_url('A8', 'internal:Sheet2!A1:B2' )
546
+ worksheet.write_url('A9', %q{internal:'Sales Data'!A1} )
547
+ worksheet.write_url('A10', 'external:c:\temp\foo.xls' )
548
+ worksheet.write_url('A11', 'external:c:\temp\foo.xls#Sheet2!A1' )
549
+ worksheet.write_url('A12', 'external:..\..\..\foo.xls' )
550
+ worksheet.write_url('A13', 'external:..\..\..\foo.xls#Sheet2!A1' )
551
+ worksheet.write_url('A14', 'external:\\\\NETWORK\share\foo.xls' )
552
+
553
+ これらのURLの形式はwrite()メソッドで自動的に認識されます。
554
+
555
+ ワークシートへの参照はSheet1!A1といった形式です。Sheet1!A1:B2といった範囲指定も使用できます。
556
+ 外部の参照の際、ワークブック名とワークシート名の間は#で区切る必要があります。 external:workbook.xls#Sheet1!A1
557
+
558
+ ※以下の名前付け範囲への対応は、未検証
559
+ 名前付けされた範囲へのリンクも張ることができます。例えば、外部のc:\temp\foo.xlsにあるmy_nameという名前の範囲へのリンクは、
560
+
561
+ worksheet.write_url('A15', 'external:c;\temp\foo.xls#my_name')
562
+
563
+ 注:現在のSpreadsheet::WriteExcelでは、名前付け範囲の設定は対応していません。
564
+
565
+ エクセルでは、シート名に空白や非英数字が含まれる場合、'Sales Data'!A1のようにクォートで囲む必要があります。この場合、シート名に含まれる文字は必要であればエスケープしてください。 'c:\temp' はダブルクォートでは"c:\\temp"とします。
566
+
567
+ DOSやWindowsであっても、ファイル名の区切りには'/'を使用することが出来ます。これで先ほどのエスケープの問題は回避することができます。
568
+
569
+ worksheet.write_url('A16', 'external:c:/temp/foo.xls')
570
+ worksheet.write_url('A16', 'external:c://NETWORK/share/foo.xls')
571
+
572
+ "Cell notation"も参照。
573
+
574
+ == write_formula(row, column, formula[, format, value])
575
+
576
+ 指定されたセルに数式あるいは関数を書き込みます。
577
+
578
+ worksheet.write_formula(0, 0, '=$B$3 + B4' )
579
+ worksheet.write_formula(1, 0, '=SIN(PI()/4)')
580
+ worksheet.write_formula(2, 0, '=SUM(B1:B5)' )
581
+ worksheet.write_formula('A4', '=IF(A3>1,"Yes", "No")' )
582
+ worksheet.write_formula('A5', '=AVERAGE(1, 2, 3, 4)' )
583
+ worksheet.write_formula('A6', '=DATEVALUE("1-Jan-2001")')