Категория

Экспорт C# DataTable в CSV: 3 простых способа с примерами

2025-09-19 09:02:46 zaki zou

C# DataTable в CSV - Пошаговое руководство

Экспорт DataTable в CSV на C# — это распространенное требование для разработчиков, которым необходимо эффективно сохранять, обмениваться или анализировать табличные данные. Объект DataTable в .NET предоставляет структурированный способ хранения строк и столбцов в памяти, но часто вам нужно преобразовать эти данные в CSV-файл для Excel, инструментов отчетности или других систем.

В этом руководстве объясняются три простых метода экспорта DataTable в CSV на C#, дополненные пошаговыми инструкциями и практическими примерами кода. Независимо от того, работаете ли вы с небольшими наборами данных или большими таблицами производственного уровня, эти подходы помогут вам выполнить преобразование DataTable в CSV на C# быстро и надежно.

Содержание

Зачем экспортировать DataTable в CSV на C#

Экспорт DataTable в CSV на C# предлагает несколько ключевых преимуществ:

  • Универсальный формат данных – CSV поддерживается Excel, Google Sheets, базами данных и многими приложениями.
  • Читаемый и простой – В отличие от JSON или XML, CSV читаем человеком и легко редактируется вручную.
  • Бесшовная интеграция – Многие корпоративные приложения, CRM и инструменты отчетности принимают CSV-файлы.
  • Высокая производительность – Генерация CSV является легковесной и эффективной.
  • Межплатформенная совместимость – CSV-файлы можно открывать и обрабатывать в любой системе.

Метод 1: Ручное преобразование C# DataTable в CSV с использованием StringBuilder

Ручной экспорт DataTable в CSV на C# с использованием StringBuilder дает вам полный контроль над правилами форматирования и экранирования, что делает его идеальным для малых и средних наборов данных.

Шаги по преобразованию DataTable в CSV на C# с использованием StringBuilder

  • Создайте или получите DataTable из вашего источника (база данных, API или вручную).
  • Инициализируйте StringBuilder для хранения содержимого CSV.
  • Добавьте заголовки столбцов, перебирая DataTable.Columns.
  • Переберите строки DataTable и добавьте значение каждой ячейки.
  • Экранируйте специальные символы, такие как запятые, кавычки или новые строки.
  • Запишите итоговую строку в CSV-файл с помощью File.WriteAllText.

Пример кода

using System;
using System.Data;
using System.IO;
using System.Text;

