將 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 中的運作方式

轉換過程分為明確的階段,以保持低記憶體使用量:

  1. 讀取並驗證 JSON - 腳本使用 fs.readFileSync 讀取 JSON 檔案,然後呼叫 validateJsonData。此函式會檢查根節點是否為陣列,且每個元素是否為物件,以防止錯誤的輸入傳遞到後續階段。

    const jsonData = JSON.parse(fs.readFileSync(inputJsonPath, { encoding: 'utf8' }));
    validateJsonData(jsonData);
    
  2. Transform JSON to CSV - 只遍歷一次 JSON 陣列,程式在記憶體中建立 CSV 字串。標頭產生使用 Object.keys 於第一個物件,確保欄位順序與資料相符。

    const headers = Object.keys(jsonData[0]);
    const csvLines = [headers.map(h => `"${h.replace(/"/g, '""')}"`).join(',')];
    
  3. 寫入暫存 CSV 檔案 - CSV 內容寫入暫存檔 (temp_input.csv)。此步驟符合 Aspose.3D API 的需求,該 API 需要檔案輸入,同時仍允許之後進行串流。

fs.writeFileSync(tempCsvPath, csvContent, { encoding: 'utf8' });
  1. 將檔案串流至緩衝區 - streamFileToBuffer 讀取暫存的 CSV,使用讀取串流,將資料塊收集到單一的 Buffer 中。這樣可避免一次將整個檔案載入為單一大型字串。
const inputBuffer = await streamFileToBuffer(tempCsvPath);
  1. 執行轉換 - 建立一個 ConvertDocumentRequest,其 format: 'xlsx' 並使用緩衝的 CSV。SDK 將資料傳送至雲端服務,服務回傳 XLSX Buffer。

    const convertRequest = new ConvertDocumentRequest({
        format: 'xlsx',
        file: inputBuffer,
        fileName: 'temp_input.csv'
    });
    const conversionResult = await convertApi.convertDocument(convertRequest);
    
  2. 將 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 這兩個環境變數已安全提供。

進一步閱讀