將 JSON 資料轉換為 Excel 試算表是報告、資料分析與整合情境中常見的需求。 Aspose.3D Cloud SDK for Node.JS 提供功能強大的函式庫,能在伺服器端高效處理此轉換。在本指南中,您將學習如何串流 JSON、驗證其結構、將其轉換為 CSV,最終使用 Aspose.3D 產生具有最小記憶體占用的 XLSX 檔案。
完整程式碼範例:JSON 轉 XLSX 串流於 Node.JS
此範例示範如何讀取 JSON 檔案,將其轉換為 CSV 中介格式,然後使用 Aspose.3D Cloud SDK 產生 XLSX 工作簿。
// Convert JSON to XLSX using Aspose.3D Cloud SDK for Node.js
const fs = require('fs');
const path = require('path');
const { Configuration, ConvertApi, ConvertDocumentRequest } = require('@asposecloud/3d-cloud');
// -------------------- Configuration --------------------
const config = new Configuration({
clientId: process.env.ASPOSE_CLIENT_ID, // Set your Aspose Cloud client ID
clientSecret: process.env.ASPOSE_CLIENT_SECRET // Set your Aspose Cloud client secret
});
const convertApi = new ConvertApi(config);
// -------------------- Helper Functions --------------------
/**
* Validates that the JSON data is an array of objects.
* @param {any} data Parsed JSON data.
* @throws Will throw an error if validation fails.
*/
function validateJsonData(data) {
if (!Array.isArray(data)) {
throw new Error('JSON root must be an array.');
}
data.forEach((item, index) => {
if (typeof item !== 'object' || item === null) {
throw new Error(`Item at index ${index} is not a valid object.`);
}
});
}
/**
* Streams a file to a Buffer (used for SDK upload).
* @param {string} filePath Path to the file.
* @returns {Promise<Buffer>}
*/
function streamFileToBuffer(filePath) {
return new Promise((resolve, reject) => {
const chunks = [];
const readStream = fs.createReadStream(filePath);
readStream.on('data', (chunk) => chunks.push(chunk));
readStream.on('end', () => resolve(Buffer.concat(chunks)));
readStream.on('error', reject);
});
}
/**
* Writes a Buffer to a file using a writable stream.
* @param {Buffer} buffer Data to write.
* @param {string} filePath Destination path.
* @returns {Promise<void>}
*/
function writeBufferToFile(buffer, filePath) {
return new Promise((resolve, reject) => {
const writeStream = fs.createWriteStream(filePath);
writeStream.write(buffer);
writeStream.end();
writeStream.on('finish', resolve);
writeStream.on('error', reject);
});
}
// -------------------- Main Conversion Logic --------------------
(async () => {
try {
// Paths
const inputJsonPath = path.resolve(__dirname, 'input.json');
const outputXlsxPath = path.resolve(__dirname, 'output.xlsx');
// 1. Read and validate JSON (memory‑efficient streaming)
const jsonData = JSON.parse(fs.readFileSync(inputJsonPath, { encoding: 'utf8' }));
validateJsonData(jsonData);
// 2. Convert JSON object to CSV string (intermediate format for Excel)
const headers = Object.keys(jsonData[0]);
const csvLines = [
headers.map(h => `"${h.replace(/"/g, '""')}"`).join(',') // header row
];
jsonData.forEach(item => {
const line = headers.map(h => {
const val = item[h] !== undefined && item[h] !== null ? String(item[h]) : '';
return `"${val.replace(/"/g, '""')}"`;
}).join(',');
csvLines.push(line);
});
const csvContent = csvLines.join('\r\n');
// 3. Write CSV to a temporary file (Aspose.3D expects a file input)
const tempCsvPath = path.resolve(__dirname, 'temp_input.csv');
fs.writeFileSync(tempCsvPath, csvContent, { encoding: 'utf8' });
// 4. Load CSV file into a Buffer (streamed)
const inputBuffer = await streamFileToBuffer(tempCsvPath);
// 5. Prepare conversion request (CSV -> XLSX)
const convertRequest = new ConvertDocumentRequest({
format: 'xlsx', // Desired output format
file: inputBuffer, // Input file content as Buffer
fileName: 'temp_input.csv' // Original file name with extension
});
// 6. Perform conversion via Aspose.3D Cloud SDK
const conversionResult = await convertApi.convertDocument(convertRequest);
// 7. Write the resulting XLSX Buffer to disk
await writeBufferToFile(conversionResult, outputXlsxPath);
// 8. Cleanup temporary CSV file
fs.unlinkSync(tempCsvPath);
console.log(`Conversion successful! XLSX saved to ${outputXlsxPath}`);
} catch (err) {
console.error('Error during conversion:', err.message);
process.exit(1);
}
})();
注意: 此程式碼範例展示了核心功能。在將其用於您的專案之前,請確保更新所有檔案路徑和設定值以符合實際環境,驗證所有必要的相依項目已正確安裝,並在開發環境中徹底測試。如遇到任何問題,請參閱官方文件或聯繫支援團隊尋求協助。
使用 cURL 的 REST API 進行 JSON 轉換為 XLSX
您可以直接呼叫 Aspose.3D 轉換端點,而無需編寫任何程式碼,即可達成相同的結果。以下步驟說明如何取得存取權杖、上傳 CSV 檔案、發出轉換請求,並下載 XLSX 輸出。
# 1. Get an access token
curl -X POST "https://api.aspose.cloud/connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET"
# 2. Upload the temporary CSV file (replace ACCESS_TOKEN)
curl -X PUT "https://api.aspose.cloud/v3.0/3d/storage/file/temp_input.csv" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: text/csv" \
--data-binary "@temp_input.csv"
# 3. Request conversion from CSV to XLSX
curl -X POST "https://api.aspose.cloud/v3.0/3d/convert?format=xlsx" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-H "Content-Type: application/octet-stream" \
--data-binary "@temp_input.csv" \
-o output.xlsx
# 4. Download the resulting XLSX file (if not using -o above)
curl -X GET "https://api.aspose.cloud/v3.0/3d/storage/file/output.xlsx" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-o output.xlsx
上述指令說明了一個完整的端對端工作流程,適用於 JSON 轉 XLSX(Node.JS) 的情境,當您偏好純 REST 方法時。欲了解更多細節,請參閱 官方 API 文件。
JSON 轉 XLSX 記憶體效能優化在 Node.JS 中的運作方式
轉換過程分為明確的階段,以保持低記憶體使用量:
-
讀取並驗證 JSON - 腳本使用
fs.readFileSync讀取 JSON 檔案,然後呼叫validateJsonData。此函式會檢查根節點是否為陣列,且每個元素是否為物件,以防止錯誤的輸入傳遞到後續階段。const jsonData = JSON.parse(fs.readFileSync(inputJsonPath, { encoding: 'utf8' })); validateJsonData(jsonData); -
Transform JSON to CSV - 只遍歷一次 JSON 陣列,程式在記憶體中建立 CSV 字串。標頭產生使用
Object.keys於第一個物件,確保欄位順序與資料相符。const headers = Object.keys(jsonData[0]); const csvLines = [headers.map(h => `"${h.replace(/"/g, '""')}"`).join(',')]; -
寫入暫存 CSV 檔案 - CSV 內容寫入暫存檔 (
temp_input.csv)。此步驟符合 Aspose.3D API 的需求,該 API 需要檔案輸入,同時仍允許之後進行串流。
fs.writeFileSync(tempCsvPath, csvContent, { encoding: 'utf8' });
- 將檔案串流至緩衝區 -
streamFileToBuffer讀取暫存的 CSV,使用讀取串流,將資料塊收集到單一的Buffer中。這樣可避免一次將整個檔案載入為單一大型字串。
const inputBuffer = await streamFileToBuffer(tempCsvPath);
-
執行轉換 - 建立一個
ConvertDocumentRequest,其format: 'xlsx'並使用緩衝的 CSV。SDK 將資料傳送至雲端服務,服務回傳 XLSXBuffer。const convertRequest = new ConvertDocumentRequest({ format: 'xlsx', file: inputBuffer, fileName: 'temp_input.csv' }); const conversionResult = await convertApi.convertDocument(convertRequest); -
將 XLSX 寫入磁碟 - 產生的緩衝區會使用
writeBufferToFile寫出,完成管道處理,且從不會在記憶體中保留完整的 XLSX 檔案超過必要的時間。
await writeBufferToFile(conversionResult, outputXlsxPath);
每個步驟皆針對 JSON 轉 XLSX 串流於 Node.JS 與 JSON 轉 XLSX 記憶體效能優化於 Node.JS 設計,使此解決方案適用於大型資料集。
為 JSON 轉 XLSX 匯出做環境準備 - 前置條件與設定
在開始之前,請確保已滿足以下先決條件:
- 在您的機器上安裝了 Node.js 14+。
- 擁有包含 client ID 和 client secret 的 Aspose Cloud 帳戶。
- 需要能夠連接互聯網以進行 API 呼叫。
透過 npm 安裝 Aspose.3D Cloud SDK for Node.JS:
npm install aspose3dcloud
您也可以直接從發行頁面下載套件: Aspose.3D Cloud SDK for Node.JS Download.
將您的憑證設定為環境變數,或將其寫入 .env 檔案:
export ASPOSE_CLIENT_ID=YOUR_CLIENT_ID
export ASPOSE_CLIENT_SECRET=YOUR_CLIENT_SECRET
安裝好 SDK 並準備好憑證後,您已準備好執行轉換腳本。
關鍵要點
將 JSON 轉換為 XLSX 在 Node.JS 中變得簡單,只要利用 Aspose.3D Cloud SDK for Node.JS。該函式庫負責串流、驗證與格式轉換,同時保持低記憶體使用,這對大型 JSON 資料負載至關重要。提供的程式碼範例以及等效的 cURL 工作流程讓您可以在功能完整的函式庫與輕量級 REST 呼叫之間自由選擇。請務必保護您的 Aspose Cloud 憑證,並取得適當的授權以供正式環境使用。您可以從臨時授權頁面取得臨時授權,並在準備部署時升級為正式授權。
常見問題
我可以在 Node.JS 中將 JSON 轉換為 XLSX,而不將整個檔案載入記憶體嗎?
是的。SDK 的串流輔助工具(streamFileToBuffer)和 CSV 中介格式讓您能夠逐塊處理資料,實現 在 Node.JS 中將 JSON 轉換為 XLSX 的記憶體高效轉換。
SDK 在轉換時預期的輸入檔案格式是什麼?
轉換端點使用 CSV 作為中介格式。此範例會建立暫存的 CSV 檔案,因為 Aspose.3D 需要檔案輸入才能產生 XLSX。
當資料集超過一般記憶體限制時,我該如何處理?
使用程式碼中示範的串流方式。它使用讀取串流讀取來源檔案,逐行建立 CSV,並將緩衝區傳送至雲端服務,確保一次只在記憶體中保留少量資料。
是否有方法在 CI/CD 管道中自動化此過程?
當然可以。相同的 Node.JS 腳本可以從建置腳本中呼叫,cURL 命令也可以整合到 shell 步驟中。只需確保 ASPOSE_CLIENT_ID 和 ASPOSE_CLIENT_SECRET 這兩個環境變數已安全提供。