Jak pracować z pakowaniem XLSX w C++
Aspose.Cells FOSS dla C++ odczytuje i zapisuje pliki Excel w formacie .xlsx Open XML. Wewnątrz klasa XlsxWorkbookSerializer koordynuje ładowanie i zapisywanie wszystkich części skoroszytu. Ten przewodnik wyjaśnia, jak używać load/save API i co warstwa pakowania zarządza automatycznie.
Przewodnik krok po kroku
Krok 1: Skonfiguruj budowanie
cmake_minimum_required(VERSION 3.15)
project(XlsxPackaging CXX)
set(CMAKE_CXX_STANDARD 17)
add_subdirectory(path/to/Aspose.Cells-FOSS-for-Cpp)
add_executable(XlsxPackaging main.cpp)
target_link_libraries(XlsxPackaging PRIVATE Aspose.Cells.Foss.Cpp)Krok 2: Dołącz nagłówki
#include "aspose/cells_foss/Workbook.h"
#include "aspose/cells_foss/Worksheet.h"
#include "aspose/cells_foss/Cell.h"
using namespace Aspose::Cells_FOSS;Krok 3: Wczytaj istniejący plik XLSX
Konstruktor Workbook(filePath) wywołuje wewnętrznie XlsxWorkbookSerializer::Load, aby rozpakować wszystkie części Open XML:
int main() {
Workbook workbook("input.xlsx");
Worksheet& sheet = workbook.GetWorksheets()[0];
std::string title = sheet.GetCells()["A1"].GetStringValue();
return 0;
}Krok 4: Modyfikuj skoroszyt
Wprowadź dowolne zmiany komórek, stylów lub struktury przy użyciu standardowego API:
sheet.GetCells()["A1"].PutValue("Updated Title");
sheet.GetCells()["B2"].PutValue(99.0);
sheet.GetCells()["C3"].SetFormula("=B2*2");Krok 5: Zapisz skoroszyt
Wywołaj Workbook::Save(fileName), aby spakować wszystkie części Open XML z powrotem do archiwum XLSX:
workbook.Save("output.xlsx");
workbook.Dispose();Format jest wywnioskowany z rozszerzenia .xlsx. Metoda XlsxWorkbookSerializer::Save automatycznie obsługuje zapisywanie części xl/workbook.xml, xl/worksheets/sheet*.xml, xl/styles.xml i xl/sharedStrings.xml.
Krok 6: Zrozum, co zarządza warstwa pakowania
Nie musisz wchodzić w interakcję z wewnętrznymi elementami pakowania bezpośrednio. Serializator obsługuje:
| Part | Zarządzane przez |
|---|---|
| Struktura skoroszytu | XlsxWorkbookProperties |
| Dane arkusza | WorksheetXmlMapper |
| Style i czcionki | XlsxWorkbookStyles |
| Wspólne ciągi znaków | SharedStringTableXmlMapper |
| Właściwości dokumentu | XlsxDocumentProperties |
| Zdefiniowane nazwy | XlsxWorkbookDefinedNames |
Typowe problemy i rozwiązania
Plik zapisuje się, ale nie otwiera w programie Excel Upewnij się, że ścieżka wyjściowego pliku używa .xlsx rozszerzenia. Zapisanie z innym rozszerzeniem może spowodować utworzenie nierozpoznawanego pliku.
Style utracone po dwukierunkowym przetworzeniu Apply Cell::SetStyle(style) przed wywołaniem Workbook::Save. Style zmodyfikowane po zapisaniu nie są zapisywane.
Plik ładuje się jako pusty Sprawdź, czy plik nie jest zabezpieczony hasłem i jest prawidłowym XLSX (nie .xls or .xlsm). Biblioteka obsługuje .xlsx tylko.
Zdefiniowane nazwy brak po zapisaniu Użyj Workbook::EnsureUniqueDefinedName() przed zapisem, aby rozwiązać konflikty zakresu.
Pamięć nie została zwolniona Call workbook.Dispose() po zapisaniu, aby zwolnić wszystkie wewnętrzne zasoby pakowania XLSX.
Najczęściej zadawane pytania
Czy mogę zapisywać w formatach innych niż XLSX?
Obecna wersja v0.1 obsługuje zapisywanie tylko do formatu XLSX. Ładowanie CSV jest obsługiwane, ale zapisywanie do CSV nie jest dostępne.
Czy biblioteka zachowuje istniejące części, których nie zmodyfikowałem?
Tak. Serializator odtwarza wszystkie części, które wczytuje. Niezmienione dane arkusza, style i zdefiniowane nazwy są zachowywane podczas zapisu.
Czy mogę przeglądać surowy XML części skoroszytu?
Metoda XmlDocument::SaveToUtf8() serializuje dokument XML do łańcucha znaków. Jednak bezpośredni dostęp do części archiwum XLSX nie jest udostępniony w publicznym API. Użyj XmlDocument do niestandardowego przetwarzania XML.
Czy istnieje strumieniowy API dla dużych plików?
Nie. Obecna wersja ładuje cały skoroszyt do pamięci. Dla bardzo dużych plików rozważ podzielenie przetwarzania na mniejsze skoroszyty.
Co się stanie, jeśli zapiszę ponownie ten sam plik, który wczytałem?
To jest obsługiwane. Biblioteka zapisuje do nowego wewnętrznego bufora przed nadpisaniem pliku na dysku, więc zapis w miejscu nie uszkadza źródła.