【问题标题】:Iterate through every excel file in one directory, convert individual sheets to CSV files遍历一个目录中的每个 excel 文件,将单个工作表转换为 CSV 文件
【发布时间】:2014-06-16 09:56:11
【问题描述】:

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

【问题讨论】:

  • 很难回答“一大堆问题”,您应该提供实际的堆栈跟踪(您可以将其添加到您的问题中)。毕竟这 StackOverflow,所以您应该向我们提供有关您的问题的准确信息。 P.S.:请务必提供您的脚本的实际调用(即完整的命令行)。

标签: ruby excel csv


【解决方案1】:

我在 Ruby 1.9.3/WATIR Classic 中通过 win32ole 使用 EXCEL 时遇到了一个大问题:我收到间歇性安全错误 - “Watir::Exception::FrameAccessDeniedException IE 出于安全原因将不允许访问此框架. 您可以使用 browser.goto(frame.src)" 解决这个问题。

这种情况经常发生,但并非总是发生,是 Internet Explorer 10 下的 IFRAME JavaScript 链接。我找到了一种解决方法,如果我将页面 URL 分配给受信任的站点列表,则可以消除该问题。但是因为我不得不取消选中 HTTPS: 复选框以允许 HTTP: URL,这是不可接受的安全做法,我的手腕几乎被打了一巴掌。

我们的架构师说,如果它真的是一个安全错误,它应该是一致的。他进行了测试,使他确信问题不在于安全性,而在于使用 EXCEL 和一些相关过程:他消除了 EXCEL,我用它来将不同的用户 ID 和密码传递给 Watir 脚本。一旦他从图片中删除了EXCEL,错误就不再发生了。他是这样做的:他在一个批处理文件中一遍又一遍地运行脚本的第一次迭代,该文件单击有问题的框架/链接的次数与 EXCEL 表驱动它的次数相同,并且问题不再发生。现在我必须在 win32ole 之外以其他方式使用 EXCEL,或者使用 .CSV 文件,我不太期待,因为我不知道我在数多少个逗号。

解决您的问题的一个方法是手动将 EXCEL 数据复制并粘贴到 .CSV 表中。

另一种可能性是来自同事的建议:通过“Ruby Gem 电子表格”使用 EXCEL。她正在使用它并且没有遇到任何问题,尽管我很确定她没有在用 .NET C# 编写的网页上使用带有 JavaScript 超链接的 IFRAMES。她的应用程序是用 JAVA 编写的。但我会考虑这个选项。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-31
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      相关资源
      最近更新 更多