LoginSignup
10
9

More than 5 years have passed since last update.

Excelで佐々木希を描く with Scala

Last updated at Posted at 2016-08-10

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

概要

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

参考

10
9
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
10
9