xls_sestavy 0.2.13 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MTgzMGI1Yjg5Zjg1ZTgxYTg4NWI1ZWUzNjViNjRkNzgyZjIyNjAzNw==
4
+ YjFlYWVkNDY1M2U0MmNmMDcwY2UyOWM2NmM2MGI2MGIwOTNiOThlOQ==
5
5
  data.tar.gz: !binary |-
6
- NWMxYWZiMTg1ZWNhNWYwMWJlNzI2YzAzZGM1ZWM3NDEwYzg2OGE3Yw==
6
+ ZWYyYWI3NDY0ZTk2NGMwMDRiMGQ2MDhjMjM0ODgxMjdmY2Q3NzQ5NA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MzdiODM1OTY1YjdlMzQ0YWEzMjg5YWZhZjNiYTczYWIyZWY1ZTRiOGJkYWY3
10
- MzExNmZlOTc1MDM4YWY0ODQ2ZDU0ZjQ4OTQ0YTFmZDU3MzVkOWFkMmYyNjQ2
11
- ZDIzYTlhN2Q5OWJkNDhmZmVhNWY1ODM1ZmM5NzMwYTJiYWFmMjE=
9
+ YzkxY2Y4NzQ4NWU2MTgxNDcyZjdhNTBmYTQ0ZTk0YmQxNTIxYjU5MTE4MmM0
10
+ OGQyODY2ZjNkNjJlMWQ5ZTMyMjgwMjg1NWZmMDkzYjg3M2RkODU3MWQ3MTYx
11
+ M2ZkZGE4YTU1YTljYmRjNTEwNGI1YzJhMGI1N2E4MzZkZjIzMTY=
12
12
  data.tar.gz: !binary |-
13
- MThmNGRhOTI5ZGVlODZmMDA1YTJmZDc1ZmI5ODg2MDZjNGE2MmViMjE5ZmFm
14
- ZWYyOTgzYzc3YjQ2OGIxOWVjODIxOGI0MTE4NmM3YjExMjA4NTU0Y2I4NzZh
15
- MDgxNDI2ODZkNWRmODgwNDk3MmMxZjRjNTUxYzBiMGZkYzJiZjk=
13
+ ZjZmNWU1NmJjZjhjMTJmY2YzYTYyZThlMzQxYzE0MDk1MTA0ZWYxYzExYzU1
14
+ OGRjZDQyNDJiMDgzMGNkOGRhY2VmYTZiZGJkY2EzNjMzYzYwYmY4MDZkNTg3
15
+ YWRkNTlkMTcyZTgyNzEwZmI1ZDQzZWUzNjc3NzdkM2I0MzdiN2M=
@@ -1,41 +1,44 @@
1
1
  # encoding: utf-8
2
- require 'tempfile'
3
- require 'xls_sestavy/excel_formaty'
4
- require 'xls_sestavy/excel_tabulky'
5
-
2
+ require "xls_sestavy/tabulky/tabulka"
3
+ require "xls_sestavy/tabulky/sloupce/sloupec"
4
+ require "xls_sestavy/tabulky/sloupce/preddefinovany_sloupce"
5
+ require "xls_sestavy/tabulky/sloupce/definice_sloupcu"
6
6
 
7
7
  module XLSSestavy
8
8
  class Sestava
9
- NAZEV = 'Prázdná sestava'
10
9
 
11
- include ExcelTabulky
12
- include ExcelFormaty
10
+ def self.nazev
11
+ @nazev ||= 'bezejména'
12
+ end
13
+
14
+ def self.nastav_nazev(txt)
15
+ @nazev = txt
16
+ end
13
17
 
14
- attr_reader :argumenty
18
+ attr_reader :params
15
19
 
16
- def initialize(args={})
17
- args[:k_datu] = Date.today unless args[:k_datu]
18
- @argumenty = ArgumentySestavy.new args
20
+ def initialize(params)
21
+ @params = zpracuj_params params
22
+ @cas_vytvoreni = Time.zone.now
19
23
  end
20
24
 
21
- def vytvor_soubor
22
- f = Tempfile.new self.class::NAZEV.gsub(' ','_'), Rails.root.join('tmp')
23
- @wb = ::WriteExcel.new f
24
- vypracuj_sestavu
25
- @wb.close
26
- block_given? ? yield(f) : po_vypracovani(f)
25
+ def zpracuj_params(params)
26
+ params
27
27
  end
28
28
 
29
- def vypracuj_sestavu; end
29
+ def zpracuj
30
+ vypracovani
31
+ block_given? ? yield : po_vypracovani
32
+ end
30
33
 
31
- def po_vypracovani(f); end
34
+ # přepsáno v podtřídách
35
+ def vypracovani; end
32
36
 
33
- def nazev_souboru
34
- to_s + '.xls'
35
- end
37
+ # přepsáno v podtřídách
38
+ def po_vypracovani; end
36
39
 
37
40
  def to_s
38
- "#{self.class::NAZEV.gsub(' ','_')}_#{@argumenty.to_s}"
41
+ self.class.nazev.gsub ' ','_'
39
42
  end
40
43
 
41
44
  end
