Grow up

生活とプログラミング

Write Excel file using Apache POI in Android

f:id:knkomko:20210622232542p:plain

はじめに

今回は Excel ファイルを作成する Apach POI を試してみました。
Android のダウンロードフォルダにExcelファイルを保存しています。
f:id:knkomko:20210622232819j:plain:w250

build.gradle
implementation 'org.apache.poi:poi:3.17'
MainActivity

Strage Access Framework を使用してExcelファイルを保存しています。

private fun createFile() {
    val current = LocalDateTime.now()
    val formatter = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")
    val formatted = current.format(formatter)
    val fileName = "${formatted}.xlsx"
    val intent = Intent(Intent.ACTION_CREATE_DOCUMENT)
    intent.addCategory(Intent.CATEGORY_OPENABLE)
    intent.type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
    intent.putExtra(Intent.EXTRA_TITLE, fileName)
    startActivityForResult(intent, CREATE_FILE)
}

HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell、でセルを指定します。
セルへの書き込みは hssfCell.setCellValue*1 で行っています。
最後は hssWorkbook.write(outputStream) でExcelファイルを保存しています。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == CREATE_FILE && resultCode == Activity.RESULT_OK) {
        if (data != null) {
            var uri: Uri? = data.data

            var hssfWorkbook: HSSFWorkbook = HSSFWorkbook()
            var hssfSheet: HSSFSheet = hssfWorkbook.createSheet()

            var count: Int = 0
            for (y in 0..5) {
                var hssfRow: HSSFRow = hssfSheet.createRow(y)
                for (x in 0..5) {
                    var hssfCell: HSSFCell = hssfRow.createCell(x)
                    hssfCell.setCellValue((count++).toString())
                }
            }

            try {
                if(uri != null) {
                    applicationContext.contentResolver.openOutputStream(uri).use { outputStream ->
                        hssfWorkbook.write(outputStream)
                    }
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }
}

*1:count++).toString(