5

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

4

2 回答 2

9
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_s.strip.split('').count+3

于 2013-02-28T23:02:42.427 回答
5

对于未来的读者,这里是上面 CCinkosky 代码的稍微“红宝石风格”的版本。(注意:我没有费心调整列高的大小,但这可以很容易地添加。)

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
于 2015-12-17T17:37:56.853 回答