如何使用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
相关产品推荐
相关产品推荐

