<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>open xml</title>
        <link>http://www.onteorasoftware.com/category/23.aspx</link>
        <description>open xml</description>
        <language>en-US</language>
        <copyright>Ken Tucker</copyright>
        <generator>Subtext Version 2.1.2.2</generator>
        <item>
            <title>Using the ExcelPackage class on a web page</title>
            <link>http://blog.onteorasoftware.net/archive/2007/12/17/using-the-excelpackage-class-on-a-web-page.aspx</link>
            <description>&lt;p&gt;
Dr. John Tunicliffe wrote a nice class for creating excel 2007 spreadsheets and was nice enough to post his work on the codeplex web site.  
&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.codeplex.com/ExcelPackage" title="http://www.codeplex.com/ExcelPackage"&gt;http://www.codeplex.com/ExcelPackage&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;
I was looking to use the ExcelPackage to create a spreadsheet on a website with out having to save the spreadsheet on the server first.  Well to do this we are going to have to modify the ExcelPackage class to have an constructor which accepts a stream.  After you download the ExcelPackage class from codeplex add the following code to ExcelPackage.cs contructors region. 
&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;
        #region ExcelPackage Constructors&lt;br /&gt;
        /// &amp;lt;summary&amp;gt;&lt;br /&gt;
        /// Creates a new instance of the ExcelPackage class based on a stream. &lt;br /&gt;
        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
        /// &amp;lt;param name="stream"&amp;gt;Creates a new ExcelPackage from a stream&amp;lt;/param&amp;gt;&lt;br /&gt;
        public ExcelPackage(Stream stream)&lt;br /&gt;
        {&lt;br /&gt;
            _package = Package.Open(stream, FileMode.OpenOrCreate);&lt;br /&gt;
            // save a temporary part to create the default application/xml content type&lt;br /&gt;
            Uri uriDefaultContentType = new Uri("/default.xml", UriKind.Relative);&lt;br /&gt;
            PackagePart partTemp = _package.CreatePart(uriDefaultContentType, "application/xml"); 
&lt;/p&gt;
&lt;p&gt;
            XmlDocument workbook = Workbook.WorkbookXml; // this will create the workbook xml in the package 
&lt;/p&gt;
&lt;p&gt;
            // create the relationship to the main part&lt;br /&gt;
            _package.CreateRelationship(Workbook.WorkbookUri, TargetMode.Internal, schemaRelationships + "/officeDocument"); 
&lt;/p&gt;
&lt;p&gt;
            // remove the temporary part that created the default xml content type&lt;br /&gt;
            _package.DeletePart(uriDefaultContentType);&lt;br /&gt;
        } 
&lt;/p&gt;
&lt;p&gt;
Once you compile the class we can add it as a reference to a website which targets the .Net framework 3.0 or 3.5. 
&lt;/p&gt;
&lt;p&gt;
So to write a spreadsheet to webpage we need to first create a MemoryStream to save the spreadsheet to.  I use a MemoryStream because the Response.OutputStream will give you an error about the FileMode or FileAccess type not being valid for this stream. Once we write the spreadsheet to the MemoryStream  set the Response's ContextType. Then we can write the MemoryStream to the webpage. 
&lt;/p&gt;
&lt;p&gt;
Imports OfficeOpenXml &lt;br /&gt;
Imports System.IO 
&lt;/p&gt;
&lt;p&gt;
Partial Public Class _Default&lt;br /&gt;
    Inherits System.Web.UI.Page 
&lt;/p&gt;
&lt;p&gt;
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load&lt;br /&gt;
        Dim ms As New MemoryStream 
&lt;/p&gt;
&lt;p&gt;
        Using pack As New ExcelPackage(ms)&lt;br /&gt;
            Dim ws As ExcelWorksheet = pack.Workbook.Worksheets.Add("Sheet1")&lt;br /&gt;
            ws.Cell(1, 1).Value = "Product Name"&lt;br /&gt;
            ws.Column(1).Width = 30&lt;br /&gt;
            ws.Cell(1, 2).Value = "Price"&lt;br /&gt;
            ws.Column(2).Width = 10 
&lt;/p&gt;
&lt;p&gt;
            For r As Integer = 0 To 9&lt;br /&gt;
                ws.Cell(r + 2, 1).Value = "Product " &amp;amp; r.ToString&lt;br /&gt;
                ws.Cell(r + 2, 2).Value = r.ToString()&lt;br /&gt;
            Next 
