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

  

ruby读取exce文件,使用roo---Gem的更多相关文章

  1. Ruby 读取文件

    Ruby 读取文件 一次全读出来 textAll = File.read("fileName.txt") puts textAll 一次读取一行 file = File.open( ...

  2. C# conn.open() 外部表不是预期的格式( 读取EXCEL文件出错)

    环境:win7+iis7+Office2007 在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一 ...

  3. LitJson(读Exce文件写入到json文件):

    读Exce文件写入到json文件汇总: //命名空间 using System.Collections; using System.Collections.Generic; using System. ...

  4. Unity3D移动平台动态读取外部文件全解析

    前言: 一直有个想法,就是把工作中遇到的坑通过自己的深挖,总结成一套相同问题的解决方案供各位同行拍砖探讨.眼瞅着2015年第一个工作日就要来到了,小匹夫也休息的差不多了,寻思着也该写点东西活动活动大脑 ...

  5. python读取caffemodel文件

    caffemodel是二进制的protobuf文件,利用protobuf的python接口可以读取它,解析出需要的内容 不少算法都是用预训练模型在自己数据上微调,即加载"caffemodel ...

  6. informatica读取FTP文件

    以下为一个完整的informatica读取ftp文件,并导入到系统中. 第一步: 通过shell脚本下载压缩包文件 /server/infa_shared/crm_prod/shell/ftpFrom ...

  7. Java读取word文件,字体,颜色

    在Android读取Word文件时,在网上查看时可以用tm-extractors,但好像没有提到怎么读取Word文档中字体的颜色,字体,上下标等相关的属性.但由于需要,要把doc文档中的内容(字体,下 ...

  8. 五种方式让你在java中读取properties文件内容不再是难题

    一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...

  9. Javascript写入txt和读取txt文件的方法

    文章主要介绍了Javascript写入txt和读取txt文件的方法,需要的朋友可以参考下1. 写入 FileSystemObject可以将文件翻译成文件流. 第一步: 例: 复制代码 代码如下: Va ...

随机推荐

  1. Codeforces997C Sky Full of Stars 【FMT】【组合数】

    题目大意: 一个$n*n$的格子,每个格子由你填色,有三种允许填色的方法,问有一行或者一列相同的方案数. 题目分析: 标题的FMT是我吓人用的. 一行或一列的问题不好解决,转成它的反面,没有一行和一列 ...

  2. 手机Web 开发中图片img 如何等比例缩放

    如果图片本身没有设置 width.height属性的话,只需要修改 max-width:100%; 就可以了 如果图片本身设置了 width.height属性的话,需要同时修改width 和heigh ...

  3. python学习日记(python2/3区别补充,is / id/ encode str,bytes)

    python2和python3区别 print python2中,print 是语句 :用法 ---->print '***' python3中,print 是函数:用法----->pri ...

  4. Shell基础 - Bash基础功能

    历史命令 history选项: -c 清空历史命令 -w 立即保存历史命令Linux 下输入过的历史命令,都会保存在根目录下的:~/root/.bash_history 文件中默认保存 1000 条, ...

  5. HihoCoder 1511: 树的方差(prufer序)

    题意 对于一棵 \(n\) 个点的带标号无根树,设 \(d[i]\) 为点 \(i\) 的度数,定义一棵树的方差为数组 \(d[1..n]\) 的方差. 给定 \(n\) ,求所有带标号的 \(n\) ...

  6. 「SCOI2015」小凸想跑步 解题报告

    「SCOI2015」小凸想跑步 最开始以为和多边形的重心有关,后来发现多边形的重心没啥好玩的性质 实际上你把面积小于的不等式列出来,发现是一次的,那么就可以半平面交了 Code: #include & ...

  7. [FJOI2016]神秘数(脑洞+可持久化)

    题目描述 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13}, 1 = 1 2 = 1+1 3 = 1+1+1 4 = 4 5 = 4+1 6 = ...

  8. 【docker】docker安装和使用

    一.docker简介: docker是容器技术的一个代表,而容器技术是将程序打包和隔离的一种技术,其实它并不是一个新技术,之前在linux内核中早已存在,真正被大众所用所了解是因为docker的出现. ...

  9. surface pro app

    fresh paintpotplayer acg播放器 http://potplayer.daum.net/?lang=zh_CNnebo==oneNoteGesture Sign xodo pdf ...

  10. A1141. PAT Ranking of Institutions

    After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...