前言
QR碼(Quick Response Code)是一種二維碼,於1994年開發。它能快速存儲和識別數據,包含黑白方塊圖案,常用於掃描獲取信息。QR碼具有高容錯性和快速讀取的優點,廣泛應用於廣告、支付、物流等領域。通過掃描QR碼,用戶可以快速獲取信息和實現便捷操作,爲現代生活帶來便利。在本教程中,小編將爲大家探討如何使用 NestJS 和 qrcode.js 構建 QR 二維碼,並將其放到Excel中。
環境準備
在開始之前,請確保您具備以下工具和知識:
- Node.js 和 npm 安裝在您的系統上。
- 基本瞭解 TypeScript 和 JavaScript。
- 熟悉 NestJS 基礎知識(如果沒有,可以參考 NestJS 官方文檔)。
第 1 步:設置 NestJS 項目
創建一個新的 NestJS 項目開始。打開終端並執行以下命令:
# Create a new NestJS project
npx @nestjs/cli new qr-code-generator-api
# Move into the project directory
cd qr-code-generator-api
第 2 步:安裝qrcode.js
接下來,安裝該 qrcode.js 軟件包,這將使小編能夠生成二維碼。在項目目錄中運行以下命令:
npm install qrcode
第 3 步:生成二維碼
現在小編已經設置了 NestJS 和qrcode.js,讓小編創建一個 QR 碼生成service。在 NestJS 中,service是負責處理業務邏輯的類。小編將創建一個 QrCodeService ,並利用qrcode.js生成二維碼的代碼。
首先,創建一個在 src 文件夾中命名 qr-code.service.ts 的新文件,並添加以下代碼:
// src/qr-code.service.ts
import { Injectable } from '@nestjs/common';
import * as qrcode from 'qrcode';
@Injectable()
export class QrCodeService {
async generateQrCode(data: string): Promise<string> {
try {
const qrCodeDataURL = await qrcode.toDataURL(data);
return qrCodeDataURL;
} catch (error) {
throw new Error('Failed to generate QR code.');
}
}
}
在上面的代碼中,小編創建了一個 QrCodeService 具有單個方法的 generateQrCode ,此方法將字符串 data 作爲輸入,並返回一個 Promise,該 Promise 解析爲表示生成的 QR 碼的數據 URL。
第 4 步:創建二維碼Controller
在 NestJS 中,controller處理傳入的請求並與服務交互以提供響應。因此小編創建一個 QR 碼 controller來處理 QR 碼的生成。創建 src 文件夾中命名 qr-code.controller.ts 的新文件,並添加以下代碼:
// src/qr-code.controller.ts
import { Controller, Get, Query } from '@nestjs/common';
import { QrCodeService } from './qr-code.service';
@Controller('qr-code')
export class QrCodeController {
constructor(private readonly qrCodeService: QrCodeService) {}
@Get()
async generateQrCode(@Query('data') data: string) {
const qrCodeDataURL = await this.qrCodeService.generateQrCode(data);
return `<img src="${qrCodeDataURL}" alt="QR Code" />`;
}
}
@Controller('qr-code-data')
export class QrDataCodeController {
constructor(private readonly qrCodeService: QrCodeService) {}
@Get()
async generateQrCode(@Query('data') data: string) {
const qrCodeDataURL = await this.qrCodeService.generateQrCode(data);
return qrCodeDataURL;
}
}
在上面的代碼中,小編在路由 /qr-code 上定義了一個 QrCodeController 具有單個 GET 端點的端點。端點需要一個查詢參數 data ,該參數表示將是要編碼到 QR 碼中的內容。controller中 generateQrCode 的方法從 中調用 generateQrCode 該方法, QrCodeService 並在響應中以圖像形式返回 QR 碼。同時也通過 /qr-code-data 上定義了一個 QrDataCodeController 具有單個 GET 端點的端點,並在響應中以base^4形式返回。
第 5 步:連接二維碼module
現在小編已經準備好了service和controller,小編需要將它們連接到一個module中。創建 src 文件夾中命名 qr-code.module.ts 的新文件,並添加以下代碼:
// src/qr-code.module.ts
import { Module } from '@nestjs/common';
import { QrCodeController, QrDataCodeController } from "./qr-code.controller";
import { QrCodeService } from './qr-code.service';
@Module({
controllers: [QrCodeController,QrDataCodeController],
providers: [QrCodeService],
})
export class QrCodeModule {}
在上面的代碼中,小編定義了一個 QrCodeModule 導入 QrCodeController,QrDataCodeController 和 QrCodeService 的 .該模塊將負責提供二維碼生成功能。
第 6 步:修改main.ts
現在小編已經創建了module,讓小編引導 NestJS 應用程序幷包含 QrCodeModule。打開文件 src/main.ts 並按如下方式進行修改:
// src/main.ts
import { NestFactory } from '@nestjs/core';
import { QrCodeModule } from './qr-code.module';
async function bootstrap() {
const app = await NestFactory.create(QrCodeModule);
await app.listen(3000);
}
bootstrap();
在上面的代碼中,小編已導入 QrCodeModule 並將其傳遞給 NestFactory.create ,表明小編的應用程序將使用 QrCodeModule .應用程序將偵聽端口 3000(默認爲3000,也可以修改端口)。
第 7 步:測試 QR 碼生成器 API
- 執行以下命令來運行 NestJS 應用程序:
npm run start
- 打開瀏覽器,在地址欄中輸入http://localhost:3000/qr-code?data=Hello%20Spreadjs
替換等於號之後的內容爲您要編碼到 QR 碼中的數據。
- 您應該會收到一個包含帶有生成的二維碼的 HTML img 標籤的回覆。圖像將在響應中顯示爲數據 URL。
然後掃描二維碼,如果掃描成功,就代表我們已經創建了一個二維碼。
- 打開瀏覽器,在地址欄中輸入http://localhost:3000/qr-code-data?data=Hello%20Spreadjs。返回一個base64碼數據
最後附上完整的項目代碼地址:
https://github.com/wteja/qr-code-generator-api
前端表格組件實現二維碼圖片
在上面介紹的例子中,小編是直接生成了一個二維碼,但是在實際的日常,這種場景其實很少,更多的是將二維碼放在各種 Excel 報告中,除了使用上述的原生 NestJS 和 qrcode.js 之外,還可以嘗試其他的一些支持NestJS的前端表格組件來實現,這樣做的好處是可以減少代碼的開發量。
SpreadJS 是葡萄城推出的基於 HTML5 標準的純前端表格組件,具備高性能、跨平臺、與 Excel高度兼容的產品特性,其設計目的是幫助開發者快速實現瀏覽器中各類 Excel 表格應用,已成功在數據填報、在線表格文檔、類 Excel 報表製作與生成、企業預決算、計量檢測、實驗室管理等領域得到廣泛應用,可讓您快速具備與飛書、語雀、靈犀文檔等同源的表格開發能力。下圖是使用 SpreadJS 實現的一個二維碼樣例:
SpreadJS如同Excel一樣,支持插入圖片,定位圖片。我們在SpreadJS中插入上述拿到的6ase64數據
第1步:獲取Base64數據
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:3000/qr-code-data?data=Hello%20Spreadjs', true);
xhr.onload = function (e) {
if (this.status == 200) {
var base64Data = this.response;
}
};
xhr.send();
第2步:獲取SpreadJS對象
接下來獲取SpreadJS對象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<!-- 禁用IE兼容視圖 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="spreadjs culture" content="zh-cn"/>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" , user-scalable=no"/>
<title>SpreadJS demo</title>
<link href="http://cdn.grapecity.com/spreadjs/hosted/css/gc.spread.sheets.excel2013white.17.0.0.css"
rel="stylesheet" type="text/css"/>
<script src="http://cdn.grapecity.com/spreadjs/hosted/scripts/gc.spread.sheets.all.17.0.0.min.js"></script>
<script src="http://cdn.grapecity.com/spreadjs/hosted/scripts/plugins/gc.spread.sheets.shapes.17.0.0.min.js"></script>
</head>
<body>
<div>
<div id="ss" class="sample-spreadsheets" style="height: 500px;width: 90%;"></div>
</div>
<script type="text/javascript">
window.onload = function () {
var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), {sheetCount: 2});
}
</script>
</body>
</html>
新建一個文本文檔,複製上面的代碼,將其後綴修改爲.html ,在瀏覽器中打開此文件,發現發現了一個電子表格
第3步:插入圖片
接下來 我們添加圖片
var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), {sheetCount: 2});
let activeSheet = spread.getSheet(0);
activeSheet.setRowHeight(0, 100);
activeSheet.setColumnWidth(0, 100)
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:3000/qr-code-data?data=Hello%20Spreadjs', true);
xhr.onload = function (e) {
if (this.status == 200) {
var base64Data = this.response;
var pic = activeSheet.shapes.addPictureShape("Picture 1", base64Data, 0, 0, 100, 100);
pic.startRow(0);
pic.startColumn(0);
pic.width(100)
pic.height(100)
}
};
xhr.send();
結果如下:
這樣子就實現了在電子表格中,插入一個二維碼圖片的效果。
怎麼,上述過程太複雜,沒有關係,SpreadJS也支持直接創建二維碼。
前端表格組件實現二維碼公式
第1步:打開SpreadJS
打開剛剛的頁面,或者點擊這裏重新打開SpreadJS。
第2步:實現二維碼
打開SpreadJS之後,新建一個Sheet頁,然後把想要展示在二維碼上的信息寫下來,如下圖所示:
然後我們隨便找一個空白的單元格,輸入以下公式,空格中輸入顯示信息的單元格位置(比如上圖中的“Hello World”的位置B10)
//空格中爲顯示信息的單元格位置
=BC_QRCODE()
然後就會顯示一個二維碼:
掃描該二維碼,手機就會顯示“Hello World”字符串,這樣就完成了一個將二維碼嵌到Excel中的小Demo。(更多樣式的二維碼可以參考這個Demo)
除此之外,還可以用代碼的方式給二維碼賦值:
sheet.setFormula(0,0,'=BC_QRCODE("hello,我是二維碼")');
上述代碼是爲A1單元格創建一個公式,公式是=BC_QRCODE("hello,我是二維碼"),結果是這樣子的:
附上完整的代碼:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8"/>
<meta name="spreadjs culture" content="zh-cn" />
<link href="http://cdn.grapecity.com/spreadjs/hosted/css/gc.spread.sheets.excel2013white.17.0.7.css"
rel="stylesheet" type="text/css"/>
<script src="http://cdn.grapecity.com/spreadjs/hosted/scripts/gc.spread.sheets.all.17.0.7.min.js"></script>
<script src="http://cdn.grapecity.com/spreadjs/hosted/scripts/plugins/gc.spread.sheets.barcode.17.0.7.min.js"></script>
</head>
<body>
<div>
<div class="container">
<div id="ss" style="width:200%; height:90vh;"></div>
</div>
</div>
<script type="text/javascript">
window.onload = function () {
let spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"));
let sheet = spread.getActiveSheet()
sheet.setFormula(0,0,'=BC_QRCODE("hello,我是二維碼")');
sheet.setRowHeight(0,200)
sheet.setColumnWidth(0,200)
}
</script>
</body>
</html>
總結
在本文中,小編介紹瞭如何使用 NestJS 和 qrcode.js 創建 QR 二維碼,並藉助了純前端表格組件SpreadJS來實現將 QR 二維碼中顯示在Excel中,如果您想了解更多關於SpreadJS的信息,歡迎點擊這裏查看。
擴展鏈接: