将原始的 JSON 数据转换为精美的 XLSX 报告是从事分析仪表板的 Python 开发者的常见需求。Aspose.BarCode Cloud SDK for Python 提供了强大的库,可简化云端条形码生成和文件处理。在本指南中,您将学习在 Python 中进行 JSON 到 XLSX 的转换,包括设置 SDK、生成条形码图像以及导出最终电子表格。完成后,您将拥有一个可用于生产工作负载的可重用脚本。
开始之前:先决条件和安装
要遵循本教程,您需要:
- 在您的机器上安装了 Python 3.7 或更高版本。
- 您选择的 IDE 或文本编辑器(如 VS Code、PyCharm 等)。
- 拥有 Client Id 和 Client 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.json、output.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_128、EncodeBarcodeType.QR、EncodeBarcodeType.PDF_417等中选择。 - 图像格式 - 默认是 PNG,但您可以通过更改
format字段请求jpeg或gif。 - 图像尺寸 - 在脚本中调整
img.width和img.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 数据集的性能
在处理成千上万条记录时,请考虑以下优化措施:
- 流式处理 JSON 而不是加载整个文件 - 使用
ijson迭代记录,而不将整个列表保存在内存中。 - 缓存重复的条形码 - 示例代码中的
barcode_cache字典可防止对相同值进行重复的 API 调用。 - 明智地调整图像大小 - 较小的条形码图像可降低内存使用并加快工作簿保存速度。
- 批量写入行 - 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 需要为云调用购买许可证。