Ruby on rails 使用Ruby电子表格gem,有没有办法让单元格调整到内容的大小

Ruby on rails 使用Ruby电子表格gem,有没有办法让单元格调整到内容的大小,ruby-on-rails,excel,spreadsheet,Ruby On Rails,Excel,Spreadsheet,如果我使用Ruby电子表格gem将数据从rails应用程序导出到excel,有没有办法获得单元格的大小(宽度和高度)来自动调整内容的大小 def autofit(worksheet) (0...worksheet.column_count).each do |col| @high = 1 row = 0 worksheet.column(col).each do |cell| w = cell==nil || cel

如果我使用Ruby电子表格gem将数据从rails应用程序导出到excel,有没有办法获得单元格的大小(宽度和高度)来自动调整内容的大小

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
此方法将遍历工作表中的每一列,然后遍历该列中的每一个单元格,找到字符最多的单元格(+3表示一点额外空间),并根据该单元格进行调整。然后对行执行相同的操作。此值对于字体大小10非常有效,但为了确保对于较大字体它会变大一点,它会使用以下代码调整字体大小:

ratio = worksheet.row(row).format(col).font.size/10
w = (w*ratio).round
…虽然不完美,但能完成任务

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


单元格==零| |单元格=''?w=1:w==cell.to_.strip.split(“”).count+3

对于未来的读者,这里是一个稍微“ruby-esque”版本的CCinkosky代码。(注意:我没有费心调整柱高度的大小,但这可以很容易地添加。)


如果您使用的是更宽的字体,如Arial Black或其他字体,您可能还需要将此
ratio=worksheet.row(@c).format(col).font.size/10
更改为
ratio=worksheet.row(@c).format(col).font.size/13
或类似的字体,非常好。我不得不把第6行改为w=cell==nil | | cell==''?1:cell.to_.strip.split(“”)。计数+3使其工作,但除此之外,它是完美的。
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