feat: 增加负利润导出V2版本,合并单元格版本
This commit is contained in:
parent
6fa91e6e43
commit
ff6f97aa37
|
|
@ -117,7 +117,8 @@ func (b *BbxtTools) StatisOursProductLossSumTotal(ct []string) (err error) {
|
||||||
|
|
||||||
if len(gt) > 0 {
|
if len(gt) > 0 {
|
||||||
filePath := b.cacheDir + "/kshj_gt" + fmt.Sprintf("%d", time.Now().Unix()) + ".xlsx"
|
filePath := b.cacheDir + "/kshj_gt" + fmt.Sprintf("%d", time.Now().Unix()) + ".xlsx"
|
||||||
err = b.resellerDetailFillExcel(b.excelTempDir+"/"+"kshj_gt.xlsx", filePath, gt)
|
// err = b.resellerDetailFillExcel(b.excelTempDir+"/"+"kshj_gt.xlsx", filePath, gt)
|
||||||
|
err = b.resellerDetailFillExcelV2(b.excelTempDir+"/"+"kshj_gt.xlsx", filePath, gt)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -181,6 +181,137 @@ func (b *BbxtTools) resellerDetailFillExcel(templatePath, outputPath string, dat
|
||||||
return f.SaveAs(outputPath)
|
return f.SaveAs(outputPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 分销商负利润详情填充excel-V2
|
||||||
|
// 1.使用模板文件作为输出文件,从第二行开始填充
|
||||||
|
// 2.整体为3列:1.分销商名称(以ResellerName为分组,分销商名称列使用的样式为) 2.商品名称(p.ProductName) 3.亏损金额(p.Loss)
|
||||||
|
// 3.分销商名称列使用的样式为 A2;商品名称、亏损金额使用的样式为 B2、C2;样式包括宽高、背景、颜色等
|
||||||
|
// 4.以ResellerName分组,合并单元格
|
||||||
|
// 5.在文件末尾使用“合计”,合计行样式为模板第四行
|
||||||
|
// 6.保存为新文件
|
||||||
|
func (b *BbxtTools) resellerDetailFillExcelV2(templatePath, outputPath string, dataSlice []*ResellerLoss) error {
|
||||||
|
// 1. 读取模板
|
||||||
|
f, err := excelize.OpenFile(templatePath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
sheet := f.GetSheetName(0)
|
||||||
|
|
||||||
|
// ---------------- 样式获取 ----------------
|
||||||
|
// 模板第2行:数据行样式
|
||||||
|
tplRowData := 2
|
||||||
|
styleA2, err := f.GetCellStyle(sheet, fmt.Sprintf("A%d", tplRowData))
|
||||||
|
if err != nil {
|
||||||
|
styleA2 = 0
|
||||||
|
}
|
||||||
|
// B2和C2通常样式一致,这里取B2作为明细列样式
|
||||||
|
styleB2, err := f.GetCellStyle(sheet, fmt.Sprintf("B%d", tplRowData))
|
||||||
|
if err != nil {
|
||||||
|
styleB2 = 0
|
||||||
|
}
|
||||||
|
styleC2, err := f.GetCellStyle(sheet, fmt.Sprintf("C%d", tplRowData))
|
||||||
|
if err != nil {
|
||||||
|
styleC2 = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
rowHeightData, err := f.GetRowHeight(sheet, tplRowData)
|
||||||
|
if err != nil {
|
||||||
|
rowHeightData = 20
|
||||||
|
}
|
||||||
|
|
||||||
|
// 模板第4行:合计行样式
|
||||||
|
tplRowTotal := 4
|
||||||
|
styleTotalA, err := f.GetCellStyle(sheet, fmt.Sprintf("A%d", tplRowTotal))
|
||||||
|
if err != nil {
|
||||||
|
styleTotalA = 0
|
||||||
|
}
|
||||||
|
styleTotalB, err := f.GetCellStyle(sheet, fmt.Sprintf("B%d", tplRowTotal))
|
||||||
|
if err != nil {
|
||||||
|
styleTotalB = 0
|
||||||
|
}
|
||||||
|
styleTotalC, err := f.GetCellStyle(sheet, fmt.Sprintf("C%d", tplRowTotal))
|
||||||
|
if err != nil {
|
||||||
|
styleTotalC = 0
|
||||||
|
}
|
||||||
|
rowHeightTotal, err := f.GetRowHeight(sheet, tplRowTotal)
|
||||||
|
if err != nil {
|
||||||
|
rowHeightTotal = 30
|
||||||
|
}
|
||||||
|
// ----------------------------------------
|
||||||
|
|
||||||
|
currentRow := 2
|
||||||
|
totalLoss := 0.0
|
||||||
|
|
||||||
|
for _, reseller := range dataSlice {
|
||||||
|
// 排序 ProductLoss
|
||||||
|
var products []ProductLoss
|
||||||
|
for _, p := range reseller.ProductLoss {
|
||||||
|
products = append(products, p)
|
||||||
|
}
|
||||||
|
sort.Slice(products, func(i, j int) bool {
|
||||||
|
return products[i].Loss < products[j].Loss
|
||||||
|
})
|
||||||
|
|
||||||
|
startRow := currentRow
|
||||||
|
|
||||||
|
// 填充该经销商的所有产品
|
||||||
|
for _, p := range products {
|
||||||
|
// 设置行高
|
||||||
|
f.SetRowHeight(sheet, currentRow, rowHeightData)
|
||||||
|
|
||||||
|
// 设置值
|
||||||
|
f.SetCellValue(sheet, fmt.Sprintf("A%d", currentRow), reseller.ResellerName)
|
||||||
|
f.SetCellValue(sheet, fmt.Sprintf("B%d", currentRow), p.ProductName)
|
||||||
|
f.SetCellValue(sheet, fmt.Sprintf("C%d", currentRow), p.Loss)
|
||||||
|
|
||||||
|
// 设置样式
|
||||||
|
if styleA2 != 0 {
|
||||||
|
f.SetCellStyle(sheet, fmt.Sprintf("A%d", currentRow), fmt.Sprintf("A%d", currentRow), styleA2)
|
||||||
|
}
|
||||||
|
if styleB2 != 0 {
|
||||||
|
f.SetCellStyle(sheet, fmt.Sprintf("B%d", currentRow), fmt.Sprintf("B%d", currentRow), styleB2)
|
||||||
|
}
|
||||||
|
if styleC2 != 0 {
|
||||||
|
f.SetCellStyle(sheet, fmt.Sprintf("C%d", currentRow), fmt.Sprintf("C%d", currentRow), styleC2)
|
||||||
|
}
|
||||||
|
|
||||||
|
totalLoss += p.Loss
|
||||||
|
currentRow++
|
||||||
|
}
|
||||||
|
|
||||||
|
endRow := currentRow - 1
|
||||||
|
// 合并单元格 (如果多于1行)
|
||||||
|
if endRow > startRow {
|
||||||
|
f.MergeCell(sheet, fmt.Sprintf("A%d", startRow), fmt.Sprintf("A%d", endRow))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------- 填充合计行 ----------------
|
||||||
|
// 设置行高
|
||||||
|
f.SetRowHeight(sheet, currentRow, rowHeightTotal)
|
||||||
|
|
||||||
|
f.SetCellValue(sheet, fmt.Sprintf("A%d", currentRow), "合计")
|
||||||
|
// B列留空,C列填充总亏损
|
||||||
|
f.SetCellValue(sheet, fmt.Sprintf("C%d", currentRow), totalLoss)
|
||||||
|
|
||||||
|
// 设置合计行样式
|
||||||
|
if styleTotalA != 0 {
|
||||||
|
f.SetCellStyle(sheet, fmt.Sprintf("A%d", currentRow), fmt.Sprintf("A%d", currentRow), styleTotalA)
|
||||||
|
}
|
||||||
|
if styleTotalB != 0 {
|
||||||
|
f.SetCellStyle(sheet, fmt.Sprintf("B%d", currentRow), fmt.Sprintf("B%d", currentRow), styleTotalB)
|
||||||
|
}
|
||||||
|
if styleTotalC != 0 {
|
||||||
|
f.SetCellStyle(sheet, fmt.Sprintf("C%d", currentRow), fmt.Sprintf("C%d", currentRow), styleTotalC)
|
||||||
|
}
|
||||||
|
// 取消合并合计行的A、B列
|
||||||
|
// f.MergeCell(sheet, fmt.Sprintf("A%d", currentRow), fmt.Sprintf("B%d", currentRow))
|
||||||
|
|
||||||
|
// 6. 保存
|
||||||
|
return f.SaveAs(outputPath)
|
||||||
|
}
|
||||||
|
|
||||||
// excel2picPy 将excel转换为图片python
|
// excel2picPy 将excel转换为图片python
|
||||||
// python 接口如下:
|
// python 接口如下:
|
||||||
// curl --location --request POST 'http://192.168.6.109:8010/api/v1/convert' \
|
// curl --location --request POST 'http://192.168.6.109:8010/api/v1/convert' \
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue