aio_elin 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (134) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +675 -0
  3. data/README.md +9 -0
  4. data/config.rb +39 -0
  5. data/lib/aio/base/debug.rb +30 -0
  6. data/lib/aio/base/toolkit/array.rb +24 -0
  7. data/lib/aio/base/toolkit/date.rb +46 -0
  8. data/lib/aio/base/toolkit/deep_clone.rb +10 -0
  9. data/lib/aio/base/toolkit/diff.rb +104 -0
  10. data/lib/aio/base/toolkit/excel_office.rb +421 -0
  11. data/lib/aio/base/toolkit/excel_wps.rb +437 -0
  12. data/lib/aio/base/toolkit/excel_wps.rb.bak +299 -0
  13. data/lib/aio/base/toolkit/ipaddr.rb +28 -0
  14. data/lib/aio/base/toolkit/os.rb +26 -0
  15. data/lib/aio/base/toolkit/regexp.rb +32 -0
  16. data/lib/aio/base/toolkit/string.rb +28 -0
  17. data/lib/aio/base/toolkit/table.rb +441 -0
  18. data/lib/aio/base/toolkit/test_diff.rb +9 -0
  19. data/lib/aio/base/toolkit/test_excel.rb +118 -0
  20. data/lib/aio/base/toolkit/test_word.rb +58 -0
  21. data/lib/aio/base/toolkit/word_wps.rb +492 -0
  22. data/lib/aio/base/toolkit.rb +18 -0
  23. data/lib/aio/base.rb +10 -0
  24. data/lib/aio/core/device/cisco.rb +13 -0
  25. data/lib/aio/core/device/cmd_switch.rb +113 -0
  26. data/lib/aio/core/device/h3c.rb +12 -0
  27. data/lib/aio/core/device/huawei.rb +10 -0
  28. data/lib/aio/core/device/juniper.rb +10 -0
  29. data/lib/aio/core/device/maipu.rb +11 -0
  30. data/lib/aio/core/device/methods.rb +233 -0
  31. data/lib/aio/core/device/methods.rb.bak +199 -0
  32. data/lib/aio/core/device/parent_device.rb +275 -0
  33. data/lib/aio/core/device.rb +15 -0
  34. data/lib/aio/core/device_manager.rb +207 -0
  35. data/lib/aio/core/module/cmd.rb +160 -0
  36. data/lib/aio/core/module/description.rb +67 -0
  37. data/lib/aio/core/module/input_style.rb +98 -0
  38. data/lib/aio/core/module/output_style.rb +80 -0
  39. data/lib/aio/core/module/platform.rb +30 -0
  40. data/lib/aio/core/module/ranking.rb +24 -0
  41. data/lib/aio/core/module/special_style.rb +30 -0
  42. data/lib/aio/core/module/template.rb +13 -0
  43. data/lib/aio/core/module.rb +15 -0
  44. data/lib/aio/core/module_loader.rb +161 -0
  45. data/lib/aio/core/module_loader.rb.bak +148 -0
  46. data/lib/aio/core/module_manager.rb +112 -0
  47. data/lib/aio/core/module_manager.rb.bak +78 -0
  48. data/lib/aio/core/parse/file.rb +19 -0
  49. data/lib/aio/core/parse/parser.rb +91 -0
  50. data/lib/aio/core/parse/parser_machine/bak/has_cmd_state.rb +14 -0
  51. data/lib/aio/core/parse/parser_machine/bak/has_context_state.rb +11 -0
  52. data/lib/aio/core/parse/parser_machine/bak/no_cmd_state.rb +11 -0
  53. data/lib/aio/core/parse/parser_machine/bak/no_context_state.rb +11 -0
  54. data/lib/aio/core/parse/parser_machine/full_state.rb +12 -0
  55. data/lib/aio/core/parse/parser_machine/has_device_state.rb +44 -0
  56. data/lib/aio/core/parse/parser_machine/no_device_state.rb +12 -0
  57. data/lib/aio/core/parse/parser_machine/parent_state.rb +26 -0
  58. data/lib/aio/core/parse/parser_machine.rb +47 -0
  59. data/lib/aio/core/parse.rb +6 -0
  60. data/lib/aio/core/text/context.rb +211 -0
  61. data/lib/aio/core/text/line_string.rb +74 -0
  62. data/lib/aio/core/text/warning.rb +179 -0
  63. data/lib/aio/core/text.rb +7 -0
  64. data/lib/aio/core/warning/description.rb +47 -0
  65. data/lib/aio/core/warning/warning_summarize.rb +232 -0
  66. data/lib/aio/core/warning.rb +6 -0
  67. data/lib/aio/core.rb +32 -0
  68. data/lib/aio/license.rb +687 -0
  69. data/lib/aio/resource/cover_picture.png +0 -0
  70. data/lib/aio/resource/line.png +0 -0
  71. data/lib/aio/resource/logo.png +0 -0
  72. data/lib/aio/ui/banner.rb +85 -0
  73. data/lib/aio/ui/readable_text.rb +75 -0
  74. data/lib/aio/ui/verbose.rb +29 -0
  75. data/lib/aio/ui/version.rb +9 -0
  76. data/lib/aio/ui.rb +138 -0
  77. data/lib/aio.rb +13 -0
  78. data/lib/modules/cmd/cisco/show_clock.rb +32 -0
  79. data/lib/modules/cmd/cisco/show_cpu.rb +32 -0
  80. data/lib/modules/cmd/cisco/show_env.rb +71 -0
  81. data/lib/modules/cmd/cisco/show_failover.rb +39 -0
  82. data/lib/modules/cmd/cisco/show_interface_ip_brief.rb +24 -0
  83. data/lib/modules/cmd/cisco/show_interfaces.rb +177 -0
  84. data/lib/modules/cmd/cisco/show_inv.rb +43 -0
  85. data/lib/modules/cmd/cisco/show_ip_interface_brief.rb +42 -0
  86. data/lib/modules/cmd/cisco/show_ip_ospf_nei.rb +38 -0
  87. data/lib/modules/cmd/cisco/show_ip_route_summary.rb +81 -0
  88. data/lib/modules/cmd/cisco/show_memory.rb +27 -0
  89. data/lib/modules/cmd/cisco/show_process_cpu.rb +35 -0
  90. data/lib/modules/cmd/cisco/show_process_memory.rb +63 -0
  91. data/lib/modules/cmd/cisco/show_version.rb +97 -0
  92. data/lib/modules/cmd/h3c/display_clock.rb +32 -0
  93. data/lib/modules/cmd/h3c/display_cpu.rb +51 -0
  94. data/lib/modules/cmd/h3c/display_device_manuinfo.rb +45 -0
  95. data/lib/modules/cmd/h3c/display_fan.rb +91 -0
  96. data/lib/modules/cmd/h3c/display_interface.rb +203 -0
  97. data/lib/modules/cmd/h3c/display_ip_interface_brief.rb +34 -0
  98. data/lib/modules/cmd/h3c/display_ip_routing.rb +68 -0
  99. data/lib/modules/cmd/h3c/display_ip_routing_stat.rb +90 -0
  100. data/lib/modules/cmd/h3c/display_memory.rb +35 -0
  101. data/lib/modules/cmd/h3c/display_ospf_peer.rb +38 -0
  102. data/lib/modules/cmd/h3c/display_power.rb +90 -0
  103. data/lib/modules/cmd/h3c/display_version.rb +54 -0
  104. data/lib/modules/cmd/h3c/display_vrrp_verbose.rb +86 -0
  105. data/lib/modules/cmd/maipu/show_env.rb +34 -0
  106. data/lib/modules/cmd/maipu/show_ip_route.rb +74 -0
  107. data/lib/modules/cmd/maipu/show_ip_route_statistic.rb +36 -0
  108. data/lib/modules/cmd/maipu/show_memory.rb +31 -0
  109. data/lib/modules/cmd/maipu/show_system_fan.rb +66 -0
  110. data/lib/modules/cmd/maipu/show_system_power.rb +66 -0
  111. data/lib/modules/cmd/maipu/show_version.rb +50 -0
  112. data/lib/modules/description/style/crc.rb +22 -0
  113. data/lib/modules/description/style/input_errors.rb +22 -0
  114. data/lib/modules/description/style/overrun.rb +22 -0
  115. data/lib/modules/description/style/proc_ratio.rb +22 -0
  116. data/lib/modules/description/style/protocol.rb +22 -0
  117. data/lib/modules/description/style/register.rb +22 -0
  118. data/lib/modules/description/style/runts.rb +22 -0
  119. data/lib/modules/description/style/template.rb +22 -0
  120. data/lib/modules/description/style/total_output_drops.rb +22 -0
  121. data/lib/modules/input/style/compare_xml.rb +89 -0
  122. data/lib/modules/input/style/console.rb +222 -0
  123. data/lib/modules/input/style/console.rb.bak +114 -0
  124. data/lib/modules/input/style/xinhua_nat.rb +70 -0
  125. data/lib/modules/output/style/boc_day.rb +223 -0
  126. data/lib/modules/output/style/cmds.rb +77 -0
  127. data/lib/modules/output/style/compare_json.rb +26 -0
  128. data/lib/modules/output/style/compare_report.rb +31 -0
  129. data/lib/modules/output/style/compare_xml.rb +86 -0
  130. data/lib/modules/output/style/excel_table_office.rb +407 -0
  131. data/lib/modules/output/style/excel_table_wps.rb +400 -0
  132. data/lib/modules/output/style/summary_report.rb +563 -0
  133. data/lib/modules/special/style/compare.rb +110 -0
  134. metadata +176 -0
