C# Excel импорт данных из CSV в Excel

как импортировать данные в Excel из CSV-файла с помощью C#? На самом деле, то, что я хочу достичь, похоже на то, что мы делаем в Excel, вы идете в данные tab, а затем выберите Текст вариант, а затем использовать текст по столбцам опция и выберите CSV, и он делает магию и все такое. Я хочу автоматизировать его.

6 ответов


вы можете открыть Excel, начать запись макроса, делать то, что вы хотите, а затем посмотреть, что записал макрос. Это должно сказать вам, какие объекты использовать и как их использовать.


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

Я просто попытался открыть файл, быстро в Excel и она отлично работает. Так что вам действительно нужно просто позвонить в Workbook.Откройте () с помощью файла с расширением CSV.


Я верю, что есть две части, одна из которых-операция разделения для csv, которую другой ответчик уже взял, что я не думаю, что это важно, но я все равно включу. И большой из них-запись в файл excel, который я смог заставить работать, но при определенных обстоятельствах, и это было больно выполнить.

CSV довольно прост, вы можете сделать строку.разделите на запятую, если хотите. Тем не менее, этот метод ужасно сломан, хотя я признаю Я использовал его сам, в основном потому, что я также контролирую исходные данные и знаю, что никакие кавычки или escape-символы никогда не появятся. Я включил ссылку на статью о правильном анализе csv, однако я никогда не тестировал источник или полностью проверял код сам. Я с успехом использовал другой код того же автора. http://www.boyet.com/articles/csvparser.html

вторая часть намного сложнее, и была огромной болью для меня. Подход я взял было чтобы использовать драйвер jet для обработки файла excel как базы данных, а затем запустить SQL-запросы к нему. Есть несколько ограничений, которые могут привести к тому, что это не соответствует вашей цели. Я хотел использовать готовые шаблоны файлов excel для отображения данных и некоторых предустановленных функций и графиков. Для этого у меня есть несколько вкладок данных отчета и одна вкладка, которая является raw_data. Моя программа записывает на вкладку raw_data, а все остальные вычисления вкладок указывают на ячейки в этой таблице. Я пойду в некоторые из рассуждений об этом поведении после кода:

во-первых, импорт (не все могут потребоваться, это вытащено из файла большего класса, и я не правильно прокомментировал, что было для чего):

using System.IO;
using System.Diagnostics;
using System.Data.Common;
using System.Globalization;

Далее нам нужно определить строку подключения, мой класс уже имеет ссылку FileInfo на этот момент на файл, который я хочу использовать, так что это то, что я передаю. Можно искать в google, для чего все параметры, но в основном использовать драйвер Jet (должен быть доступно в любой установке windows), чтобы открыть файл excel, Как вы ссылаетесь на базу данных.

string connectString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={filename};Extended Properties=""Excel 8.0;HDR=YES;IMEX=0""";
connectString = connectString.Replace("{filename}", fi.FullName);

теперь давайте откроем соединение с БД и будем готовы запускать команды на БД:

DbProviderFactory factory = DbProviderFactories.GetFactory ("System.Данные.OleDb");

using (DbConnection connection = factory.CreateConnection())
{
  connection.ConnectionString = connectString;
  using (DbCommand command = connection.CreateCommand())
  {
    connection.Open();

Далее нам нужна фактическая логика для вставки БД. Поэтому в основном бросайте запросы в цикл или что бы вы ни логика, и вставьте данные строк.

string query = "INSERT INTO [raw_aaa$] (correlationid, ipaddr, somenum) VALUES (\"abcdef", \"1.1.1.1", 10)";
command.CommandText = query;
command.ExecuteNonQuery();

теперь вот действительно раздражающая часть, драйвер excel пытается обнаружить, что вы тип столбца перед вставкой, поэтому, даже если вы передадите правильное целочисленное значение, если excel думает, что тип столбца-текст, он вставит все, что вы числа как текст, и это очень трудно получить это рассматривается как число. Таким образом, excel уже должен иметь тип столбца в качестве числа. Чтобы выполнить это, для моего файла шаблона я заполняю первые 10 строк фиктивными данными, так что когда вы загружаете файл в драйвер jet, он может определить правильные типы и использовать их. Тогда все мои forumals ссылки на мой CSV таблица будет работать, так как значения имеют правильный тип. Это может сработать для вас, если вы цели похожи на мои, и использовать шаблоны, которые уже указывают на эти данные (просто начните с строки 10 вместо строки 2).

из-за этого моя вкладка raw_aaa в excel может выглядеть примерно так: correlationid ipaddr somenum abcdef 1.1.1.1 Пять abcdef 1.1.1.1 5 abcdef 1.1.1.1 5 abcdef 1.1.1.1 5 abcdef 1.1.1.1 5 abcdef 1.1.1.1 5 abcdef 1.1.1.1 5 abcdef 1.1.1.1 5

Примечание строка 1-это имена столбцов, на которые я ссылался в своих SQL-запросах. Я думаю, что можно обойтись без этого, но это потребует немного больше исследований. Уже имея эти данные в файле excel, столбец somenum будет обнаружен как число, и любые вставленные данные будут правильно относиться как таковой.

Antoher обратите внимание, что это раздражает, драйвер Jet только 32-бит, поэтому в моем случае, когда у меня была явная 64-битная программа, Я не смог выполнить это напрямую. Таким образом, у меня был неприятный взлом записи в файл, а затем запустить программу, которая вставит данные в файл в мой шаблон excel.

в целом, я думаю, что решение довольно неприятно, но до сих пор не нашли лучшего способа сделать это, к сожалению. Удачи!


вы можете взглянуть на TakeIo.Электронная таблица .NET library. Он принимает файлы из Excel 97-2003, Excel 2007 и новее, а также формат CSV (разделители с запятой или запятой).

пример:

var inputFile = new FileInfo("Book1.csv"); // could be .xls or .xlsx too
var sheet = Spreadsheet.Read(inputFile);

foreach (var row in sheet)
{
    foreach (var cell in row)
    {
        // do something
    }
}

вы можете удалить начальные и конечные пустые строки, а также начальные и конечные столбцы из импортированных данных с помощью Normalize() функция:

sheet.Normalize();

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

sheet.RemoveEmptyRows();

есть Serialize() функция для преобразования любого ввода в CSV тоже:

var outfile = new StreamWriter("AllData.csv");
sheet.Serialize(outfile);

если вы хотите использовать запятую вместо точки с запятой в CSV-файл, сделайте следующее:

sheet.Serialize(outfile, ',');

и да, есть еще



ну, импорт из CSV не должен быть большим делом. Я думаю, что самым основным методом было бы сделать это с помощью строковых операций. Вы можете построить довольно прекрасный парсер, используя простую команду Split () и получить материал в массивах.