このブログのコピーです。
概要
Excelで佐々木希を描くwith pythonの他言語portとしてScala版をつくってみました。(もう本家投稿から2ヶ月も経ってた…)
ScalaなのでExcelのJavaライブラリであるApache POIを使って、セルの色塗りをしました。
環境
- Windows 10 Pro (32bit)
- JDK 1.8.0_25
- Scala 2.11.8
- Apache POI 3.14
- Microsoft Excel 2013
コード
main.scala
import java.io._
import java.awt.Color
import org.apache.poi.xssf.usermodel.{XSSFColor, XSSFWorkbook}
import javax.imageio.ImageIO
import org.apache.poi.ss.usermodel.CellStyle
object main {
val PixelHeight:Short = 35
val PixelWidth:Short = 50
val FilePrefix:String = "sasaki_nozomi"
val XlsxPath:String = ".\\" + FilePrefix + "_scala.xlsx"
val ImagePath:String = ".\\" + FilePrefix + ".jpg"
def main(args: Array[String]): Unit = {
val image = ImageIO.read(new File(ImagePath))
val workbook = new XSSFWorkbook()
workbook.createSheet(FilePrefix)
val sheet = workbook.getSheetAt(0)
val width = image.getWidth()
val height = image.getHeight()
for( j <- 0 until height ) {
sheet.createRow(j)
val row = sheet.getRow(j)
row.setHeight(PixelHeight)
for( i <- 0 until width ) {
row.createCell(i)
val cel = row.getCell(i)
val pixel = image.getRGB(i, j)
val color = new XSSFColor(this.getRGBArray(pixel))
val style = workbook.createCellStyle()
style.setFillPattern(CellStyle.SOLID_FOREGROUND)
style.setFillForegroundColor(color)
cel.setCellStyle(style)
}
}
for( i <- 0 until width ) {
sheet.setColumnWidth(i, PixelWidth)
}
val outfile = new java.io.FileOutputStream(XlsxPath)
workbook.write(outfile)
outfile.close()
}
def getRGBArray(pixel:Int):Color = {
val r:Int = (pixel >> 16) & 0xff
val g:Int = (pixel >> 8) & 0xff
val b:Int = pixel & 0xff
new Color(r,g,b)
}
}
結果
ハマったこと・課題など
- ハマった: IntelliJでgithubへのリモートリポジトリの作成からpushまでが新規でできない(いまもできない)
- ハマった: XSSFColorがRGBのbyte arrayコンストラクタを最初使ってたのだが、byteのMAX_VALUEって127やん?255入らんやん?負数つかうん?と思ってやめた(別のコンストラクタにした)
- ハマった: セルの背景ぬるんだろとStyle::setFillBackgroundColorをよびつづけてた(正解はsetFillForegroundColorおよびパターン指定)
- 課題: 行がすすむにつれて処理がすっごく重くなる。(小一時間以上かかる)メモリ上のXSSFWorkbookがボトルネックかと思い、20行ずつファイルに書き出してみるも結局速度変わらず。XSSWorkbookインスタンス構築でもうがっつりメモリに乗せちゃってるんだろうなと想像。
- 良かったこと: IntelliJ買ってよかった(Eclipseのころより楽な気がした。まあ最近ずっとPhpStorm使ってたってのもあるけど)
github