Jak przyspieszyć działanie makr Calc w LibreOffice w przypadku dużych zestawów danych

Makra LibreOffice Calc często działają wolno w dużych arkuszach kalkulacyjnych z prostego powodu: makro spędza więcej czasu na przekraczaniu granicy obiektu UNO niż na wykonywaniu samych obliczeń. Odczyt jednej komórki, zmiana jej i zapisanie jej tysiące razy może być znacznie bardziej kosztowne niż przenoszenie tych samych danych w większych blokach.

Celem nie jest uczynienie każdego makra „szybkim” w teorii. Użyteczna optymalizacja powinna generować takie same wyniki, kończyć działanie w krótszym czasie na tym samym zestawie danych, zapewniać wystarczającą responsywność Calca dla danego przepływu pracy oraz unikać tworzenia nowych problemów z poprawnością lub pamięcią. Poniższe techniki koncentrują się na tych mierzalnych rezultatach.

W październiku 2026 roku aktualna dokumentacja pakietu LibreOffice SDK identyfikuje interfejsy arkuszy kalkulacyjnych używane w dokumentacji API LibreOffice 26.8. Podstawowe metody to znane od dawna interfejsy UNO, a nie nowo wprowadzona funkcja wydajnościowa.

1. Zmierz makro przed jego zmianą

Zacznij od powtarzalnej linii bazowej. LibreOffice Basic oferuje funkcję GetSystemTicks(), którą oficjalna Pomoc opisuje jako sposób pomiaru cykli pracy systemu i optymalizacji procesów. Zamiast ustawiać czas otwarcia skoroszytu, monity użytkownika lub niezwiązaną z tym konfigurację, skoncentruj się na tej części makra, którą faktycznie chcesz ulepszyć.

Dim t0 As Long, elapsed As Long

t0 = GetSystemTicks()

' Run the work you want to measure here.

elapsed = GetSystemTicks() - t0
MsgBox "Elapsed ticks: " & elapsed

Uruchom tę samą operację kilka razy na tej samej kopii pliku. Pierwsze uruchomienie może się różnić ze względu na pamięć podręczną systemu plików, stan formuły lub inne jednorazowe działania. Zapisz rozmiar zbioru danych, przetworzony zakres oraz informację, czy włączono automatyczne obliczanie, aby porównania były wiarygodne.

Dobry wynik to nie tylko niższy wynik czasowy. Upewnij się, że liczba wierszy, sumy, formuły, wartości tekstowe, daty i wszelkie zakresy wyjściowe nadal odpowiadają wartościom bazowym.

Oficjalne odniesienie: Pomoc LibreOffice: Funkcja GetSystemTicks .

2. Najpierw usuń odczyty i zapisy komórka po komórce

Jeśli makro przechodzi przez duży zakres i wielokrotnie wywołuje metody takie jak getCellByPosition(), to ten wzorzec jest zazwyczaj pierwszym miejscem, w którym należy szukać. Interfejs API UNO udostępnia funkcję XCellRangeData.getDataArray()specjalnie setDataArray()do przenoszenia całego zakresu komórek jako tablicy.

Oficjalne API podaje, że getDataArray()zwraca sekwencję wierszy, z których każdy zawiera kolumny. Wartości są zwracane jako ciągi znaków lub liczby zmiennoprzecinkowe. setDataArray()Funkcja zapisuje tablicę z powrotem do zakresu, a wymiary tablicy muszą pasować do tego zakresu.

Załóżmy na przykład, że kolumny od A do E zawierają dane wejściowe, które przetwarza Twoje makro. Zamiast odczytywać każdą komórkę osobno, wybierz dokładny zakres raz:

Dim doc As Object
Dim sheet As Object
Dim sourceRange As Object
Dim data As Variant

doc = ThisComponent
sheet = doc.Sheets.getByName("Data")

' Example only: A2:E50001.
sourceRange = sheet.getCellRangeByPosition(0, 1, 4, 50000)
data = sourceRange.getDataArray()

