LightCells API ile C++ kullanımı

Olay Tabanlı Mimari

Aspose.Cells, özellikle bellekte bir veri modeli bloğu oluşturmadan hücre verilerini bir bir işlemek için tasarlanmış olan LightCells API’sını sağlar (Hücre koleksiyonu vb. kullanılmadan). Olay temelli modda çalışır.

Çalışma kitaplarını kaydetmek için kaydederken hücre içeriğini hücre hücre sağlayın ve bileşen bunu doğrudan çıktı dosyasına kaydeder.

Şablon dosyalarını okurken bileşen her hücreyi ayrı ayrı ayrıştırır ve değerlerini tek tek sağlar.

Her iki süreçte de bir Cell nesnesi işlenir ve ardından atılır, Workbook nesnesi koleksiyonu tutmaz. Bu modda, dolayısıyla, çok miktarda bellek kullanan büyük veri kümesi barındıran Microsoft Excel dosyasının içe aktarımı ve dışa aktarımı sırasında bellek kaydedilir.

LightCells API, XLSX ve XLS dosyaları için hücreleri aynı şekilde işlemesine rağmen (bütün hücreleri belleğe yüklemez ama bir hücreyi işler ve ardından atar), XLSX dosyaları için XLS dosyalarına göre belleği daha etkili bir şekilde saklar çünkü iki formatın farklı veri modelleri ve yapıları vardır.

Ancak, XLS dosyaları için, geliştiriciler kayıt işlemi sırasında oluşturulan geçici veri için bir geçici konum belirtebilirler. Genellikle LightCells API’nin kullanılması XLSX dosyası için% 50 veya daha fazla bellek tasarrufu sağlayabilirken, XLS için kullanılması% 20-40’a kadar bellek tasarrufu sağlayabilir.

Büyük Bir Excel Dosyası Yazma

Aspose.Cells, programınızda uygulanması gereken LightCellsDataProvider arayüzü sağlar. Bu arayüz, hafif modda büyük hesap tablosu dosyalarını kaydetmek için veri sağlayıcıyı temsil eder.

Bu modda bir çalışma kitabı kaydederken, StartSheet(int) her çalışma sayfası kaydedilirken kontrol edilir. Bir sayfa için, eğer StartSheet(int) doğruysa, kaydedilecek bu sayfanın satırları ve hücreleri ile ilgili tüm veri ve özellikler bu uygulama tarafından sağlanır. Öncelikle, kaydedilecek bir sonraki satır indeksini almak için NextRow() çağrılır. Geçerli bir satır indeksi döndürülürse (satır indeksi artan sıralamada olmalıdır), bu satırı temsil eden bir Row nesnesi sağlayıcıya StartRow(Row) ile özelliklerini ayarlama imkanı sağlar.

Bir satır için, önce NextCell() kontrol edilir. Geçerli bir sütun indeksi döndürülürse (sütun indeksi artan sıralamada olmalıdır), o hücreyi temsil eden bir Cell nesnesi sağlayıcıya StartCell(Cell) ile veri ve özelliklerini ayarlama imkanı sağlar. Hücrenin verisi ayarlandıktan sonra, hücre doğrudan oluşturulan elektronik tablo dosyasına kaydedilir ve bir sonraki hücre kontrol edilir ve işlenir.

Büyük Bir Excel Dosyasını Yazmak: Örnek

Lütfen LightCells API’nin çalışmasını görmek için aşağıdaki örnek kodu inceleyin. Kod segmentlerini ihtiyacınıza göre ekleyin, kaldırın veya güncelleyin.

Program, bir çalışma sayfasında 10.000 (10000x30 matris) kayıt içeren devasa bir dosya oluşturur ve bunları sahte verilerle doldurur. Main() metodundaki rowsCount ve colsCount değişkenlerini değiştirerek kendi matrisinizi belirtebilirsiniz.

#include <iostream>
#include "Aspose.Cells.h"
using namespace Aspose::Cells;

class TestDataProvider : public LightCellsDataProvider {
private:
    int _row = -1;
    int _column = -1;
    int maxRows;
    int maxColumns;
    Workbook _workbook;

public:
    TestDataProvider(Workbook workbook, int maxRows, int maxColumns)
        : _workbook(workbook), maxRows(maxRows), maxColumns(maxColumns) {}

    bool IsGatherString() override {
        return false;
    }

    int NextCell() override {
        ++_column;
        if (_column < this->maxColumns)
            return _column;
        else {
            _column = -1;
            return -1;
        }
    }

    int NextRow() override {
        ++_row;
        if (_row < this->maxRows) {
            _column = -1;
            return _row;
        }
        else
            return -1;
    }