@@ -0,0 +1,45 @@
1
+ # encoding: utf-8
2
+ require 'tempfile'
3
+ require 'writeexcel'
4
+ require "xls_sestavy/xls/xls"
5
+ require "xls_sestavy/xls/formaty"
6
+ require "xls_sestavy/xls/zapisovani"
7
+ require "xls_sestavy/tabulky/tabulka_xls"
8
+
9
+ module XLSSestavy
10
+ class SestavaXls < Sestava
11
+
12
+ include XLSSestavy::Xls::Formaty
13
+ include XLSSestavy::Xls::Zapisovani
14
+
15
+ def zpracuj
16
+ f = Tempfile.new to_s, Rails.root.join('tmp')
17
+ @wb = ::WriteExcel.new f
18
+ vypracovani
19
+ @wb.close
20
+ block_given? ? yield(f) : po_vypracovani(f)
21
+ end
22
+
23
+ # přepsáno v podtřídách
24
+ def vypracovani; end
25
+
26
+ # přepsáno v podtřídách
27
+ def po_vypracovani(f); end
28
+
29
+ def to_s
30
+ self.class.nazev.gsub ' ','_'
31
+ end
32
+
33
+ def nazev_souboru
34
+ to_s + '.xls'
35
+ end
36
+
37
+ # vytvoří list, zapíše jej do @ws a vrátí jej. mezi tím případně provede předaný blok
38
+ def vytvor_list(nazev)
39
+ @ws = @wb.add_worksheet nazev
40
+ yield @ws if block_given?
41
+ @ws
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+ module XLSSestavy
3
+ class DefiniceSloupcu
4
+
5
+ def self.[](klic)
6
+ @instance ||= new
7
+ @instance[klic]
8
+ end
9
+
10
+ def initialize
11
+ @seznam = {}
12
+ definice
13
+ end
14
+
15
+ def definice; end # tato metoda bude přepsána
16
+
17
+ def definuj(*args, &block)
18
+ s = PreddefinovanySloupec.new(*args, &block)
19
+ @seznam[s.klic] = s
20
+ end
21
+
22
+ def [](klic)
23
+ @seznam[klic]
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+ module XLSSestavy
3
+ class Sloupec
4
+
5
+ attr_accessor :tabulka
6
+
7
+ def initialize(zahlavi, opts={}, &block)
8
+ @options = opts.merge! zahlavi: zahlavi, fce: (opts[:fce] || block)
9
+ end
10
+
11
+ def zahlavi
12
+ raise 'Není přiřazena tabulka.' unless @tabulka
13
+ @zahlavi ||= I18n.translate(@options[:zahlavi], {default: @options[:zahlavi]}.merge!(@tabulka.sestava.params))
14
+ end
15
+
16
+ def argumenty_array
17
+ return @argumenty_array if defined? @argumenty_array
18
+ raise 'Není přiřazena tabulka.' unless @tabulka
19
+ params = @tabulka.sestava.params
20
+ @argumenty_array = (@options[:argumenty] || []).map{|arg_sym| params[arg_sym]}
21
+ end
22
+
23
+ def hodnota_pro(objekt)
24
+ @fce ||= @options[:fce]
25
+ if @fce.class==Proc
26
+ @fce.call(objekt, *argumenty_array)
27
+ elsif objekt.respond_to? @fce
28
+ objekt.send(@fce, *argumenty_array)
29
+ elsif nil
30
+ nil
31
+ else
32
+ raise "Není definováno pro @fce=#{@fce.class}:#{@fce}"
33
+ end
34
+ end
35
+
36
+ def opt(klic)
37
+ @options[klic]
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+ module XLSSestavy
3
+ class Tabulka
4
+
5
+ attr_reader :sestava
6
+
7
+ def initialize(sestava, args={}, &block)
8
+ @sestava = sestava
9
+ @args = args
10
+
11
+ @sloupce = args[:sloupce] || []
12
+ yield self if block_given?
13
+ @sloupce.each{|s| s.tabulka = self}
14
+ end
15
+
16
+ def sloupec(*args, &block)
17
+ s = if args.first.is_a? Sloupec
18
+ args.first
19
+ else
20
+ Sloupec.new(*args, &block)
21
+ end
22
+ s.tabulka = self
23
+ @sloupce << s
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,145 @@
1
+ # encoding: utf-8
2
+ module XLSSestavy
3
+ class Xls::TabulkaXls < Tabulka
4
+
5
+ def initialize(sestava, worksheet, args={}, &block)
6
+ raise 'Sestava musí být typu SestavaXls' unless sestava.kind_of? SestavaXls
7
+ @worksheet = worksheet
8
+ super sestava, args, &block
9
+ end
10
+
11
+ def vypis_radek_zahlavi(pozice)
12
+ r, c = XLSSestavy::Xls.ciselne_souradnice(pozice).first
13
+ format_zahlavi = @sestava.get_format @args[:format_zahlavi] || :radek_zahlavi
14
+
15
+ @sloupce.each_with_index do |s, i|
16
+ format = if s.opt(:xls_format).class==Hash
17
+ format_hash = s.opt(:xls_format).clone
18
+ format_hash.delete :num_format
19
+ @sestava.alter_format format_zahlavi, format_hash
20
+ else
21
+ format_zahlavi
22
+ end
23
+ @worksheet.write r, c+i, s.zahlavi, format
24
+ end
25
+ end
26
+
27
+ def vypis_radek_souctu(pozice, rozsah=nil)
28
+ r, c = XLSSestavy::Xls.ciselne_souradnice(pozice).first
29
+ format_souctu = @sestava.get_format @args[:format_souctu] || :radek_souctu
30
+
31
+ @sloupce.each_with_index do |s, i|
32
+ format_hash = {num_format: XLSSestavy::Xls.num_format(s.opt(:datovy_typ))}
33
+ format_hash.merge! s.opt(:xls_format) if s.opt(:xls_format).class == Hash
34
+ format = @sestava.alter_format format_souctu, format_hash
35
+
36
+ pismeno = XLSSestavy::Xls.sloupec_pismeno c + i
37
+ case rozsah && s.opt(:radek_souctu)
38
+ when :soucet
39
+ formule = "SUBTOTAL(9,#{pismeno}#{rozsah.min}:#{pismeno}#{rozsah.max})"
40
+ @worksheet.write_formula r, c+i, formule, format
41
+ when :pocet
42
+ formule = "SUBTOTAL(3,#{pismeno}#{rozsah.min}:#{pismeno}#{rozsah.max})"
43
+ @worksheet.write_formula r, c+i, formule, format
44
+ else
45
+ @worksheet.write r, c+i, nil, format
46
+ end
47
+ end
48
+ end
49
+
50
+ def vypis_radky_dat(pozice, radky)
51
+ r, c = XLSSestavy::Xls.ciselne_souradnice(pozice).first
52
+ radku_vypsano = 0
53
+
54
+ format_dat = @sestava.get_format @args[:format_dat] || :radky_dat
55
+ formaty = @sloupce.map do |s|
56
+ format_hash = {num_format: XLSSestavy::Xls.num_format(s.opt(:datovy_typ))}
57
+ format_hash.merge! s.opt(:xls_format) if s.opt(:xls_format).class == Hash
58
+ @sestava.alter_format format_dat, format_hash
59
+ end
60
+
61
+ if radky.class == ActiveRecord::Relation
62
+ velikost_sady = @args[:velikost_sady] || 200
63
+ radky.find_in_batches batch_size: velikost_sady do |sada|
64
+ aktualni_pozice = "#{XLSSestavy::Xls.sloupec_pismeno c}#{r + 1 + radku_vypsano}"
65
+ vypis_blok_dat aktualni_pozice, sada, formaty
66
+ radku_vypsano += sada.length
67
+ end
68
+ else
69
+ vypis_blok_dat pozice, radky, formaty
70
+ radku_vypsano = radky.length
71
+ end
72
+
73
+ radku_vypsano
74
+ end
75
+
76
+ def vypis_blok_dat(pozice, radky, formaty=[])
77
+ r, c = XLSSestavy::Xls.ciselne_souradnice(pozice).first
78
+
79
+ radky.each do |objekt|
80
+ @sloupce.each_with_index do |s, i|
81
+ hodnota = XLSSestavy::Xls.douprav_hodnotu_bunky s.hodnota_pro(objekt)
82
+ case s.opt(:datovy_typ)
83
+ when :cas, :datum
84
+ @worksheet.write_date_time r, c+i, hodnota, formaty[i]
85
+ else
86
+ @worksheet.write r, c+i, hodnota, formaty[i]
87
+ end
88
+ end
89
+ r += 1
90
+ end
91
+ end
92
+
93
+ def vypis(pozice, radky)
94
+ r, c = XLSSestavy::Xls.ciselne_souradnice(pozice).first
95
+ sloupec_pismeno = XLSSestavy::Xls.sloupec_pismeno c
96
+ puvodni_r = r
97
+ pocet_radku = radky.count
98
+
99
+ soucty_od = puvodni_r + 1
100
+ souctove_radky = @args[:souctove_radky]
101
+ souctove_radky = :prazdne if pocet_radku==0 && souctove_radky
102
+
103
+ #šířky sloupců
104
+ @sloupce.each_with_index do |s, i|
105
+ sirka = s.opt(:sirka_sloupce)
106
+ next unless sirka
107
+ si = c + i
108
+ @worksheet.set_column si, si, XLSSestavy::Xls.col_cm_to_p(sirka)
109
+ end
110
+
111
+ #hlavičky
112
+ vypis_radek_zahlavi pozice
113
+ r += 1
114
+ @worksheet.set_row r, XLSSestavy::Xls.row_cm_to_p(@args[:vyska_zahlavi] || 1.3)
115
+
116
+ #součtové řádky nad
117
+ if souctove_radky==:nad || souctove_radky==:nad_pod
118
+ soucty_od += 1
119
+ vypis_radek_souctu "#{sloupec_pismeno}#{r + 1}", (soucty_od..soucty_od+pocet_radku-1)
120
+ r += 1
121
+ end
122
+
123
+ #ukotvení
124
+ @worksheet.freeze_panes r, 0 if @args[:ukotvit_zahlavi]
125
+
126
+ #vypsání dat
127
+ r += vypis_radky_dat("#{sloupec_pismeno}#{r + 1}", radky)
128
+
129
+ #součty pod
130
+ if souctove_radky==:pod || souctove_radky==:nad_pod
131
+ vypis_radek_souctu "#{sloupec_pismeno}#{r + 1}", (soucty_od..soucty_od+pocet_radku-1)
132
+ r += 1
133
+ end
134
+
135
+ #prázdný součtový řádek
136
+ if souctove_radky==:prazdne
137
+ vypis_radek_souctu "#{sloupec_pismeno}#{r + 1}"
138
+ r += 1
139
+ end
140
+
141
+ r - puvodni_r
142
+ end
143
+
144
+ end
145
+ end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
  module XLSSestavy
