C#NPOI操作Excel


编辑器:Visual Studio
语言:C#

一、NPOI的引用

1.根据Visual Studio版本安装NuGet.Tools
网址:https://www.nuget.org/downloads
2.工具→NuGet包管理器→程序包管理器控制台
在这里插入图片描述
在这里插入图片描述
3.输入"Install-Package NPOI",回车
在这里插入图片描述
在这里插入图片描述
4.此时会发现项目下的“引用”多了NPOI相关引用
在这里插入图片描述

二、操作Excel

1.创建新的Excel工作簿

IWorkbook workbook = new XSSFWorkbook();
ISheet worksheet = workbook.CreateSheet("工作表名称");

说明:
XSSFWorkbook操作扩展名为“.xlsx”的工作簿;
HSSFWorkbook操作扩展名为“.xls”的工作簿;
可使用IWorkbook统一定义;
如果需要多次创建workbook、worksheet等变量,可定义为公共变量,不用多次定义。

2.读取现有的Excel工作簿

获取Excel工作簿

FileStream fs;
fs = File.Open(path);//path:读取文件的路径
if (Path.GetExtension(strPath) == ".xls")
{ workbook = new HSSFWorkbook(fs); }
else { workbook = new XSSFWorkbook(fs); }

获取sheet工作表

worksheet = workbook.GetSheetAt(0);//0即为工作簿中的第一张工作表

3.操作sheet工作表

在新工作表中插入值,首先需要创建第一行,然后创建单元格并赋值

IRow row = worksheet.CreatRow(0);//创建行
row.CreateCell(0).SetCellValue("行1列1的单元格的值");
//第二行代码和下面两行代码效果相同
//ICell cell = row.CreateCell(0);
//cell.SetCellValue("行1列1的单元格的值");

获取工作表最后一行

row = worksheet.GetRow(worksheet.LastRowNum);
//worksheet.LastRowNum指最后一行的索引

获取行的最后一个单元格

ICell cell = row.GetCell(row.LastCellNum);
//row.LastCellNum指此行最后一个单元格的索引

设置单元格格式:居中(可以此推导其他属性使用)

ICellStyle cellstyle = workbook.CreateCellStyle();
//水平居中
cellstyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
//垂直居中
cellstyle.VerticalAlignment = VerticalAlignment.Center;
//自动换行
cellstyle.WrapText = true;
//把定义好的cellstyle赋值给单元格
row.GetCell(0).CellStyle = cellstyle;

设置列宽:worksheet.SetColumnWidth的第一个参数是要设置的列索引,第二个参数是要设置的宽度(若设置为24个字符宽度,则需256*24;若设置为1个字符宽度,则需256*1)
在这里插入图片描述

for (int i = 0; i < num; i++)
{ worksheet.SetColumnWidth(i, 256 * 24); }

4.操作workbook工作簿

若sheet工作表个数不为1,但是想要只保留第一个工作表

if (workbook.NumberOfSheets != 1) 
{ 
    for (int i = workbook.NumberOfSheets - 1; i > 0; i--) 
    { workbook.RemoveSheetAt(i); } 
}

修改sheet工作表名字

workbook.SetSheetName(a, "名字");//a:sheet索引

5.跨workbook工作簿复制sheet工作表

