123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325 |
- package excel
- import (
- "eta/eta_api/models/data_manage/excel"
- "eta/eta_api/utils"
- "fmt"
- "sort"
- "strconv"
- "strings"
- "time"
- )
- // HandleTableCell 前端d毛需要我根据合并单元格处理掉多余的单元格
- func HandleTableCell(oldTableData TableData) (newTableData TableData) {
- newTableData = oldTableData
- mergeList := oldTableData.MergeList
- lenMergeList := len(mergeList)
- if lenMergeList <= 0 {
- return
- }
- deleteRowMap := make(map[int]map[int]int)
- deleteRowList := make([]int, 0)
- deleteColumnMap := make(map[int][]int, 0)
- for i := lenMergeList - 1; i >= 0; i-- {
- tmpMerge := mergeList[i]
- //
- for rowIndex := tmpMerge.MergeRowNum; rowIndex >= 0; rowIndex-- {
- tmpColumnMap := make(map[int]int)
- if columnMap, ok := deleteRowMap[tmpMerge.StartRowIndex+rowIndex]; ok {
- tmpColumnMap = columnMap
- } else {
- deleteRowList = append(deleteRowList, tmpMerge.StartRowIndex+rowIndex)
- }
- deleteColumnList := make([]int, 0)
- if columnList, ok := deleteColumnMap[tmpMerge.StartRowIndex+rowIndex]; ok {
- deleteColumnList = columnList
- }
- for columnIndex := tmpMerge.MergeColumnNum; columnIndex >= 0; columnIndex-- {
- if rowIndex == 0 && columnIndex == 0 {
- continue
- }
- tmpColumnMap[tmpMerge.StartColumnIndex+columnIndex] = tmpMerge.StartColumnIndex + columnIndex
- deleteColumnList = append(deleteColumnList, tmpMerge.StartColumnIndex+columnIndex)
- }
- // 待删除的行
- deleteRowMap[tmpMerge.StartRowIndex+rowIndex] = tmpColumnMap
- // 该行待删除的列
- deleteColumnMap[tmpMerge.StartRowIndex+rowIndex] = deleteColumnList
- }
- }
- sort.Ints(deleteRowList)
- for i := len(deleteRowList) - 1; i >= 0; i-- {
- rowIndex := deleteRowList[i]
- deleteColumnList := deleteColumnMap[rowIndex]
- sort.Ints(deleteColumnList)
- for i := len(deleteColumnList) - 1; i >= 0; i-- {
- columnIndex := deleteColumnList[i]
- // 最后一行合并单元格时,就不再次移除合并的单元格,避免数组越界
- if rowIndex >= len(newTableData.TableDataList) {
- continue
- }
- tmpColumnDataList := newTableData.TableDataList[rowIndex]
- // 最后一列合并单元格时,就不再次移除合并的单元格,避免数组越界
- if columnIndex >= len(tmpColumnDataList) {
- continue
- }
- newTableData.TableDataList[rowIndex] = append(tmpColumnDataList[:columnIndex], tmpColumnDataList[columnIndex+1:]...) // 删除开头N个元素
- //fmt.Println("row:", rowIndex, "===column:", columnIndex)
- }
- }
- // 数据值处理
- for rowIndex, colList := range newTableData.TableDataList {
- for colIndex, v := range colList {
- v.Monitor = handleCellVal(v)
- colList[colIndex] = v
- }
- newTableData.TableDataList[rowIndex] = colList
- }
- return
- }
- // handleCellVal 处理单元格数据
- func handleCellVal(tmpTableColData LuckySheetDataValue) (valueStr string) {
- valueStr = tmpTableColData.Monitor
- if valueStr == `` {
- //valueStr = fmt.Sprint(cellInfo.Value)
- if valueStr == `` && tmpTableColData.CellType.S != nil {
- //不是设置在单元格上面,而是设置在文本上
- for _, cellS := range tmpTableColData.CellType.S {
- valueStr += fmt.Sprint(cellS.Value)
- }
- }
- }
- return
- }
- // HandleRuleToTableCell 根据管理规则渲染单元格数据
- func HandleRuleToTableCell(excelInfoId int, oldTableData TableData) (newTableData TableData, err error) {
- newTableData = oldTableData
- excelRuleMappingList, err := excel.GetExcelRuleMappingByExcelInfoId(excelInfoId)
- if err != nil {
- return
- }
- if len(excelRuleMappingList) == 0 {
- return
- }
- tableDataList := oldTableData.TableDataList
- excelRuleMap := make(map[int]*excel.ExcelInfoRuleMappingView)
- for _, v := range excelRuleMappingList {
- excelRuleMap[v.ExcelInfoRuleMappingId] = v
- }
- ruleScopeMap := generateRuleScopeIndexMap(excelRuleMappingList)
- for row, scopeValues := range ruleScopeMap {
- for col, ruleId := range scopeValues {
- if v, ok := excelRuleMap[ruleId]; ok {
- if len(tableDataList) > row && len(tableDataList[row]) > col {
- // 符合管理规则要求,则进行字体和背景颜色的渲染
- if checkCellRule(v, tableDataList[row][col].Monitor, tableDataList) {
- tableDataList[row][col].Background = v.BackgroundColor
- tableDataList[row][col].FontColor = v.FontColor
- }
- } else {
- continue
- }
- } else {
- continue
- }
- }
- }
- return
- }
- func getCellValueByType(value string, valueType int, tableDataList [][]LuckySheetDataValue) (float64, bool) {
- if valueType == 2 {
- coords := strings.Split(value, ",")
- var coordIntArr []int
- for _, v := range coords {
- t, _ := strconv.Atoi(v)
- coordIntArr = append(coordIntArr, t)
- }
- if len(coordIntArr) == 2 {
- x, y := coordIntArr[0]-1, coordIntArr[1]-1
- conditionValue, err := strconv.ParseFloat(tableDataList[y][x].Monitor, 64)
- if err != nil {
- return 0, false
- }
- return conditionValue, true
- }
- } else {
- conditionValue, err := strconv.ParseFloat(value, 64)
- if err != nil {
- return 0, false
- }
- return conditionValue, true
- }
- return 0, false
- }
- func checkCellRule(ruleInfo *excel.ExcelInfoRuleMappingView, value string, tableDataList [][]LuckySheetDataValue) bool {
- var tableValue float64
- var tableTime time.Time
- var err error
- if ruleInfo.RuleType == 5 {
- tableTime, err = time.ParseInLocation(utils.FormatDate, value, time.Local)
- if err != nil {
- return false
- }
- } else {
- tableValue, err = strconv.ParseFloat(value, 64)
- if err != nil {
- return false
- }
- }
- switch ruleInfo.RuleType {
- // 大于
- case 1:
- conditionValue, ok := getCellValueByType(ruleInfo.LeftValueBack, ruleInfo.LeftValueType, tableDataList)
- if !ok {
- return false
- }
- if tableValue > conditionValue {
- return true
- }
- // 小于
- case 2:
- conditionValue, ok := getCellValueByType(ruleInfo.LeftValueBack, ruleInfo.LeftValueType, tableDataList)
- if !ok {
- return false
- }
- if tableValue < conditionValue {
- return true
- }
- // 介于
- case 3:
- leftcondValue, ok := getCellValueByType(ruleInfo.LeftValueBack, ruleInfo.LeftValueType, tableDataList)
- if !ok {
- return false
- }
- rightcondValue, ok := getCellValueByType(ruleInfo.RightValueBack, ruleInfo.RightValueType, tableDataList)
- if !ok {
- return false
- }
- if leftcondValue <= tableValue && tableValue <= rightcondValue {
- return true
- }
- // 等于
- case 4:
- conditionValue, ok := getCellValueByType(ruleInfo.LeftValueBack, ruleInfo.LeftValueType, tableDataList)
- if !ok {
- return false
- }
- if tableValue == conditionValue {
- return true
- }
- // 发生日期
- case 5:
- // 发生日期
- var dateStart, dataEnd time.Time
- switch ruleInfo.LeftValueBack {
- // 今天
- case "today":
- // 获得今天的零点零分零秒
- dateStart = utils.Today()
- if tableTime == dateStart {
- return true
- }
- // 明天
- case "tomorrow":
- dateStart = utils.Tomorrow()
- if tableTime == dateStart {
- return true
- }
- // 最近7天
- case "last7days":
- dateStart, dataEnd = utils.Last7Days()
- if tableTime.After(dateStart) && tableTime.Before(dataEnd) {
- return true
- }
- // 上周
- case "lastweek":
- dateStart, dataEnd = utils.LastWeek()
- if tableTime.After(dateStart) && tableTime.Before(dataEnd) {
- return true
- }
- // 本周
- case "thisweek":
- dateStart, dataEnd = utils.ThisWeek()
- if tableTime.After(dateStart) && tableTime.Before(dataEnd) {
- return true
- }
- // 下周
- case "nextweek":
- dateStart, dataEnd = utils.NextWeek()
- if tableTime.After(dateStart) && tableTime.Before(dataEnd) {
- return true
- }
- // 上月
- case "lastmonth":
- dateStart, dataEnd = utils.LastMonth()
- if tableTime.After(dateStart) && tableTime.Before(dataEnd) {
- return true
- }
- // 本月
- case "thismonth":
- dateStart, dataEnd = utils.ThisMonth()
- if tableTime.After(dateStart) && tableTime.Before(dataEnd) {
- return true
- }
- // 下月
- case "nextmonth":
- dateStart, dataEnd = utils.NextMonth()
- if tableTime.After(dateStart) && tableTime.Before(dataEnd) {
- return true
- }
- default:
- return false
- }
- }
- return false
- }
- func generateRuleScopeIndexMap(items []*excel.ExcelInfoRuleMappingView) (ruleScopeMap map[int]map[int]int) {
- ruleScopeMap = make(map[int]map[int]int)
- for _, item := range items {
- coords := strings.Split(item.ScopeCoord, ",")
- var coordIntArr []int
- for _, v := range coords {
- t, _ := strconv.Atoi(v)
- coordIntArr = append(coordIntArr, t)
- }
- if len(coords) == 4 {
- xmin, ymin, xmax, ymax := coordIntArr[0]-1, coordIntArr[1]-1, coordIntArr[2]-1, coordIntArr[3]-1
- for i := ymin; i <= ymax; i++ {
- for j := xmin; j <= xmax; j++ {
- if _, ok := ruleScopeMap[i]; !ok {
- ruleScopeMap[i] = make(map[int]int)
- }
- ruleScopeMap[i][j] = item.ExcelInfoRuleMappingId
- }
- }
- }
- if len(coords) == 2 {
- x, y := coordIntArr[0]-1, coordIntArr[1]-1
- if _, ok := ruleScopeMap[y]; !ok {
- ruleScopeMap[y] = make(map[int]int)
- }
- ruleScopeMap[y][x] = item.ExcelInfoRuleMappingId
- }
- }
- return
- }
|