ntq_excelsior 0.1.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8bf1d29e56d85c440a139e5f9e51aab9acd22b68e2da799352435298382e9c11
4
- data.tar.gz: 4de9735295bee676cb0fa6fe738cf18253348021b00060b1dacee3ae6d9d2197
3
+ metadata.gz: d1f1c651087df6ca7f9dea48884d8976b210294cb95a2577a3048f57ac8488ee
4
+ data.tar.gz: ce39afeae3e37049578a191dea797ce8c7cb06be31c3e60fb726cb823a93140f
5
5
  SHA512:
6
- metadata.gz: 179249f8e55907b347cc715c96c8b0b4ece8c0fa98526a2233fe5587333cf05a89d303b32e15c7ec921c0ccc55e620e330d762d279e99b68d6fa7d9bad8eee73
7
- data.tar.gz: 54fe084c4e0cc8525703547a7075ed64791300cbbeb32664fdf75fba463a2a0e124c6e5c7b9e302c8e0ff8d3c08c660433f189cc2a01c9230a73b6ad2342ce62
6
+ metadata.gz: 62c3a791e7fce170b95c2fcd07fa4c9410b57c7aa10570925169cdfa2f38ee603c102a59fafeb49db077ddba9b9644bd6380662105936f12f033c04794d55f33
7
+ data.tar.gz: c22d31f130c0d0c3ae5f9a52f346255cb0926ad5c56f93880ba12dc8e622260c12a8e35de0eca1bb2d4a58c50bb4fd3d1d2037c53d377fbf3e618b6ed804db24
data/CHANGELOG.md CHANGED
@@ -1,5 +1,3 @@
1
- ## [Unreleased]
2
-
3
1
  ## [0.1.0] - 2023-02-02
4
2
 
5
3
  - Initial release
data/README.md CHANGED
@@ -17,15 +17,23 @@ If bundler is not being used to manage dependencies, install the gem by executin
17
17
  ### Export
18
18
 
19
19
  ```ruby
20
+ # Exporter class
20
21
  class UserExporter < NtqExcelsior::Exporter
21
22
 
23
+ styles ({
24
+ blue: {
25
+ fg_color: "2F5496",
26
+ }
27
+ })
28
+
22
29
  schema ({
23
- name: 'Mobilités',
30
+ name: 'Utilisateurs',
24
31
  extra_headers: [
25
32
  [
26
33
  {
27
34
  title: "Utilisateurs",
28
- width: 4
35
+ width: 4,
36
+ styles: [:bold]
29
37
  }
30
38
  ],
31
39
  ],
@@ -33,11 +41,16 @@ class UserExporter < NtqExcelsior::Exporter
33
41
  {
34
42
  title: 'Name',
35
43
  resolve: -> (record) { [record.first_name, record.last_name].join(' ') },
44
+ styles: [:bold, :blue]
36
45
  },
37
46
  {
38
47
  title: 'Email',
39
48
  resolve: 'email'
40
49
  },
50
+ {
51
+ title: 'Birthdate',
52
+ resolve: 'birthdate'
53
+ }
41
54
  {
42
55
  title: 'Address (nested)',
43
56
  resolve: ['address', 'address_one']
@@ -45,12 +58,23 @@ class UserExporter < NtqExcelsior::Exporter
45
58
  {
46
59
  title: 'City (nested)',
47
60
  resolve: ['address', 'city']
61
+ },
62
+ {
63
+ title: 'Age',
64
+ resolve: 'age',
65
+ type: :number
48
66
  }
49
67
  ]
50
68
  })
51
69
 
52
70
  end
53
71
 
72
+ exporter = UserExporter.new(@users)
73
+ exporter.export
74
+ File.open("export.xlsx", "w") do |tpm|
75
+ tpm.binmode
76
+ tpm.write(file.to_stream.read)
77
+ end
54
78
  ```
55
79
 
56
80
  ## Development
@@ -5,6 +5,12 @@ module NtqExcelsior
5
5
  attr_accessor :data
6
6
 
