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);
    }
}
相关推荐
科技新资讯1 天前
AI如何批量处理Excel文件? 从数据合并、清洗到自动生成报表,看看 AI Agent 怎么完成任务
大数据·人工智能·excel
用户0332126663671 天前
使用 Python 在 Excel 中添加与删除筛选器
python·excel
xurime1 天前
Excelize 开源基础库发布 2.11.1 版本更新
数据分析·excel·开源软件·excelize·gitcode
梦想出海-Phoebe1 天前
Gemini新增文件编辑功能:PDF、Word、Excel处理体验分享
pdf·word·excel
Data-Miner2 天前
AI和Excel怎么结合才能真提效
人工智能·excel
taller_20003 天前
【012】数据类型入门: Excel 数据到 Python 值的转换
python·excel·pie·py
彦5 天前
Excel实用技巧笔记
excel
Logic1015 天前
Excel流程控制if函数,IF+数组轻松解决复杂判断问题
excel·流程控制·条件判断·if·excel函数·if函数·数组公式
跨境猫小妹6 天前
跨境电商订单导出CSV用Excel打开后订单号变成科学计数法如何定位并修复
excel·跨境电商·营销策略
weixin_440401696 天前
大数据技术-数据分析(EXcel+Python数据处理+SQL)
大数据·python·数据分析·excel