Click here to Skip to main content
Click here to Skip to main content

Generate Excel files without using Microsoft Excel

By , 22 Jun 2011
 

Introduction

Generating Excel files from web pages or other applications is a major subject in many articles. I'd like to present here a solution that does not require MS Excel to be installed on the target computer. This article shows how to create Microsoft Excel Binary Interchange File Format (BIFF) without using Microsoft Excel. BIFF is the native file format for Excel data, and can be viewed and modified in Microsoft Excel 97 or later.

Approaches and problems

The technique that is most frequently used to transfer data to an Excel workbooks is Automation. With Automation, you can call methods and properties that are specific to Excel tasks, but this solution has many drawbacks. Some of them are described in the Microsoft Knowledge Base. Additionally, you have to manage the lifetime of the temporary XLS files created on the server. Also, it is slow, because Excel runs in a separate process.

ExcelWriter class

The solution presented here is to write directly to a stream in Excel binary file format. For this purpose, I created very small C# class called ExcelWriter.

ExcelWriter class diagram
/// <summary>
/// Produces Excel file without using Excel
/// </summary>
public class ExcelWriter
{
    private Stream stream;
    private BinaryWriter writer;

    private ushort[] clBegin = { 0x0809, 8, 0, 0x10, 0, 0 };
    private ushort[] clEnd = { 0x0A, 00 };


    private void WriteUshortArray(ushort[] value)
    {
        for (int i = 0; i < value.Length; i++)
            writer.Write(value[i]);
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="ExcelWriter"/> class.
    /// </summary>
    /// <param name="stream">The stream.</param>
    public ExcelWriter(Stream stream)
    {
        this.stream = stream;
        writer = new BinaryWriter(stream);
    }

    /// <summary>
    /// Writes the text cell value.
    /// </summary>
    /// <param name="row">The row.</param>
    /// <param name="col">The col.</param>
    /// <param name="value">The string value.</param>
    public void WriteCell(int row, int col, string value)
    {
        ushort[] clData = { 0x0204, 0, 0, 0, 0, 0 };
        int iLen = value.Length;
        byte[] plainText = Encoding.ASCII.GetBytes(value);
        clData[1] = (ushort)(8 + iLen);
        clData[2] = (ushort)row;
        clData[3] = (ushort)col;
        clData[5] = (ushort)iLen;
        WriteUshortArray(clData);
        writer.Write(plainText);
    }

    /// <summary>
    /// Writes the integer cell value.
    /// </summary>
    /// <param name="row">The row number.</param>
    /// <param name="col">The column number.</param>
    /// <param name="value">The value.</param>
    public void WriteCell(int row, int col, int value)
    {
        ushort[] clData = { 0x027E, 10, 0, 0, 0 };
        clData[2] = (ushort)row;
        clData[3] = (ushort)col;
        WriteUshortArray(clData);
        int iValue = (value << 2) | 2;
        writer.Write(iValue);
    }

    /// <summary>
    /// Writes the double cell value.
    /// </summary>
    /// <param name="row">The row number.</param>
    /// <param name="col">The column number.</param>
    /// <param name="value">The value.</param>
    public void WriteCell(int row, int col, double value)
    {
        ushort[] clData = { 0x0203, 14, 0, 0, 0 };
        clData[2] = (ushort)row;
        clData[3] = (ushort)col;
        WriteUshortArray(clData);
        writer.Write(value);
    }

    /// <summary>
    /// Writes the empty cell.
    /// </summary>
    /// <param name="row">The row number.</param>
    /// <param name="col">The column number.</param>
    public void WriteCell(int row, int col)
    {
        ushort[] clData = { 0x0201, 6, 0, 0, 0x17 };
        clData[2] = (ushort)row;
        clData[3] = (ushort)col;
        WriteUshortArray(clData);
    }

    /// <summary>
    /// Must be called once for creating XLS file header
    /// </summary>
    public void BeginWrite()
    {
        WriteUshortArray(clBegin);
    }

    /// <summary>
    /// Ends the writing operation, but do not close the stream
    /// </summary>
    public void EndWrite()
    {
        WriteUshortArray(clEnd);
        writer.Flush();
    }
}

Using the code

The ExcelWriter sample is a console application that writes an XLS file to the name and location specified. The XLS file that is created is simply an empty spreadsheet. Then, you can start to write cell values by calling the WriteCell method with the row number, column number, and a cell value as parameters:

namespace XLSExportDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            FileStream stream = new FileStream("demo.xls", FileMode.OpenOrCreate);
            ExcelWriter writer = new ExcelWriter(stream);
            writer.BeginWrite();
            writer.WriteCell(0, 0, "ExcelWriter Demo");
            writer.WriteCell(1, 0, "int");
            writer.WriteCell(1, 1, 10);
            writer.WriteCell(2, 0, "double");
            writer.WriteCell(2, 1, 1.5);
            writer.WriteCell(3, 0, "empty");
            writer.WriteCell(3, 1);
            writer.EndWrite();
            stream.Close();
        }
    }
}

The picture below shows the final result of this sample:

The ExcelWriter class supports numeric and text values for the cells, and can be used for exporting data from the database to an XLS file, or for producing an XLS stream from a website on the fly.

I hope this article gives you a head start in working with Excel files from .NET and C#.

History

  • 03 March 2009 - Initial submission.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Serhiy Perevoznyk
