Click here to Skip to main content
15,891,976 members
Articles / Programming Languages / C#

Excel Reader

Rate me:
Please Sign up or sign in to vote.
4.92/5 (109 votes)
20 Feb 2009LGPL32 min read 1.1M   25.8K   357   173
Create, read and modify Excel *.xls files in pure C# without COM interop
Sample Image - ExcelReader.png

Introduction

This library is built based on the following documents, thanks to their authors:

Record structures in BIFF8/BIFF8X format are considered.

Now this project is hosted on Google Code.
You can get the latest code, report issues and submit improvements from there. 

What It Can Do?

  • It can read worksheets in a workbook and read cells in a worksheet.
  • It can read cell content (text, number, datetime, or error) and cell format (font, alignment, linestyle, background, etc.).
  • It can read pictures in the file, get information of image size, position, data, and format.
  • It can create a workbook and save to file.

Using the Code

  1. Open file:
    C#
    Stream fileStream = File.OpenRead(file);
    Workbook book = new Workbook();
    book.Open(fileStream);
    Worksheet sheet = book.Worksheets[0];
  2. Read cell:
    C#
    int row = 1;
    int col = 0;
    string ID = sheet.Cells[row, col].StringValue;
    
    Picture pic = sheet.ExtractPicture(row, col);
  3. Create workbook:
    C#
    string file = "C:\\newdoc.xls";
    Workbook workbook = new Workbook();
    Worksheet worksheet = new Worksheet("First Sheet");
    worksheet.Cells[0, 1] = new Cell(1);
    worksheet.Cells[2, 0] = new Cell(2.8);
    worksheet.Cells[3, 3] = new Cell((decimal)3.45);
    worksheet.Cells[2, 2] = new Cell("Text string");
    worksheet.Cells[2, 4] = new Cell("Second string");
    worksheet.Cells[4, 0] = new Cell(32764.5, "#,###.00");
    worksheet.Cells[5, 1] = new Cell(DateTime.Now, @"YYYY\-MM\-DD");
    worksheet.Cells.ColumnWidth[0, 1] = 3000;
    workbook.Worksheets.Add(worksheet);
    workbook.Save(file);
  4. Traverse worksheet:
    C#
    // traverse cells
    foreach (Pair<Pair<int, int>, Cell> cell in sheet.Cells)
    {
        dgvCells[cell.Left.Right, cell.Left.Left].Value = cell.Right.Value;
    }
    
    // traverse rows by Index
    for (int rowIndex = sheet.Cells.FirstRowIndex;
       rowIndex <= sheet.Cells.LastRowIndex; rowIndex++)
    {
        Row row = sheet.Cells.GetRow(rowIndex);
        for (int colIndex = row.FirstColIndex;
       colIndex <= row.LastColIndex; colIndex++)
        {
            Cell cell = row.GetCell(colIndex);
        }
    }
    

History

  • 2007-5-17
    • Displayed each Sheet in separate tabpage
    • Fixed some bugs in FORMULA.cs and Form1.cs
  • 2007-5-26
    • Decoded FORMULAR result
  • 2008-1-23
    • Changed default Encoding from ASCII to UTF8 in Record.cs ln97 (suggested by ragundo)
    • Return EmptyCell instead of null for non existing cells (requested by amrlafi)
    • Bug fix in Record.cs ln83 and ln133 (proposed by dhirshjr and ilogpasig)
    • Tried to fix bug in CompoundDocument.cs (found by stevenbright)
  • 2008-9-15
    • Create, Open and Modify CompoundDocument
  • 2008-9-22
    • Save modified CompoundDocument
  • 2008-10-26
    • Encoded workbook and worksheet to BIFF8 records
    • Fixed a bug that compressed Unicode string wrongly decoded by UTF8
  • 2008-11-10
    • Fixed XF format so that the created *.xls file can be opened by Microsoft Excel 2003
  • 2008-11-16
    • Assigned number format for number and date time values
    • Set column widths
  • 2009-1-3
    • Updated project source code and article text
    • Many bug fixes
    • Added support to create and modify *.xls files
  • 2009-01-20
    • Fix for getting 'NaN' when reading string value of a formula cell
    • Start a Google Code project
  • 2009-01-23
    • Support for decode cell format and encode predefined cell format
    • Changed namespaces and directory structure
    • Added some test cases
  • 2009-02-12
    • Initial implementation of encode images

