gen_sheet 0.0.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.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/Gemfile +11 -0
- data/README.md +12 -0
- data/Rakefile +8 -0
- data/gen_sheet.gemspec +11 -0
- data/lib/GenSheet.rb +167 -0
- data/spec/files/template.ods +0 -0
- data/spec/files/template.xls +0 -0
- data/spec/ods_ods_spec.rb +20 -0
- data/spec/ods_xls_spec.rb +8 -0
- data/spec/spec_helper.rb +26 -0
- data/spec/xls_ods_spec.rb +8 -0
- data/spec/xls_xls_spec.rb +20 -0
- metadata +57 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 857524349be36a3f44223116375a88133a5c8a7a
|
4
|
+
data.tar.gz: 8f83041d811147a825aa0658f9edbbebc2490aae
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 526bfea3d59ea6d8a370222e8054a8a1bb8773fee0559d05a34ffb9c5f90d0b2eac76df03528f4eb1088cf4e59621f45c4134f8c4d51b37b22920fadd020b70b
|
7
|
+
data.tar.gz: d2210a34617c2cb992a8b5601009490d4832e5c72a96dc8ff2454bf082701caf70641082c1dba40e904e0b5f3a95b9fac3efa6f91d6defd8b3f41c7c24ca0440
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
GenSheet [](https://codeclimate.com/github/Genshin/GenSheet)
|
2
|
+
========
|
3
|
+
|
4
|
+
GenSheet is a spreadsheet [xls and ods] generator for Roo.
|
5
|
+
Roo is awesome at reading and processing spreadsheets all on its own but has no file generation.
|
6
|
+
|
7
|
+
During export sheet data and formatting is preserved from the original sheet or Roo object.
|
8
|
+
This allows you to use spreadsheets as templates, loading them with Roo, filling or altering data, then exporting.
|
9
|
+
|
10
|
+
Future plans are to add in-sheet hooks and data markers to allow for true template-like handling of source sheets.
|
11
|
+
|
12
|
+
This library is licensed under the LGPL.
|
data/Rakefile
ADDED
data/gen_sheet.gemspec
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'gen_sheet'
|
3
|
+
s.version = '0.0.3'
|
4
|
+
s.date = '2013-03-14'
|
5
|
+
s.summary = "A spreadsheet generator (ODS, XLS) for Roo."
|
6
|
+
s.description = "Takes a Roo spreadsheet object and renders it in XLS or ODS. Also allows you to use a template sheet and fill it with data from Roo, then output a rendered sheet."
|
7
|
+
s.authors = ["Rei Kagetsuki"]
|
8
|
+
s.email = 'zero@genshin.org'
|
9
|
+
s.files = `git ls-files`.split("\n")
|
10
|
+
s.homepage = 'https://github.com/Genshin/GenSheet'
|
11
|
+
end
|
data/lib/GenSheet.rb
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
require 'roo'
|
2
|
+
require 'writeexcel'
|
3
|
+
require 'odf/spreadsheet'
|
4
|
+
|
5
|
+
class GenSheet
|
6
|
+
|
7
|
+
@roo
|
8
|
+
|
9
|
+
def to_xls(filename)
|
10
|
+
@outbook_xls = WriteExcel.new(filename)
|
11
|
+
|
12
|
+
workbook = @roo.instance_variable_get('@workbook')
|
13
|
+
formats = workbook.instance_variable_get('@formats')
|
14
|
+
worksheets = workbook.instance_variable_get('@worksheets')
|
15
|
+
|
16
|
+
# 出力シート準備、元シート分解
|
17
|
+
outsheets = Array.new
|
18
|
+
originalsheets = Array.new
|
19
|
+
names = Array.new
|
20
|
+
pre_sheet_xls(outsheets, originalsheets, names)
|
21
|
+
|
22
|
+
# mergeしてあるセルのセット
|
23
|
+
merges = Array.new
|
24
|
+
set_mergedcell_sheet(worksheets, outsheets, merges)
|
25
|
+
|
26
|
+
# シートのセット
|
27
|
+
set_sheet_xls(outsheets, originalsheets, names, merges)
|
28
|
+
|
29
|
+
# # 出力
|
30
|
+
# for i in 0..originalsheets.size - 1
|
31
|
+
# originalsheets[i].parse do |row|
|
32
|
+
# puts row
|
33
|
+
# end
|
34
|
+
# end
|
35
|
+
|
36
|
+
@outbook_xls.close
|
37
|
+
end
|
38
|
+
|
39
|
+
def pre_sheet_xls(outsheets, originalsheets, names)
|
40
|
+
@roo.each_with_pagename do |name, sheet|
|
41
|
+
outsheets << @outbook_xls.add_worksheet(name)
|
42
|
+
originalsheets << sheet.clone
|
43
|
+
names << name
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def set_mergedcell_sheet(worksheets, outsheets, merges)
|
48
|
+
for i in 0..worksheets.size - 1
|
49
|
+
merges << worksheets[i].instance_variable_get('@merged_cells')
|
50
|
+
if merges[i] != nil && merges[i] != []
|
51
|
+
set_mergedcell(outsheets[i], merges[i])
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def set_mergedcell(outsheet, merge)
|
57
|
+
format = @outbook_xls.add_format(:align => 'merge')
|
58
|
+
for j in 0..merge.size - 1
|
59
|
+
outsheet.merge_range(merge[j][0], merge[j][2], merge[j][1], merge[j][3], '', format)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def set_sheet_xls(outsheets, originalsheets, names, merges)
|
64
|
+
#@getformat = @formats[(x + 1) * (y + 1) - 1] # fontもborderも入ってるけどもインデックスがわからない
|
65
|
+
fonts = @roo.instance_variable_get('@fonts')
|
66
|
+
for i in 0..originalsheets.size - 1
|
67
|
+
originalsheets[i].each_with_index do |row, y|
|
68
|
+
row.each_with_index do |cell, x|
|
69
|
+
font = fonts[names[i]][[y + 1, x + 1]]
|
70
|
+
set_cell_xls(outsheets[i], cell, x, y, font, merges[i])
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def set_cell_xls(outsheet, cell, x, y, font, merge)
|
77
|
+
# cellが空の場合は何もしない
|
78
|
+
return if cell == nil
|
79
|
+
|
80
|
+
# 各フォントフォーマットのセット
|
81
|
+
format = set_format(font)
|
82
|
+
|
83
|
+
# mergeしてあるセルの場合フォーマット追加
|
84
|
+
for i in 0..merge.size - 1
|
85
|
+
if y == merge[i][0] && x == merge[i][2]
|
86
|
+
set_mergedcell_format(format)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
outsheet.write(y, x, cell, format)
|
91
|
+
end
|
92
|
+
|
93
|
+
def set_format(font)
|
94
|
+
format = @outbook_xls.add_format(
|
95
|
+
#:bottom => 1, #
|
96
|
+
#:top => 1, # border
|
97
|
+
#:left => 1, #
|
98
|
+
#:right => 1, #
|
99
|
+
:color => font.instance_variable_get('@color'),
|
100
|
+
:italic => font.instance_variable_get('@italic') ? 1 : 0,
|
101
|
+
:font => font.instance_variable_get('@name'),
|
102
|
+
:outline => font.instance_variable_get('@outline'),
|
103
|
+
:shadow => font.instance_variable_get('@shadow'),
|
104
|
+
:size => font.instance_variable_get('@size'),
|
105
|
+
:strikeout => font.instance_variable_get('@strikeout'),
|
106
|
+
:underline => font..instance_variable_get('@underline') == :none ? 0 : 1, # アンダーラインの種類は4つだけどとりあえず
|
107
|
+
:bold => font.instance_variable_get('@weight') > 400 ? 1 : 0 # weightが普通だと400、boldだと700になるようなのでとりあえず
|
108
|
+
#:encoding => font.encoding, #
|
109
|
+
#:escapement => font.escapement, # fontにまとめて入っていたけど
|
110
|
+
#:family => font.family, # どれに対応するのか..
|
111
|
+
#:previous_fast_key => font.previous_fast_key, #
|
112
|
+
)
|
113
|
+
|
114
|
+
return format
|
115
|
+
end
|
116
|
+
|
117
|
+
def set_mergedcell_format(format)
|
118
|
+
format.set_align('center')
|
119
|
+
format.set_valign('vcenter')
|
120
|
+
end
|
121
|
+
|
122
|
+
def to_ods(filename)
|
123
|
+
@outbook_ods = ODF::SpreadSheet.new
|
124
|
+
|
125
|
+
tables = Array.new
|
126
|
+
sheets = Array.new
|
127
|
+
pre_sheet_ods(tables, sheets)
|
128
|
+
|
129
|
+
@outbook_ods.write_to filename
|
130
|
+
end
|
131
|
+
|
132
|
+
def pre_sheet_ods(tables, sheets)
|
133
|
+
@roo.each_with_pagename do |name, sheet|
|
134
|
+
# シート作成
|
135
|
+
tables << (@outbook_ods.table name)
|
136
|
+
sheets << sheet.clone
|
137
|
+
end
|
138
|
+
|
139
|
+
set_sheet_ods(tables, sheets)
|
140
|
+
end
|
141
|
+
|
142
|
+
def set_sheet_ods(tables, sheets)
|
143
|
+
for i in 0..sheets.size - 1
|
144
|
+
sheets[i].each_with_index do |row, y|
|
145
|
+
# 行作成
|
146
|
+
ob_row = tables[i].row
|
147
|
+
set_cell_ods(row, ob_row)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def set_cell_ods(row, ob_row)
|
153
|
+
row.each_with_index do |cell, x|
|
154
|
+
# スタイル作成
|
155
|
+
@outbook_ods.style 'font-style', :family => :cell do
|
156
|
+
#property :text, 'font-weight' => 'bold', 'color' => '#ff0000'
|
157
|
+
end
|
158
|
+
# セル作成、スタイル適用
|
159
|
+
ob_cell = ob_row.cell(cell, :style => 'font-style')
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def initialize(roo)
|
164
|
+
@roo = roo
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
Binary file
|
Binary file
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'open ods with roo' do
|
4
|
+
it 'opens and inspects an xls file' do
|
5
|
+
open_ods()
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#new' do
|
10
|
+
it 'creates a new GenSheet object from Roo ODS' do
|
11
|
+
create_gens_from_ods()
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#to_ods' do
|
16
|
+
it 'creates an ods file' do
|
17
|
+
create_gens_from_ods()
|
18
|
+
@gens.to_ods('./spec/files/ods_out.ods')
|
19
|
+
end
|
20
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'roo'
|
2
|
+
require_relative '../lib/GenSheet.rb'
|
3
|
+
|
4
|
+
@xls
|
5
|
+
@ods
|
6
|
+
@gens
|
7
|
+
|
8
|
+
def open_xls()
|
9
|
+
@xls = Roo::Spreadsheet.open('./spec/files/template.xls')
|
10
|
+
@xls.inspect
|
11
|
+
end
|
12
|
+
|
13
|
+
def open_ods()
|
14
|
+
@ods = Roo::Spreadsheet.open('./spec/files/template.ods')
|
15
|
+
@ods.inspect
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_gens_from_xls()
|
19
|
+
open_xls()
|
20
|
+
@gens = GenSheet.new(@xls)
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_gens_from_ods()
|
24
|
+
open_ods()
|
25
|
+
@gens = GenSheet.new(@ods)
|
26
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'open xls with roo' do
|
4
|
+
it 'opens and inspects an xls file' do
|
5
|
+
open_xls()
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#new' do
|
10
|
+
it 'creates a new GenSheet object from Roo XLS' do
|
11
|
+
create_gens_from_xls()
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#to_xls' do
|
16
|
+
it 'creates an xls file' do
|
17
|
+
create_gens_from_xls()
|
18
|
+
@gens.to_xls('./spec/files/xls_out.xls')
|
19
|
+
end
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gen_sheet
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Rei Kagetsuki
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-03-14 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Takes a Roo spreadsheet object and renders it in XLS or ODS. Also allows
|
14
|
+
you to use a template sheet and fill it with data from Roo, then output a rendered
|
15
|
+
sheet.
|
16
|
+
email: zero@genshin.org
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .gitignore
|
22
|
+
- Gemfile
|
23
|
+
- README.md
|
24
|
+
- Rakefile
|
25
|
+
- gen_sheet.gemspec
|
26
|
+
- lib/GenSheet.rb
|
27
|
+
- spec/files/template.ods
|
28
|
+
- spec/files/template.xls
|
29
|
+
- spec/ods_ods_spec.rb
|
30
|
+
- spec/ods_xls_spec.rb
|
31
|
+
- spec/spec_helper.rb
|
32
|
+
- spec/xls_ods_spec.rb
|
33
|
+
- spec/xls_xls_spec.rb
|
34
|
+
homepage: https://github.com/Genshin/GenSheet
|
35
|
+
licenses: []
|
36
|
+
metadata: {}
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options: []
|
39
|
+
require_paths:
|
40
|
+
- lib
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - '>='
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
requirements: []
|
52
|
+
rubyforge_project:
|
53
|
+
rubygems_version: 2.0.0.rc.2
|
54
|
+
signing_key:
|
55
|
+
specification_version: 4
|
56
|
+
summary: A spreadsheet generator (ODS, XLS) for Roo.
|
57
|
+
test_files: []
|