zoukankan      html  css  js  c++  java
  • ruby读取exce文件,使用roo---Gem

    module SEquipsHelper
        #设备台账,从excel文件读取信息
        require 'roo'
        #require 'roo-xls'
    
        #读取excel文件
        # SEquipsHelper.read_excel
        def self.read_excel(path)
            #path = 'http://172.168.10.7:6060/file/102.xlsx'
            #xlsx = Roo::Spreadsheet.open('/Users/h/Documents/rubyProject/新版本文案.xls',extension: :xls) 
    
            # if type == 'xlsx'
            # end
    
            xlsx = Roo::Spreadsheet.open(path, extension: :xlsx) 
    
            # if type == 'xls'  #exce中日期类型 不能自动转化
            #     xlsx = Roo::Spreadsheet.open(path, extension: :xls) 
            # end
            
            #sheets = xlsx.sheets   #返回所有的工作表名 
            # cell = xlsx.sheet(0).cell('C',1)  #取第一个工作表的C1
            # cell2 = xlsx.sheet(0).cell('D',2)
    
            cols = ['B','C','D','E','F','G','H','I','J','K','L','M','N']
            ods = xlsx.sheet(0)  #定义默认第一个表
            #n1 = ods.first_column  #第一列数
            #n1 = ods.last_column  #最后一列数
            #n1 = ods.first_row    #第一行数
    
            n2 = ods.last_row   #最后一行数
            rows = n2 -2
            Rails.logger.info "-----------总行数---#{n2}-----"
            Rails.logger.info "-----------有效数据行数---#{rows}-----"
    
            @excel_datas =[]   #存所有行的数据
            rows.times do |r|  #行数
                row_data=[]  #存每行的数据
                cols.each do |c|
                    c1 = xlsx.sheet(0).cell(c, r+3)
                    Rails.logger.info "---------第#{r+3}行,第#{c}列---#{c1}-----"
                    row_data.push(c1)
                end
                @excel_datas.push(row_data)
            end
    
            @excel_datas.each do |e|
                #将区域转为 id
                area_name = e[12]
                area = SArea.find_by(:name => area_name)
                s_area_id = area.present? ? area.id : ''
                e[12] = s_area_id
    
                e.push(Time.now)  #添加 时间
                e.push(Time.now)
                e.push(1)        # 设备状态 equip_status  1 启用
            end
    
            return @excel_datas
        end
    
        #保存excel到数据库
        # SEquipsHelper.save_excel
        def self.save_excel(excel_datas)
            Rails.logger.info "---save_data----#{excel_datas}---"
    
            # SEquip.bulk_insert(:bit_code,
            #                  :equip_code,
            #                  :equip_name,
            #                  :equip_location,
            #                  :equip_norm,
            #                  :equip_nature,
            #                  :equip_material,
            #                  :equip_num,
            #                  :apper_code,
            #                  :apper_time,
            #                  :factory,
            #                  :equip_note,
            #                  :s_area_id,
            #                  :created_at, 
            #                  :updated_at,
            #                  :equip_status,
            #                  :s_region_code_id,
            #                  :region_name,
            #                  update_duplicates: true
            #                  ) do |worker|
            #     excel_datas.each do |attrs|
            #       Rails.logger.info "导入台账信息----#{attrs}"
            #       worker.add(attrs)
            #     end
            #   end
    
              destination_columns = [:bit_code,
                                    :equip_code,
                                    :equip_name,
                                    :equip_location,
                                    :equip_norm,
                                    :equip_nature,
                                    :equip_material,
                                    :equip_num,
                                    :apper_code,
                                    :apper_time,
                                    :factory,
                                    :equip_note,
                                    :s_area_id,
                                    :created_at, 
                                    :updated_at,
                                    :equip_status,
                                    :s_region_code_id,
                                    :region_name]
                                    
    
                SEquip.bulk_insert(*destination_columns, update_duplicates: true) do |worker|
                excel_datas.each do |attrs|
                          Rails.logger.info "导入台账信息----#{attrs}"
                          worker.add(attrs)
                end
            end
        end
    
        # SEquipsHelper.save
        # def self.save
        #     hash = [
        #             {:bit_code => 'L-FJ0101', :equip_code => 'GJSW12-08-005',:equip_name => '龙门吊(东)' },
        #             {:bit_code => 'L-FJ0102', :equip_code => 'GJSW12-08-005',:equip_name => '附防爆电机' }
        #           ]
    
        #     SEquip.bulk_insert(update_duplicates: true) do |worker|
        #         hash.each do |attrs|
        #                 Rails.logger.info "导入台账信息----#{attrs}"
        #                 worker.add(attrs)
        #         end
        #     end
    
        # end
    
    
    
    
    end
    

      调用:

     #从excel导入台账信息
      # post  s_equips/excel_import
      def excel_import
        s_region_code_id = params[:s_region_code_id]
        excel = params[:excel]
        filename = excel.original_filename
    
        Rails.logger.info "----------filename------#{filename}-------"
        names = filename.split(".")
        file_type = names[1]
    
        if file_type == 'xlsx'
          region_code = SRegionCode.find_by(:id => s_region_code_id)
          region_name = region_code.present? ? region_code.region_name : ''
          @excel_datas = SEquipsHelper.read_excel(excel)  #从excel读取信息
          @excel_datas.each do |e|
            e.push(s_region_code_id.to_i)
            e.push(region_name)
          end
          SEquipsHelper.save_excel(@excel_datas)  #保存读取到的信息
          render json: {status: 200}
        # else
        #   render json: {status: '请选择.xlsx文件'}
        end
      end
    

      

  • 相关阅读:
    通用的web系统数据导出功能设计实现(导出excel2003/2007 word pdf zip等)
    DALSA Coreco
    环境变量之执行文件路径的变量PATH
    命令与文件的查询
    软件开发工具GCC
    权限与命令之间的关系
    Linux防火墙
    网络管理
    分区及格式化
    VMware Workstation的网络连接方式:NAT、桥接和Host Only
  • 原文地址:https://www.cnblogs.com/lmg-jie/p/9211879.html
Copyright © 2011-2022 走看看