package api import ( "box-cost/db/model" "fmt" "regexp" _ "image/gif" _ "image/jpeg" _ "image/png" "github.com/xuri/excelize/v2" ) type ReportProcessExcel struct { Offset int Row int Title string //标题 Excel *excelize.File SheetName string AlignCenterStyle int Content *model.PurchaseBill BudgetCount float64 RealCount float64 } func (b *ReportProcessExcel) drawTitle() error { marginLeft := excelize.PageMarginLeft(0.3) b.Excel.SetPageMargins(b.SheetName, marginLeft) // tileIndex := b.Offset + 1 b.Row++ startCell := fmt.Sprintf("A%d", b.Row) err := b.Excel.MergeCell(b.SheetName, startCell, fmt.Sprintf("J%d", b.Row)) if err != nil { return err } style, err := b.Excel.NewStyle(&excelize.Style{ Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"}, Font: &excelize.Font{Bold: true, Size: 18}}) if err != nil { return err } err = b.Excel.SetCellStyle(b.SheetName, startCell, startCell, style) if err != nil { return err } b.Excel.SetRowHeight(b.SheetName, b.Row, 23) b.Excel.SetCellValue(b.SheetName, startCell, b.Title) return nil } func (b *ReportProcessExcel) drawSubTitles() error { // row := b.Offset + 2 b.Row++ styleLeft, err := b.Excel.NewStyle(&excelize.Style{ Alignment: &excelize.Alignment{Horizontal: "left", Vertical: "center"}, Font: &excelize.Font{Size: 11}}) if err != nil { return err } styleRight, err := b.Excel.NewStyle(&excelize.Style{ Alignment: &excelize.Alignment{Horizontal: "right", Vertical: "center"}, Font: &excelize.Font{Size: 11}}) if err != nil { return err } var drawLeft = func(rowIndex int, value string) error { //左边1 left1Cell := fmt.Sprintf("A%d", rowIndex) err = b.Excel.MergeCell(b.SheetName, left1Cell, fmt.Sprintf("E%d", rowIndex)) if err != nil { return err } err = b.Excel.SetCellStyle(b.SheetName, left1Cell, left1Cell, styleLeft) if err != nil { return err } b.Excel.SetCellValue(b.SheetName, left1Cell, value) return nil } var drawRight = func(rowIndex int, value string) error { right1Cell := fmt.Sprintf("F%d", rowIndex) err = b.Excel.MergeCell(b.SheetName, right1Cell, fmt.Sprintf("J%d", rowIndex)) if err != nil { return err } err = b.Excel.SetCellStyle(b.SheetName, right1Cell, right1Cell, styleRight) if err != nil { return err } b.Excel.SetCellValue(b.SheetName, right1Cell, value) return nil } //第一行 drawLeft(b.Row, "类别:"+b.Content.Type) drawRight(b.Row, "单号:"+b.Content.SerialNumber) b.Excel.SetRowHeight(b.SheetName, b.Row, 21) b.Row++ //第二行 drawLeft(b.Row, "供应商名称:"+b.Content.Supplier) timeformat := b.Content.CreateTime.Local().Format("2006年01月02号 15:04:05") drawRight(b.Row, "下单时间:"+timeformat) b.Excel.SetRowHeight(b.SheetName, b.Row, 21) b.Row++ //第三行 drawLeft(b.Row, "产品名称:"+b.Content.ProductName) status := "" if b.Content.Status == "complete" { status = fmt.Sprintf("已完成(%d)", b.Content.ConfirmCount) } if b.Content.Status == "created" { status = "进行中" } drawRight(b.Row, "状态:"+status) b.Excel.SetRowHeight(b.SheetName, b.Row, 21) return nil } func (b *ReportProcessExcel) drawTableTitle() error { // row := b.Offset + 5 b.Row++ // 品名 规格 数量 单位 单价 金额 var drawCol = func(prefix string, value string) error { left1Cell := fmt.Sprintf("%s%d", prefix, b.Row) left2Cell := fmt.Sprintf("%s%d", prefix, b.Row+1) err := b.Excel.MergeCell(b.SheetName, left1Cell, left2Cell) if err != nil { return err } err = b.Excel.SetCellStyle(b.SheetName, left1Cell, left2Cell, b.AlignCenterStyle) if err != nil { return err } return b.Excel.SetCellValue(b.SheetName, left1Cell, value) } // a采购项目 b规格 c下单数量 d单位 e完成数量 f单价 g预算金额 h实际金额 i交货时间 j备注 drawCol("A", "采购项目") drawCol("B", "规格") drawCol("C", "下单数量") drawCol("D", "单位") drawCol("E", "完成数量") drawCol("F", "单价") drawCol("G", "预算金额") drawCol("H", "实际金额") drawCol("I", "交货时间") drawCol("J", "备注") return nil } func (b *ReportProcessExcel) drawTableContent() error { // row := b.Offset + 7 // b.Row = row b.Row += 2 var DrawRow = func(rowIndex int, values ...string) { charas := []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"} for i, c := range charas { v := "" if i < len(values) { v = values[i] } b.Excel.SetCellValue(b.SheetName, fmt.Sprintf("%s%d", c, rowIndex), v) val2Cel := fmt.Sprintf("%s%d", c, rowIndex) b.Excel.SetCellStyle(b.SheetName, val2Cel, val2Cel, b.AlignCenterStyle) b.Excel.SetRowHeight(b.SheetName, rowIndex, 21) } } ps := b.Content.Process if ps != nil { deliveryTime := ps.DeliveryTime.Local().Format("2006-01-02") confirmCount := "-" realAmount := "-" // 预算金额 budgetAmount := fmt.Sprintf("%.3f", b.Content.BudgetAmount) b.FormatToEmpty(&budgetAmount) // 实际完成数 confirmCount = fmt.Sprintf("%d", ps.ConfirmCount) b.FormatToEmpty(&confirmCount) // 实际金额 realAmount = fmt.Sprintf("%.3f", b.Content.RealAmount) b.FormatToEmpty(&realAmount) // a采购项目 b规格 c下单数量 d单位 e完成数量 f单价 g预算金额 h实际金额 i交货时间 j备注 orderCount := fmt.Sprintf("%d", ps.OrderCount) price := fmt.Sprintf("%.3f", ps.Price) b.FormatToEmpty(&price) DrawRow(b.Row, ps.Name, ps.Norm, orderCount, ps.Unit, confirmCount, price, budgetAmount, realAmount, deliveryTime, ps.Remark) // row++ b.Row++ b.BudgetCount += b.Content.BudgetAmount b.RealCount += b.Content.RealAmount } return nil } func (b *ReportProcessExcel) drawRemark() error { // 填备注 b.Row++ remarkTitleCell := fmt.Sprintf("A%d", b.Row) b.Excel.SetCellValue(b.SheetName, remarkTitleCell, "备注:") b.Row++ remarkContentScell := fmt.Sprintf("A%d", b.Row) // 预留五行备注内容 reg := regexp.MustCompile(`\n`) remarkRowNum := len(reg.FindAllString(b.Content.Remark, -1)) + 1 b.Row += remarkRowNum remarkContentEcell := fmt.Sprintf("J%d", b.Row) b.Excel.MergeCell(b.SheetName, remarkContentScell, remarkContentEcell) b.Excel.SetCellValue(b.SheetName, remarkContentScell, b.Content.Remark) return nil } func (b *ReportProcessExcel) Draws() { b.drawTitle() b.drawSubTitles() b.drawTableTitle() b.drawTableContent() b.drawRemark() } func NewReportProcessBill(f *excelize.File) *ReportProcessExcel { border := []excelize.Border{ {Type: "top", Style: 1, Color: "000000"}, {Type: "left", Style: 1, Color: "000000"}, {Type: "right", Style: 1, Color: "000000"}, {Type: "bottom", Style: 1, Color: "000000"}, } styleLeft, _ := f.NewStyle(&excelize.Style{ Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"}, Border: border, Font: &excelize.Font{Size: 10}, }) b := &ReportProcessExcel{ Title: "原材料采购单", SheetName: "Sheet1", Excel: f, Offset: 0, AlignCenterStyle: styleLeft, } f.SetColWidth(b.SheetName, "A", "J", 11.5) f.SetPageMargins(b.SheetName, excelize.PageMarginTop(0), excelize.PageMarginLeft(0), excelize.PageMarginRight(0)) return b } func (b *ReportProcessExcel) FormatToEmpty(str *string) { if *str == "0" || *str == "0.000" { *str = "" } } func (b *ReportProcessExcel) PrintPurchType() string { return "process report" } func (b *ReportProcessExcel) SetContent(content *model.PurchaseBill) { b.Content = content } func (b *ReportProcessExcel) SetTitle(title string) { b.Title = title } func (b *ReportProcessExcel) SetOffset(offset int) { b.Offset = offset } func (b *ReportProcessExcel) SetRow(row int) { b.Row = row } func (b *ReportProcessExcel) GetRow() int { return b.Row }