package excel import ( "electricity_bill_calc/model" "io" "github.com/xuri/excelize/v2" ) type MeterPVExcelTemplateGenerator struct { file *excelize.File } // 生成峰谷计量抄表Excel模板 func NewMeterPVExcelTemplateGenerator() *MeterPVExcelTemplateGenerator { return &MeterPVExcelTemplateGenerator{ file: excelize.NewFile(), } } func (MeterPVExcelTemplateGenerator) titles() []interface{} { return []interface{}{ "序号", "用户名称", "户址", "电表编号", "倍率", "上期表底(总)", "本期表底(总)", "上期表底(尖峰)", "本期表底(尖峰)", "上期表底(峰)", "本期表底(峰)", "上期表底(谷)", "本期表底(谷)", "退补电量(总)", "退补电量(尖峰)", "退补电量(峰)", "退补电量(谷)", } } func (t *MeterPVExcelTemplateGenerator) Close() { t.file.Close() } func (t MeterPVExcelTemplateGenerator) WriteTo(w io.Writer) (int64, error) { return t.file.WriteTo(w) } func (t *MeterPVExcelTemplateGenerator) WriteMeterData(meters []model.EndUserDetail) error { defaultSheet := t.file.GetSheetName(0) stream, err := t.file.NewStreamWriter(defaultSheet) if err != nil { return err } firstCell, err := excelize.CoordinatesToCellName(1, 1) if err != nil { return err } stream.SetColWidth(2, 4, 20) stream.SetColWidth(6, 17, 15) stream.SetRow(firstCell, t.titles(), excelize.RowOpts{Height: 20}) for index, meter := range meters { firstCell, err := excelize.CoordinatesToCellName(1, index+2) if err != nil { return err } customerName := "" if meter.CustomerName != nil { customerName = *meter.CustomerName } customerAddress := "" if meter.Address != nil { customerAddress = *meter.Address } if err = stream.SetRow( firstCell, []interface{}{ meter.Seq, customerName, customerAddress, meter.MeterId, meter.Ratio, meter.LastPeriodOverall, meter.CurrentPeriodOverall, meter.LastPeriodCritical, meter.CurrentPeriodCritical, meter.LastPeriodPeak, meter.CurrentPeriodPeak, meter.LastPeriodValley, meter.CurrentPeriodValley, meter.AdjustOverall, meter.AdjustCritical, meter.AdjustPeak, meter.AdjustValley, }, excelize.RowOpts{Height: 15}, ); err != nil { return err } } if err = stream.Flush(); err != nil { return err } return nil }