3
- VERSION = "0.2.13"
3
+ VERSION = "0.3.2"
4
4
 
5
5
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  module XLSSestavy
3
- module ExcelFormaty
3
+ module Xls::Formaty
4
4
 
5
5
  #do uchovávaného pole zapíše pod daným symbolem nový formát využívaný ostatními metodami
6
6
  def add_format(symbol, *args)
@@ -46,13 +46,13 @@ module XLSSestavy
46
46
  add_format symbol, size: 12, bold: 1, align: 'left'
47
47
  when :sestava_info
48
48
  add_format symbol, italic: 1
49
- when :zahlavi
49
+ when :radek_zahlavi
50
50
  add_format symbol, bold: 1, border: 1, text_wrap: 1, align: 'center', bg_color: 22
51
- when :data
51
+ when :radky_dat
52
52
  add_format symbol, text_wrap: 1, border: 1
53
- when :data_stred
53
+ when :radky_dat_stred
54
54
  add_format symbol, text_wrap: 1, border: 1, align: 'center'
55
- when :souctovy_radek
55
+ when :radek_souctu
56
56
  add_format symbol, align: 'right', bg_color: 42, bold: 1, border: 1
57
57
  when :default
58
58
  add_format symbol
@@ -62,4 +62,4 @@ module XLSSestavy
62
62
  end
