遍历一个目录中的每个excel文件,将单个工作表转换为CSV文件

时间:2014-06-16 09:56:11

标签: ruby excel csv

我一直试图编写一些代码来迭代一个目录中的每个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

2 个答案:

答案 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.globDir[]。也就是说,替换

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}")