Ruby1.9.2之——关联Excel

来源:互联网 发布:淘宝苹果专卖店 编辑:程序博客网 时间:2024/06/01 07:33

这算是一个通用模块吧,excel.rb

    require 'win32ole'   // 引用gem

    module Excel  //模块名字
        class WorkBook   //类名, 工作薄
            #xlEdge  
            #xlEdgeBottom =9   
            #xlEdgeLeft  = 7   
            #xlEdgeRight = 10   
            #xlEdgeTop  = 8   
            #xlColor  
            #xlColorBlank = 1  
            #xlColorWhite =2  
            #xlColorRed = 3  
            #xlColorGreen =10  
            #xlColorBlue =5  
            #xlColorYellow =6  
            #xlColorPurple = 7 # zi se  
            #xlColorCyan =8 #qing se  
            #xlBgColorYellow =19  
            #xlBgColorCyan =20  
            #xlBgColorPurple =24  
            #xlDefaultLineStyle = 1   
            @@worksheets_name =[] 
            def initialize(encoding="GB2312") //初始化,设置编码
                @excel = WIN32OLE.new("excel.application")  
                @excel.visible = FALSE  
                @workbook = @excel.Workbooks.Add()  
                #@style_id   = 0  
                @encoding = encoding  
                create_style  
            end  
            def add_worksheet(name)  //添加worksheet, 如果重名,则名字后面加1
                while @@worksheets_name.include?(name)  
                    name +="1"  
                end  
                @@worksheets_name << name  //将worksheet name存放在数组worksheets_name中。
                worksheet = @workbook.Worksheets.Add()  
                worksheet.Activate  
                worksheet.name = name  
                return WorkSheet.new(worksheet)  
            end  
            def show  //显示表格
                @excel.visible = TRUE  
            end  
            def save(name)  //保存表格
                @workbook.save("#{name}")
 
            end
            def saveas(name)  //另存为表格
                @workbook.saveas("#{name}")
             
            end
            def close  //关闭表格
                @workbook.Close(0)  
                @excel.Quit()  
            end  
            def create_style  //创建样式
                sty=@workbook.Styles.Add('NormalStyle')  
                sty.Font.Size = 12  
                sty.Borders(7).LineStyle=1  
                sty.Borders(8).LineStyle=1  
                sty.Borders(9).LineStyle=1  
                sty.Borders(10).LineStyle=1  
      
                sty=@workbook.Styles.Add('TitleStyle')  
                sty.Font.Size = 16  
                sty.Font.Bold =true  
                sty.Font.ColorIndex =3  
                #sty.Interior.ColorIndex = 20  
            end  
        end  
        #worksheet  
        class WorkSheet  //工作页
            IMAGE_ROW_NUM = 56  
            @@worksheets_name =[]  
            def initialize(worksheet)  
                @row_count = 1  
                @worksheet = worksheet  
            end  
            def add_space_line(n=1)  //添加行
                return if n<1  
                @row_count +=n  
            end  
            def add_title(name)  //添加title
                add_space_line  
                add_row.add_cell(name,false,"TitleStyle")  
            end  
            def add_row()  //添加列
                @current_row = Row.new(@worksheet,@row_count)  
                @row_count +=1  
                return  @current_row  
            end  
            def current_row  //返回当前行
                return  @current_row  
            end  
            def add_image(image_path)  //添加图片
                if not File.exist?(image_path)  
                    return  
                end  
                add_space_line 1  
                add_row  
                cell_name=current_row.first_cell  
                @worksheet.Range(cell_name).Select  
                @worksheet.Pictures.Insert(image_path)  
                add_space_line  IMAGE_ROW_NUM  
            end  
        end  
        #row  
        class Row  //列
            FILL_TYPE = 4  
            @@cell_map =["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]  
            def initialize(worksheet,row_id)  
                @row_id     =row_id  
                @cell_count=0  
                @worksheet = worksheet  
            end  
            def curent_cell  
                return  cell_name(@cell_count)  
            end  
            def first_cell  
                return cell_name(0)  
            end  
            def add_cell(value,auto_fit = false,style = "NormalStyle") 
                range = @worksheet.Range(cell_name(@cell_count))  
                range.Value = value.to_s;  
                range.Style=style  
                range.Columns.AutoFit if auto_fit  
                @cell_count +=1  
            end  
            def cell_name(index)
                second = index % 26  
                first = (index - second) / 26  
                if first == 0  
                    return @@cell_map[second]+@row_id.to_s    
                end  
                first -=1  
                return @@cell_map[first]+@@cell_map[second]+@row_id.to_s  
            end  
            def set_cell(index,value,auto_fit = false,style = "NormalStyle")  
                range=@worksheet.Range(cell_name(index))  
                range['Value'] = value;  
                range['Style']=style  
                range.Columns.AutoFit if auto_fit         
            end  
        end  

    end 

excel_test.rb

    require './excel'  
    excel = Excel::WorkBook.new  
    worksheet = excel.add_worksheet("joe")  
    worksheet.add_title('title')
    row = worksheet.add_row  
    row.add_cell("myaniu")  
    row.add_cell(0)  
    row.add_cell("2011-01-01 01:01:01")  
    
    worksheet = excel.add_worksheet("Lix")  
    worksheet.add_title('first')
    row = worksheet.add_row  
    row.add_cell("shangshu")  
    row.add_cell(0)  
    row.add_cell("2011-01-01 01:01:01")
 
    excel.saveas("test_excel.xls")
        
    excel.close


PS: 其中一部分参考