Artikel Teknis

Mengedit Grafik Excel Tanpa Kehilangan ChartML di HotXLS

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

Diagram pelestarian ChartML HotXLS di Delphi di mana chart yang tak berubah memutar ulang byte asli dan chart yang diedit menggabungkan node model bertipe ke XML yang diawetkan sementara pembangunan ulang dari model saja kehilangan cabang extLst dan AlternateContent
HotXLS menyimpan byte ChartML asli saat impor dan memutar ulangnya tak tersentuh, atau menggabungkan suntingan bertipe ke pohon yang dipreservasi ketika model berubah
var
  Workbook: TXLSXWorkbook;
  Chart: TXLSXChart;
begin
  Workbook := TXLSXWorkbook.Create;
  try
    Workbook.PreserveUnsupportedParts := True;   // setel sebelum Open
    Workbook.Open('quarterly-review.xlsx');
    Chart := Workbook.Sheets[1].Charts[0];   // Sheets[] berbasis 1
    if Chart.HasPreservedXml then
      Log('original ChartML retained; untouched charts replay exactly');
    Chart.Title := 'Revenue by region, Q3 2026';  // kini jalur merge berjalan
    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

Diagram bagan kombinasi HotXLS di Delphi dengan kolom pendapatan dari AddSeries pada sumbu nilai utama dan garis margin dari AddPlotGroup pada sumbu nilai sekunder sementara API flat warisan hanya menjangkau grup satu
Setiap panggilan AddPlotGroup menambahkan grup terurut dengan keluarga chart dan penugasan sumbu primary atau secondary miliknya sendiri sementara API flat masih mengalamatkan grup satu
var
  Chart: TXLSXChart;
  Line: TXLSXChartPlotGroup;
begin
  // Grafik kolom ditambatkan pada baris 1..15, kolom 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');
  // Plot group kedua: sebuah garis, dibaca terhadap sumbu nilai sekunder
  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

Diagram aturan tata letak manual HotXLS di Delphi di mana x, y, w, dan h harus datang sebagai grup lengkap atau Office mengabaikan seluruh elemen manualLayout, dengan mode edge dan factor serta layoutTarget yang terbatas pada area plot
Office menerapkan layout manual hanya ketika x, y, w, dan h tiba sebagai grup lengkap, itulah sebabnya HotXLS memancarkan persegi penuh

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