拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Xberg Elixir 绑定下的 XLSX 电子表格抽取实战:从 Smoke 测试到 Rust 内核原理

后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载本文围绕 xberg 仓库中面向 Elixir 语言的 XLSX 冒烟测试Smoke Test展开讲解如何用Xberg.extract/1从远程 URI 抽取.xlsx工作簿的文本、表格与格式元数据并结合 Rust 内核的 Excel 抽取器实现说明工作表到 Markdown 的转换、工作表统计、隐藏表处理与 DDE 公式安全检查等底层机制。读完本文你将掌握一条可复制、可验证的 XLSX 抽取链路理解输入结构体字段的语义、结果信封的解析方式并能读懂仓库内对应测试与源码将其迁移到自己的 Elixir 项目中。一、从一条 Smoke 测试片段说起xberg 仓库通过 alef 工具链把端到端E2E测试用例自动生成为多种语言Elixir、Rust、Go、Java、Python 等的可执行代码片段并沉淀为文档站点的 snippets。本文的关联文档 smoke_xlsx_basic.md 就是其中面向 Elixir 的一条冒烟测试片段主题为Smoke test: XLSX with basic spreadsheet data including tables其核心代码只有三行却完整覆盖了「构造输入 → 调用抽取 → 读取结果」的全流程input_value %Xberg.ExtractInput{kind: uri, mime_type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, uri: https://example.com/xlsx/stanley_cups.xlsx} result Xberg.extract_async(input_value, {}) IO.inspect(Enum.at(result.results, 0).metadata)注意片段中的Xberg.extract_async/2与 xberg.ex 中公开的Xberg.extract/1内部同样转发到Xberg.Native.extract_async属于同一套 API 的两种调用形态前者直接传(input, config_json)两个参数后者接受 Elixir 关键字列表。二者最终都落到同一 Rust 原生抽取入口返回值均为{:ok, map()} | {:error, atom, String.t()}。二、输入结构体 Xberg.ExtractInput 字段语义片段中构造的%Xberg.ExtractInput{}定义在 extract_input.ex其类型为%__MODULE__{ kind: Xberg.ExtractInputKind.t(), bytes: binary() | nil, uri: String.t() | nil, mime_type: String.t() | nil, filename: String.t() | nil, config: Xberg.FileExtractionConfig.t() | nil }针对本文的 XLSX 用例各字段含义如下字段取值说明kinduri或原子:uri输入来源类型。另有bytes用于直接传入二进制内容见下文「本地文件与字节输入」urihttps://example.com/xlsx/stanley_cups.xlsx目标文档地址。在测试环境中实际会被 mock server 拦截替换为本地 fixture 的响应mime_typeapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetOOXML XLSX 的标准 MIME 类型帮助内核跳过内容嗅探、直接命中 Excel 抽取器bytes/filename/confignil本次 URI 输入不需要config为nil表示使用默认抽取配置kind的合法取值定义在Xberg.ExtractInputKindpackages/elixir/lib/xberg/extract_input_kind.ex。在 URI 模式下显式声明mime_type是值得养成的习惯它避免了网络响应头缺失或错误时依赖内容嗅探的额外开销也让测试断言见下文更稳定。三、结果信封与 XLSX 相关的字段片段中result是Xberg.ExtractionResult见 extraction_result.ex其results字段是每个文档的Xberg.ExtractedDocument见 extracted_document.ex。与 XLSX 冒烟测试直接相关的几个字段content整个工作簿按工作表拼接的 Markdown 文本mime_type抽取后回传的 MIME 类型metadataXberg.Metadata其中metadata.format是带判别式的格式元数据联合见 format_metadata.exXLSX 对应%{format_type: :excel, excel: %Xberg.ExcelMetadata{...}}tables抽取到的表格结构列表每个元素是Xberg.Table见 table.ex含cells二维字符串数组、markdown、page_number等pages按工作表对齐的页面级内容。Xberg.ExcelMetadata见 excel_metadata.ex只有两个字段%Xberg.ExcelMetadata{ sheet_count: non_neg_integer() | nil, sheet_names: [String.t()] | nil }冒烟测试片段中IO.inspect(Enum.at(result.results, 0).metadata)打印的正是包含format.excel.sheet_count与format.excel.sheet_names的整份元数据可直接用于验证工作簿结构是否符合预期。四、如何运行与验证这条测试该片段不是孤立示例而是由 fixtures/smoke/xlsx_basic.json 这一 JSON 契约驱动生成的。fixture 中定义了六条断言全部应能在 Elixir 侧复现断言目标期望值results[0].mime_type等于application/vnd.openxmlformats-officedocument.spreadsheetml.sheetresults[0].content长度 ≥ 100results[0].content同时包含Team、Location、Stanley Cups、Blues、Flyers、Maple Leafs、STL、PHI、TOR等单元格文本results[0].tables数量 ≥ 1results[0].metadata.format.excel.sheet_count≥ 2results[0].metadata.format.excel.sheet_names包含Stanley Cups对应的 Elixir 测试位于 e2e/elixir/test/smoke_test.exs 的describe smoke_xlsx_basic块。测试通过环境变量定位 mock 服务器input_mock_base_url System.get_env(MOCK_SERVER_SMOKE_XLSX_BASIC) || #{System.get_env(MOCK_SERVER_URL)}/fixtures/smoke_xlsx_basic input_value %Xberg.ExtractInput{ kind: uri, mime_type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, uri: String.replace($mock_url/xlsx/stanley_cups.xlsx, $mock_url, input_mock_base_url) }fixture 的mock_responses段声明了路径/xlsx/stanley_cups.xlsx将返回 200 与application/octet-stream响应头、正文来自本地测试文件。测试运行时由 run-with-mock-server.sh 一类脚本拉起 mock server 按这些规则应答保证断言稳定可复现。在本地跑这条测试时只需确保MOCK_SERVER_URL指向一个能按 fixture 返回stanley_cups.xlsx的服务或直接使用仓库自带的 e2e 运行器。五、源码级原理Rust 侧 ExcelExtractor 的完整抽取链路Elixir 绑定只是薄封装真正的抽取逻辑在 Rust 内核。XLSX 的抽取器位于 crates/xberg/src/extractors/excel.rs/// Excel spreadsheet extractor using calamine. /// Supports: .xlsx, .xlsm, .xlam, .xltm, .xls, .xla, .xlsb, .ods pub struct ExcelExtractor;从源码结构可以梳理出以下关键机制1. 基于 calamine 的工作簿解析与元数据提取内核使用calamine解析 OOXML 工作簿并调用其sheets_metadata()收集工作表可见性信息见 excel.rs 中hidden_sheet_names的注释。工作表元数据随后被组装为ExcelMetadatalet sheet_names: VecString workbook.sheets.iter().map(|s| s.name.clone()).collect(); let sheet_count workbook.sheets.len() as u32; let excel_metadata ExcelMetadata { sheet_count: Some(sheet_count), sheet_names: Some(sheet_names), // ... };这直接对应 Elixir 侧metadata.format.excel.sheet_count / sheet_names两个字段冒烟测试中对二者的断言即在这一层得到满足。2. 每个工作表转换为「H2 标题 表格」build_internal_documentexcel.rs遍历工作簿的每个 sheet每个非空工作表在顶层content中先输出## 工作表名的 H2 标题再附上该表转换出的 Markdown每个 sheet 同时生成一个PageContent条目使ExtractedDocument.pages对 Excel 恒为Some且页索引与表索引一一对齐顶层content仍是所有工作表内容的拼接保持对旧调用方的兼容。工作表名会经过escape_sheet_name_for_heading处理转义#、、-、*、、、_、[、]、、等 Markdown 元字符防止恶意或异常命名的工作表破坏输出结构例如把Sales渲染成链接。值得注意的是该转义只作用于输出标题ExcelMetadata.sheet_names中始终保留原始名称。3. 隐藏工作表标记hidden_sheet_names从工作簿元数据的hidden_sheets条目calaminesheets_metadata()中逗号分隔的列表解析出隐藏/深度隐藏工作表集合输出标题时追加 (hidden)后缀使隐藏内容与可见内容在抽取结果中可区分。4. DDE 公式安全检查抽取器对每个单元格做正则匹配检测DDE(、WEBSERVICE(、HYPERLINK(、cmd|这类可引用外部资源的公式形态excel.rs每命中一个产生一条ProcessingWarning包含工作表名、基于 1 的行列坐标与分类结果警告数量上限为 100防止对抗性文档刷爆告警列表。calamine 通常会把公式解析为缓存结果值因此裸公式字符串较少出现但该扫描仍覆盖了「无缓存值时公式原样输出」的边界情况。5. 安全预算校验validate_workbook_budget遍历所有 sheet 的单元格通过SecurityBudget强制max_table_cells与max_content_size两项限制——行数 × 列数计入单元格预算每个单元格文本长度计入内容预算。这对超大工作簿与 zip 炸弹类文档是重要的防护线。六、将冒烟测试迁移到真实场景三种输入形态理解了测试契约与内核原理后可以按同样模式处理真实业务输入。1. 远程 URI与测试等价input %Xberg.ExtractInput{ kind: :uri, uri: https://example.com/reports/sales.xlsx, mime_type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet } case Xberg.extract(input: input, config: nil) do {:ok, %{results: [doc | _]}} - IO.puts(Format: #{inspect(doc.metadata.format)}) IO.puts(Sheets: #{inspect(doc.metadata.format.excel.sheet_names)}) IO.puts(Tables: #{length(doc.tables)}) IO.puts(doc.content) {:error, reason} - IO.puts(:stderr, Extraction failed: #{inspect(reason)}) endXberg.extract/1接受关键字列表input:、config:config可为nil、JSON 字符串或 map。同样地Xberg.extract_batch(inputs: [...])支持一次提交多个输入返回信封中每个结果一一对应。2. 本地文件字节输入对本地文件可用kind: :bytes直接读入input %Xberg.ExtractInput{ kind: :bytes, bytes: File.read!(sales.xlsx), filename: sales.xlsx, mime_type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet } {:ok, output} Xberg.extract(input: input, config: {}) doc Enum.at(output.results, 0) IO.inspect(doc.metadata.format.excel.sheet_count)filename与mime_type共同帮助内核完成格式路由缺省时内核会回退到内容嗅探。3. 自定义配置将冒烟测试中的{}替换为实际配置即可控制抽取行为。例如在 packages/elixir/README.md 中展示的 OCR 场景config %Xberg.ExtractionConfig{ ocr: %{enabled true, backend tesseract} } {:ok, output} Xberg.extract(input: input, config: config)表格抽取相关的配置项如table_chunking_mode、table_overlap_preference可参考packages/elixir/lib/xberg/下对应的Xberg.TableChunkingMode、Xberg.TableOverlapPreference等结构体定义。七、配套验证与延伸阅读格式级冒烟测试 format_specific_test.exs 的describe format_xlsx块以「不报错」为断言是比 smoke 更宽松的基线验证smoke 测试则把内容、表格、元数据三项都钉死二者互补。Rust 侧单元测试位于 crates/xberg/src/extractors/excel.rs 末尾如test_sheet_name_markdown_escape_in_heading专门验证异常工作表名的转义行为。需要进一步自定义结果处理时可阅读Xberg.ExcelSheetexcel_sheet.ex——每个工作表被建模为name、markdown、row_count、col_count、cell_count、table_cells六元组与内核的InternalDocument构建过程一一对应。Elixir 绑定支持的工作表格式范围.xlsx、.xlsm、.xlsb、.xls、.xla、.xlam、.xltm、.xltx、.xlt、.ods、.numbers与能力清单见 packages/elixir/README.md 的格式支持表。把仓库里这条 XLSX 冒烟测试当作模板你可以在本地快速验证抽取链路是否正常再按同样结构扩展到.xlsm、.xlsb等宏工作簿或.ods等其他电子表格格式——它们共用同一个ExcelExtractor与同一套安全预算与 DDE 扫描逻辑。赞分享后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载相关推荐Xberg Dart 绑定 XLSX 冒烟测试实战从 RustLib 初始化到电子表格元数据提取Xberg Dart 绑定 XLSX 冒烟测试实战从 RustLib 初始化到电子表格元数据提取 本篇指南以 Xberg 仓库中 Dart 语言的 XLSX后端AI 应用NLP使用 C 绑定提取 XLSX 电子表格Xberg 冒烟测试代码实战解析使用 C 绑定提取 XLSX 电子表格Xberg 冒烟测试代码实战解析 本文以 Xberg 仓库中的 C 冒烟测试片段 docs site/src/snip后端AI 应用NLP使用 xberg 的 Dart 绑定提取 XLSX 电子表格extract API 实战指南使用 xberg 的 Dart 绑定提取 XLSX 电子表格extract API 实战指南 本篇技术指南以仓库中自动生成的 Dart 示例文档 format后端AI 应用NLP上一篇抖音无水印下载终极指南5分钟掌握免费高清视频批量下载技巧下一篇3步告别网盘限速LinkSwift高速下载实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门