What you can ask
There is no command syntax and no menu of features. You type a sentence and EDI works out whether it is a question about the data, a chart, or an instruction to change the sheet. This is what it currently does with each.
Questions about the data
The common case. Your question becomes read-only SQL, runs against the sheet, and the rows come back as prose. Nothing is changed.
| Ask | You get |
|---|---|
Which region had the highest total revenue? | The answer, the number, and two follow-up questions worth asking next |
how many orders came from the East region? | A count |
what is the average unit price? | An average |
compare the East and West regions | A comparison across several measures at once |
what is this data about | A description of the sheet, inferred from its columns and values |
Column names do not need to be quoted or spelled exactly as the header. the model is reading the sheet, so “revenue” finds a column called Revenue.
Charts
When an answer is shaped like a chart, you get one. The backend returns a spec (chart type, axis, series, rows) and the browser draws it, so what arrives is data rather than a picture.
Chart total revenue by month
plot total revenue by region as a bar chartEach chart carries a View data control, so the numbers behind it are always one click away rather than something you have to take on trust.
Finding problems
| Ask | You get |
|---|---|
analyze this data | A pass over the whole sheet for anomalies and things worth a second look |
are there any missing values? | Which columns have gaps, or confirmation that none do |
are there any duplicate rows? | A count, without changing anything |
remove duplicate rows | The duplicates gone, and a note of how many |
Changing what you see
These reorder or hide rows. The underlying data is untouched.
| Ask | You get |
|---|---|
sort the sheet by revenue, highest first | Sorted, with the direction confirmed back to you |
sort revenue from largest to smallest | Same. descending, high to low and Z-A all read |
filter Region equals East | Only matching rows left visible |
filter Category contains Grinders | Same, matching on part of a value |
filter rows where Revenue is over 5000 | A numeric comparison |
filter Units at least 10 | Same. >=, under, at most and the rest all read |
show all rows again | Every filter cleared |
freeze the first row | Headers pinned while you scroll |
Which way a sort runs is read from your sentence, not decided by the model. That matters on a small local model: one was asked to sort “descending” and sorted ascending, then reported success. The word is in the sentence, so there is nothing to infer. The model is only consulted when the sentence does not say, and then the default is ascending.
Filters match on equals, contains, or a numeric comparison, and take a column by name or by letter (filter column C with the value West). Rows whose value is not a number are hidden by a comparison rather than kept, so a column with stray text in it does not quietly widen the result.
Changing how it looks
| Ask | You get |
|---|---|
make the header row bold | Bold. Also works on a cell (make A1 bold) or a column |
highlight revenue over 5000 in green | A background colour on the cells that qualify |
autofit the columns | Every column widened to its content |
format this sheet nicely | Currency, dates and numbers detected and formatted in one pass |
Name a colour when you highlight. Without one you get asked for it rather than a guess.
Changing the data
| Ask | You get |
|---|---|
replace East with Eastern | Every instance replaced, and a count of them |
delete column I | The column removed. delete the Rep column works too |
hide the Rep column | Hidden, not deleted. show the Rep column brings it back |
rename column C to Area | A new header, the data untouched |
add a column called Margin | An empty column on the end, headed Margin |
insert 2 columns before D | Two empty columns. after D puts them on the other side |
translate the Region column to French | A new Region_Translated column, leaving the original alone |
Everything here is saved as you go, and Download as CSV in the workbook menu gets it back out.
Formulas
Ask for a formula and you get the formula, not the answer, with an Apply button under it. Nothing changes in the sheet until you press it, which is the point: a formula lands in cells you picked, so a wrong one should be something you read and ignore rather than something you undo.
what formula would sum revenue for the South region
add a column called unit_price that is revenue divided by units
give me a formula for the average units per orderTwo things can come back. An aggregate, =SUMIF(B:B,"South",E:E), goes into one cell, and the button names which: click a cell in the sheet first and it goes there. A per-row calculation, =E2/D2, becomes a new column at the end, headed with the name you gave, filled down every row with the references shifted as a spreadsheet would shift them.
It is a real formula in a real cell, not a computed value: edit a number the formula depends on and it recalculates, which is the reason to want one rather than asking for the number.
Naming a column
Anywhere a column is called for, three ways of naming it all work: the spreadsheet letter (C, and AA past Z), the position (column 3), or the header itself (the Rep column). They used to differ per operation: sorting and filtering took names while deleting and hiding took a single letter, which meant delete the Rep column failed for no reason a reader could see.
A header wins over a letter when they collide, so a sheet with a column genuinely headed “C” is still reachable by name. A partial match only counts when exactly one header contains what you typed; otherwise you are told nothing matched rather than given a coin flip.
Notes, links and dropdowns
add a note to A1 saying checked by hand, add a hyperlink on B2 pointing to https://example.com and add validation on C1:C10 with dropdown values: Red, Green, Blue all work, in both directions: you can ask what a note or link says, and remove either. Number-range and date validation are there too.
Pivots
pivot revenue by region and product puts a cross-tab on a new sheet: the first column down the side, the second across the top, totals on both edges. break down total units by rep and cross-tab average revenue by month and region work the same way. Name an aggregate and it is used: sum, mean, median, min, max, count, std, var, first or last. Name none and it sums. Name no number at all and it aggregates every numeric column that is not already a heading.
The numbers are computed in the backend, where the sheet is already a pandas frame, and written back as cells. Univer’s own pivot tables are part of its commercial tier, so this is the pivot an Apache-2.0 build can have: a real sheet you can sort, chart and export, rather than a live object you drag fields onto. Re-slicing means asking again.
A pivot wider than 200 columns is refused rather than drawn. That is what pivoting across a column with a distinct value per row produces, and the message says so.
Changing one you already have
A follow-up names only what moved, and the rest of the last pivot carries over. change it to average keeps the fields and swaps the aggregate. same pivot but by month keeps the aggregate and regroups. add product as a column to that pivot keeps everything and widens it. Each of these rewrites the sheet the pivot is already on rather than making another, because one pivot should be one sheet: the whole sheet is cleared first, so a narrower result leaves no stale Total column behind.
another pivot right below this one but by rep and product keeps the first and puts the second underneath it, one blank row apart, on the same sheet. Where it goes is measured at the time rather than remembered, so inserting or deleting rows by hand in between does not misplace it.
A follow-up that names no fields at all gets asked which ones, and told what the last pivot was, rather than being guessed at. A follow-up before there is any pivot says so.
What is not there
Images and drawings. The classifier recognises the request and there is nothing behind it: inserting a picture goes through Univer’s drawing system rather than a cell, which this has not been wired to. Asking gets you a failure, not a picture.
For that, and anything else the chat does not cover, the sheet is a real spreadsheet (Univer, with its own toolbar) so you can do it by hand.
How it decides
Two classifications, not one. The browser checks first whether your sentence is a spreadsheet operation it can carry out itself, using patterns where they are unambiguous and the model where they are not. Anything that is a plain question skips that entirely and goes to the backend, which categorises it again to choose between SQL, a chart, a data-quality pass and the rest.
How it works follows a single question through both of those.