前端导出

2024-06-19 70℃
npm install xlsx
npm install file-saver

import * as XLSX from 'xlsx';
import { saveAs } from "file-saver";

//导出文档  markup目标dom,
export function Outword(markup, fileName) {
	var staticdata = {
		mhtml: {
			top: "Mime-Version: 1.0\nContent-Base: " + location.href + "\nContent-Type: Multipart/related; boundary=\"NEXT.ITEM-BOUNDARY\";type=\"text/html\"\n\n--NEXT.ITEM-BOUNDARY\nContent-Type: text/html; charset=\"utf-8\"\nContent-Location: " + location.href + "\n\n\n\n_html_",
			head: '',
			body: "_body_"
		}
	};
	var options = {
		maxWidth: 624
	};
	// Clone selected element before manipulating it
	//var markup = $(this).clone();

	// Remove hidden elements from the output
	//markup.each(function (item) {
	//var self = $(this);
	//if (self.is(':hidden'))
	//	self.remove();
	//});

	// Embed all images using Data URLs
	var images = Array();
	var img = markup.querySelectorAll('img');
	for (var i = 0; i < img.length; i++) {
		// Calculate dimensions of output image
		var w = Math.min(img[i].width, options.maxWidth);
		var h = img[i].height * (w / img[i].width);
		// Create canvas for converting image to data URL
		var canvas = document.createElement("CANVAS");
		canvas.width = w;
		canvas.height = h;
		// Draw image to canvas
		var context = canvas.getContext('2d');
		context.drawImage(img[i], 0, 0, w, h);
		// Get data URL encoding of image
		var uri = canvas.toDataURL("image/png");
		//$(img[i]).attr("src", img[i].src);
		img[i].src = img[i].src;
		img[i].width = w;
		img[i].height = h;
		// Save encoded image to array
		images[i] = {
			type: uri.substring(uri.indexOf(":") + 1, uri.indexOf(";")),
			encoding: uri.substring(uri.indexOf(";") + 1, uri.indexOf(",")),
			location: img[i].src,
			data: uri.substring(uri.indexOf(",") + 1)
		};
	}

	// Prepare bottom of mhtml file with image data
	var mhtmlBottom = "\n";
	for (var i = 0; i < images.length; i++) {
		mhtmlBottom += "--NEXT.ITEM-BOUNDARY\n";
		mhtmlBottom += "Content-Location: " + images[i].location + "\n";
		mhtmlBottom += "Content-Type: " + images[i].type + "\n";
		mhtmlBottom += "Content-Transfer-Encoding: " + images[i].encoding + "\n\n";
		mhtmlBottom += images[i].data + "\n\n";
	}
	mhtmlBottom += "--NEXT.ITEM-BOUNDARY--";

	//TODO: load css from included stylesheet
	var styles = "";

	// Aggregate parts of the file together
	var fileContent = staticdata.mhtml.top.replace("_html_", staticdata.mhtml.head.replace("_styles_", styles) + staticdata.mhtml.body.replace("_body_", markup.innerHTML)) + mhtmlBottom;

	// Create a Blob with the file contents
	var blob = new Blob([fileContent], {
		type: "application/msword;charset=utf-8"
	});
	saveAs(blob, fileName + ".doc");
}
//导出表格-前置处理
export function OutExcel(tableheader, tabledata, filename) {
	tableheader = Vcopy(tableheader);
	tabledata = Vcopy(tabledata);
	if (tableheader[0][0] == '选择' && tableheader[1][0] == '选择') {
		tableheader[0].splice(0, 1)
		tableheader[1].splice(0, 1)
	}
	if (tableheader[0][tableheader[0].length - 1] == '操作') {
		tableheader[0].splice(tableheader[0].length - 1, 1)
		tableheader[1].splice(tableheader[1].length - 1, 1)
	}
	let json = [tableheader[0]];
	let json2 = [tableheader[0]];
	tabledata.map(t => {
		let temp = [];
		tableheader[1].map(k => {
			temp.push(t[k]);
		})
		json.push(temp);
		if (t.checked) json2.push(temp);
	})
	export2Excel((json2.length == 1 ? json : json2), [], (filename || 'table') + new Date().getTime());
}
//json对象生成表格导出
export function export2Excel(json, fields, filename = '数据') {
	function s2ab(s) {
		if (typeof ArrayBuffer !== 'undefined') {
			var buf = new ArrayBuffer(s.length)
			var view = new Uint8Array(buf)
			for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff
			return buf
		} else {
			var buf = new Array(s.length);
			for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
			return buf;
		}
	}
	let sheetName = filename.replace(/(?!\.[^.]+$)\.|[^\w.]+/g, ''); //excel的文件名称
	if (sheetName.length > 30) sheetName = '1';
	let wb = XLSX.utils.book_new() //工作簿对象包含一SheetNames数组,以及一个表对象映射表名称到表对象。XLSX.utils.book_new实用函数创建一个新的工作簿对象。
	let ws = XLSX.utils.json_to_sheet(json, {
		header: fields,
		skipHeader: true
	}) //将JS对象数组转换为工作表。
	wb.SheetNames.push(sheetName)
	wb.Sheets[sheetName] = ws;
	let defaultCellStyle = {
		// font: {
		// 	name: "Verdana",
		// 	sz: 13,
		// 	color: "FF00FF88"
		// },
		// fill: {
		// 	fgColor: {
		// 		rgb: "FFFFAA00"
		// 	}
		// }
	}; //设置表格的样式
	let wopts = {
		bookType: 'xlsx',
		bookSST: false,
		type: 'binary',
		cellStyles: true,
		defaultCellStyle: defaultCellStyle,
		showGridLines: false
	} //写入的样式
	let wbout = XLSX.write(wb, wopts)
	let blob = new Blob([s2ab(wbout)], {
		type: 'application/octet-stream'
	})
	saveAs(blob, filename + '.xlsx')
}
//导入表格生成json对象
export function Excel2JSON(file, fn) {
	let reader = new FileReader();
	let use_utf8 = true;
	reader.onload = function (e) {
		let data = new Uint8Array(e.target.result);
		let wb = XLSX.read(data, {
			type: 'array',
			codepage: use_utf8 ? 65001 : void 0
		});
		let res = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]) || [];
		fn ? fn(res) : '';
	};
	reader.onerror = function (e) {
		fn ? fn([]) : '';
	}
	reader.readAsArrayBuffer(file);
}
//JSON对象导出JSON文件
export function saveJSON(data, filename) {
	if (!filename) filename = "json.json";
	if (typeof data === "object") {
		data = JSON.stringify(data, undefined, 4);
	}
	// 要创建一个 blob 数据
	let blob = new Blob([data], {
		type: "text/json"
	});
	let a = document.createElement("a");
	a.download = filename;
	// 将blob转换为地址
	// 创建 URL 的 Blob 对象
	a.href = window.URL.createObjectURL(blob);
	// 标签 data- 嵌入自定义属性  屏蔽后也可正常下载
	a.dataset.downloadurl = ["text/json", a.download, a.href].join(":");
	// 添加鼠标事件
	let event = new MouseEvent("click", {});
	// 向一个指定的事件目标派发一个事件
	a.dispatchEvent(event);
}
//文件下载
export function Filedownload(url, name) {
	if (!name) {
		name = url.split('/');
		name = name[name.length - 1];
	}
	let xhr = new XMLHttpRequest()
	xhr.open('GET', url)
	xhr.responseType = 'blob';
	xhr.onload = function () {
		saveAs(xhr.response, name, {})
	}
	xhr.onerror = function () {
		ElMessage.error('无法下载文件');
	}
	xhr.send();
}
标签: 编程

非特殊说明,本博所有文章均为博主原创。