2010

Sep

02

Av Rolf

FileMaker kan exportera information till Excel, det är bara att välja menykommandot Spara som Excel. Men det blir alltid samma utseende, alla fält i ett antal rader. 

Ibland har du en färdig mall i Excel där du vill sätta in uppgifter i olika celler, inte nödvändigtvis under eller bredvid varandra. Jag har tidigare skrivit om hur man med hjälp av en mall i Excel och beräkningsfunktionen Substitute i kombination med manussteget Exportera Fältinnehåll kan skapa Excel-dokument i FileMaker med information på valfria ställen i Excel-dokumentet. Denna metod har vi för övrigt använt i ett flertal projekt med bra resultat.

I och med att mallen görs i Excel krävs inte heller så mycket programmeringskunskap för att åstadkomma ett bra resultat.

Det kan dock finnas tillfällen där man mer dynamiskt vill lägga till rader, kolumner eller flikar i ett Excel-dokumentet. Det går att lösa på ett liknande sätt, skillnaden är att exportera FileMaker-informationen som XML och använda en XSLT för att skapa Excel-dokumentet. Det blir lite mer besvärligt, men även med denna metod utgår man från en mall gjord i Excel som underlättar.

Du börjar med att göra ett Excel-dokument, sätter in ledtexter och utformar text och formler så som du vill ha dem. Där du vill att FileMaker ska fylla på med text bör du skriva något som gör att du kan hitta uppgiften senare, t.ex. ”Namn” där du vill att ett namn från FileMaker ska hamna.

ExcelMall

När du gjort Excel-dokumentet klart sparar du det som XML-kalkyblad. I min version av Excel 2007 för Windows heter filformatet ”XML-kalkylblad 2003” (i Excel för Mac heter det ”XML-kalkylblad”) . XML-filen ska du sedan öppna i en editor (inte ordbehandlingsprogram), t.ex. ”Textredigerare” eller ”Anteckningar”. I det förra exemplet kopierades hela filen till ett textfält i FileMaker, den här gången används XML-filen som utgångspunkt för att skapa en XSLT där vissa uppgifter skrivs in från FileMaker-databasen i samband med exporten.

Jag har gjort ett mycket enkelt exempel i Excel där jag ska sätta in namn, adress, ort och ett antal försäljningssiffror på olika ställen i ett kalkylblad. Fälten som exporteras är i tur och ordning NamnAdressOrtÅr och Belopp, där År ochBelopp är relaterade fält och dess antal kan alltså variera. Varje post i FileMaker-databasen ska dessutom hamna på en egen flik i Excel-dokumentet. I mitt malldokument i Excel har jag dock bara gjort en flik.

När jag öppnar XML-dokumentet från Excel i texteditorn tar jag bort den första raden, som är definitionen för XML-versionen, och ersätter den med en definition för XSLT istället. Filen ska inledas med följande rader:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
 xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns:fmp="http://www.filemaker.com/fmpxmlresult"
 exclude-result-prefixes="fmp">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
<xsl:template match="/">

Dessa rader definierar filen som en XSLT-fil och namnger ett antal s.k. namespaces som behövs för Excel och FileMaker. Näst sista raden berättar att jag vill att resultatet ska bli en XML-fil. Den sista raden inleder själva XSLT-programmet som i stort är detsamma som XML, med skillnaden att vissa uppgifter är dynamiska och hämtas från FileMaker.

Hoppa sedan ner i filen till raden ”<Worksheet name=”ss:Name”>” och lägg in följande rad före:

<xsl:for-each select="//fmp:FMPXMLRESULT/fmp:RESULTSET/fmp:ROW">

Raden loopar genom samtliga poster i FileMakers export och skapar ett Worksheet för varje post. Ett Worksheet är det samma som flik. Eftersom jag vill skapa en flik för varje post döper jag den till namnet som kommer från FileMaker. Det gör jag genom att ersätta raden med Worksheet med följande 2 rader:

<Worksheet>
<xsl:attribute name="ss:Name"><xsl:value-of select="fmp:COL[1]/fmp:DATA" /></xsl:attribute>

Kommandot ”<xsl:value-of select=”fmp:COL[1]/fmp:DATA” />” hämtar innehållet i det första fältet i posten som i det här fallet är Namn. På samma sätt anger jag adressen i två celler på en rad med:

<Row>
   <Cell ss:StyleID="s62"><Data ss:Type="String">Adress</Data></Cell>
   <Cell><Data ss:Type="String"><xsl:value-of select="fmp:COL[2]/fmp:DATA" /></Data></Cell>
</Row>

Övriga rader i XML-filen behåller jag såsom de är, förutom en loop med <xsl:for-each> som skapar en rad för varje relaterat fält (ladda ner XSLT-filen och se).

Textfilen avslutas med

</xsl:for-each>
</Workbook>
</xsl:template>
</xsl:stylesheet>

som avslutar loopen som skapar flikar för varje post, avslutar Excels kalkylblad och XSLT-programmet. Spara sedan filen med filtypen ”.xslt”.

I FileMaker väljer du sedan att exportera poster till XML och väljer att använda XSLT-filen som formatmall.

Excelexp1

Du väljer att exportera fälten i denna ordning.

Excelordning

FileMaker-databasen ser ut så här:

ExcelFMP

Det resulterande Excel-dokumentet ser ut så här när XML-filen som exporterats från FileMaker (med 2 poster) och öppnats i Excel (med 2 flikar):

ExcelExcel

XSLT-filen och FileMaker-databasen finns för nedladdning.

Excelexport.zip (16,80 kb)

Kommentarer

2011-11-16 Magnus

Mycket användbar och intressant teknik. Fungerar utmärkt i windows, men jag behöver få det att fungera på Mac. Filen skapas, men den blir inte rätt uppmärkt som xml-fil. Har du någon idé om hur man skall gå tillväga där. (såg i ditt andra blogginlägg att du inte testat metoden i Mac, men du kanske har något förslag om vad som skulle behövas?)

2011-11-17 Rolf

Den här tekniken ska fungera lika bra i Mac. Du får döpa filen med ändelsen ".xml" själv för att filen ska kännas igen som xml-fil.

2011-11-18 Magnus

Tack. Jag skall testa det. Har inte excel i min mac-maskin för tillfället. Numbers är inte riktigt lika kompatibel med xml-formatet.
En sak jag har funderat på, borde inte den här metoden fungera lika bra för word (docx)-format? Har du provat?

2011-11-22 Rolf

Den fungerar förmodligen lika bra med Word, jag har inte provat. Dock finns det andra sätt i Word, t.ex. kopplade utskrifter som kan vara enklare.

2018-05-04 Fredrik

Vet att det är ett tag sedan denna post men det är inte så att exempelfilen fortfarande finns tillgänglig?

2018-05-08 Rolf

Självklart! Det är bara länkarna som går ut i datum :)

Länken är uppdaterad och det går nu att ladda ner exempeldatabasen.

Skriv en kommentar

Din epost-adress stannar hos oss.