OpenXLSX adalah perpustakaan C ++ untuk membaca, menulis, membuat, dan memodifikasi file Microsoft Excel®, dengan format .xlsx.
Seperti yang dikatakan judul - "rilis" terbaru yang ditampilkan di https://github.com/troldal/openxlsx/releases adalah dari 2021-11-06, dan sangat ketinggalan zaman - silakan tarik/unduh versi SW terbaru langsung dari repositori dalam keadaan saat ini. Tautan untuk mereka yang tidak ingin menggunakan git : https://github.com/troldal/openxlsx/archive/refs/heads/master.zip
Meninjau kode XLDATETIME sebagai tanggapan terhadap #299 dan memperbaiki bug yang saya pikir saya mungkin telah memperkenalkan diri. Permintaan maaf, tanggal sekarang harus membangun dengan benar dari double , struct tm dan time_t dan mengonversi kembali ke struct tm .
Sejarah perubahan ditemukan di log perubahan terperinci.
Hari ini fitur -fitur dari cabang pengembangan akhirnya berhasil masuk ke cabang utama :) Untuk detailnya, silakan merujuk ke log perubahan terperinci di bawah ini.
Singkatnya:
OpenXLSX/headers/XLStyles.hpp : Kelas XLStyles (dan banyak subclass) telah ditambahkan, memberikan akses yang hampir lengkap ke semua kemampuan pemformatan Excel.OpenXLSX/headers/XLMergeCells.hpp dan XLSheet.hpp : Kelas XLMerGecells dapat diakses melalui XLWorksheet untuk membuat/menghapus penggabungan sel selExamples/Demo10.cpp menunjukkan bagaimana gaya dan penggabungan digunakan Catatan: Bagian yang dinonaktifkan dengan testBasics = false akan memecahkan spreadsheet excel yang dihasilkan jika diaktifkan, satu -satunya tujuan adalah untuk menunjukkan akses ke semua kelas dan metode baru. Jika Anda ingin menggunakannya, pastikan untuk menggunakannya dengan benarCatatan pada xlNumberFormat : Bertentangan dengan semua elemen XLStyles lainnya, ini tidak menggunakan indeks dalam XML sebagai ID yang dapat dirujuk (XLCellFormat :: SetNumberFormatID), tetapi untuk ID yang ditentukan oleh XLNumberFormat: ditentukan sebelumnya oleh MS. Secara umum, untuk format khusus, disarankan untuk menggunakan ID> 100.
Pada daftar yang harus dilakukan:
Beberapa hari yang lalu saya akhirnya punya waktu untuk belajar cukup fungsionalitas git untuk dapat bekerja dengan cabang. Jadi saya membuat cabang pengembangan dengan fitur terbaru yang telah saya sebutkan dalam beberapa permintaan / masalah tarik. Jangan ragu untuk melihatnya. Dengan cara ini Anda tidak perlu menunggu sampai repositori utama diperbarui.
Menutup banyak permintaan tarik yang telah diimplementasikan dalam pembaruan Mei 2024, mengimplementasikan dua editorial lagi dari PR #246 dan #253.
Setelah jangka waktu yang lama tidak aktif, saya telah memutuskan untuk melanjutkan pengembangan OpenXLSX. Kode telah dibersihkan dan sejumlah besar bug telah diperbaiki. Perpustakaan telah diuji pada Windows, MacOS dan Linux, dan harus bekerja di semua platform.
Saya ingin menyampaikan terima kasih yang tulus kepada semua orang yang telah berkontribusi pada proyek, baik dengan melaporkan bug, menyarankan fitur atau dengan mengirimkan permintaan tarik. Saya juga ingin mengucapkan terima kasih kepada semua orang yang telah membintangi proyek ini, dan yang telah menunjukkan minat pada proyek tersebut.
Secara khusus, saya ingin mengucapkan terima kasih kepada Lars Uffmann (https://codeberg.org/lars_uffmann/) atas kontribusinya pada proyek tersebut. Lars telah menghabiskan waktu dan upaya yang signifikan dalam membersihkan kode, memperbaiki bug dan menerapkan fitur baru. Tanpa bantuannya, proyek tidak akan berada di negara bagian seperti sekarang ini.
Banyak bahasa pemrograman memiliki kemampuan untuk memodifikasi file Excel, baik secara asli atau dalam bentuk pustaka sumber terbuka. Ini termasuk Python, Java dan C#. Namun, untuk C ++, segalanya lebih tersebar. Meskipun ada beberapa perpustakaan, mereka umumnya kurang matang dan memiliki set fitur yang lebih kecil daripada untuk bahasa lain.
Karena tidak ada pustaka open source yang sepenuhnya memenuhi kebutuhan saya, saya memutuskan untuk mengembangkan pustaka OpenXLSX.
Ambisinya adalah bahwa OpenXLSX harus dapat membaca, menulis, membuat, dan memodifikasi file Excel (data serta pemformatan), dan melakukannya dengan sesedikit mungkin dependensi. Saat ini, OpenXLSX tergantung pada perpustakaan pihak ke -3 berikut:
Perpustakaan ini semua hanya header dan termasuk dalam repositori, yaitu tidak perlu mengunduh dan membangun secara terpisah.
Juga, fokus telah dikenakan kecepatan , bukan penggunaan memori (meskipun ada opsi untuk mengurangi penggunaan memori, dengan biaya kecepatan; lebih lanjut tentang itu nanti).
OpenXLSX telah diuji pada platform/kompiler berikut. Perhatikan bahwa A '-' tidak berarti bahwa OpenXLSX tidak berfungsi; itu hanya berarti bahwa itu belum diuji:
| GCC | Dentang | MSVC | |
|---|---|---|---|
| Windows | Mingw | Mingw | + |
| Cygwin | - | - | N/a |
| MacOS | + | + | N/a |
| Linux | + | + | N/a |
Versi kompiler berikut harus dapat mengkompilasi OpenXLSX tanpa kesalahan:
Clang 7 harus dapat mengkompilasi OpenXLSX, tetapi tampaknya ada bug dalam implementasi std :: varian, yang menyebabkan kesalahan kompiler.
Visual Studio 2017 juga harus berfungsi, tetapi belum diuji.
OpenXLSX menggunakan cmake sebagai sistem build (atau generator sistem build, tepatnya). Oleh karena itu, Anda harus menginstal CMake terlebih dahulu, untuk membangun OpenXLSX. Anda dapat menemukan instruksi instalasi di www.cmake.org.
Perpustakaan OpenXLSX terletak di subdirektori OpenXLSX untuk repo ini. Subdirektori OpenXLSX adalah proyek CMake mandiri; Jika Anda menggunakan CMake untuk proyek Anda sendiri, Anda dapat menambahkan folder OpenXLSX sebagai subdirektori untuk proyek Anda sendiri. Atau, Anda dapat menggunakan cmake untuk menghasilkan file membuat atau file proyek untuk alat pilihan Anda. Kedua metode tersebut dijelaskan sebagai berikut.
Sejauh ini cara termudah untuk menggunakan OpenXLSX dalam proyek Anda sendiri, adalah dengan menggunakan CMake sendiri, dan kemudian menambahkan folder OpenXLSX sebagai subdirektori ke pohon sumber proyek Anda sendiri. Beberapa proyek CMAKE mendukung IDE, terutama Visual Studio 2019, JetBrains Clion, dan QT Creator. Jika menggunakan Visual Studio, Anda harus secara khusus memilih 'Proyek CMake' saat membuat proyek baru.
Manfaat utama memasukkan pustaka OpenXLSX sebagai subfolder sumber, adalah bahwa tidak perlu menemukan perpustakaan dan file header secara khusus; CMake akan mengurusnya untuk Anda. Juga, perpustakaan akan dibangun menggunakan konfigurasi yang sama (debug, rilis dll.) Sebagai proyek Anda. Secara khusus, ini merupakan manfaat pada Windows, di mana tidak mungkin untuk menggunakan pustaka rilis dalam proyek debug (dan sebaliknya) ketika objek STL dilewatkan melalui antarmuka perpustakaan, karena mereka berada di OpenXLSX. Saat memasukkan sumber OpenXLSX, ini tidak akan menjadi masalah.
Dengan menggunakan perintah add_subdirectory() di file cmakelists.txt untuk proyek Anda, Anda bisa mendapatkan akses ke header dan file perpustakaan OpenXLSX. OpenXLSX dapat menghasilkan perpustakaan bersama atau perpustakaan statis. Secara default itu akan menghasilkan perpustakaan bersama, tetapi Anda dapat mengubahnya di file OpenXLSX CMakeLists.txt. Perpustakaan terletak di namespace yang disebut OpenXLSX; Oleh karena itu nama lengkap perpustakaan adalah OpenXLSX::OpenXLSX .
Cuplikan berikut adalah file cmakelists.txt minimum untuk proyek Anda sendiri, yang termasuk OpenXLSX sebagai subdirektori. Perhatikan bahwa lokasi output binari diatur ke direktori umum. Di Linux dan MacOS, ini tidak benar -benar diperlukan, tetapi pada Windows, ini akan membuat hidup Anda lebih mudah, karena Anda harus menyalin file perpustakaan bersama OpenXLSX ke lokasi Executable Anda untuk dijalankan.
cmake_minimum_required ( VERSION 3.15)
project (MyProject)
set (CMAKE_CXX_STANDARD 17)
# Set the build output location to a common directory
set ( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} / output )
set ( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} / output )
set ( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} / output )
add_subdirectory (OpenXLSX)
add_executable (MyProject main.cpp)
target_link_libraries (MyProject OpenXLSX::OpenXLSX)Dengan menggunakan yang di atas, Anda harus dapat mengkompilasi dan menjalankan kode berikut, yang akan menghasilkan file Excel baru bernama 'spreadsheet.xlsx':
# include < OpenXLSX.hpp >
using namespace OpenXLSX ;
int main () {
XLDocument doc;
doc. create ( " Spreadsheet.xlsx " );
auto wks = doc. workbook (). worksheet ( " Sheet1 " );
wks. cell ( " A1 " ). value () = " Hello, OpenXLSX! " ;
doc. save ();
return 0 ;
}Jika Anda ingin memproduksi binari OpenXLSX dan memasukkannya ke dalam proyek Anda sendiri, itu dapat dilakukan dengan menggunakan CMake dan toolchain kompiler pilihan Anda.
Dari baris perintah, navigasikan subdirektori OpenXLSX dari root proyek, dan jalankan perintah berikut:
mkdir build
cd build
cmake ..
Perintah terakhir akan mengonfigurasi proyek. Ini akan mengonfigurasi proyek menggunakan toolchain default. Jika Anda ingin menentukan toolchain, ketik cmake -G "<toolchain>" .. dengan <toolchain> menjadi toolchain yang ingin Anda gunakan, misalnya "unix makefiles", "ninja", "xcode", atau "Visual Studio 16 2019". Lihat dokumentasi CMake untuk detailnya.
Akhirnya, Anda dapat membangun perpustakaan menggunakan perintah:
cmake --build . --target OpenXLSX --config Release
Anda dapat mengubah argumen --target dan --config ke apa pun yang ingin Anda gunakan.
Saat dibangun, Anda dapat menginstalnya menggunakan perintah berikut:
cmake --install .
Perintah ini akan menginstal file pustaka dan header ke lokasi default di platform Anda (biasanya/usr/local/on linux dan macOS, dan c: file program di windows). Anda dapat mengatur lokasi yang berbeda menggunakan argumen --prefix.
Perhatikan bahwa tergantung pada platform, tidak mungkin untuk menginstal debug dan rilis perpustakaan. Di Linux dan MacOS, ini bukan masalah besar, karena perpustakaan rilis dapat digunakan untuk debug dan rilis yang dapat dieksekusi. Tidak demikian halnya untuk Windows, di mana konfigurasi perpustakaan harus sama dengan yang dapat dieksekusi yang menghubungkannya. Untuk alasan itu, pada Windows, jauh lebih mudah untuk memasukkan folder sumber OpenXLSX sebagai subdirektori untuk proyek CMake Anda; Ini akan menghemat banyak sakit kepala.
OpenXLSX masih dalam proses. Berikut ini adalah daftar fitur yang telah diimplementasikan dan harus berfungsi dengan baik:
Fitur yang terkait dengan pemformatan, plot dan angka belum diimplementasikan, dan tidak direncanakan dalam waktu dekat.
Perlu dicatat, bahwa membuat objek xldocument, saat ini tidak berfungsi!
Tabel di bawah ini adalah output dari tolok ukur (menggunakan pustaka benchmark Google), yang menunjukkan bahwa akses baca/tulis dapat dilakukan dengan kecepatan sekitar 4.000.000 sel per detik. Angka titik mengambang agak lebih rendah, karena konversi ke/dari string dalam file .xml.
Run on (16 X 2300 MHz CPU s)
CPU Caches:
L1 Data 32 KiB (x8)
L1 Instruction 32 KiB (x8)
L2 Unified 256 KiB (x8)
L3 Unified 16384 KiB (x1)
Load Average: 2.46, 2.25, 2.19
---------------------------------------------------------------------------
Benchmark Time CPU Iterations UserCounters...
---------------------------------------------------------------------------
BM_WriteStrings 2484 ms 2482 ms 1 items=8.38861M items_per_second=3.37956M/s
BM_WriteIntegers 1949 ms 1949 ms 1 items=8.38861M items_per_second=4.30485M/s
BM_WriteFloats 4720 ms 4719 ms 1 items=8.38861M items_per_second=1.77767M/s
BM_WriteBools 2167 ms 2166 ms 1 items=8.38861M items_per_second=3.87247M/s
BM_ReadStrings 1883 ms 1882 ms 1 items=8.38861M items_per_second=4.45776M/s
BM_ReadIntegers 1641 ms 1641 ms 1 items=8.38861M items_per_second=5.11252M/s
BM_ReadFloats 4173 ms 4172 ms 1 items=8.38861M items_per_second=2.01078M/s
BM_ReadBools 1898 ms 1898 ms 1 items=8.38861M items_per_second=4.4205M/s
File .xlsx pada dasarnya adalah sekelompok file .xml dalam arsip .zip. Secara internal, OpenXLSX menggunakan pustaka miniz untuk memampatkan/mendekompresi arsip .zip, dan ternyata Miniz memiliki batas atas mengenai ukuran file yang dapat ditangani.
Ukuran file maksimum yang diijinkan untuk file dalam arsip (yaitu entri dalam arsip .zip, bukan arsip itu sendiri) adalah 4 GB (tidak terkompresi). Biasanya, file terbesar dalam file/arsip .xlsx, akan menjadi file .xml yang memegang data lembar kerja. Yaitu, data lembar kerja mungkin tidak melebihi 4 GB. Apa yang diterjemahkan dalam hal baris dan kolom sangat tergantung pada jenis data, tetapi 1.048.576 baris x 128 kolom yang diisi dengan bilangan bulat 4 digit akan memakan kira-kira. 4 GB. Ukuran arsip terkompresi juga tergantung pada data yang disimpan dalam lembar kerja, serta algoritma kompresi yang digunakan, tetapi buku kerja dengan lembar kerja tunggal 4 GB biasanya akan memiliki ukuran terkompresi 300-350 MB.
Batasan 4 GB hanya terkait dengan entri tunggal dalam arsip, bukan ukuran arsip total. Itu berarti bahwa jika arsip memegang beberapa entri dengan ukuran 4GB, Miniz masih bisa menanganinya. Untuk OpenXLSX, ini berarti bahwa buku kerja dengan beberapa lembar kerja besar masih dapat dibuka.
OpenXLSX menggunakan pustaka pugixml untuk parsing dan memanipulasi file .xml di arsip .xlsx. Pugixml adalah dom parser, yang membaca seluruh dokumen .xml ke dalam memori. Itu membuat parsing dan manipulasi sangat cepat.
Namun, semua pilihan memiliki konsekuensi, dan menggunakan dom parser juga dapat menuntut banyak memori. Untuk spreadsheet kecil, itu seharusnya tidak menjadi masalah, tetapi jika Anda perlu memanipulasi spreadsheet besar, Anda mungkin membutuhkan banyak memori.
Tabel di bawah ini memberikan indikasi berapa banyak kolom data yang dapat ditangani oleh OpenXLSX (dengan asumsi 1.048.576 baris):
| Kolom | |
|---|---|
| 8 GB RAM | 8-16 |
| 16 GB RAM | 32-64 |
| 32 GB RAM | 128-256 |
Jilid Anda mungkin bervariasi. Kinerja OpenXLSX akan tergantung pada jenis data dalam spreadsheet.
Perhatikan juga bahwa disarankan untuk menggunakan OpenXLSX dalam mode 64-bit. Meskipun dapat dengan mudah digunakan dalam mode 32-bit, ia hanya dapat mengakses RAM 4 GB, yang akan sangat membatasi kegunaan saat menangani spreadsheet besar.
Jika konsumsi memori adalah masalah bagi Anda, Anda dapat membangun pustaka OpenXLSX dalam mode kompak (cari enable_compact_mode dalam file cmakelists.txt), yang akan memungkinkan mode kompak PugixML. OpenXLSX kemudian akan menggunakan lebih sedikit memori, tetapi juga berjalan lebih lambat. Lihat detail lebih lanjut dalam dokumentasi PugixML di sini. Kasing uji yang dijalankan pada Linux VM dengan RAM 8 GB mengungkapkan bahwa OpenXLSX dapat menangani lembar kerja dengan 1.048.576 baris x 32 kolom dalam mode kompak, versus 1.048.576 baris x 16 kolom dalam mode default.
Sejauh ini pertanyaan terbanyak yang saya dapatkan tentang OpenXLSX di GitHub, terkait dengan Unicode. Tampaknya (dan dapat dimengerti) sumber kebingungan besar bagi banyak orang.
Awalnya, saya memutuskan bahwa OpenXLSX harus fokus pada bagian Excel, dan bukan utilitas pengkodean/konversi teks juga. Oleh karena itu, semua input/output teks ke OpenXLSX harus dalam pengkodean UTF-8 ... jika tidak itu tidak akan berfungsi seperti yang diharapkan. Mungkin juga perlu bahwa file kode sumber disimpan dalam format UTF-8. Jika, misalnya, file sumber disimpan dalam format UTF-16, maka setiap string literal juga akan berada di UTF-16. Jadi, jika Anda memiliki string literal yang dikodekan dalam kode sumber Anda, maka file sumber juga harus disimpan dalam format UTF-8.
Semua manipulasi string dan penggunaan di OpenXLSX menggunakan c ++ std :: string, yang menyandikan agnostik, tetapi dapat dengan mudah digunakan untuk pengkodean UTF-8. Juga, Excel menggunakan pengkodean UTF-8 secara internal (sebenarnya, dimungkinkan untuk menggunakan pengkodean lain, tetapi saya tidak yakin tentang itu).
Untuk alasan di atas, jika Anda bekerja dengan pengkodean teks lain, Anda harus mengonversi ke/dari UTF-8 sendiri . Ada sejumlah opsi (misalnya Boost.Nowide atau Boost.Text). Secara internal, OpenXLSX menggunakan Boost.Nowide; Ini memiliki sejumlah fitur praktis untuk membuka file dan mengonversi antara std :: string dan std :: wstring dll. Saya juga akan menyarankan agar Anda menonton presentasi James McNellis di CPPCON 2014, dan membaca blog Joel Spolsky.
Unicode pada Windows sangat menantang. Sementara UTF-8 didukung dengan baik di Linux dan MacOS, dukungan pada Windows lebih terbatas. Misalnya, output dari karakter non-ASSASII (misalnya karakter Cina atau Jepang) ke jendela terminal akan terlihat seperti omong kosong. Seperti yang disebutkan, kadang -kadang Anda juga harus memperhatikan pengkodean teks dari file sumber itu sendiri. Beberapa pengguna mengalami masalah dengan OpenXLSX yang mogok saat membuka/membuat file .xlsx dengan nama file non-ASCII, di mana ternyata kode sumber untuk program pengujian berada dalam pengkodean non-UTF-8, dan karenanya string input ke OpenXLSX juga non-UTF-8. Agar tetap waras, saya sarankan file kode sumber selalu ada di file UTF-8; Semua IDE yang saya ketahui dapat menangani file kode sumber dalam pengkodean UTF-8. Selamat datang di dunia Unicode yang indah di Windows?
File Excel pada dasarnya hanyalah sekelompok file .xml yang dibungkus dengan arsip .zip. OpenXLSX menggunakan pustaka pihak ke -3 untuk mengekstrak file .xml dari arsip .zip. Perpustakaan default yang digunakan oleh OpenXLSX adalah Zippy, yang merupakan pembungkus berorientasi objek di sekitar Miniz. Perpustakaan miniz cepat, dan hanya header, yang ideal untuk OpenXLSX.
Namun, dimungkinkan untuk menggunakan zip-library yang berbeda, jika Anda mau. Dalam kasus yang jarang terjadi, Anda mungkin mengalami masalah stabilitas dengan Miniz. Dalam kasus tersebut, mungkin berguna untuk mencoba zip-library yang berbeda.
Menggunakan perpustakaan Zippy/Miniz tidak memerlukan upaya khusus; Ini akan bekerja langsung di luar kotak. Menggunakan zip-library yang berbeda, akan membutuhkan beberapa pekerjaan.
Untuk menggunakan zip-library yang berbeda, Anda harus membuat kelas pembungkus yang sesuai dengan antarmuka yang ditentukan oleh kelas IZIPARCIVE. Perhatikan bahwa ini diimplementasikan menggunakan tipe penghapusan , yang berarti bahwa tidak ada warisan yang diperlukan; Kelas hanya perlu memiliki antarmuka yang sesuai, itu saja. Setelah itu, berikan objek kelas dan masukkan ke konstruktor OpenXLSX.
Untuk melihat contoh bagaimana hal ini dilakukan, lihat Demo1a di folder Contoh. Contoh ini menggunakan kelas yang disebut CustomZip (menggunakan LibZip sebagai perpustakaan ZIP) yang dapat ditemukan di bawah contoh/eksternal/customzip. Untuk membangun program contoh, pastikan bahwa libzip (dan dependensi) diinstal di komputer Anda, dan aktifkan opsi OpenXLSX_ENABLE_LIBZIP di file cmakelists.txt di root OpenXLSX.
Seperti yang disebutkan, program contoh Demo1a menggunakan libzip. Libzip adalah perpustakaan yang sangat stabil dan banyak digunakan. Namun, pengalaman saya adalah cukup lambat untuk file zip besar, seperti spreadsheet besar. Untuk alasan itu, libzip mungkin bukan solusi yang ideal, tetapi berguna untuk menunjukkan bagaimana perpustakaan zip yang berbeda dapat digunakan.
Di folder 'Contoh', Anda akan menemukan beberapa contoh program, yang menggambarkan cara menggunakan OpenXLSX. Mempelajari contoh program tersebut adalah cara terbaik untuk mempelajari cara menggunakan OpenXLSX. Contoh program dianotasi, jadi harus relatif mudah untuk memahami apa yang sedang terjadi.
OpenXLSX sekarang dapat menggunakan pustaka ZIP lainnya daripada perpustakaan Zippy/Miniz default. Lihat Demo1a sebagai contoh bagaimana hal itu dilakukan
Versi ini termasuk rentang baris dan iterator. Ini juga mendukung penugasan wadah nilai sel ke objek XLROW. Ini secara signifikan lebih cepat (hingga X2) daripada menggunakan rentang sel atau mengakses sel dengan referensi sel.
Arsitektur internal OpenXLSX telah dirancang ulang secara signifikan sejak versi sebelumnya. Alasannya adalah bahwa perpustakaan berubah menjadi bola lumpur besar, dan semakin sulit untuk menambahkan fitur dan memperbaiki bug. Dengan arsitektur baru, semoga (semoga) lebih mudah dikelola dan menambahkan fitur baru.
Karena desain ulang arsitektur, ada beberapa perubahan pada antarmuka publik. Perubahan ini, bagaimanapun, tidak signifikan, dan harus mudah diperbarui:
Saya menyadari bahwa perubahan ini dapat menyebabkan masalah bagi beberapa pengguna. Karena itu, versi OpenXLSX sebelumnya dapat ditemukan di cabang "Legacy" dari repositori ini. Namun, saya sangat menyarankan agar Anda beralih ke versi baru.
Tampaknya MS Office tidak mentolerir node XML pemformatan apa pun sebelum node <mergeCells> XML - untuk menyingkirkan pesan kesalahan yang sesuai, komit terbaru memodifikasi fungsi XLSheet::merges untuk menyisipkan simpul <mergeCells> yang baru dibuat langsung setelah simpul <sheetData> .
Default yang hilang ini dapat menyebabkan kesalahan tindak lanjut ketika indeks gaya sel ini kemudian diasumsikan valid untuk mengakses gaya dengan indeks (pengecualian jika indeks tidak dalam kisaran yang valid). Semua indeks gaya yang tersedia dalam format sel sekarang diinisialisasi nol (tanpa asumsi apa gaya dengan indeks 0 dapat dikonfigurasi sebagai, biasanya itu default - jika Anda ingin memastikan, berikan sel dengan format yang diketahui sebagai template copyFrom ke xlcellFormats :: create).
XLDocument.hpp : menambahkan showWarnings() (pengaturan default) dan suppressWarnings()XLStyles.hpp : Parameter suppressWarnings yang ditambahkan ke konstruktor (default: false )XLDocument::open : If suppressWarnings() dipanggil, Suppress Warnings About Inheal Comment XML Files dan Item Buku Kerja Tanpa TanganXLDocument::open : Pengaturan m_suppressWarnings diteruskan ke XLStyles ConstructorXLException.hpp : Menambahkan hilang #include <string>XLDocument::open akan membuat hubungan buku kerja yang hilang di _rels/.rels jika, dan hanya jika, buku kerja dengan jalur default xl/workbook.xml ada di arsipXLDocument::create dan XLDocument::saveAs , tetapi menandai mereka sebagai [[deprecated]] . Antarmuka baru memerlukan spesifikasi eksplisit XLForceOverwrite atau XLDoNotOverwrite . Setelah definisi fungsi yang sudah usang dapat dihapus, XLDoNotOverwrite dapat menjadi perilaku default baruOpenXLSX/external/nowide/nowideDemo0 / menyimpannya di makefile sebagai kendaraan ujiNotes yang DiperbaruiScripts yang dibuat dengan xml-format.sh (xml linting, berguna untuk menganalisis konten zip xlsx dalam editor teks)make-gnu.sh ke Scripts/make-gnu.shScripts/cmake-cleanup.sh untuk menyiapkan (tidak mengeksekusi!) Perintah yang menghapus semua file sementara yang dihasilkan oleh cmakeScripts/demos-cleanup.sh untuk menghapus semua file XLSX yang dibuat oleh demovoid setSavingDeclaration(XLXmlSavingDeclaration const& savingDeclaration) Menggunakan class XLXmlSavingDeclaration (didefinisikan dalam XLXmlData.hpp ) yang dapat digunakan untuk lulus versi XML khusus, pengkodean, dan properti standalon ke PUGIXMLNotes/todo-list.txt XLWorksheet sekarang memungkinkan untuk mengakses objek yang mengelola rentang sel gabungan lembar kerja
XLMergeCells XLWorksheet::merges() - akses kelas xlmergecells untuk lembar kerja secara langsungvoid mergeCells(XLCellRange const& rangeToMerge, bool emptyHiddenCells = false) - sel gabungan yang ditentukan oleh rangetomergevoid mergeCells(const std::string& rangeReference, bool emptyHiddenCells = false) - sel gabungan yang ditentukan oleh rangereferencevoid unmergeCells(XLCellRange const& rangeToUnmerge) - sel unmerge yang ditentukan oleh rangetounmergevoid unmergeCells(const std::string& rangeReference) - sel unmerge yang didefinisikan oleh rangereference XLMergeCells : Metode tambahan
int32_t XLMergeCells::findMerge(const std::string& reference) - temukan referensi pencocokan gabunganbool mergeExists(const std::string& reference) - Uji Jika ada gabungan dengan referensi adaint32_t XLMergeCells::findMergeByCell(const std::string& cellRef) - temukan penggabungan yang berisi std :: string cellrefint32_t XLMergeCells::findMergeByCell(XLCellReference cellRef) - temukan penggabungan yang berisi xlcellreference cellrefsize_t count() - Dapatkan Hitungan Gabungan yang Ditentukan dalam Lembar Kerjaconst char* merge(int32_t index) - Dapatkan gabungan string referensi di indeksconst char* operator[](int32_t index) - Overload Operator [] sebagai jalan pintas ke :: Gabunganint32_t appendMerge(const std::string& reference) - Tentukan penggabungan baru, dipanggil oleh xlworksheet :: mergecellsvoid deleteMerge(int32_t index) - Hapus gabungan dengan indeks yang diberikan dari lembar kerja (= sel unmerge), dipanggil oleh XLWorksheet :: Unmergecells Menambahkan contoh penggunaan fungsi ini ke Demo10.cpp
XLDocument::open sekarang akan mengabaikan subfolder yang tidak diketahui (mereka tetap tidak dimodifikasi dan tidak dapat diakses dalam zip dalam memori dan tetap di arsip setelah disimpan). Ini mencegah melempar pengecualian untuk file XLSX apa pun yang ditulis oleh aplikasi "kreatif" yang menambahkan item yang tidak diketahui ke perpustakaan iniconstexpr dari const unsigned int pugi_parse_settings dan memindahkannya ke XLDocument.hpp sehingga const menjadi tersedia untuk xlstyles dan xlsharedstringsXLStyles - Antarmuka dapat ditemukan di OpenXLSX/headers/XLStyles.hppExamples/Demo10.cpp menunjukkan penggunaan fungsionalitas penggabungan XLStyles & Cell baruXLCellIterator yang tidak menciptakan: Sekarang dapat beralih pada rentang dan menguji XLCellIterator::cellExists sebelum mengaksesnya. Ini memungkinkan untuk melewatkan sel yang tidak ada tanpa membuatnya.workbook##.xml , XML Namespaces dan Acak 64bit (Hubungan) Pengidentifikasixl/workbook.xml ) sekarang diterima jika dirujuk dengan benar dalam _rels/.relsbool OpenXLSX::enable_xml_namespaces() harus digunakan untuk mengaktifkan dukungan namespace sebelum membuka dokumen menggunakan misalnya namespace x (seperti demikian: <x:row r="1"> ) Di mana -manainsert_child_before("x:row", curRow ) di simpul <y:sheetData> akan melucuti x: dan masukkan elemen baris bernama <y:row> , menggunakan node namespace node indukOpenXLSX/headers/XLXmlParser.hpp ) ambil sebagai argumen terakhir opsional A bool force_ns yang - jika benar - akan menghormati namespace yang diteruskan ke fungsi pembuatan/akses node. A helper const bool OpenXLSX::XLForceNamespace = true tersedia untuk keterbacaan kodeXMLNode::insert_child_before("x:row", curRow, XLForceNamespace) di simpul <y:sheetData> seperti di atas, akan memasukkan elemen baris bernama x:rowid="rId##" di mana ## adalah nomor urutan, dan ketika komponen baru ditambahkan ke buku kerja, ID hubungan baru ditentukan dengan mengambil nilai tertinggi yang ada dalam buku kerja, dan menambahkan +1 ke dalamnya. Selama penyelidikan [#254] sebuah buku kerja ditemukan menggunakan (tampaknya) bilangan bulat 64 bit acak, disimpan dalam bentuk r:id="Rxx" , dengan xx menjadi representasi heksadesimal dari bilangan bulat 64 bit.OpenXLSX::UseRandomIDs() harus dipanggil untuk beralih fungsionalitas ID sebelum membuka dokumen seperti ituOpenXLSX::UseSequentialIDs() dapat digunakan untuk mengembalikan fungsionalitas ID hubungan default (berurutan) Catatan di enable_xml_namespaces : Dukungan namespace transparan dan dapat digunakan dengan dokumen yang tidak menggunakan ruang nama tersebut. Namun, dapat memiliki dampak kinerja kecil (<5%) pada buku kerja besar dan karenanya opsional untuk diaktifkan.
PERHATIAN DENGAN UseRandomIDs : Perlu diketahui bahwa mode campuran, di mana satu dokumen dibuka dengan dukungan ID acak dan lainnya tanpa ID hubungan berurutan, tidak didukung untuk saat ini. Jika Anda harus bekerja dengan dokumen dari berbagai jenis, Anda harus selalu mengonfigurasi perilaku ID hubungan yang diinginkan untuk dokumen berikutnya, bekerja dengan itu, tutup, dan ubah konfigurasi ID hubungan sebelum membuka dokumen berikutnya.
Harap abaikan contoh/demo0.cpp dan contoh/demo9.cpp untuk saat ini (demo0 sepele dan digunakan untuk menguji dukungan buku kerja non-standar, dan demo9 memerlukan ulasan dengan komentar yang lebih baik). Demo9 menampilkan cara menggunakan XLCellAssignable yang baru untuk menyalin konten sel (seperti Excel Copy & Tempel).
XLCellIterator tidak lagi membuat sel kosong hanya untuk iterasi di atasnya, dan menyediakan ::cellExists() untuk menguji jika sel yang saat ini diarahkan ke sel XML, sebelum mengaksesnyaXLStylesXLWorksheet sekarang menyediakan dukungan XLMergeCells untuk rentang sel penggabungan / yang tidak digerakkanDemo10.cpp memiliki banyak contoh tentang cara menggunakan fungsionalitas XLStyles barucustomXml dll di arsip XLSXXLProperties.cpp XLAppProperties to create <TitlesOfParts> and <HeadingPairs> nodes (and subnodes) if missing, added method alignWorksheets , called by XLDocument::open to ensure that all worksheets listed in the workbook xml are also accounted for in docProps/app.xml .XLProperties.cpp prettyInsertXmlNodeBefore , maybe this can eventually become a global function, paired with a TBW function prettyInsertXmlNodeAfter , and could be used by all classes, cleaning up the code for whitespace support substantially.XLProperties.cpp for <HeadingPairs> subnodes: pairCount -> pairValueParent , pairCountValue -> pairValue Code refactored in XLDocument::open to read the shared strings table while consistently ignoring phonetic tags, which were previously only ignored if the very first child of an <si> tag was a phonetic tag. Will now be ignored anywhere before, after or in between text <t> and rich text <r> tags.
Included a "dumb" fallback solution in XLRelationships.cpp GetTypeFromString to support previously unknown relationship domains, eg type="http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet" . Altered behavior will initially test against the hardcoded relationship domains, and if that test fails to identify a relationship type string, the type string will be searched for an occurrence of /relationships/ and if that substring is found, the type detection fallback will try to evaluate the relationship type based on the substring starting with /relationships/ , ignoring the domain. For the above example, that would result in a test of typeString.substr( comparePos ) == "/relationships/worksheet" , where comparePos == 41 (the position at which substring /relationships/ begins).
In anticipation of a potential future need for a similar "dumb" fallback solution, repeating hardcoded strings in XLContentTypes.cpp GetTypeFromString were also replaced with string constants.
Updated .gitignore to a more generic version that excludes everything and explicitly re-includes all desired files.
BinaryAsHexString : replaced char array with std::string, as ISO C++ standard does not permit variable size arraysRand64 : added explicit type cast, as bitwise shift-left does not do integer promotion to long on the left operand-Wpedantic -Wextra and removed all previously disabled flags after below patchesf( param ) -> f(param) , a[ index ] -> a[index] and if( condition ) -> if (condition) )warning: enumerated and non-enumerated type in conditional expression [-Wextra]void ZipArchive::Save(std::ostream& stream)void ZipArchive::ExtractDir(const std::string& dir, const std::string& dest)void ZipArchive::ExtractAll(const std::string& dest)-Wunused-function by pragma for functions fileExists and isDirectoryuint32_t (was uint64_t ). CAUTION : there is no validity check on the underlying XML (nor was there ever one in case a value was inconsistent with OpenXLSX::MAX_ROWS)-Wsign-comparebool endReached() to eliminate -Wignored-qualifiers (ignored because const on trivial return types accomplishes nothing)OpenXLSX::ignore template, can be used to suppress -Wunused-parameter and -Wunused-variable like so: OpenXLSX::ignore(unusedValue)-Wunused-parameter#pragma warning lines in another pragma to disable -Wunknown-pragmas (on gcc/g++)#pragma GCC diagnostic push#pragma GCC diagnostic ignored "-Wunknown-pragmas" // disable warning about below #pragma warning being unknown# pragma /* offending lines go here */#pragma GCC diagnostic popzippy.hppIZipArchive.hppXLCell.hppXLCellIterator.hppXLCellRange.hppXLCellReference.hppXLCellValue.hppXLColor.hppXLColumn.hppXLCommandQuery.hppXLContentTypes.hppXLDateTime.hppXLDocument.hppXLException.hppXLFormula.hppXLMergeCells.hppXLProperties.hppXLRelationships.hppXLRowData.hppXLRow.hppXLSharedStrings.hppXLSheet.hppXLStyles.hppXLWorkbook.hppXLXmlData.hppXLXmlFile.hppXLZipArchive.hppExamples/Demo5.cpp<Properties> (document) element, was previously wrongly appended to headingPairs/xl/worksheets/sheet* , /xl/sharedStrings.xml , /xl/styles.xml , /xl/theme/theme* ) and otherwise ignored. This fixes an issue when the workbook contains /xl/pivotCache/ and /xl/pivotTables/ entries until support for those is implemented (if ever ;P)<cols> element obtained via a rowNode parent's parentstd::vector< XLStyleIndex > m_columnStyles , and a method fetchColumnStyles that will populate the vector so that it can be passed to the XLCellIterator constructorXLCellIterator::cellExists() without creating the XML for the cell.<font><scheme val="major"/></font> )<font><vertAlign val="subscript"/></font> )<fills><fill><gradientFill>...</gradientFill></fill>...</fills> are now supportedPlease refer to Demo10 and XLStyles.hpp on how to set cell formatting. Pendeknya: