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

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