如何用Roo从.xlsx提取纯文本?解决特殊字符转HTML标签问题
解决Roo处理.xlsx文件时特殊字符被转成格式标记的问题
嘿,我之前也碰到过Roo处理xlsx和xls文件时的这种差异,给你几个实用的解决办法:
为啥会出现这个问题?
简单说,Roo处理xlsx和xls用的是不同的底层解析逻辑:xls文件的解析器会直接提取纯文本,但xlsx的解析器默认会保留单元格里的富文本格式标记(就是你看到的那些奇怪的转义符号),所以才会出现两种文件格式返回结果不一样的情况。
解决方案来了
1. 用value方法直接取纯文本(最推荐)
当你从xlsx的单元格取值时,别直接用默认的返回值,调用单元格对象的value属性就行——这个属性就是专门用来提取不带格式的原始纯文本的:
# 打开xlsx文件 spreadsheet = Roo::Spreadsheet.open(path_to_file, extension: :xlsx) target_sheet = spreadsheet.sheet(0) # 取第一个工作表 # 遍历行并清理每个单元格 target_sheet.each_row do |row| cleaned_row = row.map { |cell| cell&.value } # 用&.避免nil报错 puts cleaned_row.inspect end
亲测这个方法最有效,不管单元格里有啥格式标记,value都会给你返回干净的纯文本,和xls文件的处理结果一致。
2. 手动清理格式标记(备用方案)
如果某些特殊场景下value方法没起作用(比如极端的富文本格式),你可以用正则表达式手动清理那些多余的标记。比如针对你提到的\hello\ world\这种格式,写个清理方法:
def clean_xlsx_text(raw_text) return raw_text unless raw_text.is_a?(String) # 替换掉所有\包裹的内容,再去掉前后空格 raw_text.gsub(/\\[^\\]*\\/, '').strip end # 使用示例 spreadsheet = Roo::Spreadsheet.open(path_to_file, extension: :xlsx) target_sheet = spreadsheet.sheet(0) target_sheet.each_row do |row| cleaned_row = row.map { |cell| clean_xlsx_text(cell.to_s) } puts cleaned_row.inspect end
注意这个正则可以根据你实际遇到的标记格式调整,如果是HTML实体的话,还可以用CGI.unescapeHTML来处理,但你描述的是反斜杠包裹的格式,上面的正则就够用。
3. 升级Roo到最新版本
有时候这种问题是旧版本的bug,你可以试试把Roo和它的依赖包升级到最新版,说不定官方已经修复了这个格式解析的问题:
bundle update roo roo-xlsx
最后验证
按上面的方法处理后,xlsx文件里带特殊格式的单元格应该就能和xls文件一样,返回纯纯的hello world啦!
内容的提问来源于stack exchange,提问作者akira
相关产品推荐
相关产品推荐

