diff --git a/.docs/val.txt b/.docs/val.txt new file mode 100644 index 0000000..35f6884 --- /dev/null +++ b/.docs/val.txt @@ -0,0 +1,5 @@ + +переменные + B: caseId # Ид случая + + \ No newline at end of file diff --git a/excel/go.mod b/excel/go.mod new file mode 100644 index 0000000..fdff8cc --- /dev/null +++ b/excel/go.mod @@ -0,0 +1,22 @@ +module tsa + +go 1.24.5 + +require ( + github.com/go-yaml/yaml v2.1.0+incompatible + github.com/qiniu/x v1.15.1 +) + +require ( + github.com/richardlehane/mscfb v1.0.4 // indirect + github.com/richardlehane/msoleps v1.0.4 // indirect + github.com/tiendc/go-deepcopy v1.6.0 // indirect + github.com/xuri/efp v0.0.1 // indirect + github.com/xuri/excelize/v2 v2.9.1 // indirect + github.com/xuri/nfp v0.0.1 // indirect + golang.org/x/crypto v0.38.0 // indirect + golang.org/x/net v0.40.0 // indirect + golang.org/x/text v0.25.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect +) diff --git a/excel/go.sum b/excel/go.sum new file mode 100644 index 0000000..068dc74 --- /dev/null +++ b/excel/go.sum @@ -0,0 +1,33 @@ +github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= +github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/qiniu/x v1.15.1 h1:avE+YQaowp8ZExjylOeSM73rUo3MQKBAYVxh4NJ8dY8= +github.com/qiniu/x v1.15.1/go.mod h1:AiovSOCaRijaf3fj+0CBOpR1457pn24b0Vdb1JpwhII= +github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= +github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= +github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= +github.com/richardlehane/msoleps v1.0.4 h1:WuESlvhX3gH2IHcd8UqyCuFY5yiq/GR/yqaSM/9/g00= +github.com/richardlehane/msoleps v1.0.4/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= +github.com/tiendc/go-deepcopy v1.6.0 h1:0UtfV/imoCwlLxVsyfUd4hNHnB3drXsfle+wzSCA5Wo= +github.com/tiendc/go-deepcopy v1.6.0/go.mod h1:toXoeQoUqXOOS/X4sKuiAoSk6elIdqc0pN7MTgOOo2I= +github.com/xuri/efp v0.0.1 h1:fws5Rv3myXyYni8uwj2qKjVaRP30PdjeYe2Y6FDsCL8= +github.com/xuri/efp v0.0.1/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= +github.com/xuri/excelize/v2 v2.9.1 h1:VdSGk+rraGmgLHGFaGG9/9IWu1nj4ufjJ7uwMDtj8Qw= +github.com/xuri/excelize/v2 v2.9.1/go.mod h1:x7L6pKz2dvo9ejrRuD8Lnl98z4JLt0TGAwjhW+EiP8s= +github.com/xuri/nfp v0.0.1 h1:MDamSGatIvp8uOmDP8FnmjuQpu90NzdJxo7242ANR9Q= +github.com/xuri/nfp v0.0.1/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= +golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= +golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= +golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= diff --git a/excel/tsa.xgo b/excel/tsa.xgo new file mode 100644 index 0000000..82c5ed6 --- /dev/null +++ b/excel/tsa.xgo @@ -0,0 +1,153 @@ +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") + +*/ \ No newline at end of file diff --git a/excel/tsa.xlsx b/excel/tsa.xlsx new file mode 100644 index 0000000..408566a Binary files /dev/null and b/excel/tsa.xlsx differ diff --git a/excel/tsa.yaml b/excel/tsa.yaml new file mode 100644 index 0000000..a40e601 --- /dev/null +++ b/excel/tsa.yaml @@ -0,0 +1,26 @@ + +file: tsa.xlsx +sheet: Лист1 +start: 2 +columns: + B: caseId # Ид случая + C: ticketNo # Нонер талона + D: patientName # ФИО пациента + E: birthDate # Дата рождения + F: policyNumber # Номер полиса + G: volumeCode # Код объема + H: finVolumeCode # Код объема_фин + I: visitCode # Код посещения + J: amount # Сумма + K: diagnosisCode # Код диагноза + L: department # Отделение + M: profile # Профиль + N: unit # Подразделение + O: doctor # Врач + P: specialty # Специальность + Q: visit # Посещение + R: yetCode # УЕТ + S: payment # Оплата + T: smo # СМО + U: prev # Подавался ранее + diff --git a/excel/xgo_autogen.go b/excel/xgo_autogen.go new file mode 100644 index 0000000..f1d9cfe --- /dev/null +++ b/excel/xgo_autogen.go @@ -0,0 +1,205 @@ +// Code generated by xgo (XGo); DO NOT EDIT. + +package main + +import ( + "encoding/json" + "fmt" + "github.com/go-yaml/yaml" + "github.com/qiniu/x/errors" + "github.com/qiniu/x/stringutil" + "github.com/xuri/excelize/v2" + "os" + "strconv" +) + +const _ = true + +type Config struct { + FileName string `yaml:"file"` + SheetName string `yaml:"sheet"` + StartRow int `yaml:"start"` + Columns map[string]string `yaml:"columns"` +} +//line tsa.xgo:20:1 +// Чтение конфига +func readConfig() Config { +//line tsa.xgo:22:1 + f := func() (_xgo_ret *os.File) { +//line tsa.xgo:22:1 + var _xgo_err error +//line tsa.xgo:22:1 + _xgo_ret, _xgo_err = os.Open("tsa.yaml") +//line tsa.xgo:22:1 + if _xgo_err != nil { +//line tsa.xgo:22:1 + _xgo_err = errors.NewFrame(_xgo_err, "os.Open(\"tsa.yaml\")", "tsa.xgo", 22, "main.readConfig") +//line tsa.xgo:22:1 + panic(_xgo_err) + } +//line tsa.xgo:22:1 + return + }() +//line tsa.xgo:23:1 + defer f.Close() +//line tsa.xgo:25:1 + cfg := Config{} +//line tsa.xgo:26:1 + decoder := yaml.NewDecoder(f) +//line tsa.xgo:27:1 + func() { +//line tsa.xgo:27:1 + var _xgo_err error +//line tsa.xgo:27:1 + _xgo_err = decoder.Decode(&cfg) +//line tsa.xgo:27:1 + if _xgo_err != nil { +//line tsa.xgo:27:1 + _xgo_err = errors.NewFrame(_xgo_err, "decoder.Decode(&cfg)", "tsa.xgo", 27, "main.readConfig") +//line tsa.xgo:27:1 + panic(_xgo_err) + } +//line tsa.xgo:27:1 + return + }() +//line tsa.xgo:28:1 + return cfg +} +//line tsa.xgo:31:1 +// Получаем все строки листа +func readExcel(filename string, sheetname string) [][]string { +//line tsa.xgo:33:1 + f := func() (_xgo_ret *excelize.File) { +//line tsa.xgo:33:1 + var _xgo_err error +//line tsa.xgo:33:1 + _xgo_ret, _xgo_err = excelize.OpenFile(filename) +//line tsa.xgo:33:1 + if _xgo_err != nil { +//line tsa.xgo:33:1 + _xgo_err = errors.NewFrame(_xgo_err, "excelize.OpenFile(filename)", "tsa.xgo", 33, "main.readExcel") +//line tsa.xgo:33:1 + panic(_xgo_err) + } +//line tsa.xgo:33:1 + return + }() +//line tsa.xgo:34:1 + defer f.Close() +//line tsa.xgo:36:1 + rows := func() (_xgo_ret [][]string) { +//line tsa.xgo:36:1 + var _xgo_err error +//line tsa.xgo:36:1 + _xgo_ret, _xgo_err = f.GetRows(sheetname) +//line tsa.xgo:36:1 + if _xgo_err != nil { +//line tsa.xgo:36:1 + _xgo_err = errors.NewFrame(_xgo_err, "f.GetRows(sheetname)", "tsa.xgo", 36, "main.readExcel") +//line tsa.xgo:36:1 + panic(_xgo_err) + } +//line tsa.xgo:36:1 + return + }() +//line tsa.xgo:37:1 + return rows +} +//line tsa.xgo:40:1 +func getColumnName(cols map[string]string, col int) string { +//line tsa.xgo:41:1 + if col < 1 || col > 21 { +//line tsa.xgo:42:1 + fmt.Println(stringutil.Concat(`Столбец: `, strconv.Itoa(col), ` вне диапазона столбцов`)) +//line tsa.xgo:43:1 + os.Exit(0) + } +//line tsa.xgo:46:1 + type ColsMap struct { + num int + str string + } +//line tsa.xgo:50:1 + colsmap := []string{" ", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U"} +//line tsa.xgo:54:1 + return cols[colsmap[col]] +} +//line tsa.xgo:57:1 +func convert2int(s string) int64 { +//line tsa.xgo:58:1 + f := func() (_xgo_ret float64) { +//line tsa.xgo:58:1 + var _xgo_err error +//line tsa.xgo:58:1 + _xgo_ret, _xgo_err = strconv.ParseFloat(s, 64) +//line tsa.xgo:58:1 + if _xgo_err != nil { +//line tsa.xgo:58:1 + _xgo_err = errors.NewFrame(_xgo_err, "strconv.ParseFloat(s, 64)", "tsa.xgo", 58, "main.convert2int") +//line tsa.xgo:58:1 + panic(_xgo_err) + } +//line tsa.xgo:58:1 + return + }() +//line tsa.xgo:59:1 + n := int64(f) +//line tsa.xgo:60:1 + return n +} +//line tsa.xgo:63 +// ====================== основная программа ==================== +func main() { +//line tsa.xgo:64:1 + cfg := readConfig() +//line tsa.xgo:65:1 + rows := readExcel(cfg.FileName, cfg.SheetName) +//line tsa.xgo:66:1 + fmt.Println(stringutil.Concat("Всего ", strconv.Itoa(len(rows)), " строк")) +//line tsa.xgo:68:1 + var dbValues = []map[string]string{} + for +//line tsa.xgo:69:1 + _, row := range rows[cfg.StartRow-1 : 2] { +//line tsa.xgo:70:1 + rowValues := make(map[string]string) + for +//line tsa.xgo:71:1 + col, val := range row { +//line tsa.xgo:72:1 + colname := getColumnName(cfg.Columns, col+1) +//line tsa.xgo:75:1 + if colname == "caseId" || colname == "policyNumber" { +//line tsa.xgo:76:1 + val = fmt.Sprintf("%d", convert2int(val)) + } +//line tsa.xgo:80:1 + if colname != "" { +//line tsa.xgo:81:1 + rowValues[colname] = val + } +//line tsa.xgo:83:1 + fmt.Println(stringutil.Concat(strconv.Itoa(col), ` [`, colname, `]: `, val)) + } +//line tsa.xgo:86:1 + dbValues = append(dbValues, rowValues) + } +//line tsa.xgo:90:1 + b := func() (_xgo_ret []byte) { +//line tsa.xgo:90:1 + var _xgo_err error +//line tsa.xgo:90:1 + _xgo_ret, _xgo_err = json.Marshal(dbValues) +//line tsa.xgo:90:1 + if _xgo_err != nil { +//line tsa.xgo:90:1 + _xgo_err = errors.NewFrame(_xgo_err, "json.Marshal(dbValues)", "tsa.xgo", 90, "main.main") +//line tsa.xgo:90:1 + panic(_xgo_err) + } +//line tsa.xgo:90:1 + return + }() +//line tsa.xgo:94:1 + fmt.Println(string(b)) +}