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
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
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
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