在开始程序前需要安装 ExcelDataReader
和 ExcelDataReader.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
库之前,在程序的入口处或初始化代码中设置有效的许可证密钥。步骤如下:
- 打开 NuGet 管理器控制台(Tools -> NuGet Package Manager -> Package Manager Console)。
- 在控制台中运行以下命令来安装
EPPlus.License
包:Install-Package EPPlus.License
- 在代码中添加以下代码来设置许可证密钥:
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)" 的单元格。