5

Rails アプリから Excel にデータをエクスポートするために Ruby Spreadsheet gem を使用している場合、コンテンツのサイズに合わせてセルのサイズ (幅と高さ) を自動的に調整する方法はありますか?

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 に答える