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

我一直在试图写一些代码遍历每个excel文件在一个目录中,并将excel工作簿转换为单个工作表到CSV文件。 我对Ruby和编程都很陌生,所以我不知道我的解决scheme是否是最好的方法。 我遇到的问题是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 

我已经得到一个showstopper问题使用EXCEL通过win32ole与Ruby 1.9.3 / WATIR经典:我得到一个间歇性的安全错误 – “Watir :: Exception :: FrameAccessDeniedException IE不会允许访问此框架出于安全原因。用browser.goto(frame.src)“来解决这个问题。

这种情况经常发生,但并不是所有的时间都是Internet Explorer 10下的IFRAME JavaScript链接。如果我将页面URL分配给受信任的站点列表,我发现一个解决方法可以消除这个问题。 但是因为我不得不取消勾选HTTPS:checkbox来允许使用HTTP:URL,所以这是不可接受的安全措施,我的手腕几乎被打了一巴掌。

我们的架构师说,如果确实是一个安全错误,它应该是一致的。 他进行了一些testing,让他相信问题不在于安全性,而在于使用EXCEL和一些相关的过程:他淘汰了EXCEL,我使用它来传递不同的UserID和密码给Watir脚本。 一旦他消除了EXCEL的图片,错误不再发生。 以下是他如何做到的:他在一个batch file中反复运行脚本的第一次迭代,该文件点击相关的帧/链接的次数与EXCEL表的驱动次数相同,问题不再发生。 现在我不得不在win32ole旁边另外使用EXCEL,或者去使用.CSV文件,这是我真的不期待的,因为我忘了我正在计算多less个逗号。

解决您的问题的一个解决scheme是原始的,那就是将EXCEL数据手动复制并粘贴到.CSV表中。

另一种可能性是一位同事的build议:通过“Ruby Gem Spreadsheet”使用EXCEL。 她正在使用,并没有任何问题,虽然我敢肯定,她不使用.NET C#编写的网页上的JavaScript超链接IFRAMES。 她的应用程序是用JAVA编写的。 但我会考虑这个选项。

Dir.foreach遍历目录条目,不完全是文件。 这意味着,它返回这样的条目. (这个目录)和.. (父目录)等等。 这就是你得到的:你的下一个nextFile.

快速解决的最好方法是可能从Dir.foreach切换到Dir.globDir[] 。 那就是replace

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