久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

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

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

前端(vue)入門到精通課程:進(jìn)入學(xué)習(xí)

Node是一個(gè)基于Chrome V8引擎的JavaScript運(yùn)行環(huán)境,通常用于創(chuàng)建網(wǎng)絡(luò)應(yīng)用程序。它可以同時(shí)處理多個(gè)連接,并且不像其他大多數(shù)模型那樣依賴線程。

對(duì)于 Web 開(kāi)發(fā)者來(lái)說(shuō),從數(shù)據(jù)庫(kù)或Web服務(wù)器獲取數(shù)據(jù),然后輸出到Excel文件以進(jìn)行進(jìn)一步分析的場(chǎng)景時(shí)有發(fā)生。我們的技術(shù)團(tuán)隊(duì)在跟國(guó)內(nèi)外各行各業(yè)用戶交流的過(guò)程中,就曾發(fā)現(xiàn)有很多的用戶嘗試在Node.js的環(huán)境下運(yùn)行SpreadJS 純前端表格控件,借助該控件,可以在服務(wù)器不預(yù)裝任何Excel依賴項(xiàng)的情況下,收集用戶輸入的信息,并將其自動(dòng)導(dǎo)出到Excel文件中。

為了滿足廣大技術(shù)愛(ài)好者的需要,同時(shí)減少大家在未來(lái)技術(shù)選型方面所走的彎路,本文將就SpreadJS 與 Node.js之間的技術(shù)性方案進(jìn)行探討!

一、安裝 SpreadJS 和 Node .js

首先,我們需要安裝Node.js以及Mock-Browser,BufferJS和FileReader,大家可以前往以下鏈接進(jìn)行下載,同步操作:

  • Installing Node.js viaPackage Manager
  • Mock-Browser
  • BufferJS
  • FileReader

我們將使用Visual Studio創(chuàng)建應(yīng)用程序。打開(kāi)Visual Studio后,使用JavaScript> Node.js>Blank Node.js控制臺(tái)應(yīng)用程序模板創(chuàng)建一個(gè)新應(yīng)用程序。這將自動(dòng)創(chuàng)建所需的文件并打開(kāi)" app.js"文件,也是我們將要更改的唯一文件。

對(duì)于BufferJS庫(kù),您需要下載該軟件包,然后通過(guò)導(dǎo)航到項(xiàng)目文件夾(一旦創(chuàng)建)并運(yùn)行以下命令,將其手動(dòng)安裝到項(xiàng)目中:

npm install

安裝完成后,您可能需要打開(kāi)項(xiàng)目的package.json文件并將其添加到" dependencies"部分。文件內(nèi)容應(yīng)如下所示:

{ "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的文件系統(tǒng)模塊。我們可以將其加載到:

var fs = require('fs')

為了將SpreadJS與Node.js結(jié)合使用,我們還需要加載已安裝的Mock-Browser:

var mockBrowser =require('mock-browser').mocks.MockBrowser

在加載SpreadJS腳本之前,我們需要初始化模擬瀏覽器。初始化我們稍后在應(yīng)用程序中可能需要使用的變量,尤其是" window"變量:

global.window =mockBrowser.createWindow() global.document = window.document global.navigator = window.navigator global.HTMLCollection =window.HTMLCollection global.getComputedStyle =window.getComputedStyle

初始化FileReader庫(kù):

var fileReader = require('filereader'); global.FileReader = fileReader;

二、使用SpreadJS npm 包

將SpreadJS安裝文件中的SpreadJS Sheets和ExcelIO包添加到項(xiàng)目中。

您可以通過(guò)右鍵單擊解決方案資源管理器的" npm"部分并將它們添加到您的項(xiàng)目中,然后選擇"安裝新的NPM軟件包"。您應(yīng)該能夠搜索" GrapeCity"并安裝以下2個(gè)軟件包:

@grapecity/spread-sheets @grapectiy/spread-excelio

將SpreadJS npm軟件包添加到項(xiàng)目后,正確的依賴關(guān)系將被寫入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" 	  } 	}

現(xiàn)在我們需要在app.js文件中引入它:

var GC =require('@grapecity/spread-sheets') var GCExcel =require('@grapecity/spread-excelio');

使用npm軟件包時(shí),還需要設(shè)置許可證密鑰(點(diǎn)擊此處,免費(fèi)申請(qǐng)?jiān)S可證密鑰):

