经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
NPOI的Excel的读取和写入
来源:cnblogs  作者:陈彦斌  时间:2019/5/10 9:26:14  对本文有异议

一、Excel理论知识

最新版NPOI2.4.1链接:https://pan.baidu.com/s/1iTgJi2hGsRQHyw2S_4dIUw  提取码:adnq 

整个Excel表格叫做工作簿:WorkBook

工作簿由以下几部分组成

  a.页(Sheet);

  b.行(Row);

  c.单元格(Cell);

二、处理Excel的技术

OLE Automation:程序启动一个Excel进程,然后和Excel进程进行通讯来运行Excel的操作。

  优点:强大,Excel能实现的功能,都可以实现

  缺点:必须装Excel

把Excel当成数据库,使用Microsoft.Jet.OleDb访问Excel,只适合二维结构,功能少,不用装Excel

OpenXML,微软提供的读写Excel的技术,只能处理xlsx格式文件

NPOI、MyXls,能够分析Excel文件的格式,能够进行常用Excel操作,不依赖于Excel,节省资源,没有安全性和性能的问题。只能处理xls格式文件、不能处理xlsx这样的新版本Excel文件格式。处理xlsx用OpenXML

描述工作簿的类:IWorkbook(接口)、HSSFWorkbook(具体实现类)

描述工作表的类:ISheet(接口)、HSSFSheet(具体实现类)

三、NPOI导出

方式一(默认导出位置)

private void button1_Click(object sender, EventArgs e)
{
    List<Person> list = new List<Person>() {
        new Person(){Name="张三",Age="15",Email="123@qq.com" },
        new Person(){Name="李四",Age="16",Email="456@qq.com" },
        new Person(){Name="王五",Age="17",Email="789@qq.com" }
    };
    // 引用命名空间
    // using NPOI.HSSF.UserModel;
    // using NPOI.SS.UserModel;
    // using System.IO;
    //将List集合中的内容导出到Excel中
    //1、创建工作簿对象
    IWorkbook wkBook = new HSSFWorkbook();
    //2、在该工作簿中创建工作表对象
    ISheet sheet = wkBook.CreateSheet("人员信息"); //Excel工作表的名称
    //2.1向工作表中插入行与单元格
    for (int i = 0; i < list.Count; i++)
    {
        //在Sheet中插入创建一行
        IRow row = sheet.CreateRow(i);
        //在该行中创建单元格
        //方式一
        //ICell cell = row.CreateCell(0);
        //cell.SetCellValue(list[i].Name);
        //方式二
        row.CreateCell(0).SetCellValue(list[i].Name); //给单元格设置值:第一个参数(第几个单元格);第二个参数(给当前单元格赋值)
        row.CreateCell(1).SetCellValue(list[i].Age);
        row.CreateCell(2).SetCellValue(list[i].Email);
    }
    //3、写入,把内存中的workBook对象写入到磁盘上
    FileStream fsWrite = File.OpenWrite("Person.xls");  //导出时Excel的文件名
    wkBook.Write(fsWrite);
    MessageBox.Show("写入成功!", "提示");
    fsWrite.Close(); //关闭文件流
    wkBook.Close();  //关闭工作簿
    fsWrite.Dispose(); //释放文件流
}

Person类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _01NPOI的写入
{
    public class Person
    {
        public string Name { get; set; }
        public string Age { get; set; }
        public string Email { get; set; }
    }
}


方式二(更友好的一种方式,用户可以指定导出位置)推荐

private void button3_Click(object sender, EventArgs e)
{
    List<Person> list = new List<Person>() {
        new Person(){Name="张三",Age="15",Email="123@qq.com" },
        new Person(){Name="李四",Age="16",Email="456@qq.com" },
        new Person(){Name="王五",Age="17",Email="789@qq.com" }
    };
    //创建文件
    string fileName = "人员信息表";
    string saveFilePath = ""; //导出时文件的路径
    SaveFileDialog saveDialog = new SaveFileDialog();
    saveDialog.DefaultExt = "xls"; //默认文件扩展名
    saveDialog.Filter = "Excel文件|*.xls"; //文件名筛选字符串
    saveDialog.FileName = fileName; //导出文件名称
    saveDialog.ShowDialog(); //显示窗口
    saveFilePath = saveDialog.FileName; //文件路径
    // 引用命名空间
    // using NPOI.HSSF.UserModel;
    // using NPOI.SS.UserModel;
    // using System.IO;
    //将List集合中的内容导出到Excel中
    //1、创建工作簿对象
    IWorkbook wkBook = new HSSFWorkbook();
    //2、在该工作簿中创建工作表对象
    ISheet sheet = wkBook.CreateSheet("人员信息"); //Excel工作表的名称
    //2.1向工作表中插入行与单元格
    for (int i = 0; i < list.Count; i++)
    {
        //在Sheet中插入创建一行
        IRow row = sheet.CreateRow(i);
        //在该行中创建单元格
        //方式一
        //ICell cell = row.CreateCell(0);
        //cell.SetCellValue(list[i].Name);
        //方式二
        row.CreateCell(0).SetCellValue(list[i].Name); //给单元格设置值:第一个参数(第几个单元格);第二个参数(给当前单元格赋值)
        row.CreateCell(1).SetCellValue(list[i].Age);
        row.CreateCell(2).SetCellValue(list[i].Email);
    }
    //3、写入,把内存中的workBook对象写入到磁盘上
    FileStream fsWrite = new FileStream(saveFilePath,FileMode.Create);
    wkBook.Write(fsWrite);
    MessageBox.Show("写入成功!", "提示");
    fsWrite.Close(); //关闭文件流
    wkBook.Close();  //关闭工作簿
    fsWrite.Dispose(); //释放文件流
}

