Добавил программу конвертации Excel -> JSON

main
parent 3cc7b33345
commit 5a775e7c70

@ -0,0 +1,5 @@
переменные
B: caseId # Ид случая

@ -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
)

@ -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=

@ -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")
*/

Binary file not shown.

@ -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 # Подавался ранее

@ -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))
}
Loading…
Cancel
Save