GC.Spread.Sheets.LicenseKey ="<YOUR KEY HERE>"

在這個(gè)特定的應(yīng)用程序中,我們將向用戶顯示他們正在使用哪個(gè)版本的SpreadJS。為此,我們可以引入package.json文件,然后引用依賴項(xiàng)以獲取版本號(hào):

var packageJson =require('./package.json') console.log('n** Using Spreadjs Version"' + packageJson.dependencies["@grapecity/spread-sheets"] +'" **')

三、將 Excel 文件加載到您的 Node.js 應(yīng)用程序中

點(diǎn)擊此處,下載現(xiàn)成的Excel模板文件,該文件包含了從用戶那里獲取數(shù)據(jù)。接下來(lái),將數(shù)據(jù)放入文件中并導(dǎo)出。在這種情況下,文件是用戶可以編輯的狀態(tài)。

初始化工作簿和ExcelIO變量:

var wb = new GC.Spread.Sheets.Workbook(); var excelIO = new GCExcel.IO();

我們?cè)谧x取文件時(shí)將代碼包裝在try / catch塊中。然后,初始化變量" readline",讓您讀取用戶輸入到控制臺(tái)的數(shù)據(jù)。接下來(lái),我們將其存儲(chǔ)到一個(gè)JavaScript數(shù)組中,以便輕松填寫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從服務(wù)端生成Excel電子表格

上圖顯示了我們正在使用的Excel文件。我們可以在excelio.open調(diào)用中創(chuàng)建一個(gè)單獨(dú)的函數(shù),以在控制臺(tái)中提示用戶需要的每一項(xiàng)內(nèi)容。我們也可以創(chuàng)建一個(gè)單獨(dú)的數(shù)組,將數(shù)據(jù)保存到每個(gè)輸入后,然后將其推送到我們創(chuàng)建的invoice.generalInfo數(shù)組中:

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();                                         });                                     });                                });                             });                         });                     });                 });             });        });    }); }

該函數(shù)被稱為" fillCompanyDetails",目的是收集有關(guān)公司的信息以填充到工作簿的第二張表中:

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從服務(wù)端生成Excel電子表格

現(xiàn)在我們已經(jīng)有了用戶的基本信息,我們可以集中精力收集單個(gè)項(xiàng)目,并另命名為" fillInvoiceItemsInformation"函數(shù)。在每個(gè)項(xiàng)目執(zhí)行之前,我們會(huì)詢問(wèn)用戶是否要添加一個(gè)項(xiàng)目。如果他們繼續(xù)輸入" y",那么我們將收集該項(xiàng)目的信息,然后再次詢問(wèn)直到他們鍵入" 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); }