Przetwarzaj dataw pamięci podstawowej, a następnie zapisz tablicę wyników do pasującego zakresu docelowego w jednej operacji. To znacznie zmniejsza liczbę wywołań UNO w porównaniu z tysiącami pojedynczych odczytów i zapisów.

Oficjalne odniesienia: LibreOffice SDK: XCellRangeData i LibreOffice SDK: XCellRange .

3. Przetwarzaj tylko zakres, którego faktycznie potrzebujesz

Dostęp do zbiorczych tablic jest pomocny, ale przekształcenie niepotrzebnie dużego arkusza w tablicę może po prostu przenieść wąskie gardło do pamięci. Unikaj kodowania na stałe całych kolumn lub całej siatki Calc, gdy zadanie dotyczy tylko zdefiniowanej tabeli.

Określ ostatni znaczący wiersz, korzystając z informacji, które Twój skoroszyt już zna: liczby importowanych wierszy, rozmiaru wyników bazy danych, wyznaczonej kolumny klucza lub zakresu utworzonego przez aplikację. Następnie zażądaj tylko wierszy i kolumn wymaganych przez makro.

Jest to szczególnie ważne, gdy arkusz kalkulacyjny zawiera formatowanie znacznie poniżej rzeczywistych danych lub gdy stara zawartość rozszerzyła pozornie wykorzystany obszar. Duże tablice w pamięci zużywają pamięć RAM, a jedna nadmierna alokacja może być gorsza niż przetwarzanie bloków o średniej wielkości.

Kiedy przejść na chunking

Jeśli pojedyncza tablica powoduje gwałtowny wzrost wykorzystania pamięci, długie przerwy przed rozpoczęciem przetwarzania lub zbliża się do praktycznych możliwości maszyny, należy przetwarzać dane blokami. Na przykład, obsłuż kilka tysięcy wierszy, zapisz wyniki, a następnie przejdź do następnego bloku. Nie ma uniwersalnego, idealnego rozmiaru bloku; przetestuj go na rzeczywistym skoroszycie i sprzęcie.

4. Zawieś powiadomienia o aktualizacji ekranu podczas intensywnej pracy

XModelDokument Calc implementuje interfejs LibreOffice . Jego lockControllers()metoda zawiesza niektóre powiadomienia kontrolera używane do aktualizacji wyświetlania, a następnie unlockControllers()je wznawia. Pozwala to ograniczyć zbędną pracę wizualną podczas wykonywania wielu zmian przez makro.

Dim doc As Object
doc = ThisComponent

doc.lockControllers()

' Perform bulk changes here.

doc.unlockControllers()

Oficjalne API wyraźnie wskazuje, że blokady i odblokowania kontrolera muszą być sparowane. Oznacza to, że makra produkcyjne powinny obejmować obsługę błędów, która gwarantuje unlockControllers()osiągnięcie celu nawet w przypadku niepowodzenia przetwarzania. Pozostawienie zablokowanego dokumentu nie jest optymalizacją wydajności, a jedynie uszkodzoną ścieżką czyszczenia.

Oficjalne odniesienie: LibreOffice SDK: XModel .

5. Kontroluj automatyczne ponowne obliczanie, gdy formuły dominują w czasie wykonywania

Jeśli makro wielokrotnie zmienia komórki, które zasilają wiele formuł, Calc może spędzać dużo czasu na przeliczaniu, podczas gdy makro nadal aktualizuje wartości pośrednie. Dokument arkusza kalkulacyjnego udostępnia interfejs XCalculatable, w tym isAutomaticCalculationEnabled(), enableAutomaticCalculation(), calculate()i calculateAll().

Bezpieczniejszym rozwiązaniem jest zapamiętanie aktualnego trybu obliczeń użytkownika, wyłączenie automatycznego obliczania tylko na czas aktualizacji i przywrócenie pierwotnego stanu po jej zakończeniu:

Dim doc As Object
Dim wasAutoCalc As Boolean

