lib/aio/base/toolkit/word_wps.rb in aio_elin-1.0.0 vs lib/aio/base/toolkit/word_wps.rb in aio_elin-1.0.1

- old
+ new

@@ -1,492 +1,496 @@ module Aio::Base::Toolkit -module WordWps - class Word - - include Aio::Ui::Verbose - - def initialize(encoding = "utf-8") + module WordWps + class Word - if Aio::Base::Toolkit::OS.windows? - require "win32ole" - else - print_error "只有Windows系统才能使用Excel模块" - exit 0 - end + include Aio::Ui::Verbose + def initialize(encoding = "utf-8") - @word = WIN32OLE.new("Word.Application") - @word.visible = false - @encoding = encoding - end + if Aio::Base::Toolkit::OS.windows? + require "win32ole" + else + print_error "只有Windows系统才能使用Excel模块" + exit 0 + end - # 警告提示开关 - def display_alerts=(bool) - @word.DisplayAlerts = bool - end - def init_document - @document = @word.Documents.add - return Document.new(@document, @word) - end + @word = WIN32OLE.new("Word.Application") + @word.visible = false + @encoding = encoding + end + # 警告提示开关 + def display_alerts=(bool) + @word.DisplayAlerts = bool + end - def show - @word.visible = true - end + def init_document + @document = @word.Documents.add + return Document.new(@document, @word) + end - def save(path) - @document.saveas(path) - end - def close - @document.close - @word.quit - end - end + def show + @word.visible = true + end -# 对文本控件的调用 - class Document - - def initialize(document, word) - @doc_work = document - @word = word - #@text = Text.new(@word.Selection, self) - create_style - end + def save(path) + @document.saveas(path) + end - # ActiveDocument - def doc_work - @doc_work - end + def close + @document.close + @word.quit + end + end - # 自动化对象 - def word_basic - doc_work.Application.WordBasic - end + # 对文本控件的调用 + class Document - # 创建样式 - def create_style + def initialize(document, word) + @doc_work = document + @word = word + #@text = Text.new(@word.Selection, self) + create_style + end - # 正文 楷体五号 - sty = @doc_work.styles("正文") - sty.font.size = 10 - sty.font.NameFarEast = "宋体" - sty.font.NameAscii = "Times New Roman" - sty.font.NameOther = "Times New Roman" - sty.ParagraphFormat.Alignment = 3 - sty.ParagraphFormat.LineSpacingRule = 1 - sty.NextParagraphStyle = "正文" + # ActiveDocument + def doc_work + @doc_work + end - # 楷体3号字体 - sty = @doc_work.styles.add("Cover 1", 1) - sty.font.size = 16 - sty.font.NameFarEast = "楷体" - sty.font.NameAscii = "Times New Roman" - sty.font.NameOther = "Times New Roman" - end + # 自动化对象 + def word_basic + doc_work.Application.WordBasic + end - # 由实例自己创建风格 - def create_style_self(name) - sty = @doc_work.styles.add(name, 1) - yield sty - end + # 创建样式 + def create_style - # 返回Selection - def now - @word.Selection - end + # 正文 楷体五号 + sty = @doc_work.styles("正文") + sty.font.size = 10 + sty.font.NameFarEast = "宋体" + sty.font.NameAscii = "Times New Roman" + sty.font.NameOther = "Times New Roman" + sty.ParagraphFormat.Alignment = 3 + sty.ParagraphFormat.LineSpacingRule = 1 + sty.NextParagraphStyle = "正文" - # 返回Text类 - def add_text - return Text.new(@word.Selection, self) - entry - end + # 楷体3号字体 + sty = @doc_work.styles.add("Cover 1", 1) + sty.font.size = 16 + sty.font.NameFarEast = "楷体" + sty.font.NameAscii = "Times New Roman" + sty.font.NameOther = "Times New Roman" + end - # 风格设置 - def styles(name) - @doc_work.Styles(name) - end + # 由实例自己创建风格 + def create_style_self(name) + sty = @doc_work.styles.add(name, 1) + yield sty + end - # 设置表格 - def add_table(row, col) - @doc_work.tables.add(now.Range, row, col) - end + # 返回Selection + def now + @word.Selection + end - # 创建目录 - def create_catalog - #range = doc_work.Range(0, 0) - range = now.range - doc_work.TablesOfContents.Add( - range, # Range - true, # UseHeadingStyles - 1, # UpperHeadingLevel - 3, # LowerHeadingLevel default: 9 - false, # UseFields - nil, # TableId - true, # RightAlignPageNumbers - true, # IncludePageNumbers - "", # AddedStyles - true, # UseHyperlinks - true, # HidePageNumbersInWeb - true, # UseOutlineLevels default: false - ) + # 返回Text类 + def add_text + return Text.new(@word.Selection, self) + entry + end - # 换到下一行 - move_down - end + # 风格设置 + def styles(name) + @doc_work.Styles(name) + end - # 更新目录 - def update_catalog - word_basic.UpdateTableOfContents - end + # 设置表格 + def add_table(row, col) + @doc_work.tables.add(now.Range, row, col) + end - # 回车 - def entry - now.TypeParagraph - end + # 创建目录 + def create_catalog + #range = doc_work.Range(0, 0) + range = now.range + doc_work.TablesOfContents.Add( + range, # Range + true, # UseHeadingStyles + 1, # UpperHeadingLevel + 3, # LowerHeadingLevel default: 9 + false, # UseFields + nil, # TableId + true, # RightAlignPageNumbers + true, # IncludePageNumbers + "", # AddedStyles + true, # UseHyperlinks + true, # HidePageNumbersInWeb + true, # UseOutlineLevels default: false + ) - # 移动到行首 - def home_key - now.HomeKey(5) - end + # 换到下一行 + move_down + end - # 移动到行尾 - def end_key - now.EndKey(5) - end + # 更新目录 + def update_catalog + word_basic.UpdateTableOfContents + end - # 移动到下一行 - def move_down - self.end_key - self.entry - end + # 回车 + def entry + now.TypeParagraph + end - # 右移 - # count 数值, 移动距离 - # ext 0or1 , 是否扩展 - # unit wdCharachter - def move_right(count=nil, ext=nil, unit=nil) - now.MoveRight(unit, count, ext) - end + # 移动到行首 + def home_key + now.HomeKey(5) + end - # 将厘米换算成磅 - def cent_to_point(int) - @word.CentimetersToPoints(int) - end + # 移动到行尾 + def end_key + now.EndKey(5) + end - end + # 移动到下一行 + def move_down + self.end_key + self.entry + end -# 只对内容服务 - class Text - - def initialize(selection, document) - # 现在所选项 - @selection = selection + # 右移 + # count 数值, 移动距离 + # ext 0or1 , 是否扩展 + # unit wdCharachter + def move_right(count=nil, ext=nil, unit=nil) + now.MoveRight(unit, count, ext) + end - # Document 类 - @document = document - end + # 将厘米换算成磅 + def cent_to_point(int) + @word.CentimetersToPoints(int) + end - # ActiveDocument - def doc_work - @document.doc_work - end + end - # ActiveDocument.Selecton - def now - @selection - end + # 只对内容服务 + class Text - # 调整字体 - def font - now.Font - end + def initialize(selection, document) + # 现在所选项 + @selection = selection - # 调整字体大小 - def size=(int) - self.font.Size = int - end + # Document 类 + @document = document + end - # 文本左对齐 - def left - now.ParagraphFormat.Alignment = 0 - end + # ActiveDocument + def doc_work + @document.doc_work + end - # 文本居中 - def center - now.ParagraphFormat.Alignment = 1 - end + # ActiveDocument.Selecton + def now + @selection + end - # 文本右对齐 - def right - now.ParagraphFormat.Alignment = 2 - end + # 调整字体 + def font + now.Font + end - # 两端对其 - def justify - now.ParagraphFormat.Alignment = 3 - end + # 调整字体大小 + def size=(int) + self.font.Size = int + end - # 回车 - def entry - @document.entry - end + # 文本左对齐 + def left + now.ParagraphFormat.Alignment = 0 + end - # 移动到下一行 - def move_down - @document.move_down - end + # 文本居中 + def center + now.ParagraphFormat.Alignment = 1 + end - # 写入元数据 - def print(str) - now.TypeText(str) - end + # 文本右对齐 + def right + now.ParagraphFormat.Alignment = 2 + end - # 写入数据,抬头Tab, 并且换行 - def puts(str) - now.TypeText("\t" + str) - self.entry - end + # 两端对其 + def justify + now.ParagraphFormat.Alignment = 3 + end - # 替换,并替换风格 - def replace(find, replace, style) - rep_opt = now.Find - rep_opt.ClearFormatting - rep_opt.Replacement.ClearFormatting - rep_opt.Replacement.Style = doc_work.Styles(style) - rep_opt.Text = find - rep_opt.Replacement.Text = replace - rep_opt.Forward = true - rep_opt.wrap = 1 # 到达开头或结尾时继续搜索 - rep_opt.Format = true - rep_opt.MatchCase = false - rep_opt.MatchWholeWord = false - rep_opt.MatchByte = true - rep_opt.MatchWildcards = false - rep_opt.MatchSoundsLike = false - rep_opt.MatchAllWordForms = false + # 回车 + def entry + @document.entry + end - rep_opt.Execute(nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,1) - end + # 移动到下一行 + def move_down + @document.move_down + end + # 写入元数据 + def print(str) + now.TypeText(str) + end - # 设置风格 - def style(name) - now.Style = @document.styles(name) - end + # 写入数据,抬头Tab, 并且换行 + def puts(str) + now.TypeText("\t" + str) + self.entry + end - # 按一个段设置风格和内容 - def section(style_name=nil) - self.style(style_name) unless style_name.nil? - res = yield - if res.kind_of? ::Array - res.join("\n") - end - print(res) - self.entry - end + # 替换,并替换风格 + def replace(find, replace, style) + rep_opt = now.Find + rep_opt.ClearFormatting + rep_opt.Replacement.ClearFormatting + rep_opt.Replacement.Style = doc_work.Styles(style) + rep_opt.Text = find + rep_opt.Replacement.Text = replace + rep_opt.Forward = true + rep_opt.wrap = 1 # 到达开头或结尾时继续搜索 + rep_opt.Format = true + rep_opt.MatchCase = false + rep_opt.MatchWholeWord = false + rep_opt.MatchByte = true + rep_opt.MatchWildcards = false + rep_opt.MatchSoundsLike = false + rep_opt.MatchAllWordForms = false - # 插入表格,并返回Table类 - def insert_table(row, col) - obj = @document.add_table(row, col) - Table.new(now, row, col, obj) - end + rep_opt.Execute(nil,nil,nil,nil,nil,nil,nil,nil,nil,nil,1) + end - # 插入表格 - def add_table(row, col, &block) - table = insert_table(row, col) - block.call(table) - - # 跳出表格 - now.MoveDown(5, 1) - end - # 通过已有的数组插入表格 - def add_table_by_value(tbl, &block) - row = tbl.size - col = tbl[0].size - table = insert_table(row, col) - block.call(table) - - # 保证在写入数据的时候在第一个单元格 - table.top - # 一维化数组 - table << tbl.flatten - # 跳出表格 - now.MoveDown(5, 1) - end + # 设置风格 + def style(name) + now.Style = @document.styles(name) + end - # 插入头部的图片 - def add_head_image(path) - self.first_line_indent = -2 - add_image(path) - picture_size(1.25) - self.entry - self.first_line_indent = 0 - end + # 按一个段设置风格和内容 + def section(style_name=nil) + self.style(style_name) unless style_name.nil? + res = yield + if res.kind_of? ::Array + res.join("\n") + end + print(res) + self.entry + end - # 插入图片 - def add_image(path) - now.InlineShapes.AddPicture(path, false, true) - end + # 插入表格,并返回Table类 + def insert_table(row, col) + obj = @document.add_table(row, col) + Table.new(now, row, col, obj) + end - # 修改首行缩进(厘米) - def first_line_indent=(cent) - now.ParagraphFormat.FirstLineIndent = @document.cent_to_point(cent) - end - - # 修改最近一个图片尺寸倍数 - def picture_size(int) - num = doc_work.InlineShapes.Count - pic = doc_work.InlineShapes(num) - pic.width *= int - end + # 插入表格 + def add_table(row, col, &block) + table = insert_table(row, col) + block.call(table) - # 插入一条横线 - def insert_line - - # 通过导入图片的方法 - path = File.join(BaseFile, "aio", "resource", "line.png") - self.add_image(path) - self.move_down - end + # 跳出表格 + now.MoveDown(5, 1) + end - # 绘制图表 - # 测试图表 - #tbl = [ - # ["a", "1"], - # ["b", "2"], - # ["c", "3"], - # ["d", "4"], - #] - #text.chart(tbl) do |chart| - # chart.title = "Name" - # chart.type = 5 - # #chart.axes_x = "year" - # #chart.axes_y = "value" - # chart.style = 251 - #end - def chart(tbl, &block) - begin - excel = ExcelWps::WorkBook.new - #excel.show - excel.display_alerts = false - worksheet = excel.add_worksheet("sheet") - tbl.each do |r| - worksheet.add_row { |row| row << r } - end + # 通过已有的数组插入表格 + def add_table_by_value(tbl, &block) + row = tbl.size + col = tbl[0].size + table = insert_table(row, col) + block.call(table) - # 获取结束的单元格 - col = tbl[0].size - end_cell = worksheet.current_row.cell_name(col - 1) + # 保证在写入数据的时候在第一个单元格 + table.top + # 一维化数组 + table << tbl.flatten + # 跳出表格 + now.MoveDown(5, 1) + end - worksheet.add_chart do |chart| - chart.source = worksheet.range("A1:#{end_cell}") - block.call(chart) - end - ensure - excel.close - end + # 插入头部的图片 + def add_head_image(path) + self.first_line_indent = -2 + add_image(path) + picture_size(1.25) + self.entry + self.first_line_indent = 0 + end - self.style("正文") - self.center - doc_work.Application.Selection.PasteAndFormat(13) + # 插入图片 + def add_image(path) + now.InlineShapes.AddPicture(path, false, true) + end - # 移动到下一行 - self.move_down - self.left - end + # 修改首行缩进(厘米) + def first_line_indent=(cent) + now.ParagraphFormat.FirstLineIndent = @document.cent_to_point(cent) + end - # 插入分页符 - def page_break - now.InsertBreak(7) - end + # 修改最近一个图片尺寸倍数 + def picture_size(int) + num = doc_work.InlineShapes.Count + pic = doc_work.InlineShapes(num) + pic.width *= int + end - alias :style= :style - end + # 插入一条横线 + def insert_line -# 表格 - class Table - def initialize(selection, row, col, obj) - @row = row - @col = col - @count = row * col - @selection = selection - @obj = obj - end + # 通过导入图片的方法 + path = File.join(BaseFile, "aio", "resource", "line.png") + self.add_image(path) + self.move_down + end - def now - @selection - end + # 绘制图表 + # 测试图表 + #tbl = [ + # ["a", "1"], + # ["b", "2"], + # ["c", "3"], + # ["d", "4"], + #] + #text.chart(tbl) do |chart| + # chart.title = "Name" + # chart.type = 5 + # #chart.axes_x = "year" + # #chart.axes_y = "value" + # chart.style = 251 + #end + def chart(tbl, &block) - # 合并列 - def merge_row - now.SelectRow - now.Cells.Merge - @count = @count - @row + 1 - end + # 当没有内容的时候,则不绘制 + return nil if tbl.empty? - # 放入数据 - def puts(str) - now.SelectCell - now.TypeText(str) - @count -= 1 - now.MoveRight(12) unless @count < 1 - end + begin + excel = ExcelWps::WorkBook.new + #excel.show + excel.display_alerts = false + worksheet = excel.add_worksheet("sheet") + tbl.each do |r| + worksheet.add_row { |row| row << r } + end - # 放入数据, 可以按数组放入 - def <<(arr) - case arr - when ::String - puts(arr) - when ::Array - arr.each { |a| puts(a) } - end - end + # 获取结束的单元格 + col = tbl[0].size + end_cell = worksheet.current_row.cell_name(col - 1) - # 设置行高 - def height=(point) - now.Rows.Height = point - end + worksheet.add_chart do |chart| + chart.source = worksheet.range("A1:#{end_cell}") + block.call(chart) + end + ensure + excel.close + end - # 设置风格 - def style=(sty) - select_all - now.Style = sty - end + self.style("正文") + self.center + doc_work.Application.Selection.PasteAndFormat(13) - # 设置列宽度 - def set_columns_width(col, point) - @obj.Columns(col).SetWidth(point, 2) - end + # 移动到下一行 + self.move_down + self.left + end - # 移动到第一个单元格 - def top - @obj.Cell(1,1).Select - end + # 插入分页符 + def page_break + now.InsertBreak(7) + end - # 居中 - def center - select_all - now.ParagraphFormat.Alignment = 1 - end + alias :style= :style + end - # 选择整个表格 - def select_all - @obj.Select - end + # 表格 + class Table + def initialize(selection, row, col, obj) + @row = row + @col = col + @count = row * col + @selection = selection + @obj = obj + end - # 网格线 - def border_line - select_all - now.Borders(-1).LineStyle = 1 - now.Borders(-2).LineStyle = 1 - now.Borders(-3).LineStyle = 1 - now.Borders(-4).LineStyle = 1 - now.Borders(-5).LineStyle = 1 - now.Borders(-6).LineStyle = 1 - end - end + def now + @selection + end -end + # 合并列 + def merge_row + now.SelectRow + now.Cells.Merge + @count = @count - @row + 1 + end + + # 放入数据 + def puts(str) + now.SelectCell + now.TypeText(str) + @count -= 1 + now.MoveRight(12) unless @count < 1 + end + + # 放入数据, 可以按数组放入 + def <<(arr) + case arr + when ::String + puts(arr) + when ::Array + arr.each { |a| puts(a) } + end + end + + # 设置行高 + def height=(point) + now.Rows.Height = point + end + + # 设置风格 + def style=(sty) + select_all + now.Style = sty + end + + # 设置列宽度 + def set_columns_width(col, point) + @obj.Columns(col).SetWidth(point, 2) + end + + # 移动到第一个单元格 + def top + @obj.Cell(1,1).Select + end + + # 居中 + def center + select_all + now.ParagraphFormat.Alignment = 1 + end + + # 选择整个表格 + def select_all + @obj.Select + end + + # 网格线 + def border_line + select_all + now.Borders(-1).LineStyle = 1 + now.Borders(-2).LineStyle = 1 + now.Borders(-3).LineStyle = 1 + now.Borders(-4).LineStyle = 1 + now.Borders(-5).LineStyle = 1 + now.Borders(-6).LineStyle = 1 + end + end + + end end