onsdag den 24. december 2008

Query Office-dokumenter, en mere detaljeret ser

et spørgsmål om søgning kontor regneark, om Mulberry XSL liste .

 ... 
Alt, hvad jeg skal gøre, er at hente strengen værdien af hver celle i
kolonne "A", hvis strengen længde er større end 20 tegn i
længde.
Enhver ved, hvordan de skal bruge XPath for at hente dette fra en Excel
2007-fil?
...

søgning Office-dokumenter med XQuery, eller et andet XML query sprog gerne XPath eller XSLT, er et populært gentager sig spørgsmålet. Vi mener DataDirect XQuery skal være i din værktøjskasse, når det kommer til at forespørge på Office-dokumenter. Derfor har vi blogges om det et par gange før.

Tilbage til spørgsmålet, ligner et meget simpelt spørgsmål, er det ikke? Lad os prøve ... Lad os starte fra en konkret OOXML eksempelvis et regneark kan se ud som følger.

  xmlns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main"> 
...











1,23




1




CONCATENATE ( "Hej", "verden", "!")
Hej verden!


2


...

...

Presenningen's data er struktureret af rækken. Med hver række med angivelse Thenon-tomme celler. Celler indeholder værdier i element. her det bliver mere vanskeligt. Strengværdier er ikke lagret i celleterapi bordet, medmindre de er resultatet af en beregning. I stedet kan du finde en nul-baserede indeks som værdi, som peger i den delte string tabellen, hvor denne streng er gemt entydigt. Dette er gjort for at optimere belastning/gemme resultater og for at mindske gentagelse af oplysninger. At afgøre, om de 0 i er et nummer eller et indeks til en snor, cellen's data type skal undersøges. Når data type angiver strengen, så er det et indeks og ikke en numerisk værdi.

I eksemplet ovenfor,

  • For celle A1, t = "s" attribut, angiver, at den er en streng . Som sådan 0 værdi i element er et indeks i den delte string bordet.
  • AA1 har samme værdi som A1
  • A2 har en numerisk værdi 1,23
  • A4 har en streng-baseret formel, som sådan værdien er lagret i cellen sig selv

Lad os nu se nærmere på den delte strings bordet, her er en f.eks.

Det er en liste over elementer. Disse kan være almindelig tekst, eller være rig tekststrenge. Som vi vil se senere om dette er vigtigt, når du henter strengværdien.

  xmlns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main" 
count = "5"
uniqueCount = "3">

Hej verden!



Hej






<; rFont val = "Calibri" />



vidunderlig
















<; rFont val = "Calibri" />



verden









!


<; si>
Hej vidunderlige verden!

Så tilbage til spørgsmålet. Det næste spørgsmål er svaret.

 1: erklære namespace ssml = "http://schemas.openxmlformats.org/spreadsheetml/2006/main"; 
2: erklære variable $ ark: = doc ( "jar: file:/// C:/example.xlsx!/xl/worksheets/sheet1.xml");
3: erklære variable $ sharedStrings: = doc ( "jar: file:/// C:/example.xlsx!/Xl/sharedStrings.xml ");
4: for $ c i $ ark/ssml: regneark/ssml: sheetData/ssml: række/ssml: c [kampe (@ r, "^ A [0-9 ]+")]
5: Lad $ str: =
6: if ($ c/@ t =" s ") derefter
7: string - slutte (($ sharedStrings/ssml: SST/ssml: SI) [xs: heltal ($ c/ssml: v) 1]//ssml: t ",")
8: andet
9: String ($ c/ssml: v)
10: hvor string-længde ($ str)> 20
11: vende tilbage
12: {$ str)
1. Erklærer den SpreadsheetML namespace
2. Angiver den XML-dokument, der repræsenterer de første ark i regnearket
3. Angiver den XML-dokument, der indeholder de delte strings tabellen
4. Få alle celler i en kolonne, bruger vi et regulært udtryk for at filtrere alle celler, der starter med et A, efterfulgt af en række alfa numeriske tegn
5.
6. Test, hvis cellen indeholder en strengværdi eller ej
7. Lookup strengværdien i den delte strings bordet. Da indekset i SpreadsheetML er nul-baseret vi har brug for at øge indekset ved en før adgang til n-th element. Som strengen kan være rig tekst, vi string-tiltræde alle descendent elementer
8.
9. Få værdien i cellen selv
10. Som angivet i det oprindelige spørgsmål, kun få værdier på mere end 20 tegn
11.
12. Retur cellen række/søjle antallet og den faktiske værdi

Når alt kommer til alt denne forespørgsel er længere end man kunne have troet i første omgang, da de snarere simpelt spørgsmål. Men alle kompleksitet er der grund til Open Office XML standard. Kan du forestille dig at skrive det tilsvarende i for eksempel Java?

Ud af anvendelsesområdet for dette indlæg, men løsningen kan nemt blive udvidet, for eksempel til at søge alle ark i regnearket.

Nogen ønsker at prøve og skrive det samme for regneark gemmes i OpenDocument Format?

Ingen kommentarer: