将原始的 JSON 数据转换为精美的 XLSX 报告是从事分析仪表板的 Python 开发者的常见需求。Aspose.BarCode Cloud SDK for Python 提供了强大的库,可简化云端条形码生成和文件处理。在本指南中,您将学习在 Python 中进行 JSON 到 XLSX 的转换,包括设置 SDK、生成条形码图像以及导出最终电子表格。完成后,您将拥有一个可用于生产工作负载的可重用脚本。

开始之前:先决条件和安装

要遵循本教程,您需要:

  • 在您的机器上安装了 Python 3.7 或更高版本。
  • 您选择的 IDE 或文本编辑器(如 VS Code、PyCharm 等)。
  • 拥有 Client IdClient Secret 的 Aspose Cloud 帐户。
  • 用于云 API 调用的互联网访问。

使用 pip 安装所需的包:

pip install aspose-barcode-cloud openpyxl

如果您更喜欢手动安装,请从官方发布页面下载 SDK: 下载 Aspose.BarCode Cloud SDK for Python

在进行任何 API 调用之前,请配置您的凭据:

from asposebarcodecloud import Configuration

CLIENT_ID = "YOUR_CLIENT_ID"
CLIENT_SECRET = "YOUR_CLIENT_SECRET"

config = Configuration()
config.host = "https://api.aspose.cloud"
config.api_key["client_id"] = CLIENT_ID
config.api_key["client_secret"] = CLIENT_SECRET

环境准备好后,我们可以继续实现。

一步一步构建:Python 中的 JSON 到 XLSX 转换

步骤 1:加载源 JSON 文件

读取包含您想要导出的数据的 JSON 数组。

import json

INPUT_JSON_PATH = "input.json"
with open(INPUT_JSON_PATH, "r", encoding="utf-8") as f:
    json_data = json.load(f)   # expects a list of dictionaries

步骤 2:准备工作簿和标题行

使用 OpenPyXL 创建 Excel 工作簿并写入列标题。

from openpyxl import Workbook
from openpyxl.utils import get_column_letter

wb = Workbook()
ws = wb.active
ws.title = "Data"

columns = list(json_data[0].keys())
columns.append("BarcodeImage")          # extra column for the barcode
for col_idx, col_name in enumerate(columns, start=1):
    ws.cell(row=1, column=col_idx, value=col_name)

步骤 3:生成条形码图像

使用 Aspose.BarCode Cloud 为每条记录创建一个 PNG 条形码。
BarcodeApi.generate_barcode 的 API 参考可在 API 参考 中获取。

from asposebarcodecloud import BarcodeApi, GenerateBarcodeRequest, EncodeBarcodeType, ApiClient
from asposebarcodecloud.rest import ApiException

barcode_api = BarcodeApi(ApiClient(config))

def generate_barcode_image(text: str,
                           barcode_type: EncodeBarcodeType = EncodeBarcodeType.CODE_128) -> bytes:
    request = GenerateBarcodeRequest(text=text, type=barcode_type, format="png")
    try:
        response = barcode_api.generate_barcode(request)
        return response.read()
    except ApiException as e:
        print(f"Error generating barcode for '{text}': {e}")
        raise

步骤 4:将条形码插入工作表

缓存相同的条形码以避免冗余的 API 调用,然后嵌入图像。

import io
from openpyxl.drawing.image import Image as XLImage

barcode_cache = {}
for row_idx, record in enumerate(json_data, start=2):
    # write regular fields
    for col_idx, field_name in enumerate(columns[:-1], start=1):
        ws.cell(row=row_idx, column=col_idx, value=record.get(field_name, ""))

# barcode generation / caching
    barcode_source = str(record.get("code", f"row{row_idx}"))
    img_bytes = barcode_cache.get(barcode_source) or generate_barcode_image(barcode_source)
    barcode_cache[barcode_source] = img_bytes

img_stream = io.BytesIO(img_bytes)
    img = XLImage(img_stream)
    img.width, img.height = 150, 50          # optional size adjustment
    img_cell = f"{get_column_letter(len(columns))}{row_idx}"
    ws.add_image(img, img_cell)

步骤5:自动调整列宽并保存工作簿

完成文件并将其写入磁盘。

for col_idx in range(1, len(columns) + 1):
    column_letter = get_column_letter(col_idx)
    ws.column_dimensions[column_letter].width = 20

OUTPUT_XLSX_PATH = "output.xlsx"
wb.save(OUTPUT_XLSX_PATH)
print(f"Conversion complete. XLSX saved to '{OUTPUT_XLSX_PATH}'.")

通过这些步骤,JSON 到 XLSX 的转换已完成,并且每行现在都包含由 Aspose.BarCode 生成的条形码图像。

完整的 JSON 转 XLSX 脚本(Python) - 完整代码示例

以下示例演示了使用 Aspose.BarCode Cloud SDK for Python 将 JSON 转换为 XLSX 的端到端实现。

import json
import os
import io
from typing import Dict, Any, List

import asposebarcodecloud
from asposebarcodecloud import (
    BarcodeApi,
    GenerateBarcodeRequest,
    EncodeBarcodeType,
    Configuration,
    ApiClient,
)
from asposebarcodecloud.rest import ApiException

from openpyxl import Workbook
from openpyxl.drawing.image import Image as XLImage
from openpyxl.utils import get_column_letter

# -------------------- Aspose.BarCode Cloud Setup --------------------
# Replace these placeholders with your actual Aspose Cloud credentials.
CLIENT_ID = "YOUR_CLIENT_ID"
CLIENT_SECRET = "YOUR_CLIENT_SECRET"

config = Configuration()
config.host = "https://api.aspose.cloud"
config.api_key["client_id"] = CLIENT_ID
config.api_key["client_secret"] = CLIENT_SECRET

barcode_api = BarcodeApi(ApiClient(config))

def generate_barcode_image(text: str, barcode_type: EncodeBarcodeType = EncodeBarcodeType.CODE_128) -> bytes:
    """
    Calls Aspose.BarCode Cloud to generate a barcode image for the given text.
    Returns raw PNG bytes.
    """
    request = GenerateBarcodeRequest(
        text=text,
        type=barcode_type,
        format="png"
    )
    try:
        response = barcode_api.generate_barcode(request)
        # response is a file-like object; read its content.
        return response.read()
    except ApiException as e:
        print(f"Error generating barcode for '{text}': {e}")
        raise

# -------------------- JSON to XLSX Conversion --------------------
INPUT_JSON_PATH = "input.json"
OUTPUT_XLSX_PATH = "output.xlsx"

# Load JSON data (expects a list of dictionaries)
with open(INPUT_JSON_PATH, "r", encoding="utf-8") as f:
    json_data: List[Dict[str, Any]] = json.load(f)

if not isinstance(json_data, list):
    raise ValueError("JSON root must be an array of objects.")

# Prepare workbook
wb = Workbook()
ws = wb.active
ws.title = "Data"

# Determine column order from first record
columns = list(json_data[0].keys())
# Append a column for the barcode image
barcode_column_name = "BarcodeImage"
columns.append(barcode_column_name)

# Write header row
for col_idx, col_name in enumerate(columns, start=1):
    ws.cell(row=1, column=col_idx, value=col_name)

# Cache to avoid regenerating identical barcodes
barcode_cache: Dict[str, bytes] = {}

# Process each JSON record
for row_idx, record in enumerate(json_data, start=2):
    # Write regular fields
    for col_idx, field_name in enumerate(columns[:-1], start=1):
        value = record.get(field_name, "")
        ws.cell(row=row_idx, column=col_idx, value=value)

# Generate or retrieve barcode image for a specific field (e.g., "code")
    barcode_source = str(record.get("code", f"row{row_idx}"))
    if barcode_source in barcode_cache:
        img_bytes = barcode_cache[barcode_source]
    else:
        img_bytes = generate_barcode_image(barcode_source)
        barcode_cache[barcode_source] = img_bytes

# Insert barcode image into the last column of the current row
    img_stream = io.BytesIO(img_bytes)
    img = XLImage(img_stream)
    # Adjust image size (optional)
    img.width, img.height = 150, 50
    img_cell = f"{get_column_letter(len(columns))}{row_idx}"
    ws.add_image(img, img_cell)

# Auto‑size columns (basic heuristic)
for col_idx, _ in enumerate(columns, start=1):
    column_letter = get_column_letter(col_idx)
    ws.column_dimensions[column_letter].width = 20

# Save workbook
wb.save(OUTPUT_XLSX_PATH)

print(f"Conversion complete. XLSX saved to '{OUTPUT_XLSX_PATH}'.")

注意: 此代码示例演示了核心功能。在项目中使用之前,请确保更新文件路径(input.jsonoutput.xlsx 等)以匹配实际文件位置,验证所有必需的依赖项已正确安装,并在开发环境中彻底测试。如果遇到任何问题,请参阅官方文档或联系支持团队获取帮助。

使用 cURL 和 REST API 执行相同任务

