Summary
Add pixel-accurate column width calculation using Java AWT font metrics, similar to Apache POI's autoSizeColumn implementation.
Background
PR #155 added basic autofit using charCount * 0.85 + 1.5 heuristic. This works but produces widths ~5-10% wider than Excel's actual autofit.
Proposed Solution
- Create
FontMetrics utility using AWT TextLayout + FontRenderContext
- Graceful fallback to heuristic in headless environments
- Style-aware: respects font family, size, bold/italic from cell styles
Technical Approach (POI-style)
- Excel uses "character units" based on max digit width of default font
- Calibri 11pt at 96 DPI: max digit width ≈ 7 pixels
- Formula:
width = (pixels + 5) / maxDigitWidth
- +5 padding: 2px left margin + 2px right margin + 1px gridline
Implementation
- New file:
xl-core/src/com/tjclp/xl/util/FontMetrics.scala
- Integrate into
WriteCommands.calculateAutoFitWidth()
- Add tests for AWT and fallback modes
Acceptance Criteria
Summary
Add pixel-accurate column width calculation using Java AWT font metrics, similar to Apache POI's
autoSizeColumnimplementation.Background
PR #155 added basic autofit using
charCount * 0.85 + 1.5heuristic. This works but produces widths ~5-10% wider than Excel's actual autofit.Proposed Solution
FontMetricsutility using AWTTextLayout+FontRenderContextTechnical Approach (POI-style)
width = (pixels + 5) / maxDigitWidthImplementation
xl-core/src/com/tjclp/xl/util/FontMetrics.scalaWriteCommands.calculateAutoFitWidth()Acceptance Criteria