Чтение данных из XLSX в С#

Я новичок в С# и пытаюсь прочитать файл XLSX в С# со следующим кодом:

string Connection = "Provider=Microsoft.ACE.OLEDB.12.0;DataSource=c:\\Temp\\source.xlsx;Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=1\";";

//code to read the content of format file 
OleDbConnection con = new OleDbConnection(Connection);
OleDbCommand command = new OleDbCommand();

DataTable dt = new DataTable();
OleDbDataAdapter myCommand = new OleDbDataAdapter("select * from [Tabelle1$]", con);

myCommand.Fill(dt);
Console.Write(dt.Rows.Count);

Я получаю правильный счет из вывода, но у меня есть еще 2 вопроса:

1. Как сделать оператор select where (как получить доступ к строкам)?

 select * from [Tabelle1$] where A = '123' (A being an existing Excel row)

выдаст ошибку с указанием неверных параметров...

2. Может ли кто-нибудь предоставить мне ссылку на учебник или краткий пример того, как получить доступ к данным?


person RRZ Europe    schedule 04.05.2011    source источник
comment
проверьте это руководство support.microsoft.com/kb/316934 от MS.   -  person Eugen    schedule 04.05.2011
comment
Убедитесь, что вы очень хорошо прочитали учебник, на который ссылается Евгений. Вы поймете, почему A = '123' не работает (но переключение HDR = No и запись WHERE F1 = '123' будут)   -  person nantito    schedule 04.05.2011
comment
Я заставил его работать с F1, но не понимаю, почему A не работает и как получить доступ к именам таблиц по умолчанию...   -  person RRZ Europe    schedule 05.05.2011
comment
HDR показывает, есть ли строка заголовка. Если для него установлено значение YES, это означает, что вместо автоматической установки F1, F2... у вас будет ячейка первой строки в качестве индикатора имени столбца.   -  person nantito    schedule 05.05.2011
comment
Что касается вопроса, почему A, B... не работают, я сделаю дикое предположение. При выборе данных в OleDbDataAdapter вы можете определить свой лист после оператора FROM. Там же вы можете добавить желаемый диапазон (как показано в ссылке). Теперь результатом такого выбора будет структура данных, не имеющая связи с именами столбцов Excel по умолчанию. Было бы отстойно, если бы вы могли написать SELECT * FROM [Tabelle1$A1:B10], где C = '123' (это не имеет никакого смысла).   -  person nantito    schedule 05.05.2011


Ответы (2)


Пожалуйста, обратитесь к следующему примеру кода:

private DataTable LoadXLS(string strFile, String sheetName, String column, String value)
{
    DataTable dtXLS = new DataTable(sheetName);

    try
    {
       string strConnectionString = "";

       if(strFile.Trim().EndsWith(".xlsx")) {

           strConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", strFile);

       } else if(strFile.Trim().EndsWith(".xls")) {

           strConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";", strFile);

       }

       OleDbConnection SQLConn = new OleDbConnection(strConnectionString);

       SQLConn.Open();

       OleDbDataAdapter SQLAdapter = new OleDbDataAdapter();

       string sql = "SELECT * FROM [" + sheetName + "$] WHERE " + column + " = " + value;

       OleDbCommand selectCMD = new OleDbCommand(sql, SQLConn);

       SQLAdapter.SelectCommand = selectCMD;

       SQLAdapter.Fill(dtXLS);

       SQLConn.Close();
    }

    catch (Exception e)
    {
       Console.WriteLine(e.ToString());
    }

    return dtXLS;

}
person Romil Kumar Jain    schedule 25.04.2012
comment
Где я могу скачать поставщика oledb? - person Johnny_D; 12.10.2012
comment
Загрузите с сайта microsoft.com/en-us/download/details. aspx?id=13255. 32-битная или 64-битная зависит от ОС. - person Romil Kumar Jain; 12.10.2012
comment
Вы забыли закрыть SQLConn в finally или с помощью. Итак, в вашем коде есть утечки памяти. Для тех, кто его реализует: измените OleDbConnection SQLConn = new OleDbConnection(strConnectionString); на using OleDbConnection SQLConn = new OleDbConnection(strConnectionString) { и добавьте закрывающий } после SQLConn.Close();. - person Tedd Hansen; 05.01.2016

Я знаю, что это старый вопрос с отличным ответом, но эта страница заняла первое место в результатах Google для «импорта xlsx c#», поэтому я хотел добавить более современный и простой способ чтения данных xls/xlsx с использованием библиотеки NPOI. Я хочу убедиться, что новые разработчики C# знают, что есть более простой способ импортировать данные Excel, а не использовать ado.net.

Я использую комбинацию NPOI и Npoi.Mapper (от donnytian: https://github.com/donnytian/Npoi.Mapper), чтобы с легкостью импортировать файлы Excel. Добавьте ссылку nuget на NPOI и Npoi.Mapper, а затем вы сможете импортировать данные xls/xlsx, используя строго типизированные классы, которые напрямую соотносятся со столбцами, которые вы хотите импортировать.

``используя System.IO; с помощью System.Linq; с помощью Npoi.Mapper; используя Npoi.Mapper.Attributes; используя NPOI.SS.UserModel; использование UserManagementService.Models;

пространство имен JobCustomerImport.Processors { открытый класс ExcelEmailProcessor { частный UserManagementServiceContext DataContext { get; }

    public ExcelEmailProcessor(int customerNumber)
    {
        DataContext = new UserManagementServiceContext();
    }

    public void Execute(string localPath, int sheetIndex)
    {
        IWorkbook workbook;
        using (FileStream file = new FileStream(localPath, FileMode.Open, FileAccess.Read))
        {
            workbook = WorkbookFactory.Create(file);
        }

        var importer = new Mapper(workbook);
        var items = importer.Take<MurphyExcelFormat>(sheetIndex);
        foreach(var item in items)
        {
            var row = item.Value;
            if (string.IsNullOrEmpty(row.EmailAddress))
                continue;

            UpdateUser(row);
        }

        DataContext.SaveChanges();
    }

    private void UpdateUser(MurphyExcelFormat row)
    {
        //LOGIC HERE TO UPDATE A USER IN DATABASE...
    }

    private class MurphyExcelFormat
    {
        [Column("District")]
        public int District { get; set; }

        [Column("DM")]
        public string FullName { get; set; }

        [Column("Email Address")]
        public string EmailAddress { get; set; }

        [Column(3)]
        public string Username { get; set; }

        public string FirstName
        {
            get
            {
                return Username.Split('.')[0];
            }
        }

        public string LastName
        {
            get
            {
                return Username.Split('.')[1];
            }
        }
    }
}

} ```

Если вам интересно, я рассказал о некоторых тонкостях в своем блоге: Как легко импортировать файлы Excel.

Спасибо! Дэн

person Dan    schedule 29.11.2018