使用NPOI将DataTable生成Excel

听闻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表。

使用示例则如下:

public void test()
        {
            DataTable dt = new DataTable();
            DataColumn[] cols = new DataColumn[] {
                new DataColumn("name",typeof(string)),
                new DataColumn ("birthday",typeof(DateTime)),
                new DataColumn ("score",typeof(int))
            };
            dt.Columns.AddRange(cols);
            Random rnd = new Random();

            for (int i = 0; i < 10; i++)
            {
                DataRow row = dt.NewRow();
                object[] items = new object[] {
                    "小明",
                    DateTime.Now ,
                    rnd.Next(100)
                };
                row.ItemArray = items;
                dt.Rows.Add(row);
            }
            myExcelLib.ExcelHelper myhelper = new myExcelLib.ExcelHelper();
            byte[] data = myhelper.DataTable2Excel(dt,"人员名录");
            string path = "d:\\temp" + DateTime.Now.Ticks.ToString() + ".xls";
            if (!File.Exists(path))
            {
                FileStream fs = new FileStream(path, FileMode.CreateNew);
                fs.Write(data, 0, data.Length);
                fs.Close();

            }

        }

看完码,接下来且听我解释:

整个ExcelHelper的类只提供了一个公共函数DataTable2Excel,参数也很简单,就把DataTable和一个将生成的sheet表名传过去便可。不过我们导出的excel表第一行通常都是列头名称,例如数据里的列名是“name”,但是我们需要显示在excel里头是“名字”,所以这里的DataTable还需要稍加修饰,例如dt.columns[“name”].Caption=”名字”。这样会在生成的excel里的首行显示“名字”这么个列头了。

时间: 2024-10-29 19:12:18

使用NPOI将DataTable生成Excel的相关文章

NPOI 利用DataTable导出Excel 2003和2007

NPOI插件官网:http://npoi.codeplex.com 引用插件 具体代码: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.IO; 7 using NPOI.XSSF.UserModel;//导出2007 8 using NPOI.HSSF.UserM

Excel导入DataTable兼容2003-2012(请细心查看注释)以及 DataTable导出Excel(导出格式2003.xls)注释:需要引用NPOI

1.#region Excel导入DataTable兼容2003-2012(请细心查看注释)/// <summary> /// 读取Excel文件到DataSet中/// 注释1:2012导出如报错“ System.InvalidOperationException: 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序.”解决:下载2007 Office system 驱动程序:数据连接组件安装http://download.microsoft.com/downl

通过 NPOI 生成 Excel

HSSFWorkbook hssfworkbook; ISheet sheet1; public void BuildExcel() { hssfworkbook = new HSSFWorkbook(); // 新建一个Excel页签 sheet1 = hssfworkbook.CreateSheet("Sheet1"); // 创建新增行 for (var i = 0; i < 10;i++ ) { IRow row1 = sheet1.CreateRow(i); for (

NPOI 动态生成Excel 转成HTML table显示

直入主题: 需求:从数据集中出去检索的数据,生成Excel ,转成HTML table 显示在页面上.还可以导出Excel . 我实现的效果图: 页面----> Excel----> now  ,说下具体的代码: 1.添加组件:   NPOI 相关组件,Excel转HTML组件. 2.使用了bootstrap 样式,所有要记得引用 <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="s

MVC +NPOI+AJAX 查询并生成excel 下载

Controller 代码: public class SubArea2STIReportController : BaseController { [ActionDescription("分区2STI查询")] public ActionResult Index() { var vm = CreateVM<SubArea2STIReportVM>(); return PartialView(vm); } [HttpPost] [ActionDescription(&quo

NPOI 导入,导出EXCEL

代码: public static class NPOIExcelHelper { /// <summary> /// DataTable导出到Excel文件 /// </summary> /// <param name="dtSource">源DataTable</param> /// <param name="strHeaderText">表头文本</param> /// <param

利用NPOI开源的读写Excel、WORD等微软OLE2组件读写execl,控制样式或单元格

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; //add using System.Data; using System.IO; using NPOI; using NPOI.HSSF.UserModel; public partial class ExeclOper

记一次服务器生成Excel在客户端下载的案例

今天加盟部校长说做一个用户数据收集并导出Excel文件的小网页,主要便于查看客户信息,前期一切顺利,就在生成Excel和下载的时候出现了问题,收集了一些资料,有人说用NPOI插件,这个可行,我在网上收集了资料,没有使用插件做了一个简单的Excel生成器,话不多少代码如下: 首先在服务类中 //导出Excel        /// <summary>        /// DataTable导出到Excel        /// </summary>        /// <p

用NPOI从DataBase到Excel &#39;2

NPOI的C# Helper代码2 1 public static MemoryStream ExportXls(DataTable dt) 2 { 3 HSSFWorkbook wk = new HSSFWorkbook(); 4 ISheet sheet = null; 5 6 string sheetName = "Sheet1"; 7 if (!string.IsNullOrEmpty(dt.TableName)) 8 { 9 sheetName = dt.TableName;