table_transform 0.1.0 → 0.2.0
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/CHANGELOG.md +10 -1
- data/README.md +15 -2
- data/lib/table_transform/excel_creator.rb +62 -0
- data/lib/table_transform/table.rb +14 -6
- data/lib/table_transform/version.rb +1 -1
- data/lib/table_transform.rb +1 -1
- data/table_transform.gemspec +5 -3
- metadata +31 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d6d8a8e87390799ac51635a6889032993ab424f
|
4
|
+
data.tar.gz: 118f7f5592a983ee5ff77cad1e7960d73e032de8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 320bd9c7eccdcf26649d717c3f254e7fcaa39f6cd88f256e6b91355c0d5f631a85ad5fe4a107af90f40bc3a6c755e670ee3dceb53d83c98e0fb8ae4f0d4fb899
|
7
|
+
data.tar.gz: 574420f128ca4cfc4b54db2a6a7058f562c5201294db8954c0965fde1850d05021198761376c7d7e07eb5c36633a39ca885b01e09a8c6bafd50936351dc3648b
|
data/CHANGELOG.md
CHANGED
@@ -6,9 +6,18 @@ TableTransform is still in pre-release state. This means that its APIs and behav
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [0.2.0][] (2016-02-16)
|
10
|
+
|
11
|
+
* Added ability to publish Tables in *Microsoft Excel* format
|
12
|
+
|
13
|
+
Fixes:
|
14
|
+
|
15
|
+
* Require at least non empty header row to be present in Table
|
16
|
+
|
9
17
|
## 0.1.0 (2016-02-10)
|
10
18
|
|
11
19
|
* Initial release including Table
|
12
20
|
|
13
21
|
[Semver]: http://semver.org
|
14
|
-
[Unreleased]: https://github.com/jonas-lantto/table_transform/compare/v0.
|
22
|
+
[Unreleased]: https://github.com/jonas-lantto/table_transform/compare/v0.2.0...HEAD
|
23
|
+
[0.2.0]: https://github.com/jonas-lantto/table_transform/compare/v0.1.0...0.2.0
|
data/README.md
CHANGED
@@ -34,7 +34,7 @@ Or install it yourself as:
|
|
34
34
|
data = [ %w(Name Age), %w(Jane 22)]
|
35
35
|
t = TableTransform::Table.new(data)
|
36
36
|
|
37
|
-
###
|
37
|
+
### Transform
|
38
38
|
# Add a new column to the far right
|
39
39
|
t.add_column('NameLength'){|row| row['Name'].size}
|
40
40
|
|
@@ -55,9 +55,22 @@ Or install it yourself as:
|
|
55
55
|
t2 = TableTransform::Table::create_empty(%w(Col1 Col2))
|
56
56
|
t3 = t1 + t2
|
57
57
|
|
58
|
+
|
59
|
+
### Publish
|
58
60
|
# Export as array
|
59
61
|
t.to_a
|
60
|
-
|
62
|
+
|
63
|
+
# Excel sheet
|
64
|
+
excel = TableTransform::ExcelCreator.new('output.xlsx')
|
65
|
+
excel.add_tab('Result', t)
|
66
|
+
excel.create!
|
67
|
+
|
68
|
+
#### Excel Creator
|
69
|
+
Will create an Excel Table on each tab. Name of the table will be the same as the sheet (except space replaced
|
70
|
+
with _)
|
71
|
+
|
72
|
+
Each column will be auto scaled to an approximate size based on column content.
|
73
|
+
|
61
74
|
## Contributing
|
62
75
|
|
63
76
|
Bug reports and pull requests are welcome on [GitHub](https://github.com/jonas-lantto/table_transform).
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'write_xlsx'
|
2
|
+
|
3
|
+
|
4
|
+
module TableTransform
|
5
|
+
|
6
|
+
# Creates excel file
|
7
|
+
class ExcelCreator
|
8
|
+
def initialize(filename)
|
9
|
+
@workbook = WriteXLSX.new(filename)
|
10
|
+
end
|
11
|
+
|
12
|
+
def create!
|
13
|
+
@workbook.close
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_tab(name, table)
|
17
|
+
create_table(name, table.to_a)
|
18
|
+
end
|
19
|
+
|
20
|
+
#################################
|
21
|
+
private
|
22
|
+
|
23
|
+
# @return array with column width per column
|
24
|
+
def self.column_width(data, auto_filter_correct = true, max_width = 100)
|
25
|
+
return [] if data.empty?
|
26
|
+
|
27
|
+
auto_filter_size_correction = auto_filter_correct ? 3 : 0
|
28
|
+
|
29
|
+
res = Array.new(data.first.map { |x| x.to_s.size + auto_filter_size_correction })
|
30
|
+
data.each { |row|
|
31
|
+
row.each_with_index { |cell, column_no|
|
32
|
+
res[column_no] = [cell.to_s.size, res[column_no]].max
|
33
|
+
}
|
34
|
+
}
|
35
|
+
res.map! { |x| [x, max_width].min }
|
36
|
+
end
|
37
|
+
|
38
|
+
def create_table(name, data)
|
39
|
+
worksheet = @workbook.add_worksheet(name)
|
40
|
+
return if data.nil? or data.empty? # Create empty worksheet if no data
|
41
|
+
|
42
|
+
auto_filter = true
|
43
|
+
col_width = ExcelCreator::column_width(data, auto_filter)
|
44
|
+
|
45
|
+
header = data.shift
|
46
|
+
data << [nil] * header.count if data.empty? # Add extra row if empty
|
47
|
+
|
48
|
+
worksheet.add_table(
|
49
|
+
0, 0, data.count, header.count - 1,
|
50
|
+
{
|
51
|
+
:name => name.tr(' ', '_'),
|
52
|
+
:data => data,
|
53
|
+
:autofilter => auto_filter ? 1 : 0,
|
54
|
+
:columns => header.map { |v| {:header => v} }
|
55
|
+
}
|
56
|
+
)
|
57
|
+
|
58
|
+
# Set column width
|
59
|
+
col_width.each_with_index { |size, column| worksheet.set_column(column, column, size) }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -24,16 +24,13 @@ module TableTransform
|
|
24
24
|
# @throws if column names not unique
|
25
25
|
# @throws if column size for each row match
|
26
26
|
def initialize(rows)
|
27
|
+
raise 'Table required to have at least a header row' if (rows.nil? or rows.empty?)
|
27
28
|
@data_rows = rows.clone
|
28
29
|
@header = @data_rows.shift
|
29
30
|
@column_indexes = create_column_name_binding(@header)
|
30
31
|
|
31
|
-
|
32
|
-
|
33
|
-
raise "Column #{dup.map{|x| "'#{x}'"}.join(' and ')} not unique" if dup.size > 0
|
34
|
-
|
35
|
-
#validate column size
|
36
|
-
@data_rows.each_with_index {|x, index| raise "Column size mismatch. On row #{index+1}. Size #{x.size} expected to be #{@header.size}" if @header.size != x.size}
|
32
|
+
validate_header_uniqueness
|
33
|
+
validate_column_size
|
37
34
|
end
|
38
35
|
|
39
36
|
def << (hash_values)
|
@@ -105,6 +102,17 @@ module TableTransform
|
|
105
102
|
self
|
106
103
|
end
|
107
104
|
|
105
|
+
# @throws unless all header names are unique
|
106
|
+
private def validate_header_uniqueness
|
107
|
+
dup = @header.select{ |e| @header.count(e) > 1 }.uniq
|
108
|
+
raise "Column #{dup.map{|x| "'#{x}'"}.join(' and ')} not unique" if dup.size > 0
|
109
|
+
end
|
110
|
+
|
111
|
+
# @throws unless all rows have same number of elements
|
112
|
+
private def validate_column_size
|
113
|
+
@data_rows.each_with_index {|x, index| raise "Column size mismatch. On row #{index+1}. Size #{x.size} expected to be #{@header.size}" if @header.size != x.size}
|
114
|
+
end
|
115
|
+
|
108
116
|
class Row
|
109
117
|
|
110
118
|
def initialize(cols, row)
|
data/lib/table_transform.rb
CHANGED
data/table_transform.gemspec
CHANGED
@@ -19,7 +19,9 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
|
-
spec.add_development_dependency 'bundler',
|
23
|
-
spec.add_development_dependency 'rake',
|
24
|
-
spec.add_development_dependency 'minitest',
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.10'
|
23
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
24
|
+
spec.add_development_dependency 'minitest', '~> 5.0'
|
25
|
+
spec.add_development_dependency 'write_xlsx', '~> 0.83'
|
26
|
+
spec.add_development_dependency 'roo', '~> 2.3'
|
25
27
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: table_transform
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonas Lantto
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,34 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '5.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: write_xlsx
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.83'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.83'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: roo
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '2.3'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '2.3'
|
55
83
|
description: ''
|
56
84
|
email:
|
57
85
|
- j@lantto.net
|
@@ -71,6 +99,7 @@ files:
|
|
71
99
|
- README.md
|
72
100
|
- Rakefile
|
73
101
|
- lib/table_transform.rb
|
102
|
+
- lib/table_transform/excel_creator.rb
|
74
103
|
- lib/table_transform/table.rb
|
75
104
|
- lib/table_transform/version.rb
|
76
105
|
- table_transform.gemspec
|