Использование .NET для получения данных из Excel в виде базы данных

Я хочу получать данные из файлов Excel с помощью .NET. Файл Excel уже используется, поэтому я не могу его открыть. Что я делаю, так это подключаюсь к нему как к источнику данных с помощью OleDB.

Проблема в том, что я получаю данные ячейки, но не ее стиль. Значение даты в Excel изменяется на формат даты и времени в .NET, а ячейка, установленная в качестве валюты в Excel, отображается как целое число в .NET. При экспорте данных из Excel с помощью OleDB вы не знаете, содержит ли ячейка дату, валюту и т. Д. Например, если ячейка была задана как текст и содержала пять цифр, начинающихся с нуля, вы просто получите четыре цифры.

Я ищу способ получить данные так, как они выглядели бы, если бы вы просматривали данные в Excel.

Использование .NET 3.5 и Excel 2007.


person idophir    schedule 15.09.2009    source источник


Ответы (6)


Чтобы узнать тип данных столбцов, вы должны использовать метод FillSchema:

OleDbConnection conn = new OleDbConnection(...);
conn.Open();

DataSet dataSet = new DataSet();
OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT * FROM <table>", conn);
dataAdapter.FillSchema(dataSet, SchemaType.Source);
dataAdapter.Fill(dataSet);

//Now you can access the data type like this
dataSet.Tables[0].Columns[0].DataType
person Christian    schedule 16.09.2009

Посмотри пожалуйста:

person Mitch Wheat    schedule 15.09.2009
comment
Спасибо, но ничего из этого не решает мою проблему. Я знаю, как подключиться к Excel с помощью OleDB, но получаемые мной данные неполны, так как я не могу знать тип формата каждой ячейки. - person idophir; 16.09.2009
comment
OP действительно просит определить формат ячеек (в вопросе называется стилем), а не то, как подключиться через OLEDB. Хотя, если вы прочитаете 4 ссылки, предоставленные Митчем, это также даст вам ответ. - person Anonymous Type; 20.12.2010

SpreadsheetGear для .NET может открыть книгу Excel 2007 xlsx, в то время как в Excel 2007 эта книга открыта.

Excel хранит даты, время, валюту, числа и т. Д. Как числа (C # дублирует). Числовой формат сообщает Excel, как отображать число. Excel и SpreadsheetGear имеют свойство возвращать форматированный текст - Range.Text в Excel и IRange.Text в SpreadsheetGear.

SpreadsheetGear также имеет свойство, которое сообщает вам тип числового формата ячейки, чтобы вы могли определить, отформатирована ли ячейка как дата, валюта и т. Д., Если это важно для вашего приложения. См. Свойство IRange.NumberFormatType для получения дополнительной информации.

Вы можете загрузить бесплатную пробную версию здесь, если хотите попробовать.

Отказ от ответственности: я владею SpreadsheetGear LLC

person Joe Erickson    schedule 16.09.2009
comment
Спасибо, Джо. Я обязательно опробую ваш продукт и сообщу об этом. - person idophir; 18.09.2009

Для подключения к файлу Excel вам потребуется соответствующая строка подключения:

string connString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=<YourExcelPath>;Extended Properties=\"Excel 12.0;HDR=YES;\"";

После использования классов OleDb для запроса информации из файла:

string selectCmd = "SELECT * FROM <SheetName>";

using(OleDbConnection excelConn = new OleDbConnection(connString))
{
    excelConn.Open(); 
    OleDbCommand command = new OleDbCommand(selectCmd, excelConn);
    OleDbDataAdapter da = new OleDbDataAdapter(command);

    DataTable sheetInfo = new DataTable();
    dataAdapter.Fill(sheetInfo);

    //Do something with the data.
}

Поэтому вам нужно заменить «YourExcelPath» на путь к вашему файлу Excel, а «SheetName» - на имя листа, на котором вы хотите получить данные.

person Francis B.    schedule 15.09.2009

Это некрасиво, но вы можете использовать COM-взаимодействие в приложении Excel для чтения листа.

Это позволит вам получить доступ ко всему, что вам нравится в ячейках, но гораздо более подвержено ошибкам.

        System.Reflection.Missing ms = System.Reflection.Missing.Value;
        Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
        xlApp.Visible = true;
        Microsoft.Office.Interop.Excel.Workbook xlBook = xlApp.Workbooks.Open(@"C:\Demo.xlsx", ms, ms, ms, ms, ms, ms, ms, ms, ms, ms, ms, ms, ms, ms);
        Microsoft.Office.Interop.Excel.Worksheet xlSheet = xlBook.Sheets[1] as Microsoft.Office.Interop.Excel.Worksheet;
        Microsoft.Office.Interop.Excel.Range rng = xlSheet.Cells[1, 1] as Microsoft.Office.Interop.Excel.Range;
        System.Console.WriteLine(String.Format("{0} {1} {2}", rng.Value2, rng.Text, rng.NumberFormat));
        xlBook.Close(false, ms, ms);
        xlApp.Quit();

        System.Console.ReadLine();
person JDunkerley    schedule 16.09.2009
comment
Вопрос заключается в способе определения формата ячеек с помощью OLEDB, а не в том, как использовать другой метод (например, com interop). - person Anonymous Type; 20.12.2010

Вы можете использовать IMEX = 1 в строке подключения, чтобы все столбцы считывались как текст, а чем попытка OleDB определить тип данных.

Я считаю, что при этом будет соблюдено форматирование ячеек, содержащих числовые значения, но вы оставите это на ваше усмотрение для проверки и подтверждения.

person Joe    schedule 01.12.2018