You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Ruby从XLSX文件中提取图片?多款Gem尝试均失败

解决XLSX文件图片提取返回nil/无内容的问题

方法1:直接读取XLSX内部媒体文件(最可靠)

XLSX本质是压缩包,所有图片都存在xl/media目录下,直接解压提取即可,无需依赖解析Gem:

require 'rubyzip'

def extract_xlsx_images(xlsx_path, output_dir)
  Dir.mkdir(output_dir) unless Dir.exist?(output_dir)
  Zip::File.open(xlsx_path) do |zip_file|
    zip_file.glob('xl/media/*').each do |entry|
      entry.extract(File.join(output_dir, entry.name)) unless File.exist?(File.join(output_dir, entry.name))
    end
  end
end

# 调用示例
extract_xlsx_images('你的文件.xlsx', '提取的图片')

方法2:修正Roo的使用姿势

别直接访问单元格拿图片,用Roo自带的images方法遍历工作表的所有图片:

require 'roo'

xlsx = Roo::Excelx.new('你的文件.xlsx')
xlsx.sheets.each do |sheet_name|
  sheet = xlsx.sheet(sheet_name)
  sheet.images.each do |img|
    # 保存图片到本地
    File.open("#{sheet_name}_#{img.index}.png", 'wb') { |f| f.write(img.bin) }
    # 也能拿到图片位置信息
    puts "图片在第#{img.top_row}行,第#{img.left_col}列"
  end
end

方法3:换用rubyXL Gem

rubyXL对XLSX图片的解析支持更稳定,不会出现找不到单元格或返回nil的情况:

require 'rubyXL'

workbook = RubyXL::Parser.parse('你的文件.xlsx')
workbook.worksheets.each do |sheet|
  sheet.images.each_with_index do |img, idx|
    File.open("#{sheet.sheet_name}_img_#{idx}.png", 'wb') do |f|
      f.write(img.image_data)
    end
  end
end

内容的提问来源于stack exchange,提问作者Byruat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:35:03