ld 0.2.14 → 0.3.1

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
  SHA1:
3
- metadata.gz: 4c8679ac077b377ae3c58fe3654238ad533080e2
4
- data.tar.gz: 7ae66a89f7dc77b658e910a0c80ce5d54382c4ea
3
+ metadata.gz: d473f30220597956292a6941e19ba858049e6397
4
+ data.tar.gz: faf55229c3191ccf2c0d49723d4f6d9e048d95b4
5
5
  SHA512:
6
- metadata.gz: e6cd3bd025c52def49c1dabc928f2dab82a58854cf2e0dedae26eb464b048972595eb004d2b076c6e48b5d45bc0e75cc4e69cf8a0b11b8dce869282d69eaf5a4
7
- data.tar.gz: 16e79abb2b650a66d158ecf6d7f96fb62eaa191e89825eabf8fa0cf7894340ba055a7f7bf0e3d602933c6e28e54196d3f16cacbf70d4252ef4b78e8761483aed
6
+ metadata.gz: 284fe0a7d62770499a25364635848437f3b2c07349972e00826258c8a2c86ce57ccbc9eaba89670a38170b6c5ec6f71600196bfa8e1a3ce7c8ae806f0808bac3
7
+ data.tar.gz: 783c3e70507df5011990945ed8aabe7dc7bb34e5dcf76de3ba0e1718fbbec17c3bd11642214a3da965baef7f6c85c1720480e6da82cbb285ebe1e15c754ef95c
data/README.md CHANGED
@@ -12,13 +12,13 @@ end
12
12
  ```
13
13
  ## Introduction to the
14
14
 
15
- 设计这个gem,我希望可以帮助大家在开发简单rails应用时,可以帮助大家完成50%以上的简单而重复的工作
16
- 我会提供一些类与方法,在console中使用,调用它们会生成项目结构xls文件,生成的这个xls文件中的数据,类似于一个小型文件数据库
17
- 然后我们可以以此为基础,查询项目中的一些信息.我想这样会有助于我们快速理解一个项目的基本结构,与重要文件在哪
18
- 也可以在修复bug时对bug相关文件与方法,起到快速定位的作用
19
- 这是我设计本gem的初衷,未来应该会持续更新这个gem,让它变得更加强大与方便
20
- 最终的目的是,希望这个gem可以起到快速搭建简单rails应用的作用,提升工作效率,节省时间
21
- 比如我们可以集成一些常用的模块到这个gem中,在搭建项目时只需要执行一条简单的命令就可以创建
15
+ 设计这个gem,我希望可以帮助大家在开发简单rails应用时,可以帮助大家完成50%以上的简单而重复的工作
16
+ 我会提供一些类与方法,在console中使用,调用它们会生成项目结构xls文件,生成的这个xls文件中的数据,类似于一个小型文件数据库
17
+ 然后我们可以以此为基础,查询项目中的一些信息.我想这样会有助于我们快速理解一个项目的基本结构,与重要文件在哪
18
+ 也可以在修复bug时对bug相关文件与方法,起到快速定位的作用
19
+ 这是我设计本gem的初衷,未来应该会持续更新这个gem,让它变得更加强大与方便
20
+ 最终的目的是,希望这个gem可以起到快速搭建简单rails应用的作用,提升工作效率,节省时间
21
+ 比如我们可以集成一些常用的模块到这个gem中,在搭建项目时只需要执行一条简单的命令就可以创建
22
22
 
23
23
  ## Installation
24
24
 
@@ -53,7 +53,7 @@ Ld::Excel.open('project.xls').read('models?a1:j100-f,h,i')
53
53
  Ld::Excel.open('project.xls').read('tables?a1:i300')
54
54
 
55
55
  # Create xls, Need to change the file path to your own, and then run
56
- Ld::Excel.create 'excel_test.xls' do |excel|
56
+ Ld::Excel.create :file_path =>'excel_test.xls' do |excel|
57
57
  excel.write_sheet 'sheet1' do |sheet|
58
58
  sheet.set_format({color: :red, font_size: 11, font: '宋体'})
59
59
  sheet.set_headings ['title1','title2','title3']
@@ -94,4 +94,4 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERN
94
94
 
95
95
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
96
96
 
97
- ##
97
+ ##
@@ -2,24 +2,12 @@ require 'spreadsheet'
2
2
  Spreadsheet.client_encoding = 'UTF-8'
3
3
 
4
4
  class Ld::Excel
5
- attr_accessor :excel,:path,:basename,:sheets,:sheet,:scope_arrs,:mappings,:bean,:beans
6
- attr_accessor :format
7
-
8
- @@hz ||= ".xls"
9
- ZIMU ||= {}
10
-
11
- if ZIMU.empty?
12
- flag = 'A'
13
- 0.upto(9999) do |i|
14
- ZIMU.store(flag,i)
15
- flag = flag.succ
16
- end
17
- end
5
+ attr_accessor :excel, :path
18
6
 
19
7
  # 构造函数,如果未传path则是创建一个新的excel, 如果传了path,则打开这个excel,不过打开前会验证后缀与是否存在
20
- def initialize(path = nil)
21
- if path!=nil
22
- if path.match(/.xls$/)!=nil
8
+ def initialize path = nil
9
+ if path
10
+ if path.match(/.xls$/)
23
11
  if File::exist? path
24
12
  @excel = Spreadsheet.open path
25
13
  @path = path
@@ -34,379 +22,42 @@ class Ld::Excel
34
22
  @excel = Spreadsheet::Workbook.new
35
23
  puts "创建新的Excel实例"
36
24
  end
37
- @sheets = {}
38
- @sheet = nil
39
- end
40
-
41
- def self.open(path)
42
- self.new(path)
43
25
  end
44
26
 
45
27
  # 获取一页
46
- def open_sheet sheet_name
47
- @sheet = @excel.worksheet sheet_name
48
- if @sheet == nil
49
- raise "未找到 sheet #{sheet_name}"
50
- else
51
- # puts "sheet #{sheet_name}"
52
- end
53
- self
54
- end
55
-
56
- # 获取所有页
57
- def get_sheets
58
- @sheets = @excel.worksheets
59
- puts "返回 #{@sheets.size} 页"
60
- self
61
- end
62
-
63
- # 读一个单元格
64
- def read_location(location,parse = true)
65
- l = Ld::Excel.parse_location(location)
66
- unit = read_unit_by_xy(l[:r],l[:c],parse)
67
- # puts ""
68
- end
69
-
70
- # 读一个单元格2
71
- def read_sheet_location(location,parse = true)
72
- open_sheet location.split('?')[0]
73
- read_location location.split('?')[1]
74
- end
75
-
76
-
77
- # 刷新excel中的sheet
78
- def open_new
79
- excel_new = Ld::Excel.open @path
80
- end
81
-
82
- # 读很多个location链,返回二维数组
83
- def read_location_list_arr(location_list_arr_str)
84
- units_arr = []
85
- location_list_arr_str.split(',').each do |location_list|
86
- units = read_location_list(location_list)
87
- units_arr << units
88
- end
89
- units_arr
90
- end
91
-
92
- # 读取一个location链 ,返回一维数组
93
- def read_sheet_locations(locations_config,parse = true)
94
- unit_list = []
95
- open_sheet locations_config.split('?')[0]
96
- locations_config.split('?')[1].split('.').each do |location|
97
- l = Ld::Excel.parse_location(location)
98
- unit = read_unit_by_xy(l[:r],l[:c],parse)
99
- unit_list << unit
100
- end
101
- unit_list
102
- end
103
-
104
-
105
-
106
- # 通过x,y坐标获取unit内容
107
- def read_unit_by_xy x, y, parse
108
- # puts "x: #{x}\ty: #{y}"
109
- unit = @sheet.row(y)[x]
110
- if unit.instance_of? Spreadsheet::Formula
111
- if parse
112
- return unit.value
113
- end
114
- end
115
- return unit
28
+ def open_sheet name
29
+ Ld::Sheet.open @excel, name
116
30
  end
117
31
 
32
+ # 刷新 重读一次
118
33
  def flush
119
- Ld::Excel.new self.path
120
- end
121
-
122
- def parse_del_to_hash address, scope
123
- arr = address.split '-'
124
- arr = arr[1..arr.size-1]
125
- start_row_num = scope.scan(/\d/).join[0..1]# 首行行号
126
- location = Ld::Excel.parse_location(scope.split(':')[0])
127
- hash = {}
128
- del_rows = []
129
- address.each do |del_row_num|# 去除行行号
130
- rows << del_row_num.to_i - start_row_num.to_i# 去除行行号 - 首行行号 = 数组角标位置
131
- end
132
- hash.store(:rows,jiang(rows))
133
- hash
134
- end
135
-
136
- # 解析一个excel location
137
- def self.parse_location location
138
- if location and location.class == String
139
- location.upcase!
140
- {
141
- :x => ZIMU[location.scan(/[A-Z]+/).join].to_i,
142
- :y => (location.scan(/[0-9]+/).join.to_i - 1)
143
- }
144
- else
145
- ms.puts_fail "location为空或不是String类型,无法解析"
146
- end
147
- end
148
-
149
- def ab_to a, b
150
- type = nil
151
- if is_number?(a) == true and is_number?(b) == true
152
- type = 'y'
153
- case a.to_i <=> b.to_i
154
- when 1
155
- return [type, (b..a).to_a]
156
- when -1
157
- return [type, (a..b).to_a]
158
- when 0
159
- return [type, [a]]
160
- end
161
- elsif is_number?(a) == false and is_number?(b) == false
162
- type = 'x'
163
- case a <=> b
164
- when 1
165
- return [type, (b..a).to_a]
166
- when -1
167
- return [type, (a..b).to_a]
168
- when 0
169
- return [type, [a]]
170
- end
171
- else
172
- raise "解析excel配置范围时,':'两边必须要么都是字母,要么都是数字!"
173
- end
174
- end
175
-
176
- def map_adds map, adds
177
- case adds[0]
178
- when 'x'
179
- adds[1].each do |add|
180
- map[:x] << add
181
- end
182
- when 'y'
183
- adds[1].each do |add|
184
- map[:y] << add
185
- end
186
- end
187
- end
188
-
189
- def map_add map, add
190
- if is_number? add
191
- map[:y] << add
192
- else
193
- map[:x] << add
194
- end
195
- end
196
-
197
- def map_mins map, mins
198
- case mins[0]
199
- when 'x'
200
- mins[1].each do |min|
201
- map[:x].delete min
202
- end
203
- when 'y'
204
- mins[1].each do |min|
205
- map[:y].delete min
206
- end
207
- end
208
- end
209
-
210
- def map_min map, min
211
- if is_number? min
212
- map[:y].delete min
213
- else
214
- map[:x].delete min
215
- end
216
- end
217
-
218
- def is_number? str
219
- if str.to_i.to_s == str.to_s
220
- return true
221
- end
222
- false
223
- end
224
-
225
- # 用坐标解析一个excel scope
226
- def generate_map address_str
227
- map = {:x => [], :y => []}
228
- config = parse_address address_str
229
- if config[:scope]
230
- if config[:scope].include? ':'
231
- # map初始化
232
- arr = config[:scope].split(':')
233
- if config[:scope].scan(/[0-9]+/).join == ''
234
- map_adds(map, ab_to(arr[0].scan(/[A-Z]+/).join, arr[1].scan(/[A-Z]+/).join))
235
- elsif config[:scope].scan(/[A-Z]+/).join == ''
236
- map_adds(map, ab_to(arr[0].scan(/[0-9]+/).join, arr[1].scan(/[0-9]+/).join))
237
- else
238
- map_adds(map, ab_to(arr[0].scan(/[0-9]+/).join, arr[1].scan(/[0-9]+/).join))
239
- map_adds(map, ab_to(arr[0].scan(/[A-Z]+/).join, arr[1].scan(/[A-Z]+/).join))
240
- end
241
- # map 添加
242
- if config[:add_str]
243
- config[:add_str].split(',').each do |add|
244
- if add.include? ":"
245
- map_adds(map, ab_to(add.split(':')[0], add.split(':')[1]))
246
- else
247
- map_add map, add
248
- end
249
- end
250
- end
251
- # map 减小
252
- if config[:min_str]
253
- config[:min_str].split(',').each do |min|
254
- if min.include? ":"
255
- map_mins(map, ab_to(min.split(':')[0], min.split(':')[1]))
256
- else
257
- map_min map, min
258
- end
259
- end
260
- end
261
- else
262
- raise "scope 没有 ':' 无法解析"
263
- end
264
- else
265
- raise "scope == nil"
266
- end
267
- map[:x].uniq!
268
- map[:y].uniq!
269
- arrs = []
270
- map[:y].each do |y|
271
- rows = []
272
- map[:x].each do |x|
273
- rows << ["#{x}_#{y}", ZIMU[x], y.to_i - 1]
274
- end
275
- arrs << rows
276
- end
277
- return arrs
278
- rescue
279
- puts "生成map时发生错误: #{$!}"
280
- puts $@
281
- end
282
-
283
-
284
- # 解析范围配置
285
- def parse_address address
286
- hash = {}
287
- if address
288
- address.upcase!
289
- else
290
- raise "address 为 nil"
291
- end
292
- if address.split('+').size > 2
293
- raise "'+'号只能有1个"
294
- end
295
- if address.split('-').size > 2
296
- raise "'-'号只能有1个"
297
- end
298
- if address.include?('+')
299
- a = address.split('+')[0]
300
- b = address.split('+')[1]
301
- if a.include?('-')
302
- hash.store :scope, a.split('-')[0]
303
- hash.store :min_str, a.split('-')[1]
304
- hash.store :add_str, b
305
- else
306
- hash.store :scope, a
307
- if b.include?('-')
308
- hash.store :min_str, b.split('-')[1]
309
- hash.store :add_str, b.split('-')[0]
310
- else
311
- hash.store :add_str, b
312
- end
313
- end
314
- else
315
- if address.include?('-')
316
- hash.store :scope, address.split('-')[0]
317
- hash.store :min_str, address.split('-')[1]
318
- else
319
- hash.store :scope, address
320
- end
321
- end
322
- hash
323
- end
324
-
325
- # 先打开一个sheet页,再读scope范围数据
326
- # params?b13:m27-g.j.k.(14:18)
327
- def read full_scope, simple = true, filter_nil = false
328
- if full_scope.include?('?')
329
- sheet_name = full_scope.split('?')[0]
330
- if sheet_name
331
- open_sheet sheet_name
332
- else
333
- raise "sheetname为nil"
334
- end
335
- address_str = full_scope.split('?')[1]
336
- map = generate_map address_str
337
- data_arrs = read_map map, simple
338
- if data_arrs.size == 0
339
- puts "没有任何内容的区域! #{full_scope}"
340
- else
341
- puts "#{full_scope}"
342
- end
343
- # 除去不完整数据
344
- if filter_nil == true
345
- (data_arrs.size - 1).downto(0) do |i|
346
- arr = data_arrs[i]
347
- if arr[0] == nil or arr[1] == nil
348
- data_arrs.delete_at i
349
- end
350
- end
351
- end
352
- return data_arrs
353
- else
354
- raise "缺少?,需要在'?'左边指定sheet的名称"
355
- end
356
- end
357
-
358
- def read_map arrs, simple = true
359
- @scope_arrs = []
360
- arrs.each do |arr|
361
- rows = []
362
- arr.each do |a|
363
- if simple
364
- rows << read_unit_by_xy(a[1], a[2], true)
365
- else
366
- rows << {:index => a[0], :value => read_unit_by_xy(a[1], a[2], true)}
34
+ @excel = Ld::Excel.open @path
35
+ end
36
+
37
+ # content_url = "Sheet1?b13:m27-g.j.k.(14:18)"
38
+ def read address_path_full, simple = false, filter_nil = false
39
+ raise "缺少?, 需要在'?'左边指定sheet的名称" if !address_path_full.match(/\?/)
40
+ sheet_name, address_path = address_path_full.split('?')
41
+ @current_sheet = open_sheet sheet_name
42
+ arrs = @current_sheet.read address_path, simple
43
+ # 除去不完整数据
44
+ if filter_nil
45
+ (arrs.size - 1).downto(0) do |i|
46
+ arr = arrs[i]
47
+ if arr[0] == nil or arr[1] == nil
48
+ arrs.delete_at i
367
49
  end
368
50
  end
369
- @scope_arrs << rows
370
51
  end
371
- @scope_arrs
372
- end
373
52
 
374
- # 排序
375
- def jiang arr
376
- 0.upto(arr.size - 2) do |i|
377
- (i+1).upto(arr.size - 1) do |j|
378
- if arr[i] < arr[j]
379
- arr[i] = arr[i] + arr[j]
380
- arr[j] = arr[i] - arr[j]
381
- arr[i] = arr[i] - arr[j]
382
- end
383
- end
384
- end
385
- arr
386
- end
387
-
388
- def sheng arr
389
- 0.upto(arr.size - 2) do |i|
390
- (i+1).upto(arr.size - 1) do |j|
391
- if arr[i] > arr[j]
392
- arr[i] = arr[i] + arr[j]
393
- arr[j] = arr[i] - arr[j]
394
- arr[i] = arr[i] - arr[j]
395
- end
396
- end
397
- end
398
- arr
53
+ arrs
399
54
  end
400
55
 
401
56
  # 保存文件
402
57
  def save path
403
- if File.exist? path
404
- @excel.write path
405
- puts "保存覆盖了一个同名文件 #{@path}"
406
- else
407
- @excel.write path
408
- puts "保存到: #{path}"
409
- end
58
+ puts "这个操作将会覆盖了这个文件:#{path}" if File.exist? path
59
+ @excel.write path
60
+ puts "保存excel成功:#{path}"
410
61
  self
411
62
  end
412
63
 
@@ -415,30 +66,16 @@ class Ld::Excel
415
66
  end
416
67
 
417
68
  def write_sheet sheet_name, &block
418
- @sheet = new_sheet sheet_name
419
- block.call @sheet
420
- @sheet.save
69
+ sheet = new_sheet sheet_name
70
+ block.call sheet
71
+ sheet.save
421
72
  end
422
73
 
423
- def self.create path, &block
74
+ def self.create hash, &block
424
75
  excel = Ld::Excel.new
425
76
  block.call excel
426
- excel.save path
77
+ excel.save hash[:file_path]
427
78
  end
428
79
 
429
- def self.test
430
- Ld::Excel.create '/Users/liudong/Desktop/abss.xls' do |excel|
431
- ['sh1','sh2','发有3'].each do |sheet_name|
432
- excel.write_sheet sheet_name do |sheet|
433
- sheet.set_format({color: :green, font_size: 22, font: '宋体'})
434
- sheet.set_headings ['a','b']
435
- sheet.set_point 'c5'
436
- (5..22).to_a.each do |i|
437
- sheet.add_row i.times.map{|j| '村腰里 是'}
438
- end
439
- end
440
- end
441
- end
442
- end
443
80
  end
444
81
 
@@ -1,17 +1,255 @@
1
1
  class Ld::Sheet
2
+ attr_accessor :excel, :sheet
2
3
 
3
- def initialize excel, name
4
+ ABSCISSA = {}
5
+ if ABSCISSA.empty?
6
+ zm = 'A'
7
+ ABSCISSA[zm] = 0
8
+ 19999.times{|i| ABSCISSA[zm.succ!] = i+1}
9
+ end
10
+
11
+ def initialize excel, name, type = 'new'
12
+ raise "name为 nil" if !name
4
13
  @excel = excel
5
14
  @name = name
6
- @point = 'a1'
7
- @rows = []
8
- @headings = nil
9
- @sheet = excel.create_worksheet :name => name
15
+ case type
16
+ when 'new'
17
+ @sheet = excel.create_worksheet :name => name
18
+ @point = 'a1'
19
+ @headings = nil
20
+ @rows = []
21
+ when 'open'
22
+ @sheet = excel.worksheet name
23
+ raise "#{name} 不存在" if !@sheet
24
+ end
10
25
  @format = @sheet.default_format
11
26
  end
12
27
 
28
+ def read address_str, simple = false
29
+ map = generate_map address_str
30
+ arrs = read_map map, simple
31
+ if arrs.size == 0
32
+ puts "没有任何内容的区域! #{address_str}"
33
+ else
34
+ puts "#{address_str}"
35
+ end
36
+ arrs
37
+ end
38
+
39
+ # simple 带不带坐标index数据
40
+ def read_map arrs, simple
41
+ @scope_arrs = []
42
+ arrs.each do |arr|
43
+ rows = []
44
+ arr.each do |a|
45
+ if simple
46
+ rows << {:index => a[0], :value => read_unit_by_xy(a[1], a[2], true)}
47
+ else
48
+ rows << read_unit_by_xy(a[1], a[2], true)
49
+ end
50
+ end
51
+ @scope_arrs << rows
52
+ end
53
+ @scope_arrs
54
+ end
55
+
56
+ # 通过x,y坐标获取unit内容
57
+ def read_unit_by_xy x, y, parse
58
+ # puts "x: #{x}\ty: #{y}"
59
+ unit = @sheet.row(y)[x]
60
+ if unit.instance_of? Spreadsheet::Formula
61
+ if parse
62
+ return unit.value
63
+ end
64
+ end
65
+ return unit
66
+ end
67
+
68
+ # 用坐标解析一个excel scope
69
+ def generate_map address_str
70
+ map = {:x => [], :y => []}
71
+ config = parse_address address_str
72
+ if config[:scope]
73
+ if config[:scope].include? ':'
74
+ # map初始化
75
+ arr = config[:scope].split(':')
76
+ if config[:scope].scan(/[0-9]+/).join == ''
77
+ map_adds(map, ab_to(arr[0].scan(/[A-Z]+/).join, arr[1].scan(/[A-Z]+/).join))
78
+ elsif config[:scope].scan(/[A-Z]+/).join == ''
79
+ map_adds(map, ab_to(arr[0].scan(/[0-9]+/).join, arr[1].scan(/[0-9]+/).join))
80
+ else
81
+ map_adds(map, ab_to(arr[0].scan(/[0-9]+/).join, arr[1].scan(/[0-9]+/).join))
82
+ map_adds(map, ab_to(arr[0].scan(/[A-Z]+/).join, arr[1].scan(/[A-Z]+/).join))
83
+ end
84
+ # map 添加
85
+ if config[:add_str]
86
+ config[:add_str].split(',').each do |add|
87
+ if add.include? ":"
88
+ map_adds(map, ab_to(add.split(':')[0], add.split(':')[1]))
89
+ else
90
+ map_add map, add
91
+ end
92
+ end
93
+ end
94
+ # map 减小
95
+ if config[:min_str]
96
+ config[:min_str].split(',').each do |min|
97
+ if min.include? ":"
98
+ map_mins(map, ab_to(min.split(':')[0], min.split(':')[1]))
99
+ else
100
+ map_min map, min
101
+ end
102
+ end
103
+ end
104
+ else
105
+ raise "scope 没有 ':' 无法解析"
106
+ end
107
+ else
108
+ raise "scope == nil"
109
+ end
110
+ map[:x].uniq!
111
+ map[:y].uniq!
112
+ arrs = []
113
+ map[:y].each do |y|
114
+ rows = []
115
+ map[:x].each do |x|
116
+ rows << ["#{x}_#{y}", ABSCISSA[x], y.to_i - 1]
117
+ end
118
+ arrs << rows
119
+ end
120
+ return arrs
121
+ rescue
122
+ puts "生成map时发生错误: #{$!}"
123
+ puts $@
124
+ end
125
+
126
+ def ab_to a, b
127
+ type = nil
128
+ if is_number?(a) == true and is_number?(b) == true
129
+ type = 'y'
130
+ case a.to_i <=> b.to_i
131
+ when 1
132
+ return [type, (b..a).to_a]
133
+ when -1
134
+ return [type, (a..b).to_a]
135
+ when 0
136
+ return [type, [a]]
137
+ end
138
+ elsif is_number?(a) == false and is_number?(b) == false
139
+ type = 'x'
140
+ case a <=> b
141
+ when 1
142
+ return [type, (b..a).to_a]
143
+ when -1
144
+ return [type, (a..b).to_a]
145
+ when 0
146
+ return [type, [a]]
147
+ end
148
+ else
149
+ raise "解析excel配置范围时,':'两边必须要么都是字母,要么都是数字!"
150
+ end
151
+ end
152
+
153
+ def map_mins map, mins
154
+ case mins[0]
155
+ when 'x'
156
+ mins[1].each do |min|
157
+ map[:x].delete min
158
+ end
159
+ when 'y'
160
+ mins[1].each do |min|
161
+ map[:y].delete min
162
+ end
163
+ end
164
+ end
165
+
166
+ def map_min map, min
167
+ if is_number? min
168
+ map[:y].delete min
169
+ else
170
+ map[:x].delete min
171
+ end
172
+ end
173
+
174
+ def map_adds map, adds
175
+ case adds[0]
176
+ when 'x'
177
+ adds[1].each do |add|
178
+ map[:x] << add
179
+ end
180
+ when 'y'
181
+ adds[1].each do |add|
182
+ map[:y] << add
183
+ end
184
+ end
185
+ end
186
+
187
+ def is_number? str
188
+ if str.to_i.to_s == str.to_s
189
+ return true
190
+ end
191
+ false
192
+ end
193
+
194
+ def map_add map, add
195
+ if is_number? add
196
+ map[:y] << add
197
+ else
198
+ map[:x] << add
199
+ end
200
+ end
201
+
202
+ # 解析范围配置
203
+ def parse_address address
204
+ hash = {}
205
+ if address
206
+ address.upcase!
207
+ else
208
+ raise "address 为 nil"
209
+ end
210
+ if address.split('+').size > 2
211
+ raise "'+'号只能有1个"
212
+ end
213
+ if address.split('-').size > 2
214
+ raise "'-'号只能有1个"
215
+ end
216
+ if address.include?('+')
217
+ a = address.split('+')[0]
218
+ b = address.split('+')[1]
219
+ if a.include?('-')
220
+ hash.store :scope, a.split('-')[0]
221
+ hash.store :min_str, a.split('-')[1]
222
+ hash.store :add_str, b
223
+ else
224
+ hash.store :scope, a
225
+ if b.include?('-')
226
+ hash.store :min_str, b.split('-')[1]
227
+ hash.store :add_str, b.split('-')[0]
228
+ else
229
+ hash.store :add_str, b
230
+ end
231
+ end
232
+ else
233
+ if address.include?('-')
234
+ hash.store :scope, address.split('-')[0]
235
+ hash.store :min_str, address.split('-')[1]
236
+ else
237
+ hash.store :scope, address
238
+ end
239
+ end
240
+ hash
241
+ end
242
+
243
+ def self.open excel, name
244
+ self.new excel, name, 'open'
245
+ end
246
+
247
+ def self.create excel, name
248
+ self.new excel, name, 'new'
249
+ end
250
+
13
251
  def save
14
- l = Ld::Excel.parse_location @point
252
+ l = parse_location @point
15
253
  raise '保存sheet必须要有内容,请 set_rows' if !@rows
16
254
  raise '保存sheet必须要有name,请 set_rows' if !@name
17
255
  @rows.unshift @headings if @headings
@@ -24,6 +262,13 @@ class Ld::Sheet
24
262
  self
25
263
  end
26
264
 
265
+ # 解析一个 content_url
266
+ def parse_location location_str
267
+ raise "无法解析excel坐标,坐标需要是String,不能是#{location_str.class.to_s}" if location_str and location_str.class != String
268
+ location_str.upcase!
269
+ return {:x => ABSCISSA[location_str.scan(/[A-Z]+/).join].to_i, :y => (location_str.scan(/[0-9]+/).join.to_i - 1)}
270
+ end
271
+
27
272
  def set_rows rows
28
273
  raise '必须是一个数组且是一个二维数组' if rows.class != Array && rows.first.class != Array
29
274
  @rows = rows
@@ -47,7 +292,7 @@ class Ld::Sheet
47
292
  def write_unit_by_xy x, y, unit
48
293
  if unit.class == Array
49
294
  unit = unit.to_s
50
- puts '有一个单元格是数组格式,已经转化成字符串'
295
+ puts '提示: 有一个单元格的内容是Array, 它被当成字符串写入'
51
296
  end
52
297
  @sheet.row(x)[y] = unit
53
298
  end
@@ -97,6 +342,7 @@ class Ld::Sheet
97
342
  set_font_size hash[:font_size]
98
343
  set_font hash[:font]
99
344
  end
345
+
100
346
  end
101
347
 
102
348
  =begin
@@ -1,6 +1,6 @@
1
1
  class Ld::Project
2
2
 
3
- attr_accessor :root, :tables, :models, :controllers, :views, :routes
3
+ attr_accessor :root, :tables, :models, :controllers, :views, :routes, :table_hash
4
4
 
5
5
  def initialize table_hash = {}, project_root_path = Rails.root.to_s
6
6
  @root = Ld::File.new project_root_path
@@ -97,7 +97,7 @@ class Ld::Project
97
97
  def to_xls path = "#{@root.path}/project.xls"
98
98
  Ld::Excel.create path do |excel|
99
99
  excel.write_sheet 'routes' do |sheet|
100
- sheet.set_format({color: :black, font_size: 18, font: '微软雅黑'})
100
+ sheet.set_format({color: :red, font_size: 14, font: '微软雅黑'})
101
101
  sheet.set_headings @routes.headings
102
102
  sheet.set_rows @routes.rows
103
103
  end
data/lib/ld/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ld
2
- VERSION = "0.2.14"
2
+ VERSION = "0.3.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ld
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.14
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Liu Dong
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-06-05 00:00:00.000000000 Z
11
+ date: 2017-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: terminal-table