Articolo tecnico

Oggetti fotocamera di Excel da Delphi: istantanee live

HotXLS crea oggetti fotocamera di Excel sui fogli di lavoro XLSX da Delphi tramite AddCamera. Un oggetto fotocamera è un'immagine collegata permanentemente a un intervallo di celle: Excel la ri-renderizza a partire dall'intervallo sorgente ogni volta che la cartella di lavoro viene aperta o la sorgente cambia, così un dashboard può mostrare una vista live di una tabella che vive su un altro foglio, a qualsiasi dimensione, ruotata se lo desiderate

La funzionalità esiste in Excel come strumento Fotocamera, un pulsante che la maggior parte degli utenti non ha mai visto perché non è nella barra multifunzione per impostazione predefinita. Risolve un problema reale di dashboard meglio delle alternative: un intervallo copiato diventa obsoleto, un grafico non può mostrare contenuto di cella arbitrario, e un'immagine collegata incollata a mano non può essere generata da codice. Un oggetto fotocamera è l'unico costrutto che è sia live sia arbitrario

Oggetto fotocamera di HotXLS creato da Delphi: un'immagine live di Data!$B$2:$D$4 posizionata su un foglio dashboard che Excel ri-renderizza all'apertura e a ogni modifica della sorgente
Un oggetto fotocamera resta collegato permanentemente al proprio intervallo sorgente, così Excel ri-renderizza l'immagine all'apertura e a ogni modifica, a qualsiasi dimensione e da un intervallo su un altro foglio

Dove è documentato, e perché conta?

La specifica principale dei fogli di calcolo non descrive gli oggetti fotocamera; vengono trattati come un dettaglio implementativo. La descrizione autorevole si trova nella documentazione del markup di disegno, sotto la voce Camera Tool, e sapere questo fa risparmiare un pomeriggio di ricerca nel documento sbagliato

Strutturalmente, un oggetto fotocamera è un normale elemento immagine le cui proprietà non visive dell'immagine portano un elenco di estensioni. L'estensione è identificata da un GUID fisso, e al suo interno un elemento del namespace di disegno 2010 registra due cose: l'intervallo sorgente come riferimento assoluto in stile A1, opzionalmente qualificato per foglio, e un identificatore di forma. Tutto il resto riguardo l'immagine è normale

Anatomia XLSX di un oggetto fotocamera scritto da HotXLS da Delphi: un normale elemento immagine il cui elenco di estensioni porta un elemento del namespace di disegno 2010 che registra l'intervallo sorgente assoluto e un identificatore di forma
Strutturalmente una fotocamera è una normale immagine più un elemento di estensione del namespace di disegno 2010, che registra l'intervallo sorgente assoluto in stile A1 e un identificatore di forma

Crearne uno

Esistono due overload perché due modi di nominare un intervallo sono comodi. La forma testuale prende il riferimento esattamente come verrà memorizzato, ed è ciò che volete per una sorgente su un altro foglio. La forma a coordinate prende quattro coordinate di cella sullo stesso foglio e costruisce il riferimento assoluto per voi:

uses
  lxHandleX;

var
  Book: TXLSXWorkbook;
  Dashboard: TXLSXWorksheet;
  Cam: TXLSXImage;
begin
  Book := TXLSXWorkbook.Create;
  try
    if Book.Open('reporting.xlsx') <> 1 then
      Exit;
    Dashboard := Book.Sheets[0];

    // Vista live di Data!$B$2:$D$4, posizionata su B10:F20 nel dashboard
    Cam := Dashboard.AddCamera('Data!$B$2:$D$4', 10, 2, 20, 6);

    // Il riquadro di posizionamento usa per default le colonne da 64 px
    // e le righe da 20 px di Excel; regolate poi la dimensione disegnata in EMU se necessario
    Cam.WidthEMU := Round(12.5 * 914400 / 2.54);   // 12,5 cm
    Cam.HeightEMU := Round(6.0 * 914400 / 2.54);

    Book.SaveAs('reporting-dashboard.xlsx');
  finally
    Book.Free;
  end;
end;

L'oggetto restituito è un normale oggetto immagine con una proprietà aggiuntiva, CameraRange, che è non vuota esattamente quando l'immagine è una fotocamera. Ecco anche come rilevare le fotocamere in una cartella di lavoro che non avete creato voi: enumerate le immagini e controllate la proprietà

Perché l'immagine segnaposto non deve essere reale?

Ogni immagine in un pacchetto XLSX richiede una parte immagine, e un oggetto fotocamera non fa eccezione. Ma Excel ignora quell'immagine: al caricamento ri-renderizza l'intervallo collegato e disegna il risultato. I byte incorporati esistono puramente come cache di visualizzazione per strumenti che non implementano il comportamento fotocamera