namespace DataTableToCSV
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // -------------------------------
            // Шаг 1: Создание DataTable
            // -------------------------------
            DataTable table = new DataTable("Employees");

            // Определение столбцов: ID, Name, Department, Salary, JoinDate, Email
            table.Columns.Add("ID", typeof(int));
            table.Columns.Add("Name", typeof(string));
            table.Columns.Add("Department", typeof(string));
            table.Columns.Add("Salary", typeof(decimal));
            table.Columns.Add("JoinDate", typeof(DateTime));
            table.Columns.Add("Email", typeof(string));

            // Добавление примеров строк с более богатыми данными
            table.Rows.Add(1, "Alice Johnson", "HR", 60000, new DateTime(2019, 3, 15), "alice.johnson@example.com");
            table.Rows.Add(2, "Bob Smith", "IT", 75000, new DateTime(2018, 7, 22), "bob.smith@example.com");
            table.Rows.Add(3, "Charlie Brown", "Finance", 82000, new DateTime(2020, 1, 10), "charlie.brown@example.com");
            table.Rows.Add(4, "Diana Prince", "Marketing", 67000, new DateTime(2021, 5, 5), "diana.prince@example.com");
            table.Rows.Add(5, "Ethan Hunt", "Operations", 90000, new DateTime(2017, 9, 30), "ethan.hunt@example.com");
            table.Rows.Add(6, "Fiona Gallagher", "IT", 72000, new DateTime(2019, 11, 12), "fiona.gallagher@example.com");

            // -------------------------------
            // Шаг 2: Экспорт DataTable в CSV
            // -------------------------------
            string csvPath = "employees.csv";
            DataTableToCsv(table, csvPath);

            Console.WriteLine($"CSV-файл успешно создан: {csvPath}");
        }

        /// <summary>
        /// Преобразует DataTable в CSV-файл.
        /// </summary>
        /// <param name="dt">DataTable для экспорта</param>
        /// <param name="filePath">Путь, по которому будет сохранен CSV-файл</param>
        public static void DataTableToCsv(DataTable dt, string filePath)
        {
            // Используйте StringBuilder для эффективного построения содержимого CSV
            StringBuilder sb = new StringBuilder();

            // -------------------------------
            // Шаг 1: Добавление заголовков столбцов
            // -------------------------------
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                sb.Append(dt.Columns[i].ColumnName);
                if (i < dt.Columns.Count - 1) sb.Append(","); // Добавить запятую, кроме последнего столбца
            }
            sb.AppendLine();

            // -------------------------------
            // Шаг 2: Добавление строк
            // -------------------------------
            foreach (DataRow row in dt.Rows)
            {
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    string value;

                    // Форматирование столбцов DateTime как "yyyy-MM-dd"
                    if (dt.Columns[i].DataType == typeof(DateTime))
                    {
                        value = ((DateTime)row[i]).ToString("yyyy-MM-dd");
                    }
                    else
                    {
                        value = row[i].ToString();
                    }

                    // Экранирование специальных символов: запятых, кавычек, новых строк
                    if (value.Contains(",") || value.Contains("\"") || value.Contains("\n"))
                    {
                        value = "\"" + value.Replace("\"", "\"\"") + "\"";
                    }

                    sb.Append(value);

                    if (i < dt.Columns.Count - 1) sb.Append(",");
                }
                sb.AppendLine();
            }

            // -------------------------------
            // Шаг 3: Запись CSV-файла
            // -------------------------------
            File.WriteAllText(filePath, sb.ToString(), Encoding.UTF8);
        }
    }
}

Выходной CSV-файл

Выходной CSV, сгенерированный из DataTable с использованием C# и StringBulder

Метод 2: Экспорт большого C# DataTable в CSV с использованием StreamWriter

Для больших DataTable использование StringBuilder может быть ресурсоемким по памяти. StreamWriter позволяет записывать строки построчно, что эффективно для больших наборов данных.

Шаги для экспорта C# DataTable в CSV на основе StreamWriter

  • Создайте или получите ваш DataTable с необходимыми данными.
  • Инициализируйте StreamWriter с путем к выходному CSV-файлу и желаемой кодировкой (например, UTF-8).
  • Запишите строку заголовков, используя имена столбцов DataTable.
  • Переберите строки DataTable и запишите каждую строку в файл.
  • Экранируйте значения, содержащие специальные символы (запятые, кавычки, новые строки), чтобы сохранить целостность CSV.
  • Закройте StreamWriter, чтобы освободить системные ресурсы.

Пример кода

using System;
using System.Data;
using System.IO;
using System.Text;

