关于导出的Excel文件的本质

news/2024/7/21 5:25:05 标签: excel, 前端

上篇文章中提到关于xlsx改造冻结窗格的代码,我是怎么知道要加pane的呢,加下来就把我的心路历程记录一下。

我改造之前也是没有头绪的,我网上查了很多,只告诉我如何使用,但源码里没有针对!freeze的处理,所以即便把!freeze传过去也是无用的。于是我想既然js可以实现excel的导出,那应该有办法能实现,只是原作者写到pro版里了,那么我能不能加上呢,如何加呢?

我先贴上部分代码

// 冻结第一行和第一列:
            worksheet['!freeze'] = {
                xSplit: "0",  //冻结列
                ySplit: "1",  //冻结行
                // topLeftCell: "A2",  //在未冻结区域的左上角显示的单元格,默认为第一个未冻结的单元格
                state: "frozen"
            }

            var wbout = XLSX.write(workbook, {
                bookType: 'xlsx',
                bookSST: false,
                type: 'binary'
            })

第一步

首先我打印了wbout,发现是一个二进制文件,然后找到xlsx.write的write

// 部分代码
...
XLSX.parse_zip = parse_zip;
XLSX.read = readSync; //xlsread
XLSX.readFile = readFileSync; //readFile
XLSX.readFileSync = readFileSync;
XLSX.write = writeSync;
XLSX.writeFile = writeFileSync;
XLSX.writeFileSync = writeFileSync;
XLSX.writeFileAsync = writeFileAsync;
XLSX.utils = utils;
XLSX.writeXLSX = writeSyncXLSX;
XLSX.writeFileXLSX = writeFileSyncXLSX;
XLSX.SSF = SSF;

第二步

然后找到writeSync方法 -》 write_zip_type -》 write_zip -》write_zip_xlsx

function write_zip(wb, opts) {
	console.log('write_zip', opts.bookType)
	if(opts.bookType == "ods") return write_ods(wb, opts);
	if(opts.bookType == "numbers") return write_numbers_iwa(wb, opts);
	if(opts.bookType == "xlsb") return write_zip_xlsxb(wb, opts);
	return write_zip_xlsx(wb, opts);
}

 关键点就在write_zip_xlsx方法中

在write_zip_xlsx方法中,我们找到xl/worksheets/sheet的下面的write_ws_xml方法,

write_ws_xml方法返回的就是一段字符串,就是我们要导出的excel的内容

// 部分代码
...
var wsrels = {'!id':{}};
		var ws = wb.Sheets[wb.SheetNames[rId-1]];
		var _type = (ws || {})["!type"] || "sheet";
		switch(_type) {
		case "chart":
			/* falls through */
		default:
			f = "xl/worksheets/sheet" + rId + "." + wbext;
			zip_add_file(zip, f, write_ws_xml(rId-1, opts, wb, wsrels));
			ct.sheets.push(f);
			add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]);
		}

第三步

这里我们在write_zip_xlsx方法的xl/worksheets/sheet的下面打印一下console.log(write_ws_xml(rId-1, opts, wb, wsrels))

 这里我们可以看见返回的是一个类似xml格式的字符串

(这里我加上!freeze代码之后的打印结果,没加之前是没有<pane xSplit="0" ySplit="1" topLeftCell="undefined" activePane="undefined" state="frozen"/>这串字符的)

我们就想了excel的原理是不是就是xml格式呢,我怎么往里面添加上它能识别的标签呢??

带着疑问,我查找了下面的资料:

Excel2007格式分析和XML解析

Excel文件的本质:一个包含XML、图片文件的压缩文件夹-压缩文件-上犹电脑信息网

根据资料,我试着本地新建一个excel文件,分别一次设置冻结窗口,一个不设置,然后将文件后缀改为zip、解压,得到的目录和资料中的一致,对比两个xl/worksheets/sheet1.xml的区别,发现是<pane>标签,知道冻结窗口的标签了,接下来就简单了,我们就可以添加下面的代码了

//部分代码
...
// 冻结窗口
	var pane = null;
	var freeze = ws['!freeze'];
	console.log(freeze)

	if (freeze !== undefined) {
		pane = writextag('pane', null, {
			xSplit: freeze.xSplit, // 冻结列
			ySplit: freeze.ySplit, // 冻结行
			topLeftCell: freeze.topLeftCell, // 在未冻结区域的左上角显示的单元格,默认为第一个未冻结的单元格
			activePane: freeze.activePane,
			state: freeze.state || 'frozen'
		})
	}
	return writextag("sheetViews", writextag("sheetView", pane, sview), {});

以上就是完整的流程,改造冻结窗口只是示例,通过类似的过程,我们可以改造成我们想要的其他格式。 

 


http://www.niftyadmin.cn/n/5081967.html

相关文章

GPU服务器安装驱动、cuda和cudnn和tensorflow

系统版本兼容要求 centos7.2 cuda9.0 cudnn7.4 centos7.5 cuda9.2 cudnn7.4 安装gcc yum -y install gcc gcc-c kernel-devel package manage-overview https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#package-manager-overview 1、安装gpu显卡驱…

流程自动化如何帮助简化安全性

正如帮助开发 IT 安全最佳实践的政府机构 NIST 所说&#xff0c;人们越来越认识到网络安全是“每个人的工作”。换句话说&#xff0c;不仅仅是 IT 组织内的技术员工必须帮助预防和检测网络安全风险。组织中的每个人&#xff0c;包括没有技术或网络安全背景的员工&#xff0c;都…

graphviz 绘制二叉树

代码 digraph BalancedBinaryTree {node [fontname"Arial", shapecircle, stylefilled, color"#ffffff", fillcolor"#0077be", fontsize12, width0.7, height0.7];edge [fontname"Arial", fontsize10, color"#333333", arr…

【VR开发】【Unity】0-课程简介和概述

【说明】 这是我录制的一套VR基础开发课程的文字版本&#xff0c;更加便于快速参考。 应大家在后台所提的需求&#xff0c;从今天开始&#xff0c;我计划带给大家一套完整达40课时的VR开发基础课程。 在开始学习前需要注意如下几点&#xff1a; 本教程基于Unity2022.2.1f1版…

塑胶材料检测对激光焊机的作用

塑胶材料的激光焊接已经普遍用于各种零配件&#xff0c;而塑料的透光率是焊接工艺质量的一个重要指标。针对这类塑胶材料推出这款专门检测塑胶材料近红外透光率特性的透光率检测仪&#xff0c;对注塑件的透光率进行全画面扫描。 全球工业致力于贯彻绿色环保、节能减排发展理念&…

Ubuntu上安装、使用MongoDB详细教程

MongoDB是所有非关系型数据库中最像关系型数据库的一种存储技术&#xff0c;MongoDB中的数据结构是类似于JSON的BSON&#xff08;Binary Json&#xff09;&#xff0c;这篇文章就详细介绍如何安装和使用MongoDB。 目录 一、下载MongoDB 二、启动MongoDB 准备工作 启动方式一…

Vuex的简介,存值取值的介绍以及异步请求

一. Vuex简介 1.1 Vuex是什么 官方解释&#xff1a; Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 库。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 其实vuex就是把组件共享状态抽取出来以一个全局单例…

Linux命令(100)之sz

linux命令之sz 1.sz介绍 linux命令sz是用来把文件从Linux平台下载到Windows上 2.sz用法 sz [参数] file sz参数 参数说明-b使用binary的方式下载&#xff0c;不解释字符为ascii-y相同文件名&#xff0c;覆盖-E相同文件名&#xff0c;不会将其覆盖&#xff0c;而是会在所上传…