forked from free-lancers/electricity_bill_calc_service
		
	feat(report):完成峰谷用户抄表Excel导出功能。
This commit is contained in:
		
							
								
								
									
										108
									
								
								excel/meter_pv_template.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								excel/meter_pv_template.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,108 @@ | ||||
| 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, | ||||
| 				nil, | ||||
| 				meter.LastPeriodCritical, | ||||
| 				nil, | ||||
| 				meter.LastPeriodPeak, | ||||
| 				nil, | ||||
| 				meter.LastPeriodValley, | ||||
| 				nil, | ||||
| 				nil, | ||||
| 				nil, | ||||
| 				nil, | ||||
| 				nil, | ||||
| 			}, | ||||
| 			excelize.RowOpts{Height: 15}, | ||||
| 		); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	if err = stream.Flush(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
		Reference in New Issue
	
	Block a user