C#如何用NPOI创建、读取、更新Excel文件

一.获取引用NPOI

 VS2017,通过Nuget工具包下载NPOI到指定的项目中,如下

二.添加如下命名空间,其中HSSF是操作*.xls文件,XSSF操作*.xlsx文件.

using NPOI;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;

三.关于NPOI关键类/接口:

工作表:IWorkbook,XSSFWorkbook(*.xlsx);HSSFWorkbook(*.xls)

工作表:ISheet,Sheet

行:IRow,

obj_sh.LastRowNum获取最后一行的index

obj_row.LastCellNum;获取当前行的列数

单元格:ICell

四,创建Excel创建excel常规操作过程如下:

1.创建workbook对象

IWorkbook wbk = new XSSFWorkbook();

2.创建sheet到workbook中

ISheet mysheet = wbk.CreateSheet("mySheet");

3.在sheet对象中创建row

IRow myRow = mysheet.CreateRow(i);

4.在row中创建cell

ICell cell = myRow.CreateCell(i);

5.给cell赋值

cell.SetCellValue("单元格的值")

6.保存workbook对象的数据到电脑磁盘

using (FileStream fs_write = File.OpenWrite(path))
{
    wbk.Write(fs_write);
}

或者如下方式也可以

using(FileStream fs_write = File.Open(path,FileMode.Create))

{

        wbk.Write(fs_write);

}

//或如下,不用File.Open(...),直接new一个Filestream对象也可以
using (FileStream fs_write = new FileStream(path, FileMode.Create))
{
    wbk.Write(fs_write);
}
//上面两种保存Excel方式,要注意FileMode必须是Create,如果是Open,Excel文件损坏打不开!!!

五.创建Excel文件Demo如下:

        private void Form1_Load(object sender, EventArgs e)
        {
            //声明工作本对象(XSSFWorkbook后缀名.xlsx;HSSFWorkbook后缀名.xls)
            IWorkbook wbk = new XSSFWorkbook();

            //创建一个sheet
            ISheet mysheet = wbk.CreateSheet("mySheet");
            
            for (int i = 0; i < 3; i++)
            {
                //创建行
                IRow myRow = mysheet.CreateRow(i);
                //创建单元格,写入值
                myRow.CreateCell(0).SetCellValue($"Row{i + 1}Col0");
                myRow.CreateCell(1).SetCellValue($"Row{i + 1}Col1");
                myRow.CreateCell(2).SetCellValue($"Row{i + 1}Col2");
            }
            int cellCnt = mysheet.GetRow(0).LastCellNum;
            //自动调整列宽
            for (int i = 0; i < cellCnt; i++)
            {
                mysheet.AutoSizeColumn(i);
            }

            string path = @"D:\dwang\myWBK.xlsx";
            //将excel数据赋值给文件流,并excel文件的Write方法参数,保存wbk文件到本地磁盘
            //using (FileStream fs = File.OpenWrite(path))
            //{
            //    wbk.Write(fs);
            //}
            //或如下,不用File.OpenWrite(Path),直接new一个Filestream对象也可以
            using (FileStream fs_write = new FileStream(path, FileMode.Create))
            {
                wbk.Write(fs_write);
            }
            //上面的保存Excel方式,要注意FileMode必须是Create,如果是Open,Excel文件损坏.
        }

六.读取Excel文件:

读取excel文件过程如下:

1.通过指定的excel文件路径,读取到文件流中

2.创建workbook对象,将excel文件流作为workbook的构造函数传给工作本对象

3.读取sheet,row,cell,获取指定的内容,常见操作如下

3.1. 获取工作簿对象
IWorkbook workbook = new XSSFWorkbook(fs);    // 2007
// IWorkbook workbook = new HSSFWorkbook(fs); // 2003
3.2. 获取工作表对象(第一个表,序号从0开始)
ISheet sheet = workbook.GetSheetAt(0);
3.3. 获取工作表的行(第一行)
IRow row = sheet.GetRow(0);
3.4. 获取指定行的单元格
ICell cell = row.GetCell(0);
3.5. 获取单元格样式
ICellStyle cellStyle = cell.CellStyle;
3.6. 创建工作簿对象
XSSFWorkbook workBook= new XSSFWorkbook();
3.7. 创建工作表对象
XSSFSheet newSheet = (XSSFSheet)workBook.CreateSheet("new sheet");
3.8. 创建工作表的行
XSSFRow newRow = (XSSFRow)newSheet.CreateRow(0);
3.9. 创建单元格
XSSFCell newCell = (XSSFCell)newRow.CreateCell(0);
3.10. 单元格写值
newCell.SetCellValue(1);
3.11. 设置Sheet名称
workBook.SetSheetName(0, "第一张表");
3.12. 设置单元格内容
newCell.SetCellValue(11);
3.13. 得到工作簿中Sheet数量
workBook.NumberOfSheets
如下代码是读取Exel文件的常规操作:

private void Form1_Load(object sender, EventArgs e)
{
    string path = @"D:\dwang\mywbk.xlsx";
    if(!File.Exists(path))
    {
        MessageBox.Show("文件不存在,退出");
        return;
    }

    //读取excel,需要通过filestream读取excel,然后文件流对象作为参数传给workbook构造函数参数
    FileStream fs_read = File.OpenRead(path);

    //将文件流中的eexcel文件数据读取到workbook对象中
    IWorkbook wbk = new XSSFWorkbook(fs_read);

    //获取wbksheet数量
    int sheetCnt = wbk.NumberOfSheets;
    //激活第一个sheet
    wbk.SetActiveSheet(0);

    //获取sheet对象
    ISheet sh = wbk.GetSheetAt(0);
    //获取最后一行的行index
    int rowCnt = sh.LastRowNum;
    List<string> lst = new List<string>();
    string cellContents = null;
    IRow currRow = null;
            
    for (int i = 0; i <= rowCnt; i++)
    {
        //当前行赋值
        currRow = sh.GetRow(i);
        //获取当前行的单元格数量,注意,这个数字是列数,不是最后一个单元格索引
        int cellCnt = currRow.LastCellNum;
        for (int j = 0; j < cellCnt; j++)
        {
            //获取当前行的每个单元格内容,并连接给字符串
            cellContents += $"{currRow.GetCell(j).ToString()},";
        }
        lst.Add(cellContents);
        cellContents = "";
    }
    foreach (var item in lst)
    {
        MessageBox.Show(item);
    }

    //更新单元格值,并保存
    sh.GetRow(0).GetCell(0).SetCellValue("ASDFGH");
    sh.AutoSizeColumn(0);

    //关闭excel文件的读取流
    fs_read.Close();

    //wbk内容写入到新建的写入流,再到磁盘文件
    //保存到磁盘:workbook ->filestream -> 磁盘文件
    using (FileStream fs_write = File.OpenWrite(path))
    {
        wbk.Write(fs_write);
    }
}

  • 32
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值