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
 | 
						|
}
 |