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
これを実行すると、この画像が
Excel上でこうなります
仕組みは単純でRubyからPNG画像を楽に操作するためのchunky_pngを使って、各ピクセルのRGB値を取得し、RubyからExcelを楽に操作するためのaxlsxを使って、そのRGB値でセルを塗りつぶしていくだけです。
ただ全ピクセルをセルに反映するのでメモリをかなり使います。最大でも100x100の画像くらいが表示限界かもしれないです。