custom_analysis_edb.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. package excel
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models/data_manage/excel"
  6. excelServices "eta/eta_api/services/excel"
  7. "eta/eta_api/utils"
  8. "github.com/araddon/dateparse"
  9. "github.com/shopspring/decimal"
  10. "strings"
  11. )
  12. // GetCustomAnalysisExcelData 获取自定义分析的表格data数据
  13. func GetCustomAnalysisExcelData(excelInfo *excel.ExcelInfo) (luckySheet excelServices.LuckySheet, err error, errMsg string) {
  14. // 查找当前excel的sheet列表
  15. sheetList, err := excel.GetAllSheetList(excelInfo.ExcelInfoId)
  16. if err != nil {
  17. errMsg = "保存失败"
  18. err = errors.New("查找当前excel的sheet列表失败,Err:" + err.Error())
  19. return
  20. }
  21. currSheetMap := make(map[string]string)
  22. for _, sheet := range sheetList {
  23. currSheetMap[sheet.SheetName] = sheet.SheetName
  24. }
  25. sheetCellDataMapList := make(map[int][]excelServices.LuckySheetCellData)
  26. // 通过excel的id获取各个sheet的单元格数据map
  27. {
  28. dataList, tmpErr := excel.GetAllSheetDataListByExcelInfoId(excelInfo.ExcelInfoId)
  29. if tmpErr != nil {
  30. err = tmpErr
  31. return
  32. }
  33. for _, cellData := range dataList {
  34. sheetDataList, ok := sheetCellDataMapList[cellData.ExcelSheetId]
  35. if !ok {
  36. sheetDataList = make([]excelServices.LuckySheetCellData, 0)
  37. }
  38. tmpSheetDataList := make([]excelServices.LuckySheetCellData, 0)
  39. err = json.Unmarshal([]byte(cellData.Data), &tmpSheetDataList)
  40. if err != nil {
  41. return
  42. }
  43. sheetCellDataMapList[cellData.ExcelSheetId] = append(sheetDataList, tmpSheetDataList...)
  44. }
  45. }
  46. // 转成luckySheet的数据格式
  47. luckySheet = excelServices.LuckySheet{
  48. SheetList: make([]excelServices.LuckySheetData, 0),
  49. }
  50. for _, sheet := range sheetList {
  51. var luckySheetDataConfig excelServices.LuckySheetDataConfig
  52. err = json.Unmarshal([]byte(sheet.Config), &luckySheetDataConfig)
  53. if err != nil {
  54. return
  55. }
  56. tmpLuckySheetDataInfo := excelServices.LuckySheetData{
  57. Name: sheet.SheetName,
  58. Index: sheet.Sort,
  59. CellData: sheetCellDataMapList[sheet.ExcelSheetId],
  60. Config: luckySheetDataConfig,
  61. }
  62. luckySheet.SheetList = append(luckySheet.SheetList, tmpLuckySheetDataInfo)
  63. }
  64. return
  65. }
  66. // GenerateExcelCustomAnalysisExcel 根据自定义分析的表格data数据生成excel
  67. func GenerateExcelCustomAnalysisExcel(excelInfo *excel.ExcelInfo) (downloadFilePath string, err error, errMsg string) {
  68. luckySheet, err, errMsg := GetCustomAnalysisExcelData(excelInfo)
  69. if err != nil {
  70. return
  71. }
  72. downloadFilePath, err = luckySheet.ToExcel()
  73. return
  74. }
  75. // HandleEdbSequenceVal 处理日期集和数据集(获取可用的日期、数据集)
  76. func HandleEdbSequenceVal(dateSequenceVal, dataSequenceVal []string) (newDateList []string, newDataList []float64, err error, errMsg string) {
  77. newDateList = make([]string, 0)
  78. newDataList = make([]float64, 0)
  79. // 数据集
  80. type dataStruct struct {
  81. Value float64
  82. Ok bool
  83. }
  84. dataList := make([]dataStruct, 0)
  85. {
  86. var startData bool
  87. for _, v := range dataSequenceVal {
  88. // 如果没有数据集,那么就过滤
  89. if v == `` {
  90. // 如果开始插入数据了,那么就需要插入不存在值
  91. if startData {
  92. dataList = append(dataList, dataStruct{
  93. Value: 0,
  94. Ok: false,
  95. })
  96. }
  97. continue
  98. }
  99. tmpValDec, tmpErr := decimal.NewFromString(v)
  100. if tmpErr != nil {
  101. if startData {
  102. dataList = append(dataList, dataStruct{
  103. Value: 0,
  104. Ok: false,
  105. })
  106. }
  107. continue
  108. }
  109. startData = true
  110. tmpVal, _ := tmpValDec.Float64()
  111. dataList = append(dataList, dataStruct{
  112. Value: tmpVal,
  113. Ok: true,
  114. })
  115. }
  116. }
  117. // 日期集
  118. dateList := make([]string, 0)
  119. {
  120. var startData bool
  121. for _, v := range dateSequenceVal {
  122. // 如果没有数据集,那么就过滤
  123. if v == `` {
  124. // 如果开始插入数据了,那么就需要插入不存在值
  125. if startData {
  126. dateList = append(dateList, "")
  127. }
  128. continue
  129. }
  130. t1, tmpErr := dateparse.ParseAny(v)
  131. if tmpErr != nil {
  132. if startData {
  133. dateList = append(dateList, "")
  134. }
  135. continue
  136. }
  137. startData = true
  138. dateList = append(dateList, t1.Format(utils.FormatDate))
  139. }
  140. }
  141. lenData := len(dataList)
  142. lenDate := len(dateList)
  143. // 最小个数
  144. num := lenDate
  145. if num > lenData {
  146. num = lenData
  147. }
  148. for i := 0; i < num; i++ {
  149. date := dateList[i]
  150. data := dataList[i]
  151. // 日期为空、数据为空
  152. if !data.Ok || date == `` {
  153. continue
  154. }
  155. newDateList = append(newDateList, date)
  156. newDataList = append(newDataList, data.Value)
  157. }
  158. return
  159. }
  160. func Refresh(excelInfo *excel.ExcelInfo) (err error, errMsg string, isSendEmail bool) {
  161. isSendEmail = true
  162. list, err := excel.GetAllExcelEdbMappingItemByExcelInfoId(excelInfo.ExcelInfoId)
  163. if err != nil {
  164. errMsg = "获取失败"
  165. return
  166. }
  167. for k, v := range list {
  168. var tmpCalculateFormula excel.CalculateFormula
  169. err = json.Unmarshal([]byte(v.CalculateFormula), &tmpCalculateFormula)
  170. if err != nil {
  171. errMsg = "获取失败"
  172. err = errors.New("公式转换失败,Err:" + err.Error())
  173. return
  174. }
  175. v.DateSequenceStr = tmpCalculateFormula.DateSequenceStr
  176. v.DataSequenceStr = tmpCalculateFormula.DataSequenceStr
  177. list[k] = v
  178. }
  179. //for _, v := range list {
  180. // sheetName, startColumnName, endColumnName string, startNum, endNum int, isAll, isRow, isColumn bool, err := GetSheetStr(v.DataSequenceStr)
  181. //}
  182. //luckySheet, err, errMsg := GetCustomAnalysisExcelData(excelInfo)
  183. //if err != nil {
  184. // return
  185. //}
  186. //
  187. //// 获取excel表格数据
  188. //xlsxFile, err := luckySheet.GetExcelData()
  189. //if err != nil {
  190. // return
  191. //}
  192. //xlsxFile.Sheet[]
  193. return
  194. }
  195. // GetSheetStr
  196. // @return sheetName string 用户选择的sheet名称
  197. // @return startColumnName string 用户选择的开始列名称
  198. // @return endColumnName string 用户选择的结束列名称
  199. // @return startNum int 用户选择的开始列单元格位置
  200. // @return endNum int 用户选择的结束列单元格位置
  201. // @return isAll bool 是否选择整行/列数据
  202. // @return isRow bool 是否选择行数据
  203. // @return isColumn bool 是否选择列数据
  204. func GetSheetStr(sequenceStr string) (sheetName, startColumnName, endColumnName string, startNum, endNum int, isAll, isRow, isColumn bool, err error) {
  205. // 找出sheetName
  206. tmpList := strings.Split(sequenceStr, "!")
  207. if len(tmpList) != 2 {
  208. err = errors.New("错误的公式,查找sheet异常:" + sequenceStr)
  209. return
  210. }
  211. sheetName = tmpList[0]
  212. // 分离开始/结束单元格
  213. tmpList = strings.Split(tmpList[1], ":")
  214. if len(tmpList) != 2 {
  215. err = errors.New("错误的公式,查找开始/结束单元格异常:" + sequenceStr)
  216. return
  217. }
  218. startList := strings.Split(tmpList[0], "$")
  219. endList := strings.Split(tmpList[1], "$")
  220. lenList := len(startList)
  221. if lenList != len(endList) {
  222. err = errors.New("错误的公式,开始与结束单元格异常:" + sequenceStr)
  223. return
  224. }
  225. if lenList != 3 && lenList != 2 {
  226. err = errors.New("错误的公式:" + sequenceStr)
  227. return
  228. }
  229. startColumnName = startList[1]
  230. endColumnName = endList[1]
  231. // 长度为2的话,那说明是整行或整列
  232. if lenList == 2 {
  233. isAll = true
  234. startDeci, tmpErr1 := decimal.NewFromString(startList[1])
  235. endDeci, tmpErr2 := decimal.NewFromString(endList[1])
  236. if tmpErr1 == nil && tmpErr2 == nil {
  237. isRow = true // 正常转换的话,那么就是整行
  238. startNum = int(startDeci.IntPart())
  239. endNum = int(endDeci.IntPart())
  240. startColumnName = ``
  241. endColumnName = ``
  242. return
  243. }
  244. if tmpErr1 == nil || tmpErr2 == nil {
  245. err = errors.New("错误的公式2:" + sequenceStr)
  246. return
  247. }
  248. // 如果不能转成数字,那么就是整列
  249. isColumn = true
  250. return
  251. }
  252. // 确定行
  253. startDeci, tmpErr1 := decimal.NewFromString(startList[2])
  254. endDeci, tmpErr2 := decimal.NewFromString(endList[2])
  255. if tmpErr1 != nil && tmpErr1 != tmpErr2 {
  256. err = errors.New("错误的公式3:" + sequenceStr)
  257. return
  258. }
  259. startNum = int(startDeci.IntPart())
  260. endNum = int(endDeci.IntPart())
  261. if startColumnName != endColumnName && startNum != endNum {
  262. err = errors.New("选区不允许跨行或者跨列")
  263. }
  264. if startColumnName == endColumnName {
  265. isColumn = true // 列数据
  266. } else {
  267. isRow = true // 行数据
  268. }
  269. return
  270. }