Accelerați macrocomenzile Calc prin citirea și scrierea datelor în loturi

Cea mai fiabilă primă accelerare pentru o macrocomandă Calc lentă este înlocuirea citirilor și scrierilor repetate celulă cu celulă cu o citire de interval, o buclă în memorie și o scriere de interval. Aceasta reduce apelurile între Basic și Calc; nu garantează un câștig de viteză fix, deoarece formulele, formatarea, dimensiunea fișierului și logica macrocomenzii pot, de asemenea, domina timpul de execuție. Exemplul de mai jos modifică o coloană de stare și arată cum se măsoară atât viteza, cât și corectitudinea. Detaliile API au fost verificate în documentația LibreOffice 26.8 pe 9 octombrie 2026.

Ce ar trebui să se îmbunătățească și cum veți măsura acest lucru?

Executați macrocomanda curentă pe o copie a registrului de lucru și înregistrați timpul scurs. Utilizați o copie nouă cu aceleași date de pornire pentru macrocomenzile vechi și revizuite sau restaurați datele de intrare între execuții; altfel, a doua execuție poate necesita mai puțin efort. Păstrați numărul de rânduri, setările de calcul și condițiile de ieșire aceleași. Repetați fiecare execuție și comparați timpul tipic, în loc să vă bazați pe o execuție neobișnuit de rapidă. Verificați dacă rezultatul corespunde regulii așteptate. O macrocomandă care se termină mai devreme, dar modifică rândurile greșite, nu reprezintă o îmbunătățire.

Funcția LibreOffice Basic Timerraportează secundele de la miezul nopții; atribuiți-o Longvariabilelor pentru a obține secunde numerice. Pentru o execuție scurtă, înregistrați o valoare de început și una de sfârșit și scădeți-le. Dacă valoarea de sfârșit este mai mică, execuția a depășit miezul nopții, deci adăugați 86.400 de secunde la diferență. Cronometrul raportează secunde întregi; utilizați ScriptForgeserviciul Cronometru pentru o precizie de milisecunde. Consultați documentația LibreOffice Basic Timer și documentația serviciului ScriptForge Timer . Păstrați deschiderea, salvarea și inspecția manuală a registrului de lucru în afara intervalului măsurat, cu excepția cazului în care acestea fac parte din sarcina reală.

Foaie de lucru Calc cu coloane ID, Regiune și Stare și un interval de date selectat
Începeți cu aceleași intervale de date continue și condiții de registru de lucru pentru fiecare rulare de cronometrare.

De ce încetinesc macrocomenzile Calc mari?

O buclă care apelează getCellByPosition()sau citește și scrie proprietăți individuale ale celulelor solicită în mod repetat Calc să traverseze interfața Basic-to-Calc pentru fiecare operație. Cu multe rânduri și coloane, aceste apeluri se pot aduna chiar și atunci când transformarea în sine este simplă. O buclă peste o matrice în memorie vizitează în continuare fiecare rând, dar evită un apel API separat pentru celule pentru fiecare valoare.

Mai întâi eliminați operațiunile care nu afectează rezultatul: evitați selectarea sau activarea celulelor în interiorul buclei, nu recalculați și nu formatați o celulă în mod repetat atunci când o singură operațiune finală pe interval este suficientă și nu procesați coloane întregi dacă este necesar doar un bloc de date delimitat. Aceste modificări ajută la izolarea blocajului real înainte de a adăuga mai multe controale.

Cum procesezi un interval ca o matrice?

Folosește un interval dreptunghiular care conține doar valorile pe care macrocomanda intenționează să le modifice. Exemplul presupune o foaie denumită Data, un rând de antet în rândul 1 și valori de stare în coloana C. Modifică numele foii și intervalul pentru a se potrivi cu registrul de lucru. API-ul getDataArray()returnează intervalul sub formă de rânduri care conțin valori; setDataArray()scrie o matrice de aceeași dimensiune înapoi în intervalul respectiv.