如果您更喜欢纯 REST 方法,您可以使用几个 cURL 命令实现相同的结果。工作流与 Python 实现相同:获取访问令牌、上传 JSON 文件、生成条形码、创建 XLSX 文件并下载结果。

1. 进行身份验证并获取访问令牌

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"

响应中包含 access_token,您将在后续调用中使用它。

2. 将源 JSON 文件上传到 Aspose Cloud Storage

curl -X PUT "https://api.aspose.cloud/v3.0/storage/file/input.json" \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
     -H "Content-Type: application/json" \
     --data-binary @input.json

3. 为示例值生成条形码图像

curl -X POST "https://api.aspose.cloud/v3.0/barcode/generate" \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{
           "text": "SampleCode123",
           "type": "Code128",
           "format": "png"
         }' \
     -o barcode.png

4. 使用 Aspose.Cells Cloud 将 JSON 转换为 XLSX

curl -X POST "https://api.aspose.cloud/v3.0/cells/convert?format=xlsx" \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{"FileName":"input.json"}' \
     -o output.xlsx

5. 下载生成的 XLSX 文件

curl -X GET "https://api.aspose.cloud/v3.0/storage/file/output.xlsx" \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
     -o output.xlsx

这些命令演示了如何在不编写任何代码的情况下执行相同的 JSON 到 XLSX 的转换。更多详情,请参阅官方 API 文档

配置转换选项以获得最佳结果

Aspose.BarCode Cloud 提供了多个参数,您可以根据项目需求进行调整:

  • 条形码类型 - 可从 EncodeBarcodeType.CODE_128EncodeBarcodeType.QREncodeBarcodeType.PDF_417 等中选择。
  • 图像格式 - 默认是 PNG,但您可以通过更改 format 字段请求 jpeggif
  • 图像尺寸 - 在脚本中调整 img.widthimg.height 以控制分辨率。
  • 列宽 - 修改 ws.column_dimensions[column_letter].width 以适应更长的文本。

更改条形码类型和图像格式的示例:

def generate_barcode_image(text: str,
                           barcode_type: EncodeBarcodeType = EncodeBarcodeType.QR,
                           image_format: str = "jpeg") -> bytes:
    request = GenerateBarcodeRequest(
        text=text,
        type=barcode_type,
        format=image_format
    )
    response = barcode_api.generate_barcode(request)
    return response.read()

优化大型 JSON 数据集的性能

在处理成千上万条记录时,请考虑以下优化措施:

  1. 流式处理 JSON 而不是加载整个文件 - 使用 ijson 迭代记录,而不将整个列表保存在内存中。
  2. 缓存重复的条形码 - 示例代码中的 barcode_cache 字典可防止对相同值进行重复的 API 调用。
  3. 明智地调整图像大小 - 较小的条形码图像可降低内存使用并加快工作簿保存速度。
  4. 批量写入行 - OpenPyXL 支持批量写入行;将写入操作分组可降低开销。

应用这些技巧,即使在处理海量数据集时,也能保持转换快速且内存高效。

结论

在 Python 中进行 JSON 到 XLSX 的转换变得简单,只需利用 Aspose.BarCode Cloud SDK for Python 的强大功能。本指南将带您完成环境设置、条形码生成、工作簿创建以及性能调优,为构建报告流水线提供坚实的基础。请记住,生产部署需要商业许可证;您可以在产品页面查看定价选项,或从 临时许可证页面 获取临时许可证。有了提供的代码和最佳实践建议,您即可将可靠的数据导出功能集成到您的应用程序中。

FAQs

  • 如何在 Python 中实现 JSON 到 XLSX 的转换,而无需编写自己的条形码逻辑?
    使用 Aspose.BarCode Cloud SDK 自动生成条形码,并将其与 OpenPyXL 结合用于 Excel 创建,如完整代码示例所示。

  • 在 JSON 输入中处理缺失字段的推荐方法是什么?
    使用 record.get("field_name", "") 访问字典值,以提供默认的空字符串,防止在工作表填充期间出现运行时错误。

  • 是否对我可以处理的 JSON 文件大小有限制?
    云 API 本身没有硬性限制,但对于非常大的文件,您应该像性能章节中描述的那样流式处理 JSON 并缓存条形码。

  • 在创建 XLSX 文件时,我需要为 Aspose.Cells 单独购买许可证吗?
    不需要。XLSX 生成是在本地使用 OpenPyXL 完成的,因此只有 Aspose.BarCode Cloud SDK 需要为云调用购买许可证。

阅读更多