使用Ruby Spreadsheet gem,有没有办法让单元格适应内容的大小

如果我正在使用Ruby Spreadsheet gem将数据从rails应用程序导出为ex​​cel,有没有办法让单元格的大小(宽度和高度)自动适应内容的大小?

def autofit(worksheet) (0...worksheet.column_count).each do |col| @high = 1 row = 0 worksheet.column(col).each do |cell| w = cell==nil || cell=='' ? 1 : cell.to_s.strip.split('').count+3 ratio = worksheet.row(row).format(col).font.size/10 w = (w*ratio).round if w > @high @high = w end row=row+1 end worksheet.column(col).width = @high end (0...worksheet.row_count).each do |row| @high = 1 col = 0 worksheet.row(row).each do |cell| w = worksheet.row(row).format(col).font.size+4 if w > @high @high = w end col=col+1 end worksheet.row(row).height = @high end end 

此方法将循环遍历工作表中的每一列,然后循环遍历列中的每个单元格,find最多字符的单元格(+3多一点空格)并根据该单元格进行调整。 然后它为行做同样的事情。 这个值对于10号字体非常适用,但是为了确保对于较大的字体,字体大小要稍微大些,可以用下面的代码来调整字体大小:

 ratio = worksheet.row(row).format(col).font.size/10 w = (w*ratio).round 

..这不完美,但完成了工作。

更新包括KevinM的方法。 两者都适合我,但凯文看起来也更好。 原来的第6行是:

cell == nil || 细胞==''? w = 1:w == cell.to_s.strip.split('')。count + 3

对于未来的读者来说,这里是CCinkosky上面代码的稍微“ruby-esque”版本。 (注:我没有打扰调整列高,但可以轻松添加。)

 def autofit(worksheet) (0...worksheet.column_count).each do |col_idx| column = worksheet.column(col_idx) column.width = column.each_with_index.map do |cell, row| chars = cell.present? ? cell.to_s.strip.split('').count + 3 : 1 ratio = worksheet.row(row).format(col_idx).font.size / 10 (chars * ratio).round end.max end end