Editorul LibreOffice Basic citește un interval Calc selectat în aData cu getDataArray
Citește intervalul dreptunghiular necesar o dată înainte de bucla în memorie.
Sub UpdateStatuses
    Dim oSheet As Object
    Dim oRange As Object
    Dim aData As Variant
    Dim i As Long

    oSheet = ThisComponent.Sheets.getByName("Data")
    oRange = oSheet.getCellRangeByName("A2:C10001")
    aData = oRange.getDataArray()

    For i = LBound(aData) To UBound(aData)
        If aData(i)(2) = "pending" Then
            aData(i)(2) = "review"
        End If
    Next i

    oRange.setDataArray(aData)
End Sub

Tabloul de rânduri are bază zero: aData(i)(2)se adresează celei de-a treia coloane din fiecare rând. Aici este coloana C deoarece intervalul selectat începe de la A. Secvența exterioară a tabloului reprezintă rânduri, iar fiecare secvență interioară reprezintă coloane. Intervalul transmis setDataArray()trebuie să aibă aceleași dimensiuni ca și tabloul; o nepotrivire generează o eroare. Consultați referința API-ului LibreOffice XCellRangeData și documentația tabloului LibreOffice ScriptForge .

Macro LibreOffice Basic care modifică valorile în așteptare pentru a fi revizuite într-un array în memorie și scrie înapoi în array
Aplică regula în memorie, apoi scrie matricea completă în Calc într-un singur apel.

Nu permiteți celulelor formulei să fie incluse într-o actualizare exclusivă de valoare

getDataArray()returnează valorile celulelor ca numere sau șiruri de caractere, nu textul formulei originale. Dacă citiți un interval care conține formule și scrieți acel tablou înapoi cu setDataArray(), acele formule pot fi înlocuite cu rezultatele lor curente. Limitați metoda matrice-valori la celulele de intrare/ieșire care ar trebui să conțină valori. Când o macrocomandă trebuie să păstreze sau să modifice formulele, utilizați metodele matrice-formulă getFormulaArray()și setFormulaArray(), sau lucrați numai asupra intervalului care nu este o formulă. Referința API XCellRangeFormula documentează această interfață separată.

Când ar trebui să modificați setările de calcul sau de afișare?

Testați aceste opțiuni doar după măsurarea versiunii matricei. Dacă recalcularea formulei reprezintă o mare parte din execuție, puteți interoga isAutomaticCalculationEnabled(), dezactiva temporar calculul automat cu enableAutomaticCalculation(False), apoi restaura setarea originală și recalcula celulele murdare atunci când este necesar. Plasați restaurarea într-o cale de curățare, astfel încât o eroare să nu lase registrul de lucru în modul de calcul manual. Nu dezactivați calculul dacă macrocomanda necesită rezultate proaspete ale formulei între pași. Documentele LibreOffice calculate()recalculează celule murdare; calculateAll()forțează o recalculare completă și poate fi costisitor. Consultați referința API-ului XCalculatable .

lockControllers()poate suspenda unele notificări utilizate pentru actualizările afișajului în timp ce o macrocomandă modifică mai multe celule. Asociați fiecare blocare cu unlockControllers(), inclusiv atunci când macrocomanda se închide printr-un instrument de tratare a erorilor. Aceasta reduce munca de actualizare a afișajului; nu dezactivează calculul formulei și nu transformă logica per celulă într-o operațiune în bloc. Folosiți-o pentru un blocaj măsurat la actualizarea ecranului, nu ca înlocuitor pentru matricele de intervale. Consultați referința API-ului XModel .

Cum verifici schimbarea și știi când să schimbi metodele?

Executați macrocomanda revizuită pe o copie a registrului de lucru și înregistrați timpul acesteia în aceleași condiții ca și în cazul valorilor de referință. Comparați rândurile afectate, rândurile neafectate, formulele și totalurile cheie. Salvați, închideți și redeschideți copia dacă fluxul de lucru de producție include salvarea; acest lucru poate dezvălui probleme pe care o verificare vizuală rapidă le trece cu vederea. O îmbunătățire stabilă ar trebui să apară în timpul rulărilor repetate, în timp ce verificările de ieșire continuă să fie reușite.

Foaia de lucru Calc care afișează valorile de stare actualizate și o grilă goală de comparare a timpului
Confirmați valorile transformate și înregistrați timpii măsurați fără a presupune o accelerare în avans.

