Posted at

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

More than 1 year has passed since last update.

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の画像くらいが表示限界かもしれないです。