&lt;/p&gt;
&lt;p&gt;
            pack.Workbook.Properties.Author = "Ken Tucker"&lt;br /&gt;
            pack.Workbook.Properties.Title = "Create spreadsheet from web"&lt;br /&gt;
            pack.Save()&lt;br /&gt;
        End Using&lt;br /&gt;
        Response.ContentType = "application/vnd.openxmlformats"&lt;br /&gt;
        Response.AddHeader("Content-Disposition", "attachment; filename= Data.xlsx;")&lt;br /&gt;
        Response.OutputStream.Write(ms.GetBuffer, 0, CInt(ms.Length))&lt;br /&gt;
        Response.Flush()&lt;br /&gt;
        Response.Close()&lt;br /&gt;
        Response.End() 
&lt;/p&gt;
&lt;p&gt;
    End Sub 
&lt;/p&gt;
&lt;p&gt;
End Class 
&lt;/p&gt;
&lt;p&gt;
Hope this helps 
&lt;/p&gt;
&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.onteorasoftware.net%2fpost%2fUsing-the-ExcelPackage-class-on-a-web-page.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.onteorasoftware.net%2fpost%2fUsing-the-ExcelPackage-class-on-a-web-page.aspx" border="0" alt="kick it on DotNetKicks.com" width="164" height="30" /&gt;&lt;/a&gt; 
&lt;img src="http://blog.onteorasoftware.net/aggbug/38.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ken Tucker</dc:creator>
            <guid>http://blog.onteorasoftware.net/archive/2007/12/17/using-the-excelpackage-class-on-a-web-page.aspx</guid>
            <pubDate>Mon, 17 Dec 2007 08:17:27 GMT</pubDate>
            <wfw:comment>http://blog.onteorasoftware.net/comments/38.aspx</wfw:comment>
            <comments>http://blog.onteorasoftware.net/archive/2007/12/17/using-the-excelpackage-class-on-a-web-page.aspx#feedback</comments>
            <slash:comments>11</slash:comments>
            <wfw:commentRss>http://blog.onteorasoftware.net/comments/commentRss/38.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Using Linq to XML to create an excel spreadsheet</title>
            <link>http://blog.onteorasoftware.net/archive/2007/11/24/using-linq-to-xml-to-create-an-excel-spreadsheet.aspx</link>
            <description>&lt;p&gt;
For this example we are going to create a Excel 2007 spreadsheet using the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=AD0B72FB-4A1D-4C52-BDB5-7DD7E816D046&amp;amp;displaylang=en"&gt;Microsoft OpenXml Sdk&lt;/a&gt; and Linq to XML. 
&lt;/p&gt;
&lt;p&gt;
To start with lets create a new Windows forms app which targets the .Net Framework 3.5.  Add a Linq to Sql design surface to your project and name it Northwind and drag the Northwind Products table on to the surface.  On the windows form I added a DataGridview to display the data we are going to export to excel.  We also need a button named btnExport on the form. 
&lt;/p&gt;
&lt;p&gt;
To create a excel spreadsheet we need to use the openxml sdk to create a spreadsheet document, workbook, worksheet, and a string table.  
&lt;/p&gt;
&lt;p&gt;
       Using doc = SpreadsheetDocument.Create("Export.xlsx", SpreadsheetDocumentType.Workbook)&lt;br /&gt;
            Dim workbook = doc.AddWorkbookPart&lt;br /&gt;
            Dim stringTable = workbook.AddNewPart(Of SharedStringTablePart)()&lt;br /&gt;
            Dim worksheet = workbook.AddNewPart(Of WorksheetPart)() 
&lt;/p&gt;
&lt;p&gt;
The worksheet, workbook, and string table are xml documents contained inside a package.  Before we get to far we need to import a few xml namespaces 
&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;
Imports &amp;lt;xmlns="&lt;a href="http://schemas.openxmlformats.org/spreadsheetml/2006/main&amp;quot;"&gt;http://schemas.openxmlformats.org/spreadsheetml/2006/main"&lt;/a&gt;&amp;gt;&lt;br /&gt;
Imports &amp;lt;xmlns:r="&lt;a href="http://schemas.openxmlformats.org/officeDocument/2006/relationships&amp;quot;"&gt;http://schemas.openxmlformats.org/officeDocument/2006/relationships"&lt;/a&gt;&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;
Now that we imported the name space we can use some of the new xml features in VB 2008 to create the xml documents.  Since we are not using a string table we just need a blank xml file 
&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;
Dim xmlStringTable = &amp;lt;sst&amp;gt;&amp;lt;/sst&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
The workbook xml needs to relate the spreadsheet with its id 
&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;
           Dim xmlWorkbook = &amp;lt;workbook&amp;gt;&lt;br /&gt;
                                  &amp;lt;sheets&amp;gt;&lt;br /&gt;
                                      &amp;lt;sheet name="Exported" sheetId="1" r:id=&amp;lt;%= sheetId %&amp;gt;&amp;gt;&amp;lt;/sheet&amp;gt;&lt;br /&gt;
                                  &amp;lt;/sheets&amp;gt;&lt;br /&gt;
                              &amp;lt;/workbook&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
