Категория

Чтение файлов Excel в C# без установки Excel

2024-01-25 07:15:38 Jack Du
AI Summarize:
ChatGPT
ChatGPT ✓
Claude ✓
Grok ✓
Perplexity ✓
Quick
Quick
Concise overview
Highlights
Key takeaways
Detailed
Structured explanation
Brief
One sentence summary
Summarize |

Чтение файла 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 освобождает ресурсы книги, когда вы закончите.

Read Excel cell A1 value in C# with Free Spire.XLS — console output

Чтение конкретной ячейки или листа

В следующих примерах предполагается, что 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

Read Excel data row by row in C# with Free Spire.XLS — console output

Чтение данных 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#.

Export Excel data to DataTable and display in DataGridView — C# Free Spire.XLS

Чтение результатов формул и обработка значений ячеек

Фрагменты в этом разделе предполагают, что 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.

Read Excel formula results in C# with Free Spire.XLS — console output

Ячейки с разными типами содержимого можно прочитать через типизированные свойства:

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-дневную пробную лицензию, чтобы оценить её.

См. также