/
cushe
/
xlsx2json
Обзор
Документация
Войти
/
cushe
/
xlsx2json
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main.go
139 строк
3 KB
cushe
first commit
10 сен 2025, 10:52
10 сен 2025, 10:52
7055c1d
Код
Авторство
О чём код?
package main import ( "encoding/json" "flag" "fmt" "log" "os" "strings" "github.com/xuri/excelize/v2" ) type Cell struct { Addr string `json: "addr"` Value string `json: "value"` } type Rows struct { Columns map[string]string `json: "columns"` } type Datas struct { SourceName string `json:"sourceName"` PrevFile string `json: "prev"` NextFile string `json: "next"` Sheet string `json:"sheet"` Part int `json:"-"` Rows []Rows `json:"rows"` Template string `json:"-"` FileName string `json:"-"` } func saveFile(data *Datas, isLast bool) { data.FileName = newFileName(data.Template, data.Part) if data.Part == 0 { data.PrevFile = "" } else { data.PrevFile = newFileName(data.Template, data.Part-1) } if isLast { data.NextFile = "" } else { data.NextFile = newFileName(data.Template, data.Part+1) } jsonText, err := json.Marshal(data) if err != nil { log.Fatal(err) } f, err := os.Create(data.FileName) if err != nil { log.Fatal(err) } defer f.Close() f.Write(jsonText) data.Part++ } func main() { fmt.Println("xls2json -xls=filename.xls -json=filename.json -rows=10000") inputName := flag.String("xls", "", "") outputName := flag.String("json", "", "") rowPart := flag.Int("rows", 10000, "") flag.Parse() jsonData := Datas{SourceName: *inputName, PrevFile: "", NextFile: "", Template: *outputName, FileName: *outputName, Part: 0, Rows: make([]Rows, 0)} f, err := excelize.OpenFile(*inputName) if err != nil { fmt.Println("OpenFile") log.Fatal(err) return } defer func() { if err := f.Close(); err != nil { log.Fatal(err) } }() sheets := f.GetSheetList() for sheetIndex, sheet := range sheets { jsonData.Sheet = sheet rows, err := f.GetRows(sheet) if err != nil { log.Fatal(err) } jsonData.Rows = make([]Rows, min(len(rows), *rowPart)) count := 0 for rowIndex, row := range rows { jsonData.Rows[count] = Rows{Columns: make(map[string]string, len(row))} for index, cell := range row { //addr := fmt.Sprintf("R%dC%d", rowIndex+1, index+1) addr := fmt.Sprintf("%s%d", ColumnIndex(index+1), rowIndex+1) jsonData.Rows[count].Columns[addr] = cell } if rowIndex != 0 && (rowIndex+1)%*rowPart == 0 { count = 0 saveFile(&jsonData, false) jsonData.Rows = make([]Rows, min(len(rows)-rowIndex, *rowPart)) } else { count++ } } saveFile(&jsonData, len(sheets) == sheetIndex) } } func newFileName(tmpl string, index int) string { pos := strings.LastIndex(tmpl, ".") ext := tmpl[pos:] filename := tmpl[:pos] var indexStr = "" if index != 0 { indexStr = fmt.Sprintf("_%d", index) } return fmt.Sprintf("%s%s%s", filename, indexStr, ext) } func ColumnIndex(index int) string { if index == 0 { return "" } chars := "ABCDEFGHIJKLMNOPQRSTUVWXYZ" var pos int if index <= 26 { pos = index } else { pos = index % 26 } newindex := index / 26 d := ColumnIndex(newindex) + chars[pos-1:pos] return d }