package xlsx import ( "github.com/spf13/viper" "github.com/xuri/excelize/v2" ) // XLSXRenderer handles rendering data to Excel XLSX format type XLSXRenderer struct { Config *viper.Viper } func NewXLSXRenderer(config *viper.Viper) *XLSXRenderer { return &XLSXRenderer{ Config: config, } } // Spreadsheet represents an Excel spreadsheet type Spreadsheet struct { file *excelize.File sheetName string rowIndex int } // NewSpreadsheet creates a new Excel spreadsheet func (r *XLSXRenderer) NewSpreadsheet(sheetName string) *Spreadsheet { f := excelize.NewFile() // Rename default sheet f.SetSheetName("Sheet1", sheetName) return &Spreadsheet{ file: f, sheetName: sheetName, rowIndex: 1, } } // SetHeaders sets the header row func (s *Spreadsheet) SetHeaders(headers []string) { for i, header := range headers { cell, _ := excelize.CoordinatesToCellName(i+1, s.rowIndex) s.file.SetCellValue(s.sheetName, cell, header) } s.rowIndex++ } // AddRow adds a data row func (s *Spreadsheet) AddRow(values []interface{}) { for i, value := range values { cell, _ := excelize.CoordinatesToCellName(i+1, s.rowIndex) s.file.SetCellValue(s.sheetName, cell, value) } s.rowIndex++ } // GetFile returns the underlying excelize File func (s *Spreadsheet) GetFile() *excelize.File { return s.file }