Dacă macrocomanda își petrece în continuare cea mai mare parte a timpului cu formule complexe, formatare, I/O fișiere sau sortare, profilați acea etapă separat; matricele de intervale reduc doar accesul repetat la celule. Pentru foi de calcul foarte mari, o matrice completă în memorie poate utiliza, de asemenea, o memorie substanțială. Procesați câteva coloane simultan sau împărțiți rândurile în blocuri măsurate dacă presiunea memoriei crește, verificând în același timp dacă fiecare bloc începe și se termină pe rândurile dorite. Dacă datele se află deja într-o bază de date și sarcina este filtrarea, gruparea sau actualizarea înregistrărilor, mutarea acestei lucrări într-o interogare a bazei de date poate fi o opțiune mai bună decât încărcarea fiecărei înregistrări în Calc.

Lasă un comentariu

Faceți ca LibreOffice să recunoască runtime-ul Java

Faceți ca LibreOffice să recunoască runtime-ul Java

Instalați un runtime Java compatibil, activați-l în LibreOffice și depanați o listă JRE goală fără a modifica setările care nu au legătură cu aceasta.

Rulați LibreOffice Headless în Docker pentru conversia PDF

Rulați LibreOffice Headless în Docker pentru conversia PDF

Construiți un mic container LibreOffice, convertiți documente Office fără o interfață grafică și verificați ieșirea PDF, limitând în același timp accesul la fișierele gazdă.

Micșorează fișierele LibreOffice Impress fără a estompa imaginile

Micșorează fișierele LibreOffice Impress fără a estompa imaginile

Reduceți fișierele de prezentare LibreOffice supradimensionate prin comprimarea fotografiilor încorporate, alegerea unor setări de imagine inteligente și verificarea calității diapozitivelor înainte de partajare.

Opriți decuparea imprimărilor la dimensiuni personalizate în LibreOffice

Opriți decuparea imprimărilor la dimensiuni personalizate în LibreOffice

Potriviți dimensiunile paginii din LibreOffice cu cele ale imprimantei dvs., verificați marginile imprimabile și corectați scalarea înainte de a imprima un document cu dimensiune personalizată.

Accelerați macrocomenzile Calc prin citirea și scrierea datelor în loturi

Accelerați macrocomenzile Calc prin citirea și scrierea datelor în loturi

Înlocuiți accesul repetat la celule cu citiri și scrieri în bloc ale intervalelor, apoi comparați rezultatul și protejați formulele în registrele de lucru Calc mari.

Organizarea unei cărți LibreOffice cu documente principale legate

Organizarea unei cărți LibreOffice cu documente principale legate

Împărțiți un manuscris lung în capitole, asamblați-le în Writer și mențineți consecvența stilurilor, conținutului și verificărilor de export.

Conectați LibreOffice Base la PostgreSQL cu ajutorul expertului încorporat

Conectați LibreOffice Base la PostgreSQL cu ajutorul expertului încorporat

Folosește opțiunea PostgreSQL directă din Base pentru a introduce detaliile serverului, a te conecta, a salva un fișier de conexiune ODB și a depana erorile comune de acces.

Faceți fonturile personalizate disponibile pentru LibreOffice Flatpak

Faceți fonturile personalizate disponibile pentru LibreOffice Flatpak

Instalați un font în folderul de fonturi al utilizatorului Linux, reporniți LibreOffice Flatpak și confirmați că apare în Writer fără a slăbi sandbox-ul aplicației.

Opriți blocările LibreOffice Save pe Sonoma: Lucrați mai întâi local

Opriți blocările LibreOffice Save pe Sonoma: Lucrați mai întâi local

Protejați-vă munca și izolați erorile de salvare pe unitatea de rețea în LibreOffice pe macOS Sonoma cu un flux de lucru local, verificări ale permisiunilor și teste specifice.

Păstrați ID-urile CSV intacte în Calc importându-le ca text

Păstrați ID-urile CSV intacte în Calc importându-le ca text

Păstrați zerourile inițiale în Calc setând coloanele ID la Text în timpul importului CSV, verificând previzualizarea și verificând datele salvate.