    void StartCell(Cell& cell) override {
        cell.PutValue(_row + _column);
        if (_row != 1) {
            cell.SetFormula(u"=Rand() + A2");
        }
    }

    void StartRow(Row& row) override {}

    bool StartSheet(int sheetIndex) override {
        return sheetIndex == 0;
    }
};

void WriteUsingLightCellsAPI() {
    U16String srcDir(u"..\\Data\\01_SourceDirectory\\");
    U16String outDir(u"..\\Data\\02_OutputDirectory\\");
    int rowsCount = 10000;
    int colsCount = 30;

    Workbook workbook;
    OoxmlSaveOptions ooxmlSaveOptions;

    TestDataProvider dataProvider(workbook, rowsCount, colsCount);
    ooxmlSaveOptions.SetLightCellsDataProvider(&dataProvider);

    workbook.Save(outDir + u"output.out.xlsx", ooxmlSaveOptions);

    std::cout << "File saved successfully using LightCells API!" << std::endl;
}

int main() {
    Aspose::Cells::Startup();
    WriteUsingLightCellsAPI();
    Aspose::Cells::Cleanup();
    return 0;
}

Büyük Excel Dosyalarını Okuma

Aspose.Cells, uygulamanızda uygulanması gereken LightCellsDataHandler adlı bir arayüz sağlar. Bu arayüz, büyük elektronik tablo dosyalarını hafif modda okuma veri sağlayıcısını temsil eder.

Bu modda bir çalışma kitabı okunurken, StartSheet her çalışma sayfası okunurken kontrol edilir. Bir sayfa için, StartSheet doğruysa, sayfadaki satırların ve sütunların hücrelerinin tüm verileri ve özellikleri bu arayüzün uygulaması tarafından kontrol edilip işlenir. Her satır için, StartRow çağrılır ve işlem gerek olup olmadığını kontrol eder. İşlem gerekiyorsa, önce özellikleri okunur ve geliştirici ProcessRow ile erişebilir. Eğer satırın hücreleri de işlenecekse, ProcessRow doğru döner ve her hücre için StartCell çağrılır. İşlenmesi gereken hücreler varsa, ardından ProcessCell çağrılır.

Büyük Excel Dosyalarını Okuma: Örnek

Lütfen LightCells API’nin çalışmasını görmek için aşağıdaki örnek kodu inceleyin. Kod segmentlerini ihtiyacınıza göre ekleyin, kaldırın veya güncelleyin.

Program, bir çalışma kitabında milyonlarca kayıt içeren büyük bir dosyayı okur. Her çalışma sayfasını okumak biraz zaman alır. Örnek kod, dosyayı okur ve her çalışma sayfasında toplam hücre sayısını, dize sayısını ve formül sayısını alır.

#include <iostream>
#include <memory>
#include "Aspose.Cells.h"

using namespace Aspose::Cells;

class LightCellsDataHandlerVisitCells : public LightCellsDataHandler
{
private:
    int cellCount;
    int formulaCount;
    int stringCount;

public:
    LightCellsDataHandlerVisitCells() : cellCount(0), formulaCount(0), stringCount(0) {}

    int GetCellCount() const { return cellCount; }
    int GetFormulaCount() const { return formulaCount; }
    int GetStringCount() const { return stringCount; }

    bool StartSheet(Worksheet& sheet) override
    {
        std::cout << "Processing sheet[" << sheet.GetName().ToUtf8() << "]" << std::endl;
        return true;
    }

    bool StartRow(int32_t rowIndex) override
    {
        return true;
    }

    bool ProcessRow(Row& row) override
    {
        return true;
    }

    bool StartCell(int32_t columnIndex) override
    {
        return true;
    }

    bool ProcessCell(Cell& cell) override
    {
        cellCount++;
        if (cell.IsFormula())
        {
            formulaCount++;
        }
        else if (cell.GetType() == CellValueType::IsString)
        {
            stringCount++;
        }
        return false;
    }
};

void Run()
{
    // Source directory path
    U16String srcDir(u"..\\Data\\01_SourceDirectory\\");

    // Create load options and set the light cells data handler
    LoadOptions opts;
    auto handler = std::make_shared<LightCellsDataHandlerVisitCells>();
    opts.SetLightCellsDataHandler(handler.get());

    // Load the workbook with the specified options
    Workbook wb(srcDir + u"LargeBook1.xlsx", opts);

    // Get the total number of sheets
    int sheetCount = wb.GetWorksheets().GetCount();

    // Output the results
    std::cout << "Total sheets: " << sheetCount << ", cells: " << handler->GetCellCount()
              << ", strings: " << handler->GetStringCount() << ", formulas: " << handler->GetFormulaCount() << std::endl;
}

int main()
{
    Aspose::Cells::Startup();
    Run();
    Aspose::Cells::Cleanup();
    return 0;
}