Architect
Belgium Belgium
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Generalvery cool stuff PinmemberJerry139 May '13 - 2:31 
QuestionI can't open the generated XLS file through Excel 2010 PinmemberJosen.L.Zhang9 Apr '13 - 0:03 
GeneralMy vote of 5 PinmemberDineshMaind5 Mar '13 - 6:01 
QuestionPlease add Border Style at next upgrade Pinmemberphong104057224 Jan '13 - 16:29 
SuggestionColumn Width AutoFit? Pinmvpadriancs9 Jan '13 - 14:46 
SuggestionCode Patch, Write DataTable [modified] Pinmvpadriancs9 Jan '13 - 14:01 
QuestionIs it possible to Write stream to respose headers instead of a demo.xls file? Pinmembershabari713 Dec '12 - 0:25 
Is it possible to Write stream to respose headers instead of a demo.xls file?So, that an Open/save dialog would pop up
QuestionMore feature rich alternative PinmemberAndrew Kirillov11 Nov '12 - 22:30 
QuestionMultiple Sheets PinmemberMember 810781128 Oct '12 - 16:09 
Questionlimited to 255 chars per cell. how we can increase the limit ..? Pinmemberaisoft19 Oct '12 - 5:50 
QuestionGenerating Excel Pinmembernirajzambad7 Aug '12 - 3:03 
GeneralMy vote of 5 PinmemberHuỳnh Hữu Ân24 Jul '12 - 18:06 
QuestionThe generated xls file could not be read by OLEDB Pinmemberdaiwuju4 Jul '12 - 22:57 
QuestionA minor problem in Chinese Font Pinmemberdaiwuju29 Jun '12 - 19:05 
QuestionMere cells Pinmemberdaniloao31 May '12 - 13:50 
QuestionBorders PinmemberMember 901259929 May '12 - 6:49 
QuestionMore Than one WorkSheet Pinmemberhichamveo24 May '12 - 6:57 
QuestionGreat work!! PinmemberCurtCobrain7 Apr '12 - 4:57 
GeneralMy vote of 5 PinmemberMikhail Tsennykh (devnoob)19 Mar '12 - 8:50 
QuestionCreating .XLSX file Pinmemberbhavtosh.sharma2 Mar '12 - 0:57 
QuestionProtected View Pinmemberccchg9 Feb '12 - 0:22 
QuestionSpecial characters are not coming Pinmemberiliyash11 Jan '12 - 4:37 
Questionprint PinmemberMember 85283912 Jan '12 - 10:17 
QuestionI get an Office File Validation warning PinmemberLeo Muller19 Dec '11 - 20:27 
GeneralMy vote of 5 PinmemberMember 366623525 Nov '11 - 0:10 
QuestionHO TO MERGE COLUMS AND ROWS Pinmembersheriefes11 Nov '11 - 0:08 
Questioninsert image PinmemberJorge Teodoro1 Nov '11 - 9:08 
QuestionExcel file gives error on opening Pinmembershubhamalhotra17 Oct '11 - 3:18 
Questionwarrior!that would be perfect if ExcelReader.cs and ExcelSheet is adding to the file Pinmemberbatsword13 Sep '11 - 16:31 
QuestionMy vote of 5 PinmemberFilip D'haene9 Sep '11 - 5:58 
QuestionAdding new work sheet would be a great feature in the next version PinmemberNikolay Dovgaluk1 Aug '11 - 4:06 
QuestionHow to create 2nd Excel sheet using your method? PinmemberMember 399944929 Jul '11 - 18:50 
QuestionVery Easy Pinmembertexgfalco30 Jun '11 - 13:32 
GeneralMy vote of 5 PinmemberJamal Alqabandi27 Jun '11 - 23:59 
Questionnoob PinmemberBarbo23 Jun '11 - 3:29 
GeneralMy vote of 5 PinmemberOmar Gamil22 Jun '11 - 21:38 
GeneralAlternative way to create Excel files without the need of Excel beeing installed [modified] Pinmemberaron.sinoai16 Jun '11 - 12:02 
GeneralHow to do CELL Format PinmemberMember 390017225 May '11 - 20:55 
GeneralHow can we format a cell like make it bold or give a background color using your write cell function? PinmemberSamar pratap28 Apr '11 - 8:01 
GeneralCodepage problems PinmemberTiMiNOd9 Apr '11 - 2:32 
GeneralNice PinmemberCikaPero28 Mar '11 - 23:57 
GeneralMy vote of 5 PinmemberJesper Bihrmann2 Feb '11 - 3:05 
GeneralI didn't open excel file was generated by your code PinmemberHelen.Yu14 Jan '11 - 13:40 
QuestionHow to write a Cell with DateTime format? PinmemberMark Carranza12 Jan '11 - 19:59 
GeneralMy vote of 4 Pinmembercimsunf29 Nov '10 - 4:23 
GeneralMy vote of 4 Pinmemberrlejason28 Nov '10 - 20:42 
GeneralNPOI.codeplex.com .NET library (open source) could be considered as alternative, has more and source code PinmemberAlexandreN12 Nov '10 - 8:03 
GeneralSuggested change to code sample Pinmembersdesciencelover9 Nov '10 - 4:30 
GeneralMy vote of 4 Pinmembersdesciencelover9 Nov '10 - 4:26 
GeneralAdding Formulas Pinmembertwehr9 Nov '10 - 3:45 

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

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130523.1 | Last Updated 22 Jun 2011
Article Copyright 2009 by Serhiy Perevoznyk
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid