l_excel_import/func.go

159 lines
4.2 KiB
Go
Raw Normal View History

2025-02-21 10:52:23 +08:00
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
}