Tekninen artikkeli

Excelin rakenteelliset taulukkoviittaukset HotXLS:ssä

HotXLS laskee nyt rakenteellisia taulukkoviittauksia, joten =SUM(Table1[Amount]) tuottaa luvun sen sijaan, että se ohitettaisiin. Ratkaisin käsittelee muodot Table[Column], Table[[Column]], sarakevälit kuten Table[[Q1]:[Q4]], ja kohde-erittimet [#Data], [#All], [#Headers] ja [#Totals], ratkaisten kunkin työkirjan taulukkomallia vasten jäsennyshetkellä, kun taas alkuperäinen kaavateksti kiertää sanatarkasti

Yksi muoto puuttuu tarkoituksella, ja se on se, johon ihmiset törmäävät ensimmäisenä. Nykyisen rivin lyhennysmuoto [@Column] ei ole tuettu, rakenteellisesta syystä, joka kannattaa ymmärtää sen sijaan, että sitä kierrettäisiin sokeasti

Miksi rakenteellinen viittaus ei ole vain alue ystävällisellä nimellä?

Koska määritetty nimi jäädyttää osoitteen, mutta taulukkoviittaus ei. Kirjoita DataBlock nimeksi, joka osoittaa kohteeseen Sheet1!$A$2:$D$100, ja se pysyy tuona suorakulmiona, kunnes jokin kirjoittaa sen uudelleen. Kirjoita Sales[Amount], ja se tarkoittaa "Sales-taulukon Amount-saraketta", oli tuon taulukon laajuus mikä tahansa kaavaa laskettaessa. Lisää taulukkoon kaksikymmentä riviä, ja summa kattaa ne; ei ole viittausta säädettäväksi, koska kaavassa ei koskaan ollut osoitetta alun perinkään

Tuo symbolinen laatu on juuri se syy, miksi viittausta ei voi ratkaista merkkijonon korvauksella. Ratkaisimen täytyy löytää taulukko nimellä työkirjasta, hakea sarake sen otsikkotekstillä, päättää, mitkä rivit pyydetty kohde-erittimen alue kattaa, ja tuottaa konkreettinen suorakulmio. HotXLS tekee tämän kaavan kääntämisen aikana taulukkomallin kautta, minkä vuoksi ennen taulukon kasvua kirjoitettu kaava laskee silti taulukon nykyistä laajuutta vasten

Kielioppi, jonka HotXLS ratkaisee

Tuettu spesifikaatiokielioppi kattaa yhden suorakulmaisen tuloksen ja kannattaa esittää täsmällisesti, koska Excelin dokumentaatio esittää paljon laajemman pinnan kuin useimmat moottorit toteuttavat. HotXLS hyväksyy muodon [Col] ja hakasulkeellisen muunnelman [[Col]], paljaat kohde-erittimet [#Data], [#All], [#Headers] ja [#Totals], yhdistetyn muodon [[#Data],[Col]], kohde-erittimen sisäisen välin muodossa [[#Data],[Col1]:[Col2]], ja tavallisen välin [Col1]:[Col2]

Se, minkä tuo joukko antaa sinulle, on jokainen viittausmuoto, joka tuottaa yhden yhtenäisen lohkon: sarakkeen, vierekkäisten sarakkeiden ajon, vain-rungon tai otsikon sisältävän siivun kummastakin. Ei-vierekkäiset unionit ja monialueiset tulokset ovat sen ulkopuolella. Kun viittausta ei voida ratkaista, kaava säilyttää aiemman ohita-ilman-arvoa-käyttäytymisen sen sijaan, että se korvaisi arvauksella, joten ratkaisematon viittaus ei koskaan muutu uskottavaksi vääräksi luvuksi

var
  Book: TXLSXWorkbook;
  Sheet: TXLSXWorksheet;
  Cols: TStringList;
begin
  Book := TXLSXWorkbook.Create;
  Cols := TStringList.Create;
  try
    Sheet := Book.Sheets.Add('Sales');
    Cols.Add('Region');
    Cols.Add('Q1');
    Cols.Add('Q2');
    Cols.Add('Amount');
    Sheet.Tables.Add('SalesTable', 'A1:D25', Cols);
    // ... kirjoita otsikkorivi ja 24 datariviä ...

    Sheet.Cells[27, 4].Formula := 'SUM(SalesTable[Amount])';
    Sheet.Cells[28, 4].Formula := 'SUM(SalesTable[[Q1]:[Q2]])';
    Sheet.Cells[29, 4].Formula := 'COUNTA(SalesTable[[#Data],[Region]])';
    Sheet.Cells[30, 4].Formula := 'ROWS(SalesTable[#All])';

    Book.Recalculate;
    Book.SaveAs('sales.xlsx');
  finally
    Cols.Free;
    Book.Free;
  end;
end;

Miksi nykyisen rivin muoto on jätetty tarkoituksella pois?

[@Column] ja [#This Row] tarkoittavat "sen sarakkeen solua rivillä, jolla tämä kaava asuu". Arvo riippuu siis laskevan solun sijainnista, ei vain taulukosta. Se on erilainen viittaustyyppi: ei suorakulmio, jonka kääntäjä voi ratkaista kerran, vaan solukohtainen ratkaisu, joka täytyy tehdä uudelleen jokaiselle riville, jolla kaava esiintyy

HotXLS palauttaa False-arvon taulukkoalueratkaisimesta näille muodoille, mikä ohjaa ne ohita-ilman-arvoa-polulle. Kaavateksti säilytetään ja kirjoitetaan takaisin muuttumattomana, joten työkirja, joka käyttää muotoa [@Amount], avautuu oikein Excelissä sovelluksesi läpi kiertämisen jälkeen; vain HotXLS:n laskema arvo puuttuu. Kun valinta on puuttuvan arvon ja väärää riviä vasten lasketun arvon välillä, puuttuminen on se, jonka voit havaita

Käytännön kiertotie on mekaaninen: tuottamassasi työkirjassa kirjoita vastaava A1-tyylinen suhteellinen viittaus, mikä on se, mitä Excel tallentaa sisäisesti joka tapauksessa suurelle osalle taulukon laajuista logiikkaa. Työkirjassa, jota vain käsittelet, jätä kaava rauhaan ja lue välimuistiin tallennettu arvo, jonka Excel on jo tallentanut, mikä on se, mitä lataus-ja-raportoi-putki yleensä haluaa

var
  Book: TXLSXWorkbook;
  Sheet: TXLSXWorksheet;
  Table: TXLSXTable;
  Row: Integer;
begin
  Book := TXLSXWorkbook.Create;
  try
    if Book.Open('sales.xlsx') <> 1 then Exit;
    Sheet := Book.Sheets[1];

    Table := Sheet.Tables.FindByName('SalesTable');
    if Table <> nil then
    begin
      // Recordset-tyylinen haku taulukon rungon yli, 1-pohjainen rivitulos
      Row := Table.FindFirst(Sheet, 'Region', 'EMEA');
      while Row > 0 do
      begin
        Log(VarToStr(Sheet.Cells[Row, 4].Value));
        Row := Table.FindNext(Sheet, 'Region', 'EMEA', Row);
      end;
    end;
  finally
    Book.Free;
  end;
end;

Mitä tapahtuu, kun taulukon muoto muuttuu

Rakenteelliset viittaukset mitätöidään sen sijaan, että ne hiljaa uudelleenosoitettaisiin, kun nimeämänsä asia katoaa. Poista sarake, ja kaavat, jotka viittaavat tuohon sarakkeeseen, mitätöidään samalla tavalla kuin Excel mitätöi ne; poista tai nimeä taulukko uudelleen, ja viittaukset siihen käsitellään samalla tavalla. Tämä on oikea käyttäytyminen, ja se peilaa tavallista viittausten säätöä, joka on kuvattu artikkelissa kaavaviittausten säätö lisäyksessä ja poistossa, jossa moottorin tehtävä on pitää kaavat rehellisinä eikä pitää niitä näyttämästä päteviltä

Rivien kasvu on päinvastainen tapaus, eikä se tarvitse mitään säätöä lainkaan. Koska viittaus nimeää taulukon eikä suorakulmiota, rivien liittäminen taulukon alueen sisään laajentaa sitä, mitä [#Data] kattaa, koskematta yhteenkään kaavaan. Tämä on se ominaisuus, joka tekee taulukoista käyttökelpoisia raporttimallissa: totals-rivi jatkaa kaiken tuonnin tuottaman laskemista yhteen, oli tulos kuinka monta riviä tahansa

Kiertokuri

HotXLS säilyttää alkuperäisen kaavatekstin. Työkirja, joka on ladattu muodolla SUM(SalesTable[Amount]), tallennetaan muodolla SUM(SalesTable[Amount]), ei ratkaistulla muodolla SUM(D2:D25). Tällä on enemmän merkitystä kuin miltä se saattaa vaikuttaa: käyttäjä, joka avaa tulosteesi Excelissä, odottaa näkevänsä kaavan, jonka hän kirjoitti, ja ratkaistu osoite muuttaisi huomaamatta itseään ylläpitävän mallin hauraaksi malliksi, joka lakkaa kattamasta uusia rivejä

Kaksi toisiinsa liittyvää kykyä täydentävät kuvan. Itse taulukkomääritykset, mukaan lukien otsikottomat taulukot ja taulukkokohtaiset kommentit, kiertävät taulukkomallin kautta, joka on kuvattu artikkelissa datan validointi, AutoFilter ja Excel-taulukot. Ja kun monet solut jakavat yhden kaavion, XLSX tallentaa ne kerran jaettuna kaavana, joka laajennetaan ja kirjoitetaan uudelleen, kuten käsitellään artikkelissa jaetun kaavan si-laajennus. Rakenteelliset viittaukset jaettujen kaavojen sisällä kulkevat molempien polkujen läpi, joten molempien täytyy toimia, ja ne toimivat

HotXLS lukee ja kirjoittaa XLS-, XLSX- ja ODS-tiedostoja Delphistä ja C++Builderista ilman Excel-asennusta ja ilman Office-automaatiota, laskien kaavat omassa moottorissaan. Taulukkomalli, kaavamoottori ja uudelleenlaskenta-API on dokumentoitu sivulla HotXLS Delphi spreadsheet component page