Scala
GitHub
Excel
IntelliJ
PIO

Excelで佐々木希を描く with Scala

More than 1 year has passed since last update.

このブログのコピーです。


概要

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)
}
}



結果

xlsx_capture.png


ハマったこと・課題など


  • ハマった: IntelliJでgithubへのリモートリポジトリの作成からpushまでが新規でできない(いまもできない)

  • ハマった: XSSFColorがRGBのbyte arrayコンストラクタを最初使ってたのだが、byteのMAX_VALUEって127やん?255入らんやん?負数つかうん?と思ってやめた(別のコンストラクタにした)

  • ハマった: セルの背景ぬるんだろとStyle::setFillBackgroundColorをよびつづけてた(正解はsetFillForegroundColorおよびパターン指定)

  • 課題: 行がすすむにつれて処理がすっごく重くなる。(小一時間以上かかる)メモリ上のXSSFWorkbookがボトルネックかと思い、20行ずつファイルに書き出してみるも結局速度変わらず。XSSWorkbookインスタンス構築でもうがっつりメモリに乗せちゃってるんだろうなと想像。

  • 良かったこと: IntelliJ買ってよかった(Eclipseのころより楽な気がした。まあ最近ずっとPhpStorm使ってたってのもあるけど)


github

https://github.com/bhind/Sasakinozomi_scala_poi


参考