Click here to Skip to main content
11,648,094 members (66,112 online)
Click here to Skip to main content

DataTable to Excel

, 15 Apr 2007 MIT 273.2K 7.4K 107
Rate this:
Please Sign up or sign in to vote.
A quick and easy way to format and export a DataTable to an Excel spreadsheet


A common task I've run across is the need to export a DataTableto an Excel spreadsheet. It's a great way to distribute reports, etc. to users. It also seems like an obvious translation, considering the way that DataSets are usually presented in DataGridcontrols.

Unfortunately, the methods I have found so far for doing this have been rather ugly - they involve iterating through the DataTableitems and manually writing to the output file, line-by-line, in the correct format. Then, in a stroke of luck, I was assigned a simple ASP.NET project at work (I normally work in Windows Forms), and while working on that, I found a very simple way of accomplishing this task, with the added bonus of being able to easily format the output spreadsheet.

Using the code

The basic trick is that Excel can open HTML tables, so the idea is to create a DataGridweb control (which you can use whether or not your project is in ASP.NET), use databinding to fill the control with information from your DataSet, set any formatting (bolded text, background colors, etc), then have the DataGridrender itself to an output file with Excel's ".XLS" extension.

Please note that you need to add a reference to "System.Web" in your project in order to use the System.Web.UI.WebControls namespace!

Here is an example. I am using a DataSetnamed "data" containing a Tablenamed "Stats":

// create the DataGrid and perform the databinding
System.Web.UI.WebControls.DataGrid grid = 
            new System.Web.UI.WebControls.DataGrid();
grid.HeaderStyle.Font.Bold = true;
grid.DataSource = data;
grid.DataMember = data.Stats.TableName;


// render the DataGrid control to a file
using(StreamWriter sw = new StreamWriter("c:\\test.xls"))
    using(HtmlTextWriter hw = new HtmlTextWriter(sw))

If you then open the output file in a text editor, you will see that it just contains simple HTML.

Points of Interest

As someone who works mostly with Windows Forms, some of the above code seems non-obvious. Here are some important differences I found between the regular Windows Forms controls and the Web controls:

  • Databinding with Web controls must be performed manually! You set the DataSourceand DataMemberproperties as usual, but the databinding will not occur until you make the "DataBind()" call yourself.
  • Rendering the control requires two output streams: one is the HtmlTextWriter, which is what the Web grid can render itself to, and the second is the StreamWriter, which the HtmlTextWriterwrites itself to. Compare this to a normal ASP.NET webpage, where instead of using a StreamWriterto write to a file, the HtmlTextWriterwould probably write to a web page in memory.

Finally, a word of warning - once the user has opened the file in Excel and saved changes to it, the file will no longer contain a simple HTML table as Excel will rewrite it with its own file format.


This article, along with any associated source code and files, is licensed under The MIT License


About the Author

Jacob Klint
Software Developer
United States United States
No Biography provided

You may also be interested in...

Comments and Discussions

General5 from me, too Pin
Scott Bruno27-Jun-08 9:12
memberScott Bruno27-Jun-08 9:12 
Clever use of existing stuff.

The people crying about this article should take a deep breath and consider that sometimes you just need to dump a simple table to xls. And given that the final product is in fact a table dumped to xls, I'm gonna' have to go ahead and say it works just fine.

Saving the world, one line of code at a time

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.150804.4 | Last Updated 15 Apr 2007
Article Copyright 2007 by Jacob Klint
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid