LoginSignup
8
5

More than 5 years have passed since last update.

Excelに画像を書くスクリプトを書いた

Posted at

Excelに画像を貼って上司に提出したら、

「画像を張るなんてお客様に失礼だ、温かみが足りない。画像は各セルを塗りつぶして書きなさい。」

なんて言われたときのために画像をExcelに書き込むスクリプトをRubyで書きました。

# coding: utf-8
require 'axlsx'
require 'chunky_png'

# USAGE: ruby scripts/draw_picture_to_excel.rb <input file>
filename = ARGV[0]
image = ChunkyPNG::Image.from_file(filename)
working_image = image.dup

Axlsx::Package.new do |package|
  # create workbook
  package.workbook do |workbook|
    # define styles
    workbook.styles do |style|
      # draw cells
      workbook.add_worksheet(name: "sample") do |sheet|
        row_pix_count = 1
        pix_colors = []
        working_image.pixels.map! do |pixel|
          if image.width == row_pix_count
            # write per image width size
            pix_colors << style.add_style({bg_color: ChunkyPNG::Color.to_hex(pixel, false).sub(/#/, '')})
            sheet.add_row Array.new(image.width, ''), style: pix_colors, sz: 10
            pix_colors = []
            row_pix_count = 1
          else
            # create color style of Axlsx
            pix_colors << style.add_style({bg_color: ChunkyPNG::Color.to_hex(pixel, false).sub(/#/, '')})
            row_pix_count += 1
          end
        end
      end
    end
  end
  # create file
  package.serialize("sample.xlsx")
end

これを実行すると、この画像が

lena_std_res.png

Excel上でこうなります

スクリーンショット 2017-01-04 13.51.24.png

仕組みは単純でRubyからPNG画像を楽に操作するためのchunky_pngを使って、各ピクセルのRGB値を取得し、RubyからExcelを楽に操作するためのaxlsxを使って、そのRGB値でセルを塗りつぶしていくだけです。

ただ全ピクセルをセルに反映するのでメモリをかなり使います。最大でも100x100の画像くらいが表示限界かもしれないです。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5