Write Date value in ExcelWriter
People asking me how to insert the date value into Excel coulmn, but as a date, not just as a text in my C# ExcelWriter class.
I extended this class and added 2 additional methods:
and example of usage:
I extended this class and added 2 additional methods:
- public void WriteFormat(string value)
- public void WriteCell(int row, int col, DateTime value, int formatIndex)
// C# ExcelWriter class v1.1
// by Serhiy Perevoznyk, 2008-2009
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 date format.
/// </summary>
/// <param name="value">The date format value.</param>
public void WriteFormat(string value)
{
ushort[] clData = { 0x001E, 0 };
byte[] plainText = Encoding.ASCII.GetBytes(value);
int iLen = plainText.Length;
clData[1] = (ushort)(1 + iLen);
WriteUshortArray(clData);
writer.Write((byte)iLen);
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 cell.
/// </summary>
/// <param name="row">The row.</param>
/// <param name="col">The col.</param>
/// <param name="value">The value.</param>
/// <param name="formatIndex">Index of the date format.</param>
public void WriteCell(int row, int col, DateTime value, int formatIndex)
{
DateTime baseDate = new DateTime(1899, 12, 31);
TimeSpan ts = value - baseDate;
ushort days = (ushort)(ts.Days + 1);
ushort[] clData = { 0x0002, 09, 0, 0};
clData[2] = (ushort)row;
clData[3] = (ushort)col;
WriteUshortArray(clData);
writer.Write((byte)0x0);
byte indexValue = (byte)(formatIndex & 0x3F);
writer.Write((byte)indexValue);
writer.Write((byte)0x0);
writer.Write(days);
}
/// <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();
}
}
}
and example of usage:
// This sample demonstrates how to create a file using the Microsoft Excel
// Binary Interchange File Format (BIFF).
// If this program works, it was written by Serhiy Perevoznyk.
// If not, I don't know who wrote it.
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
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.WriteFormat(@"dd\-mm\-yyyy"); //index 0
writer.WriteFormat(@"dd/mm/yyyy");
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, "date");
writer.WriteCell(3, 1, DateTime.Now, 1);
writer.EndWrite();
stream.Close();
}
}
}
Hi, where can i find documentation for excel file format?
ReplyDeleteHi,
ReplyDeleteI found good structured documentation on Open Office site:
http://sc.openoffice.org/excelfileformat.pdf
There is an example on Microsoft site also: http://support.microsoft.com/kb/150447 and finally BIFF specification from Microsoft as well: http://download.microsoft.com/download/0/B/E/0BE8BDD7-E5E8-422A-ABFD-4342ED7AD886/Excel97-2007BinaryFileFormat(xls)Specification.pdf
Hi how can I display text like this "NUÑEZ" in excel, in your writer it displays like this "NU?EZ"
ReplyDelete