您好,欢迎访问一九零五行业门户网

教你Node.js+SpreadJS从服务端生成Excel电子表格

node是一个基于chrome v8引擎的javascript运行环境,通常用于创建网络应用程序。它可以同时处理多个连接,并且不像其他大多数模型那样依赖线程。
对于 web 开发者来说,从数据库或web服务器获取数据,然后输出到excel文件以进行进一步分析的场景时有发生。我们的技术团队在跟国内外各行各业用户交流的过程中,就曾发现有很多的用户尝试在node.js的环境下运行spreadjs 纯前端表格控件,借助该控件,可以在服务器不预装任何excel依赖项的情况下,收集用户输入的信息,并将其自动导出到excel文件中。
为了满足广大技术爱好者的需要,同时减少大家在未来技术选型方面所走的弯路,本文将就spreadjs 与 node.js之间的技术性方案进行探讨!
一、安装 spreadjs 和 node .js首先,我们需要安装node.js以及mock-browser,bufferjs和filereader,大家可以前往以下链接进行下载,同步操作:
installing node.js viapackage managermock-browserbufferjsfilereader我们将使用visual studio创建应用程序。打开visual studio后,使用javascript> node.js>blank node.js控制台应用程序模板创建一个新应用程序。这将自动创建所需的文件并打开 app.js文件,也是我们将要更改的唯一文件。
对于bufferjs库,您需要下载该软件包,然后通过导航到项目文件夹(一旦创建)并运行以下命令,将其手动安装到项目中:
npm install
安装完成后,您可能需要打开项目的package.json文件并将其添加到 dependencies部分。文件内容应如下所示:
{name: spread-sheets-node-jsapp,version: 0.0.0,description: spreadsheetsnodejsapp,main: app.js,author: {   name: admin},dependencies: {   filereader: ^0.10.2,   bufferjs: 1.0.0,   mock-browser: ^0.92.14  }}
在此示例中,我们将使用node.js的文件系统模块。我们可以将其加载到:
var fs = require('fs')
为了将spreadjs与node.js结合使用,我们还需要加载已安装的mock-browser:
var mockbrowser =require('mock-browser').mocks.mockbrowser
在加载spreadjs脚本之前,我们需要初始化模拟浏览器。初始化我们稍后在应用程序中可能需要使用的变量,尤其是 window变量:
global.window =mockbrowser.createwindow()global.document = window.documentglobal.navigator = window.navigatorglobal.htmlcollection =window.htmlcollectionglobal.getcomputedstyle =window.getcomputedstyle
初始化filereader库:
var filereader = require('filereader');global.filereader = filereader;
二、使用spreadjs npm 包将spreadjs安装文件中的spreadjs sheets和excelio包添加到项目中。
您可以通过右键单击解决方案资源管理器的 npm部分并将它们添加到您的项目中,然后选择安装新的npm软件包。您应该能够搜索 grapecity并安装以下2个软件包:
@grapecity/spread-sheets@grapectiy/spread-excelio
将spreadjs npm软件包添加到项目后,正确的依赖关系将被写入package.json:
{ name: spread-sheets-node-jsapp, version: 0.0.0, description: spreadsheetsnodejsapp, main: app.js, author: {    name: admin },   dependencies:{    @grapecity/spread-excelio: ^11.2.1,    @grapecity/spread-sheets: ^11.2.1,    filereader: ^0.10.2,    bufferjs: 1.0.0,    mock-browser: ^0.92.14   } }
现在我们需要在app.js文件中引入它:
var gc =require('@grapecity/spread-sheets')var gcexcel =require('@grapecity/spread-excelio');
使用npm软件包时,还需要设置许可证密钥(点击此处,免费申请许可证密钥):
gc.spread.sheets.licensekey =<your key here>
在这个特定的应用程序中,我们将向用户显示他们正在使用哪个版本的spreadjs。为此,我们可以引入package.json文件,然后引用依赖项以获取版本号:
var packagejson =require('./package.json')console.log('\n** using spreadjs version' + packagejson.dependencies[@grapecity/spread-sheets] +' **')
三、将 excel 文件加载到您的 node.js 应用程序中点击此处,下载现成的excel模板文件,该文件包含了从用户那里获取数据。接下来,将数据放入文件中并导出。在这种情况下,文件是用户可以编辑的状态。
初始化工作簿和excelio变量:
var wb = new gc.spread.sheets.workbook();var excelio = new gcexcel.io();
我们在读取文件时将代码包装在try / catch块中。然后,初始化变量 readline,让您读取用户输入到控制台的数据。接下来,我们将其存储到一个javascript数组中,以便轻松填写excel文件:
// instantiate the spreadsheet and modifyitconsole.log('\nmanipulatingspreadsheet\n---');try {   var file = fs.readfilesync('./content/billinginvoicetemplate.xlsx');   excelio.open(file.buffer, (data) => {       wb.fromjson(data);       const readline = require('readline');       var invoice = {            generalinfo: [],            invoiceitems: [],            companydetails: []       };   });} catch (e) {   console.error(** error manipulating spreadsheet **);   console.error(e);}
四、收集用户输入信息
上图显示了我们正在使用的excel文件。我们可以在excelio.open调用中创建一个单独的函数,以在控制台中提示用户需要的每一项内容。我们也可以创建一个单独的数组,将数据保存到每个输入后,然后将其推送到我们创建的invoice.generalinfo数组中:
fillgeneralinformation();function fillgeneralinformation() {   console.log(-----------------------\nfill in invoicedetails\n-----------------------)   const rl = readline.createinterface({       input: process.stdin,       output: process.stdout   });   var generalinfoarray = [];   rl.question('invoice number: ', (answer) => {       generalinfoarray.push(answer);       rl.question('invoice date (dd month year): ', (answer) => {           generalinfoarray.push(answer);            rl.question('payment due date (ddmonth year): ', (answer) => {                generalinfoarray.push(answer);                rl.question('customer name: ',(answer) => {                   generalinfoarray.push(answer);                    rl.question('customercompany name: ', (answer) => {                       generalinfoarray.push(answer);                        rl.question('customer street address:', (answer) => {                           generalinfoarray.push(answer);                           rl.question('customer city, state, zip (<city>, <state abbr><zip>): ', (answer) => {                                generalinfoarray.push(answer);                               rl.question('invoice company name: ', (answer) => {                                   generalinfoarray.push(answer);                                   rl.question('invoice street address: ', (answer) => {                                       generalinfoarray.push(answer);                                       rl.question('invoice city, state, zip (<city>, <state abbr><zip>): ', (answer) => {                                            generalinfoarray.push(answer);                                           rl.close();                                           invoice.generalinfo.push({                                               invoicenumber: generalinfoarray[0],                                               invoicedate: generalinfoarray[1],                                               paymentduedate: generalinfoarray[2],                                               customername: generalinfoarray[3],                                               customercompanyname: generalinfoarray[4],                                               customerstreetaddress: generalinfoarray[5],                                               customercitystatezip: generalinfoarray[6],                                               invoicecompanyname: generalinfoarray[7],                                               invoicestreetaddress: generalinfoarray[8],                                               invoicecitystatezip: generalinfoarray[9],                                            });                                           console.log(general invoice information stored);                                           fillcompanydetails();                                        });                                    });                               });                            });                        });                    });                });            });       });   });}
该函数被称为 fillcompanydetails,目的是收集有关公司的信息以填充到工作簿的第二张表中:
function fillcompanydetails() {   console.log(-----------------------\nfill in companydetails\n-----------------------)   const rl = readline.createinterface({       input: process.stdin,       output: process.stdout   });   var companydetailsarray = []   rl.question('your name: ', (answer) => {       companydetailsarray.push(answer);       rl.question('company name: ', (answer) => {            companydetailsarray.push(answer);            rl.question('address line 1: ',(answer) => {               companydetailsarray.push(answer);                rl.question('address line 2: ',(answer) => {                   companydetailsarray.push(answer);                    rl.question('address line3: ', (answer) => {                       companydetailsarray.push(answer);                        rl.question('addressline 4: ', (answer) => {                           companydetailsarray.push(answer);                           rl.question('address line 5: ', (answer) => {                               companydetailsarray.push(answer);                               rl.question('phone: ', (answer) => {                                   companydetailsarray.push(answer);                                   rl.question('facsimile: ', (answer) => {                                       companydetailsarray.push(answer);                                        rl.question('website: ', (answer)=> {                                           companydetailsarray.push(answer);                                           rl.question('email: ', (answer) => {                                                companydetailsarray.push(answer);                                               rl.question('currency abbreviation: ', (answer) => {                                                   companydetailsarray.push(answer);                                                    rl.question('beneficiary: ',(answer) => {                                                       companydetailsarray.push(answer);                                                       rl.question('bank: ', (answer) => {                                                            companydetailsarray.push(answer);                                                           rl.question('bank address: ', (answer) => {                                                               companydetailsarray.push(answer);                                                               rl.question('account number: ', (answer) => {                                                                   companydetailsarray.push(answer);                                                                    rl.question('routingnumber: ', (answer) => {                                                                       companydetailsarray.push(answer);                                                                       rl.question('make checks payable to: ', (answer) => {                                                                           companydetailsarray.push(answer);                                                                            rl.close();                                                                           invoice.companydetails.push({                                                                               yourname: companydetailsarray[0],                                                                               companyname: companydetailsarray[1],                                                                               addressline1: companydetailsarray[2],                                                                               addressline2: companydetailsarray[3],                                                                               addressline3: companydetailsarray[4],                                                                               addressline4: companydetailsarray[5],                                                                               addressline5: companydetailsarray[6],                                                                                phone:companydetailsarray[7],                                                                               facsimile: companydetailsarray[8],                                                                                website:companydetailsarray[9],                                                                               email: companydetailsarray[10],                                                                               currencyabbreviation:companydetailsarray[11],                                                                               beneficiary: companydetailsarray[12],                                                                               bank:companydetailsarray[13],                                                                               bankaddress: companydetailsarray[14],                                                                               accountnumber: companydetailsarray[15],                                                                               routingnumber: companydetailsarray[16],                                                                               payableto: companydetailsarray[17]                                                                           });                                                                           console.log(invoice company information stored);                                                                            console.log(-----------------------\nfillin invoice items\n-----------------------)                                                                           fillinvoiceitemsinformation();                                                                        });                                                                   });                                                               });                                                           });                                                       });                                                   });                                               });                                            });                                        });                                    });                                });                            });                        });                    });                });            });       });   });}
现在我们已经有了用户的基本信息,我们可以集中精力收集单个项目,并另命名为 fillinvoiceitemsinformation函数。在每个项目执行之前,我们会询问用户是否要添加一个项目。如果他们继续输入 y,那么我们将收集该项目的信息,然后再次询问直到他们键入 n:
function fillinvoiceitemsinformation() {   const rl = readline.createinterface({       input: process.stdin,       output: process.stdout   });   var invoiceitemarray = [];   rl.question('add item?(y/n): ', (answer) => {       switch (answer) {            case y:               console.log(-----------------------\nenter iteminformation\n-----------------------);                rl.question('quantity: ',(answer) => {                   invoiceitemarray.push(answer);                    rl.question('details: ',(answer) => {                       invoiceitemarray.push(answer);                        rl.question('unitprice: ', (answer) => {                           invoiceitemarray.push(answer);                           invoice.invoiceitems.push({                               quantity:invoiceitemarray[0],                               details: invoiceitemarray[1],                               unitprice: invoiceitemarray[2]                            });                            console.log(iteminformation added);                            rl.close();                           fillinvoiceitemsinformation();                        });                    });                });                break;            case n:               rl.close();                return fillexcelfile();                break;            default:                console.log(incorrectoption, please enter 'y' or 'n'.);       }   });}
五、填入您的excel 文件在收集所有必需的用户信息后,我们可以将其填入到excel文件中:
function fillexcelfile() {   console.log(-----------------------\nfilling in excelfile\n-----------------------);   fillbillinginfo();   fillcompanysetup();}function fillbillinginfo() {   var sheet = wb.getsheet(0);   sheet.getcell(0, 2).value(invoice.generalinfo[0].invoicenumber);   sheet.getcell(1, 1).value(invoice.generalinfo[0].invoicedate);   sheet.getcell(2, 2).value(invoice.generalinfo[0].paymentduedate);   sheet.getcell(3, 1).value(invoice.generalinfo[0].customername);   sheet.getcell(4, 1).value(invoice.generalinfo[0].customercompanyname);   sheet.getcell(5, 1).value(invoice.generalinfo[0].customerstreetaddress);   sheet.getcell(6, 1).value(invoice.generalinfo[0].customercitystatezip);   sheet.getcell(3, 3).value(invoice.generalinfo[0].invoicecompanyname);   sheet.getcell(4, 3).value(invoice.generalinfo[0].invoicestreetaddress);   sheet.getcell(5, 3).value(invoice.generalinfo[0].invoicecitystatezip);}function fillcompanysetup() {   var sheet = wb.getsheet(1);   sheet.getcell(2, 2).value(invoice.companydetails[0].yourname);   sheet.getcell(3, 2).value(invoice.companydetails[0].companyname);   sheet.getcell(4, 2).value(invoice.companydetails[0].addressline1);   sheet.getcell(5, 2).value(invoice.companydetails[0].addressline2);   sheet.getcell(6, 2).value(invoice.companydetails[0].addressline3);   sheet.getcell(7, 2).value(invoice.companydetails[0].addressline4);   sheet.getcell(8, 2).value(invoice.companydetails[0].addressline5);   sheet.getcell(9, 2).value(invoice.companydetails[0].phone);   sheet.getcell(10, 2).value(invoice.companydetails[0].facsimile);   sheet.getcell(11, 2).value(invoice.companydetails[0].website);   sheet.getcell(12, 2).value(invoice.companydetails[0].email);   sheet.getcell(13, 2).value(invoice.companydetails[0].currencyabbreviation);   sheet.getcell(14, 2).value(invoice.companydetails[0].beneficiary);   sheet.getcell(15, 2).value(invoice.companydetails[0].bank);   sheet.getcell(16, 2).value(invoice.companydetails[0].bankaddress);   sheet.getcell(17, 2).value(invoice.companydetails[0].accountnumber);   sheet.getcell(18, 2).value(invoice.companydetails[0].routingnumber);   sheet.getcell(19, 2).value(invoice.companydetails[0].payableto);}
为了防止用户添加的数量超过工作表最大行数,我们可以在工作表中自动添加更多行。在设置数组中表单中的项目之前,默认添加行:
function fillinvoiceitems() {   var sheet = wb.getsheet(0);   var rowstoadd = 0;   if (invoice.invoiceitems.length > 15) {       rowstoadd = invoice.invoiceitems.length - 15;       sheet.addrows(22, rowstoadd);   }   var rowindex = 8;   if (invoice.invoiceitems.length >= 1) {       for (var i = 0; i < invoice.invoiceitems.length; i++) { sheet.getcell(rowindex,1).value(invoice.invoiceitems.quantity); sheet.getcell(rowindex,2).value(invoice.invoiceitems.details); sheet.getcell(rowindex,3).value(invoice.invoiceitems.unitprice); rowindex++; } }}
六、将文档内容从 node.js 导出到 excel 文件在工作簿中填写完信息后,我们可以将工作簿导出到excel文件中。为此,我们将使用excelio打开功能。在这种情况下,只需将日期输入文件名即可:
function exportexcelfile() { excelio.save(wb.tojson(), (data) => {       fs.appendfilesync('invoice' + new date().valueof() + '.xlsx', newbuffer(data), function (err) {            console.log(err);       });       console.log(export success);   }, (err) => {       console.log(err);   }, { usearraybuffer: true });}
完成的文件将如下所示:
更多node相关知识,请访问:nodejs 教程!
以上就是教你node.js+spreadjs从服务端生成excel电子表格的详细内容。
其它类似信息

推荐信息