Чтение файла Excel на C# — распространённая задача для отчётов, импорта данных и автоматизации. С помощью Free Spire.XLS for .NET, бесплатной версии для сообщества, вы можете загрузить книгу Excel и прочитать её данные без установки Microsoft Excel на компьютер и без использования Interop. В этой статье показано, как читать ячейки, листы и строки, экспортировать лист в DataTable и обрабатывать результаты формул.
Быстрый старт: чтение файла Excel на C#
Установите Free Spire.XLS for .NET из NuGet. Выполните эту команду в терминале:
dotnet add package FreeSpire.XLS
Или выполните эту команду в консоли диспетчера пакетов NuGet:
Install-Package FreeSpire.XLS
Вы также можете скачать Free Spire.XLS for .NET и подключить DLL вручную или найти пакет на NuGet.
В следующем примере загружается файл Excel, получается первый лист и выводится значение ячейки A1. Замените input.xlsx на полный путь к вашему файлу или убедитесь, что файл находится в текущем рабочем каталоге программы.
using System;
using Spire.Xls;
class Program
{
static void Main()
{
Workbook workbook = new Workbook();
try
{
// Load an existing Excel file
workbook.LoadFromFile("input.xlsx");
// Get the first worksheet
Worksheet sheet = workbook.Worksheets[0];
// Read the value of cell A1 (row 1, column 1)
string value = sheet.Range[1, 1].Value;
Console.WriteLine("Cell A1: " + value);
}
finally
{
workbook.Dispose();
}
}
}
Workbook.LoadFromFile() считывает файл в память. Worksheets[0] возвращает первый лист, а Range[1, 1].Value возвращает текстовое значение ячейки в первой строке и первом столбце. Блок finally освобождает ресурсы книги, когда вы закончите.