doc = ThisComponent
wasAutoCalc = doc.isAutomaticCalculationEnabled()

doc.enableAutomaticCalculation(False)

' Perform bulk updates.

doc.enableAutomaticCalculation(wasAutoCalc)

If wasAutoCalc Then
    doc.calculate()
End If

calculate()Przelicza brudne komórki. calculateAll()Przelicza każdą komórkę, co samo w sobie może być kosztowne, dlatego nie wywołuj tej funkcji automatycznie po zakończeniu działania makra. Pełnego przeliczania należy używać tylko wtedy, gdy logika skoroszytu tego wymaga.

Podobnie jak w przypadku blokowania kontrolera, przywróć stan obliczeń w ścieżce usuwania błędów. Makro nie powinno bezmyślnie pozostawiać skoroszytu użytkownika w trybie obliczeń ręcznych.

Oficjalne odniesienie: LibreOffice SDK: XCalculatable .

6. Bezpiecznie połącz optymalizacje

Zazwyczaj najbardziej efektywna struktura wygląda następująco: określ dokładny zakres, odczytaj go raz, przetwórz wartości w pamięci, zapisz wyniki zbiorczo i wstrzymaj niepotrzebne czynności związane z interfejsem użytkownika lub ponownym obliczaniem tylko na czas trwania tej operacji.

Praktyczny schemat czyszczenia w pakiecie LibreOffice Basic wygląda następująco:

Sub ProcessLargeData
    Dim doc As Object
    Dim sheet As Object
    Dim dataRange As Object
    Dim data As Variant
    Dim wasAutoCalc As Boolean

    On Error GoTo CleanUp

    doc = ThisComponent
    sheet = doc.Sheets.getByName("Data")
    dataRange = sheet.getCellRangeByPosition(0, 1, 4, 50000)

    wasAutoCalc = doc.isAutomaticCalculationEnabled()

    doc.lockControllers()
    doc.enableAutomaticCalculation(False)

    data = dataRange.getDataArray()

    ' Transform data in memory here.
    ' Build an output array with dimensions matching its target range.

CleanUp:
    doc.enableAutomaticCalculation(wasAutoCalc)

    If doc.hasControllersLocked() Then
        doc.unlockControllers()
    End If

    If wasAutoCalc Then
        doc.calculate()
    End If
End Sub

W tym przykładzie celowo pozostawiono logikę transformacji nieokreśloną, ponieważ ta część zależy od skoroszytu. Istotną optymalizacją jest kształt przepływu pracy, a nie wymyślone obliczenia biznesowe.

7. Rozważ wbudowane funkcje Calca przed ich ponowną implementacją

LibreOffice Basic może wywoływać funkcje Calc za pośrednictwem com.sun.star.sheet.FunctionAccessusługi. Jeśli makro ręcznie implementuje wyszukiwanie, agregację lub inną operację, którą Calc już udostępnia, użycie wbudowanej funkcji może uprościć kod i ograniczyć niestandardowe pętle.

Nie gwarantuje to, że każda wbudowana funkcja będzie działać lepiej niż każdy niestandardowy algorytm. Przeprowadź analizę rzeczywistego obciążenia. Oficjalna Pomoc pokazuje, jak wywoływać funkcje Calc z poziomu Basica i zaznacza, że ​​nazwy funkcji są podawane w języku angielskim.

Oficjalne odniesienie: Pomoc LibreOffice: Używanie funkcji Calc w makrach .

Jak ocenić, czy optymalizacja jest wystarczająco dobra