63
63
 
64
64
  end
65
- end
65
+ end
@@ -0,0 +1,89 @@
1
+ # encoding: utf-8
2
+ module XLSSestavy
3
+ module Xls
4
+
5
+ #převod cm na points pro řádky
6
+ def self.row_cm_to_p(cm)
7
+ (cm*28.3464567).to_i
8
+ end
9
+
10
+ #převod cm na points pro sloupce
11
+ #přibližně .. (nenalezen přesný výpočet)
12
+ def self.col_cm_to_p(cm)
13
+ (cm*28.3464567/5.6).to_i
14
+ end
15
+
16
+ #převod z mm na palce
17
+ def self.mm_to_inch(mm)
18
+ mm/25.4
19
+ end
20
+
21
+ #číslo sloupce ze znaků ('A' => 0)
22
+ # do maximální hodnoty 'ZZ'
23
+ def self.sloupec_cislo(znak)
24
+ znak.upcase!
25
+ if znak.length==1
26
+ znak.ord-65
27
+ elsif znak.length==2
28
+ (znak[0].ord-64)*26 + znak[1].ord-65
29
+ end
30
+ end
31
+
32
+ #písmeno sloupce z čísla (0 => 'A')
33
+ # do maximální hodnoty 'ZZ'
34
+ def self.sloupec_pismeno(cislo)
35
+ return (cislo+65).chr if cislo < 26
36
+ a = (cislo/26) - 1
37
+ b = cislo%26
38
+ "#{(a+65).chr}#{(b+65).chr}"
39
+ end
40
+
41
+ #převod standartních souřadnic na pole číselných souradnic:
42
+ # 'A3' => [[2,0]], 'A5:B7' => [[4,0],[6,1]] <radek, sloupec>
43
+ def self.ciselne_souradnice(bunky)
44
+ a = bunky.match /^(\D+)(\d+)(:(\D+)(\d+))?$/
45
+ return unless a
46
+ souradnice = [[a[2].to_i-1, sloupec_cislo(a[1])]]
47
+ souradnice << [a[5].to_i-1, sloupec_cislo(a[4])] if a[3]
48
+ souradnice
49
+ end
50
+
51
+ #doupravuje hodnotu buňky, aby nedošlo na předvídatelné konflikty.
52
+ #Důležité pro všechny typy času/datumu, protože to je potřeba převést na textový řetězec pro excel stravitelný
53
+ def self.douprav_hodnotu_bunky(hodnota)
54
+ return '' unless hodnota
55
+ case hodnota
56
+ when Hash
57
+ YAML.dump hodnota
58
+ when Array
59
+ hodnota.join ', '
60
+ when Time, DateTime, Date
61
+ I18n.localize hodnota, format: :excel
62
+ else
63
+ hodnota
64
+ end
65
+ end
66
+
67
+ #klíč num_formátu pro excel
68
+ def self.num_format(sym)
69
+ sym && case sym
70
+ when :cas; 'yyyy-MM-dd HH:mm:ss'
71
+ when :datum; 'd. M. yyyy'
72
+ when :suma; "#,###0.00 #{@def_mena}"
73
+ when :pocet; '#,##0'
74
+ when :cislo; '#0'
75
+ else raise "nedefinovaný num_format: #{sym}"
76
+ end
77
+ end
78
+
79
+ def self.def_mena=(mena)
80
+ @def_mena = case mena
81
+ when '€'; '[$€-4B1]'
82
+ when 'Kč'; '[$Kč-405]'
83
+ else; '??'
84
+ end
85
+ end
86
+ self.def_mena = 'Kč'
87
+
88
+ end
89
+ end
@@ -0,0 +1,59 @@
1
+ # encoding: utf-8
2
+ module XLSSestavy
3
+ module Xls::Zapisovani
4
+
5
+ # roztahuje se na (defaultně) 24 sloupců v prvním řádku
6
+ def sestava_nadpis(text, roztahnout=12, radek=0)
7
+ @ws.merge_range radek, 0, radek, roztahnout-1, text, get_format(:sestava_nadpis)
8
+ @ws.set_row radek, XLSSestavy::Xls.row_cm_to_p(1)
9
+ end
10
+
11
+ # pozice ve standartních excel souřadnicích 'A2', 'B3:B5' (spojení buňek)
12
+ # vyska znamená výška daného řádku v cm
13
+ def sestava_napdis2(text, pozice, vyska = 0.7)
14
+ zapis pozice, text, get_format(:sestava_nadpis2)
15
+ @ws.set_row ciselne_souradnice(pozice).first.first, XLSSestavy::Xls.row_cm_to_p(vyska)
16
+ end
17
+
18
+ #pozice ve standartních excel souřadnicích 'A2', 'B3:B5' (spojení buňek)
19
+ def sestava_cas_vytvoreni(pozice='A2')
20
+ cas = "začátek zpracování: #{I18n.localize Time.zone.now}"
21
+ zapis pozice, cas, get_format(:default)
22
+ end
23
+
24
+ # pozice bunkdy jsou ve standartních souřadnicích ( 'A3')
25
+ def zapis(pozice, hodnota, format=nil)
26
+ format = get_format unless format
27
+ z_pole, do_pole = XLSSestavy::Xls.ciselne_souradnice pozice
28
+ if do_pole
29
+ @ws.merge_range z_pole[0], z_pole[1], do_pole[0], do_pole[1], hodnota, format
30
+ else
31
+ @ws.write z_pole[0], z_pole[1], hodnota, format
32
+ end
33
+ end
34
+
35
+ def zapis_radu(pozice, hodnoty, format=nil)
36
+ format = get_format unless format
37
+ r, c = XLSSestavy::Xls.ciselne_souradnice(pozice).first
38
+ hodnoty.each do |h|
39
+ @ws.write r, c, h, format
40
+ c += 1
41
+ end
42
+ end
43
+
44
+ def zapis_sloupec(pozice, hodnoty, format=nil)
45
+ format = get_format unless format
46
+ r, c = XLSSestavy::Xls.ciselne_souradnice(pozice).first
47
+ hodnoty.each do |h|
48
+ @ws.write r, c, h, format
49
+ r += 1
50
+ end
51
+ end
52
+
53
+ def zapis_tabulku(pozice, radky, args={}, &block)
54
+ tabulka = XLSSestavy::Xls::TabulkaXls.new self, @ws, args, &block
55
+ tabulka.vypis pozice, radky
56
+ end
57
+
58
+ end
59
+ end
data/lib/xls_sestavy.rb CHANGED
@@ -1,13 +1,6 @@
1
1
  # encoding: utf-8
