|
@@ -0,0 +1,247 @@
|
|
|
+package excel
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "eta/eta_api/utils"
|
|
|
+ "fmt"
|
|
|
+ "github.com/shopspring/decimal"
|
|
|
+ "github.com/xuri/excelize/v2"
|
|
|
+)
|
|
|
+
|
|
|
+// ConvToLuckySheet 普通的excel转luckySheet数据
|
|
|
+func ConvToLuckySheet(filePath string) (err error) {
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ f, err := excelize.OpenFile(filePath)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ sheetDataList := make([]SimpleLuckySheetData, 0)
|
|
|
+ // 获取所有sheet
|
|
|
+ sheetList := f.GetSheetList()
|
|
|
+ for sheetIndex, sheetName := range sheetList {
|
|
|
+ sheetData, tmpErr := getLuckySheetData(f, sheetIndex, sheetName)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ sheetDataList = append(sheetDataList, sheetData)
|
|
|
+ }
|
|
|
+ byteS, err := json.Marshal(sheetDataList)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ utils.FileLog.Info(string(byteS))
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// SimpleLuckySheetData sheet表格数据
|
|
|
+type SimpleLuckySheetData struct {
|
|
|
+ Name string `json:"name" description:"工作表名称"`
|
|
|
+ Index int `json:"index" description:"工作表索引"`
|
|
|
+ //Row int `json:"row" description:"行数"`
|
|
|
+ //Column int `json:"column" description:"列数"`
|
|
|
+ CellData []SimpleLuckySheetCellData `json:"celldata" description:"单元格数据"`
|
|
|
+ Config SimpleLuckySheetDataConfig `json:"config" description:""`
|
|
|
+ CalcChain []CalcChain `json:"calcChain" description:"公式链"`
|
|
|
+ //Status int64 `json:"status" description:"激活状态"`
|
|
|
+}
|
|
|
+
|
|
|
+type CalcChain struct {
|
|
|
+ Col int64 `json:"c"` //列数
|
|
|
+ Row int64 `json:"r"` //行数
|
|
|
+ Index int `json:"index"` //工作表id
|
|
|
+ Func []interface{} `json:"func"` //公式信息,包含公式计算结果和公式字符串
|
|
|
+ Color string `json:"color"` //"w":采用深度优先算法 "b":普通计算
|
|
|
+ //Parent interface{} `json:"parent"`
|
|
|
+ //Chidren struct {
|
|
|
+ //} `json:"chidren"`
|
|
|
+ Times int `json:"times"`
|
|
|
+}
|
|
|
+
|
|
|
+// SimpleLuckySheetDataConfig sheet表单的配置
|
|
|
+type SimpleLuckySheetDataConfig struct {
|
|
|
+ BorderInfo []LuckySheetDataConfigBorderInfo `json:"borderInfo" description:"边框"`
|
|
|
+ Colhidden map[string]int64 `json:"colhidden" description:"隐藏列,示例值:\"colhidden\":{\"30\":0,\"31\":0}"`
|
|
|
+ //CustomHeight struct {
|
|
|
+ // Zero int64 `json:"0"`
|
|
|
+ //} `json:"customHeight" description:""`
|
|
|
+ //CustomWidth struct {
|
|
|
+ // Two int64 `json:"2" description:""`
|
|
|
+ //} `json:"customWidth" description:""`
|
|
|
+ Merge map[string]LuckySheetDataConfigMerge `json:"merge" description:"合并单元格"`
|
|
|
+ //Rowlen map[string]float64 `json:"rowlen" description:"每个单元格的行高"`
|
|
|
+ Columnlen map[string]float64 `json:"columnlen" description:"每个单元格的列宽"`
|
|
|
+}
|
|
|
+
|
|
|
+// SimpleLuckySheetCellData 单个单元格数据
|
|
|
+type SimpleLuckySheetCellData struct {
|
|
|
+ Col int64 `json:"c" description:"列"`
|
|
|
+ Row int64 `json:"r" description:"行"`
|
|
|
+ Value SimpleLuckySheetDataValue `json:"v" description:"单元格内值的数据"`
|
|
|
+}
|
|
|
+
|
|
|
+// SimpleLuckySheetDataValue 单元格内值的数据
|
|
|
+type SimpleLuckySheetDataValue struct {
|
|
|
+ CellType LuckySheetDataCellType `json:"ct" description:"单元格值格式:文本、时间等 "`
|
|
|
+ Value interface{} `json:"v" description:"原始值"`
|
|
|
+ Monitor string `json:"m" description:"显示值"`
|
|
|
+ //Fontsize int `description:"字体大小,14"`
|
|
|
+ TextBeak int `description:"文本换行, 0 截断、1溢出、2 自动换行"`
|
|
|
+ Tb interface{} `json:"tb" description:"文本换行, 0 截断、1溢出、2 自动换行"`
|
|
|
+ //Ps LuckySheetDataCellComment `json:"ps" description:"批注"`
|
|
|
+ Function string `json:"f" description:"公式"`
|
|
|
+ //MergeCell LuckySheetDataConfigMerge `json:"mc" description:"合并单元格信息"`
|
|
|
+}
|
|
|
+
|
|
|
+func getLuckySheetData(f *excelize.File, sheetIndex int, sheetName string) (sheetData SimpleLuckySheetData, err error) {
|
|
|
+ cellData := make([]SimpleLuckySheetCellData, 0) // excel数据
|
|
|
+ mergeData := make(map[string]LuckySheetDataConfigMerge) //合并单元格数据
|
|
|
+ calcChainList := make([]CalcChain, 0) //公式链信息
|
|
|
+
|
|
|
+ sheetData = SimpleLuckySheetData{
|
|
|
+ Name: sheetName,
|
|
|
+ Index: sheetIndex,
|
|
|
+ //Row: 0,
|
|
|
+ //Column: 0,
|
|
|
+ CellData: cellData,
|
|
|
+ Config: SimpleLuckySheetDataConfig{},
|
|
|
+ }
|
|
|
+ rows, tmpErr := f.GetRows(sheetName)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //sheetData.Row = len(rows)
|
|
|
+ //sheetData.Column = len(Column)
|
|
|
+
|
|
|
+ // 最大单元格数
|
|
|
+ maxColumnIndex := 0
|
|
|
+ mergeCellList, err := f.GetMergeCells(sheetName)
|
|
|
+ if err != nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, v := range mergeCellList {
|
|
|
+ // 左上角单元格位置
|
|
|
+ cStartIndex, rStartIndex, tmpErr := excelize.CellNameToCoordinates(v.GetStartAxis())
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 右下角单元格位置
|
|
|
+ cEndIndex, rEndIndex, tmpErr := excelize.CellNameToCoordinates(v.GetEndAxis())
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //fmt.Println(v.GetEndAxis())
|
|
|
+ tmpLuckySheetDataConfigMerge := LuckySheetDataConfigMerge{
|
|
|
+ Row: rStartIndex - 1,
|
|
|
+ Column: cStartIndex - 1,
|
|
|
+ Rs: rEndIndex - rStartIndex + 1,
|
|
|
+ Cs: cEndIndex - cStartIndex + 1,
|
|
|
+ }
|
|
|
+ mergeData[fmt.Sprint(rStartIndex-1, "_", cStartIndex-1)] = tmpLuckySheetDataConfigMerge
|
|
|
+ }
|
|
|
+ sheetData.Config.Merge = mergeData
|
|
|
+
|
|
|
+ colWidthMap := make(map[string]float64)
|
|
|
+ for rIndex, row := range rows {
|
|
|
+ for cIndex, colCell := range row {
|
|
|
+ if rIndex == 0 {
|
|
|
+ //colName, tmpErr := excelize.ColumnNumberToName(cIndex + 1)
|
|
|
+ //if tmpErr != nil {
|
|
|
+ // err = tmpErr
|
|
|
+ // return
|
|
|
+ //}
|
|
|
+ //colWidth, tmpErr := f.GetColWidth(sheetName, colName)
|
|
|
+ //if tmpErr != nil {
|
|
|
+ // err = tmpErr
|
|
|
+ // return
|
|
|
+ //}
|
|
|
+ //colWidthMap[fmt.Sprint(cIndex)] = emuToPx(colWidth)
|
|
|
+ }
|
|
|
+ if maxColumnIndex < cIndex {
|
|
|
+ maxColumnIndex = cIndex
|
|
|
+ }
|
|
|
+ cellName, tmpErr := excelize.CoordinatesToCellName(cIndex+1, rIndex+1)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ cellType, tmpErr := f.GetCellType(sheetName, cellName)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ cellFormula, tmpErr := f.GetCellFormula(sheetName, cellName)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ fmt.Println(cellName, ": ", "类型:", cellType, ",公式:", cellFormula, ",值", colCell, "\t")
|
|
|
+
|
|
|
+ var colCellIntfac interface{}
|
|
|
+ cellTypeT := "g"
|
|
|
+ //colCell = utils.Tof
|
|
|
+ tmpDec, tmpErr := decimal.NewFromString(colCell)
|
|
|
+ if tmpErr != nil {
|
|
|
+ colCellIntfac = colCell
|
|
|
+ } else {
|
|
|
+ colCellIntfac, _ = tmpDec.Float64()
|
|
|
+ cellTypeT = "n"
|
|
|
+ }
|
|
|
+
|
|
|
+ if cellFormula != `` {
|
|
|
+ cellFormula = `=` + cellFormula
|
|
|
+
|
|
|
+ calcChainList = append(calcChainList, CalcChain{
|
|
|
+ Col: int64(cIndex),
|
|
|
+ Row: int64(rIndex),
|
|
|
+ Index: sheetIndex,
|
|
|
+ Func: []interface{}{true, colCell, cellFormula},
|
|
|
+ Color: "w",
|
|
|
+ Times: 0,
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ cellData = append(cellData, SimpleLuckySheetCellData{
|
|
|
+ Col: int64(cIndex),
|
|
|
+ Row: int64(rIndex),
|
|
|
+ Value: SimpleLuckySheetDataValue{
|
|
|
+ CellType: LuckySheetDataCellType{
|
|
|
+ Fa: "General",
|
|
|
+ T: cellTypeT,
|
|
|
+ //S: nil,
|
|
|
+ },
|
|
|
+ Value: colCellIntfac,
|
|
|
+ Monitor: colCell,
|
|
|
+ //Background: "",
|
|
|
+ //FontFamily: 0,
|
|
|
+ //FontColor: "",
|
|
|
+ Function: cellFormula,
|
|
|
+ //MergeCell: LuckySheetDataConfigMerge{},
|
|
|
+ },
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ sheetData.Config.Columnlen = colWidthMap
|
|
|
+
|
|
|
+ sheetData.CellData = cellData
|
|
|
+ sheetData.CalcChain = calcChainList
|
|
|
+ //sheetData.Column = maxColumnIndex + 1
|
|
|
+
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// emuToPx 计量单位emu转px
|
|
|
+func emuToPx(num float64) float64 {
|
|
|
+ return num * 15
|
|
|
+}
|