Chuyển đổi dữ liệu JSON thành bảng tính Excel là một yêu cầu thường gặp cho các kịch bản báo cáo, phân tích dữ liệu và tích hợp. Aspose.3D Cloud SDK for Node.JS cung cấp một thư viện mạnh mẽ giúp thực hiện chuyển đổi này một cách hiệu quả trên phía máy chủ. Trong hướng dẫn này, bạn sẽ học cách truyền luồng JSON, xác thực cấu trúc của nó, chuyển đổi sang CSV, và cuối cùng tạo ra một tệp XLSX với dung lượng bộ nhớ tối thiểu bằng cách sử dụng Aspose.3D.

Ví dụ mã hoàn chỉnh: JSON sang XLSX Streaming trong Node.JS

Ví dụ này minh họa cách đọc một tệp JSON, chuyển nó thành một tệp CSV trung gian, và sau đó sử dụng Aspose.3D Cloud SDK để tạo một sổ làm việc 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);
    }
})();

Lưu ý: Ví dụ mã này minh họa chức năng cốt lõi. Trước khi sử dụng trong dự án của bạn, hãy chắc chắn cập nhật mọi đường dẫn tệp và giá trị cấu hình để phù hợp với môi trường thực tế của bạn, xác minh rằng tất cả các phụ thuộc cần thiết đã được cài đặt đúng cách, và kiểm tra kỹ lưỡng trong môi trường phát triển. Nếu gặp bất kỳ vấn đề nào, vui lòng tham khảo tài liệu chính thức hoặc liên hệ với đội hỗ trợ để được trợ giúp.

Chuyển đổi JSON sang XLSX qua REST API bằng cURL

Bạn có thể đạt được kết quả tương tự mà không cần viết bất kỳ mã nào bằng cách gọi trực tiếp endpoint chuyển đổi Aspose.3D. Các bước dưới đây cho thấy cách lấy token truy cập, tải lên tệp CSV, yêu cầu chuyển đổi và tải xuống kết quả 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

Các lệnh trên minh họa một quy trình hoàn chỉnh từ đầu đến cuối cho các kịch bản JSON to XLSX in Node.JS nơi bạn ưu tiên cách tiếp cận REST thuần túy. Để biết thêm chi tiết, xem tài liệu API chính thức.

Cách hoạt động của JSON sang XLSX tiết kiệm bộ nhớ trong Node.JS

Quá trình chuyển đổi được chia thành các giai đoạn rõ ràng giúp giảm thiểu việc sử dụng bộ nhớ:

  1. Đọc và Xác thực JSON - Kịch bản sử dụng fs.readFileSync để tải tệp JSON và sau đó gọi validateJsonData. Hàm này kiểm tra rằng gốc là một mảng và mỗi phần tử là một đối tượng, ngăn chặn dữ liệu đầu vào bị lỗi tới các giai đoạn sau.
const jsonData = JSON.parse(fs.readFileSync(inputJsonPath, { encoding: 'utf8' }));
validateJsonData(jsonData);
  1. Chuyển đổi JSON sang CSV - Bằng cách lặp qua mảng JSON chỉ một lần, mã tạo một chuỗi CSV trong bộ nhớ. Việc tạo tiêu đề sử dụng Object.keys trên đối tượng đầu tiên, đảm bảo thứ tự cột khớp với dữ liệu.

    const headers = Object.keys(jsonData[0]);
    const csvLines = [headers.map(h => `"${h.replace(/"/g, '""')}"`).join(',')];
    
  2. Ghi Tệp CSV Tạm Thời - Nội dung CSV được ghi vào một tệp tạm thời (temp_input.csv). Bước này đáp ứng yêu cầu của Aspose.3D API, vốn yêu cầu đầu vào là tệp, đồng thời vẫn cho phép streaming sau này.

fs.writeFileSync(tempCsvPath, csvContent, { encoding: 'utf8' });
  1. Stream File to Buffer - streamFileToBuffer đọc tệp CSV tạm thời bằng một luồng đọc, thu thập các đoạn dữ liệu thành một Buffer duy nhất. Điều này tránh việc tải toàn bộ tệp vào một chuỗi lớn duy nhất cùng một lúc.

    const inputBuffer = await streamFileToBuffer(tempCsvPath);
    
  2. Thực hiện chuyển đổi - Một ConvertDocumentRequest được tạo với format: 'xlsx' và CSV đã được đệm. SDK gửi dữ liệu tới dịch vụ đám mây, dịch vụ trả về một Buffer XLSX.