Note the &amp;lt;%= sheetId %&amp;gt; allows you to get data from a variable 
&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;
Finally we need to create the worksheet.  In the worksheet we set the column widths and use a linq query to populate the data. 
&lt;/p&gt;
&lt;p&gt;
            Dim xmlWorkSheet = &amp;lt;worksheet&amp;gt;&lt;br /&gt;
                                   &amp;lt;sheetFormatPr defaultRowHeight="15"/&amp;gt;&lt;br /&gt;
                                   &amp;lt;cols&amp;gt;&lt;br /&gt;
                                       &amp;lt;col min="1" max="1" width="30" bestFit="1" customWidth="1"/&amp;gt;&lt;br /&gt;
                                       &amp;lt;col min="2" max="2" width="10" bestFit="1" customWidth="1"/&amp;gt;&lt;br /&gt;
                                   &amp;lt;/cols&amp;gt;&lt;br /&gt;
                                   &amp;lt;sheetData&amp;gt;&lt;br /&gt;
                                       &amp;lt;row&amp;gt;&lt;br /&gt;
                                           &amp;lt;c t="inlineStr"&amp;gt;&lt;br /&gt;
                                               &amp;lt;is&amp;gt;&lt;br /&gt;
                                                   &amp;lt;t&amp;gt;Product Name&amp;lt;/t&amp;gt;&lt;br /&gt;
                                               &amp;lt;/is&amp;gt;&lt;br /&gt;
                                           &amp;lt;/c&amp;gt;&lt;br /&gt;
                                           &amp;lt;c t="inlineStr"&amp;gt;&lt;br /&gt;
                                               &amp;lt;is&amp;gt;&lt;br /&gt;
                                                   &amp;lt;t&amp;gt;Unit Price&amp;lt;/t&amp;gt;&lt;br /&gt;
                                               &amp;lt;/is&amp;gt;&lt;br /&gt;
                                           &amp;lt;/c&amp;gt;&lt;br /&gt;
                                       &amp;lt;/row&amp;gt;&lt;br /&gt;
                                       &amp;lt;%= From p In db.Products Select _&lt;br /&gt;
                                           &amp;lt;row&amp;gt;&lt;br /&gt;
                                               &amp;lt;c t="inlineStr"&amp;gt;&lt;br /&gt;
                                                   &amp;lt;is&amp;gt;&lt;br /&gt;
                                                       &amp;lt;t&amp;gt;&amp;lt;%= p.ProductName %&amp;gt;&amp;lt;/t&amp;gt;&lt;br /&gt;
                                                   &amp;lt;/is&amp;gt;&lt;br /&gt;
                                               &amp;lt;/c&amp;gt;&lt;br /&gt;
                                               &amp;lt;c&amp;gt;&lt;br /&gt;
                                                   &amp;lt;v&amp;gt;&amp;lt;%= p.UnitPrice %&amp;gt;&amp;lt;/v&amp;gt;&lt;br /&gt;
                                               &amp;lt;/c&amp;gt;&lt;br /&gt;
                                           &amp;lt;/row&amp;gt; %&amp;gt;&lt;br /&gt;
                                   &amp;lt;/sheetData&amp;gt;&lt;br /&gt;
                               &amp;lt;/worksheet&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;
Here is the function for writing the xml to the file 
&lt;/p&gt;
&lt;p&gt;
   Sub WriteXmlToPart(ByVal part As OpenXmlPart, ByVal x As XElement)&lt;br /&gt;
        Dim fs As New IO.StreamWriter(part.GetStream, New System.Text.UTF8Encoding) 
&lt;/p&gt;
&lt;p&gt;
        Dim xmlWriter As New Xml.XmlTextWriter(part.GetStream, New UTF8Encoding)&lt;br /&gt;
        xmlWriter.Formatting = Xml.Formatting.Indented&lt;br /&gt;
        Dim enc As New UTF8Encoding 
