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如下:

cs 复制代码
        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文件的常规操作:

cs 复制代码
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);
    }
}
相关推荐
MyFreeIT几秒前
Excel Enable Content
excel
E_ICEBLUE5 分钟前
将 Excel 表格插入 Word 文档的三种实用方案(Python 自动化)
python·word·excel
俊哥工具11 分钟前
027免费开源硬盘检测工具,一键查看健康度,杜绝数据丢失
pdf·电脑·word·excel·音视频
不恋水的雨20 小时前
easyexcel快速填充大数据量不覆盖后面的行解决方式
java·excel·poi
靖待1 天前
【解决方法】python写Excel单元格截断长文本
python·excel·解决方法
Curvatureflight1 天前
大数据量 Excel 导出怎么优化?一套可落地的异步化方案
java·后端·excel·状态模式
DS随心转APP1 天前
怎么让智谱清言生成 excel?借助 AI 导出鸭横向测评导出方法,一站式破解表格生成困扰
人工智能·ai·excel·deepseek·ai导出鸭
chatexcel2 天前
ChatExcel MAX 教程:AI Excel 数据清洗、异常核查与分析报告生成
人工智能·excel
葡萄城技术团队2 天前
模拟运算表全解析:从 Excel 的两变量限制到 SpreadJS 的不限变量 | SpreadJS 新版本 特性解析
excel
hoiii1872 天前
C# Txt/Excel/Access 导入导出工具
开发语言·c#·excel