成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

教你Node.js+SpreadJS從服務端生成Excel電子表格

教你Node.js+SpreadJS從服務端生成Excel電子表格

前端(vue)入門到精通課程:進入學習

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 Manager
  • Mock-Browser
  • BufferJS
  • FileReader

我們將使用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.document global.navigator = window.navigator global.HTMLCollection =window.HTMLCollection global.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 modifyit console.log('nManipulatingSpreadsheetn---'); 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); }

四、收集用戶輸入信息

教你Node.js+SpreadJS從服務端生成Excel電子表格

上圖顯示了我們正在使用的Excel文件。我們可以在excelio.open調用中創建一個單獨的函數,以在控制臺中提示用戶需要的每一項內容。我們也可以創建一個單獨的數組,將數據保存到每個輸入后,然后將其推送到我們創建的invoice.generalInfo數組中:

fillGeneralInformation(); function fillGeneralInformation() {    console.log("-----------------------nFill in InvoiceDetailsn-----------------------")    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 CompanyDetailsn-----------------------")    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 Itemsn-----------------------")                                                                            fillInvoiceItemsInformation();                                                                         });                                                                    });                                                                });                                                            });                                                        });                                                    });                                                });                                             });                                         });                                     });                                 });                             });                         });                     });                 });             });        });    }); }

教你Node.js+SpreadJS從服務端生成Excel電子表格

現在我們已經有了用戶的基本信息,我們可以集中精力收集單個項目,并另命名為" 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 ItemInformationn-----------------------");                 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 Excelfilen-----------------------");    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); }

為了防止用戶添加的數量超過工作表最大行數,我們可以在工作表中自動添加

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
JEAⅠOUSVUE丰满少妇| 91精品人妻一区二区三在线| 一区二区清无吗视频| 日本高清视频网站WWW| 草莓视频APP无限观看| 亚洲国产精品VA在线看黑人| 亚洲精品乱码久久久久久V| 帮妺妺洗澡忍不住C了她作文| 亚洲乱码国产一区三区| 永久不收费的视频软件APP| 69无人区码一二三四区别| 成人毛片18女人毛片免费看快色 | 少妇夜夜爽夜夜春夜夜高潮 | 亚洲AV综合色一区二区三区 | 无码专区一ⅤA亚洲V专区在线| 女孩子手脚绑起来嘴用胶带封上| 欧美性猛烈XXXX极品少妇| 日日噜噜夜夜爽爽| 亚洲AV成人一区二区三区天堂| 亚洲熟妇色XXXXX中国少妇Y| 99V久久综合狠狠综合久久| 东欧av性无码高清| 狠狠噜天天噜日日噜AV| 末发育娇小性色XXXX| 色AV综合AV综合无码网站| 亚洲AV无码成人专区| 中文字幕成人精品久久不卡| 成片在线看一区二区草莓| 国产免费AV片在线播放| 久久久久久中文字幕有精品| 含羞草实验室隐藏路线| 麻豆传播媒体APP官网在线观看 | 亚洲丰满熟妇浓毛大隂户| 综合欧美亚洲日本一区| 公车掀起老师裙子进入在线| 护士下面好湿好紧好大| 欧美XXXX做受欧美| 午夜福利理论片高清在线观看| 又白又大的两座峰| 丰满的女房东6剧情| 久久久精品人妻一区二区三区四| 日本黄页网站免费观看| 亚洲精品成人网久久久久久| SM调教贱屁股眼哭叫求饶H| 国产亚洲精久久久久久无码7| 久青草国产97香蕉在线影院| 少妇做爰XXXⅩ性XXXHD| 亚洲综合另类小说色区一| 从厨房一路顶撞到卧室门好吗| 狠狠噜天天噜日日噜视频麻豆| 女人国产香蕉久久精品| 亚洲AV 无码片一区二区三区| 18禁黄网站禁片免费观看在线 | 无人区码一码二码三码是什么意思| 永久免费看啪啪的网站| 国产AV无码专区亚洲AⅤ| 久久天天躁夜夜躁狠狠85| 少妇午夜福利水多多| 在线观看无码AV网站永久免费| 国产97在线 | 日韩| 老司机午夜精品99久久免费| 丝袜美腿一区二区三区| 中文字幕AV一区| 国产一区二区波多野结衣| 人妻一区二区在线| 野花视频在线手机免费观看| 国产成人AV无码永久免费| 男吃奶玩乳尖高潮视频午夜| 亚洲AV日韩综合一区| 成年女人18级毛片毛片免费| 久久久亚洲熟妇熟女ⅩXXXHD | 全力以赴的行动派第二季| 亚洲人成色77777| 国产边做边吃奶AⅤ视频免费 | 亚洲AV乱码一区二区三区林ゆな | CEKC老妇女CEA0| 狠狠躁夜夜躁人人爽天天5| 日韩AV无码免费播放| 呦香8黝黝狖呦香8| 国产手机在线ΑⅤ片无码观看| 日本精品一线二线三线区别在哪里 | 国产又色又爽又刺激在线播放| 日本又黄又爽又色又刺激的视频| 一本一本久久A久久精品综合麻豆 一本一本久久A久久精品综合 | 成熟女人牲交片免费观看视频| 免费的视频BGM大全软件下载| 亚洲国产精品成人久久| 国产边做饭边被躁在线小说| 欧美亚洲国产SUV| 伊人久久中文字幕| 精品国产AⅤ一区天美传媒| 完全着衣の爆乳お姉さんが| 宝贝感受到它在爱你吗病娇小说| 老司机精品成人无码AV| 亚洲精品无码你懂的| 国产精品亚洲片夜色在线| 日本一本2017国产| 99精品国产综合久久久久五月天 | 亚洲最大综合久久网成人| 好爽好紧好大的免费视频国产| 天堂AV无码大芭蕉伊人AV不卡| 麻豆国产AV丝袜白领传媒| 亚洲爆乳中文字幕无码专区网站| 国产成人午夜精品影院 | 无码中文字幕AV免费放DVD| 潮喷失禁大喷水AⅤ无码| 女人越喊男人越往里寨电视剧| 伊人激情AV一区二区三区| 加勒比久久综合久久鬼色88 | 中国GAY片男同志免费网站| 精品亚洲一区二区三区在线观看| 亚洲AV无码乱码精品国产按摩| 国产98色在线 | 免费| 色噜噜狠狠色综合日日| 波多野结衣AV在线| 人禽杂交18禁网站免费| JAVAPARSERHD夫妻| 欧美成人家庭影院| 99国精品午夜福利视频不卡| 男女高潮免费观看无遮挡| 中国鲜肉GAY高中XX禁18网| 久久婷婷五月综合国产| 夜夜爽妓女8888视频免费观看| 精品国产亚洲AV麻豆映画| 亚洲国产另类久久久精品小说| 国国产自偷自偷免费一区| 亚洲ⅤA中文字幕无码毛片| 国产精品爽爽VA在线观看| 无码人妻少妇久久中文字幕| 国产成人亚洲精品无码最新| 天天躁夜夜躁狠狠躁2021| 国产精品成人影院在线观看| 五级黄高潮片90分钟视频| 国产精品对白刺激久久久| 无人区码一码二码三码| 国产手机精品一区二区| 亚洲AV永久无码精品另类稀缺| 狠狠爱五月丁香亚洲综合| 亚洲人成色4444在线观看 | 亚洲中久无码永久在线观看同| 久久精品国产色蜜蜜麻豆| 亚洲中文字幕永久在线不卡| 开心久久婷婷综合中文字幕| 2021少妇久久久久久久久久| 国模无码一区二区三区不卡| 亚洲CHINESE男同志GAY| 精品一线二线三线精华液| 伊人婷婷六月狠狠狠去| 奶头好大揉着好爽视频午夜院| AV一本大道香蕉大在线| 久久久久久久精品裸体艺术 | 亚洲AV成人无码AV小说| 交换朋友夫妻互换客厅韩国5| 亚洲日韩在线成人AV电影网站 | 夜夜爽妓女8888视频免费观看| 炕上光着腚压在女人身上| A∨色狠狠一区二区三区| 日产乱码一二三区别免费下| 国产成人无码区免费网站| 亚洲AV午夜成人片精品| 久久久久亚洲AV片无码V| 99久久精品免费观看国产| 日韩欧美亚洲综合久久影院D3 | 大肥波BBWWHBBWW| 新JAPANESEVIDEO乱| 西西人体44RT NET毛最多| 国产精品18久久久久久vr| 女人另类牲交ZOZOZO| 征服好友的保守人妻| 欧妇女乱妇女乱视频| 处破女处破全过程| 公天天吃我奶躁我的比视频| 九九久久精品无码专区| 91人妻丰满熟妇Aⅴ无码| 日产精品一卡2卡三卡4卡乱码| 国产精品久久久久精品综合紧| 亚洲JIZZJIZZ少妇| 浪货两个都满足不了你J视频| 按摩男让我高潮做了3次正常吗| 熟女一区二区蜜桃视频| 激情影视乱码AV| 99大香伊乱码一区二区| 天天狠天天透天天伊人| 久久国产成人午夜AV影院 | 99久久人妻无码精品系列蜜桃 | 亚洲精品无码AⅤ片影音先锋在线| 蜜桃av一区二区三区精品人妻| 成人久久免费网站| 亚洲AV秘 无码一区二黑人| 免费观看18禁欲无遮挡奶水下 | 四虎一区二区成人免费影院网址| 精品麻豆国产色欲色欲色欲WWW| AV永久天堂一区二区三区| 无码中文人妻在线三区| 麻豆ā片免费观看在线看| 粉嫩小泬无遮挡久久久久久| 亚洲成A人片在线观看无码专区| 欧美久久高潮久久高潮| 国产亚洲美女精品久久久| A级毛片无码兔费真人久久|