&lt;/p&gt;
&lt;p&gt;
        xmlWriter.WriteStartDocument()&lt;br /&gt;
        x.WriteTo(xmlWriter)&lt;br /&gt;
        xmlWriter.WriteEndDocument()&lt;br /&gt;
        xmlWriter.Flush()&lt;br /&gt;
        xmlWriter.Close()&lt;br /&gt;
    End Sub 
&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;
Here is the complete listing for program 
&lt;/p&gt;
&lt;p&gt;
 
&lt;/p&gt;
&lt;p&gt;
Imports Microsoft.Office.DocumentFormat.OpenXml.Packaging&lt;br /&gt;
Imports System.Text&lt;br /&gt;
Imports &amp;lt;xmlns="&lt;a href="http://schemas.openxmlformats.org/spreadsheetml/2006/main&amp;quot;"&gt;http://schemas.openxmlformats.org/spreadsheetml/2006/main"&lt;/a&gt;&amp;gt;&lt;br /&gt;
Imports &amp;lt;xmlns:r="&lt;a href="http://schemas.openxmlformats.org/officeDocument/2006/relationships&amp;quot;"&gt;http://schemas.openxmlformats.org/officeDocument/2006/relationships"&lt;/a&gt;&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
Public Class Form1&lt;br /&gt;
    Dim bs As New BindingSource&lt;br /&gt;
    Dim db As New NorthwindDataContext 
&lt;/p&gt;
&lt;p&gt;
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load&lt;br /&gt;
        bs.DataSource = From p In db.Products _&lt;br /&gt;
                        Select p.ProductName, p.UnitPrice 
&lt;/p&gt;
&lt;p&gt;
        DataGridView1.DataSource = bs&lt;br /&gt;
    End Sub 
&lt;/p&gt;
&lt;p&gt;
    Private Sub btnExport_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExport.Click&lt;br /&gt;
        Using doc = SpreadsheetDocument.Create("Export.xlsx", SpreadsheetDocumentType.Workbook)&lt;br /&gt;
            Dim workbook = doc.AddWorkbookPart&lt;br /&gt;
            Dim stringTable = workbook.AddNewPart(Of SharedStringTablePart)()&lt;br /&gt;
            Dim worksheet = workbook.AddNewPart(Of WorksheetPart)()&lt;br /&gt;
            Dim sheetId = workbook.GetIdOfPart(worksheet) 
&lt;/p&gt;
&lt;p&gt;
            'create the string table &lt;br /&gt;
            Dim xmlStringTable = &amp;lt;sst&amp;gt;&amp;lt;/sst&amp;gt;&lt;br /&gt;
            WriteXmlToPart(stringTable, xmlStringTable) 
&lt;/p&gt;
&lt;p&gt;
            'create the workbook&lt;br /&gt;
            Dim xmlWorkbook = &amp;lt;workbook&amp;gt;&lt;br /&gt;
                                  &amp;lt;sheets&amp;gt;&lt;br /&gt;
                                      &amp;lt;sheet name="Exported" sheetId="1" r:id=&amp;lt;%= sheetId %&amp;gt;&amp;gt;&amp;lt;/sheet&amp;gt;&lt;br /&gt;
                                  &amp;lt;/sheets&amp;gt;&lt;br /&gt;
                              &amp;lt;/workbook&amp;gt;&lt;br /&gt;
            WriteXmlToPart(workbook, xmlWorkbook) 
