快速入门
LlamaSheets 是一个新的测试版 API,用于从杂乱的电子表格中提取区域和表格。文档理解的关键步骤是规范化输入。使用 LlamaSheets API,它将
- 智能识别每个电子表格中的区域
- 隔离并提取电子表格中的每个区域
- 将它们输出为Parquet文件,这是一种受多种语言支持的便携格式,能够保留类型信息。例如,您可以直接在Python中使用Pandas将这些文件加载为数据框。
- 生成关于区域(提取的位置、标题、描述)和电子表格(标题、描述)的额外元数据,以协助下游流程。
Python SDK 提供了一种跨多个 API 调用的端到端方法来完成提取。
from llama_cloud_services.beta.sheets import LlamaSheets, SpreadsheetParsingConfig
client = LlamaSheets(api_key="...")
results = await client.aextract_regions( "path_to_file.xlsx", # Supports paths, bytes, and streams config=SpreadsheetParsingConfig( sheet_names=None, # Parse all sheets generate_additional_metadata=True, # Generate titles/descriptions per sheet ))
# Download parquet filesfile_bytes = await client.adownload_region_result( results.id, results.regions[0].region_id, result_type="table", # can be `table`, `extra`, or `cell_metadata`)
# Download parquet files and convert to pandas dataframesdf = await client.adownload_region_as_dataframe( results.id, results.regions[0].region_id, result_type="table",)使用LlamaSheets API进行区域和表格提取通常包含4个主要步骤。
下面,我们将使用 Python SDK 和原始 HTTP 调用详细说明每个步骤。
首先,上传一个文件,并获取文件ID:
from llama_cloud_services.beta.sheets import LlamaSheets
# Initialize the clientclient = LlamaSheets(api_key="your_api_key")
# Upload a filefile_response = await client.aupload_file("path/to/your/spreadsheet.xlsx")print(f"File ID: {file_response.id}")curl -X POST "https://api.cloud.llamaindex.ai/api/v1/files" \ -H "Authorization: Bearer YOUR_API_KEY" \ -F "upload_file=@path/to/your/spreadsheet.xlsx"响应:
{ "id": "file-id-here", ...}2. 创建一个任务
Section titled “2. Create a job”使用文件ID,您可以创建一个提取任务以获取任务ID:
from llama_cloud_services.beta.sheets.types import SpreadsheetParsingConfig
# Create a job with optional configurationconfig = SpreadsheetParsingConfig( sheet_names=None, # Parse all sheets (default) generate_additional_metadata=True # Generate extra metadata)
job = await client.acreate_job(file_id=file_response.id, config=config)print(f"Job ID: {job.id}")print(f"Status: {job.status}")你也可以将配置作为字典传递:
job = await client.acreate_job( file_id=file_response.id, config={"generate_additional_metadata": True})curl -X POST "https://api.cloud.llamaindex.ai/api/v1/beta/sheets/jobs" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "file_id": "file-id-here", "config": { "sheet_names": null, "generate_additional_metadata": true } }'响应:
{ "id": "job-id-here", "file_id": "file-id-here", "status": "PENDING", "project_id": "project-id", "created_at": "2024-01-01T00:00:00Z", ...}现在您有了作业ID,可以等待作业完成:
# Wait for the job to complete (polls automatically)job_result = await client.await_for_completion(job_id=job.id)print(f"Job Status: {job_result.status}")
# Access extracted regions metadataif job_result.regions: print(f"Found {len(job_result.regions)} region(s)") for region in job_result.regions: print(f" - Region ID: {region.region_id}") print(f" Sheet: {region.sheet_name}") print(f" Location: {region.location}")
for worksheet_metadata in job_result.worksheet_metadata: print(f"Worksheet Title: {worksheet_metadata.title}") print(f"Worksheet Description: {worksheet_metadata.description}")或者,您可以手动轮询:
while True: job_result = await client.aget_job(job_id=job.id, include_results_metadata=True)
if job_result.status in ["SUCCESS", "PARTIAL_SUCCESS", "ERROR", "FAILURE"]: break
print(f"Status: {job_result.status}") await asyncio.sleep(5)# Poll for job statuscurl -X GET "https://api.cloud.llamaindex.ai/api/v1/beta/sheets/jobs/job-id-here?include_results=true" \ -H "Authorization: Bearer YOUR_API_KEY"完成时的响应:
{ "id": "job-id-here", "status": "SUCCESS", "regions": [ { "region_id": "region-id-1", "sheet_name": "Sheet1", "location": "A1:D10", "title": "Sales Data", "description": "Monthly sales figures" } ], ...}持续轮询直到 status 为以下之一:SUCCESS、PARTIAL_SUCCESS、ERROR 或 FAILURE。
完成作业后,您可以下载生成的Parquet文件并读取有关作业结果的任何附加元数据:
from llama_cloud_services.beta.sheets.types import SpreadsheetResultTypeimport pandas as pd
# Download a region directly as a pandas DataFrameregion_id = job_result.regions[0].region_idresult_type = job_result.regions[0].region_typedf = await client.adownload_region_as_dataframe( job_id=job.id, region_id=region_id, result_type=result_type, # Use region_type from result or `cell_metadata`)
print(f"Region shape: {df.shape}")print(df.head())
# Optionally, download cell metadatametadata_df = await client.adownload_region_as_dataframe( job_id=job.id, region_id=region_id, result_type=SpreadsheetResultType.CELL_METADATA)print(f"Metadata shape: {metadata_df.shape}")您也可以下载原始 Parquet 字节:
# Download as raw bytesparquet_bytes = await client.adownload_region_result( job_id=job.id, region_id=region_id, result_type=SpreadsheetResultType.TABLE)
# Save to filewith open("region.parquet", "wb") as f: f.write(parquet_bytes)# Step 1: Get presigned URL for the reginocurl -X GET "https://api.cloud.llamaindex.ai/api/v1/beta/sheets/jobs/job-id-here/regions/region-id-here/result/table" \ -H "Authorization: Bearer YOUR_API_KEY"响应:
{ "url": "https://s3.amazonaws.com/...", "expires_at": "2024-01-01T01:00:00Z"}# Step 2: Download the parquet file using the presigned URLcurl -X GET "https://s3.amazonaws.com/..." -o region.parquet
# Load with pandaspython -c "import pandas as pd; df = pd.read_parquet('region.parquet'); print(df.head())"要下载单元格元数据,请使用 result/cell_metadata 而非 result/table:
curl -X GET "https://api.cloud.llamaindex.ai/api/v1/beta/sheets/jobs/job-id-here/regions/region-id-here/result/cell_metadata" \ -H "Authorization: Bearer YOUR_API_KEY"当 LlamaSheets 任务成功完成后,您将收到关于提取区域的丰富结构化数据。本节将解释输出的不同组成部分。
任务结果对象包含:
{ "id": "job-id", "status": "SUCCESS", "file_id": "original-file-id", "config": { /* your parsing config */ }, "created_at": "2024-01-01T00:00:00Z", "updated_at": "2024-01-01T00:05:00Z", "regions": [ { "region_id": "uuid-here", "sheet_name": "Sheet1", "location": "A2:E11", "title": "Some title", "description": "Some description" } ], "worksheet_metadata": [ { "sheet_name": "Sheet1", "title": "Sales Data Q1 2024", "description": "Quarterly sales figures with revenue, units sold, and regional breakdowns" } ], "errors": []}关键字段:
regionsregions: 提取区域和表格的数组,包含其ID和位置信息worksheet_metadata: 为每个工作表生成标题和描述(当generate_additional_metadata: true时)status: 为以下之一:SUCCESS、PARTIAL_SUCCESS、ERROR或FAILURE
区域表数据(Parquet文件)
Section titled “Region Table Data (Parquet Files)”每个提取的区域都保存为包含标准化表格数据的Parquet文件。Parquet是一种列式存储格式,具有以下特点:
- 保留数据类型(日期、数字、字符串、布尔值)
- 具有高效率和压缩性
- 可以被 pandas、polars、DuckDB 及许多其他工具读取
示例区域结构:
import pandas as pd
df = pd.read_parquet("region.parquet")print(df.head())
# Output:# col_0 col_1 col_2 col_3 col_4# 0 44 -124.6 Value_0_2 2020-01-01 False# 1 153 -34.4 Value_1_2 2020-01-02 True# 2 184 34.4 Value_2_2 2020-01-03 False单元格元数据(Parquet文件)
Section titled “Cell Metadata (Parquet Files)”除了区域数据外,您还可以下载丰富的细胞级元数据,这些数据提供了提取区域中每个细胞的详细信息。这对于以下情况特别有用:
- 理解单元格格式与样式
- 分析表格结构与布局
- 检测数据类型和模式
- 为下游处理保留格式
以下类型的字段可用:
位置与布局:
row_number,column_number: 单元格坐标coordinatecoordinate: Excel 样式的单元格引用(例如,“A1”)relative_row_position,relative_column_position: 归一化位置(0.0 到 1.0)is_in_first_row,is_in_last_row,is_in_first_column,is_in_last_column: 布尔标志distance_from_origin,distance_from_center: 几何距离
格式化:
font_bold,font_italic: 字体样式标志font_sizefont_size: 字体大小(单位:点)font_color_rgb,background_color_rgb: 颜色值has_border,border_style_score: 边框信息horizontal_alignment,vertical_alignment: 对齐值text_wraptext_wrap: 文本换行设置
单元格属性:
is_merged_cellis_merged_cell: 该单元格是否为合并范围的一部分horizontal_size,vertical_size: 单元格尺寸alignment_indentalignment_indent: 缩进级别
数据类型检测:
data_typedata_type: 检测到的类型(数字、文本、日期等)is_date_likeis_date_like: 日期检测的布尔标志is_percentage,is_currency: 用于特殊数字格式的布尔标志number_format_categorynumber_format_category: Excel 数字格式类别text_lengthtext_length: 文本内容长度has_special_charshas_special_chars: 文本是否包含特殊字符
内容:
cell_value: 已处理的单元格值raw_cell_value: 原始未处理值
聚类与分组:
group,sub_group: 单元格分组标识符l0_category,f_group: 层次化分类
示例元数据使用:
import pandas as pd
# Load cell metadatametadata_df = pd.read_parquet("metadata.parquet")
# Find all header cells (first row)headers = metadata_df[metadata_df['is_in_first_row'] == True]
# Find all bolded cells (likely headers or emphasis)bold_cells = metadata_df[metadata_df['font_bold'] == True]
# Find date columnsdate_cells = metadata_df[metadata_df['is_date_like'] == True]date_columns = date_cells['column_number'].unique()
# Analyze formatting patternsprint(f"Font sizes used: {metadata_df['font_size'].unique()}")print(f"Data types present: {metadata_df['data_type'].unique()}")您可以为每个提取区域下载两种类型的parquet文件:
- 表格数据 (
result_type="table"): 实际表格内容 - 额外数据 (
result_type="extra"): 任何不严格属于数据表格的区域(注释、标题等) - 单元格元数据 (
result_type="cell_metadata"): 丰富的格式设置与位置元数据
所有数据均以parquet文件格式存储,可轻松加载到pandas DataFrame中进行数据分析。
作为测试阶段的一部分,有几个关键限制需要注意:
- 作业创建限制为每秒1个请求
- 工作表大小限制为最多100列或10,000行(以每个工作表先达到的限制为准)
除了仅仅提取区域外,还有许多下游用例可以封装这些输出。