Imports System.IO Imports System.Xml Imports System.Xml.Xsl Imports System.Text Namespace Framework Public Class Export ' For debugging purpose, this will have the Xsl file to remain on disk Public lRemoveTemporaryFile As Boolean = True Public oApp As Framework.App Private oProcess As Framework.LXProcess ' This is when we access the data provider in desktop and Web service mode Sub New(ByVal toApplication As Framework.App) oApp = toApplication End Sub ' This is when we access the data provider in a Web mode Public Sub New(ByVal toProcess As Framework.LXProcess) oProcess = toProcess oApp = oProcess.oApp End Sub ' Export a dataset into an Excel spreadsheet ' expO1 DataSet ' expC1 Full path of the file to save Public Function ExportToExcel(ByVal toDataSet As DataSet, ByVal tcFile As String) As Boolean Dim loDataXML As Framework.DataXML Dim lcFile As String = oApp.GenerateFileName() Dim loXml As Framework.XML Dim loXslCompiledTransform As Xsl.XslCompiledTransform = New Xsl.XslCompiledTransform ' Get the proper definition as per the current scope If oProcess Is Nothing Then loXml = New Framework.XML(oApp) loDataXML = New Framework.DataXML(oApp) Else loXml = New Framework.XML(oProcess) loDataXML = New Framework.DataXML(oProcess) End If ' Load the Xml If Not loXml.LoadXml(loDataXML.DataSetToXml(toDataSet)) Then Return False End If ' Normalize the Xml If Not loXml.Normalize() Then Return False End If ' Save in a Xml file If Not oApp.CreateFile(loXml.AddHeaderForFrenchCharacter() + loXml.cXml, _ oApp.cHttpFat + "Temp\" + lcFile + ".xml") Then Return False End If ' Save the Xsl file If Not oApp.CreateFile(GetXsl(), oApp.cHttpFat + "Temp\" + lcFile + ".xsl") Then Return False End If ' Load the Xsl in memory loXslCompiledTransform.Load(oApp.cHttpFat + "Temp\" + lcFile + ".xsl") ' Do the transformation Try loXslCompiledTransform.Transform(oApp.cHttpFat + "Temp\" + lcFile + ".xml", tcFile) Catch loError As Exception ' Get the proper definition as per the current scope If oProcess Is Nothing Then oApp.ErrorSetup(loError) Else oProcess.ErrorSetup(loError) End If Return False End Try ' If we remove the temporary file If lRemoveTemporaryFile Then ' Get the proper definition as per the current scope If oProcess Is Nothing Then oApp.DeleteFile(oApp.cHttpFat + "Temp\" + lcFile + ".xml") oApp.DeleteFile(oApp.cHttpFat + "Temp\" + lcFile + ".xsl") Else oProcess.DeleteFile(oApp.cHttpFat + "Temp\" + lcFile + ".xml") oProcess.DeleteFile(oApp.cHttpFat + "Temp\" + lcFile + ".xsl") End If End If Return True End Function ' Generate a generic Xsl string based on the dataset ' This one is generated in a way that the process of recognizing the field types is done ' with the Xsl itself. For a more complex algorithm, you may use GetXsl() Private Function GetXsl() As String Dim loStringBuilder As StringBuilder = New StringBuilder() loStringBuilder.Append("<xsl:stylesheet version=""1.0"" " + oApp.cCR) loStringBuilder.Append("xmlns=""urn:schemas-microsoft-com:office:spreadsheet"" " + oApp.cCR) loStringBuilder.Append("xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" " + oApp.cCR) loStringBuilder.Append("xmlns:msxsl=""urn:schemas-microsoft-com:xslt"" " + oApp.cCR) loStringBuilder.Append("xmlns:user=""urn:my-scripts"" " + oApp.cCR) loStringBuilder.Append("xmlns:o=""urn:schemas-microsoft-com:office:office"" " + oApp.cCR) loStringBuilder.Append("xmlns:x=""urn:schemas-microsoft-com:office:excel"" " + oApp.cCR) loStringBuilder.Append("xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet"" " + oApp.cCR) loStringBuilder.Append("xmlns:xs=""http://www.w3.org/2001/XMLSchema"">" + oApp.cCR) ' Workbook loStringBuilder.Append("<xsl:template match=""/"">" + oApp.cCR) loStringBuilder.Append("<Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet"" " + oApp.cCR) loStringBuilder.Append("xmlns:o=""urn:schemas-microsoft-com:office:office"" " + oApp.cCR) loStringBuilder.Append("xmlns:x=""urn:schemas-microsoft-com:office:excel"" " + oApp.cCR) loStringBuilder.Append("xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet"" " + oApp.cCR) loStringBuilder.Append("xmlns:html=""http://www.w3.org/TR/REC-html40"">" + oApp.cCR) loStringBuilder.Append("<xsl:apply-templates/>" + oApp.cCR) loStringBuilder.Append("</Workbook>" + oApp.cCR) loStringBuilder.Append("</xsl:template>" + oApp.cCR) ' Worksheet loStringBuilder.Append("<xsl:template match=""/*"">" + oApp.cCR) loStringBuilder.Append("<Worksheet>" + oApp.cCR) loStringBuilder.Append("<xsl:attribute name=""ss:Name"">" + oApp.cCR) loStringBuilder.Append("<xsl:value-of select=""local-name(/*/*)""/>" + oApp.cCR) loStringBuilder.Append("</xsl:attribute>" + oApp.cCR) loStringBuilder.Append("<Table x:FullColumns=""1"" x:FullRows=""1"">" + oApp.cCR) loStringBuilder.Append("<Row>" + oApp.cCR) loStringBuilder.Append("<xsl:for-each select=""/NewDataSet/Temp[position() = 1]/*"">" + oApp.cCR) loStringBuilder.Append("<Cell>" + oApp.cCR) loStringBuilder.Append("<Data ss:Type=""String"">" + oApp.cCR) loStringBuilder.Append("<xsl:value-of select=""local-name(current())""/>" + oApp.cCR) loStringBuilder.Append("</Data>" + oApp.cCR) loStringBuilder.Append("</Cell>" + oApp.cCR) loStringBuilder.Append("</xsl:for-each>" + oApp.cCR) loStringBuilder.Append("</Row>" + oApp.cCR) loStringBuilder.Append("<xsl:for-each select=""/NewDataSet/Temp"">" + oApp.cCR) loStringBuilder.Append("<xsl:call-template name=""ProcessDataRows"">" + oApp.cCR) loStringBuilder.Append("<xsl:with-param name=""tempElement"" select=""current()""/>" + oApp.cCR) loStringBuilder.Append("</xsl:call-template>" + oApp.cCR) loStringBuilder.Append("</xsl:for-each>" + oApp.cCR) loStringBuilder.Append("</Table>" + oApp.cCR) loStringBuilder.Append("</Worksheet>" + oApp.cCR) loStringBuilder.Append("</xsl:template>" + oApp.cCR) ' For each row loStringBuilder.Append("<xsl:template name=""ProcessDataRows"">" + oApp.cCR) loStringBuilder.Append("<xsl:param name=""tempElement"" />" + oApp.cCR) loStringBuilder.Append("<Row>" + oApp.cCR) loStringBuilder.Append("<xsl:for-each select=""$tempElement/*"">" + oApp.cCR) loStringBuilder.Append("<Cell>" + oApp.cCR) loStringBuilder.Append("<xsl:choose>" + oApp.cCR) loStringBuilder.Append("<xsl:when test=""//xs:element[ @name = local-name(current()) ]/@type = 'xs:decimal'"">" + oApp.cCR) loStringBuilder.Append("<Data ss:Type=""Number"">" + oApp.cCR) loStringBuilder.Append("<xsl:value-of select="".""/>" + oApp.cCR) loStringBuilder.Append("</Data>" + oApp.cCR) loStringBuilder.Append("</xsl:when>" + oApp.cCR) 'String loStringBuilder.Append("<xsl:when test=""//xs:element[ @name = local-name(current()) ]/@type = 'xs:string'"">" + oApp.cCR) loStringBuilder.Append("<Data ss:Type=""String"">" + oApp.cCR) loStringBuilder.Append("<xsl:value-of select="".""/>" + oApp.cCR) loStringBuilder.Append("</Data>" + oApp.cCR) loStringBuilder.Append("</xsl:when>" + oApp.cCR) ' Datetime loStringBuilder.Append("<xsl:when test=""//xs:element[ @name = local-name(current()) ]/@type = 'xs:dateTime'"">" + oApp.cCR) loStringBuilder.Append("<xsl:choose>" + oApp.cCR) loStringBuilder.Append("<xsl:when test="". = '1899-12-30T00:00:00-04:00'"">" + oApp.cCR) loStringBuilder.Append("<Data ss:Type=""String"">" + oApp.cCR) loStringBuilder.Append("</Data>" + oApp.cCR) loStringBuilder.Append("</xsl:when>" + oApp.cCR) loStringBuilder.Append("<xsl:otherwise>" + oApp.cCR) loStringBuilder.Append("<Data ss:Type=""String"">" + oApp.cCR) loStringBuilder.Append("<xsl:value-of select="".""/>" + oApp.cCR) loStringBuilder.Append("</Data>" + oApp.cCR) loStringBuilder.Append("</xsl:otherwise>" + oApp.cCR) loStringBuilder.Append("</xsl:choose>" + oApp.cCR) loStringBuilder.Append("</xsl:when>" + oApp.cCR) ' Integer loStringBuilder.Append("<xsl:when test=""//xs:element[ @name = local-name(current()) ]/@type = 'xs:int'"">" + oApp.cCR) loStringBuilder.Append("<Data ss:Type=""Number"">" + oApp.cCR) loStringBuilder.Append("<xsl:value-of select="".""/>" + oApp.cCR) loStringBuilder.Append("</Data>" + oApp.cCR) loStringBuilder.Append("</xsl:when>" + oApp.cCR) ' Boolean loStringBuilder.Append("<xsl:when test=""//xs:element[ @name = local-name(current()) ]/@type = 'xs:boolean'"">" + oApp.cCR) loStringBuilder.Append("<Data ss:Type=""String"">" + oApp.cCR) loStringBuilder.Append("<xsl:value-of select="".""/>" + oApp.cCR) loStringBuilder.Append("</Data>" + oApp.cCR) loStringBuilder.Append("</xsl:when>" + oApp.cCR) loStringBuilder.Append("<xsl:otherwise>" + oApp.cCR) loStringBuilder.Append("<Data ss:Type=""String"">" + oApp.cCR) loStringBuilder.Append("<xsl:value-of select="".""/>" + oApp.cCR) loStringBuilder.Append("</Data>" + oApp.cCR) loStringBuilder.Append("</xsl:otherwise>" + oApp.cCR) loStringBuilder.Append("</xsl:choose>" + oApp.cCR) loStringBuilder.Append("</Cell>" + oApp.cCR) loStringBuilder.Append("</xsl:for-each>" + oApp.cCR) loStringBuilder.Append("</Row>" + oApp.cCR) loStringBuilder.Append("</xsl:template>" + oApp.cCR) loStringBuilder.Append("</xsl:stylesheet>" + oApp.cCR) Return loStringBuilder.ToString() End Function End Class End Namespace