js导出excel表格兼容性(表格报错原因及解决方案)
一、spreadjs 简介
spreadjs 是一款基于 html5 的纯 javascript 电子表格和网格功能控件,以“高速低耗、纯前端、零依赖”为产品特色,可嵌入任何操作系统,同时满足 .net、java、响应式 web 应用及移动跨平台的表格数据处理和类 excel 的表格应用开发,为终端用户带来亲切的 excel 体验。
本文将以 xlsx 文件格式为例,展示如何使用 spreadjs 实现前端导入和导出excel文件。
- spreadjs 官网
- 本文在线demo示例
- 导入导出excel视频演示
1. 主要功能
a. 功能、ui 与 excel 高度类似
b. 兼容 450 种以上的 excel 公式
c. 符合 umd 规范,可按需加载
d. 完善的数据可视化,支持形状、图表、迷你图
e. 纯前端导入、导出 excel 文件
f. 使用 html5 图形(canvas)绘制界面,具备高性能和响应速度
2. 安装包目录结构
├── spread.sheets spreadjs产品包
│ └── designer spreadjs 表格设计器
│ ├── spread.sheets-designer.12.0.0.appimage [mac]
│ ├── spread.sheets-designer.12.0.0.dmg [linux]
│ └── spread.sheets-designer.12.0.0 [windows]
│ └── spread.sheets.docs.12.0.0 spreadjs 表格接口文档
│ ├── content
│ └── index
│ └──
spread.sheets.release.12.0.0 spreadjs 表格 javascript 库/演示用例
│ ├── css 样式文件
│ ├── definition ts 引用文件
│ ├── readme
│ ├── samples 示例代码(包括原生js,angular,vue,react)
│ ├── scripts js文件
│ ├── grapecity-eula
│ └── license
3. 如何使用
a. spread.sheets不依赖任何第三方组件。它只需要引用下列文件:
gc.spread.sheets.xx.x.x.css,gc.spread.sheets.all.xx.x.x.min.js。
<link rel=”stylesheet” href=”gc.spread.sheets.xx.x.x.css” />
<script src=”gc.spread.sheets.all.xx.x.x.min.js” type=”text/javascript”></script>
<script src=”gc.spread.sheets.resources.zh.xx.x.x.min.js” type=”text/javascript”></script>
b. 在页面的body元素中添加一个dom元素作为它的容器。
<div id=”ss” style=”width:100%; height:360px;border: 1px solid gray;”></div>
c. 用代码“new gc.spread.sheets.workbook(document.getelementbyid(‘ss’), { sheetcount: 1 })”来初始化spread。
window.onload = function () {
var spread = new gc.spread.sheets.workbook(document.getelementbyid(‘ss’), { sheetcount: 1 });
};
d. 初始化 spreadjs 在线示例
二、前端导入导出excel
实现前端导入导出只需要引入 gc.spread.excelio 库,使用 excelio.open 和 excelio.save 两个方法即可,不需要配置任何选项,代码十分简洁易懂。
具体步骤如下:
前端导入导出支持将 spread json 导出为excel文件(.xlsx)和将 excel 文件导入为 spread json.
- 使用前端导入导出, 你需要将相关的js文件添加的 document 的 head 区域。例如:
<head>
…
<script src=’…/spreadjs/gc.spread.sheets.all.x.xx.xxxxx.x.min.js’ type=’text/javascript’></script>
<script src=’…/spreadjs/plugins/gc.spread.excelio.x.xx.xxxxx.x.min.js’ type=’text/javascript’></script>
</head>
- 初始化 workbook 实例和 excelio 实例:
var spread = new gc.spread.sheets.workbook(document.getelementbyid(‘ss’));
var excelio = new gc.spread.excel.io();
- 接下来你就可以使用 open 方法将 excel 文件导入为 spread json,使用 save 方法将 spread json 导出为excel文件。例如:
//import excel file to spread.sheets json
excelio.open(excelfile, function (json) {
var workbookobj = json;
workbook.fromjson(workbookobj);
}, function (e) {
// process error
console.log(e);
});
//export spread.sheets json to excel file
excelio.save(json, function (blob) {
//do whatever you want with blob
//such as you can save it
}, function (e) {
//process error
console.log(e);
});
- 同时,你还可打开或保存一个带有密码保护的 excel 文件,只需要在 open 和 save 方法中传入参数 options{password:xxxx} 即可。例如:
//import excel file to spread.sheets json
excelio.open(excelfile, function (json) {
var workbookobj = json;
workbook.fromjson(workbookobj);
}, function (e) {
// process error
console.log(e);
},{password:xxxx});
//export spread.sheets json to excel file
excelio.save(json, function (blob) {
//do whatever you want with blob
//such as you can save it
}, function (e) {
//process error
console.log(e);
},{password:xxxx});
- 前端导入导出 excel 的示例源码及数据源下载:
- 示例源码:excelio.html
- 数据源文件:excel_data.js
三、处理单元格合并
一般来说,前端生成 excel 而不是 csv,其最主要的原因都是为了解决 csv 不能实现单元格合并的问题,假设我们要生成带有单元格格式的 excel 文件,也可以通过 spreadjs 内置属性实现:
- 调用 addspan 方法来合并指定区域的单元格, 以此来构建一个新的更大的单元格, 参见以下示例代码:
// merge cells and set label
sheet.addspan(1, 4, 1, 7);
sheet.setvalue(1, 4, “goods”);
// merge cells across multi rows (3) and columns (4)
sheet.addspan(20, 1, 3, 4);
sheet.getcell(20, 1).value(“demo”).halign.valign;
- 调用 removespan 方法来分解指定包含合并的单元格:
sheet.removespan(20, 1);
workbook的 allowuserdragmerge 选项表明是否允许通过鼠标拖拽来合并单元格。把 allowuserdragmerge 改为 true,在选择区域边缘处会出现一个特殊的标记。
// default value is false
spread.options.allowuserdragmerge = true;
备注: 确定你要展现在合并单元格中的信息在合并前处于合并区域的最左上单元格, 合并单元格中的其他单元格信息将被隐藏, 直到合并信息被分解(与 excel 相同)。
处理单元格合并的示例源码及数据源下载:cellspan.html
四、自定义 excel 的文件样式
spread.sheets 提供一个样式的类, 其中包含很多可配置属性, 如前景色、背景色等。
- 你可以通过这些属性,构造一个样式并设置不同的参数, 示例代码如下:
var style = new gc.spread.sheets.style();
style.backcolor = ‘red’;
style.forecolor = ‘green’;
style.isverticaltext = ‘true’;
- 同样,你也可以将此样式设置给单元格, 行, 或者列:
//set style to cell.
sheet.setstyle(5, 5, style, gc.spread.sheets.sheetarea.viewport);
//set style to row.
sheet.setstyle(5, -1, style, gc.spread.sheets.sheetarea.viewport);
//set style to column.
sheet.setstyle(-1, 5, style, gc.spread.sheets.sheetarea.viewport);
样式在不同的层级结构中具有不同的优先级别: 单元格 > 行 > 列。
spread.sheets 支持给样式设置一个名称, 并将这个命名过的样式加入到表单的名称样式集合中。这样让样式的使用和管理更方便。
- 你可以构造一个名称样式, 并将此样式添加到表单或者 spread 控件的名称样式集合中,如:
var style = new gc.spread.sheets.style();
style.name = ‘style1’;
style.backcolor = ‘red’;
//add to sheet’s named style collection.
sheet.addnamedstyle(style);
//add to spread’s named style collection.
spread.addnamedstyle(style)
- 当名称样式添加到表单名称样式集合中后, 可以通过样式的名称找到它:
sheet.getnamedstyle(‘style1’);
spread.getnamedstyle(‘style1’)
- 如果名称样式不再使用, 你也可以将其从名称集合中删除掉:
sheet.removenamedstyle(‘style1’);
spread.removenamedstyle(‘style1’)
自定义excel文件样式的示例源码:style.html
五、数据绑定
spread.sheets 支持绑定数据源到表单(绑定类型有表单级别绑定和单元格级别绑定两种。)
- 你可以使用 setdatasource 和 getdatasource 方法来设置获取数据源。 在设置数据源之前, 你可以使用 autogeneratecolumns 方法来控制是否自动生成绑定列。 例如:
var customers = [
{ id:0, name:’a’, info1:’info0′ },
{ id:1, name:’b’, info1:’info1′ },
{ id:2, name:’c’, info1:’info2′ },
];
sheet.autogeneratecolumns = true;
sheet.setdatasource(customers);
你也可以使用 getdataitem 方法来获取指定行的数据信息。
- 你按照如下方式将数据字段绑定到指定的列:
var datasource = [
{ name: ‘alice’, age: 27, birthday: ‘1985/08/31’, position: ‘pm’ }
];
// bindcolumn one by one
var namecolinfo = { name: ‘name’, displayname: ‘display name’, size: 70 };
var agecolinfo = { name: ‘age’, displayname: ‘age’, size: 40, resizable: false };
var birthdaycolinfo = { name: ‘birthday’, displayname: ‘birthday’, formatter: ‘d/m/yy’, size: 120 };
var positioncolinfo = { name: ‘position’, displayname: ‘position’, size: 50, visible: false };
sheet.autogeneratecolumns = false;
sheet.setdatasource(datasource);
sheet.bindcolumn(0, namecolinfo);
sheet.bindcolumn(1, birthdaycolinfo);
sheet.bindcolumn(2, agecolinfo);
sheet.bindcolumn(3, positioncolinfo);
// or use bindcolumns to bind all custom columns
var colinfos = [
{ name: ‘position’, displayname: ‘position’, size: 50, visible: false },
{ name: ‘name’, displayname: ‘display name’, size: 70 },
{ name: ‘birthday’, displayname: ‘birthday’, formatter: ‘d/m/yy’, size: 120 },
{ name: ‘age’, displayname: ‘age’, size: 40, resizable: false },
];
sheet.autogeneratecolumns = false;
sheet.setdatasource(datasource);
sheet.bindcolumns(colinfos);
数据绑定的示例源码:sheetlevelbinding.html
以上就是使用 spreadjs,实现前端导入和导出 excel 文件的具体步骤和示例代码,其他如 excel 公式、图表、条件格式、json 序列化与反序列化、状态栏等功能,可以在 spreadjs 官网了解更多。
点击了解更多可查看本文在线 demo 示例。
关于葡萄城
赋能开发者!葡萄城公司成立于 1980 年,是全球领先的集开发工具、商业智能解决方案、管理系统设计工具于一身的软件和服务提供商。西安葡萄城是其在中国的分支机构,面向全球市场提供软件研发服务,并为中国企业的信息化提供国际先进的开发工具、软件和研发咨询服务。葡萄城的控件和软件产品在国内外屡获殊荣,在全球被数十万家企业、学校和*机构广泛应用