2
- require "xls_sestavy/version"
3
- require "xls_sestavy/excel_helper"
4
-
5
- require 'xls_sestavy/sloupec'
6
- require 'xls_sestavy/preddefinovany_sloupec'
7
- require 'xls_sestavy/rada_sloupcu'
8
- require 'xls_sestavy/definice_sloupcu'
9
2
 
10
- require 'xls_sestavy/argumenty_sestavy'
11
- require 'xls_sestavy/sestava'
3
+ require "xls_sestavy/version"
4
+ require "xls_sestavy/sestava"
5
+ require "xls_sestavy/sestava_xls"
12
6
 
13
- require 'writeexcel'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xls_sestavy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.13
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ondřej Želazko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-29 00:00:00.000000000 Z
11
+ date: 2014-06-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,16 +66,17 @@ files:
66
66
  - README.md
67
67
  - Rakefile
68
68
  - lib/xls_sestavy.rb
69
- - lib/xls_sestavy/argumenty_sestavy.rb
70
- - lib/xls_sestavy/definice_sloupcu.rb
71
- - lib/xls_sestavy/excel_formaty.rb
72
- - lib/xls_sestavy/excel_helper.rb
73
- - lib/xls_sestavy/excel_tabulky.rb
74
- - lib/xls_sestavy/preddefinovany_sloupec.rb
75
- - lib/xls_sestavy/rada_sloupcu.rb
76
69
  - lib/xls_sestavy/sestava.rb
77
- - lib/xls_sestavy/sloupec.rb
70
+ - lib/xls_sestavy/sestava_xls.rb
71
+ - lib/xls_sestavy/tabulky/sloupce/definice_sloupcu.rb
72
+ - lib/xls_sestavy/tabulky/sloupce/preddefinovany_sloupce.rb
73
+ - lib/xls_sestavy/tabulky/sloupce/sloupec.rb
74
+ - lib/xls_sestavy/tabulky/tabulka.rb
75
+ - lib/xls_sestavy/tabulky/tabulka_xls.rb
78
76
  - lib/xls_sestavy/version.rb
77
+ - lib/xls_sestavy/xls/formaty.rb
78
+ - lib/xls_sestavy/xls/xls.rb
79
+ - lib/xls_sestavy/xls/zapisovani.rb
79
80
  - xls_sestavy.gemspec
80
81
  homepage: https://github.com/doooby/xls_sestavy
81
82
  licenses:
