keeguon-spreadsheet 0.9.3

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 (76) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +619 -0
  3. data/Manifest.txt +85 -0
  4. data/bin/xlsopcodes +18 -0
  5. data/lib/parseexcel.rb +27 -0
  6. data/lib/parseexcel/parseexcel.rb +75 -0
  7. data/lib/parseexcel/parser.rb +11 -0
  8. data/lib/spreadsheet.rb +80 -0
  9. data/lib/spreadsheet/column.rb +71 -0
  10. data/lib/spreadsheet/compatibility.rb +23 -0
  11. data/lib/spreadsheet/datatypes.rb +161 -0
  12. data/lib/spreadsheet/encodings.rb +57 -0
  13. data/lib/spreadsheet/excel.rb +88 -0
  14. data/lib/spreadsheet/excel/error.rb +26 -0
  15. data/lib/spreadsheet/excel/internals.rb +458 -0
  16. data/lib/spreadsheet/excel/internals/biff5.rb +17 -0
  17. data/lib/spreadsheet/excel/internals/biff8.rb +19 -0
  18. data/lib/spreadsheet/excel/offset.rb +41 -0
  19. data/lib/spreadsheet/excel/password_hash.rb +24 -0
  20. data/lib/spreadsheet/excel/reader.rb +1302 -0
  21. data/lib/spreadsheet/excel/reader/biff5.rb +42 -0
  22. data/lib/spreadsheet/excel/reader/biff8.rb +231 -0
  23. data/lib/spreadsheet/excel/rgb.rb +122 -0
  24. data/lib/spreadsheet/excel/row.rb +98 -0
  25. data/lib/spreadsheet/excel/sst_entry.rb +46 -0
  26. data/lib/spreadsheet/excel/workbook.rb +80 -0
  27. data/lib/spreadsheet/excel/worksheet.rb +115 -0
  28. data/lib/spreadsheet/excel/writer.rb +1 -0
  29. data/lib/spreadsheet/excel/writer/biff8.rb +75 -0
  30. data/lib/spreadsheet/excel/writer/format.rb +264 -0
  31. data/lib/spreadsheet/excel/writer/n_worksheet.rb +888 -0
  32. data/lib/spreadsheet/excel/writer/workbook.rb +735 -0
  33. data/lib/spreadsheet/excel/writer/worksheet.rb +940 -0
  34. data/lib/spreadsheet/font.rb +115 -0
  35. data/lib/spreadsheet/format.rb +209 -0
  36. data/lib/spreadsheet/formula.rb +9 -0
  37. data/lib/spreadsheet/helpers.rb +11 -0
  38. data/lib/spreadsheet/link.rb +43 -0
  39. data/lib/spreadsheet/note.rb +23 -0
  40. data/lib/spreadsheet/noteObject.rb +17 -0
  41. data/lib/spreadsheet/row.rb +151 -0
  42. data/lib/spreadsheet/workbook.rb +143 -0
  43. data/lib/spreadsheet/worksheet.rb +326 -0
  44. data/lib/spreadsheet/writer.rb +30 -0
  45. data/test/data/test_adding_data_to_existing_file.xls +0 -0
  46. data/test/data/test_borders.xls +0 -0
  47. data/test/data/test_changes.xls +0 -0
  48. data/test/data/test_comment.xls +0 -0
  49. data/test/data/test_copy.xls +0 -0
  50. data/test/data/test_datetime.xls +0 -0
  51. data/test/data/test_empty.xls +0 -0
  52. data/test/data/test_formula.xls +0 -0
  53. data/test/data/test_long_sst_record.xls +0 -0
  54. data/test/data/test_margin.xls +0 -0
  55. data/test/data/test_merged_and_protected.xls +0 -0
  56. data/test/data/test_merged_cells.xls +0 -0
  57. data/test/data/test_missing_row.xls +0 -0
  58. data/test/data/test_pagesetup.xls +0 -0
  59. data/test/data/test_version_excel5.xls +0 -0
  60. data/test/data/test_version_excel95.xls +0 -0
  61. data/test/data/test_version_excel97.xls +0 -0
  62. data/test/data/test_version_excel97_2010.xls +0 -0
  63. data/test/data/test_worksheet_visibility.xls +0 -0
  64. data/test/excel/reader.rb +30 -0
  65. data/test/excel/row.rb +40 -0
  66. data/test/excel/writer/workbook.rb +95 -0
  67. data/test/excel/writer/worksheet.rb +81 -0
  68. data/test/font.rb +163 -0
  69. data/test/format.rb +95 -0
  70. data/test/integration.rb +1390 -0
  71. data/test/row.rb +33 -0
  72. data/test/suite.rb +18 -0
  73. data/test/workbook.rb +55 -0
  74. data/test/workbook_protection.rb +19 -0
  75. data/test/worksheet.rb +112 -0
  76. metadata +148 -0
