Repository navigation
Conversation
A sheet's drawing part (xl/drawings/drawingN.xml) is read for its pictures and charts with their anchors: two cells, one cell and a size, or a position and a size. The new `xlsx.drawings(sheet)` call returns them; the grid lays them over the cells, placed by the row and column axes, so a picture moves and grows with resized or hidden rows and columns, and the sheet extends far enough to reach every drawing. A picture the browser can draw (PNG, JPEG, GIF, SVG, ...) is shown as itself, through the client's media URLs. A chart, and a picture in a format the browser cannot draw (EMF, WMF), is shown as a box of its size naming what is there: the chart's kind (column, bar, line, pie, ...) and title. Shapes and text boxes are left out. Clicks go through to the cells below. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A sheet's charts were placeholders. Now src/core/xlsx/chart.ts reads a chart part into a model in the worker, and src/core/xlsx/chart-svg.ts draws it as a self-contained SVG (DOM-free), shown over the cells like a picture. - Kinds: bar and column (clustered, stacked, 100%, upright or horizontal), line (markers, smoothing, gaps for empty cells), area, pie and doughnut (exploded slices, first-slice angle), scatter, and combinations on primary and secondary axes; 3D charts as their flat form. Radar, bubble, stock, surface and chartex keep the placeholder. - Values: series references are read from the workbook's cells, loading a sheet not shown yet, so charts follow edits (the view reads them again after an edit result). A defined name, another workbook or an unreadable reference falls back to the chart's numCache / strCache. Hidden rows and columns are left out when plotVisOnly is set. - Look: Excel-like automatic axis bounds (zero kept, steps of 1/2/5), fixed min/max/major unit, reversed and log axes, gridlines, tick and data labels in their number formats, tilted category labels where they do not fit flat, title (Excel's automatic one included), legend (positions, overlay, deleted entries), theme accents for series without colors of their own, manual plot layout. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pie negatives, cell titles - scatter: a point whose X value is missing is not drawn (it was placed at its ordinal position); value labels follow their own points when a Y value is missing - bars, areas, lines and points are clipped to the plot area, so a fixed axis range does not let them run over the title and legend - pie and doughnut: a negative value is a slice of its magnitude, as in Excel; its value label keeps the sign - a title whose text is a cell (`c:tx/c:strRef`) shows that cell's text, else its cached text, before the automatic title Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… row stays in it Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The automatic bounds add a step above a maximum that falls on a gridline, so a 100% stacked axis ran to 120%. An axis carrying only 100% stacks now ends at 100% (and -100% with negatives), as Excel's does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- gradient fills (linear and radial) and pattern fills (DrawingML presets) for series, points, the chart area and the plot area - the text size, weight and color of axis labels, legend and data labels - gridline and axis lines: color, width, dash, or none - the plot area's fill and border - the built-in chart style (c:style, c14:style): gray, accent and one-accent palettes, tinted plot areas, dark backgrounds - default grays (text, gridlines, axis lines) as shades of the theme's text color rather than fixed values Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Kinds that were placeholders until now: - radar: lines, lines with markers, filled; a spoke per category, rings at the value axis' ticks - bubble: sizes read from the cells, by area or by width, scaled by bubbleScale; negative bubbles as outlines where the chart shows them; the axes leave the bubbles room - stock: high-low lines and up-down bars, the series over them - surface (2D and 3D): seen from above as Excel's contour chart, its value bands in the legend; or the wireframe Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Nov 15, 2026
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Builds on the pictures PR (#11). Until it is merged this PR shows its commit too; the charts part is the commits after it.
This draws a spreadsheet's charts instead of the placeholder box, from the live cells, in the look the file gives them. It is large (about 2,250 lines, 315 of them tests), but nearly all of it is two new files:
src/core/xlsx/chart.tsreads a chart part into a model in the worker, andsrc/core/xlsx/chart-svg.tsdraws that model as a self-contained SVG with no DOM, shown over the cells like a picture. The commits split it into the reader and drawing, review fixes, the looks, and the last four kinds, if you'd rather review it in steps; I can also split it into separate PRs along those lines.bubbleScale, negative bubbles), radar (lines, markers, filled), stock (high-low lines, up-down bars), surface seen from above as Excel's contour chart or as a wireframe, and combinations on primary and secondary axes; 3D charts as their flat form. Only the chartex kinds (waterfall, treemap, ...) keep the placeholder.plotVisOnlyis set.c:style,c14:style: its palettes, tinted plot areas and dark backgrounds, not bevels and shadows). Where the file gives nothing, the grays are shades of the theme's text color, as Excel derives them.<img>, so gradient, pattern and clip ids only need to be unique within one picture.test/xlsx-chart.test.tscovers series read from the cells and the cache fallback, hidden rows, a chart read again after an edit, Excel's axis bounds and the 100% axis, column, stacked bar, line and pie drawings, cell titles, negative pie values, scatter gaps, clipping, each of radar, bubble, stock and surface, gradient and pattern fills, text and line colors, the plot area fill, the theme's grays and the built-in styles.bun run typecheck,bun testand the e2e suite pass in CI.🤖 Generated with Claude Code