最近公司有一个新的需要,须要对一个列表进行在线编辑并导出.然而咱们也没有在线编辑excel的教训,所以就找了一个网上比拟火的x-spreadsheet的js库. 原文地址. 不得不说这个11k的我的项目的弱小.然而工具栏也忒少了.我想要的导出也没有.无奈之下,只能clone源码来进行二次开发了.上面记录我的开发过程以及次要批改的js文件.
目录
├── algorithm // 算法├── canvas // 画图├── component // 组件│ ├── toolbar // 工具栏├── core // 外围代码├── index.less // 入口css└── locale // 国际化
咱们先大略理解一下目录,这次次要是工具栏.所以就得先解决一下工具栏的代码.
减少工具栏图标
理解了目录,咱们间接参考一个redo.js间接搞一个.
// component/toolbar
import IconItem from './icon_item';export default class Save extends IconItem { constructor() { super('save', 'Ctrl+S'); }}
在component/toolbar/index.js中间接引入
import Save from './save';this.saveEl = new Save(), // 99行
这样就引入了咱们的js了.
解决款式
咱们引入了过后,其实咱们还没有设置对应的图标.在index.less中退出如下的语句
&.save{ left: -3 * @icon-size; top: -1 * @icon-size; }
即可减少咱们的图标展现. 所有的图标都在外层的assets目录下.
事件绑定
咱们有了这个过后,就须要绑定咱们的事件了.咱们这里次要是应用了快捷键. ctrl + s.或者点击保留也能够保留.那咱们就须要在工作表外面的keydown事件减少ctrl+s组合键.
// component/toolbar.js 138行this.saveEl = buildButtonWithIcon(`${t('toobar.save')} (Ctrl+S)`, 'save', () => this.change('save')),
这样咱们就绑定了一个save. 然而对应的解决办法还没有解决. 所以,咱们须要在this.change外面去解决这个办法. 而这个this.change则是在toolbar初始化的时候,加上的.咱们能够在sheet.js的600行左右看到如下代码
toolbar.change = (type, value) => toolbarChange.call(this, type, value);
所以,咱们只须要解决toolbarChange这个办法即可了.
// 在534行左右减少如下代码. else if (type === 'save') { this.trigger('saved', this);}
这个示意间接触发saved事件. 内部只须要监听这个事件即可了.
处理事件
xs.on('saved', function(){ // 这里书写本人的导出办法即可. });
导出的办法官网上也有. 能够参考这个链接.
https://github.com/SheetJS/sheetjs/tree/master/demos/xspreadsheet#saving-data
即可实现导出.