首页 > 前端开发 > 正文

web前端开发合并单元格 如何使用前端表格控件SpreadJS合并拆分单元格

2023-09-01 05:58:57 | 我爱编程网

我爱编程网小编给大家带来了web前端开发合并单元格 如何使用前端表格控件SpreadJS合并拆分单元格相关文章,一起来看一下吧。

web前端开发合并单元格 如何使用前端表格控件SpreadJS合并拆分单元格

html怎么合并单元格

colspan 是合并列,rowspan是合并行,合并行的时候,比如rowspan="2",它的下一行tr会少一列;合并列的时候 colspan="2",此行的列会少一列。

代码演示:

<table border="1" style={{margin:200}}>

<tbody>

<tr>

<th colspan="2">我是占位符</th>
我爱编程网

<th colspan="2">我是占位符</th>

</tr>

<tr>

<th rowspan="2">我是占位符</th>

<th>我是占位符</th>

<th>我是占位符</th>

<th>我是占位符</th>

</tr>

<tr>

<th>我是占位符</th>

<th>我是占位符</th>

<th>我是占位符</th>

</tr>

</tbody>

</table>

演示结果

扩展资料:

rowspan规定 表头 单元格应该横跨的行数。注意: rowspan="0" 告知浏览器使单元格横跨到表格组件中的最后一个行(thead、tbody 或 tfoot)。

web前端开发合并单元格 如何使用前端表格控件SpreadJS合并拆分单元格

npm的xlsx前端导出excel怎么合并单元格呢?

创建@/vendor/Export2Excel.js:
require('script-loader!file-saver');
require('script-loader!@/vendor/Blob'); //在vendor文件加下建立Blob.js,代码在最下方
import XLSXfrom 'xlsx'

function datenum(v, date1904) {
if (date1904) v +=1462;
var epoch =Date.parse(v);
return (epoch -new Date(Date.UTC(1899,11,30))) / (24 *60 *60 *1000);
}
function sheet_from_array_of_arrays(data, opts) {
var ws = {};
var range = {s: {c:10000000,r:10000000},e: {c:0,r:0}};
for (var R =0;R != data.length; ++R) {
for (var C =0;C != data[R].length; ++C) {
if (range.s.r >R)range.s.r =R;
if (range.s.c >C)range.s.c =C;
if (range.e.r
if (range.e.c
var cell = {v: data[R][C]};
if (cell.v ==null)continue;
var cell_ref = XLSX.utils.encode_cell({c:C,r:R});
if (typeof cell.v ==='number')cell.t ='n';
else if (typeof cell.v ==='boolean')cell.t ='b';
else if (cell.v instanceof Date) {
cell.t ='n';
cell.z = XLSX.SSF._table[14];
cell.v =datenum(cell.v);
}
else cell.t ='s';
ws[cell_ref] =cell;
}
}
if (range.s.c <10000000)ws['!ref'] = XLSX.utils.encode_range(range);
return ws;
}
function Workbook() {
if (!(this instanceof Workbook))return new Workbook();
this.SheetNames = [];
this.Sheets = {};
}
function s2ab(s) {
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;
}
// 单列合并数据加工
//在tableData数据中对colName列进行加工(header:['xx','yy',...],mergeRule:[2,1,1,3,2,1...])
// 返回格式 newTableDatas = [[列头s], ["abc", "ss", "yyy", 0], [null, "xx", "y", 1], ["bca", "xxx", "yy", 1], [null, "xxx", "yy", 1]]
// 返回格式 newMergeRules = [{"e":{"r":2,"c":0}, "s":{"r":1,"c":0}},{"e":{"r":4,"c":0}, "s":{"r":3,"c":0}}]
function formatTableData(header,tableDatas,mergeRules,colIndex,colName){
var newTableDatas = [header]// 第一行为列头,
  var newMergeRules= []//加工合并规则
  var currRowIndex =1 // 因为第一行为列头所以起始为1
  var mergeIndexs = [currRowIndex]// 因为第一行为列头所以起始为1,为创建newTableDatas使用
  for(var i=0;i
var endRowIndex =currRowIndex + mergeRules[i] -1
    var merge = {"e":{"r":endRowIndex,"c": colIndex},"s":{"r":currRowIndex,"c":colIndex}}
newMergeRules.push(merge)
currRowIndex =currRowIndex + mergeRules[i]
mergeIndexs.push(currRowIndex)
}
for(var i=0;i
var currRow = tableDatas[i]
if(mergeIndexs.indexOf(i+1) === -1){
currRow[colName] =null //合并的数据 但不是第一行时,此列赋值null
    }
var newTabRow = []
for (var j in currRow) {
newTabRow.push(currRow[j])
}
newTableDatas.push(newTabRow)
}
return [newTableDatas,newMergeRules]
}


@/vendor/Blob.js:
export function export_data_to_excel(header,tableDatas,mergeRules,colIndex,colName,excelName) {
var oo =formatTableData(header,tableDatas,mergeRules,colIndex,colName);
var ranges =oo[1];
/* original data */
  var data =oo[0];
var ws_name ="SheetJS";
var wb =new Workbook(),ws =sheet_from_array_of_arrays(data);
/* add ranges to worksheet */
// ws['!cols'] = ['apple', 'banan'];
  ws['!merges'] =ranges;
/* add worksheet to workbook */
  wb.SheetNames.push(ws_name);
wb.Sheets[ws_name] =ws;
var wbout = XLSX.write(wb, {bookType:'xlsx',bookSST:false,type:'binary'});
saveAs(new Blob([s2ab(wbout)], {type:"application/octet-stream"}), excelName+".xlsx")
}

(function (view) {
"use strict";
view.URL = view.URL || view.webkitURL;
if (view.Blob && view.URL) {
try {
new Blob;
return;
}catch (e) {}
}
// Internally we use a BlobBuilder implementation to base Blob off of
// in order to support older browsers that only have BlobBuilder
    var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function(view) {
var
                get_class =function(object) {
return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
}
,FakeBlobBuilder =function BlobBuilder() {
this.data = [];
}
,FakeBlob =function Blob(data, type, encoding) {
this.data = data;
this.size = data.length;
this.type = type;
this.encoding = encoding;
}
,FBB_proto =FakeBlobBuilder.prototype
,FB_proto =FakeBlob.prototype
,FileReaderSync = view.FileReaderSync
,FileException =function(type) {
this.code =this[this.name = type];
}
,file_ex_codes = (
"NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "
                    +"NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"
                ).split(" ")
,file_ex_code =file_ex_codes.length
,real_URL = view.URL || view.webkitURL || view
,real_create_object_URL =real_URL.createObjectURL
                ,real_revoke_object_URL =real_URL.revokeObjectURL
                ,URL =real_URL
                ,btoa = view.btoa
                ,atob = view.atob
                ,ArrayBuffer = view.ArrayBuffer
,Uint8Array = view.Uint8Array
;
FakeBlob.fake =FB_proto.fake =true;
while (file_ex_code--) {
FileException.prototype[file_ex_codes[file_ex_code]] =file_ex_code +1;
}
if (!real_URL.createObjectURL) {
URL = view.URL = {};
}
URL.createObjectURL =function(blob) {
var
                    type = blob.type
                    ,data_URI_header
                    ;
if (type ===null) {
type ="application/octet-stream";
}
if (blobinstanceof FakeBlob) {
data_URI_header ="data:" +type;
if (blob.encoding ==="base64") {
return data_URI_header +";base64," + blob.data;
}else if (blob.encoding ==="URI") {
return data_URI_header +"," +decodeURIComponent(blob.data);
}if (btoa) {
return data_URI_header +";base64," +btoa(blob.data);
}else {
return data_URI_header +"," +encodeURIComponent(blob.data);
}
}else if (real_create_object_URL) {
return real_create_object_URL.call(real_URL, blob);
}
};
URL.revokeObjectURL =function(object_URL) {
if (object_URL.substring(0,5) !=="data:" &&real_revoke_object_URL) {
real_revoke_object_URL.call(real_URL, object_URL);
}
};
FBB_proto.append =function(data/*, endings*/) {
var bb =this.data;
// decode data to a binary string
                if (Uint8Array && (datainstanceof ArrayBuffer || datainstanceof Uint8Array)) {
var
                        str =""
                        ,buf =new Uint8Array(data)
,i =0
                        ,buf_len =buf.length
;
for (;i
str +=String.fromCharCode(buf[i]);
}
bb.push(str);
}else if (get_class(data) ==="Blob" ||get_class(data) ==="File") {
if (FileReaderSync) {
var fr =new FileReaderSync;
bb.push(fr.readAsBinaryString(data));
}else {
// async FileReader won't work as BlobBuilder is sync
                        throw new FileException("NOT_READABLE_ERR");
}
}else if (datainstanceof FakeBlob) {
if (data.encoding ==="base64" &&atob) {
bb.push(atob(data.data));
}else if (data.encoding ==="URI") {
bb.push(decodeURIComponent(data.data));
}else if (data.encoding ==="raw") {
bb.push(data.data);
}
}else {
if (typeof data !=="string") {
data +="";// convert unsupported types to strings
                    }
// decode UTF-16 to binary string
                    bb.push(unescape(encodeURIComponent(data)));
}
};
FBB_proto.getBlob =function(type) {
if (!arguments.length) {
type =null;
}
return new FakeBlob(this.data.join(""), type,"raw");
};
FBB_proto.toString =function() {
return "[object BlobBuilder]";
};
FB_proto.slice =function(start, end, type) {
var args =arguments.length;
if (args <3) {
type =null;
}
return new FakeBlob(
this.data.slice(start,args >1 ? end :this.data.length)
, type
,this.encoding
);
};
FB_proto.toString =function() {
return "[object Blob]";
};
FB_proto.close =function() {
this.size =this.data.length =0;
};
return FakeBlobBuilder;
}(view));
view.Blob =function Blob(blobParts, options) {
var type = options ? (options.type ||"") :"";
var builder =new BlobBuilder();
if (blobParts) {
for (var i =0,len = blobParts.length;i
builder.append(blobParts[i]);
}
}
return builder.getBlob(type);
};
}(typeof self !=="undefined" &&self ||typeof window !=="undefined" &&window ||this.content


作者:paperss
链接:

web前端开发合并单元格 如何使用前端表格控件SpreadJS合并拆分单元格

如何使用前端表格控件SpreadJS合并拆分单元格

您好,可以使用addSpan和removeSpan来实现合并与拆分单元格,
具体用法,可以参考葡萄城官方学习指南,以及葡萄城官方论坛GCDN中学习交流,
官方论坛有大量的实例,也有兢兢业业的客服会及时回复您的提问~!

以上就是我爱编程网小编给大家带来的web前端开发合并单元格 如何使用前端表格控件SpreadJS合并拆分单元格,希望能对大家有所帮助。
与“web前端开发合并单元格 如何使用前端表格控件SpreadJS合并拆分单元格”相关推荐
web前端开发中表格的合并 html怎么合并单元格
web前端开发中表格的合并 html怎么合并单元格

30个表格怎么合并到一个表格30个表格怎么合并到一个表格将30个表格文件合并到一个表中,分为四步。用PowerQuery编辑器来操作。1、首先,我们新建一个工作簿,然后进入「数据」-「获取和转换」-「新建查询」-「从文件」-「从工作簿」找到我们的表格存放路径,将其导入进来。2、我们选中表格,点击下方的「转换数据」,选中「Data」该列,点击「管理列」-「删除列」-

2023-10-13 09:46:49
web前端开发表格边框 CSS合并表格边框
web前端开发表格边框 CSS合并表格边框

前端开发应该知道的几个CSS网页表单布局技巧1、绝对定位在绝大过程中,想确定一个元素在网站当中的固定位置,绝对定位是实现这个方式的解决办法。在网页当中,绝对定位可精确的控制元素在网页当中的位置,我们可使用顶部、底部、左侧和右侧,附上一个像素值来控制元素所在的位置。position:absolute;top:50px;right:50px上面的CSS设置一个元素的位置从浏览器的顶部

2023-10-03 19:18:38
web前端开发单元格 Web前端是干嘛的
web前端开发单元格 Web前端是干嘛的

Web前端是干嘛的前端是在浏览浏览器的时候,它是网络前台的部分,运行在pc端。移动端等浏览器上展示给用户浏览的页面,利用完美的动态设计,能够给用户带来极高的用户体验。前端前端技术一般分为前端设计和前端开发,前端设计一般可以理解为网站上面的视觉设计,前端开发则是网站的前台代码实现。前端开发又最基本的三个核心,这也是必须掌握的三个重要的核心,分别是HTML、CSS、JavaScr

2023-10-12 18:38:55
web前端开发表格合并 Web前端开发需要哪些工具?
web前端开发表格合并 Web前端开发需要哪些工具?

Web前端开发主要学哪些课程?老实说,前端经过这几年的快速发展,网上的文章和教程还是蛮多的,有经验的人能够根据资料制定出属于自己的学习方法和路径,但对于小白来说,还是有些难度。知了姐来给大家分享前端学习路径。针对0基础,非科班,没有编程经验,想学前端,但是不知道如何入门的人群。基础部分:1、HTML+CSS这部分学习,可以模仿一些网站做些页面,在实践中积累经验。做

2023-10-02 16:39:17
web前端开发网页表格合并 Web前端开发需要哪些工具?
web前端开发网页表格合并 Web前端开发需要哪些工具?

Web前端开发需要哪些工具?前端开发中需要掌握最基础的技能就是HTML、CSS,JavaScript。前端的开发中,在页面的布局时,HTML将元素进行定义,CSS对展示的元素进行定位,再通过JavaScript实现相应的效果和交互,在进行开发前,需要对这些概念弄清楚,才能进行合理的开发。在网页建设的过程中,为了避免代码的繁琐杂乱,更高效快速地完成任务,就会使用到一些有代码高亮提示和语

2023-10-09 14:41:46
web前端开发定义表格怎么制作 如何开发自定义表单?
web前端开发定义表格怎么制作 如何开发自定义表单?

如何用Dreamweaver制作网页表格一、要想用Dreamweaver来制作网页,首先要安装Dreamweaver网页制作的工具,这是必备的,可以去官网里面去下载即可。二、操作步骤:【1】第一步是打开Dreamweaver工具。【2】然后在Dreamweaver选项的中,选择新建一个Html文件,这个是制作网页的前提。【3】进入Dreamweaver主界面后,我们

2023-10-11 13:38:41
前端开发web表格控件 前端的表格控件怎么根据后端代码来控制数量?
前端开发web表格控件 前端的表格控件怎么根据后端代码来控制数量?

前端的表格控件怎么根据后端代码来控制数量?首先要明确一下是控制表头数量还是表格内容数量。1.表头数量的话,要获取到表头的所有项,不要用html标签写表格,而是用js循环创建表头及表格。2.表格内容的话,可以先用html的相关标签固定好表头,获取到数据,然后循环数据,取到满意的数量在绘制到表格中。比如想要10条,for(vari=0;i<10;i++)这样。谁介绍一款比较好的表格控

2023-09-10 10:44:15
web前端开发表格如何居中 html表格居中怎么设置
web前端开发表格如何居中 html表格居中怎么设置

用html做网页的时候怎么让表格的每行中的字都居中用html做网页的时候让表格的每行中的字都居中操作如下:1、首先按照常规,输入表格的文字内容,如下图所示,整体代码如下:&lt;table&gt;&lt;p&gt;功课表&lt;/p&gt;&lt;tr&gt;&lt;th&gt;语文&lt;/th&gt;&lt;td&gt;7:00-7:40&lt;/t

2023-10-09 18:07:52