Nuget
ClosedXMLをインストール
ファイルを開いてシート名をすべて表示
using ClosedXML.Excel;
try
{
    var filePath = @"c:\temp\Sample.xlsx";
    using (var workbook = new XLWorkbook(filePath))
    {
        Console.WriteLine($"シート数: {workbook.Worksheets.Count}");
        foreach (var sheet in workbook.Worksheets)
        {
            Console.WriteLine($"シート名: {sheet.Name}");
        }
    }
}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
}
Excelを開いていると、ファイルオープン時にエラーになるので・・・
読み取り専用で開く場合は、ClosedXML自体には機能がないので
FileStreamで読み取り専用で開いてそれを使って開くとよい
using ClosedXML.Excel;
try
{
    var filePath = @"c:\temp\Sample.xlsx";
    // 読み取りで開き、他ファイルは読み書きOKとする
    using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    {
        using (var workbook = new XLWorkbook(fileStream))
        {
            Console.WriteLine($"シート数: {workbook.Worksheets.Count}");
            foreach (var sheet in workbook.Worksheets)
            {
                Console.WriteLine($"シート名: {sheet.Name}");
            }
        }
    }
}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
}Excelで開いている間にClosedXMLで開くとエラーになるが、
CLosedXMLで開いている間にExcelは開くことが可能なので、処理して保存する際にエラーとなる可能性はある。
そういうケースを気にするのであれば、FileStreamで排他制御する必要あり。
using ClosedXML.Excel;
try
{
    var filePath = @"c:\temp\Sample.xlsx";
    // 読み書き開き、他ファイルは読み書き禁止とする
    using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
    {
        using (var workbook = new XLWorkbook(fileStream))
        {
            Console.WriteLine($"シート数: {workbook.Worksheets.Count}");
            foreach (var sheet in workbook.Worksheets)
            {
                Console.WriteLine($"シート名: {sheet.Name}");
            }
        }
    }
}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
}セルの操作
A1形式でアクセス
worksheet.Cell(2, "C").value行列でアクセス
worksheet.Cell(2, 3).value