Ruby重写数组访问运算符:无法实现ws['First Col'][1]=255赋值功能
问题:无法通过
ws['First Col'][1] = 255设置工作表单元格值 你尝试用以下代码实现单元格赋值,但无法正常工作:
def [](*args) return Column.new(self.find_column_index(args[0])) if args[0].is_a?(String) and args[1] != nil return cell_name_to_row_col(args[0]) if args[0].is_a?(String) and args[1] == nil (row, col) = parse_cell_args(args) cells[[row, col]] || '' end class Column def initialize(column) @column = column end def []=(row, value) self[row+1,@column] = value self.save end end
问题分析
[]方法条件判断逻辑错误:调用ws['First Col']时,参数仅1个字符串,此时args[1]为nil,会触发第二个分支返回单元格坐标,而非返回Column实例,导致后续无法调用[]=完成赋值。- Column类缺少核心依赖:Column实例没有持有工作表的引用,无法直接操作工作表的cells集合;同时
self[row+1,@column] = value中的self是Column对象,并没有定义接收(row, col)参数的[]=方法,调用无效。
修正后的代码
调整工作表的[]方法
def [](*args) # 处理 ws['First Col'] 场景,返回Column实例用于后续赋值 if args.size == 1 && args[0].is_a?(String) return Column.new(self, self.find_column_index(args[0])) end # 处理 ws['A1'] 这类单元格名称查询 if args.size == 1 && args[0].is_a?(String) row, col = cell_name_to_row_col(args[0]) return cells[[row, col]] || '' end # 处理 ws[1,2] 这类行号列号查询 row, col = parse_cell_args(args) cells[[row, col]] || '' end
修改Column类
class Column def initialize(worksheet, column) @worksheet = worksheet # 保存工作表引用,用于操作单元格数据 @column = column end def []=(row, value) # 根据你的行号规则调整是否需要+1,这里直接使用传入的row值 @worksheet.cells[[row, @column]] = value @worksheet.save end end
关键修改说明
- 重新梳理
[]方法的条件分支,确保单字符串参数(列名)场景下返回Column实例; - Column类新增工作表引用,通过它直接操作工作表的cells哈希完成赋值;
- 移除Column类中无效的
self[row+1,@column]调用,替换为直接操作工作表的cells集合。
内容的提问来源于stack exchange,提问作者Jovan Stankovic
相关产品推荐
相关产品推荐