Чтение конкретной ячейки или листа
В следующих примерах предполагается, что workbook уже загружен с помощью LoadFromFile(). Они показывают, как получить доступ к листу по индексу или имени.
Файл Excel может содержать несколько листов. Вы можете получить лист по его позиции или имени:
// By index (zero-based): the first sheet is 0, the second is 1
Worksheet first = workbook.Worksheets[0];
// By name
Worksheet sales = workbook.Worksheets["Sales"];
Вы также можете прочитать ячейку по номерам строки и столбца или по её адресу в Excel:
// By row and column numbers (one-based): row 2, column 3
string byIndex = sales.Range[2, 3].Value;
// By Excel address
string byAddress = sales.Range["C2"].Value;
Обратите внимание на две разные точки отсчёта. Коллекция листов использует индексацию с нуля, поэтому первый лист — Worksheets[0]. Номера строк и столбцов ячеек используют индексацию с единицы, поэтому Range[1, 1] — это ячейка A1.
Чтобы прочитать блок ячеек, передайте адрес диапазона и пройдите по нему циклом:
CellRange range = sales.Range["A1:C3"];
foreach (CellRange cell in range.CellList)
{
Console.WriteLine({BODY_CONTENT}quot;{cell.RangeAddress}: {cell.Value}");
}
Чтение данных Excel строка за строкой в C#
Чтобы прочитать все данные на листе, пройдите по строкам во внешнем цикле и по столбцам во внутреннем цикле. Добавляйте разрыв строки после каждой строки, чтобы вывод в консоли сохранял структуру листа:
using System;
using Spire.Xls;
class Program
{
static void Main()
{
Workbook workbook = new Workbook();
try
{
workbook.LoadFromFile("input.xlsx");
Worksheet sheet = workbook.Worksheets[0];
for (int row = 1; row <= sheet.LastDataRow; row++)
{
for (int col = 1; col <= sheet.LastDataColumn; col++)
{
Console.Write({BODY_CONTENT}quot;{sheet.Range[row, col].Value}\t");
}
Console.WriteLine();
}
}
finally
{
workbook.Dispose();
}
}
}
Циклы выполняются от строки 1 и столбца 1 до LastDataRow и LastDataColumn, которые возвращают последнюю строку и столбец, содержащие данные. Это позволяет не включать отформатированные, но пустые ячейки, которые охватили бы LastRow и LastColumn. Если ваш лист имеет необычную структуру, проверьте фактический диапазон в тестовом файле перед обработкой вывода.
Для листа, содержащего приведённые ниже примерные данные:
| Товар | Категория | Цена |
|---|---|---|
| Клавиатура | Аксессуары | 25 |
| Монитор | Дисплеи | 180 |
консоль показывает каждую строку листа на отдельной строке, а значения ячеек разделены табуляцией:
Product Category Price
Keyboard Accessories 25
Monitor Displays 180

Чтение данных Excel в DataTable
Если вы хотите обрабатывать данные листа с помощью ADO.NET, привязать их к элементу управления или вставить в базу данных, экспортируйте лист в DataTable с помощью ExportDataTable():
using System;
using System.Data;
using Spire.Xls;
class Program
{
static void Main()
{
Workbook workbook = new Workbook();
try
{
workbook.LoadFromFile("input.xlsx");
// Recalculate formulas before exporting computed values
workbook.CalculateAllValue();
Worksheet sheet = workbook.Worksheets[0];
DataTable dataTable = sheet.ExportDataTable(
sheet.AllocatedRange,
true, // exportColumnNames
true // computedFormulaValue
);
// Print each row to verify the exported data
foreach (DataRow row in dataTable.Rows)
{
Console.WriteLine(string.Join("\t", row.ItemArray));
}
}
finally
{
workbook.Dispose();
}
}
}
Эта перегрузка принимает три параметра:
-
range: диапазон ячеек для экспорта.
sheet.AllocatedRangeвозвращает используемый диапазон листа. В зависимости от форматирования книги и настроек используемого диапазона он может включать пустые ячейки. Если вам нужен только определённый регион данных, используйте явный диапазон и проверьте его границы. -
exportColumnNames: если
true, первая строка диапазона становится названиями столбцовDataTable. Еслиfalse, первая строка экспортируется как обычные данные. -
computedFormulaValue: если
true, экспортер использует вычисленные значения формул вместо текста формул. Еслиfalse, ячейки с формулами экспортируются как текст формул. Если ваши данные содержат формулы, проверьте экспортированные значения в собственном тестовом файле — возможно, перед экспортом потребуется запустить вычисление формул, чтобы результаты заполнились правильно.
Чтобы показать результат в приложении Windows Forms, назначьте таблицу DataGridView:
dataGridView1.DataSource = dataTable;
Проверьте названия столбцов и типы данных экспортированной таблицы, сверившись с вашим файлом Excel, прежде чем полагаться на них в дальнейшей обработке. Дополнительные возможности, например экспорт определённого диапазона, см. в подробном руководстве по преобразованию Excel в DataTable в C#.

Чтение результатов формул и обработка значений ячеек
Фрагменты в этом разделе предполагают, что sheet ссылается на лист из загруженной книги, как в предыдущих примерах.
Ячейка, содержащая формулу, имеет две вещи, которые вы можете захотеть прочитать: саму формулу и результат, который она выдаёт. Используйте HasFormula, чтобы проверить, содержит ли ячейка формулу, Formula, чтобы получить текст формулы, и FormulaValue, чтобы получить вычисленный результат. Если вам нужны актуальные результаты формул, вызовите workbook.CalculateAllValue() после загрузки книги и перед чтением FormulaValue.
CellRange cell = sheet.Range["D2"];
if (cell.HasFormula)
{
Console.WriteLine("Formula: " + cell.Formula);
Console.WriteLine("Result: " + cell.FormulaValue);
}
else
{
Console.WriteLine("Value: " + cell.Value);
}
Подробнее о работе с формулами см. в разделе Добавление и чтение формул и функций в Excel.

Ячейки с разными типами содержимого можно прочитать через типизированные свойства:
CellRange priceCell = sheet.Range["C2"];
CellRange dateCell = sheet.Range["E2"];
double price = priceCell.NumberValue; // numeric value
DateTime date = dateCell.DateTimeValue; // date value
string text = sheet.Range["A2"].Text; // text as displayed
Excel хранит числа и даты иначе, чем обычный текст, поэтому выбирайте свойство, соответствующее типу данных в ячейке.
Чтение числовых форматов и отображаемых значений
Для ячеек с числовыми форматами — процентами, валютой, датами — сохранённое значение, код формата и отформатированный текст могут различаться. Ячейка, в которой хранится 0.15 с процентным форматом, отображается как 15%. Используйте Value для необработанного значения, NumberFormat для кода формата и NumberText для текста в том виде, в каком он отображается в Excel:
| Свойство | Что возвращает |
|---|---|
Value |
Необработанное значение ячейки |
NumberFormat |
Код числового формата (например, 0.00%) |
NumberText |
Текст после применения формата (например, 15%) |
CellRange cell = sheet.Range["C2"];
Console.WriteLine("Value: " + cell.Value);
Console.WriteLine("Number format: " + cell.NumberFormat);
Console.WriteLine("Formatted text: " + cell.NumberText);
Выбирайте свойство, соответствующее потребностям вашей последующей логики: числовое значение для вычислений или отформатированный текст для отображения. Подробнее о числовых форматах см. в разделе Установка числового формата в Excel.
Перед чтением ячейки можно проверить, пуста ли она:
if (string.IsNullOrEmpty(sheet.Range["B5"].Value))
{
Console.WriteLine("B5 is empty.");
}
Часто задаваемые вопросы
Можно ли читать файлы Excel на C# без установки Microsoft Excel?
Да. Free Spire.XLS читает файлы Excel напрямую и не требует Microsoft Excel или Interop на компьютере или сервере, где выполняется ваш код.
Как читать результаты формул вместо самих формул?
Для одной ячейки проверьте CellRange.HasFormula и прочитайте CellRange.FormulaValue. Чтобы прочитать весь лист, вызовите ExportDataTable() с computedFormulaValue, установленным в true. См. Чтение результатов формул и обработка значений ячеек.
Можно ли читать защищённые паролем файлы Excel?
Да. Установите пароль для открытия перед загрузкой файла:
Workbook workbook = new Workbook();
workbook.OpenPassword = "your-password";
workbook.LoadFromFile("protected.xlsx");
Какие форматы файлов Excel поддерживает Free Spire.XLS?
Free Spire.XLS поддерживает форматы .xls, .xlsx и .xlsm.
Каковы ограничения бесплатной версии?
Free Spire.XLS for .NET — это версия для сообщества для индивидуальных разработчиков и небольших проектов. При работе с форматом .xls каждая книга ограничена 5 листами и 200 строками на лист. Загрузка и сохранение файлов .xlsx не подпадают под эти ограничения. Для большей ёмкости или расширенных возможностей доступна Spire.XLS for .NET в качестве коммерческой версии.
Если вам нужна большая ёмкость или расширенные возможности, Spire.XLS for .NET — это коммерческая версия; вы можете запросить бесплатную 30-дневную пробную лицензию, чтобы оценить её.