在Ruby On Rails中能否用roo和paperclip更新数据库中的xlsx文件?
可以实现,具体步骤如下
核心结论:roo支持xls/xlsx等多种格式,搭配paperclip完全能完成「读取数据库存储的文件→修改单元格→重新上传替换」的流程,正好解决你提到的spreadsheet仅支持xls的局限。
具体实现步骤
1. 从Paperclip中导出文件到本地临时路径
假设你的模型是Document,attachment字段为spreadsheet,可以先把数据库里的文件导出到本地临时文件:document = Document.find(params[:id]) temp_file = Tempfile.new(["updated_spreadsheet", File.extname(document.spreadsheet.path)]) File.open(temp_file.path, "wb") do |f| f.write(document.spreadsheet.download) end2. 用Roo读取并修改单元格
Roo支持直接操作本地文件,修改指定单元格后保存:# 根据文件后缀初始化对应的Roo对象 case File.extname(temp_file.path) when ".xls" workbook = Roo::Excel.new(temp_file.path) when ".xlsx" workbook = Roo::Excelx.new(temp_file.path) end # 修改指定单元格(比如Sheet1的A1单元格) workbook.sheet(0).set(1, 1, "新的内容") # 保存修改后的文件 workbook.save_as(temp_file.path)3. 用Paperclip重新上传替换原文件
把修改后的临时文件重新赋值给模型的attachment字段,保存即可:document.spreadsheet = temp_file document.save! # 最后清理临时文件 temp_file.close temp_file.unlink
注意事项
- 确保Roo的版本支持你使用的Excel格式,最新版Roo对xlsx的兼容性很好
- 处理大文件时建议使用临时文件而非内存操作,避免性能问题
- 可以添加错误捕获逻辑,比如文件格式不支持、保存失败等情况
内容的提问来源于stack exchange,提问作者Vishal Pandey
相关产品推荐
相关产品推荐

