Merge PR #1103: Keep chart cache point positions when a reference has blank edges (#1015)

crates/xlsx/src/chart.rs: 1103's used-range clipping applied in ref_values after 1088's ref_target call.
This commit is contained in:
aiongg
2026-10-22 02:37:08 +00:00
3 changed files with 33 additions and 2 deletions
+7 -2
View File
@@ -297,9 +297,14 @@ fn ref_target(wb: &Workbook, sheet_idx: usize, f: &str) -> Option<(usize, RangeR
pub(crate) fn ref_values(wb: &Workbook, sheet_idx: usize, f: &str) -> Option<Vec<Value>> {
let (si, mut range) = ref_target(wb, sheet_idx, f)?;
let sheet = wb.sheet(si)?;
// Whole columns/rows: limit to the used range.
// Whole columns/rows: cut the far end at the used range. The start stays put, so point indices keep matching the reference.
if let Some(u) = sheet.used_range() {
range = range.intersection(&u)?;
if range.is_full_cols() {
range.end.row = range.end.row.min(u.end.row.max(range.start.row));
}
if range.is_full_rows() {
range.end.col = range.end.col.min(u.end.col.max(range.start.col));
}
}
if range.count() > MAX_CACHE {
return None;
@@ -0,0 +1,25 @@
//! Chart caches keep the position of every point inside the referenced range.
use gridcraft_core::{CellRef, Value};
use gridcraft_model::{Sheet, Workbook};
use std::sync::Arc;
use crate::chart::ref_values;
fn book() -> Workbook {
let mut s = Sheet::new("Data");
s.set_value(CellRef::new(3, 0), Value::Number(5.0));
Workbook { sheets: vec![Arc::new(s)], ..Workbook::default() }
}
#[test]
fn explicit_range_keeps_leading_and_trailing_blanks() {
let vals = ref_values(&book(), 0, "Data!$A$3:$A$6").unwrap();
assert_eq!(vals, vec![Value::Empty, Value::Number(5.0), Value::Empty, Value::Empty]);
}
#[test]
fn whole_column_still_stops_at_used_range_and_starts_at_top() {
let vals = ref_values(&book(), 0, "Data!$A:$A").unwrap();
assert_eq!(vals, vec![Value::Empty, Value::Empty, Value::Empty, Value::Number(5.0)]);
}
+1
View File
@@ -2,6 +2,7 @@
mod array_export;
mod chart_bool_default;
mod chart_ref_offsets;
mod csv_tests;
mod encrypted_tests;
mod fixtures;