61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
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
|
|
}
|