rubyXL(Errno :: ENOENT)

我在使用rubyXL构build的抓取工具遇到问题。 它正确遍历我的文件系统,但我收到(Errno::ENOENT)错误。 我已经检查出所有的rubyXL代码,一切似乎检查出来。 我的代码附在下面 – 任何build议?

 /Users/.../testdata.xlsx /Users/.../moretestdata.xlsx /Users/.../Lab 1 Data.xlsx /Users/Dylan/.rvm/gems/ruby-1.9.3-p327/gems/rubyXL-1.2.10/lib/rubyXL/parser.rb:404:in `initialize': No such file or directory - /Users/Dylan/.../sheet6.xml (Errno::ENOENT) from /Users/Dylan/.rvm/gems/ruby-1.9.3-p327/gems/rubyXL-1.2.10/lib/rubyXL/parser.rb:404:in `open' from /Users/Dylan/.rvm/gems/ruby-1.9.3-p327/gems/rubyXL-1.2.10/lib/rubyXL/parser.rb:404:in `block in decompress' from /Users/Dylan/.rvm/gems/ruby-1.9.3-p327/gems/rubyXL-1.2.10/lib/rubyXL/parser.rb:402:in `upto' from /Users/Dylan/.rvm/gems/ruby-1.9.3-p327/gems/rubyXL-1.2.10/lib/rubyXL/parser.rb:402:in `decompress' from /Users/Dylan/.rvm/gems/ruby-1.9.3-p327/gems/rubyXL-1.2.10/lib/rubyXL/parser.rb:47:in `parse' from xlcrawler.rb:9:in `block in xlcrawler' from /Users/Dylan/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/find.rb:41:in `block in find' from /Users/Dylan/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/find.rb:40:in `catch' from /Users/Dylan/.rvm/rubies/ruby-1.9.3-p327/lib/ruby/1.9.1/find.rb:40:in `find' from xlcrawler.rb:6:in `xlcrawler' from xlcrawler.rb:22:in `<main>' 

 require 'find' require 'rubyXL' def xlcrawler(path) count = 0 Find.find(path) do |file| # begin iteration of each file of a specified directory if file =~ /\b.xlsx$\b/ # check if a given file is xlsx format puts file # ensure crawler is traversing the file system workbook = RubyXL::Parser.parse(file).worksheets # creates an object containing all worksheets of an excel workbook workbook.each do |worksheet| # begin iteration over each worksheet data = worksheet.extract_data.to_s # extract data of a given worksheet - must be converted to a string in order to match a regex if data =~ /regex/ puts file count += 1 end end end end puts "#{count} files were found" end xlcrawler('/Users/') 

我做了一些挖掘github上的rubyXL代码,它看起来像解压缩方法中的错误。

  files['styles'] = Nokogiri::XML.parse(File.open(File.join(dir_path,'xl','styles.xml'),'r')) @num_sheets = files['workbook'].css('sheets').children.size @num_sheets = Integer(@num_sheets) #adds all worksheet xml files to files hash i=1 1.upto(@num_sheets) do filename = 'sheet'+i.to_s # <----- BUG IS HERE files[i] = Nokogiri::XML.parse(File.open(File.join(dir_path,'xl','worksheets',filename+'.xml'),'r')) i=i+1 end 

这段代码在excel中假设了关于表单编号,这是不正确的。 这个代码只是计算纸张的数量,并以数字分配。 但是,如果您删除工作表,则会创build一个新工作表,数字顺序被破坏。

如果你检查你的Lab Data 1.xlsx文件,你会看到没有sheet6,如果你拉起vba开发者窗口(按alt + F11),你应该看到类似

工作表清单

正如你所看到的,这个安排将打败for循环,并且当i = 6时会引起exception。