@@ -0,0 +1,30 @@
1
+ module Spreadsheet
2
+ ##
3
+ # Parent Class for all Writers. Implements the copying of unmodified
4
+ # Spreadsheet documents.
5
+ class Writer
6
+ def initialize io_or_path
7
+ @io_or_path = io_or_path
8
+ end
9
+ def write workbook
10
+ if @io_or_path.respond_to? :seek
11
+ @io_or_path.binmode
12
+ write_workbook workbook, @io_or_path
13
+ else
14
+ File.open(@io_or_path, "wb+") do |fh|
15
+ write_workbook workbook, fh
16
+ end
17
+ end
18
+ end
19
+ private
20
+ def write_workbook workbook, io
21
+ reader = workbook.io
22
+ unless io == reader
23
+ reader.rewind
24
+ data = reader.read
25
+ io.rewind
26
+ io.write data
27
+ end
28
+ end
29
+ end
30
+ end
Binary file
Binary file
Binary file
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+ # Excel::TestReader -- Spreadsheet -- 22.01.2013
3
+
4
+ $: << File.expand_path('../../../lib', File.dirname(__FILE__))
5
+
6
+ require 'test/unit'
7
+
8
+ module Spreadsheet
9
+ module Excel
10
+ class TestReader < Test::Unit::TestCase
11
+ def test_empty_file_error_on_setup
12
+ reader = Spreadsheet::Excel::Reader.new
13
+ empty_io = StringIO.new
14
+ assert_raise RuntimeError do
15
+ reader.setup empty_io
16
+ end
17
+ end
18
+
19
+ def test_not_empty_file_error_on_setup
20
+ reader = Spreadsheet::Excel::Reader.new
21
+ data = File.expand_path File.join('test', 'data')
22
+ path = File.join data, 'test_empty.xls'
23
+ not_empty_io = File.open(path, "rb")
24
+ assert_nothing_thrown do
25
+ reader.setup not_empty_io
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env ruby
2
+ # Excel::TestRow -- Spreadsheet -- 12.10.2008 -- hwyss@ywesee.com
3
+
4
+ $: << File.expand_path('../../lib', File.dirname(__FILE__))
5
+
6
+ require 'test/unit'
7
+ require 'spreadsheet'
8
+
9
+ module Spreadsheet
10
+ module Excel
11
+ class TestRow < Test::Unit::TestCase
12
+ def setup
13
+ @workbook = Excel::Workbook.new
14
+ @worksheet = Excel::Worksheet.new
15
+ @workbook.add_worksheet @worksheet
16
+ end
17
+ def test_date
18
+ row = Row.new @worksheet, 0, [nil, 27627.6789]
19
+ assert_equal Date.new(1975,8,21), row.date(1)
20
+ end
21
+ def test_to_a
22
+ row = Row.new @worksheet, 0, [nil, 1, 27627.6789]
23
+ row.set_format(2, Format.new(:number_format => 'DD.MM.YYYY'))
24
+ assert_equal [nil, 1, Date.new(1975, 8, 21)], row.to_a
25
+ end
26
+ def test_datetime
27
+ row = Row.new @worksheet, 0, [nil, 27627.765]
28
+ d1 = DateTime.new(1975,8,21) + 0.765
29
+ d2 = row.datetime 1
30
+ assert_equal d1, d2
31
+ end
32
+ def test_datetime_overflow
33
+ row = Row.new @worksheet, 0, [nil, 40010.6666666666]
34
+ d1 = DateTime.new(2009,07,16,16)
35
+ d2 = row.datetime 1
36
+ assert_equal d1, d2
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env ruby
2
+ # Excel::Writer::TestWorkbook -- Spreadsheet -- 20.07.2011 -- vanderhoorn@gmail.com
3
+
4
+ $: << File.expand_path('../../../lib', File.dirname(__FILE__))
5
+
6
+ require 'test/unit'
7
+ require 'spreadsheet'
8
+
9
+ module Spreadsheet
10
+ module Excel
11
+ module Writer
12
+ class TestWorkbook < Test::Unit::TestCase
13
+ def setup
14
+ @book = Spreadsheet::Excel::Workbook.new
15
+ assert_instance_of Excel::Workbook, @book
16
+ assert_equal @book.worksheets.size, 0
17
+ @workbook_writer = Excel::Writer::Workbook.new @book
18
+ end
19
+ def test_sanitize_worksheets
20
+ assert_nothing_raised { @workbook_writer.sanitize_worksheets @book.worksheets }
21
+ end
22
+ def test_collect_formats
23
+ assert_equal 17, @workbook_writer.collect_formats(@book).length # Expected for vanilla
24
+ sheet = @book.create_worksheet
25
+ rowi=-1
26
+
27
+ f1 = Spreadsheet::Format.new
28
+ sheet.row(rowi+=1).default_format = f1
29
+ assert_equal 18, @workbook_writer.collect_formats(@book).length
30
+
31
+ f2 = Spreadsheet::Format.new
32
+ sheet.row(rowi+=1).default_format = f2
33
+ assert_equal 19, @workbook_writer.collect_formats(@book).length
34
+
35
+ sheet.row(rowi+=1).default_format = f2
36
+ assert_equal 19, @workbook_writer.collect_formats(@book).length # Ignores duplicates
37
+ end
38
+ def test_xf_index
39
+ sheet = @book.create_worksheet
40
+ rowi=-1
41
+
42
+ f1 = Spreadsheet::Format.new
43
+ sheet.row(rowi+=1).default_format = f1
44
+ @workbook_writer.collect_formats(@book)
45
+ assert_equal 17, @workbook_writer.xf_index(@book, f1)
46
+
47
+ f2 = Spreadsheet::Format.new
48
+ sheet.row(rowi+=1).default_format = f2
49
+ @workbook_writer.collect_formats(@book)
50
+ assert_equal 18, @workbook_writer.xf_index(@book, f2)
51
+
52
+ end
53
+ def test_write_fonts
54
+ num_written = 0
55
+ sheet = @book.create_worksheet
56
+ rowi=-1
57
+ # Stub inner #write_font as a counter:
58
+ (class << @workbook_writer; self; end).send(:define_method, :write_font) do |*args|
59
+ num_written += 1
60
+ end
61
+ io = StringIO.new("")
62
+
63
+ num_written = 0
64
+ @workbook_writer.collect_formats(@book)
65
+ @workbook_writer.write_fonts(@book, io)
66
+ assert_equal 1, num_written # Default format's font
67
+
68
+ f1 = Spreadsheet::Format.new
69
+ sheet.row(rowi+=1).default_format = f1
70
+ num_written = 0
71
+ @workbook_writer.collect_formats(@book)
72
+ @workbook_writer.write_fonts(@book, io)
73
+ assert_equal 1, num_written # No new fonts
74
+
75
+ f2 = Spreadsheet::Format.new
76
+ f2.font = Spreadsheet::Font.new("Foo")
77
+ sheet.row(rowi+=1).default_format = f2
78
+ num_written = 0
79
+ @workbook_writer.collect_formats(@book)
80
+ @workbook_writer.write_fonts(@book, io)
81
+ assert_equal 2, num_written # 2 distinct fonts total
82
+
83
+ f3 = Spreadsheet::Format.new
84
+ f3.font = f2.font # Re-use previous font
85
+ sheet.row(rowi+=1).default_format = f3
86
+ num_written = 0
87
+ @workbook_writer.collect_formats(@book)
88
+ @workbook_writer.write_fonts(@book, io)
89
+ assert_equal 2, num_written # 2 distinct fonts total still
90
+
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env ruby
2
+ # Excel::Writer::TestWorksheet -- Spreadheet -- 21.11.2007 -- hwyss@ywesee.com
3
+
4
+ require 'test/unit'
5
+ require 'spreadsheet/excel/writer/worksheet'
6
+
7
+ module Spreadsheet
8
+ module Excel
9
+ module Writer
10
+ class TestWorksheet < Test::Unit::TestCase
11
+ def test_need_number
12
+ sheet = Worksheet.new nil, nil
13
+ assert_equal false, sheet.need_number?(10)
14
+ assert_equal false, sheet.need_number?(114.55)
15
+ assert_equal false, sheet.need_number?(0.1)
16
+ assert_equal false, sheet.need_number?(0.01)
17
+ assert_equal false, sheet.need_number?(0 / 0.0) # NaN
18
+ assert_equal true, sheet.need_number?(0.001)
19
+ assert_equal true, sheet.need_number?(10000000.0)
20
+ end
21
+
22
+ class RowMock
23
+ attr_accessor :idx, :first_used, :first_unused, :height, :outline_level
24
+
25
+ def initialize
26
+ @idx, @first_used, @first_unused, @height, @outline_level = 0,0,0,0,1
27
+ end
28
+
29
+ def method_missing name, *args
30
+ nil
31
+ end
32
+ end
33
+
34
+ def test_write_row_should_not_write_if_the_row_has_no_used_columns
35
+ sheet = Worksheet.new nil, nil
36
+ row = RowMock.new
37
+ row.first_used = nil
38
+
39
+ sheet.write_row row
40
+
41
+ assert_equal '', sheet.data
42
+ end
43
+
44
+ def test_write_row_should_write_if_any_column_is_used
45
+ sheet = Worksheet.new nil, nil
46
+ row = RowMock.new
47
+
48
+ sheet.write_row row
49
+
50
+ assert_equal false, sheet.data.empty?
51
+ end
52
+
53
+ def test_strings
54
+ book = Spreadsheet::Excel::Workbook.new
55
+ sheet = book.create_worksheet
56
+ writer = Worksheet.new book, sheet
57
+ rowi = -1
58
+
59
+ assert_equal(
60
+ {},
61
+ writer.strings
62
+ )
63
+
64
+ sheet.row(rowi+=1).concat(["Hello", "World"])
65
+ assert_equal(
66
+ {"Hello" => 1, "World" => 1},
67
+ writer.strings
68
+ )
69
+
70
+ sheet.row(rowi+=1).concat(["Goodbye", "Cruel", "World", 2012])
71
+ assert_equal(
72
+ {"Hello" => 1, "Goodbye" => 1, "Cruel" => 1, "World" => 2},
73
+ writer.strings
74
+ )
75
+
76
+ end
77
+
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,163 @@
1
+ #!/usr/bin/env ruby
2
+ # TestFont -- Spreadsheet -- 09.10.2008 -- hwyss@ywesee.com
3
+
4
+ $: << File.expand_path('../lib', File.dirname(__FILE__))
5
+
6
+ require 'test/unit'
7
+ require 'spreadsheet'
8
+
9
+ module Spreadsheet
10
+ class TestFont < Test::Unit::TestCase
11
+ def setup
12
+ @font = Font.new 'Arial'
13
+ end
14
+ def test_italic
15
+ assert_equal false, @font.italic
16
+ @font.italic!
17
+ assert_equal true, @font.italic
18
+ @font.italic = nil
19
+ assert_equal false, @font.italic
20
+ @font.italic = 1
21
+ assert_equal true, @font.italic
22
+ end
23
+ def test_encoding
24
+ assert_equal :default, @font.encoding
25
+ @font.encoding = :apple_roman
26
+ assert_equal :apple_roman, @font.encoding
27
+ @font.encoding = 'Chinese Simplified'
28
+ assert_equal :chinese_simplified, @font.encoding
29
+ assert_raises ArgumentError do @font.size = 'ascii' end
30
+ assert_equal :chinese_simplified, @font.encoding
31
+ @font.encoding = nil
32
+ assert_equal :default, @font.encoding
33
+ end
34
+ def test_family
35
+ assert_equal :none, @font.family
36
+ @font.family = :roman
37
+ assert_equal :roman, @font.family
38
+ @font.family = 'Swiss'
39
+ assert_equal :swiss, @font.family
40
+ assert_raises ArgumentError do @font.size = :greek end
41
+ assert_equal :swiss, @font.family
42
+ @font.family = nil
43
+ assert_equal :none, @font.family
44
+ end
45
+ def test_name
46
+ assert_equal 'Arial', @font.name
47
+ @font.name = 'Helvetica'
48
+ assert_equal 'Helvetica', @font.name
49
+ end
50
+ def test_outline
51
+ assert_equal false, @font.outline
52
+ @font.outline!
53
+ assert_equal true, @font.outline
54
+ @font.outline = nil
55
+ assert_equal false, @font.outline
56
+ @font.outline = 1
57
+ assert_equal true, @font.outline
58
+ end
59
+ def test_escapement
60
+ assert_equal :normal, @font.escapement
61
+ @font.escapement = :superscript
62
+ assert_equal :superscript, @font.escapement
63
+ @font.escapement = 'sub'
64
+ assert_equal :subscript, @font.escapement
65
+ assert_raises ArgumentError do @font.size = "upwards" end
66
+ assert_equal :subscript, @font.escapement
67
+ @font.escapement = nil
68
+ assert_equal :normal, @font.escapement
69
+ end
70
+ def test_shadow
71
+ assert_equal false, @font.shadow
72
+ @font.shadow!
73
+ assert_equal true, @font.shadow
74
+ @font.shadow = nil
75
+ assert_equal false, @font.shadow
76
+ @font.shadow = 1
77
+ assert_equal true, @font.shadow
78
+ end
79
+ def test_size
80
+ assert_equal 10, @font.size
81
+ @font.size = 12
82
+ assert_equal 12, @font.size
83
+ @font.size = 11.2
84
+ assert_equal 11.2, @font.size
85
+ assert_raises ArgumentError do @font.size = "123" end
86
+ end
87
+ def test_strikeout
88
+ assert_equal false, @font.strikeout
89
+ @font.strikeout!
90
+ assert_equal true, @font.strikeout
91
+ @font.strikeout = nil
92
+ assert_equal false, @font.strikeout
93
+ @font.strikeout = 1
94
+ assert_equal true, @font.strikeout
95
+ end
96
+ def test_underline
97
+ assert_equal :none, @font.underline
98
+ @font.underline = :single
99
+ assert_equal :single, @font.underline
100
+ @font.underline = 'double accounting'
101
+ assert_equal :double_accounting, @font.underline
102
+ assert_raises ArgumentError do @font.size = :triple end
103
+ assert_equal :double_accounting, @font.underline
104
+ @font.underline = nil
105
+ assert_equal :none, @font.underline
106
+ @font.underline = true
107
+ assert_equal :single, @font.underline
108
+ end
109
+ def test_weight
110
+ assert_equal :normal, @font.weight
111
+ @font.weight = :bold
112
+ assert_equal :bold, @font.weight
113
+ @font.weight = 100
114
+ assert_equal 100, @font.weight
115
+ assert_raises ArgumentError do @font.weight = Object.new end
116
+ assert_equal 100, @font.weight
117
+ @font.weight = 'bold'
118
+ assert_equal :bold, @font.weight
119
+ @font.weight = nil
120
+ assert_equal :normal, @font.weight
121
+ end
122
+ def test_key
123
+ expected = 'Arial_10_normal_normal_none_text_none_default'
124
+ assert_equal expected, @font.key
125
+ @font.name = 'Helvetica'
126
+ expected = 'Helvetica_10_normal_normal_none_text_none_default'
127
+ assert_equal expected, @font.key
128
+ @font.size = 12
129
+ expected = 'Helvetica_12_normal_normal_none_text_none_default'
130
+ assert_equal expected, @font.key
131
+ @font.weight = :bold
132
+ expected = 'Helvetica_12_bold_normal_none_text_none_default'
133
+ assert_equal expected, @font.key
134
+ @font.italic!
135
+ expected = 'Helvetica_12_bold_italic_normal_none_text_none_default'
136
+ assert_equal expected, @font.key
137
+ @font.strikeout!
138
+ expected = 'Helvetica_12_bold_italic_strikeout_normal_none_text_none_default'
139
+ assert_equal expected, @font.key
140
+ @font.outline!
141
+ expected = 'Helvetica_12_bold_italic_strikeout_outline_normal_none_text_none_default'
142
+ assert_equal expected, @font.key
143
+ @font.shadow!
144
+ expected = 'Helvetica_12_bold_italic_strikeout_outline_shadow_normal_none_text_none_default'
145
+ assert_equal expected, @font.key
146
+ @font.escapement = :super
147
+ expected = 'Helvetica_12_bold_italic_strikeout_outline_shadow_superscript_none_text_none_default'
148
+ assert_equal expected, @font.key
149
+ @font.underline = :double
150
+ expected = 'Helvetica_12_bold_italic_strikeout_outline_shadow_superscript_double_text_none_default'
151
+ assert_equal expected, @font.key
152
+ @font.color = :blue
153
+ expected = 'Helvetica_12_bold_italic_strikeout_outline_shadow_superscript_double_blue_none_default'
154
+ assert_equal expected, @font.key
155
+ @font.family = :swiss
156
+ expected = 'Helvetica_12_bold_italic_strikeout_outline_shadow_superscript_double_blue_swiss_default'
157
+ assert_equal expected, @font.key
158
+ @font.encoding = :iso_latin1
159
+ expected = 'Helvetica_12_bold_italic_strikeout_outline_shadow_superscript_double_blue_swiss_iso_latin1'
160
+ assert_equal expected, @font.key
161
+ end
162
+ end
163
+ end