7
7
  DEFAULT_STYLES = {
8
+ date_format: {
9
+ format_code: 'dd-mm-yyyy'
10
+ },
11
+ time_format: {
12
+ format_code: 'dd-mm-yyyy hh:mm:ss'
13
+ },
8
14
  bold: {
9
15
  b: true
10
16
  },
@@ -23,7 +29,7 @@ module NtqExcelsior
23
29
  @schema ||= value
24
30
  end
25
31
  def styles(value = nil)
26
- @schema ||= value
32
+ @styles ||= value
27
33
  end
28
34
  end
29
35
 
@@ -73,16 +79,27 @@ module NtqExcelsior
73
79
  count
74
80
  end
75
81
 
76
- def get_styles(styles)
82
+ def get_styles(row_styles, cell_styles = [])
83
+ row_styles ||= []
84
+ return {} if row_styles.length == 0 && cell_styles.length == 0
85
+
86
+ styles_hash = {}
87
+ stylesheet = styles || {}
88
+ (row_styles + cell_styles).each do |style_key|
89
+ styles_hash = styles_hash.merge(stylesheet[style_key] || DEFAULT_STYLES[style_key] || {})
90
+ end
91
+ styles_hash
77
92
  end
78
93
 
79
94
  def resolve_header_row(headers, index)
80
- row = { values: [], styles: nil, merge_cells: [], height: nil }
81
-
95
+ row = { values: [], styles: [], merge_cells: [], height: nil }
96
+ return row unless headers
97
+
82
98
  col_index = 1
83
99
  headers.each do |header|
84
100
  width = header[:width] || 1
85
101
  row[:values] << header[:title] || ''
102
+ row[:styles] << get_styles(header[:styles])
86
103
  if width > 1
87
104
  colspan = width - 1
88
105
  row[:values].push(*Array.new(colspan, nil))
@@ -105,20 +122,37 @@ module NtqExcelsior
105
122
  end
106
123
 
107
124
  def format_value(resolver, record)
108
- return resolver.call(record) if resolver.is_a?(Proc)
109
-
110
- accessors = resolver
111
- accessors = accessors.split(".") if accessors.is_a?(String)
112
- dig_value(record, accessors)
125
+ styles = []
126
+ type = nil
127
+ if resolver.is_a?(Proc)
128
+ value = resolver.call(record)
129
+ else
130
+ accessors = resolver
131
+ accessors = accessors.split(".") if accessors.is_a?(String)
132
+ value = dig_value(record, accessors)
133
+ end
134
+ if value.is_a?(Date)
135
+ value = value.strftime("%Y-%m-%d")
136
+ styles << :date_format
137
+ type = :date
138
+ end
139
+ if value.is_a?(Time) | value.is_a?(DateTime)
140
+ value = value.strftime("%Y-%m-%d %H:%M:%S")
141
+ styles << :time_format
142
+ type = :time
143
+ end
144
+ { value: value, styles: styles, type: type }
113
145
  end
114
146
 
115
147
  def resolve_record_row(schema, record, index)
116
- row = { values: [], styles: nil, merge_cells: [], height: nil }
148
+ row = { values: [], styles: [], merge_cells: [], height: nil, types: [] }
117
149
  col_index = 1
118
150
  schema.each do |column|
119
151
  width = column[:width] || 1
120
- row[:values] << format_value(column[:resolve], record)
121
-
152
+ formatted_value = format_value(column[:resolve], record)
153
+ row[:values] << formatted_value[:value]
154
+ row[:types] << (column[:type] || formatted_value[:type])
155
+ row[:styles] << get_styles(column[:styles], formatted_value[:styles])
122
156
  if width > 1
123
157
  colspan = width - 1
124
158
  row[:values].push(*Array.new(colspan, nil))
@@ -128,7 +162,6 @@ module NtqExcelsior
128
162
 
129
163
  col_index += 1
130
164
  end
131
-
132
165
  row
133
166
  end
134
167
 
@@ -150,22 +183,26 @@ module NtqExcelsior
150
183
 
151
184
  def add_sheet_content(content, wb_styles, sheet)
152
185
  content[:rows].each do |row|
153
- row_style = wb_styles.add_style(row[:styles]) if row[:styles].is_a? Hash
154
- row_style = row[:styles]&.map { |style| wb_styles.add_style(style) if style } if row[:styles].is_a? Array
155
- sheet.add_row row[:values], style: row_style, height: row[:height]
156
- next unless row[:merge_cells]
157
-
158
- row[:merge_cells]&.each do |range|
159
- sheet.merge_cells range
186
+ row_style = []
187
+ if row[:styles].is_a?(Array) && row[:styles].any?
188
+ row[:styles].each do |style|
189
+ row_style << wb_styles.add_style(style || {})
190
+ end
191
+ end
192
+ sheet.add_row row[:values], style: row_style, height: row[:height], types: row[:types]
193
+ if row[:merge_cells]
194
+ row[:merge_cells]&.each do |range|
195
+ sheet.merge_cells range
196
+ end
160
197
  end
161
198
  end
162
199
 
163
- # do not apply styles if there are now rows
200
+ # do not apply styles if there are no rows
164
201
  if content[:rows].present?
165
- content[:styles]&.each_with_index do |(range, styles), index|
202
+ content[:styles]&.each_with_index do |(range, sty), index|
166
203
  begin
167
- sheet.add_style range, styles.except(:border) if range && styles
168
- sheet.add_border range, styles[:border] if range && styles && styles[:border]
204
+ sheet.add_style range, sty.except(:border) if range && sty
205
+ sheet.add_border range, sty[:border] if range && sty && sty[:border]
169
206
  rescue NoMethodError
170
207
  # do not apply styles if error
171
208
  end
@@ -185,13 +222,13 @@ module NtqExcelsior
185
222
  end
186
223
 
187
224
  def export
188
- p = Axlsx::Package.new
189
- wb = p.workbook
225
+ package = Axlsx::Package.new
226
+ wb = package.workbook
190
227
  wb_styles = wb.styles
191
228
 
192
229
  generate_workbook(wb, wb_styles)
193
230
 
194
- p
231
+ package
195
232
  end
196
233
 
197
234
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NtqExcelsior
4
- VERSION = "0.1.0"
4
+ VERSION = "0.3.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ntq_excelsior
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-02-02 00:00:00.000000000 Z
11
+ date: 2023-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: caxlsx