159 lines
4.2 KiB
Go
159 lines
4.2 KiB
Go
package excel_import
|
||
|
||
import (
|
||
"fmt"
|
||
"github.com/bytedance/sonic"
|
||
"os"
|
||
"regexp"
|
||
"sort"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
func importLogPath(jobName string) (string, error) {
|
||
path, err := os.Getwd()
|
||
path = fmt.Sprintf("%s/%s/%s", path, "log/import", jobName)
|
||
err = CheckDir(path)
|
||
return path, err
|
||
}
|
||
|
||
func ImportLogPathByOrder(jobName string) (string, error) {
|
||
path, err := os.Getwd()
|
||
path = fmt.Sprintf("%s/%s/%s/excel/", path, "log/import", jobName)
|
||
err = CheckDir(path)
|
||
return path, err
|
||
}
|
||
|
||
func tempFile(jobName string) string {
|
||
path, _ := os.Getwd()
|
||
path = fmt.Sprintf("%s/%s/%s.xlsx", path, "docs/import_temp", jobName)
|
||
|
||
return path
|
||
}
|
||
|
||
func CheckDir(path string) error {
|
||
// 判断目录是否存在
|
||
if _, err := os.Stat(path); os.IsNotExist(err) {
|
||
// 如果目录不存在,则创建它
|
||
err = os.MkdirAll(path, os.ModePerm)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
} else if err != nil {
|
||
// 如果Stat返回了其他错误(比如权限问题)
|
||
return err
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func SortFileWithStatus(dir string) []FileInfoStatus {
|
||
|
||
// 获取目录中的文件信息
|
||
d, _ := os.Open(dir)
|
||
defer d.Close()
|
||
files, _ := d.ReadDir(0)
|
||
|
||
var fileInfoList []FileInfoStatus
|
||
|
||
// 填充切片
|
||
for _, file := range files {
|
||
fileName := file.Name()
|
||
fileInfo, _ := file.Info()
|
||
|
||
bytes, _ := os.ReadFile(dir + "/" + fileName)
|
||
var info Task
|
||
_ = sonic.Unmarshal(bytes, &info)
|
||
times, _ := time.Parse(time.DateTime, info.Ctime)
|
||
fileInfoList = append(fileInfoList, FileInfoStatus{FileInfo: fileInfo, Status: info.Status, Time: times})
|
||
}
|
||
|
||
// 根据修改时间对切片进行排序
|
||
|
||
sort.Slice(fileInfoList, func(i, j int) bool {
|
||
return fileInfoList[i].Time.After(fileInfoList[j].Time)
|
||
})
|
||
return fileInfoList
|
||
}
|
||
|
||
// SortHeader 根据SortSlice排序,
|
||
// 这里这样设计主要是考虑在实际开发中可能会频繁的出现excel表里面插入或者删除字段,导致之后的导入数据的具体v[n]也需要跟着改的情况
|
||
// HeaderMap决定了v[n]和excel表里面的字段名之间的映射关系
|
||
// SortSlice决定了导入导出数据的顺序,里面的元素可以是HeaderMap里面的key,也可以是HeaderMap里面的value,这个取决于HeaderMap是否为nil
|
||
// HeaderMap可以为nil,如果为nil,则SortSlice里面的元素就是excel表里面的字段名,如果HeaderMap不为nil,则SortSlice里面的元素则是经过HeaderMap映射之后的值
|
||
// 严格来说这里的SortSlice应该是一个interface{}类型的切片,这里使用了string是为了方便
|
||
//***最愚蠢的事情就是为了强迫症而强迫症
|
||
//func SortHeader(header *Header) []string {
|
||
// if header.HeaderMap == nil {
|
||
// return header.SortSlice
|
||
// }
|
||
// var sortSlice []string
|
||
// for _, v := range header.SortSlice {
|
||
// if _, exist := header.HeaderMap[v]; exist {
|
||
// sortSlice = append(sortSlice, header.HeaderMap[v])
|
||
// }
|
||
// }
|
||
// return sortSlice
|
||
//}
|
||
|
||
func ExchangeRows(oldRows [][]string, setHeader []string) (rows []map[string]string) {
|
||
oldRowsHeader := oldRows[0]
|
||
oldRowsMap := make(map[string]int, len(oldRowsHeader))
|
||
for index, header := range oldRowsHeader {
|
||
oldRowsMap[header] = index
|
||
}
|
||
for _, oldRow := range oldRows {
|
||
newRow := make(map[string]string, len(setHeader))
|
||
lenOldRow := len(oldRow)
|
||
for _, header := range setHeader {
|
||
point, exist := oldRowsMap[header]
|
||
if !exist || point >= lenOldRow {
|
||
newRow[header] = ""
|
||
} else {
|
||
newRow[header] = oldRow[point]
|
||
}
|
||
}
|
||
rows = append(rows, newRow)
|
||
}
|
||
return rows
|
||
}
|
||
|
||
func ExchangeRowWithMap(oldRow map[string]string, setHeader []string) (rows []string) {
|
||
|
||
for _, header := range setHeader {
|
||
rows = append(rows, oldRow[header])
|
||
}
|
||
return rows
|
||
}
|
||
|
||
func Ter[T any](cond bool, a, b T) T {
|
||
if cond {
|
||
return a
|
||
}
|
||
return b
|
||
}
|
||
|
||
func RegexMatch(str string, pattern string) bool {
|
||
matched, err := regexp.MatchString(pattern, str)
|
||
if err != nil {
|
||
return false
|
||
}
|
||
return matched
|
||
}
|
||
|
||
// IsExcelFormat 检查是否为 Excel 相关格式
|
||
func IsExcelFormat(fileObjectUrl string) bool {
|
||
// 支持的扩展名
|
||
allowedExtensions := []string{".xls", ".xlsx", ".csv"}
|
||
|
||
// 转为小写,避免大小写问题
|
||
fileObjectUrl = strings.ToLower(fileObjectUrl)
|
||
|
||
// 遍历匹配扩展名
|
||
for _, ext := range allowedExtensions {
|
||
if strings.HasSuffix(fileObjectUrl, ext) {
|
||
return true
|
||
}
|
||
}
|
||
return false
|
||
}
|