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