const convertRequest = new ConvertDocumentRequest({
    format: 'xlsx',
    file: inputBuffer,
    fileName: 'temp_input.csv'
});
const conversionResult = await convertApi.convertDocument(convertRequest);
  1. Ghi XLSX ra Đĩa - Bộ đệm kết quả được ghi ra bằng writeBufferToFile, hoàn thành quy trình mà không bao giờ giữ toàn bộ tệp XLSX trong bộ nhớ lâu hơn mức cần thiết.
    await writeBufferToFile(conversionResult, outputXlsxPath);
    

Mỗi bước được thiết kế cho JSON to XLSX Streaming in Node.JS và JSON to XLSX memory efficient in Node.JS, làm cho giải pháp phù hợp với các bộ dữ liệu lớn.

Chuẩn bị môi trường cho xuất JSON sang XLSX - Yêu cầu và Cài đặt

Trước khi bắt đầu, hãy đảm bảo các yêu cầu tiên quyết sau đã được đáp ứng:

  • Node.js 14+ được cài đặt trên máy của bạn.
  • Một tài khoản Aspose Cloud với client ID và client secret.
  • Truy cập internet để thực hiện các cuộc gọi API.

Cài đặt Aspose.3D Cloud SDK cho Node.JS thông qua npm:

npm install aspose3dcloud

Bạn cũng có thể tải gói trực tiếp từ trang phát hành: Aspose.3D Cloud SDK for Node.JS Tải xuống.

Cấu hình thông tin xác thực của bạn dưới dạng biến môi trường hoặc đặt chúng trong tệp .env:

export ASPOSE_CLIENT_ID=YOUR_CLIENT_ID
export ASPOSE_CLIENT_SECRET=YOUR_CLIENT_SECRET

Với SDK đã được cài đặt và thông tin xác thực đã sẵn sàng, bạn đã chuẩn bị để chạy script chuyển đổi.

Những điểm chính

Chuyển đổi JSON sang XLSX trong Node.JS trở nên đơn giản khi bạn sử dụng Aspose.3D Cloud SDK for Node.JS. Thư viện xử lý việc stream, xác thực và chuyển đổi định dạng trong khi giữ mức sử dụng bộ nhớ thấp, điều này rất quan trọng đối với các payload JSON lớn. Ví dụ mã được cung cấp và quy trình cURL tương đương cho phép bạn linh hoạt lựa chọn giữa một thư viện đầy đủ tính năng hoặc một cuộc gọi REST nhẹ. Hãy nhớ bảo mật thông tin đăng nhập Aspose Cloud của bạn và lấy giấy phép phù hợp cho việc sử dụng trong môi trường sản xuất. Bạn có thể nhận giấy phép tạm thời từ trang giấy phép tạm thời và nâng cấp lên giấy phép đầy đủ khi bạn sẵn sàng triển khai.

Câu hỏi thường gặp

Tôi có thể chuyển đổi JSON sang XLSX trong Node.JS mà không tải toàn bộ tệp vào bộ nhớ không?

Có. Các công cụ hỗ trợ streaming của SDK (streamFileToBuffer) và định dạng trung gian CSV cho phép bạn xử lý dữ liệu từng đoạn, đạt được việc chuyển đổi JSON sang XLSX tiết kiệm bộ nhớ trong Node.JS.

Định dạng tệp nào SDK mong đợi làm đầu vào cho việc chuyển đổi?

Endpoint chuyển đổi hoạt động với CSV làm định dạng trung gian. Ví dụ tạo một tệp CSV tạm thời vì Aspose.3D yêu cầu đầu vào là tệp trước khi tạo ra XLSX.

Làm thế nào để tôi xử lý các bộ dữ liệu lớn vượt quá giới hạn bộ nhớ thông thường?

Sử dụng phương pháp streaming được trình bày trong mã. Nó đọc tệp nguồn bằng một luồng đọc, tạo CSV từng dòng một, và gửi bộ đệm tới dịch vụ đám mây, đảm bảo chỉ có các phần nhỏ nằm trong bộ nhớ tại bất kỳ thời điểm nào.

Có cách nào để tự động hoá quy trình trong pipeline CI/CD không?

Chắc chắn. Script Node.JS giống nhau có thể được gọi từ các script xây dựng, và các lệnh cURL có thể được tích hợp vào các bước shell. Chỉ cần đảm bảo các biến môi trường cho ASPOSE_CLIENT_ID và ASPOSE_CLIENT_SECRET được cung cấp một cách an toàn.

Đọc Thêm