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、ずつ書かれたシートの名前などの主要な。Map
List
Map
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"))
}
}
エクスポート結果:
^ _ ^非常に高い効率ではないようです