How to Use CSS-Like Selectors and Boolean Operators in the OfficeCLI Query Command
The officecli query command implements a CSS-inspired selector engine that supports implicit AND logic between attribute predicates, comma-separated OR unions, and content-based pseudo-selectors like :contains and :empty to target elements in Word, Excel, and PowerPoint documents.
The iOfficeAI/OfficeCLI repository provides a command-line interface for programmatically searching Office documents. The query command uses a CSS-like selector syntax to filter paragraphs, table rows, shapes, and slides, allowing complex boolean logic to pinpoint exactly the data you need without manual parsing.
Architecture of the Selector Engine
The query system is distributed across three architectural layers in the source code. In src/officecli/CommandBuilder.GetQuery.cs, the CLI entry point receives the raw selector string and dispatches it to the appropriate document handler based on file extension. The src/officecli/Core/AttributeFilter.cs file contains the core parsing logic, which tokenizes selectors into element types, attribute predicates, and pseudo-selectors while handling boolean composition. Finally, format-specific handlers—WordHandler.Query.cs, ExcelHandler.Query.RowWhere.cs, and PowerPointHandler.Query.cs—map these abstract selectors to concrete OOXML document object model queries.
CSS-Like Selector Syntax
Element and Attribute Selectors
Target specific OOXML element types using tag-like names followed by optional attribute predicates in square brackets. The engine supports standard comparison operators including equality (=), inequality (!=), greater than (>), less than (<), and pattern matching (~=).
# Select rows where Score is greater than 80
officecli query document.xlsx 'row[Score>80]'
# Select cells with non-zero values
officecli query document.xlsx 'cell[value!=0]'
# Regex match: formulas containing "SUM"
officecli query document.xlsx 'cell[formula~=SUM]'
Pseudo-Selectors
Filter elements based on content state using CSS-style pseudo-selectors. According to AttributeFilter.cs implementation, the following filters are supported:
:contains("text")– Elements containing the specified substring:empty– Elements with no text content:no-alt– Elements missing alternative text attributes
# Find paragraphs containing the word "Quarterly"
officecli query document.docx 'paragraph:contains("Quarterly")'
# Find empty table cells
officecli query document.xlsx 'cell:empty'
Combinators
Navigate the document hierarchy using child and descendant combinators:
- Space (descendant): Matches any depth nesting (
slide shapefinds shapes anywhere inside slides) >(direct child): Matches only immediate children (slide > shapeexcludes nested group shapes)
# Direct children only
officecli query presentation.pptx 'slide > shape'
# Any depth descendants
officecli query presentation.pptx 'slide shape'
Boolean Operators in OfficeCLI Queries
Implicit AND (Conjunction)
Multiple attribute predicates within the same square brackets create an implicit AND relationship. The AttributeFilter.cs engine requires all predicates to evaluate true for an element to match. Separate predicates with spaces.
# Rows where Score > 80 AND Year < 2025
officecli query report.xlsx 'row[Score>80 Year<2025]'
You can also chain element selectors with combinators, which also implies AND logic (the element must satisfy both positional and attribute constraints).
Explicit OR (Union)
Use commas to separate selectors and create a union of result sets, equivalent to CSS group selectors. This implements logical OR.
# All shapes OR pictures
officecli query presentation.pptx 'shape, picture'
# Rows matching either condition
officecli query data.xlsx 'row[Status="Draft"], row[Priority=1]'
Complex Boolean Logic
Combine commas and bracketed predicates to express nested boolean logic. The comma operator has lower precedence than the implicit AND within brackets.
# (Score > 80 AND Year < 2025) OR Status = "Closed"
officecli query metrics.xlsx 'row[Score>80 Year<2025], row[Status="Closed"]'
Practical Examples by File Type
Word Documents (.docx)
Use paragraph, run, and field selectors to search Word documents stored in the Open XML format.
# Fields containing page references
officecli query contract.docx 'field:contains("Page")' --json
# Empty paragraphs that are direct children of the body
officecli query document.docx 'body > paragraph:empty' --json
Excel Spreadsheets (.xlsx)
The row and cell selectors work with the ExcelHandler.Query.RowWhere.cs implementation to filter tabular data.
# Cells with formulas containing errors
officecli query budget.xlsx 'cell[formula]:contains("#REF!")' --json
# Numeric comparison on cell values
officecli query sales.xlsx 'cell[Revenue>100000]' --json
PowerPoint Presentations (.pptx)
Target slides, shapes, pictures, and text frames using the PowerPointHandler.Query.cs implementation.
# Shapes with specific fill colors
officecli query deck.pptx 'shape[fill="1E2761"]' --json
# Pictures missing alt text
officecli query presentation.pptx 'picture:no-alt' --json
Advanced Regex Matching
The ~= operator enables substring matching against attributes, useful for detecting partial formula matches or pattern-based content.
# All cells with formulas containing "VLOOKUP" or "HLOOKUP"
officecli query data.xlsx 'cell[formula~=LOOKUP]' --json
Summary
- Element selection uses CSS-like tags (
row,cell,shape) filtered by attributes in square brackets - Implicit AND combines multiple predicates within
[attr1=value1 attr2=value2] - Explicit OR uses comma-separated selectors (
selector1, selector2) to union result sets - Pseudo-selectors (
:contains,:empty,:no-alt) filter based on content state - Combinators (
>, space) navigate parent-child relationships in the OOXML hierarchy - All selectors are case-insensitive for element names and attribute keys
Frequently Asked Questions
How do I perform an OR operation between different element types?
Use a comma to separate selectors. The query shape, picture, table returns a union of all shapes, pictures, and tables found in the document. This is parsed by AttributeFilter.cs as three independent queries whose results are merged.
Are CSS selectors case-sensitive in OfficeCLI?
No. According to the implementation in AttributeFilter.cs, both element names (like Row vs row) and attribute keys are normalized to lowercase before evaluation, making the query syntax case-insensitive for easier command-line usage.
Can I nest boolean operators to create complex conditions?
Yes. You can combine implicit AND within brackets with explicit OR via commas. For example, slide[layout="Title"] > shape, picture:contains("Logo") finds shapes that are direct children of title slides OR pictures containing the text "Logo".
What file formats support the query command?
The CommandBuilder.GetQuery.cs dispatcher supports Word .docx (handled by WordHandler.Query.cs), Excel .xlsx (handled by ExcelHandler.Query.RowWhere.cs), and PowerPoint .pptx (handled by PowerPointHandler.Query.cs) formats based on the Open XML standard.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →