/* 导出excel文件 */

/**
 * 导出excel文件实现思路分析
 *
 * 1.通过XLSX插件的 XLSX.utils.book_new()方法，创建excel工作蒲对象wb。
 * 2.按需插入第一行数据，通过数组的unshift()方法。
 * 3.通过XLSX.utils.json_to_sheet(),创建excel表格对象ws。
 * 4.通过json_to_array(key，data),结合自定义的字段名key，和数据记录data，生成新数组。
 * 5.通过auto_width(),对ws和新生成的数组，自动计算各列col宽。
 * 6.通过XLSX.utils.book_append_sheet(),生成实际excel工作蒲，并使用XLSX.writeFile()生成excel文件。
 */

// 不能用！！！！！！真的坑，我是服了
//  import XLSX from 'xlsx'

 import * as XLSX from 'xlsx'
 import _ from 'lodash'

 // 自动计算col列宽
 function auto_width (ws, data) {
   /*set worksheet max width per col*/
   const colWidth = data.map(row => row.map(val => {
     /*if null/undefined*/
     if (val == null) {
       return { 'wch': 10 }
     }
     /*if chinese*/
     else if (val.toString().charCodeAt(0) > 255) {
       return { 'wch': val.toString().length * 2 }
     } else {
       return { 'wch': val.toString().length }
     }
   }))
   /*start in the first row*/
   let result = colWidth[0]
   for (let i = 1; i < colWidth.length; i++) {
     for (let j = 0; j < colWidth[i].length; j++) {
       if (result[j]['wch'] < colWidth[i][j]['wch']) {
         result[j]['wch'] = colWidth[i][j]['wch']
       }
     }
   }
   ws['!cols'] = result
 }

 // 将json数据转换成数组
 function json_to_array (key, jsonData) {
   return jsonData.map(v => key.map(j => {
     return v[j]
   }))
 }

 /**
  * @param header Object，表头
  * @param data Array，表体数据
  * @param key Array，字段名
  * @param title String，标题（会居中显示），即excel表格第一行
  * @param filename String，文件名
  * @param autoWidth Boolean，是否自动根据key自定义列宽度
  */
export function exportJsonToExcel({
   header,
   data,
   keys,
   title,
   filename,
   autoWidth
 }){
	 if(keys && keys.length>1){
		 for (let i = 0; i < data.length; i++)
			 data[i] = _.pick(data[i], keys)
	 }
	 //
   if (header) { //数组头部新增表头（重命名
     data.unshift(header)
   }
   // if (title) {
   //   data.unshift(title)
   // }

	 //创建book
	 const wb = XLSX.utils.book_new()
	 //json转sheet
   const ws = XLSX.utils.json_to_sheet(data, {
     header:[],// keys,
     skipHeader: true,//跳过输出原表头
   })

	 //导出表格有多少列,同EXCEL的命名一致，这里是三列
	 // var sheetTable = ["A","B","C","E","F",'G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',"AA","AB","AC","AE","AF",'AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR'];
	 // for (var j = 0; j < sheetTable.length; j++) {
		// 	 var sheetHead = sheetTable[j];
		// 	 for (var i = 0; i < data.length; i++) {
		// 			 var rowname = i + 1;
		// 			 var sheetName = sheetHead + "" + rowname;
		// 			 // console.log(sheetName,ws[sheetName].s)
		// 			 //设置相关单元格居中显示，和自适应还可以设置其他属性
		// 			 ws[sheetName].s = { alignment: { vertical: "center", horizontal: "center",wrapText:true } };
		// 	 }
	 // }

	//
	console.log(ws)
	for (let cell in ws){
		console.log(ws[cell])
		if(cell!='!ref')
			ws[cell].z="[=0]\"\""
	}
	// ws['AA2'].z="[=0]\"\""
	//ws["!cols"]设置列
	//ws['!rows']
	//ws['!merges']:合并单元格
	// ws["!cols"] = [{ wpx: 80 }, { wpx: 80 }];

	//设置自动列宽
	if (autoWidth) {
		const arr = json_to_array(keys, data)
		auto_width(ws, arr)
	}
	XLSX.utils.book_append_sheet(wb, ws, filename)
	XLSX.writeFile(wb, filename + '.xlsx')
}