SprawdzaćDobry znakKiedy zmienić podejście
Czas wykonaniaPowtarzane przebiegi są konsekwentnie krótsze od przebiegu bazowego.Większość czasu nadal poświęcamy jednej sekcji, dlatego twórz osobne profile dla tej sekcji.
PoprawnośćSumy, liczba wierszy, formuły i rekordy reprezentatywne są zgodne z oryginalnym makrem.Konwersja tablic zmienia typy danych lub wymiary wyjściowe.
PamięćAsortyment hurtowy mieści się wygodnie, bez konieczności zamiany lub długich przerw w alokacji.Jeśli tablica pełnego zakresu stanie się zbyt duża, należy używać mniejszych fragmentów.
PrzeliczeniePraca nad formułą odbywa się raz po głównej aktualizacji, a nie po każdym zapisie.Zależności formuł wymagają pośrednich obliczonych wartości.
Zachowanie interfejsu użytkownikaPo zakończeniu lub niepowodzeniu dokument powraca do normalnego wyświetlania i stanu obliczeń.Dodaj silniejsze czyszczenie/obsługę błędów, jeśli stan może pozostać zmieniony.

Typowe błędy, które niweczą korzyści

  • Wczytanie całego arkusza kalkulacyjnego do pamięci, gdy potrzebnych jest tylko kilka kolumn.
  • Używam getDataArray(), ale nadal zapisuję każdy wynik komórka po komórce.
  • Wyłączenie automatycznego obliczania i zapomnienie o przywróceniu poprzedniego ustawienia.
  • Blokowanie kontrolerów bez niezawodnej ścieżki czyszczenia.
  • Wywołanie calculateAll()po każdej małej partii, nawet gdy ponowne obliczenie wymagają tylko brudne komórki.
  • Ocenianie prędkości na podstawie pojedynczego pomiaru zamiast powtarzanych pomiarów tych samych danych.
  • Optymalizacja wydajności bez sprawdzania, czy dane wyjściowe pozostają niezmienne.

Gdzie te techniki przestają pomagać

Transfery tablicowe głównie zmniejszają obciążenie związane z dostępem do obiektów arkusza kalkulacyjnego. Nie rozwiązują one jednak problemu z algorytmem, który jest z natury kosztowny. Na przykład zagnieżdżone porównywanie każdego wiersza z każdym innym wierszem może być powolne, nawet gdy wszystkie wartości znajdują się w pamięci. W takim przypadku należy zmienić algorytm: użyć słowników lub indeksów, posortować dane jednokrotnie zamiast wielokrotnie, ograniczyć duplikację zadań lub przenieść obciążenie do bardziej odpowiedniego narzędzia do przetwarzania danych, gdy arkusz kalkulacyjny nie jest już właściwym środowiskiem wykonawczym.

To samo dotyczy makr zdominowanych przez wywołania sieciowe, zapytania do bazy danych, operacje wejścia/wyjścia plików lub usługi zewnętrzne. Najpierw zmierz, aby zoptymalizować faktyczne wąskie gardło, a nie widoczną pętlę arkusza kalkulacyjnego.

Zalecana kolejność optymalizacji

  1. Zmierz bieżącą makroinstancję przy użyciu powtarzalnego zestawu danych.
  2. Zastąp powtarzające się odczyty i zapisy komórek tablicami zakresów.
  3. Ogranicz przetwarzanie do konkretnych wierszy i kolumn, których potrzebujesz.
  4. Użyj podziału na fragmenty, jeśli tablica zbiorcza jest zbyt duża, aby wygodnie korzystać z pamięci.
  5. Blokada kontrolerów podczas dużych partii, gwarancja czyszczenia.
  6. Tymczasowo zawiesza automatyczne obliczanie, gdy wielokrotne przeliczanie formuły stanowi wąskie gardło.
  7. Przelicz tylko tyle, ile potrzeba, przywróć stan aplikacji i sprawdź dane wyjściowe.
  8. Dokonaj ponownego pomiaru. Jeśli w czasie wykonywania nadal dominują obliczenia, a nie dostęp do UNO, należy ulepszyć algorytm.

W przypadku dużych zbiorów danych Calc, zmniejszenie liczby wywołań między obiektami Basic a obiektami arkusza kalkulacyjnego jest zazwyczaj najważniejszą poprawą strukturalną. Traktuj każdą dodatkową optymalizację jako coś, co należy zmierzyć, a nie jako rytuał. Szybsze makro jest przydatne tylko wtedy, gdy pozostaje poprawne, przewidywalne i łatwe w utrzymaniu.

Zostaw komentarz

Jak przenieść obraz w programie Microsoft Word

Jak przenieść obraz w programie Microsoft Word

Dowiedz się, jak przeciągać obraz w programie Word, wybierać opcje zawijania tekstu, zachowywać go w akapicie lub mocować na stronie oraz rozwiązywać problemy z obrazami, których nie można przenieść.

Jak wstawić pole wyboru w programie Excel: dwie proste metody

Jak wstawić pole wyboru w programie Excel: dwie proste metody

Dowiedz się, jak wstawić pole wyboru w programie Excel za pomocą narzędzia w komórce, zliczyć zaznaczone elementy za pomocą formuł lub dodać powiązany formant formularza w starszych wersjach programu na komputery stacjonarne.

Jak automatycznie wypełniać litery w programie Excel: od A do Z i dalej

Jak automatycznie wypełniać litery w programie Excel: od A do Z i dalej

Generuj litery od A do Z, małe litery lub etykiety powyżej Z w programie Excel za pomocą formuły z uchwytem wypełniania, SEKWENCJI lub wielokrotnego użytku listy niestandardowej.

Jak przekreślić tekst w programie Excel: skróty i metody krok po kroku

Jak przekreślić tekst w programie Excel: skróty i metody krok po kroku

Dowiedz się, jak przekreślać wiersze w programie Excel w systemie Windows, na komputerze Mac i w przeglądarce, formatować część komórki i usuwać wiersze bez usuwania ich wartości.

Czym jest Microsoft Access? Jak działają jego narzędzia bazodanowe

Czym jest Microsoft Access? Jak działają jego narzędzia bazodanowe

Microsoft Access to aplikacja bazy danych systemu Windows do przechowywania powiązanych rekordów, tworzenia zapytań, tworzenia formularzy wprowadzania danych i generowania raportów. Dowiedz się, jak działa i kiedy się sprawdza.

Importowanie i eksportowanie danych z programu Office Outlook 2010: przenoszenie danych za pomocą pliku PST

Importowanie i eksportowanie danych z programu Office Outlook 2010: przenoszenie danych za pomocą pliku PST

Dowiedz się, jak zaimportować plik PST do programu Outlook 2010 lub wyeksportować pocztę, kontakty, kalendarz i zadania. Postępuj zgodnie z odpowiednimi menu i unikaj pominiętych folderów lub duplikatów.

Zmiana wysokości i szerokości linii siatki w programie Word 2010

Zmiana wysokości i szerokości linii siatki w programie Word 2010

Dowiedz się, jak dostosować wysokość i szerokość linii siatki w programie Word 2010, zmienić widoczną częstotliwość linii oraz ustawić odstępy między liniami siatki w pionie i w poziomie.

Jak wstawić aktywną stronę internetową do slajdu programu PowerPoint

Jak wstawić aktywną stronę internetową do slajdu programu PowerPoint

Za pomocą dodatku LiveWeb możesz umieścić witrynę internetową na slajdzie programu PowerPoint, ustawić jej rozmiar i sposób odświeżania oraz sprawdzić zgodność przed prezentacją.

Odzyskiwanie hasła PST programu Outlook za pomocą jądra Nucleus

Odzyskiwanie hasła PST programu Outlook za pomocą jądra Nucleus

Odzyskaj zapomniane hasło PST programu Outlook, korzystając z bieżących instrukcji Kernela, obejmujących m.in. identyfikację właściwego pliku, wykonanie kopii zapasowej i sprawdzenie ograniczeń narzędzia.

Dodaj święta narodowe do kalendarza Outlook

Dodaj święta narodowe do kalendarza Outlook

Dodaj święta krajowe w nowym Outlooku, Outlooku w przeglądarce lub klasycznej wersji Outlooka. Dowiedz się, jak unikać duplikatów wydarzeń i sprawdzać, czy nie brakuje dat z lat 2026–2027.