Questo fatto elimina un intero sottosistema dall'implementazione. Non serve rasterizzare l'intervallo sorgente, non serve un motore di rendering per produrre l'istantanea, e non c'è rischio che l'immagine in cache non corrisponda a quella live in Excel. HotXLS scrive un metafile segnaposto minimo — un record di intestazione e un record di fine file, 108 byte in totale — che mantiene il pacchetto strutturalmente completo e non costa nulla

Una conseguenza da prevedere: un visualizzatore che renderizza XLSX senza implementare gli oggetti fotocamera mostra il segnaposto, che è vuoto. Se le vostre cartelle di lavoro vengono consumate da uno strumento del genere, un oggetto fotocamera è il costrutto sbagliato e un'immagine renderizzata dell'intervallo è quello giusto

Parte immagine segnaposto di un oggetto fotocamera HotXLS: Excel ri-renderizza l'intervallo collegato al caricamento e ignora il metafile da 108 byte, mentre i visualizzatori senza supporto fotocamera mostrano un'immagine vuota
Excel ignora i byte incorporati e ri-renderizza l'intervallo collegato al caricamento, così HotXLS scrive solo un metafile segnaposto da 108 byte, mentre un visualizzatore senza supporto fotocamera mostra il segnaposto vuoto

La conversione di unità che è facile sbagliare

La geometria di disegno in Open XML viene misurata in English Metric Unit, dove un pollice equivale a 914.400 EMU e un centimetro a 360.000. Le intestazioni dei metafile, tuttavia, registrano il proprio frame in unità di 0,01 millimetri. La conversione tra le due è una divisione per 360

Vale la pena nominare questo aspetto perché l'errore è silenzioso. Convertire invece passando per i pixel a 96 DPI — moltiplicando per 2540 e dividendo per 9525 — produce un valore 96 volte troppo grande, e nulla lo rifiuta: il pacchetto è valido, l'immagine è posizionata correttamente dall'ancoraggio, e solo il frame dichiarato del metafile è insensato. Il modello EMU e il suo comportamento di arrotondamento sono trattati in geometria delle immagini, unità EMU e scalatura

Round-trip di una cartella di lavoro che ha già fotocamere

Aprire e salvare una cartella di lavoro preserva gli oggetti fotocamera, incluso l'elemento di estensione e il suo riferimento all'intervallo. Questo conta più della loro creazione: la maggior parte delle cartelle di lavoro con oggetti fotocamera è stata creata in Excel da un analista, e una libreria che li converte silenziosamente in immagini ordinarie al salvataggio ha distrutto il comportamento live su cui l'analista faceva affidamento

// Verifica quali immagini sono fotocamere e dove puntano
for I := 0 to Sheet.Images.Count - 1 do
  if Sheet.Images[I].CameraRange <> '' then
    Writeln(Format('camera %d -> %s',
      [I, Sheet.Images[I].CameraRange]));

Quando generate dashboard in modo programmatico, la verifica è anche il test di regressione: dopo un ciclo di salvataggio e riapertura, lo stesso numero di fotocamere deve puntare agli stessi intervalli. La gestione generale di immagini e disegni, incluso il modello di ancoraggio che li posiziona, è trattata in grafici, immagini e disegni

Quando una fotocamera batte le alternative

Usate un oggetto fotocamera quando la stessa tabella live deve comparire su più fogli a dimensioni diverse, quando un layout di stampa richiede una regione di un foglio composta accanto a regioni di altri, o quando un blocco riepilogativo deve seguire modifiche fatte altrove senza una formula che colleghi individualmente ogni cella

Preferite formule ordinarie quando il target è una manciata di celle, perché una formula tra fogli è più semplice e ogni strumento la comprende. Preferite un grafico quando i dati sono realmente una serie piuttosto che un blocco formattato. E preferite un'immagine renderizzata quando la cartella di lavoro verrà consumata da strumenti diversi da Excel, o quando l'istantanea non deve cambiare dopo la consegna — un report archiviato non dovrebbe essere live

Una nota di layout dalla pratica: una fotocamera mostra l'intervallo sorgente esattamente come formattato, incluse celle unite, formati condizionali e larghezze di colonna. Ottenere un blocco dashboard dall'aspetto pulito inizia quindi con la formattazione dell'intervallo sorgente come se fosse l'output finito, la stessa disciplina descritta in celle unite e layout dei template di report

Gli oggetti fotocamera, i disegni e il writer di pacchetti XLSX dietro di essi sono forniti in un'unica libreria per Delphi e C++Builder; l'elenco completo delle funzionalità è disponibile sulla pagina del componente foglio di calcolo HotXLS Delphi