使用NPOI将DataTable生成Excel

作者: 分类: 技术文章 时间: 2012-10-29

听闻npoi 2.0版本支持excel2007格式了,表示期待其表现。不过目前还是使用1.2.5稳重点。

生活中有太多的列表都需要一个导出功能,当然这里的生活指的的程序员的生活。DataTable是从数据库读取数据后常用的数据结构,又当然这里的DataTable是指.Net开发下的。今天刚好做了个导出excel的功能,于是乎就在完成功能后把该方法抽离出来做成一个类,以备后用。整个类如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using NPOI.SS.UserModel;

using NPOI.HSSF.UserModel;

using System.Data;

using System.IO;

 

namespace Excel

{

  public   class ExcelHelper

    {

        /// <summary>

        /// 类版本

        /// </summary>

        public string version

        {

            get { return "0.1"; }

        }

        readonly int EXCEL03_MaxRow = 65535;

 

        /// <summary>

        /// 将DataTable转换为excel2003格式。

        /// </summary>

        /// <param name="dt"></param>

        /// <returns></returns>

        public byte[] DataTable2Excel(DataTable dt,   string sheetName)

        {

             

            IWorkbook book = new HSSFWorkbook();

            if (dt.Rows.Count < EXCEL03_MaxRow)

                DataWrite2Sheet(dt, 0, dt.Rows.Count - 1, book, sheetName);

            else

            {

                int page = dt.Rows.Count / EXCEL03_MaxRow;

                for (int i = 0; i < page; i++)

                {

                    int start = i * EXCEL03_MaxRow;

                    int end = (i * EXCEL03_MaxRow) + EXCEL03_MaxRow - 1;

                    DataWrite2Sheet(dt, start, end, book, sheetName + i.ToString());

                }

                int lastPageItemCount = dt.Rows.Count % EXCEL03_MaxRow;

                DataWrite2Sheet(dt, dt.Rows.Count - lastPageItemCount, lastPageItemCount, book, sheetName + page.ToString());

            }

            MemoryStream ms = new MemoryStream();

            book.Write(ms);

            return ms.ToArray();

        }

        private void DataWrite2Sheet(DataTable dt, int startRow, int endRow, IWorkbook book,string sheetName)

        {

            ISheet sheet = book.CreateSheet(sheetName);

            IRow header = sheet.CreateRow(0);

            for (int i = 0; i < dt.Columns.Count; i++)

            {

                ICell cell = header.CreateCell(i);

                string val = dt.Columns[i].Caption ?? dt.Columns[i].ColumnName;

                cell.SetCellValue(val);

            }

            int rowIndex = 1;

            for (int i = startRow; i <= endRow; i++)

            {

                DataRow dtRow = dt.Rows[i];

                IRow excelRow = sheet.CreateRow(rowIndex++);

                for (int j = 0; j < dtRow.ItemArray.Length; j++)

                {

                    excelRow.CreateCell(j).SetCellValue(dtRow[j].ToString());

                }

            }

 

        }

    }

}

该类实现将DataTable转化为excel2003的二进制格式,如果DataTable的行数超过了excel2003的最大行数限制,还会分成多个sheet表。

使用示例则如下:

阅读全文»