Skip to content

Commit

Permalink
feat: $A #1 as a column name
Browse files Browse the repository at this point in the history
  • Loading branch information
ShuheiKubota committed Dec 23, 2022
1 parent 3c13fc0 commit aae61db
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 20 deletions.
49 changes: 48 additions & 1 deletion column.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ package main

import (
"path/filepath"
"strconv"
"strings"

"github.com/xuri/excelize/v2"
)

type columns []column
Expand All @@ -25,11 +28,25 @@ func newColumn(s string, typ colType, format string) column {
return c
}

func (cc columns) findByName(sheet, name string) int {
func (cc columns) findByName(sheet, name string, optColNum ...int) int {
if cc == nil {
return -1
}

colNameAlpha := ""
colNameNum := ""
if len(optColNum) > 0 {
colNameNum = "#" + strconv.Itoa(optColNum[0])

var err error
colNameAlpha, err = excelize.ColumnNumberToName(optColNum[0])
if err == nil {
colNameAlpha = "$" + colNameAlpha
} else {
colNameAlpha = ""
}
}

sheet = strings.ToLower(sheet)
name = strings.ToLower(name)

Expand All @@ -39,20 +56,50 @@ func (cc columns) findByName(sheet, name string) int {
return i
}
}
for i, c := range cc {
if strings.EqualFold(c.Name, colNameAlpha) && strings.EqualFold(c.Sheet, sheet) {
return i
}
}
for i, c := range cc {
if strings.EqualFold(c.Name, colNameNum) && strings.EqualFold(c.Sheet, sheet) {
return i
}
}

// name:exact, sheet:wildcard
for i, c := range cc {
if strings.EqualFold(c.Name, name) && wildcardMatch(c.Sheet, sheet) {
return i
}
}
for i, c := range cc {
if strings.EqualFold(c.Name, colNameAlpha) && wildcardMatch(c.Sheet, sheet) {
return i
}
}
for i, c := range cc {
if strings.EqualFold(c.Name, colNameNum) && wildcardMatch(c.Sheet, sheet) {
return i
}
}

// name:exact, sheet:empty
for i, c := range cc {
if strings.EqualFold(c.Name, name) && strings.EqualFold(c.Sheet, "") {
return i
}
}
for i, c := range cc {
if strings.EqualFold(c.Name, colNameAlpha) && strings.EqualFold(c.Sheet, "") {
return i
}
}
for i, c := range cc {
if strings.EqualFold(c.Name, colNameNum) && strings.EqualFold(c.Sheet, "") {
return i
}
}

// name:wildcard, sheet:exact
for i, c := range cc {
Expand Down
36 changes: 17 additions & 19 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,11 @@ func (c globalCmd) makeOutputContext(orig *outputContext, xlsxfile *excelize.Fil

oc.hints = append(oc.hints, col)
}
/*
for _, h := range oc.hints {
log.Println(h)
}
*/

oc.datePtns = translateDatePatterns(c.DateFmt)
oc.timePtns = translateTimePatterns(c.TimeFmt)
Expand Down Expand Up @@ -202,7 +207,7 @@ func (c globalCmd) runOneCSV(oc outputContext) error {

csvrindex := 0
xlsxrindex := 0
columns := columns{}
columns := []string{}

for {
fields, err := r.Read()
Expand All @@ -214,14 +219,7 @@ func (c globalCmd) runOneCSV(oc outputContext) error {

if csvrindex == c.Header-1 {
for cindex := range fields {
colname := strings.TrimSpace(fields[cindex])
var col column
if i := oc.hints.findByName(sheet, colname); i != -1 {
col = oc.hints[i]
} else {
col = newColumn(sheet+"!"+colname, typeUnknown, "")
}
columns = append(columns, col)
columns = append(columns, strings.TrimSpace(fields[cindex]))
}

err := writeXlsxHeader(oc.xlsxfile, sheet, xlsxrindex, fields)
Expand All @@ -242,21 +240,15 @@ func (c globalCmd) runOneCSV(oc outputContext) error {
return err
}

var col column
if i := oc.hints.findByName(sheet, colName); i != -1 {
col = oc.hints[i]
} else {
col = newColumn(sheet+"!"+colName, typeUnknown, "")
}
columns = append(columns, col)
columns = append(columns, "$"+colName)
}

for cindex, value := range fields {
g := columns[cindex]
colName := columns[cindex]

addr, err := excelize.CoordinatesToCellName(cindex+1, xlsxrindex+1)
if err != nil {
return fmt.Errorf("%v: %v\n", g.Name, err)
return fmt.Errorf("%v: %v\n", colName, err)
}

if len(value) == 0 {
Expand All @@ -272,7 +264,13 @@ func (c globalCmd) runOneCSV(oc outputContext) error {
continue
}

typ, ival := c.guess(value, g, oc.datePtns, oc.timePtns)
hindex := oc.hints.findByName(sheet, colName, cindex+1)
col := column{}
if hindex != -1 {
col = oc.hints[hindex]
}

typ, ival := c.guess(value, col, oc.datePtns, oc.timePtns)

err = writeXlsx(oc.xlsxfile, sheet, addr, typ, ival, oc.numberStyle, oc.dateStyle, oc.timeStyle, oc.datetimeStyle)
if err != nil {
Expand Down

0 comments on commit aae61db

Please sign in to comment.