import ( "os" //"fmt" "strconv" "math" "encoding/json" "github.com/go-yaml/yaml" "github.com/xuri/excelize/v2" ) type Config struct { FileName string `yaml:"file"` SheetName string `yaml:"sheet"` StartRow int `yaml:"start"` Columns map[string]string `yaml:"columns"` } // Чтение конфига func readConfig() Config { f := os.Open("tsa.yaml")! defer f.Close() cfg := Config{} decoder := yaml.NewDecoder(f) decoder.Decode(&cfg)! return cfg } // Получаем все строки листа func readExcel(filename, sheetname string) [][]string { f := excelize.OpenFile(filename)! defer f.Close() rows := f.GetRows(sheetname)! return rows } func getColumnName(cols map[string]string, col int) string { if col < 1 || col > 21 { echo `Столбец: ${col} вне диапазона столбцов` os.Exit(0) } type ColsMap struct { num int str string } colsmap := []string { " ","A","B","C","D","E","F","G","H","I", "J","K","L","M","N","O","P","Q","R","S", "T", "U"} return cols[colsmap[col]] } func convert2int (s string) int64 { f := strconv.ParseFloat(s, 64)! n := int64(f) // отбрасываем дробную часть return n } // ====================== основная программа ==================== cfg := readConfig() rows := readExcel(cfg.FileName, cfg.SheetName) echo "Всего ${len(rows)} строк" var dbValues = []map[string]string{} for row <- rows[cfg.StartRow-1:2] { rowValues := make(map[string]string) for col, val <- row { colname := getColumnName(cfg.Columns, col+1) // преобразуем в целое if colname == "caseId" || colname == "policyNumber" { val = sprintf("%d", convert2int(val)) } // не определенные столбцы пропускаем if colname != "" { rowValues[colname] = val } echo `${col} [${colname}]: ${val}` } dbValues = append(dbValues, rowValues) //printf "[%4d]: %v\n", line, row } //echo dbValues b := json.Marshal(dbValues)! // для красоты: //pretty := json.MarshalIndent(dbValues, "", " ")! echo string(b) //echo string(pretty) /* rowsToRemove := []int{} bkColor := "" groupColor := "без цвета" newGroup := false newContent := "" firstCell := "" // первая строка группы -> ячейка для замены cellName := "" for line, row <- rows if len(row) > 0 { cellName = excelize.CoordinatesToCellName(8, line+1)! //H1..H13.. styleID := f.GetCellStyle(sheetName, cellName)! style := f.GetStyle(styleID)! fillColor := style.Fill.Color // это слайс строк с цветами заливки if len(fillColor) > 0 { bkColor = fillColor[0] } else { bkColor = "без цвета" } if bkColor != groupColor { groupColor = bkColor newGroup = true // меняем значение для предыдущей группы f.SetCellValue(sheetName, firstCell, newContent) firstCell = cellName // запоминаем ячейку, которую потом будем менять newContent = f.GetCellValue(sheetName, cellName)! // .. и ее содержимое } else { newGroup = false newContent += ", " + f.GetCellValue(sheetName, cellName)! } if !newGroup { // строка не первая в группе - удаляем rowsToRemove = append(rowsToRemove, line) } printf "%v %s, %d [%d] = %#v\n", bkColor, cellName, line, len(row), row } // меняем значение для последней группы f.SetCellValue(sheetName, firstCell, newContent) newContent = f.GetCellValue(sheetName, cellName)! // .. и ее содержимое //rowsToRemove = append(rowsToRemove, 3) echo "удаляемые строки:", rowsToRemove // Удаляем строки в обратном порядке (снизу вверх) // первую строку не удаляем! for i := len(rowsToRemove) - 1; i >= 1; i-- { row := rowsToRemove[i] + 1 f.RemoveRow(sheetName, row)! //echo "Удалена строка", row } f.SaveAs("result.xlsm") */