namespace DataTableToCSV
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // -------------------------------
            // Шаг 1: Создание нового DataTable для этого примера
            // -------------------------------
            DataTable table = new DataTable("Products");

            // Определение столбцов: ProductID, ProductName, Category, Price, Stock, LaunchDate
            table.Columns.Add("ProductID", typeof(int));
            table.Columns.Add("ProductName", typeof(string));
            table.Columns.Add("Category", typeof(string));
            table.Columns.Add("Price", typeof(decimal));
            table.Columns.Add("Stock", typeof(int));
            table.Columns.Add("LaunchDate", typeof(DateTime));

            // Добавление примеров строк с различными продуктами
            table.Rows.Add(101, "Laptop Pro 15", "Electronics", 1500.99, 25, new DateTime(2023, 1, 10));
            table.Rows.Add(102, "Wireless Mouse", "Accessories", 29.95, 200, new DateTime(2022, 11, 5));
            table.Rows.Add(103, "Mechanical Keyboard", "Accessories", 79.99, 150, new DateTime(2022, 12, 1));
            table.Rows.Add(104, "4K Monitor", "Electronics", 399.50, 40, new DateTime(2023, 2, 20));
            table.Rows.Add(105, "USB-C Hub", "Accessories", 49.99, 300, new DateTime(2022, 9, 18));
            table.Rows.Add(106, "Gaming Chair", "Furniture", 259.99, 15, new DateTime(2023, 3, 5));

            // -------------------------------
            // Шаг 2: Экспорт DataTable в CSV с использованием StreamWriter
            // -------------------------------
            string csvPath = "products_stream.csv";
            DataTableToCsvStream(table, csvPath);

            Console.WriteLine($"CSV-файл успешно создан: {csvPath}");
        }

        /// <summary>
        /// Экспорт DataTable в CSV с использованием StreamWriter (эффективно для больших наборов данных)
        /// </summary>
        /// <param name="dt">DataTable для экспорта</param>
        /// <param name="filePath">Путь к CSV-файлу для сохранения</param>
        public static void DataTableToCsvStream(DataTable dt, string filePath)
        {
            // Используйте StreamWriter для эффективной по памяти записи (построчно)
            using (StreamWriter writer = new StreamWriter(filePath, false, Encoding.UTF8))
            {
                // -------------------------------
                // Шаг 1: Запись заголовков столбцов
                // -------------------------------
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    writer.Write(dt.Columns[i].ColumnName);
                    if (i < dt.Columns.Count - 1)
                        writer.Write(","); // Добавить запятую, кроме последнего столбца
                }
                writer.WriteLine();

                // -------------------------------
                // Шаг 2: Запись строк
                // -------------------------------
                foreach (DataRow row in dt.Rows)
                {
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        string value;

                        // Форматирование DateTime как yyyy-MM-dd
                        if (dt.Columns[i].DataType == typeof(DateTime))
                        {
                            value = ((DateTime)row[i]).ToString("yyyy-MM-dd");
                        }
                        else
                        {
                            value = row[i].ToString();
                        }

                        // Экранирование специальных символов: запятых, кавычек, новых строк
                        if (value.Contains(",") || value.Contains("\"") || value.Contains("\n"))
                        {
                            value = "\"" + value.Replace("\"", "\"\"") + "\"";
                        }

                        writer.Write(value);

                        if (i < dt.Columns.Count - 1)
                            writer.Write(",");
                    }
                    writer.WriteLine();
                }
                // StreamWriter автоматически закрывается в конце блока using
            }
        }
    }
}

Выходной CSV-файл

Выходной CSV, сгенерированный из DataTable с использованием C# и StringWriter

Метод 3: Использование Spire.XLS for .NET для преобразования DataTable в CSV на C#

Для готовых к производству приложений библиотеки, такие как Spire.XLS for .NET, предоставляют надежный и эффективный способ обработки экспорта C# DataTable в CSV. Библиотека автоматически обрабатывает специальные символы, разделители и кодировку, сокращая усилия по ручному кодированию и обеспечивая последовательный и точный вывод.

Начало работы со Spire.XLS for .NET

Чтобы использовать Spire.XLS в вашем проекте C#, установите его через NuGet:

  • Откройте ваш проект в Visual Studio.
  • Перейдите в Инструменты -> Диспетчер пакетов NuGet -> Управление пакетами NuGet для решения…
  • Найдите “Spire.XLS” и нажмите Установить.

Кроме того, вы можете быстро установить его с помощью консоли диспетчера пакетов:

Install-Package Spire.XLS

После установки вы можете без труда экспортировать DataTable в CSV и выполнять дальнейшие операции с полученными файлами, такие как преобразование CSV в Excel или импорт CSV обратно в DataTable, все это эффективно в ваших .NET-приложениях.

Шаги для экспорта C# Datatable в CSV на основе Spire.XLS

  • Подготовьте ваш DataTable с данными для экспорта.
  • Создайте объект Workbook, используя Spire.XLS.
  • Вставьте DataTable в рабочий лист.
  • Сохраните рабочий лист как CSV, указав разделитель и кодировку.

Пример кода

using Spire.Xls;
using System;
using System.Data;
using System.Text;

