All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.innovenso.townplanner.io.concepts.WorksheetIO.scala Maven / Gradle / Ivy

package com.innovenso.townplanner.io.concepts

import com.innovenso.townplanner.model.{EnterpriseArchitecture, TownPlan}
import org.apache.poi.ss.usermodel.{Cell, Row, Sheet}
import org.apache.poi.xssf.usermodel.XSSFWorkbook

import scala.collection.immutable.Seq
import scala.jdk.CollectionConverters.IteratorHasAsScala
import scala.util.{Failure, Success, Try}

trait WorksheetIO {
  def worksheet(townPlan: TownPlan, workbook: XSSFWorkbook): Option[Sheet]

  def prepareSheet(workbook: XSSFWorkbook, name: String): Option[Sheet] =
    Option(workbook.getSheet(name)).orElse(Some(workbook.createSheet(name)))

  def prepareHeader(sheet: Sheet, columns: String*): Option[Row] =
    prepareHeader(sheet, columns.toList)

  def prepareHeader(sheet: Sheet, columns: List[String]): Option[Row] =
    Option(sheet.getRow(0))
      .orElse(Some(sheet.createRow(0)).map(r => prepareHeaderCells(r, columns)))

  def prepareHeaderCells(row: Row, columns: Seq[String]): Row = {
    columns.zipWithIndex.foreach(tuple =>
      prepareHeaderCell(row, tuple._2, tuple._1)
    )
    row
  }

  def prepareHeaderCell(row: Row, index: Int, name: String): Option[Cell] =
    Option(row.getCell(index))
      .orElse(Try {
        row.createCell(index)
      }.toOption)
      .map(cell => {
        cell.setCellValue(name)
        cell
      })

  def cell(row: Row, index: Int, value: String): Option[Cell] =
    Option(row.getCell(index))
      .orElse(Some(row.createCell(index)))
      .map(c => {
        c.setCellValue(value)
        c
      })

  def columnIndex(worksheet: Option[Sheet], header: String): Option[Int] =
    getRow(worksheet, 0).flatMap(row =>
      listOfCells(row)
        .find(c => isCellValue(c, header))
        .map(c => c.getColumnIndex)
    )

  def isCellValue(cell: Cell, value: String): Boolean = Try {
    cell.getStringCellValue == value
  } match {
    case Success(value) => value
    case Failure(exception) => {
      exception.printStackTrace()
      false
    }
  }

  def getCellValue(
      worksheet: Option[Sheet],
      row: Option[Row],
      index: Option[Int]
  ): Option[String] =
    for {
      r <- row
      i <- index
      value <- Try { r.getCell(i).getStringCellValue.trim }
        .orElse(Try { String.valueOf(r.getCell(i).getNumericCellValue) })
        .orElse(Try { r.getCell(i).getLocalDateTimeCellValue.toString })
        .toOption
    } yield value

  def getRow(worksheet: Option[Sheet], number: Int): Option[Row] =
    worksheet.flatMap(sheet => Option(sheet.getRow(number)))

  def listOfCells(row: Row): List[Cell] =
    row.cellIterator().asScala.toList

  def listOfRows(worksheet: Option[Sheet]): List[Row] =
    worksheet
      .map(sheet =>
        sheet.rowIterator().asScala.toList match {
          case head :: tail => tail
          case _            => Nil
        }
      )
      .getOrElse(Nil)

  def read(
      enterpriseArchitecture: EnterpriseArchitecture,
      workbook: XSSFWorkbook
  ): Unit
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy