如何通过SpreadJS导入单独的Sheet

众所周知,SpeadJS是一款纯前端的类Excel控件,可以导入导出Excel。但是往往用户有这样的需求,需要将不同Excel之间的Sheet合并到一个工作簿中。这时候往往束手无策,其实SpreadJS稍微进行一下扩展,就可以支持这样的功能了。接下来,让我们一步一步来实现这样的功能。

发布于 2018/01/31 00:00

众所周知,SpeadJS是一款纯前端的类Excel控件,可以导入导出Excel。但是往往用户有这样的需求,需要将不同Excel之间的Sheet合并到一个工作簿中。这时候往往束手无策,其实SpreadJS稍微进行一下扩展,就可以支持这样的功能了。接下来,让我们一步一步来实现这样的功能。

环境准备

首先添加相关的JS,CSS引用以及部署授权

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>Spread HTML Page</title>

    <link href="http://cdn.grapecity.com/spreadjs/hosted/css/gc.spread.sheets.excel2013white.10.3.1.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="http://cdn.grapecity.com/spreadjs/hosted/scripts/gc.spread.sheets.all.10.3.1.min.js"></script>
    <script type="text/javascript" src="http://cdn.grapecity.com/spreadjs/hosted/scripts/interop/gc.spread.excelio.10.3.1.min.js"></script>

</head>
</body>
</html>
<script>
    GC.Spread.Sheets.LicenseKey = "<Your Deployment Key>";
</script>

之后设置承载spread的div,注意这里需要设置两个一个是隐藏起来不显示的。

<body>
    <div id="hiddenWorkbook" style="display:none; width: 800px; height: 600px; border: 1px solid gray"></div>
    <div id="ss" style="width: 800px; height: 600px; border: 1px solid gray"></div>
</body>

初始化Spread

var hiddenWorkbook, excelIO, spread;
window.onload = function () {
    excelIO = new GC.Spread.Excel.IO();
    hiddenWorkbook = new GC.Spread.Sheets.Workbook(document.getElementById("hiddenWorkbook"));
    spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"));
}

导入相关实现

首先,我们需要建立相关导入��按钮

<input type="file" name="files[]" id="fileDemo" accept=".xlsx,.xls" />
<input type="button" id="loadExcel" value="Import" onclick="ImportFileStart()" />

之后创建相关逻辑

function ImportFileStart() {
    var excelFile = document.getElementById("fileDemo").files[0];
    excelIO.open(excelFile, function (json) {
        var workbookObj = json;
        hiddenWorkbook.fromJSON(workbookObj);

    }, function (e) {
        console.log(e);
    });
}

并将需要合并的Sheet所在的Excel导入至hiddenWorkbook中去。

创建后效果如下:

sjs-file-not-chosen

接下来我们需要创建一个下拉菜单来供用户选择需要导入的Sheet

<div id="sheetSelection" style="display:none;">
    <p style="display:inline">Select sheet to load: </p>
    <select id="sheetSelect" style="display:inline"></select>
</div>
function CreateSheetSelect() {
    var sheetSelectionDiv = document.getElementById('sheetSelection');
    sheetSelectionDiv.style.display = "inline";
    var dropDown = document.getElementById('sheetSelect');
    for (var s = 0; s < hiddenWorkbook.getSheetCount(); s++) {
        dropDown.options[dropDown.options.length] = new Option(hiddenWorkbook.sheets[s].name(), s);
    }     
}

之后在初始化的代码中调用该方法:

CreateSheetSelect()

 

完成效果如下图所示:

sjs-file-chosen

拷贝工作表

下面是核心内容拷贝工作表

SpreadJS本身支持通过sheet.toJSON()方法来序列化指定的工作表,但是有些样式不是设置在sheet上,而是设置在样式表中的,这时候单纯序列化sheet导出,就无法满足了。还需要将样式表中的样式循环拷贝。代码如下:

function CopySheet() {
    spread.removeSheet(0);
    spread.addSheet();
    var sheetNumber = document.getElementById('sheetSelect').value;

    var sheetJson = JSON.stringify(hiddenWorkbook.getSheet(sheetNumber).toJSON());
    spread.suspendPaint();
    hiddenWorkbook.getNamedStyles().forEach(function (namedStyle) {
        spread.addNamedStyle(namedStyle);
    })
    spread.getSheet(0).fromJSON(JSON.parse(sheetJson));
    spread.resumePaint();
}

最后,让我们看看完成效果。

sjs-sheet-loaded

以上就是导入单独sheet的全部内容,完整demo的下载地址如下:

http://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=45388&page=1&extra=#pid173316

如果您对本产品感兴趣,请关注产品官网:/developer/spreadjs

关于葡萄城

葡萄城软件是专业的软件开发技术和低代码平台提供商,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。葡萄城开发技术始于1980年,40余年来始终聚焦软件开发技术,有深厚的技术积累和丰富的产品线。是业界能够同时赋能软件开发和低代码开发的企业。凭借过硬的产品能力、活跃的用户社区和丰富的伙伴生态,与超过3000家合作伙伴紧密合作,产品广泛应用于信息和软件服务、制造、交通运输、建筑、金融、能源、教育、公共管理等支柱产业。

推荐相关案例
推荐相关资源
关注微信
葡萄城社区二维码

关注“葡萄城社区”

活字格低代码二维码

关注“活字格低代码”

想了解更多信息,请联系我们, 随时掌握技术资源和产品动态