namespace DataTableToCSV
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // -------------------------------
            // Шаг 1: Создание нового DataTable для книг
            // -------------------------------
            DataTable dt = new DataTable("Books");

            // Определение столбцов: BookID, Title, Author, Genre, Price, PublishDate
            dt.Columns.Add("BookID", typeof(int));
            dt.Columns.Add("Title", typeof(string));
            dt.Columns.Add("Author", typeof(string));
            dt.Columns.Add("Genre", typeof(string));
            dt.Columns.Add("Price", typeof(double));
            dt.Columns.Add("PublishDate", typeof(DateTime));

            // Добавление примеров строк
            dt.Rows.Add(201, "The Great Gatsby", "F. Scott Fitzgerald", "Classic", 10.99, new DateTime(1925, 4, 10));
            dt.Rows.Add(202, "1984", "George Orwell", "Dystopian", 9.99, new DateTime(1949, 6, 8));
            dt.Rows.Add(203, "To Kill a Mockingbird", "Harper Lee", "Classic", 12.50, new DateTime(1960, 7, 11));
            dt.Rows.Add(204, "The Hobbit", "J.R.R. Tolkien", "Fantasy", 15.75, new DateTime(1937, 9, 21));
            dt.Rows.Add(205, "Clean Code", "Robert C. Martin", "Programming", 32.99, new DateTime(2008, 8, 1));
            dt.Rows.Add(206, "The Pragmatic Programmer", "Andrew Hunt", "Programming", 29.95, new DateTime(1999, 10, 20));

            // -------------------------------
            // Шаг 2: Создание Workbook и вставка DataTable
            // -------------------------------
            Workbook workbook = new Workbook();
            Worksheet sheet = workbook.Worksheets[0];

            // Вставка DataTable в рабочий лист, начиная с 1-й строки, 1-го столбца
            // Включение заголовков столбцов
            sheet.InsertDataTable(dt, true, 1, 1);

            // -------------------------------
            // Шаг 3: Сохранение рабочего листа как CSV
            // -------------------------------
            // Параметры: имя файла, разделитель, кодировка
            sheet.SaveToFile("books.csv", ",", Encoding.UTF8);

            // Освобождение ресурсов
            workbook.Dispose();
        }
    }
}

Выходной CSV-файл

Выходной CSV, сгенерированный из DataTable с использованием C# и библиотеки Spire.XLS

Преимущества использования Spire.XLS

  • Автоматическая обработка специальных символов, разделителей и кодировок – не требуется ручное экранирование.
  • Поддерживает как импорт, так и экспорт CSV, что делает его гибким для различных рабочих процессов.
  • Упрощает код производственного уровня – меньше шаблонного кода и меньше ошибок по сравнению с ручными методами.
  • Масштабируемость для больших наборов данных – эффективно работает даже с тысячами строк.

Сравнение производительности методов преобразования DataTable в CSV

Чтобы лучше понять сильные стороны и компромиссы каждого подхода, вот побочное сравнение StringBuilder, StreamWriter и Spire.XLS при экспорте DataTable в CSV.

Метод Лучше всего подходит для Производительность Использование памяти Сложность кода Примечания
StringBuilder Небольшие наборы данных (<10 тыс. строк) Средняя Высокое Умеренная Полный контроль над выводом, но менее эффективен для больших файлов
StreamWriter Большие наборы данных (10 тыс.+ строк) Высокая Низкое Умеренная Записывает построчно, предотвращает перегрузку памяти
Spire.XLS Производство и предприятия Высокая Оптимизированное Низкая Автоматически обрабатывает экранирование, кодировку и большие наборы данных

Какой метод следует использовать?

Хотя сравнительная таблица подчеркивает технические различия, выбор правильного метода зависит от вашего конкретного сценария, такого как размер набора данных, требования к производительности и производственные потребности.

  • Выберите StringBuilder, если вам нужен полный контроль над форматированием CSV и вы работаете с малыми и средними наборами данных.
  • Выберите StreamWriter, если вы экспортируете большие наборы данных и хотите получить решение, эффективное по памяти.
  • Выберите Spire.XLS, если вам нужен готовый к производству, надежный и не требующий особого обслуживания подход, особенно при обработке особых случаев или интеграции в корпоративные рабочие процессы.

Обработка особых случаев и лучшие практики для DataTable в CSV

