xls_sestavy 0.2.13 → 0.3.2

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 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