From 981b0b205c28b52ce47e6ed8e8a46ef5e4b5bd16 Mon Sep 17 00:00:00 2001 From: Todd Date: Tue, 19 Sep 2017 20:57:39 -0400 Subject: [PATCH] demo: add csv2xlsx demo program --- cmd/csv2xlsx/main.go | 60 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 cmd/csv2xlsx/main.go diff --git a/cmd/csv2xlsx/main.go b/cmd/csv2xlsx/main.go new file mode 100644 index 00000000..57f88188 --- /dev/null +++ b/cmd/csv2xlsx/main.go @@ -0,0 +1,60 @@ +// Copyright 2017 Baliance. All rights reserved. + +package main + +import ( + "encoding/csv" + "flag" + "log" + "os" + "strconv" + "strings" + + "baliance.com/gooxml/spreadsheet" + "baliance.com/gooxml/spreadsheet/format" +) + +func main() { + flag.Parse() + if flag.NArg() != 1 { + log.Fatalf("pass a single document as a parameter") + } + f, err := os.Open(flag.Arg(0)) + if err != nil { + log.Fatalf("error opening: %s", err) + } + + cv := csv.NewReader(f) + wb := spreadsheet.New() + sheet := wb.AddSheet() + for { + rec, err := cv.Read() + if err != nil { + break + } + // one row per CSV row + row := sheet.AddRow() + for _, c := range rec { + cell := row.AddCell() + // go ahead and use SetNumber/SetString so the cell types get set + // correctly, in practice this doesn't matter too much as Excel will + // automatically treat number-like string as numbers. + if format.IsNumber(c) { + v, _ := strconv.ParseFloat(c, 64) + cell.SetNumber(v) + } else { + cell.SetString(c) + } + } + + } + + if err := wb.Validate(); err != nil { + log.Fatalf("error validating spreadsheet: %s", err) + } + + outFile := strings.Replace(flag.Arg(0), ".csv", ".xlsx", -1) + if err := wb.SaveToFile(outFile); err != nil { + log.Fatalf("error saving spreadsheet: %s", err) + } +}