//复制合并的单元格
public static void MergerRegion(ISheet fromSheet, ISheet toSheet)
{
    int sheetMergerCount = fromSheet.NumMergedRegions;
    for (int i = 0; i < sheetMergerCount; i++) 
    { toSheet.AddMergedRegion(fromSheet.GetMergedRegion(i)); }
}
//复制sheet
public static void MyCopySheet(IWorkbook fromWorkbook, IWorkbook toWorkbook, ISheet fromSheet, ISheet toSheet)
{
    MergerRegion(fromSheet, toSheet);//合并的单元格
    IRow fromRow, toRow;
    ICellStyle fromCellStyle, toCellStyle;
    CellType fromCellType;
    int Column_Num = -1;
    for (int i = 0; i <= fromSheet.LastRowNum; i++)
    {
        if (fromSheet.GetRow(i) != null)
        {
            fromRow = fromSheet.GetRow(i);
            toRow = toSheet.CreateRow(i);
            for (int j = 0; j <= fromRow.LastCellNum; j++)
            {
                if (fromRow.GetCell(j) != null)
                {
                    #region 内容
                    fromCellType = fromRow.GetCell(j).CellType;
                    toRow.CreateCell(j).SetCellType(fromRow.GetCell(j).CellType);
                    if (fromCellType == CellType.Numeric) 
                    { toRow.GetCell(j).SetCellValue(fromRow.GetCell(j).NumericCellValue); }
                    switch (fromCellType)
                    {
                        case CellType.Boolean: toRow.GetCell(j).SetCellValue(fromRow.GetCell(j).BooleanCellValue); break;
                        case CellType.Numeric: 
                            if (HSSFDateUtil.IsCellDateFormatted(fromRow.GetCell(j)))
                            { toRow.GetCell(j).SetCellValue(fromRow.GetCell(j).DateCellValue); }
                            else { toRow.GetCell(j).SetCellValue(fromRow.GetCell(j).NumericCellValue); }
                            break;
                        case CellType.String: toRow.GetCell(j).SetCellValue(fromRow.GetCell(j).RichStringCellValue); break;
                        case CellType.Formula: toRow.GetCell(j).SetCellValue(fromRow.GetCell(j).CellFormula); break;
                        case CellType.Error: toRow.GetCell(j).SetCellValue(fromRow.GetCell(j).ErrorCellValue); break;

                    }
                    #endregion

                    #region 复制单元格格式
                    fromCellStyle = fromRow.GetCell(j).CellStyle;
                    toCellStyle = toWorkbook.CreateCellStyle();
                    if (fromCellStyle != null)
                    {
                        toCellStyle.CloneStyleFrom(fromCellStyle);                               
                        toRow.GetCell(j).CellStyle = toCellStyle;
                    }
                    #endregion
                }
            }
            if (fromRow.LastCellNum > Column_Num) { Column_Num = fromRow.LastCellNum; }
        }
    }
    for (int i = 0; i < Column_Num; i++)
    {
        toSheet.SetColumnWidth(i, fromSheet.GetColumnWidth(i));//列宽
    }
}
  • 8
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C# 中使用 NPOI 库来读取 Excel 文件非常简单。以下是一个基本示例: 首先,您需要安装 NPOI 库。您可以在 NuGet 程序包管理器中搜索 "NPOI" 并安装它。 接下来,您可以使用以下代码来读取 Excel 文件: ```csharp using System; using System.IO; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; // 如果使用的是 .xlsx 格式的 Excel 文件 class Program { static void Main(string[] args) { // 读取 Excel 文件 string filePath = "路径/文件名.xlsx"; FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read); // 根据文件格式创建工作簿 IWorkbook workbook = new XSSFWorkbook(file); // 如果使用的是 .xlsx 格式的 Excel 文件 // 获取第一个工作表 ISheet sheet = workbook.GetSheetAt(0); // 遍历工作表中的行 for (int i = 0; i <= sheet.LastRowNum; i++) { IRow row = sheet.GetRow(i); if (row != null) { // 遍历行中的单元格 for (int j = 0; j < row.LastCellNum; j++) { ICell cell = row.GetCell(j); if (cell != null) { // 打印单元格的值 Console.WriteLine(cell.ToString()); } } } } // 关闭文件流和工作簿 file.Close(); workbook.Close(); Console.ReadLine(); } } ``` 以上代码打开指定路径下的 Excel 文件,读取第一个工作表中的所有行和单元格,并将每个单元格的值打印到控制台上。 请注意,根据您使用的 Excel 文件格式,您可能需要使用不同的 NPOI 类库(例如 HSSFWorkbook 用于 .xls 格式的文件)。在上面的示例中,我使用了 XSSFWorkbook 类来处理 .xlsx 格式的文件。 希望这可以帮助您开始使用 NPOI 来读取 Excel 文件!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值