data/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # aio
2
+ ====
3
+ 巡检设备信息比较以及报表生产工具<br>
4
+
5
+ ## 用法
6
+ aio -l 所有模块的列表<br>
7
+ <br>
8
+ aio -is input/style/console -i \<input\_file\_path\> -os output/style/excel\_table -o \<output\_file\_path> <br>
9
+ 按照Terminal模式的输入, 按照Excel表的格式输出
data/config.rb ADDED
@@ -0,0 +1,39 @@
1
+ # 此配置模块用于过滤多余的警告信息
2
+
3
+ module Aio::Config
4
+ module Warning
5
+ Pass = "pass"
6
+
7
+ Serious = [
8
+ #:crc,
9
+ #:input_errors,
10
+ ]
11
+
12
+ Ordinary = [
13
+ #:total_output_drops,
14
+ :iface_resets,
15
+ :giants,
16
+ ]
17
+
18
+ # 包括数值 或者 Pass
19
+ Compare = {
20
+ # version
21
+ :uptime => Pass,
22
+ # interface
23
+ :crc => 50,
24
+ :frame => Pass,
25
+ # memory
26
+ :proc_ratio => 50,
27
+ # cpu
28
+ :minute_1 => 10,
29
+ :minutes_5 => 10,
30
+ # clock
31
+ :time => Pass,
32
+ :week => Pass,
33
+ :year => Pass,
34
+ :month => Pass,
35
+ :day => Pass,
36
+ }
37
+ end
38
+ end
39
+
@@ -0,0 +1,30 @@
1
+ module Aio::Base
2
+ module Debug
3
+
4
+ class << self
5
+ def enable?
6
+ false
7
+ end
8
+
9
+ # core/text/context.rb
10
+ # 如果没有找到匹配的行,则输出debug
11
+ def mismatch?
12
+ true
13
+ end
14
+
15
+
16
+ # core/text/context.rb:56
17
+ # 如果模块中方法有问题,则报错
18
+ def module_debug?
19
+ true
20
+ end
21
+
22
+ # ui.rb
23
+ # 查看解析后设备情况
24
+ def ui_enable?
25
+ false
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,24 @@
1
+ module Aio::Base::Toolkit::Array
2
+ class << self
3
+
4
+ # 按pattern分割数组
5
+ def split(array, pattern)
6
+ res = [[]]
7
+ count = 0
8
+ array.each do |a|
9
+
10
+ a = Aio::Base::Toolkit::String.safe(a)
11
+ unless pattern.match(a)
12
+ res[count] << a
13
+ else
14
+ res << []
15
+ count += 1
16
+ end
17
+ end
18
+ res
19
+ end
20
+
21
+ end
22
+ end
23
+
24
+
@@ -0,0 +1,46 @@
1
+ module Aio::Base::Toolkit::Date
2
+ class << self
3
+
4
+ def month_to_i(str)
5
+ return case str
6
+ when /(?i)Jan/
7
+ "01"
8
+ when /(?i)Feb/
9
+ "02"
10
+ when /(?i)Mar/
11
+ "03"
12
+ when /(?i)Apr/
13
+ "04"
14
+ when /(?i)May/
15
+ "05"
16
+ when /(?i)Jun/
17
+ "06"
18
+ when /(?i)Jul/
19
+ "07"
20
+ when /(?i)Aug/
21
+ "08"
22
+ when /(?i)Sep/
23
+ "09"
24
+ when /(?i)Oct/
25
+ "10"
26
+ when /(?i)Nov/
27
+ "11"
28
+ when /(?i)Dec/
29
+ "12"
30
+ else
31
+ "unknow"
32
+ end
33
+ end
34
+
35
+ # arr = [time, zone, week, year, month, day]
36
+ def time_to_s(arr)
37
+ year = arr[3]
38
+ month = arr[4]
39
+ day = arr[5]
40
+ time = arr[0]
41
+ format("%s-%s-%s %s", year, month, day, time)
42
+ end
43
+
44
+ end # class self
45
+ end
46
+
@@ -0,0 +1,10 @@
1
+ module Aio::Base::Toolkit
2
+ module DeepClone
3
+
4
+ # 深度克隆
5
+ def self.clone(info)
6
+ Marshal.load(Marshal.dump(info))
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,104 @@
1
+ # 此文件是用来比较两个命令文件不同之处,并生产Ruby格式命令
2
+
3
+ #module Aio::Base::Toolkit
4
+ class Diff
5
+
6
+ # 输入文件1
7
+ attr_accessor :input_1
8
+
9
+ # 输入文件2
10
+ attr_accessor :input_2
11
+
12
+ def initialize(input_1, input_2)
13
+ self.input_1 = File.open(input_1)
14
+ self.input_2 = File.open(input_2)
15
+ @context_name = "context"
16
+ end
17
+
18
+ def diff
19
+ in_1 = @input_1.dup
20
+ in_2 = @input_2.dup.readlines
21
+ # 行计数从1开始
22
+ line_count = 0
23
+ res_text = []
24
+
25
+ in_1.each_line do |line_1|
26
+ # 加入了区间,如果不是在这个区间内,则忽略
27
+ line_count += 1
28
+ unless @range.nil?
29
+ if ! @range.include?(line_count)
30
+ next
31
+ end
32
+ end
33
+
34
+ line_1 = line_1.chomp
35
+ begin
36
+ line_2 = in_2[line_count - 1].chomp
37
+ rescue EOFError
38
+ break
39
+ end
40
+ #new_line = "#{@context_name}[#{line_count}].match_block(/"
41
+ new_line = "#{@context_name}.readline_match_block(/"
42
+
43
+ # 按照单词进行比对
44
+ word_1_arr = line_1.split(' ')
45
+ word_2_arr = line_2.split(' ')
46
+
47
+ word_arr = []
48
+ merge_count = []
49
+ word_1_arr.each_with_index do |word_1, i|
50
+
51
+ word_2 = word_2_arr[i]
52
+
53
+ if word_1 == word_2
54
+ word_arr << inn(word_1)
55
+ else
56
+ word_arr << '(.*)'
57
+ merge_count << i
58
+ end
59
+ end
60
+ # 合并word_arr中相邻的(.*)
61
+ real_word_arr = []
62
+ word_arr.each_with_index do |word, i|
63
+ if word != '(.*)'
64
+ real_word_arr << word
65
+ next
66
+ end
67
+ if word_arr[i+1] == '(.*)'
68
+ next
69
+ end
70
+ # 加入(.*)
71
+ real_word_arr << word
72
+ end
73
+
74
+ new_line << real_word_arr.join(' ')
75
+ new_line << '/)'
76
+
77
+ res_text << new_line
78
+ end
79
+
80
+ res = res_text.join("\n")
81
+ puts res
82
+ end
83
+
84
+ def set_range(first, last)
85
+ @range = Range.new(first, last)
86
+ end
87
+
88
+ def context_name=(var)
89
+ @context_name = var
90
+ end
91
+
92
+ # 无害化处理
93
+ def inn(word)
94
+ word.gsub!('/', '\/')
95
+ word.gsub!('(', '\(')
96
+ word.gsub!(')', '\)')
97
+ word.gsub!('.', '\.')
98
+ word
99
+ end
100
+ end
101
+ #end
102
+
103
+
104
+
@@ -0,0 +1,421 @@
1
+ module Aio::Base::Toolkit
2
+ module ExcelOffice
3
+ class WorkBook
4
+
5
+ include Aio::Ui::Verbose
6
+
7
+ @@worksheets_name = []
8
+ def initialize(encoding = "utf-8")
9
+
10
+ if Aio::Base::Toolkit::OS.windows?
11
+ require "win32ole"
12
+ else
13
+ print_error "只有Windows系统才能使用Excel模块"
14
+ exit 0
15
+ end
16
+
17
+ @excel = WIN32OLE.new("excel.Application")
18
+ @excel.visible = false
19
+ @workbook = @excel.workbooks.add
20
+ @encoding = encoding
21
+ create_style
22
+ end
23
+
24
+ # 切换到分页预览视图
25
+ def window_pagebreak
26
+ @excel.ActiveWindow.View = 2
27
+ end
28
+
29
+ # 切换到普通视图
30
+ def window_normal
31
+ @excel.ActiveWindow.View = 1
32
+ end
33
+
34
+ # 警告提示开关
35
+ def display_alerts=(bool)
36
+ @excel.DisplayAlerts = bool
37
+ end
38
+
39
+ def add_worksheet(name)
40
+ while @@worksheets_name.include?(name)
41
+ name += "1"
42
+ end
43
+ @@worksheets_name << name
44
+ worksheet = @workbook.worksheets.add
45
+ worksheet.activate
46
+ worksheet.name = name
47
+ return WorkSheet.new(worksheet)
48
+ end
49
+
50
+ def create_style
51
+ sty = @workbook.styles.add("NormalStyle")
52
+ self.class.normal_style(sty)
53
+
54
+ sty = @workbook.styles.add("BoldStyle")
55
+ self.class.bold_style(sty)
56
+
57
+ sty = @workbook.styles.add("TitleStyle")
58
+ self.class.title_style(sty)
59
+ end
60
+
61
+ def self.normal_style(sty)
62
+ sty.font.size = 9
63
+ sty.HorizontalAlignment = -4108
64
+ end
65
+
66
+ def self.bold_style(sty)
67
+ sty.font.size = 9
68
+ sty.font.bold = true
69
+ sty.HorizontalAlignment = -4108
70
+ end
71
+
72
+ def self.title_style(sty)
73
+ sty.font.size = 20
74
+ sty.font.bold = true
75
+ sty.HorizontalAlignment = -4108
76
+ end
77
+
78
+ def show
79
+ @excel.visible = true
80
+ end
81
+
82
+ def save(path)
83
+ path = Aio::Base::Toolkit::String.safe_path(path)
84
+ @workbook.saveas(path)
85
+ end
86
+
87
+ def close
88
+ @workbook.close
89
+ @excel.quit
90
+ end
91
+ end # class WorkBook
92
+
93
+ class WorkSheet
94
+ IMAGE_ROW_NUM = 56
95
+ @@worksheets_name = []
96
+ def initialize(worksheet)
97
+ @row_count = 1
98
+ @worksheet = worksheet
99
+ @nil_space = []
100
+ end
101
+
102
+ # 增加一个空行
103
+ def add_space_line(n=1)
104
+ return if n < 1
105
+ @row_count += n
106
+ end
107
+
108
+ # 对列进行合并
109
+ def merge(range1, range2)
110
+ @worksheet.range("#{range1}:#{range2}").merge
111
+ end
112
+
113
+ # 产生 ::Range 类
114
+ def range(str)
115
+ @worksheet.range(str)
116
+ end
117
+
118
+ # 添加标题行
119
+ def add_title(name)
120
+ add_row.add_cell(name, false, "BoldStyle")
121
+ end
122
+
123
+ # 设置列的宽度
124
+ def width(col, width)
125
+ @worksheet.Columns("#{col}:#{col}").ColumnWidth = width
126
+ end
127
+
128
+ def height(height)
129
+ @row_height = height
130
+ end
131
+
132
+ # 增加Row类
133
+ def add_row(&block)
134
+ @current_row = Row.new(@worksheet, @row_count)
135
+ @current_row.height = @row_height if @row_height
136
+ @row_count += 1
137
+ yield @current_row if block
138
+ @current_row.merge!
139
+ begin
140
+ @current_row.real_row.borders.linestyle = 1
141
+ rescue Exception
142
+ retry
143
+ end
144
+ return @current_row
145
+ end
146
+
147
+ # 返回此时的Row类
148
+ def current_row
149
+ return @current_row
150
+ end
151
+
152
+ # 返回此时的行索引
153
+ def current_row_id
154
+ return @current_row.row_id
155
+ end
156
+
157
+ # 添加图像
158
+ def add_image(image_path)
159
+ return unless File.exist?(image_path)
160
+ add_space_line
161
+ add_row
162
+ cell_name = current_row.first_cell
163
+ @worksheet.Range(cell_name).Select
164
+ @worksheet.Pictures.Insert(image_path)
165
+ add_space_line IMAGE_ROW_NUM
166
+ end
167
+
168
+ # 判断是否有垂直分页符存在
169
+ def has_pagebreak?
170
+ @worksheet.VPageBreaks.count > 0
171
+ end
172
+
173
+ # 对列修改分页符
174
+ def pagebreak_left(num)
175
+ #@worksheet.VPageBreaks(1).Location = @worksheet.columns(col)
176
+ @worksheet.VPageBreaks(1).DragOff("-4161", num.to_i)
177
+ end
178
+
179
+ # 返回::WorkSheet
180
+ def worksheet
181
+ @worksheet
182
+ end
183
+
184
+ # 添加图表
185
+ def add_chart(&block)
186
+ ch = @worksheet.Shapes.AddChart
187
+ active = ch.chart
188
+
189
+ # 占位符
190
+ block.call(Chart.new(active))
191
+
192
+ ch.copy
193
+ end
194
+ end
195
+
196
+ class Row
197
+ FILL_TYPE = 4
198
+
199
+ attr_reader :row_id
200
+
201
+ @@cell_map = ("A".."Z").to_a
202
+ def initialize(worksheet, row_id)
203
+ @row_id = row_id
204
+ @cell_count = 0
205
+ @worksheet = worksheet
206
+ @nil_space = []
207
+ @merge_cell = []
208
+ end
209
+
210
+ # 此时的单元格
211
+ def curent_cell
212
+ return cell_name(@cell_count)
213
+ end
214
+
215
+ # 第一个单元格
216
+ def first_cell
217
+ return cell_name(0)
218
+ end
219
+
220
+ # 设置行高
221
+ def height=(height)
222
+ begin
223
+ @worksheet.rows(@row_id).RowHeight = height
224
+ rescue Exception
225
+ retry
226
+ end
227
+ end
228
+
229
+ # 增加单元格
230
+ def add_cell(value, auto_fit = false, style = "NormalStyle")
231
+ range = @worksheet.Range(cell_name(@cell_count))
232
+ begin
233
+ range.Value = value.to_s
234
+ range.Style = style
235
+ rescue Exception
236
+ retry
237
+ end
238
+ range.Columns.AutoFit if auto_fit
239
+ @cell_count += 1
240
+ while(@nil_space.include?(to_letter(@cell_count))) do
241
+ range = @worksheet.Range(cell_name(@cell_count))
242
+ range.Value = ""
243
+ range.Style = style
244
+ @cell_count += 1
245
+ end
246
+
247
+ end
248
+
249
+ # 通过索引变成对应的字母
250
+ def to_letter(index)
251
+ @@cell_map.at(index)
252
+ end
253
+
254
+ # 特别注意,由于Toolkit中加入了Array,String的模块
255
+ # 所以判断的时候特别注意要是
256
+ def << (arr)
257
+ case arr
258
+ when ::Array
259
+ arr.size.times do |t|
260
+ add_cell(arr[t])
261
+ end
262
+ when ::String
263
+ add_cell(arr)
264
+ end
265
+ end
266
+
267
+ # 获得单元格的名字(通过索引)
268
+ def cell_name(index)
269
+ second = index % 26
270
+ first = (index - second) / 26
271
+ if first == 0
272
+ return @@cell_map[second] + @row_id.to_s
273
+ end
274
+ first -= 1
275
+ return @@cell_map[first] + @@cell_map[second] + @row_id.to_s
276
+ end
277
+
278
+ # 获得单元格的名字(通过字母)
279
+ def cell_name!(letter)
280
+ return letter + @row_id.to_s
281
+ end
282
+
283
+ def set_cell(index, value, auto_fit = false, style = "NormalStyle")
284
+ range = @worksheet.Range(cell_name(index))
285
+ range.Value = value.to_s
286
+ range.Style = style
287
+ range.Columns.AutoFit if auto_fit
288
+ end
289
+
290
+ # 设置单元格风格
291
+ def set_style(letter, style = "NormalStyle")
292
+ range = @worksheet.range(cell_name!(letter))
293
+ range.Style = style
294
+ end
295
+
296
+ # 合并一行中的单元格, 这里仅仅是记录
297
+ def merge(idx_begin, idx_end)
298
+ cell_begin = "#{idx_begin}#{@row_id}"
299
+ cell_end = "#{idx_end}#{@row_id}"
300
+ @merge_cell << [cell_begin, cell_end]
301
+ tmp = ((idx_begin.upcase)..(idx_end.upcase)).to_a
302
+ tmp.shift
303
+ @nil_space = (@nil_space | tmp).sort
304
+ end
305
+
306
+ def merge!
307
+ return if @merge_cell.empty?
308
+ @merge_cell.each do |cell_begin, cell_end|
309
+ range = @worksheet.Range("#{cell_begin}:#{cell_end}")
310
+ range.merge
311
+ end
312
+ end
313
+
314
+ # 开启自动换行
315
+ def wraptext(letter)
316
+ range = @worksheet.range(cell_name!(letter))
317
+ range.WrapText = true
318
+ end
319
+
320
+ # 对此时的行的下方下分页符
321
+ def pagebreak
322
+ begin
323
+ @worksheet.rows(@row_id+1).PageBreak = 1
324
+ rescue Exception
325
+ retry
326
+ end
327
+ end
328
+
329
+ # 返回此时的::Row类
330
+ def real_row
331
+ #@worksheet.rows(@row_id)
332
+ @worksheet.range("A#{@row_id}:#{cell_name(@cell_count - 1)}")
333
+ end
334
+
335
+ alias :style :set_style
336
+ end
337
+
338
+ # 图表
339
+ class Chart
340
+
341
+ # 图形类型
342
+ ColumnClustered = 51 # 簇状柱形图
343
+ ColumnStacked = 52 # 堆积柱状图
344
+ Doughnut = -4120 # 圆环图
345
+ Line = 4 # 折线图
346
+ Pie = 5 # 饼图
347
+ BarClustered = 57 # 簇状条形图
348
+
349
+ # 标签数据
350
+ DataLabelsShowLabel = 4 # 数据点所属的分类
351
+ DataLabelsShowLabelAndPercent = 5 # 占比百分比以及所属分类,仅饼图
352
+ DataLabelsShowPercent = 3 # 百分比, 仅饼图
353
+ DataLabelsShowValue = 2 # 默认值
354
+
355
+
356
+ def initialize(active)
357
+ @chart = active
358
+ end
359
+
360
+ def chart_work
361
+ @chart
362
+ end
363
+
364
+ # 修改标题
365
+ def title=(name)
366
+ @chart.HasTitle = true
367
+ @chart.ChartTitle.Characters.Text = name
368
+ end
369
+
370
+ # 这是原数据地址, 按列生成数据
371
+ def source=(range)
372
+ @chart.SetSourceData(range, 2)
373
+ end
374
+
375
+ # 更改图形类型
376
+ def type=(c_type)
377
+ @chart.ChartType = c_type
378
+ end
379
+
380
+ # 设置X轴名称, 只用于条形图
381
+ def axes_x=(name)
382
+ @chart.Axes(1,1).HasTitle = true
383
+ @chart.Axes(1,1).AxisTitle.Characters.Text = name
384
+ end
385
+
386
+ # 设置Y轴名称, 只用于条形图
387
+ def axes_y=(name)
388
+ @chart.Axes(2,1).HasTitle = true
389
+ @chart.Axes(2,1).AxisTitle.Characters.Text = name
390
+ end
391
+
392
+ # 修改样式
393
+ # 通过录制宏可以查看样式编号
394
+ # 条形图中203 比较好看
395
+ # 饼图中 251, 254 比较好看
396
+ def style=(int)
397
+ @chart.ChartStyle = int
398
+ data_label
399
+ end
400
+
401
+ # 添加饼图的百分比
402
+ def data_label(type=DataLabelsShowLabelAndPercent)
403
+
404
+ # 应用标签选项
405
+ @chart.ApplyDataLabels(type)
406
+
407
+ # 取消标签选项的系列名称
408
+ now = @chart.SeriesCollection(1).DataLabels
409
+ now.ShowSeriesName = false
410
+
411
+ # 将图例放到右边
412
+ now = @chart.Legend
413
+ now.Position = -4152
414
+ end
415
+ end
416
+
417
+ end
418
+ end
419
+
420
+
421
+