传奇手游开服表网站,手机优化不到80怎么办,广州品牌设计工作室,网站建设与管理收获上篇文章中提到关于xlsx改造冻结窗格的代码#xff0c;我是怎么知道要加pane的呢#xff0c;加下来就把我的心路历程记录一下。
我改造之前也是没有头绪的#xff0c;我网上查了很多#xff0c;只告诉我如何使用#xff0c;但源码里没有针对!freeze的处理#xff0c;所以…上篇文章中提到关于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 xSplit0 ySplit1 topLeftCellundefined activePaneundefined statefrozen/这串字符的 我们就想了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), {});
以上就是完整的流程改造冻结窗口只是示例通过类似的过程我们可以改造成我们想要的其他格式。