License

This article, along with any associated source code and files, is licensed under The GNU Lesser General Public License (LGPLv3)


Written By
Architect YunCheDa Hangzhou
China China
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralRe: Date Format Pin
sameerhanda5-Jul-07 4:20
sameerhanda5-Jul-07 4:20 
GeneralRe: Date Format Pin
TuftedCat5-Jan-10 10:32
TuftedCat5-Jan-10 10:32 
GeneralFor manage accents Pin
Funeral11-Jun-07 2:45
Funeral11-Jun-07 2:45 
NewsUpdate notes Pin
Liu Junfeng29-May-07 3:35
Liu Junfeng29-May-07 3:35 
GeneralGood Effort Pin
Moim Hossain27-May-07 19:02
Moim Hossain27-May-07 19:02 
GeneralRe: Good Effort Pin
Liu Junfeng27-May-07 21:18
Liu Junfeng27-May-07 21:18 
GeneralHelp Pin
Jeff Circeo7-Mar-07 4:47
Jeff Circeo7-Mar-07 4:47 
GeneralRe: Help Pin
TomatGurka16-Mar-07 23:13
TomatGurka16-Mar-07 23:13 
Yes, I also get this exception all the time. Cry | :(( I have tried the code on some files, but it crashes. Only very basic Excel files seem to work. Sigh | :sigh:

Great initiative though! Poke tongue | ;-P It would be great if you could fix the code, because a free Excel reader for .NET which doesn't involve COM is really needed out there!



Tomat coder
AnswerRe: Help Pin
coopsf128-Mar-07 8:51
coopsf128-Mar-07 8:51 
GeneralRe: Help Pin
TomatGurka25-Apr-07 12:00
TomatGurka25-Apr-07 12:00 
AnswerRe: Help [modified] Pin
Liu Junfeng18-May-07 8:33
Liu Junfeng18-May-07 8:33 
GeneralThanks Pin
Jeff Circeo6-Mar-07 6:25
Jeff Circeo6-Mar-07 6:25 
QuestionHow to determine font style? Pin
m10231274626-Feb-07 21:29
m10231274626-Feb-07 21:29 
GeneralKindly upload write routine also. Pin
vishal.tanwar2-Jan-07 0:22
vishal.tanwar2-Jan-07 0:22 
GeneralRegards from - Bibin Pin
Bibin Kurian Joy22-Dec-06 7:23
Bibin Kurian Joy22-Dec-06 7:23 
Generalformat date Pin
Zahadum9-Nov-06 22:51
Zahadum9-Nov-06 22:51 
AnswerRe: format date Pin
Liu Junfeng20-Nov-06 17:10
Liu Junfeng20-Nov-06 17:10 
GeneralRe: format date Pin
jmb198330-Jan-07 10:11
jmb198330-Jan-07 10:11 
GeneralRe: format date Pin
TuftedCat5-Jan-10 10:34
TuftedCat5-Jan-10 10:34 
GeneralRe: format date Pin
m10231274627-Feb-07 2:04
m10231274627-Feb-07 2:04 
QuestionAny plans to add write capability? Pin
Mike Klingbeil8-Nov-06 3:33
Mike Klingbeil8-Nov-06 3:33 
GeneralGood work but a lot of bugs still Pin
Joe Sonderegger6-Nov-06 21:35
Joe Sonderegger6-Nov-06 21:35 
GeneralTake a look CoreCalc Pin
Väinölä Harri2-Nov-06 20:28
Väinölä Harri2-Nov-06 20:28 
GeneralRe: Take a look CoreCalc Pin
Nuri Kevenoglu7-Nov-06 16:47
Nuri Kevenoglu7-Nov-06 16:47 
GeneralRe: Take a look CoreCalc Pin
Väinölä Harri7-Nov-06 20:36
Väinölä Harri7-Nov-06 20:36 

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

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