From 3af54995493d92d634e77e6b4d9ce7ce8f9db110 Mon Sep 17 00:00:00 2001 From: Wei Shen Date: Fri, 18 Aug 2023 23:07:16 +0800 Subject: [PATCH] splitxlsx: fix the error of invalid worksheet index. github.com/qax-os/excelize/issues/1617 --- CHANGELOG.md | 6 +++++- csvtk/cmd/csv2xlsx.go | 17 +++++++++++++---- csvtk/cmd/splitxlsx.go | 13 +++++++++---- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98d8e3b..b31216e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,12 @@ - [csvtk v0.27.2](https://github.com/shenwei356/csvtk/releases/tag/v0.27.2) [![Github Releases (by Release)](https://img.shields.io/github/downloads/shenwei356/csvtk/v0.27.2/total.svg)](https://github.com/shenwei356/csvtk/releases/tag/v0.27.2) - `csvtk pretty`: - - fix bug of empty first row with `-H/--no-header-row`, introduced in v0.27.0. + - fix the bug of empty first row with `-H/--no-header-row`, introduced in v0.27.0. - new style `3line` for three-line table. + - `csvtk csv2xlsx`: + - binaries compiled with go1.21 would result in a broken xlsx file. [#243](https://github.com/shenwei356/csvtk/issues/243) + - `csvtk splitxlsx`: + - fix the error of `invalid worksheet index`. [#1617](https://github.com/qax-os/excelize/issues/1617) - [csvtk v0.27.1](https://github.com/shenwei356/csvtk/releases/tag/v0.27.1) [![Github Releases (by Release)](https://img.shields.io/github/downloads/shenwei356/csvtk/v0.27.1/total.svg)](https://github.com/shenwei356/csvtk/releases/tag/v0.27.1) - `csvtk filter2/mutate2`: diff --git a/csvtk/cmd/csv2xlsx.go b/csvtk/cmd/csv2xlsx.go index d1bcd7d..a63a7f6 100644 --- a/csvtk/cmd/csv2xlsx.go +++ b/csvtk/cmd/csv2xlsx.go @@ -70,7 +70,8 @@ Attention: var col, line int var valFloat float64 var nSheets int - for _, file := range files { + var idx, firstIdx int + for i, file := range files { csvReader, err := newCSVReaderByConfig(config, file) if err != nil { if err == xopen.ErrNoContent { @@ -88,12 +89,20 @@ Attention: if singleInput { sheet = "Sheet1" + + firstIdx, err = xlsx.GetSheetIndex(sheet) + checkError(err) } else { sheet, _ = filepathTrimExtension(filepath.Base(file)) if nSheets == 1 { - xlsx.SetSheetName("Sheet1", sheet) + checkError(xlsx.SetSheetName("Sheet1", sheet)) } else { - xlsx.NewSheet(sheet) + idx, err = xlsx.NewSheet(sheet) + checkError(err) + + if i == 0 { + firstIdx = idx + } } } @@ -132,7 +141,7 @@ Attention: readerReport(&config, csvReader, file) } - xlsx.SetActiveSheet(1) + xlsx.SetActiveSheet(firstIdx) checkError(xlsx.SaveAs(outFile)) }, } diff --git a/csvtk/cmd/splitxlsx.go b/csvtk/cmd/splitxlsx.go index 6043a73..09df365 100644 --- a/csvtk/cmd/splitxlsx.go +++ b/csvtk/cmd/splitxlsx.go @@ -260,22 +260,27 @@ Weakness : Complicated sheet structures are not well supported, e.g., Keys2RowIndex[key][rowIndex] = struct{}{} } + from, err := xlsx.GetSheetIndex(sheetName) + checkError(err) + for _, key := range keysList { - index, err := xlsx.NewSheet(key) + // https://github.com/qax-os/excelize/issues/1617 + to, err := xlsx.NewSheet(key) checkError(err) - checkError(xlsx.CopySheet(sheetName2Index[sheetName], index)) + checkError(xlsx.CopySheet(from, to)) for i := len(rows) - 1; i >= 0; i-- { if i == 0 && needParseHeaderRow { continue } if _, ok = Keys2RowIndex[key][i]; !ok { - xlsx.RemoveRow(key, i) + xlsx.RemoveRow(key, i+1) } } } + log.Infof("Sheet %s is split into %d sheets", sheetName, len(keysList)) - xlsx.SetActiveSheet(sheetName2Index[sheetName]) + xlsx.SetActiveSheet(from) if config.OutFile == "-" { prefx, _ := filepathTrimExtension(files[0]) config.OutFile = fmt.Sprintf("%s.split.xlsx", prefx)