spreadsheet 1.0.8 → 1.0.9
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/.travis.yml +5 -2
- data/GUIDE.md +16 -15
- data/Gemfile +4 -0
- data/Gemfile.lock +11 -2
- data/History.md +8 -0
- data/lib/spreadsheet.rb +1 -1
- data/lib/spreadsheet/worksheet.rb +47 -0
- data/test/integration.rb +31 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f644ff72e11b9264344a7fa3b882bfc2cc36c67c
|
4
|
+
data.tar.gz: 9c76a7e5f862ca3a2706f3ec95f891225acfd1bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1cc27fc0a6b649df6eb051d086a847b56374c029223552da6027f1515fa72c5f22a97f7f3de2d4b8f6e92a812cfa1dc4e415e6f0fb108ea134714a5fc5d9d20c
|
7
|
+
data.tar.gz: 128c01ac9eced267751deffdaaa9b50bf7b5a635cea7656a64d05a821c1120377463dc80366092d25940a3f82a7dd64725ad275c0c10b0ec9855b4bfa295e28d
|
data/.travis.yml
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
language: ruby
|
2
|
+
sudo: false
|
3
|
+
cache: bundler
|
2
4
|
before_install:
|
3
5
|
- gem install bundler
|
4
6
|
bundler_args: --binstubs
|
5
|
-
script: "ruby
|
7
|
+
script: "bundle exec ruby test/suite.rb"
|
6
8
|
rvm:
|
7
9
|
- ruby-head
|
8
10
|
- 2.0.0
|
9
|
-
- 2.
|
11
|
+
- 2.2.3
|
12
|
+
- 2.1.7
|
10
13
|
- 1.9.3
|
11
14
|
- 1.9.2
|
12
15
|
- 1.8.7
|
data/GUIDE.md
CHANGED
@@ -2,16 +2,17 @@
|
|
2
2
|
This guide is meant to get you started using Spreadsheet. By the end of it,
|
3
3
|
you should be able to read and write Spreadsheets.
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
First, make sure all that code is loaded:
|
5
|
+
Before you can do anything, you first need to make sure all that code is
|
6
|
+
loaded:
|
8
7
|
|
9
8
|
```ruby
|
10
9
|
require 'spreadsheet'
|
11
10
|
```
|
12
11
|
|
13
|
-
|
14
|
-
|
12
|
+
## Reading is easy!
|
13
|
+
|
14
|
+
Worksheets come in various encodings. You need to tell Spreadsheet which
|
15
|
+
encoding you want to deal with. The default is UTF-8
|
15
16
|
|
16
17
|
```ruby
|
17
18
|
Spreadsheet.client_encoding = 'UTF-8'
|
@@ -23,13 +24,13 @@ Let's open a workbook:
|
|
23
24
|
book = Spreadsheet.open '/path/to/an/excel-file.xls'
|
24
25
|
```
|
25
26
|
|
26
|
-
We can either access all the
|
27
|
+
We can either access all the worksheets in a workbook...
|
27
28
|
|
28
29
|
```ruby
|
29
30
|
book.worksheets
|
30
31
|
```
|
31
32
|
|
32
|
-
...or access them by index or name (encoded in your client_encoding)
|
33
|
+
...or access them by index or name (encoded in your `client_encoding`).
|
33
34
|
|
34
35
|
```ruby
|
35
36
|
sheet1 = book.worksheet 0
|
@@ -37,8 +38,8 @@ sheet2 = book.worksheet 'Sheet1'
|
|
37
38
|
```
|
38
39
|
|
39
40
|
Now you can either iterate over all rows that contain some data. A call to
|
40
|
-
Worksheet.each without
|
41
|
-
|
41
|
+
`Worksheet.each` without arguments will omit empty rows at the beginning of the
|
42
|
+
worksheet:
|
42
43
|
|
43
44
|
```ruby
|
44
45
|
sheet1.each do |row|
|
@@ -46,7 +47,7 @@ sheet1.each do |row|
|
|
46
47
|
end
|
47
48
|
```
|
48
49
|
|
49
|
-
Or you can tell
|
50
|
+
Or you can tell a worksheet how many rows should be omitted at the beginning.
|
50
51
|
The following starts at the 3rd row, regardless of whether or not it or the
|
51
52
|
preceding rows contain any data:
|
52
53
|
|
@@ -62,17 +63,17 @@ Or you can access rows directly, by their index (0-based):
|
|
62
63
|
row = sheet1.row(3)
|
63
64
|
```
|
64
65
|
|
65
|
-
To access the values stored in a
|
66
|
+
To access the values stored in a row, treat the row like an array.
|
66
67
|
|
67
68
|
```ruby
|
68
69
|
row[0]
|
69
70
|
```
|
70
71
|
|
71
|
-
|
72
|
-
or DateTime object - or nil if the cell is empty.
|
72
|
+
This will return a `String`, a `Float`, an `Integer`, a `Formula`, a `Link` or a `Date`
|
73
|
+
or `DateTime` object - or `nil` if the cell is empty.
|
73
74
|
|
74
|
-
More information about the formatting of a cell can be found in the
|
75
|
-
with the equivalent index
|
75
|
+
More information about the formatting of a cell can be found in the format
|
76
|
+
with the equivalent index:
|
76
77
|
|
77
78
|
```ruby
|
78
79
|
row.format 2
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,14 +1,23 @@
|
|
1
1
|
GEM
|
2
2
|
remote: https://rubygems.org/
|
3
3
|
specs:
|
4
|
-
hoe (3.
|
4
|
+
hoe (3.14.2)
|
5
5
|
rake (>= 0.8, < 11.0)
|
6
|
-
|
6
|
+
minitest (5.8.2)
|
7
|
+
power_assert (0.2.4)
|
8
|
+
rake (10.4.2)
|
7
9
|
ruby-ole (1.2.11.8)
|
10
|
+
test-unit (3.1.5)
|
11
|
+
power_assert
|
8
12
|
|
9
13
|
PLATFORMS
|
10
14
|
ruby
|
11
15
|
|
12
16
|
DEPENDENCIES
|
13
17
|
hoe (>= 3.4)
|
18
|
+
minitest
|
14
19
|
ruby-ole
|
20
|
+
test-unit
|
21
|
+
|
22
|
+
BUNDLED WITH
|
23
|
+
1.10.6
|
data/History.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
### 1.0.9 / 18.11.2015
|
2
|
+
|
3
|
+
Author: 545ch4 <s@rprojekt.org>
|
4
|
+
Date: Mon Nov 16 10:26:27 2015 +0100
|
5
|
+
|
6
|
+
* Add smart method compact! to worksheet
|
7
|
+
* Use compact! to reduce the number of rows and columns by striping empty one at both ends.
|
8
|
+
|
1
9
|
### 1.0.8 / 20.10.2015
|
2
10
|
|
3
11
|
commit e9bd1dd34998803b63460f4951e9aa34e569bd8f
|
data/lib/spreadsheet.rb
CHANGED
@@ -311,6 +311,53 @@ module Spreadsheet
|
|
311
311
|
# FIXME enlarge or dup check
|
312
312
|
@merged_cells.push [start_row, end_row, start_col, end_col]
|
313
313
|
end
|
314
|
+
|
315
|
+
def compact!
|
316
|
+
recalculate_dimensions
|
317
|
+
|
318
|
+
# detect first non-nil non-empty row if given first row is empty or nil
|
319
|
+
if row(@dimensions[0]).empty? || row(@dimensions[0]).compact.join('').empty?
|
320
|
+
(@dimensions[0]...@dimensions[1]).each do |i|
|
321
|
+
break unless row(i).empty? || row(i).compact.join('').empty?
|
322
|
+
@dimensions[0] = i
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
326
|
+
# detect last non-nil non-empty row if given last row is empty or nil
|
327
|
+
if row(@dimensions[1] - 1).empty? || row(@dimensions[1] - 1).compact.join('').empty?
|
328
|
+
i = @dimensions[1] - 1
|
329
|
+
@dimensions[1] = @dimensions[0]
|
330
|
+
# divide and conquer
|
331
|
+
while(i - @dimensions[1] > 1) do
|
332
|
+
if row(i).empty? || row(i).compact.join('').empty?
|
333
|
+
i = @dimensions[1] + (((i - @dimensions[1]) + 1) / 2).to_i
|
334
|
+
else
|
335
|
+
_i = ((i - @dimensions[1]) / 2).to_i + 1
|
336
|
+
@dimensions[1] = i
|
337
|
+
i = i + _i
|
338
|
+
end
|
339
|
+
end
|
340
|
+
@dimensions[1] = i + 1
|
341
|
+
end
|
342
|
+
|
343
|
+
# detect first non-empty non-nil column if first column is empty or nil
|
344
|
+
if (@dimensions[0]..@dimensions[1]).inject(true){|t, j| t && row(j)[@dimensions[2]].nil?}
|
345
|
+
(@dimensions[2]..@dimensions[3]).each do |i|
|
346
|
+
break unless (@dimensions[0]..@dimensions[1]).inject(true){|t, j| t && (row(j)[i].nil? || row(j)[i].empty?)}
|
347
|
+
@dimensions[2] = i
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
# detect last non-empty non-nil column if last column is empty or nil
|
352
|
+
if (@dimensions[0]..@dimensions[1]).inject(true){|t, j| t && row(j)[@dimensions[3]].nil?}
|
353
|
+
(@dimensions[2]..@dimensions[3]).reverse_each do |i|
|
354
|
+
break unless (@dimensions[0]..@dimensions[1]).inject(true){|t, j| t && (row(j)[i].nil? || row(j)[i].empty?)}
|
355
|
+
@dimensions[3] = i
|
356
|
+
end
|
357
|
+
@dimensions[3] = @dimensions[3]
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
314
361
|
private
|
315
362
|
def index_of_first ary # :nodoc:
|
316
363
|
return unless ary
|
data/test/integration.rb
CHANGED
@@ -1408,6 +1408,37 @@ module Spreadsheet
|
|
1408
1408
|
book.worksheet(0).row(0)
|
1409
1409
|
end
|
1410
1410
|
end
|
1411
|
+
|
1412
|
+
def test_compact
|
1413
|
+
path = File.join @data, 'test_compact_many_rows.xls'
|
1414
|
+
book = Spreadsheet.open path
|
1415
|
+
sheets = book.worksheets
|
1416
|
+
assert_equal 1, sheets.size
|
1417
|
+
sheet = book.worksheet 0
|
1418
|
+
assert_instance_of Excel::Worksheet, sheet
|
1419
|
+
assert_equal sheet, book.worksheet('Planilha1')
|
1420
|
+
assert_equal sheet.dimensions, [0, 65534, 0, 25]
|
1421
|
+
sheet.compact!
|
1422
|
+
assert_equal sheet.dimensions, [0, 502, 0, 1]
|
1423
|
+
path = File.join @data, 'test_sizes.xls'
|
1424
|
+
book = Spreadsheet.open path
|
1425
|
+
sheet = book.worksheet 0
|
1426
|
+
assert_instance_of Excel::Worksheet, sheet
|
1427
|
+
assert_equal sheet.dimensions, [1, 38, 1, 15]
|
1428
|
+
sheet.compact!
|
1429
|
+
assert_equal sheet.dimensions, [1, 3, 1, 3]
|
1430
|
+
sheet = book.worksheet 1
|
1431
|
+
assert_instance_of Excel::Worksheet, sheet
|
1432
|
+
assert_equal sheet.dimensions, [1, 3, 1, 3]
|
1433
|
+
sheet.compact!
|
1434
|
+
assert_equal sheet.dimensions, [1, 3, 1, 3]
|
1435
|
+
sheet = book.worksheet 2
|
1436
|
+
assert_instance_of Excel::Worksheet, sheet
|
1437
|
+
assert_equal sheet.dimensions, [0, 4, 0, 4]
|
1438
|
+
sheet.compact!
|
1439
|
+
assert_equal sheet.dimensions, [0, 2, 0, 2]
|
1440
|
+
end
|
1441
|
+
|
1411
1442
|
private
|
1412
1443
|
|
1413
1444
|
# Validates the workbook's SST
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spreadsheet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masaomi Hatakeyama, Zeno R.R. Davatz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-ole
|