C# ExcelWriter class
This sample demonstrates how to create a file using the Microsoft Excel Binary Interchange File Format (BIFF). In other words it shows how to produce Excel files from your application directly without using Excel. It can be useful when you are not sure if your customer has Excel installed.
Download XLSExportDemo.zip
// C# ExcelWriter class v1.0
// by Serhiy Perevoznyk, 2008
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace XLSExportDemo
{
/// <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();
}
}
}
Download XLSExportDemo.zip
I have a probleme to insert long text. The cell is empty.
ReplyDeleteCan you help me ?
thanks
How long is your text?
ReplyDeleteGreat job, I need create a file with two worksheets.
ReplyDeleteCan you help me?
This class can create only files with one worksheet, but I can recommend you another freeware library: http://code.google.com/p/excellibrary
ReplyDeleteI received few times the question about inserting the long text into one cell.
ReplyDeleteOK, with this library the max. size of the text is 255 characters as it uses old and simple BIFF format for storing the file.
Also I am not sure what the practical usage of writing 4000 characters in one cell?
This format does not support 2 worksheets. It can do only what it can do. If something is not implemented in this library - it will be not implemented in the future as well. So if you need long strings, colors, formatting, worksheets, etc... - this library is not for you.
ReplyDeleteThere are many big and powerful libraries that can do all the things you needed. Some of them are free.
The main purpose of ExcelWriter to make it "small and simple" and I want to keep it this way
I need to append to an existing excel, this class overwrite all and let only de last element. Can you help me?
ReplyDeleteMy e-mail is wefaamigo@hotmail.com
As you see the name of the class is "ExcelWriter", so it's designed for writing files, not reading. In case if you have to read one, you can easy find a lot of freeware alternatives, on sourceforge, for example
ReplyDeleteGood One. But opening the file in office 2007 and saving it back throws an error saying "it cannot be saved in the current format. Click OK to save in the latest format". Are we missing something in the header, I mean BOF.
ReplyDeleteIf I try to use in a cell a formula like "=a1+a2" then I don't get the result in Excel but the exact text I meant as a formula. How can I tell to the cell to calculate that? Thanks.
ReplyDeleteThis class does not support formulas, sorry. If you need it you have to find a more advanced exel generator (there are plenty of freeware libraries for it)
ReplyDeleteBig thanks to you. Does this code support unicode characters while writing it in excel file? I have seen that your code uses default encoding and some places ASCII and I have replaced that with UTF-8 but still it doesn't write unicode characters in excel file. any thoughts on that?
ReplyDeleteCheck the second part of my article: http://delphi32.blogspot.com/2011/06/generate-excel-files-without-using.html
ReplyDeleteThere is updated code available
Hi,
ReplyDeleteOn my ASP.Net Production Server, there is no MS-Office but for working with Excel (Like Reading and Exporting textual Table) we have installed AccessDatabaseEngine_x64.exe .
Now While Exporting textual Table we also want to export dynamic image formed by MS-Chart on .aspx page.
Paralelly we can not use Microsoft.Office.Interop.Excel.dll as we do not have installed MS-Office on Production Server.
So how we can export such type of dynamic MS-Chart image with data only in Excel ?
Thanks in Advance
Rajesh Singh