Rails 读取 EXCEL 问题

zerolin · 2013年06月19日 · 最后由 zerolin 回复于 2013年06月20日 · 4495 次阅读

小弟在一个 ACTION 里面加了一段读取 EXCEL 的代码如下 require 'win32ole'

WIN32OLE.codepage = WIN32OLE::CP_UTF8 excel = WIN32OLE::new('EXCEL.APPLICATION') workbook = excel.Workbooks.Open('E:/lib/deploy.xlsx') worksheet = workbook.Worksheets(1) worksheet.Select …… workbook.close excel.Quit 省略号部分是是读取 EXCEL 中的内容。 问题是,发送请求之后只能显示一次,之后再刷新就报如下错误: WIN32OLERuntimeError in InstancesController#read_deploy

failed to create WIN32OLE object from `EXCEL.APPLICATION' HRESULT error code:0x800401f0 CoInitialize has not been called.

请问是怎么回事,如何解决

要先装 office

建议换个方案:https://github.com/Empact/roo 不需要装 office, 甚至不需要在 windows 上运行。

#1 楼 @luikore office 有的,我单单用一个读取 EXCEL 的 ruby 脚本是可以读 EXCEL 的

#3 楼 @zerolin action 长什么样子?excel.Quit 是在 action 里调用的?

#4 楼 @luikore def read_deploy

require 'win32ole' Thread.new do WIN32OLE.codepage = WIN32OLE::CP_UTF8 excel = WIN32OLE::new('EXCEL.APPLICATION') workbook = excel.Workbooks.Open('E:/lib/deploy.xlsx') worksheet = workbook.Worksheets(1) worksheet.Select

end_row_line = workbook.Worksheets(1).UsedRange.rows.Count

@col = Array.new @ip = Array.new @user = Array.new i = 0 line = 1 while i < 6 && line <= end_row_line if worksheet.Range("A#{line}").value == 'commom' @col[i] = line i += 1 end line += 1 end @col.each do |c| @ip << worksheet.Range("A#{c-1}").value.split("/")[0] @user << worksheet.Range("A#{c-1}").value.split("/")[1] end

workbook.close excel.Quit

end end

#4 楼 @luikore 中间一坨就是根据一些规则读取一些内容,第一次调用这个 ACTION 可以返回 EXCEL 中的内容,再次刷新就报错,后来我在外面加了个 Tread.new,就像前面的代码,再次刷新就会报实例变量为空的错误了,不知道为什么,我想这点信息应该可以定位错误了

#2 楼 @5long 谢谢,明天试试看你提供的方法

刚才去翻阅了一下夜鸣猪的博客,看到他操作 excel 的是

excel = WIN32OLE.new('Excel.Application')

# 省略步骤

excel.ActiveWorkbook.Close(0);  
excel.Quit(); 

不知道这样能不能解决问题

PS:不知道有哪位前辈知道该博主的情况?(很久以前就看到他写有关 ruby 跟 ruby on rails 方面的东西了)

大概是开发模式 reloader 的问题,你可以把 require 'win32ole' 放到 config/application.rb 的最后一行试试。

Thread.new 是另外一个问题了,起了新线程,方法结束时线程还没跑完,所以实例变量不存在很正常。

看来还得貌似换方法了

#2 楼 @5long 非常感谢你提供的方案,非常好!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号