При экспорте DataTable в CSV на C# важно следовать лучшим практикам, а также помнить о некоторых особых случаях, которые могут повлиять на ваш вывод CSV. Правильная обработка этих случаев гарантирует, что ваши файлы будут чистыми, надежными и простыми в использовании.

  • Обработка особых случаев    
    • Null-значения – Замените DBNull пустыми строками или заполнителями, чтобы отсутствующие данные не нарушали ваш CSV.
    • Пользовательские разделители – Если ваши данные содержат запятые, рассмотрите возможность использования ; или табуляции (\t), чтобы избежать путаницы.
    • Специальные символы – Значения с кавычками, запятыми или разрывами строк должны быть правильно экранированы для поддержания целостности CSV.
    • Вопросы кодировки – UTF-8 рекомендуется для большинства сценариев, но некоторым системам может потребоваться UTF-16 или ANSI.
    • Большие наборы данных – Для очень больших таблиц рассмотрите возможность разделения файлов или использования эффективных по памяти методов, таких как StreamWriter, чтобы избежать проблем с производительностью.
  • Лучшие практики
    • Придерживайтесь кодировки UTF-8 для совместимости между платформами и инструментами.
    • Тестируйте на особых случаях, таких как null, запятые, кавычки и многострочные значения, чтобы предотвратить непредвиденные ошибки.
    • Выберите правильный метод – StringBuilder хорошо работает для небольших таблиц, StreamWriter лучше подходит для больших наборов данных, а Spire.XLS идеален для готовых к производству решений.
    • Четко документируйте структуру вашего CSV, чтобы другие знали, как интерпретировать данные.

Заключение

Освоение преобразования C# DataTable в CSV — важный навык для разработчиков, работающих с табличными данными. В этом руководстве были рассмотрены три практических подхода: использование StringBuilder для небольших наборов данных, применение StreamWriter для эффективной и экономной по памяти обработки больших таблиц и использование библиотеки Spire.XLS для надежного, готового к производству решения, которое автоматически управляет сложными сценариями.

Следуя этим пошаговым примерам, вы можете уверенно выполнять преобразование C# DataTable в CSV, гарантируя, что ваши данные будут точными, доступными для совместного использования и готовыми к интеграции или дальнейшему анализу.

Часто задаваемые вопросы

Q1: Как я могу эффективно преобразовать DataTable в CSV на C#?

A1: Вы можете использовать три метода: ручное преобразование с помощью StringBuilder для небольших наборов данных, StreamWriter для больших наборов данных или библиотеку Spire.XLS для готового к производству решения. Каждый метод обеспечивает правильную обработку запятых, кавычек и новых строк.

Q2: Какой лучший способ экспортировать большие C# DataTable в CSV?

A2: Для больших наборов данных рекомендуется StreamWriter, поскольку он записывает строки построчно, сокращая использование памяти. Spire.XLS — еще один надежный вариант для производственных сред.

Q3: Как мне обрабатывать специальные символы и null-значения при экспорте DataTable в CSV на C#?

A3: Всегда экранируйте запятые, кавычки и разрывы строк. Заменяйте значения null или DBNull пустыми строками или заполнителями. Использование Spire.XLS автоматически обрабатывает большинство этих случаев.

Q4: Могу ли я настроить разделители и кодировку при экспорте DataTable в CSV?

A4: Да, вы можете указать разделители, такие как ,, ; или \t, и выбрать кодировку, такую как UTF-8, UTF-16 или ANSI, в зависимости от требований системы.

Q5: Почему я должен использовать Spire.XLS вместо ручных методов или StreamWriter?

A5: Spire.XLS упрощает экспорт в CSV, автоматически обрабатывая экранирование, разделители и кодировку, уменьшает сложность кода и идеально подходит для средних и больших наборов данных или приложений производственного уровня.

Q6: Как мне убедиться, что мой экспортированный CSV-файл совместим с Excel и другими приложениями?

A6: Используйте кодировку UTF-8, экранируйте специальные символы и последовательно форматируйте заголовки. Тестирование вывода в Excel или других целевых приложениях помогает избежать проблем совместимости.

Смотрите также