vxe-table + golang后端导出excel

 vxe-table + golang后端导出excel

import XLSX from "xlsx";


    //表格导出 浏览器
    exportEvent({options}) {
      let workBook = this.exportData()
      console.log("---workBook",workBook)
      XLSX.writeFile(workBook, options.filename + '.xlsx')

    },

    //表格导出 基础
    exportData() {
      let header = this.$refs.xGrid.$el.querySelector('.body--wrapper>.vxe-table--header>thead').cloneNode(true)
      let colgroup = this.$refs.xGrid.$el.querySelector('.body--wrapper>.vxe-table--body>colgroup').cloneNode(true)
      let tbody = this.$refs.xGrid.$el.querySelector('.body--wrapper>.vxe-table--body>tbody').cloneNode(true)
      let tfoot = this.$refs.xGrid.$el.querySelector('.body--wrapper>.vxe-table--footer>tfoot').cloneNode(true)

      var main = document.body;
      var table = document.createElement("table");

      let table_id = "download_xlsx_" + random_string(5);

      table.id = table_id
      table.style.display = "none"
      main.appendChild(table)
      var download_xlsx_dom = document.getElementById(table_id)

      download_xlsx_dom.appendChild(colgroup);
      download_xlsx_dom.appendChild(header);
      download_xlsx_dom.appendChild(tbody);
      download_xlsx_dom.appendChild(tfoot);
      const workBook = XLSX.utils.table_to_book(
          download_xlsx_dom
      )
      return workBook

    },

    //表格导出 服务端
    exportsServe() {
      let workBook = this.exportData()
      let Sheet1 = workBook.Sheets.Sheet1

      //组装数据
      let excel_data = []
      let merges = []
      for (const key in Sheet1) {
        // console.log(key)
        //合并单元格数据
        if(key === "!merges"){
          merges = Sheet1["!merges"]
        }
        if(key.indexOf("!") !== -1){
          continue;
        }
        let tem = {}
        tem[key] = Sheet1[key]
        excel_data.push(tem)
        // excel_data[key] = Sheet1[key]
      }

      let post_data = []
      post_data["id"] = this.value
      post_data["merges"] = merges
      post_data["excel_data"] = excel_data
      console.log("---workBook post_data",post_data)

      report_view_save_excel_json(post_data).then(function (res) {
        console.log("---report_view_save_excel_json", res)
      })

    },

后端

// ExportExcel 导出目录下所有组件
func ExportExcel(c *gin.Context) {
	var u reportViewDelStruct
	if err := c.ShouldBind(&u); err != nil {
		common.Error(c, "", "参数获取失败")
		return
	}
	//检查数据是否存在
	regionWhere := make(map[string]string)
	regionWhere["field"] = "id"
	regionWhere["value"] = strconv.Itoa(u.ID)

	reportViewInfo, err := model.ReportViewDetail(regionWhere)
	if err != nil {
		common.Error(c, "", fmt.Sprintf("%s", err))
		return
	}

	if reportViewInfo.Id == 0 {
		common.Error(c, "", "数据不存在")
		return
	}

	//查询目录下的组件列表

	list, err := model.GetListByParentId(u.ID)
	if err != nil {
		common.Error(c, "", "数据不存在")
		return
	}

	//创建excel
	f := excelize.NewFile()

	for key, view := range list {
		buildTableExcelFile(f,key+1,view)
	}

	//删除默认工作表
	f.DeleteSheet("Sheet1")

	c.Header("Content-Type", "application/vnd.ms-excel")
	//xlsx
	c.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")

	var buffer bytes.Buffer
	if err := f.Write(&buffer); err != nil {
		common.Error(c, "", fmt.Sprintf("%s", err))
		return
	}
	r := bytes.NewReader(buffer.Bytes())
	http.ServeContent(c.Writer, c.Request, "Workbook.xlsx", time.Now(), r)

}

// 表格类型excel
func buildTableExcelFile(f *excelize.File,key int,table model.ReportView)  {
	//sheet := "Sheet"+strconv.Itoa(key)
	sheet := table.Name

	// 创建一个工作表
	index := f.NewSheet(sheet)

	//修改默认工作表
	if key == 1{
		f.SetActiveSheet(index)
	}

	if table.Type == "widgetTable"{
		excelJson := table.ExcelJson

		excelData := make(map[string]interface{})
		err := json.Unmarshal([]byte(excelJson), &excelData)
		if err != nil {
			fmt.Println(err)
			return
		}

		CellValueList := make(map[string]interface{})
		for _, val := range excelData["excel_data"].([]interface {}) {
			for callIndex, callData := range val.(map[string]interface{}) {
				CellValueList[callIndex] = callData.(map[string]interface{})["v"]
			}
		}

		for index, val := range CellValueList {
			err := f.SetCellValue(sheet, index, val)
			if err != nil {
				fmt.Println(err)
				return 
			}
		}

		//获取合并数据
		var mergesList  []map[string]string
		for _, val := range excelData["merges"].([]interface {}) {
			// val  map[e:map[c:0 r:1] s:map[c:0 r:0]]
			startLetterIndex := val.(map[string]interface{})["s"].(map[string]interface{})["c"]
			startLetter := getLetterByIndex(gconv.Int(startLetterIndex))//A、B、C

			startNumber := val.(map[string]interface{})["s"].(map[string]interface{})["r"]
			startNumber = gconv.Int(startNumber) + 1
			startNumberStr := gconv.String(startNumber)
			start := startLetter + startNumberStr

			endLetterIndex := val.(map[string]interface{})["e"].(map[string]interface{})["c"]
			endLetter := getLetterByIndex(gconv.Int(endLetterIndex))//A、B、C

			endNumber := val.(map[string]interface{})["e"].(map[string]interface{})["r"]
			endNumber = gconv.Int(endNumber) + 1
			endNumberStr := gconv.String(endNumber)
			end := endLetter + endNumberStr

			tem := make(map[string]string)
			tem["start"] = start
			tem["end"] = end

			mergesList = append(mergesList,tem)

		}

		if len(mergesList) >0 {
			for _, mergesVal := range mergesList {
				_ = f.MergeCell(sheet, mergesVal["start"], mergesVal["end"])
			}
		}

	}


}


//获取英文字母通过索引
func getLetterByIndex(index int) string {
	list := []string{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"}
	return list[index]
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值