Использование .NET для получения данных из Excel в качестве базы данных - PullRequest
3 голосов
/ 15 сентября 2009

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

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

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

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

Ответы [ 6 ]

5 голосов
/ 16 сентября 2009

Чтобы узнать тип данных столбцов, вы должны использовать метод 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
1 голос
/ 16 сентября 2009

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

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

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

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

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

0 голосов
/ 01 декабря 2018

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

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

0 голосов
/ 16 сентября 2009

Это не красиво, но вы можете использовать COM Interop в приложении 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();
0 голосов
/ 15 сентября 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» - именем листа, на который вы хотите получить данные.

...