為了防止用戶添加的數(shù)量超過(guò)工作表最大行數(shù),我們可以在工作表中自動(dòng)添加

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
麻豆久久久久久久| 五月亚洲婷婷 | 亚洲激情社区| 国产精品国产一区| 成人精品国产亚洲| 欧美国产日韩电影| 久久精品理论片| 在线一区av| 91精品国产自产在线观看永久∴| 国产伊人精品| 婷婷综合一区| 日韩成人免费| 欧美日韩在线二区| 99视频一区| 热三久草你在线| 日韩一区二区久久| **爰片久久毛片| 国产精品成久久久久| 国产一区二区三区四区五区| 人人精品亚洲| 性欧美长视频| 日本午夜精品久久久久| 精品视频高潮| 久久精品观看| 日韩手机在线| 国产日韩电影| 午夜在线精品| 国产精品久久久久久久久久妞妞 | 日本在线精品| 香蕉精品视频在线观看| 亚洲人妖在线| 精品视频自拍| 国产精品婷婷| 精品精品久久| 亚洲欧美日韩国产一区| 国产精品日韩精品在线播放| 日韩不卡在线| 亚洲不卡视频| 国产aⅴ精品一区二区四区| 欧美午夜精彩| 国产精品一区二区精品| 亚洲播播91| 亚洲精品无吗| 国产一区2区| 喷白浆一区二区| 国产精品成久久久久| 国产视频一区免费看| 国产精品男女| 99riav1国产精品视频| 国产精品成人自拍| 成人av二区| 久久精品网址| 免费不卡在线视频| 午夜久久中文| 久久国产免费看| 一本一道久久a久久精品蜜桃| 国产精品久久免费视频| 亚洲国产不卡| 精品一区二区三区视频在线播放| 亚洲一区不卡| 日韩理论视频| 国产精品久久久久久妇女| 影院欧美亚洲| av最新在线| 欧美日韩伊人| 国产亚洲在线观看| 免费观看亚洲| 7777精品| 亚洲香蕉视频| 激情综合网五月| 老司机免费视频一区二区三区| 三级在线观看一区二区| av中文资源在线资源免费观看| 日本不卡高清视频| 99国产精品私拍| 99精品视频在线| 日本一区二区免费高清| 欧美一区网站| 日韩三级久久| 蜜桃久久久久久久| 中文在线不卡| 黄色日韩在线| 日韩大片在线播放| 麻豆国产精品一区二区三区| 日本少妇精品亚洲第一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久久成人网| 日韩一区二区三区免费播放| 麻豆中文一区二区| 国产精品亚洲二区| 日韩 欧美一区二区三区| 国产精品毛片在线| 激情婷婷久久| 欧美亚洲国产一区| 国产伊人精品| 亚洲一区日韩| 一区二区三区四区精品视频| 视频一区中文字幕| 午夜在线一区| 蜜桃传媒麻豆第一区在线观看| 日韩午夜在线| 美女91精品| 国产亚洲激情| 亚洲一区中文| 一区二区三区国产在线| 亚洲精品日本| 欧美精品三级在线| 欧美精品导航| 水蜜桃精品av一区二区| 国产福利片在线观看| 免费高潮视频95在线观看网站| 日韩国产欧美一区二区| 久久久成人网| 巨乳诱惑日韩免费av| 石原莉奈在线亚洲二区| 日韩欧美激情电影| 国产乱子精品一区二区在线观看| 青青青国产精品| 久久不卡日韩美女| 国产精品99视频| 久久亚洲国产| 日韩中文字幕不卡| 国产丝袜一区| 天堂av在线| 日av在线不卡| 久久99性xxx老妇胖精品| 女生影院久久| 国产精品呻吟| 国产乱人伦丫前精品视频| 国产一区二区三区亚洲综合| 日本精品影院| 天堂av在线一区| 日韩精品视频网| 久久精品福利| 国产91精品对白在线播放| 国产精品三上| 国产精品一区二区中文字幕| 亚洲成av在线| 亚洲精品九九| 岛国精品一区| 国产精品美女| 欧美国产先锋| 亚洲天堂久久| 亚洲一级淫片| 美女精品一区二区| 午夜国产欧美理论在线播放| 欧美日韩伊人| 成人精品天堂一区二区三区| 亚洲理论在线| 国产成人久久精品一区二区三区| 亚洲免费精品| 美女久久精品| 国产午夜精品一区二区三区欧美| 国产精品亚洲二区| 亚洲欧美综合| 国产欧美日韩影院| 久久人人99| 国产毛片久久久| 黄色成人91| 精品理论电影在线| 三级在线观看一区二区| 成人在线黄色| 日韩中文字幕区一区有砖一区 | 亚洲激情不卡| 久久a爱视频| 亚洲天堂日韩在线| 欧美精品高清| 欧美日韩在线精品一区二区三区激情综合 | 精品国产欧美| 午夜欧美视频| 精品入口麻豆88视频| 亚洲免费在线| 欧美香蕉视频| 欧美1区2区3| 久久亚洲色图| 久久精品国产99久久| 国产精品玖玖玖在线资源| 最新日韩av| 成人日韩在线观看| 久久国产精品美女| 亚洲欧美日本国产| 蜜桃视频欧美| av中文资源在线资源免费观看| 18国产精品| 妖精视频成人观看www| 成人三级高清视频在线看| 日韩va亚洲va欧美va久久| 日韩亚洲精品在线| 欧美日韩一二三四| 日韩一区二区三区在线免费观看| 美女视频网站久久| 日韩超碰人人爽人人做人人添| 亚洲免费影视| 亚洲精品1区2区| 久久久久国产精品一区三寸| 国产91欧美| 精品欠久久久中文字幕加勒比| 国产精品日本一区二区不卡视频 | 国产精品久一| 中文字幕亚洲在线观看|