前端导出excal 插入图片

612 阅读1分钟

因产品需求 需要导出excal 并且插入图片,正常来说数据量大的话后端来搞,我这边数据量没有那么大 后端也不想搞,所以.... (测试3k条数据,5s差不多吧 ,主要有个截图的功能,差不多7-15s)、

截图 插件 html2Canvas

导出excal 插件 table-excel

导出excal 的插件地址 github.com/Zheng-Chang… api 写的非常清楚 非常棒 推荐一下,只不过插入图片的api 本人看到没那么明白,查阅文档才写出来 所以记录一下


// https://github.com/Zheng-Changfu/table-exporter#8  插件地址
	import {ElMapExportTable} from "table-excel";
export const  handleExport = function(data,Base64Image,title) {
	const column = [
		{
			title: "",
			dataIndex: "",
			children: [
				{
					title: "呼叫时间", //表头名字
					dataIndex: "ed_CrateDate" //数据的kye
				},
			]
		}
	];
		const instance = new ElMapExportTable({  
				column,
				data,
				setRowStyle({ data, columnIndex, rowIndex, type }) {
							if (type === "header" && rowIndex === 0 && columnIndex === 0) {
							  return {
								height: 200,
							  };
							}
							if (type === "main") {
							  return {
								height: 30,
							  };
							}
						  },
				setWorkSheet:  ({ worksheet, sheetIndex }) => {
						const img =	worksheet.workbook.addImage({
							  base64: Base64Image,
							  extension: 'png',
						});
                                                //tl 表格开始位置
                                                //ext 格式
                                                //editAs 位置
                                               // 具体参考   https://github.com/exceljs/exceljs/blob/master/README_zh.md#图片
						worksheet.addImage(img, {
						  tl: { col: 0, row: 0 },
						  ext: { width: 1600, height: 265 },
						  editAs: 'absolute'
						});
	
				},
			},
		);
		instance.download(title + formatDate());
}


 function formatDate(){
	let date = new Date();
	let year = date.getFullYear(); // 年
	let month = date.getMonth() + 1; // 月
	let day = date.getDate(); // 日
	let hour = date.getHours(); // 时
	hour = hour < 10 ? "0" + hour : hour; // 如果只有一位,则前面补零
	let minute = date.getMinutes(); // 分
	minute = minute < 10 ? "0" + minute : minute; // 如果只有一位,则前面补零
	let second = date.getSeconds(); // 秒
	second = second < 10 ? "0" + second : second; // 如果只有一位,则前面补零
	let nowTime  = `${year}-${month}-${day} ${hour}:${minute}:${second}`;
	return  nowTime
}

Dom 使用

       <el-button size="small" 
      element-loading-text="正在导出请等待..."
       element-loading-spinner="el-icon-loading"
       v-loading.fullscreen.lock="loading"
      @click='Excal'>导出Excel</el-button>
      
      
      <script>
	import {handleExport} from "./exportExcal.js";
	import html2Canvas from "html2canvas";
	export default {
		components: {},
		data() {
			return {
				loading:false,
				
			}
		},

		mounted() {
			
		},
		methods: {
			Excal(){
				this.loading = true;
				setTimeout(()=>{   //  不加定时器 数据量太大 loading 出不来   先让他出来再说 
					let data = []; //数据源
					let title =""  //导出表格名称
					 html2Canvas(document.getElementById("CreateCanvas")).then(async(canvas)=> {
						   let Base64Image = canvas.toDataURL("png");
						   await   handleExport(data,Base64Image,title)
						   this.loading = false;
					});
				},3000)
			}
		}
	}
</script>

效果如下

QQ截图20220614115319.png

QQ截图20220614115341.png