spreadsheet 1.3.3 → 1.3.5
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.
- checksums.yaml +4 -4
- data/bin/irb +29 -0
- data/bin/racc +29 -0
- data/bin/rdbg +29 -0
- data/bin/rdoc +29 -0
- data/bin/ri +29 -0
- data/bin/rubocop +29 -0
- data/bin/ruby-parse +29 -0
- data/bin/ruby-rewrite +29 -0
- data/bin/standardrb +29 -0
- data/bin/test-unit +29 -0
- data/lib/parseexcel/parseexcel.rb +66 -58
- data/lib/parseexcel/parser.rb +1 -1
- data/lib/parseexcel.rb +1 -1
- data/lib/spreadsheet/column.rb +13 -10
- data/lib/spreadsheet/compatibility.rb +3 -1
- data/lib/spreadsheet/datatypes.rb +150 -147
- data/lib/spreadsheet/encodings.rb +20 -16
- data/lib/spreadsheet/errors.rb +2 -2
- data/lib/spreadsheet/excel/error.rb +23 -22
- data/lib/spreadsheet/excel/internals/biff5.rb +11 -11
- data/lib/spreadsheet/excel/internals/biff8.rb +13 -13
- data/lib/spreadsheet/excel/internals.rb +451 -451
- data/lib/spreadsheet/excel/offset.rb +34 -31
- data/lib/spreadsheet/excel/password_hash.rb +18 -18
- data/lib/spreadsheet/excel/reader/biff5.rb +34 -35
- data/lib/spreadsheet/excel/reader/biff8.rb +235 -222
- data/lib/spreadsheet/excel/reader.rb +1331 -1274
- data/lib/spreadsheet/excel/rgb.rb +91 -91
- data/lib/spreadsheet/excel/row.rb +99 -91
- data/lib/spreadsheet/excel/sst_entry.rb +41 -38
- data/lib/spreadsheet/excel/workbook.rb +87 -76
- data/lib/spreadsheet/excel/worksheet.rb +126 -107
- data/lib/spreadsheet/excel/writer/biff8.rb +57 -55
- data/lib/spreadsheet/excel/writer/format.rb +274 -256
- data/lib/spreadsheet/excel/writer/n_worksheet.rb +838 -798
- data/lib/spreadsheet/excel/writer/workbook.rb +672 -635
- data/lib/spreadsheet/excel/writer/worksheet.rb +899 -861
- data/lib/spreadsheet/excel/writer.rb +1 -1
- data/lib/spreadsheet/excel.rb +19 -12
- data/lib/spreadsheet/font.rb +31 -26
- data/lib/spreadsheet/format.rb +75 -59
- data/lib/spreadsheet/link.rb +8 -5
- data/lib/spreadsheet/note.rb +7 -6
- data/lib/spreadsheet/noteObject.rb +6 -5
- data/lib/spreadsheet/row.rb +35 -24
- data/lib/spreadsheet/version.rb +1 -1
- data/lib/spreadsheet/workbook.rb +28 -13
- data/lib/spreadsheet/worksheet.rb +103 -68
- data/lib/spreadsheet/writer.rb +3 -0
- data/lib/spreadsheet.rb +12 -15
- data/test/data/test_row_record_empty_range.xls +0 -0
- data/test/excel/reader.rb +8 -8
- data/test/excel/row.rb +35 -31
- data/test/excel/writer/workbook.rb +18 -16
- data/test/excel/writer/worksheet.rb +10 -8
- data/test/font.rb +44 -32
- data/test/format.rb +38 -33
- data/test/integration.rb +641 -598
- data/test/row.rb +5 -3
- data/test/suite.rb +7 -7
- data/test/workbook.rb +15 -14
- data/test/workbook_protection.rb +5 -5
- data/test/worksheet.rb +36 -34
- metadata +59 -6
data/lib/spreadsheet/row.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require
|
|
1
|
+
require "spreadsheet/helpers"
|
|
2
2
|
|
|
3
3
|
module Spreadsheet
|
|
4
4
|
##
|
|
@@ -18,19 +18,21 @@ module Spreadsheet
|
|
|
18
18
|
# #height:: The height of this Row in points (defaults to 12).
|
|
19
19
|
class Row < Array
|
|
20
20
|
include Datatypes
|
|
21
|
+
|
|
21
22
|
class << self
|
|
22
23
|
def format_updater *keys
|
|
23
24
|
keys.each do |key|
|
|
24
|
-
unless
|
|
25
|
+
unless method_defined?("unupdated_#{key}=")
|
|
25
26
|
alias_method :"unupdated_#{key}=", :"#{key}="
|
|
26
|
-
define_method "#{key}=" do |value|
|
|
27
|
-
send "unupdated_#{key}=", value
|
|
28
|
-
@worksheet
|
|
27
|
+
define_method :"#{key}=" do |value|
|
|
28
|
+
send :"unupdated_#{key}=", value
|
|
29
|
+
@worksheet&.row_updated @idx, self
|
|
29
30
|
value
|
|
30
31
|
end
|
|
31
32
|
end
|
|
32
33
|
end
|
|
33
34
|
end
|
|
35
|
+
|
|
34
36
|
def updater *keys
|
|
35
37
|
keys.each do |key|
|
|
36
38
|
## Passing blocks to methods defined with define_method is not possible
|
|
@@ -38,10 +40,10 @@ module Spreadsheet
|
|
|
38
40
|
# http://groups.google.com/group/ruby-talk-google/msg/778184912b769e5f
|
|
39
41
|
# use class_eval as suggested by someone else in
|
|
40
42
|
# http://rubyforge.org/tracker/index.php?func=detail&aid=25732&group_id=678&atid=2677
|
|
41
|
-
class_eval <<-SRC, __FILE__, __LINE__
|
|
43
|
+
class_eval <<-SRC, __FILE__, __LINE__ + 1
|
|
42
44
|
def #{key}(*args)
|
|
43
45
|
res = super(*args)
|
|
44
|
-
@worksheet
|
|
46
|
+
@worksheet&.row_updated @idx, self
|
|
45
47
|
res
|
|
46
48
|
end
|
|
47
49
|
SRC
|
|
@@ -53,43 +55,49 @@ module Spreadsheet
|
|
|
53
55
|
boolean :hidden, :collapsed
|
|
54
56
|
enum :outline_level, 0, Integer
|
|
55
57
|
updater :[]=, :clear, :concat, :delete, :delete_if, :fill, :insert, :map!,
|
|
56
|
-
|
|
57
|
-
|
|
58
|
+
:pop, :push, :reject!, :replace, :reverse!, :shift, :slice!,
|
|
59
|
+
:sort!, :uniq!, :unshift
|
|
58
60
|
format_updater :collapsed, :height, :hidden, :outline_level
|
|
59
|
-
def initialize worksheet, idx, cells=[]
|
|
61
|
+
def initialize worksheet, idx, cells = []
|
|
60
62
|
@default_format = nil
|
|
61
63
|
@worksheet = worksheet
|
|
62
64
|
@idx = idx
|
|
63
|
-
super
|
|
65
|
+
super(cells)
|
|
64
66
|
@formats = []
|
|
65
67
|
@height = 12.1
|
|
66
68
|
end
|
|
69
|
+
|
|
67
70
|
##
|
|
68
71
|
# The default Format of this Row, if you have set one.
|
|
69
72
|
# Returns the Worksheet's default or the Workbook's default Format otherwise.
|
|
70
73
|
def default_format
|
|
71
|
-
@default_format || @worksheet
|
|
74
|
+
@default_format || @worksheet&.default_format || @workbook.default_format
|
|
72
75
|
end
|
|
76
|
+
|
|
73
77
|
##
|
|
74
78
|
# Set the default Format used when writing a Cell if no explicit Format is
|
|
75
79
|
# stored for the cell.
|
|
76
80
|
def default_format= format
|
|
77
|
-
@worksheet
|
|
81
|
+
@worksheet&.add_format format
|
|
78
82
|
@default_format = format
|
|
79
83
|
end
|
|
80
84
|
format_updater :default_format
|
|
81
85
|
##
|
|
82
86
|
# #first_used the 0-based index of the first non-blank Cell.
|
|
83
87
|
def first_used
|
|
84
|
-
[
|
|
88
|
+
[index_of_first(self), index_of_first(@formats)].compact.min
|
|
85
89
|
end
|
|
90
|
+
|
|
86
91
|
##
|
|
87
92
|
# The Format for the Cell at _idx_ (0-based), or the first valid Format in
|
|
88
93
|
# Row#default_format, Column#default_format and Worksheet#default_format.
|
|
89
94
|
def format idx
|
|
90
|
-
|
|
91
|
-
|| @
|
|
95
|
+
if @worksheet
|
|
96
|
+
@formats[idx] || @default_format \
|
|
97
|
+
|| @worksheet.column(idx).default_format
|
|
98
|
+
end
|
|
92
99
|
end
|
|
100
|
+
|
|
93
101
|
##
|
|
94
102
|
# Returns a copy of self with nil-values appended for empty cells that have
|
|
95
103
|
# an associated Format.
|
|
@@ -102,30 +110,32 @@ module Spreadsheet
|
|
|
102
110
|
end
|
|
103
111
|
copy
|
|
104
112
|
end
|
|
113
|
+
|
|
105
114
|
##
|
|
106
115
|
# Same as Row#size, but takes into account formatted empty cells
|
|
107
116
|
def formatted_size
|
|
108
117
|
Helpers.rcompact(@formats)
|
|
109
118
|
sz = size
|
|
110
119
|
fs = @formats.size
|
|
111
|
-
fs > sz ? fs : sz
|
|
120
|
+
(fs > sz) ? fs : sz
|
|
112
121
|
end
|
|
113
122
|
##
|
|
114
123
|
# #first_unused (really last used + 1) - the 0-based index of the first of
|
|
115
124
|
# all remaining contiguous blank Cells.
|
|
116
|
-
|
|
125
|
+
alias_method :first_unused, :formatted_size
|
|
117
126
|
def inspect
|
|
118
127
|
variables = instance_variables.collect do |name|
|
|
119
128
|
"%s=%s" % [name, instance_variable_get(name)]
|
|
120
|
-
end.join(
|
|
129
|
+
end.join(" ")
|
|
121
130
|
sprintf "#<%s:0x%014x %s %s>", self.class, object_id, variables, super
|
|
122
131
|
end
|
|
132
|
+
|
|
123
133
|
##
|
|
124
134
|
# Set the Format for the Cell at _idx_ (0-based).
|
|
125
135
|
def set_format idx, fmt
|
|
126
136
|
@formats[idx] = fmt
|
|
127
|
-
@worksheet
|
|
128
|
-
@worksheet
|
|
137
|
+
@worksheet&.add_format fmt
|
|
138
|
+
@worksheet&.row_updated @idx, self
|
|
129
139
|
fmt
|
|
130
140
|
end
|
|
131
141
|
|
|
@@ -137,13 +147,14 @@ module Spreadsheet
|
|
|
137
147
|
fmt.font = fmt.font.clone
|
|
138
148
|
@formats[idx] = fmt.update_format(opts)
|
|
139
149
|
end
|
|
140
|
-
@worksheet
|
|
141
|
-
@worksheet
|
|
150
|
+
@worksheet&.add_format @formats[idx]
|
|
151
|
+
@worksheet&.row_updated @idx, self
|
|
142
152
|
end
|
|
143
153
|
|
|
144
154
|
private
|
|
155
|
+
|
|
145
156
|
def index_of_first ary # :nodoc:
|
|
146
|
-
if first = ary.find
|
|
157
|
+
if (first = ary.find { |elm| !elm.nil? })
|
|
147
158
|
ary.index first
|
|
148
159
|
end
|
|
149
160
|
end
|
data/lib/spreadsheet/version.rb
CHANGED
data/lib/spreadsheet/workbook.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
require
|
|
2
|
-
require
|
|
1
|
+
require "spreadsheet/format"
|
|
2
|
+
require "spreadsheet/encodings"
|
|
3
3
|
|
|
4
4
|
module Spreadsheet
|
|
5
5
|
##
|
|
@@ -12,19 +12,21 @@ module Spreadsheet
|
|
|
12
12
|
# Row#default_format or Worksheet#default_format.
|
|
13
13
|
class Workbook
|
|
14
14
|
include Spreadsheet::Encodings
|
|
15
|
+
|
|
15
16
|
attr_reader :io, :worksheets, :formats, :fonts, :palette
|
|
16
17
|
attr_accessor :active_worksheet, :encoding, :default_format, :version
|
|
17
|
-
def initialize io = nil, opts={:
|
|
18
|
+
def initialize io = nil, opts = {default_format: Format.new}
|
|
18
19
|
@worksheets = []
|
|
19
20
|
@io = io
|
|
20
21
|
@fonts = []
|
|
21
22
|
@palette = {}
|
|
22
23
|
@formats = []
|
|
23
24
|
@formats_set = {}
|
|
24
|
-
if @default_format = opts[:default_format]
|
|
25
|
+
if (@default_format = opts[:default_format])
|
|
25
26
|
add_format @default_format
|
|
26
27
|
end
|
|
27
28
|
end
|
|
29
|
+
|
|
28
30
|
##
|
|
29
31
|
# Add a Font to the Workbook. Used by the parser. You should not need to
|
|
30
32
|
# use this Method.
|
|
@@ -32,6 +34,7 @@ module Spreadsheet
|
|
|
32
34
|
@fonts.push(font).uniq! if font
|
|
33
35
|
font
|
|
34
36
|
end
|
|
37
|
+
|
|
35
38
|
##
|
|
36
39
|
# Add a Format to the Workbook. If you use Row#set_format, you should not
|
|
37
40
|
# need to use this Method.
|
|
@@ -42,6 +45,7 @@ module Spreadsheet
|
|
|
42
45
|
end
|
|
43
46
|
format
|
|
44
47
|
end
|
|
48
|
+
|
|
45
49
|
##
|
|
46
50
|
# Add a Worksheet to the Workbook.
|
|
47
51
|
def add_worksheet worksheet
|
|
@@ -49,18 +53,21 @@ module Spreadsheet
|
|
|
49
53
|
@worksheets.push worksheet
|
|
50
54
|
worksheet
|
|
51
55
|
end
|
|
56
|
+
|
|
52
57
|
##
|
|
53
58
|
# Delete a Worksheet from Workbook by it's index
|
|
54
59
|
def delete_worksheet worksheet_index
|
|
55
60
|
@worksheets.delete_at worksheet_index
|
|
56
61
|
end
|
|
62
|
+
|
|
57
63
|
##
|
|
58
64
|
# Change the RGB components of the elements in the colour palette.
|
|
59
65
|
def set_custom_color idx, red, green, blue
|
|
60
|
-
raise
|
|
66
|
+
raise "Invalid format" if [red, green, blue].find { |c| !(0..255).cover?(c) }
|
|
61
67
|
|
|
62
68
|
@palette[idx] = [red, green, blue]
|
|
63
69
|
end
|
|
70
|
+
|
|
64
71
|
##
|
|
65
72
|
# Create a new Worksheet in this Workbook.
|
|
66
73
|
# Used without options this creates a Worksheet with the name 'WorksheetN'
|
|
@@ -69,20 +76,23 @@ module Spreadsheet
|
|
|
69
76
|
# Use the option <em>:name => 'My pretty Name'</em> to override this
|
|
70
77
|
# behavior.
|
|
71
78
|
def create_worksheet opts = {}
|
|
72
|
-
opts[:name] ||= client("Worksheet#{@worksheets.size.next}",
|
|
79
|
+
opts[:name] ||= client("Worksheet#{@worksheets.size.next}", "UTF-8")
|
|
73
80
|
add_worksheet Worksheet.new(opts)
|
|
74
81
|
end
|
|
82
|
+
|
|
75
83
|
##
|
|
76
84
|
# Returns the count of total worksheets present.
|
|
77
85
|
# Takes no arguments. Just returns the length of @worksheets array.
|
|
78
86
|
def sheet_count
|
|
79
87
|
@worksheets.length
|
|
80
88
|
end
|
|
89
|
+
|
|
81
90
|
##
|
|
82
91
|
# The Font at _idx_
|
|
83
92
|
def font idx
|
|
84
93
|
@fonts[idx]
|
|
85
94
|
end
|
|
95
|
+
|
|
86
96
|
##
|
|
87
97
|
# The Format at _idx_, or - if _idx_ is a String -
|
|
88
98
|
# the Format with name == _idx_
|
|
@@ -91,23 +101,26 @@ module Spreadsheet
|
|
|
91
101
|
when Integer
|
|
92
102
|
@formats[idx] || @default_format || Format.new
|
|
93
103
|
when String
|
|
94
|
-
@formats.find
|
|
104
|
+
@formats.find { |fmt| fmt.name == idx }
|
|
95
105
|
end
|
|
96
106
|
end
|
|
107
|
+
|
|
97
108
|
def inspect
|
|
98
109
|
variables = (instance_variables - uninspect_variables).collect do |name|
|
|
99
110
|
"%s=%s" % [name, instance_variable_get(name)]
|
|
100
|
-
end.join(
|
|
111
|
+
end.join(" ")
|
|
101
112
|
uninspect = uninspect_variables.collect do |name|
|
|
102
113
|
var = instance_variable_get name
|
|
103
114
|
"%s=%s[%i]" % [name, var.class, var.size]
|
|
104
|
-
end.join(
|
|
115
|
+
end.join(" ")
|
|
105
116
|
sprintf "#<%s:0x%014x %s %s>", self.class, object_id,
|
|
106
|
-
|
|
117
|
+
variables, uninspect
|
|
107
118
|
end
|
|
119
|
+
|
|
108
120
|
def uninspect_variables # :nodoc:
|
|
109
|
-
%w
|
|
121
|
+
%w[@formats @fonts @worksheets]
|
|
110
122
|
end
|
|
123
|
+
|
|
111
124
|
##
|
|
112
125
|
# The Worksheet at _idx_, or - if _idx_ is a String -
|
|
113
126
|
# the Worksheet with name == _idx_
|
|
@@ -116,9 +129,10 @@ module Spreadsheet
|
|
|
116
129
|
when Integer
|
|
117
130
|
@worksheets[idx]
|
|
118
131
|
when String
|
|
119
|
-
@worksheets.find
|
|
132
|
+
@worksheets.find { |sheet| sheet.name == idx }
|
|
120
133
|
end
|
|
121
134
|
end
|
|
135
|
+
|
|
122
136
|
##
|
|
123
137
|
# Write this Workbook to a File, IO Stream or Writer Object. The latter will
|
|
124
138
|
# make more sense once there are more than just an Excel-Writer available.
|
|
@@ -129,10 +143,11 @@ module Spreadsheet
|
|
|
129
143
|
writer(io_path_or_writer).write(self)
|
|
130
144
|
end
|
|
131
145
|
end
|
|
146
|
+
|
|
132
147
|
##
|
|
133
148
|
# Returns a new instance of the default Writer class for this Workbook (can
|
|
134
149
|
# only be an Excel::Writer::Workbook at this time)
|
|
135
|
-
def writer io_or_path, type=Excel, version=self.version
|
|
150
|
+
def writer io_or_path, type = Excel, version = self.version
|
|
136
151
|
if type == Excel
|
|
137
152
|
Excel::Writer::Workbook.new io_or_path
|
|
138
153
|
else
|