テーブルに一覧/地図エクスポート(注釈とリフレクションを使用して)

JavaのPOIデータベースは、Excelスプレッドシートを作成および操作するために使用することができ、時には我々は、単にリストをエクスポートしたり、テーブル、より多くの定型コード、エレガントではないにマップする必要があります。注釈のプロパティを使用してマーカーがエクスポートされるよう、あなたがGsonようにすることができた場合、それはより便利です。

Githubの:https://github.com/imcloudfloating/ListToExcell

POI依存性:

<dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi</artifactId>
     <version>4.1.0</version>
</dependency>

1.コメントを作成します。

package cloud.list2excel.annotation;

import org.apache.poi.hssf.util.HSSFColor;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Column{
    String title() default "";
    short fontSize() default 14;
    HSSFColor.HSSFColorPredefined fontColor() default HSSFColor.HSSFColorPredefined.BLACK;
    HSSFColor.HSSFColorPredefined borderColor() default HSSFColor.HSSFColorPredefined.BLACK;
}

作成し@Columnたタグフィールドの注釈を

  • title:このフィールドは、テーブルの頭の名前で、デフォルト値はプロパティ名です。
  • fontSize:フォントサイズ、デフォルト14px。
  • fontColor:フォントの色、デフォルトの黒。
  • borderColor:境界線の色、デフォルトの黒。

POIテーブルにデータを書き込むための2.のGet反射注釈、

フィールドの順序は順序ではなく、宣言上Kotlin反射行を取得しているので、この部分は、Kotlinを用いるが、反射及び注釈やJavaの使用。

package cloud.list2excel.util

import cloud.list2excel.annotation.Column
import org.apache.poi.hssf.usermodel.HSSFCellStyle
import org.apache.poi.hssf.usermodel.HSSFSheet
import org.apache.poi.hssf.usermodel.HSSFWorkbook
import org.apache.poi.ss.usermodel.BorderStyle

/**
 * List/Map 导出 Excel 表格
 * @author Cloud
 */
object ListToExcel {

    private var workbook: HSSFWorkbook = HSSFWorkbook()
    private val cellStyles: MutableList<HSSFCellStyle> = ArrayList()

    /**
     * 处理单个 Sheet
     */
    fun from(data: List<Any>): HSSFWorkbook {
        toWorkbook("Sheet0", data)
        return workbook
    }

    /**
     * 处理多个 Sheet
     */
    fun from(data: Map<String, List<Any>>): HSSFWorkbook {
        if (data.isEmpty())
            return workbook

        for (sheet in data) {
            toWorkbook(sheet.key, sheet.value)
        }

        return workbook
    }

    private fun toWorkbook(sheetName: String, list: List<Any>) {
        val sheet = workbook.createSheet(sheetName)

        if (list.isEmpty())
            return

        val headers: MutableList<String> = ArrayList()
        val data: MutableList<MutableList<Any>> = ArrayList()

        // 获取注解并设置表头
        for (field in list[0].javaClass.declaredFields) {
            field.isAccessible = true

            val annotation = field.getAnnotation(Column::class.java)

            if (annotation != null) {
                headers.add(if (annotation.title == "") field.name else annotation.title)

                val cellStyle = workbook.createCellStyle().also { style ->
                    style.setFont(workbook.createFont().also {
                        it.fontHeightInPoints = annotation.fontSize
                        it.color = annotation.fontColor.index
                    })

                }

                cellStyle.run {
                    leftBorderColor = annotation.borderColor.index
                    topBorderColor = annotation.borderColor.index
                    rightBorderColor = annotation.borderColor.index
                    bottomBorderColor = annotation.borderColor.index

                    borderLeft = BorderStyle.THIN
                    borderTop = BorderStyle.THIN
                    borderRight = BorderStyle.THIN
                    borderBottom = BorderStyle.THIN
                }

                cellStyles.add(cellStyle)
            }
        }

        // 获取数据
        for (obj in list) {
            val rowData: MutableList<Any> = ArrayList()
            for (field in obj.javaClass.declaredFields) {
                field.isAccessible = true

                val annotation = field.getAnnotation(Column::class.java)

                if (annotation != null) {
                    val t = field.get(obj)
                    if (t == null) {
                        rowData.add("")
                    } else {
                        rowData.add(t)
                    }
                }
            }
            data.add(rowData)
        }

        setHeader(sheet, headers)
        setData(sheet, data)
    }

    /**
     * 设置表格头
     */
    private fun setHeader(sheet: HSSFSheet, headers: List<String>) {
        val row = sheet.createRow(0)

        for (i in headers.indices) {
            val cell = row.createCell(i)
            cell.setCellValue(headers[i])
            cell.setCellStyle(cellStyles[i])
        }
    }

    /**
     * 写入数据
     */
    private fun setData(sheet: HSSFSheet, data: List<List<Any>>) {
        for (i in data.indices) {
            val row = sheet.createRow(i + 1)

            for (j in data[i].indices) {
                val cell = row.createCell(j)
                cell.setCellValue(data[i][j].toString())
                cell.setCellStyle(cellStyles[j])
                sheet.autoSizeColumn(j)
            }
        }
    }
}

from()パラメータはList、直接描画ワークブックは、その後に戻っMapたときに、ブックに1、ずつ書かれたシートの名前などの主要な。MapListMap

3.

2つのエンティティクラスのテストを作成します。

package cloud.list2excel.util

import cloud.list2excel.annotation.Column
import org.apache.poi.hssf.util.HSSFColor
import java.sql.Date

data class Film(
    @Column(title = "ID", fontColor = HSSFColor.HSSFColorPredefined.RED)
    var id: Int? = null,

    @Column(title = "Title")
    var title: String? = null,

    @Column(title = "Release Date")
    var release_date: Date? = null,

    @Column(title = "Duration")
    var duration: String? = null
)
package cloud.list2excel.util

import cloud.list2excel.annotation.Column
import java.sql.Date

data class Actor(
    @Column(title = "ID")
    var id: Int? = null,

    @Column(title = "Full Name")
    var name: String? = null,

    @Column(title = "Birth")
    var birth: Date?=null
)

テストカテゴリ:

二人はここにシートを書いて。

package cloud.list2excel.util

import java.io.File
import java.sql.Date

class ListToExcelTest {

    private val films = listOf(
        Film(1, "Iron Man", Date.valueOf("2008-4-30"), "126 min"),
        Film(2, "Star Wars: Episode IV - A New Hope", Date.valueOf("1977-5-25"), "121 min"),
        Film(3, "Zootropolis", Date.valueOf("2016-3-4"), "109 min")
    )

    private val actors = listOf(
        Actor(1, "Robert John Downey Jr.", Date.valueOf("1965-4-4")),
        Actor(2, "Mark Hamill", Date.valueOf("1951-9-25")),
        Actor(3, "Ginnifer Goodwin", Date.valueOf("1978-5-22"))
    )

    private val data = mapOf(
        Pair("films", films),
        Pair("actors", actors)
    )

    @org.junit.Test
    fun toExcel() {
        val before = System.currentTimeMillis()
        val workbook = ListToExcel.from(data)
        val after = System.currentTimeMillis()
        println("Time Usage: ${after - before}ms")
        workbook.write(File("/home/data.xls"))
    }
}

エクスポート結果:

フィルム

俳優

^ _ ^非常に高い効率ではないようです

おすすめ

転載: www.cnblogs.com/cloudfloating/p/11299057.html