HotXLS mempertahankan ChartML asli dari grafik Excel yang diimpor dan memutarnya kembali byte demi byte ketika tidak ada apa pun dalam model bertipe yang berubah, sehingga membuka dan menyimpan ulang workbook tidak diam-diam mengupas bagian grafik yang tidak direpresentasikan object model. Edit judul, seri, atau sumbu dan HotXLS secara struktural menggabungkan node bertipe baru ke dalam pohon asli alih-alih meregenerasi grafik dari awal
Distinksi itu — replay saat tidak tersentuh, merge saat diedit — adalah apa yang membuat aplikasi Delphi aman diarahkan ke grafik yang dibangun analis di Excel. Meregenerasi grafik dari model bertipe selalu kehilangan apa pun yang tidak diketahui model, dan grafik Excel penuh dengan hal-hal yang tidak diketahui library: style kustom, daftar ekstensi, cabang alternate content, pemformatan berkualifikasi-ruang-nama dari add-in
Kenapa menyimpan ulang workbook meratakan grafiknya?
Karena implementasi yang biasa membaca apa yang dipahaminya dan menulis apa yang dipahaminya. Semua di antaranya — extLst dari build Excel yang lebih baru, cabang mc:AlternateContent, efek shape yang tidak punya properti di model — ada di file, tidak punya tempat di object model, dan menghilang saat simpan. Pengguna melihat grafik yang kehilangan gradien, label data kustom, atau efek 3D-nya, dan workbook tidak bisa menjelaskan mengapa
Dengan PreserveUnsupportedParts diaktifkan pada workbook, HotXLS menyimpan byte chart UTF-8 asli saat impor bersama dengan panjang dan sidik jari 64-bit dari konten yang dimodelkan. Jika model bertipe belum berubah saat simpan, ia menulis byte asli kembali. Tidak ada pengurutan ulang XML, tidak ada drift whitespace, tidak ada salinan UTF-16 chart resident yang menggantung di memori untuk grafik yang tidak diedit siapa pun
var
Workbook: TXLSXWorkbook;
Chart: TXLSXChart;
begin
Workbook := TXLSXWorkbook.Create(nil);
try
Workbook.PreserveUnsupportedParts := True; // set before Open
Workbook.Open('quarterly-review.xlsx');
Chart := Workbook.Sheets[1].Charts[0]; // Sheets[] is 1-based
if Chart.HasPreservedXml then
Log('original ChartML retained; untouched charts replay exactly');
Chart.Title := 'Revenue by region, Q3 2026'; // now the merge path runs
Workbook.SaveAs('quarterly-review-out.xlsx');
finally
Workbook.Free;
end;
end;
Apa yang dipertahankan merge dan apa yang dimiliki model
Aturannya adalah kepemilikan. Node model publik — judul, seri, cache, plot group, sumbu — diputuskan oleh pohon yang baru dibangkitkan. Subtree yang tidak dimodelkan dibawa dari asli. Asimetri itu disengaja, dan bagian yang butuh sebentar untuk diinternalisasi: menghapus seri tidak boleh membangkitkan kembali seri lama dari XML yang dipertahankan, jadi apa pun yang dimiliki model diambil dari model bahkan ketika model mengatakan "hilang"
Konten yang tidak dimiliki disisipkan kembali di sebelah node yang cocok tempat ia duduk di sebelahnya, dan extLst tetap terakhir dalam parent karena di situlah skema memintanya. Menghapus properti yang dikenal — menghapus flag bold, menjatuhkan warna — diperlakukan sebagai pembersihan, bukan sebagai celah yang diisi dari pohon asli. Atribut yang tidak dikenal di lingkungan yang sama mempertahankan tempatnya
Konten markup-compatibility mendapat penanganan spesifik. Saat parse, HotXLS melewati mc:Choice dan membaca mc:Fallback; jika cabang fallback itu membungkus plot group yang dikenal model, merge menulis konten bertipe baru kembali ke subtree fallback. Tanpa langkah itu simpan akan memancarkan plot group baru dan meninggalkan yang lama di dalam fallback, dan grafik akan membawa dua
Mengecualikan satu grafik
ClearPreservedXml menjatuhkan XML asli dan sidik jari untuk satu grafik, sehingga simpan berikutnya membangun kembali grafik itu murni dari model bertipe. Itu keputusan per-grafik; PreserveUnsupportedParts level workbook tetap mengatur apakah state preservasi dibangun saat impor
Jangkau saat Anda ingin grafik yang bersih alih-alih yang setia — misalnya ketika template grafik membawa pemformatan dari tema korporat lama dan inti operasi adalah membuangnya. Jangan jangkau sebagai refleks debugging: grafik yang merender salah setelah edit lebih sering pertanyaan pemodelan daripada pertanyaan preservasi, dan menghapus XML yang dipertahankan menghancurkan bukti
Grafik kombinasi dan sumbu kedua
AddPlotGroup membangun grafik kombinasi terurut, di mana setiap plot group mempertahankan family grafiknya sendiri dan penugasan sumbu primer atau sekundernya sendiri. Itulah yang dibutuhkan grafik bisnis yang ada di mana-mana: pendapatan sebagai kolom pada sumbu kiri, persentase margin sebagai garis pada sumbu kanan
Grafik mengekspos sumbu kategori dan nilai primer serta sekunder plus sumbu seri, dengan pengaturan kategori, nilai, tanggal dan sumbu seri bertipe yang mencakup posisi, pengenal, crossing, unit tanggal, interval label dan visibilitas. API flat yang lebih lama — ChartType, AddSeries, koleksi Series flat — masih menangani plot group primer, jadi kode yang ada tetap berfungsi sementara model di bawahnya memegang setiap group terurut
var
Chart: TXLSXChart;
Line: TXLSXChartPlotGroup;
begin
// Column chart anchored over rows 1..15, columns 5..12
Chart := Sheet.Charts.Add(xlsxChartColumn, 'Revenue and margin',
1, 5, 15, 12);
Chart.AddSeries('Revenue', 'Data!$A$2:$A$13', 'Data!$B$2:$B$13');
// Second plot group: a line, read against the secondary value axis
Line := Chart.AddPlotGroup(xlsxChartLine, xlsxAxisSecondary);
Line.AddSeries('Margin %', 'Data!$A$2:$A$13', 'Data!$C$2:$C$13');
end;
Sebelum model ini ada, membuka dan menyimpan ulang grafik kombinasi meratakannya menjadi satu family grafik dan kehilangan sumbu sekunder, tanggal, dan seri. Referensi formula grafik dan nilai seri yang di-cache sekarang bertahan dari salinan workbook dan siklus buka/simpan juga, dan jangkar grafik dicocokkan ke part grafiknya berdasarkan pengenal relationship — sehingga aplikasi yang menyusun ulang entri relationship tidak lagi menukar konten grafik antara posisi lembar kerja
Jebakan manual layout
Jika Anda memposisikan plot area, judul, judul sumbu atau legenda secara manual, tulis keempat koordinat. Office mengharuskan x, y, w dan h sebagai group lengkap setiap kali salah satunya hadir, dan mengabaikan seluruh manualLayout jika tidak. HotXLS selalu memancarkan persegi panjang penuh karena alasan itu, dan SetPositionAndSize menetapkan dan mengaktifkannya dalam satu panggilan
Dua detail lagi mengikuti Excel alih-alih latitude penuh spesifikasi. Posisi ditulis dengan xMode dan yMode disetel ke edge sementara ukuran menggunakan factor untuk wMode dan hMode, karena itulah yang ditulis Excel dan yang ia konversi kombinasi lain. Dan layoutTarget dipancarkan hanya untuk plot area, tidak pernah untuk judul atau legenda, di mana catatan implementasi Microsoft melarangnya
Memasukkan ini ke dalam round trip workbook
Preservasi grafik adalah satu instans dari kebijakan umum: library yang mengedit dokumen yang dibuat di tempat lain harus mengubah apa yang diminta untuk diubah dan tidak ada yang lain. Penalaran yang sama mendorong HotXLS pada theme, calculation chain dan ekstensi lembar kerja, dijelaskan dalam catatan tentang round trip lossless untuk theme, extLst dan calcChain, dan pada project VBA dan external link di memertahankan VBA dan external link. Untuk permukaan authoring grafik itu sendiri — membuat grafik, menempatkan gambar dan drawing dari Delphi — lihat panduan grafik, gambar dan drawing di HotXLS
HotXLS membaca, mengedit dan menulis grafik XLSX dari kode Delphi dan C++Builder native tanpa instalasi Excel pada mesin, yang membuat fidelity menjadi masalah library alih-alih masalah automasi — halaman komponen spreadsheet HotXLS memiliki daftar fitur grafik dan unduhan trial