C#控制台程序:查找某一文件夹下所有带特定标记的Excel文件,并将其中带有star标志的单元格信息输出(Excel文件名、表名、行列号和单元格值,及ReadTimeout异常处理

在开始程序前需要安装 ExcelDataReaderExcelDataReader.DataSet 的NuGet 包

using System;
using System.IO;
using System.Linq;
using ExcelDataReader;

class Program
{
    static void Main(string[] args)
    {
        Console.Write("请输入文件夹路径:");
        string folderPath = Console.ReadLine(); // 获取用户输入的文件夹路径

        string[] files = Directory.GetFiles(folderPath, "*Test*.xlsx"); // 获取文件夹中名称中包含"Test"的Excel文件

        foreach (string file in files)
        {
            using (var stream = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (var reader = ExcelReaderFactory.CreateReader(stream))
                {
                    do
                    {
                        while (reader.Read())
                        {
                            // 在每行中查找"star"的单元格
                            for (int i = 0; i < reader.FieldCount; i++)
                            {
                                var cellValue = reader.GetValue(i)?.ToString();
                                if (!string.IsNullOrEmpty(cellValue) && cellValue.Contains("star"))
                                {
                                    // 输出包含"star"的单元格信息
                                    Console.WriteLine("文件: " + file);
                                    Console.WriteLine("Sheet名称: " + reader.Name);
                                    Console.WriteLine("行号: " + reader.Depth);
                                    Console.WriteLine("列号: " + i);
                                    Console.WriteLine("单元格内容: " + cellValue);
                                    Console.WriteLine();
                                }
                            }
                        }
                    } while (reader.NextResult());
                }
            }
        }

        Console.ReadLine();
    }
}

此时,当文件夹中有多个带“Test”的excel文件时,可能会出现超时的问题,为了解决这个问题,可以尝试使用 ExcelPackage 库来读取 Excel 文件,它对大型文件的处理更加稳定(需要安装EPPlus )。

修改后代码如下:

using System;
using System.IO;
using System.Linq;
using OfficeOpenXml;

class Program
{
    static void Main(string[] args)
    {
        Console.Write("请输入文件夹路径:");
        string folderPath = Console.ReadLine(); // 获取用户输入的文件夹路径

        string[] files = Directory.GetFiles(folderPath, "*Test*.xlsx"); // 获取文件夹中名称中包含"Test"的Excel文件

        foreach (string file in files)
        {
            using (var package = new ExcelPackage(new FileInfo(file)))
            {
                foreach (var worksheet in package.Workbook.Worksheets)
                {
                    for (int row = 1; row <= worksheet.Dimension.Rows; row++)
                    {
                        for (int col = 1; col <= worksheet.Dimension.Columns; col++)
                        {
                            var cellValue = worksheet.Cells[row, col].Value?.ToString();
                            if (!string.IsNullOrEmpty(cellValue) && cellValue.Contains("star"))
                            {
                                // 输出包含"star"的单元格信息
                                Console.WriteLine("文件: " + file);
                                Console.WriteLine("Sheet名称: " + worksheet.Name);
                                Console.WriteLine("行号: " + row);
                                Console.WriteLine("列号: " + col);
                                Console.WriteLine("单元格内容: " + cellValue);
                                Console.WriteLine();
                            }
                        }
                    }
                }
            }
        }

        Console.ReadLine();
    }
}

修改后的代码使用 EPPlus 库中的 ExcelPackage 类来加载和处理 Excel 文件,它能够更稳定地处理大型文件,并避免了 ExcelDataReader 中的超时问题。

PS:EPPlus 库要求在使用之前设置有效的许可证密钥。请确保在使用 EPPlus 库之前,在程序的入口处或初始化代码中设置有效的许可证密钥。步骤如下:

  1. 打开 NuGet 管理器控制台(Tools -> NuGet Package Manager -> Package Manager Console)。
  2. 在控制台中运行以下命令来安装 EPPlus.License 包:
    Install-Package EPPlus.License
    
  3. 在代码中添加以下代码来设置许可证密钥:
    ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
    

    主要是声明一下用于非商业用途,否则会出现OfficeOpenXml.LicenseException 异常。

经过这一步,程序只能读取 .xlsx 格式的文件,而无法读取 .xls 格式的文件,是因为 EPPlus 库只支持 .xlsx 格式。EPPlus 是一个专门用于处理 Office Open XML 格式的库,不支持旧版的二进制格式(.xls)。对于读取和操作 .xls 格式的文件,可以考虑使用 NPOI,它支持处理多种 Excel 文件格式,包括 .xls.xlsx

使用 NPOI 库来读取包含 "star" 的单元格的示例代码:

using System;
using System.IO;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;

class Program
{
    static void Main(string[] args)
    {
        Console.Write("请输入文件夹路径:");
        string folderPath = Console.ReadLine(); // 获取用户输入的文件夹路径

        string[] files = Directory.GetFiles(folderPath, "*Test*.xls"); // 获取文件夹中名称中包含"Test"的Excel文件

        foreach (string file in files)
        {
            using (var fs = new FileStream(file, FileMode.Open, FileAccess.Read))
            {
                var workbook = new HSSFWorkbook(fs); // 使用 HSSFWorkbook 加载 .xls 文件

                for (int sheetIndex = 0; sheetIndex < workbook.NumberOfSheets; sheetIndex++)
                {
                    var sheet = workbook.GetSheetAt(sheetIndex);

                    for (int rowIndex = 0; rowIndex <= sheet.LastRowNum; rowIndex++)
                    {
                        var row = sheet.GetRow(rowIndex);

                        if (row != null)
                        {
                            for (int cellIndex = 0; cellIndex < row.LastCellNum; cellIndex++)
                            {
                                var cell = row.GetCell(cellIndex);

                                if (cell != null)
                                {
                                    var cellValue = GetCellValue(cell)?.ToString();

                                    if (!string.IsNullOrEmpty(cellValue) && cellValue.Contains("star"))
                                    {
                                        Console.WriteLine("文件: " + file);
                                        Console.WriteLine("Sheet名称: " + sheet.SheetName);
                                        Console.WriteLine("行号: " + (rowIndex + 1));
                                        Console.WriteLine("列号: " + (cellIndex + 1));
                                        Console.WriteLine("单元格内容: " + cellValue);
                                        Console.WriteLine();
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        Console.ReadLine();
    }

    private static object GetCellValue(ICell cell)
    {
        switch (cell.CellType)
        {
            case CellType.String:
                return cell.StringCellValue;
            case CellType.Numeric:
                if (DateUtil.IsCellDateFormatted(cell))
                    return cell.DateCellValue;
                else
                    return cell.NumericCellValue;
            case CellType.Boolean:
                return cell.BooleanCellValue;
            case CellType.Formula:
                return cell.CellFormula;
            default:
                return null;
        }
    }
}

使用 NPOI 库的 HSSFWorkbook 类来加载 .xls 格式的文件,并通过遍历工作表、行和单元格来查找包含 "FPGA的烧入文件(*.bin)" 的单元格。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

健身版程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值