@@ -1,31 +0,0 @@
1
- # encoding: utf-8
2
- module XLSSestavy
3
- class ArgumentySestavy
4
-
5
- attr_accessor :od_data, :do_data, :uzivatel_id
6
- alias_method :k_datu, :od_data
7
- def k_datu=(datum); @od_data = datum; @do_data = datum; end
8
-
9
- def initialize(args={})
10
- args.each_pair{|k, v| send "#{k}=", v }
11
- end
12
-
13
- def jeden_datum?
14
- @od_data==@do_data
15
- end
16
-
17
- def argumenty_sloupce(arr)
18
- arr.map{|a| (a.class==Symbol && respond_to?(a)) ? send(a) : a}
19
- end
20
-
21
- def to_s
22
- return @to_s if defined? @to_s
23
- @to_s = if jeden_datum?
24
- "#{I18n.l(@od_data, format: :excel)[0..-2]}"
25
- else
26
- "#{I18n.l(@od_data, format: :excel)[0..-2]}_#{I18n.l(@do_data, format: :excel)[0..-2]}"
27
- end
28
- end
29
-
30
- end
31
- end
@@ -1,37 +0,0 @@
1
- # encoding: utf-8
2
- module XLSSestavy
3
- class DefiniceSloupcu < RadaSloupcu
4
-
5
- def self.[](klic)
6
- DefiniceSloupcu.definice(self)[klic]
7
- end
8
-
9
- def self.pridej_jako_definice
10
- DefiniceSloupcu.cache_definic[self] = self
11
- end
12
-
13
- def definice; end
14
-
15
- def definuj(*args, &block)
16
- @sloupce << PreddefinovanySloupec.new(*args, &block)
17
- end
18
-
19
- private
20
-
21
- def self.definice(klass)
22
- ds = DefiniceSloupcu.cache_definic[klass]
23
- if ds.class==Class
24
- ds = ds.new
25
- ds.definice
26
- ds.aktualizuj_seznam
27
- @cache_definic[klass] = ds
28
- end
29
- ds
30
- end
31
-
32
- def self.cache_definic
33
- @cache_definic ||= {}
34
- end
35
-
36
- end
37
- end
@@ -1,96 +0,0 @@
1
- # encoding: utf-8
2
- module XLSSestavy
3
- #převod cm na points pro řádky
4
- def self.row_cm_to_p(cm)
5
- (cm*28.3464567).to_i
6
- end
7
-
8
- #převod cm na points pro sloupce
9
- #přibližně .. (nenalezen přesný výpočet)
10
- def self.col_cm_to_p(cm)
11
- (cm*28.3464567/5.6).to_i
12
- end
13
-
14
- #převod z mm na palce
15
- def self.mm_to_inch(mm)
16
- mm/25.4
17
- end
18
-
19
- #číslo sloupce ze znaků ('A' => 0)
20
- # do maximální hodnoty 'ZZ'
21
- def self.sloupec_cislo(znak)
22
- znak.upcase!
23
- if znak.length==1
24
- znak.ord-65
25
- elsif znak.length==2
26
- (znak[0].ord-64)*26 + znak[1].ord-65
27
- end
28
- end
29
-
30
- #písmeno sloupce z čísla (0 => 'A')
31
- # do maximální hodnoty 'ZZ'
32
- def self.sloupec_pismeno(cislo)
33
- return (cislo+65).chr if cislo < 26
34
- a = (cislo/26) - 1
35
- b = cislo%26
36
- "#{(a+65).chr}#{(b+65).chr}"
37
- end
38
-
39
- #převod standartních souřadnic na pole číselných souradnic:
40
- # 'A3' => [[2,0]], 'A5:B7' => [[4,0],[6,1]] <radek, sloupec>
41
- def self.ciselne_souradnice(bunky)
42
- a = bunky.match /^(\D+)(\d+)(:(\D+)(\d+))?$/
43
- return unless a
44
- souradnice = [[a[2].to_i-1, sloupec_cislo(a[1])]]
45
- souradnice << [a[5].to_i-1, sloupec_cislo(a[4])] if a[3]
46
- souradnice
47
- end
48
-
49
- #doupravuje hodnotu buňky, aby nedošlo na předvídatelné konflikty.
50
- #Důležité pro všechny typy času/datumu, protože to je potřeba převést na textový řetězec pro excel stravitelný
51
- def self.douprav_hodnotu_bunky(hodnota)
52
- case hodnota
53
- when Hash
54
- ret = '---'
55
- hodnota.each_pair{|k, v| ret += "\n#{k}: #{v}"}
56
- ret
57
- when Array
58
- hodnota.join ', '
59
- when Time, DateTime, Date
60
- I18n.l hodnota, format: :excel
61
- when NilClass
62
- ''
63
- else
64
- hodnota
65
- end
66
- end
67
-
68
- #klíč num_formátu pro excel
69
- def self.num_format(sym)
70
- case sym
71
- when :cas
72
- 'yyyy-MM-dd HH:mm:ss'
73
- when :datum
74
- 'd. M. yyyy'
75
- when :suma
76
- "#,###0.00 #{@def_mena}"
77
- when :pocet
78
- '#,##0'
79
- when :cislo_smlouvy
80
- '#0'
81
- else
82
- raise "nedefinovaný num_format: #{sym}"
83
- end
84
- end
85
-
86
-
87
- def self.def_mena=(mena)
88
- @def_mena = case mena
89
- when '€'; '[$€-4B1]'
90
- when 'Kč'; '[$Kč-405]'
91
- else; '??'
92
- end
93
- end
94
- self.def_mena = 'Kč'
95
-
96
- end
@@ -1,164 +0,0 @@
1
- # encoding: utf-8
2
- module XLSSestavy
3
- module ExcelTabulky
4
-
5
- # vytvoří list, zapíše jej do @ws a vrátí jej. mezi tím případně provede předaný blok
6
- def vytvor_list(nazev)
7
- @ws = @wb.add_worksheet nazev
8
- yield @ws if block_given?
9
- @ws
10
- end
11
-
12
- # roztahuje se na (defaultně) 24 sloupců v prvním řádku
13
- def sestava_nadpis(text, roztahnout=24, radek=0)
14
- @ws.merge_range radek, 0, radek, roztahnout-1, text, get_format(:sestava_nadpis)
15
- @ws.set_row radek, XLSSestavy.row_cm_to_p(1)
16
- end
17
-
18
- # pozice ve standartních excel souřadnicích 'A2', 'B3:B5' (spojení buňek)
19
- # vyska znamená výška daného řádku v cm
20
- def sestava_napdis2(text, pozice, vyska = 0.7)
21
- zapis pozice, text, get_format(:sestava_nadpis2)
22
- @ws.set_row ciselne_souradnice(pozice)[0][0], XLSSestavy.row_cm_to_p(vyska)
23
- end
24
-
25
- #pozice ve standartních excel souřadnicích 'A2', 'B3:B5' (spojení buňek)
26
- def sestava_cas_vytvoreni(pozice='A2')
27
- cas = "začátek zpracování: #{l Time.now}"
28
- zapis pozice, cas, get_format(:default)
29
- end
30
-
31
- # pozice bunkdy jsou ve standartních souřadnicích ( 'A3')
32
- def zapis(bunky, hodnota, format=nil)
33
- format = get_format unless format
34
- souradnice = XLSSestavy.ciselne_souradnice bunky
35
- if souradnice.length==1
36
- @ws.write souradnice[0][0], souradnice[0][1], hodnota, format
37
- else
38
- @ws.merge_range souradnice[0][0], souradnice[0][1], souradnice[1][0], souradnice[1][1], hodnota, format
39
- end
40
- end
41
-
42
- def zapis_radu(prvni_bunka, hodnoty, format=nil)
43
- format = get_format unless format
44
- souradnice = XLSSestavy.ciselne_souradnice(prvni_bunka).first
45
- hodnoty.each do |h|
46
- @ws.write souradnice[0], souradnice[1], h, format
47
- souradnice[1] += 1
48
- end
49
- end
50
-
51
- def zapis_sloupec(prvni_bunka, hodnoty, format=nil)
52
- format = get_format unless format
53
- souradnice = XLSSestavy.ciselne_souradnice(prvni_bunka).first
54
- hodnoty.each do |h|
55
- @ws.write souradnice[0], souradnice[1], h, format
56
- souradnice[0] += 1
57
- end
58
- end
59
-
60
- #vypsání dat tabulky, hlaviček a případných součtových řádků
61
- # vrací počet, kolik řádků bylo vypsáno
62
- # objekty = <Array<Object>> / <ActiveRecord::Relation>
63
- # sloupce: <Array<Sloupec>> / <RadaSloupcu> -pole sloupců
64
- #--- args ---
65
- # vyska_zahlavi: <Numerical> -hodnota výšky prvního řádku v cm
66
- # ukotvit_zahlavi: <True> / <Nil> -pokud má být za hlavičkou ukotveno(o jeden řádek níže při použití součtových řádků :nad)
67
- # soucty: :nad, :pod, :nad_pod, :prazdne, nil
68
- # format_zahlavi: <Symbol> -formát hlavičky (bude upraven formátem sloupce)
69
- # format_dat: <Symbol> -formát řádků dat (bude upraven formátem sloupce)
70
- def vypis_tabulku(pozice, objekty, sloupce, args={})
71
- y, x = XLSSestavy.ciselne_souradnice(pozice).first
72
- sloupce = sloupce.sloupce if sloupce.kind_of? RadaSloupcu
73
- soucty = args[:soucty]
74
- soucty = :prazdne if objekty.length==0 && soucty
75
-
76
- dy = 0 # posun v řádcích
77
- #hlavičky
78
- format_zahlavi = get_format args[:format_zahlavi]||:zahlavi
79
- formaty = sloupce.map do |s|
80
- next format_zahlavi unless s.format.class==Hash
81
- format_hash = s.format.clone
82
- format_hash[:num_format] = nil
83
- alter_format format_zahlavi, format_hash
84
- end
85
- sloupce.each_with_index do |s, i|
86
- x_sloupce = x + i
87
- @ws.write y, x_sloupce, s.zahlavi, formaty[i]
88
- @ws.set_column x_sloupce, x_sloupce, XLSSestavy.col_cm_to_p(s.sirka)
89
- end
90
- @ws.set_row y, XLSSestavy.row_cm_to_p(args[:vyska_zahlavi]||1.3)
91
- dy += 1
92
- #součty :nad
93
- y_soucty = y+dy+1
94
- if soucty==:nad || soucty==:nad_pod
95
- y_soucty += 1
96
- vypis_souctovy_radek y+dy, x, sloupce, (y_soucty..y_soucty+objekty.length-1)
97
- dy += 1
98
- end
99
- #ukotvit
100
- @ws.freeze_panes y+dy, 0 if args[:ukotvit_zahlavi]
101
- #vypsani samotnych dat
102
- format_dat = get_format args[:format_dat]||:data
103
- formaty = sloupce.map do |s|
104
- next format_dat unless s.format.class==Hash
105
- alter_format format_dat, s.format
106
- end
107
- if objekty.class==ActiveRecord::Relation
108
- objekty.find_in_batches batch_size: 100 do |batch|
109
- batch.each do |objekt|
110
- sloupce.each_with_index do |s, i|
111
- hodnota = XLSSestavy.douprav_hodnotu_bunky s.hodnota_pro(objekt)
112
- if s.num_format==:cas || s.num_format==:datum
113
- @ws.write_date_time y+dy, x+i, hodnota, formaty[i]
114
- else
115
- @ws.write y+dy, x+i, hodnota, formaty[i]
116
- end
117
- end
118
- dy += 1
119
- end
120
- end
121
- else
122
- objekty.each do |objekt|
123
- sloupce.each_with_index do |s, i|
124
- hodnota = XLSSestavy.douprav_hodnotu_bunky s.hodnota_pro(objekt)
125
- if s.num_format==:cas || s.num_format==:datum
126
- @ws.write_date_time y+dy, x+i, hodnota, formaty[i]
127
- else
128
- @ws.write y+dy, x+i, hodnota, formaty[i]
129
- end
130
- end
131
- dy += 1
132
- end
133
- end
134
- #součty :pod
135
- if soucty==:pod || soucty==:nad_pod
136
- vypis_souctovy_radek y+dy, x, sloupce, (y_soucty..y_soucty+objekty.length-1)
137
- dy += 1
138
- end
139
- #případně, když nejsou žádné objekty jenom prázdný součtový řádek
140
- if soucty==:prazdne
141
- format = get_format :souctovy_radek
142
- sloupce.length.times{|i| @ws.write y+dy, x+i, '', format }
143
- dy += 1
144
- end
145
- dy
146
- end
147
-
148
- def vypis_souctovy_radek(y, x, sloupce, rozsah)
149
- format = get_format :souctovy_radek
150
- sloupce.each_with_index do |s, i|
151
- pismeno = XLSSestavy.sloupec_pismeno x+i
152
- formule = case s.souctovy_radek
153
- when :soucet; "SUBTOTAL(9,#{pismeno}#{rozsah.min}:#{pismeno}#{rozsah.max})"
154
- when :pocet; "SUBTOTAL(3,#{pismeno}#{rozsah.min}:#{pismeno}#{rozsah.max})"
155
- else
156
- @ws.write y, x+i, '', format
157
- next
158
- end
159
- @ws.write_formula y, x+i, formule, format
160
- end
161
- end
162
-
163
- end
164
- end
@@ -1,43 +0,0 @@
1
- # encoding: utf-8
2
- module XLSSestavy
3
- class RadaSloupcu
4
-
5
- attr_reader :sloupce
6
-
7
- def initialize(sloupce=nil, argumenty=nil)
8
- @sloupce = sloupce || []
9
- yield self if block_given?
10
- if @sloupce.class!=Array && @sloupce.any?{|s| !s.kind_of? Sloupec}
11
- raise 'RadaSloupcu musí být inicializovány polem Sloupců'
12
- end
13
- nastav_argumenty argumenty if argumenty
14
- @seznam = {}
15
- aktualizuj_seznam
16
- end
17
-
18
- def pridej(*args, &block)
19
- if args.first.is_a? Sloupec
20
- @sloupce << args.first
21
- else
22
- @sloupce << Sloupec.new(*args, &block)
23
- end
24
- end
25
-
26
- def nastav_argumenty(argumenty)
27
- @sloupce.each{|s| s.nastav_argumenty argumenty}
28
- end
29
-
30
- def [](klic)
31
- index = @seznam[klic.to_sym]
32
- index ? @sloupce[index] :nil
33
- end
34
-
35
- def aktualizuj_seznam
36
- @seznam = {}
37
- @sloupce.each_with_index do |s,i|
38
- @seznam[s.klic] = i if s.class==PreddefinovanySloupec
39
- end
40
- end
41
-
42
- end
43
- end
@@ -1,41 +0,0 @@
1
- # encoding: utf-8
2
- module XLSSestavy
3
- class Sloupec
4
-
5
- attr_accessor :zahlavi, :sirka, :format, :num_format, :souctovy_radek
6
-
7
- def initialize(zahlavi, args={}, &block)
8
- @zahlavi= zahlavi
9
- @fce = args[:fce] || block
10
- nastav args
11
- end
12
-
13
- def nastav(args={})
14
- @parametry = args[:parametry] || []
15
- @sirka = args[:sirka] || 3
16
- @souctovy_radek = args[:souctovy_radek]
17
- @format = args[:format]
18
- @num_format = args[:num_format]
19
- if @num_format
20
- @format ||= {}
21
- @format[:num_format] = XLSSestavy.num_format @num_format
22
- end
23
- end
24
-
25
- def nastav_argumenty(argumenty)
26
- @argumenty_array = argumenty.argumenty_sloupce(@parametry)
27
- @zahlavi.gsub!(/%\w+%/){|m| argumenty.send m[1..-2]}
28
- end
29
-
30
- def hodnota_pro(objekt)
31
- if @fce.class==Proc
32
- @fce.call(objekt, *@argumenty_array)
33
- elsif objekt.respond_to? @fce
34
- objekt.send(@fce, *@argumenty_array)
35
- else
36
- raise "Není definováno pro @fce=#{@fce.class}:#{@fce}"
37
- end
38
- end
39
-
40
- end
41
- end