Person类:

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _01NPOI的写入
{
    public class Person
    {
        public string Name { get; set; }
        public string Age { get; set; }
        public string Email { get; set; }
    }
}


方式三、导出dataGridView数据

public static void ExportExcel(string fileName, DataGridView dgv)
{
    string saveFileName = "";
    SaveFileDialog saveDialog = new SaveFileDialog();
    saveDialog.DefaultExt = "xls";
    saveDialog.Filter = "Excel文件|*.xls";
    saveDialog.FileName = fileName;
    saveDialog.ShowDialog();
    saveFileName = saveDialog.FileName;

    HSSFWorkbook workbook = new HSSFWorkbook();
    MemoryStream ms = new MemoryStream();

    NPOI.SS.UserModel.ISheet sheet = workbook.CreateSheet("Sheet1");

    int rowCount = dgv.Rows.Count+1;
    int colCount = dgv.Columns.Count;
    int r1;
    NPOI.SS.UserModel.IRow dataRow1 = sheet.CreateRow(0);

    for (int i = 0; i < rowCount; i++)
    {
        NPOI.SS.UserModel.IRow dataRow = sheet.CreateRow(i);
        for (int j = 1; j < colCount; j++)
        {
            if (i == 0)
            {
                r1 = i;
            }
            else
            {
                r1 = i - 1;
            }
            if (dgv.Columns[j].Visible && dgv.Rows[r1].Cells[j].Value != null)
            {
                NPOI.SS.UserModel.ICell cell = dataRow.CreateCell(j-1);
                if (i == 0)
                {
                    cell.SetCellValue(dgv.Columns[j].HeaderCell.Value.ToString());
                    continue;
                }
                cell.SetCellValue(dgv.Rows[r1].Cells[j].FormattedValue.ToString());
            }
            else
            {
                NPOI.SS.UserModel.ICell cell = dataRow.CreateCell(j-1);
                cell.SetCellValue("");
            }
        }
    }

    workbook.Write(ms);
    FileStream file = new FileStream(saveFileName, FileMode.Create);
    workbook.Write(file);
    file.Close();
    workbook = null;
    ms.Close();
    ms.Dispose();
}

DGV中数据导出Excel

 四、NPOI读取Excel内容

private void button2_Click(object sender, EventArgs e)
{
    //需要读取的文件:人员表.xls
    // 创建文件
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Filter = "Excel文件|*.xls";
    ofd.ShowDialog();
    string filePath = ofd.FileName;
    FileStream fsRead=null;
    IWorkbook wkBook = null;
    if (filePath != "")
    {
        //1、创建一个工作簿workBook对象
        fsRead = new FileStream(filePath, FileMode.Open);
        //将人员表.xls中的内容读取到fsRead中
        wkBook = new HSSFWorkbook(fsRead);
        //2、遍历wkBook中的每个工作表Sheet
        for (int i = 0; i < wkBook.NumberOfSheets; i++)
        {
            //获取每个工作表对象
            ISheet sheet = wkBook.GetSheetAt(i);
            //获取每个工作表的行
            //foreach遍历 sheet.GetEnumerator
            for (int r = 0; r < sheet.LastRowNum; r++)
            {
                //获取工作表中的每一行
                IRow currentRow = sheet.GetRow(r);
                //遍历当前行中的每个单元格
                for (int c = 0; c < currentRow.LastCellNum; c++)
                {
                    try
                    {
                        //获取每个单元格
                        ICell cell = currentRow.GetCell(c);
                        if (cell == null) //如果单元格为空时,程序会报错,这里判断提示用户,用try catch防止程序蹦
                        {
                            MessageBox.Show(string.Format("第{0}行,第{1}列单元格为空!",r,c));
                        }
                        CellType cType = cell.CellType; // 获取单元格中的类型
                        MessageBox.Show(cType.ToString());
                        //判断当前单元格的数据类型,可以拓展
                        switch (cType)
                        {
                            case CellType.Numeric: //数字
                                MessageBox.Show("我是数字");
                                break;
                            case CellType.String: //字符串
                                MessageBox.Show("我是字符串");
                                break;
                            case CellType.Boolean:
                                MessageBox.Show("我是布尔值");
                                break;    
                        }
                        //获取单元格的值
                        //日期
                        DateTime date = cell.DateCellValue;
                        //数字
                        double num = cell.NumericCellValue;
                        //字符串
                        string str = cell.StringCellValue;
                        //布尔值
                        bool bl = cell.BooleanCellValue;
                    }
                    catch (Exception EX)
                    {

                    }
                  
                }
            }
        }            
    }
    else
    {
        MessageBox.Show("选择文件失败!","提示");
    }
    fsRead.Close();
    wkBook.Close();
    fsRead.Dispose();

}

项目链接:https://pan.baidu.com/s/150J59Z3XP2DroZDy9HYfFA    提取码:nkw1

最新版NPOI2.4.1链接:https://pan.baidu.com/s/1iTgJi2hGsRQHyw2S_4dIUw      提取码:adnq

 

原文链接:http://www.cnblogs.com/chenyanbin/p/10832614.html

 友情链接:直通硅谷  直通硅谷 怎么样 mac软件下载