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. Codeforces1036F Relatively Prime Powers 【容斥原理】

    题目分析: 这种题目标题写莫比乌斯反演会不会显得太恐怖了,那就容斥算了. gcd不为1的肯定可以开根.所以把根式结果算出来就行了. 辣鸡题目卡我精度. 代码: #include<bits/std ...

  2. 解决sublime text3 中文字符乱码

    前言 由于系统编码问题导致的中文乱码解决,linux和windows解决方式都一样. 流程 linux下两步都需要,windows下只需要第二步. 1.在package install中搜索安装:co ...

  3. SpringMVC 拦截器使用说明

    spring-content.xml <!-- 配置用于session验证的拦截器 --> <!-- 如果有多个拦截器满足拦截处理的要求,则依据配置的先后顺序来执行 --> & ...

  4. 三天STL与pbds(平板电视)

    19.02.11 ~ 19.02.13 hjmmm要专攻STL辣 先列一下大纲? 第一天:各种基础容器 第二天:实现平衡树和平板电视pbds 第三天:非变异算法和变异算法 那么我们就开始吧! Day1 ...

  5. PKUWC2019 凉凉记

    请配合 BGM 食用. 菜就是菜,说什么都是借口. Day 0 前一天先到纪中报道,高铁上打了一会单机膈膜,然后又打了一遍 \(FFT\) 板子,就到了中山. 到了后,发现气温骤然升高,马上 脱 换裤 ...

  6. Write less code

    If you find yourself writing a lot of code to do something simple, you're probably doing it wrong. A ...

  7. Nowcoder | [题解-N210]牛客OI月赛2-提高组

    比赛连接戳这里^_^ 我才不会说这是我出的题(逃) 周赛题解\((2018.10.14)\) \(T1\) \(25\sim50\)分做法\(:\)直接爆搜 作为一个良心仁慈又可爱的出题人当然\(T1 ...

  8. 「SCOI2016」背单词 解题报告

    「SCOI2016」背单词 出题人sb 题意有毒 大概是告诉你,你给一堆n个单词安排顺序 如果当前位置为x 当前单词的后缀没在这堆单词出现过,代价x 这里的后缀是原意,但不算自己,举个例子比如abc的 ...

  9. HR_Array Manipulation

    第一版有7个时间超限,优化成了第二版: 1: #!/bin/python3 import math import os import random import re import sys # Com ...

  10. javascript之复习(框架里的方法们)

    继上次整理,一些东西没有整理完.就写在这.可能比较乱比较杂,因为都是整理的一些东西,也没有到做成专题的程度. 1.String.repeat() 大家要实现重复一个字符串的重复怎么写呢,反正我的第一想 ...