&lt;/p&gt;
&lt;p&gt;
            'create the spreadsheet&lt;br /&gt;
            Dim xmlWorkSheet = &amp;lt;worksheet&amp;gt;&lt;br /&gt;
                                   &amp;lt;sheetFormatPr defaultRowHeight="15"/&amp;gt;&lt;br /&gt;
                                   &amp;lt;cols&amp;gt;&lt;br /&gt;
                                       &amp;lt;col min="1" max="1" width="30" bestFit="1" customWidth="1"/&amp;gt;&lt;br /&gt;
                                       &amp;lt;col min="2" max="2" width="10" bestFit="1" customWidth="1"/&amp;gt;&lt;br /&gt;
                                   &amp;lt;/cols&amp;gt;&lt;br /&gt;
                                   &amp;lt;sheetData&amp;gt;&lt;br /&gt;
                                       &amp;lt;row&amp;gt;&lt;br /&gt;
                                           &amp;lt;c t="inlineStr"&amp;gt;&lt;br /&gt;
                                               &amp;lt;is&amp;gt;&lt;br /&gt;
                                                   &amp;lt;t&amp;gt;Product Name&amp;lt;/t&amp;gt;&lt;br /&gt;
                                               &amp;lt;/is&amp;gt;&lt;br /&gt;
                                           &amp;lt;/c&amp;gt;&lt;br /&gt;
                                           &amp;lt;c t="inlineStr"&amp;gt;&lt;br /&gt;
                                               &amp;lt;is&amp;gt;&lt;br /&gt;
                                                   &amp;lt;t&amp;gt;Unit Price&amp;lt;/t&amp;gt;&lt;br /&gt;
                                               &amp;lt;/is&amp;gt;&lt;br /&gt;
                                           &amp;lt;/c&amp;gt;&lt;br /&gt;
                                       &amp;lt;/row&amp;gt;&lt;br /&gt;
                                       &amp;lt;%= From p In db.Products Select _&lt;br /&gt;
                                           &amp;lt;row&amp;gt;&lt;br /&gt;
                                               &amp;lt;c t="inlineStr"&amp;gt;&lt;br /&gt;
                                                   &amp;lt;is&amp;gt;&lt;br /&gt;
                                                       &amp;lt;t&amp;gt;&amp;lt;%= p.ProductName %&amp;gt;&amp;lt;/t&amp;gt;&lt;br /&gt;
                                                   &amp;lt;/is&amp;gt;&lt;br /&gt;
                                               &amp;lt;/c&amp;gt;&lt;br /&gt;
                                               &amp;lt;c&amp;gt;&lt;br /&gt;
                                                   &amp;lt;v&amp;gt;&amp;lt;%= p.UnitPrice %&amp;gt;&amp;lt;/v&amp;gt;&lt;br /&gt;
                                               &amp;lt;/c&amp;gt;&lt;br /&gt;
                                           &amp;lt;/row&amp;gt; %&amp;gt;&lt;br /&gt;
                                   &amp;lt;/sheetData&amp;gt;&lt;br /&gt;
                               &amp;lt;/worksheet&amp;gt; 
&lt;/p&gt;
&lt;p&gt;
            WriteXmlToPart(worksheet, xmlWorkSheet) 
&lt;/p&gt;
&lt;p&gt;
        End Using&lt;br /&gt;
    End Sub 
&lt;/p&gt;
&lt;p&gt;
    Sub WriteXmlToPart(ByVal part As OpenXmlPart, ByVal x As XElement)&lt;br /&gt;
        Dim fs As New IO.StreamWriter(part.GetStream, New System.Text.UTF8Encoding) 
&lt;/p&gt;
&lt;p&gt;
        Dim xmlWriter As New Xml.XmlTextWriter(part.GetStream, New UTF8Encoding)&lt;br /&gt;
        xmlWriter.Formatting = Xml.Formatting.Indented&lt;br /&gt;
        Dim enc As New UTF8Encoding 
&lt;/p&gt;
&lt;p&gt;
        xmlWriter.WriteStartDocument()&lt;br /&gt;
        x.WriteTo(xmlWriter)&lt;br /&gt;
        xmlWriter.WriteEndDocument()&lt;br /&gt;
        xmlWriter.Flush()&lt;br /&gt;
        xmlWriter.Close()&lt;br /&gt;
    End Sub 
&lt;/p&gt;
&lt;p&gt;
End Class 
&lt;/p&gt;
&lt;br /&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fwww.onteorasoftware.net%2fpost%2fUsing-Linq-to-XML-to-create-an-excel-spreadsheet.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fwww.onteorasoftware.net%2fpost%2fUsing-Linq-to-XML-to-create-an-excel-spreadsheet.aspx" border="0" alt="kick it on DotNetKicks.com" width="82" height="18" /&gt;&lt;/a&gt;
&lt;img src="http://blog.onteorasoftware.net/aggbug/45.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Ken Tucker</dc:creator>
            <guid>http://blog.onteorasoftware.net/archive/2007/11/24/using-linq-to-xml-to-create-an-excel-spreadsheet.aspx</guid>
            <pubDate>Sat, 24 Nov 2007 21:34:56 GMT</pubDate>
            <wfw:comment>http://blog.onteorasoftware.net/comments/45.aspx</wfw:comment>
            <comments>http://blog.onteorasoftware.net/archive/2007/11/24/using-linq-to-xml-to-create-an-excel-spreadsheet.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blog.onteorasoftware.net/comments/commentRss/45.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>