我一直试图编写一些代码来迭代一个目录中的每个excel文件,并将excel工作簿转换为单个工作表到CSV文件。我对ruby和编码都很陌生,所以我不知道我的解决方案是否是最好的方法。我遇到的问题是Dir.foreach似乎没有正确迭代,而是返回" C:\ gernericfolder \。"这会导致下一个win32ole代码块出现一大堆问题。
这是我的代码:
require 'rubygems'
require 'iconv'
require 'win32ole'
require 'csv'
require 'roo'
begin
puts("=================================================================================================================================")
inputFolder = ARGV[0]
outputFolder = ARGV[1]
#Check if the file actually exists + UI Feedback
if File.exists?(inputFolder) == false
puts("IGM: DIRECTORY NOT FOUND. Please check your path exists\n")
Process.exit
end
Dir.foreach(inputFolder) { |nextFile|
#Form the file path and open the file
filePath = "#{inputFolder}\\#{nextFile}"
puts("Next file = #{filePath}")
xl = WIN32OLE.new('excel.application')
book = xl.workbooks.open(filePath)
xl.displayalerts = false
end
end
答案 0 :(得分:1)
我使用EXCEL通过win32ole使用Ruby 1.9.3 / WATIR Classic获得了一个showstopper问题:我得到间歇性安全错误 - “Watir :: Exception :: FrameAccessDeniedException IE出于安全原因不允许访问此框架你可以用browser.goto(frame.src)解决这个问题。“
这种情况经常发生的控件,但不是所有时间,都是Internet Explorer 10下的IFRAME JavaScript链接。如果我将页面URL分配给可信站点列表,我找到了解决问题的方法。但是因为我不得不取消选中HTTPS:复选框以允许HTTP:URL,这是不可接受的安全措施,而且我的手腕几乎被拍了。
我们的架构师说,如果它确实是一个安全错误,它应该是一致的。他运行的测试使他确信问题不在于安全性,而在于使用EXCEL和一些相关的过程:他删除了EXCEL,我用它来将不同的UserID和密码传递给Watir脚本。一旦他从图片中删除了EXCEL,错误就不再发生了。以下是他如何做到这一点:他在一个批处理文件中反复运行脚本的第一次迭代,该文件点击了相关框架/链接的次数与EXCEL表驱动它的次数相同,问题不再发生。现在我必须在win32ole旁边使用EXCEL,或者去使用.CSV文件,我并不真正期待,因为我忘记了我正在计算多少逗号。
您的问题的一个解决方案,无论多么原始,都是手动将EXCEL数据复制并粘贴到.CSV表中。
另一种可能性是同事的建议:通过“Ruby Gem电子表格”使用EXCEL。她正在使用它,并没有任何问题,虽然我很确定她没有在.NET C#编写的网页上使用带有JavaScript超链接的IFRAMES。她的应用程序是用JAVA编写的。但我会研究这个选项。
答案 1 :(得分:0)
Dir.foreach
遍历目录条目,而不是文件。这意味着,它返回.
(此目录)和..
(父目录)等条目。这就是你得到的:nextFile
是.
。
快速解决的最佳方法是从Dir.foreach
切换到Dir.glob
或Dir[]
。也就是说,替换
Dir.foreach(inputFolder) { |nextFile|
#Form the file path and open the file
filePath = "#{inputFolder}\\#{nextFile}"
puts("Next file = #{filePath}")
与
Dir.glob(inputFolder+'\**') { |filePath|
puts("Next file = #{filePath}")