From a3cc1d220f8a1de11874bebceba0130d32157ff1 Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期二, 30 九月 2025 09:26:32 +0800
Subject: [PATCH] 2025.9.30 1. 联合前端调试数据产品接口(待完成)

---
 src/main/kotlin/cn/flightfeather/supervision/common/utils/ExcelUtil.kt |   71 +++++++++++++++++++++++++++++++++--
 1 files changed, 67 insertions(+), 4 deletions(-)

diff --git a/src/main/kotlin/cn/flightfeather/supervision/common/utils/ExcelUtil.kt b/src/main/kotlin/cn/flightfeather/supervision/common/utils/ExcelUtil.kt
index f69a607..abfda36 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/common/utils/ExcelUtil.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/common/utils/ExcelUtil.kt
@@ -1,7 +1,12 @@
 package cn.flightfeather.supervision.common.utils
 
+import cn.flightfeather.supervision.common.exception.BizException
 import org.apache.poi.hssf.usermodel.HSSFWorkbook
+import org.apache.poi.ss.usermodel.CellType
+import org.apache.poi.ss.usermodel.Row
 import org.apache.poi.ss.util.CellRangeAddress
+import org.apache.poi.xssf.usermodel.XSSFWorkbook
+import java.io.InputStream
 import java.io.OutputStream
 import java.time.LocalDate
 import java.util.*
@@ -14,6 +19,9 @@
  */
 object ExcelUtil {
 
+    /**
+     * 鍗曞厓鏍�
+     */
     class MyCell(
         var text: String,
         var rowSpan: Int = 1,
@@ -23,9 +31,64 @@
     )
 
     /**
-     * 鑷姩澶勭悊琛屽悎骞舵暟鎹�
+     * 琛ㄥご瀹氫箟
      */
-    fun write(heads: List<Array<Any>>, contents: MutableList<Array<Any>>, workbook: HSSFWorkbook, sheetName: String = "sheet1") {
+    class MyHeader(
+        var name: String,
+        val type: CellType,
+        val ignore: Boolean = false
+    )
+
+    private fun cellTypeName(type: CellType): String = when (type) {
+        CellType.NUMERIC -> "鏁板瓧"
+        CellType.STRING -> "鏂囨湰"
+        CellType.FORMULA -> "FORMULA"
+        CellType.BLANK -> "绌虹櫧"
+        CellType.BOOLEAN -> "甯冨皵鍊�"
+        else -> "鏈畾涔�"
+    }
+
+
+    /**
+     * 鍖呮嫭 .xlsx 鏂囦欢
+     */
+    fun readXLXS(input: InputStream, headers: List<MyHeader>, onRow: (row: Row) -> Unit) {
+        val workbook = XSSFWorkbook(input)
+        val sheet1 = workbook.getSheetAt(0)
+        val header = sheet1.getRow(sheet1.topRow.toInt())
+        // 妫�鏌ヤ紶鍏ョ殑鏂囦欢琛ㄥご鏄惁绗﹀悎瑕佹眰
+        val cellIterator = header.cellIterator()
+        val headIterator = headers.iterator()
+        while (headIterator.hasNext()) {
+            val head = headIterator.next()
+            if (cellIterator.hasNext()) {
+                val cellText = cellIterator.next().stringCellValue
+                if (!cellText.equals(head.name)) {
+                    throw BizException("鏂囦欢鏍煎紡閿欒, 琛ㄥご[${head}]搴旇涓篬${cellText}]")
+                }
+            } else {
+                throw BizException("鏂囦欢鏍煎紡閿欒, 琛ㄥご[${head}]缂哄け")
+            }
+        }
+        // 鑾峰彇杩唬鍣ㄥ苟鍘婚櫎绗竴琛屾爣棰�
+        val iterator = sheet1.rowIterator().also { it.next() }
+        iterator.forEach {
+            // 妫�鏌ュ綋鍓嶈姣忎釜鍗曞厓鏍肩被鍨嬫槸鍚︿笌琛ㄥご瀹氫箟鍖归厤
+            headers.forEachIndexed { i, h ->
+                val t = it.getCell(i)?.cellType ?: CellType.BLANK
+                if (t != CellType.BLANK && !h.ignore && t != h.type) {
+                    throw BizException("绗�${it.rowNum + 1}琛岋紝绗�${i + 1}鍒楀崟鍏冩牸鏍煎紡閿欒锛屽簲璇ヤ负${cellTypeName(h.type)}")
+                }
+            }
+            onRow(it)
+        }
+    }
+
+    /**
+     * 鍐欏叆excel
+     */
+    fun write(heads: List<Array<Any>>, contents: MutableList<Array<Any>>, workbook: HSSFWorkbook, sheetName: String
+    = "sheet1") {
 
         val sheet = workbook.createSheet(sheetName)
 
@@ -212,7 +275,7 @@
     }
 
     /**
-     * 鑷姩澶勭悊琛屽悎骞舵暟鎹�
+     * 鍐欏叆excel
      */
     fun write2(out: OutputStream, heads: List<Array<Any>>, contents: MutableList<Array<Any>>, sheetName: String = "sheet1") {
 
@@ -226,7 +289,7 @@
         out.close()
     }
 
-    private fun getMaxRows(rowArray: Array<Any>): Int {
+    private fun getMaxRows(rowArray: Array<out Any>): Int {
         var maxRows = 1
         rowArray.forEach {
             if (it is Array<*>) {

--
Gitblit v1.9.3