From 5a775e7c700736fd36f2f875bd42e321c1dcd902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B0=D1=82=D0=BE=D0=BB=D0=B8=D0=B9=20=D0=A2?= =?UTF-8?q?=D1=83=D1=85=D1=82=D0=B0=D1=80=D0=BE=D0=B2?= Date: Sun, 5 Oct 2025 08:02:22 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D1=83=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D0=B2=D0=B5=D1=80=D1=82=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?Excel=20->=20JSON?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .docs/val.txt | 5 ++ excel/go.mod | 22 +++++ excel/go.sum | 33 +++++++ excel/tsa.xgo | 153 ++++++++++++++++++++++++++++++++ excel/tsa.xlsx | Bin 0 -> 27604 bytes excel/tsa.yaml | 26 ++++++ excel/xgo_autogen.go | 205 +++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 444 insertions(+) create mode 100644 .docs/val.txt create mode 100644 excel/go.mod create mode 100644 excel/go.sum create mode 100644 excel/tsa.xgo create mode 100644 excel/tsa.xlsx create mode 100644 excel/tsa.yaml create mode 100644 excel/xgo_autogen.go 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 0000000000000000000000000000000000000000..408566a96e3b1e8a318bc6be493183885057b19b GIT binary patch literal 27604 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 WlI(+DPeA}o_^TK`lW@&`efmFX-&$b+ literal 0 HcmV?d00001 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)) +}