2013-01-05 88 views
3

我在使用rubyXL構建的爬蟲中遇到問題。它正確地遍歷我的文件系統,但我收到一個(Errno::ENOENT)錯誤。我已經檢查了所有rubyXL代碼,並且所有內容都顯示出來。我的代碼附在下面 - 任何建議?ruby​​XL(Errno :: ENOENT)

/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/') 
+0

實驗1 Data.xlsx似乎有問題,我可能冒險猜測sheet6被隱藏或保護或可能以某種方式重命名,因此不會正在由'.worksheets'處理。 – Pynner

+0

@Pynner好點噸。該文件實際上位於我的郵件目錄中 - 只是一堆數字和圖形。但是,我沒有仔細檢查工作表,沒有任何隱藏或保護。 – Anconia

回答

2

我做了一些通過挖掘在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中的表單編號做了一個假設,這是不正確的。此代碼只是計算工作表的數量,並將其數字分配。但是,如果您刪除工作表,然後創建一個新工作表,數字順序就會被破壞。

如果您檢查Lab Data 1.xlsx文件,你會看到有一個,如果你拉起VBA開發窗口沒有sheet6(按ALT + F11),你應該看到類似

sheet list

,你可以看到這種安排將打敗for循環,並導致i = 6時出現異常。

+0

我無法感謝你的洞察力!你死了 - 我的excel文件中沒有任何工作表6。我在github上創建了一個問題;現在要修理該死的東西:) – Anconia

相關問題