C#NPOI对Excel操作(导出)

本文介绍如何使用NPOI库从SQL Server数据库导出数据到Excel文件,包括创建Excel工作簿、设置工作表及单元格样式,并支持两种格式(.xls和.xlsx)。提供了完整的代码示例。

语法都是基于.net的,第一次写文章,有错误希望读者提出,不胜感激。

NPOI简介

POI是用Java写的一种读取office文件的库,NPOI相当于POI的.net版本,它实现了电脑在没有安装微软office的情况下可以对EXCEL、WORD、Visio等文件的一系列操作,下文使用的是NPOI 2.2.1版本,需要的同学可以点击链接下载。
NPOI下载

导出EXCEL

我们先从数据库中随便取一张表,作为导出的示例,数据库使用的是sql server。
select * from Employees;
得到如下数据:


新建一个窗体项目,加上一个button,一个label(提示使用)

添加button的click事件,执行下列代码:

private void button1_Click(object sender, EventArgs e)  
{   
    //要执行的sql语句
    string sql = "select * from Employees where cc_autoid < 50";
    //调用函数导出Excel,函数实现在下面
    ExportExcelFromSql(sql, @"D:\", 1);  
}复制代码

ExportExcelFromSql函数的实现:
参数1是要执行的sql语句
参数2是要导出的路径(注意路径字符串前要转移,加上@)
参数3是导出的格式(1 || 2)
1是xls格式
2是xlsx格式
下文的SqlHelper也是自己封装ADO.net的静态类,这里不详细介绍了

private void ExportExcelFromSql(string sql,string path,int format)
    {   
        //是用正则表达式判断输入的格式是否是1或者2
        Regex reg = new Regex("[^12]");
        string x = format.ToString();
        if(reg.IsMatch(x))
        {
            return;
        }
        //执行sql语句
        SqlDataReader reader = SqlHelper.ExecuteReader(sql, CommandType.Text);
        //创建一个IWorkbook的集合,如果format为1就构造HSSFWork创建xls格式的EXCEL,为2就构造XSSFWork创建xlsx格式的EXCEL
        List<IWorkbook> list = new List<IWorkbook>();
        //判断是否有数据,如果没有,label做出提示
        if (reader.HasRows)
        {
            list.Add(new HSSFWorkbook());//xls格式
            list.Add(new XSSFWorkbook());//xlsx格式
            //首先创建EXCEL工作簿,三元运算符判断格式
            IWorkbook workbook = (format == 1) ? list[0] : list[1];
            //创建一张工作表,这里工作表没有准确命名,可以在传一个参数 来确定表明,或者用正则表达式提出from后的数据库表名作为工作表的名称
            ISheet sheet = workbook.CreateSheet("1");
            //创建一行,作为表头
            IRow row_head = sheet.CreateRow(0);
            //循环得到数据库列名,创建第一行
            for (int h = 0; h < reader.FieldCount; h++)
            {
                row_head.CreateCell(h).SetCellValue(reader.GetName(h));
            }
            int index = 1;
            while (reader.Read())
            {
                IRow row = sheet.CreateRow(index);
                index++;
                for (int c = 0; c < reader.FieldCount; c++)
                {   
                    //这边得到每一行一列的数据类型,转换成string做switch判断
                    Type type = reader.GetFieldType(c);
                    string type_string = type.ToString().Replace("System.", "");
                    switch (type_string)
                    {   
                        //考虑到数据库中的null值,这里用了可空值类型,如果为null,就调用SetCellType(CellType.Blank)插入EXCEL中,表示一个空单元格
                        case "Int32":
                            int? temp_int = reader.IsDBNull(c) ? null : (int?)reader.GetInt32(c);
                            if (temp_int == null)
                            {
                                row.CreateCell(c).SetCellType(CellType.Blank);
                            }
                            else
                            {
                                row.CreateCell(c).SetCellValue((int)temp_int);
                            }
                            break;
                        case "String":
                            string temp_string = reader.IsDBNull(c) ? null : reader.GetString(c);
                            if (temp_string == null)
                            {
                                row.CreateCell(c).SetCellType(CellType.Blank);
                            }
                            else
                            {
                                row.CreateCell(c).SetCellValue(temp_string);
                            }
                            break;
                        case "DateTime":
                            DateTime? temp_datetime = reader.IsDBNull(c) ? null : (DateTime?)reader.GetDateTime(c);
                            if (temp_datetime == null)
                            {
                                row.CreateCell(c).SetCellType(CellType.Blank);
                            }
                            else
                            {
                                ICellStyle cell_style = workbook.CreateCellStyle();
                                cell_style.DataFormat = HSSFDataFormat.GetBuiltinFormat("m/d/yy h:mm");
                                ICell cell = row.CreateCell(c);
                                cell.CellStyle = cell_style;
                                cell.SetCellValue((DateTime)temp_datetime);
                            }
                            break;
                    }
                }
            }
            //最后使用文件流导出到path位置,还是三元运算符判断保存类型
            using (FileStream fs = File.OpenWrite(path + @"T_customers" + ((format == 1) ? ".xls" : ".xlsx")))
            {
                workbook.Write(fs);
            }
            label1.Text = "导出EXCEL成功\r\n" + path + @"Employees.xlsx" + "\r\n" + System.DateTime.Now.ToString();
        }
        else
        {
            label1.Text = "没有读取到数据";
            return;
        }
    }复制代码

执行以上代码:


最后打开导出的路径,打开文件:


此文章仅供学习参考
作者:千梦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值