Здравствуйте, Ransom Stark, Вы писали:
RS>Здравствуйте, Аноним, Вы писали:
А>>Как можно работать с excell-ем из C#? в частности интересует как можно из excell-файла вытащить из каждой закладки DataTable с данными?
RS>я делаю примерно так.
RS>RS> private const int SheetNumber = 0;
RS> private static string GetConnectionString(string path)
RS> {
RS> return string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=No;IMEX=1""", path);
RS> }
RS> private static string GetSheetName(OleDbConnection connection)
RS> {
RS> System.Data.DataTable sheets = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[]{null, null, null, "TABLE"});
RS> string result = "[" + sheets.Rows[SheetNumber]["TABLE_NAME"].ToString() + "]";
RS> return result;
RS> }
RS> private static OleDbCommand GetCommand(OleDbConnection connection)
RS> {
RS> string commandText = "SELECT * FROM " + GetSheetName(connection);
RS> OleDbCommand result = new OleDbCommand(commandText, connection);
RS> return result;
RS> }
RS> public static DataTable GetExcelTable(OleDbConnection connection)
RS> {
RS> connection.Open();
RS> OleDbCommand command = GetCommand(connection);
RS> OleDbDataAdapter adapter = new OleDbDataAdapter(command);
RS> DataSet ds = new DataSet();
RS> adapter.Fill(ds);
RS> return ds.Tables[0];
RS> }
RS>
можно-то можно, так и делается, только данные не всегда правильно интерпретируются, о чем собсно выше и написано
плюс данный код можно упростить, так как нет необходимости создавать DataSet в adapter.Fill можно и DataTable передавать
> Здравствуйте, Peter Fleischer, Вы писали:
>
> PF>Если нельзя представить "чистые" таблицы, то имеются только два
> выхода: автоматизация Excel или представление таблицы в виде csv-file
> с последующей загрузкой в DataTable при использовании schema.ini. В
> обоих случаях можно брать содержание клетки как String и потом на
> собственное усмотрение проебразовать.
>
> а можно как-то по подробнее об schema.ini? что это такое? и как оным
> пользоваться?
см.
ms-help://MS.MSDNQTR.2004APR.1033/odbc/htm/odbcjetschema_ini_file.htm
ODBC Drivers
Schema.ini File (Text File Driver)
в schema.ini можешь описать каждый столбец для импорта. Если используешь только текст, то потом сам можешь в своей программе "читсить" данные.
Peter
Posted via RSDN NNTP Server 1.8
Здравствуйте, Peter Fleischer, Вы писали:
PF>см.
PF>ms-help://MS.MSDNQTR.2004APR.1033/odbc/htm/odbcjetschema_ini_file.htm
PF>ODBC Drivers
PF>Schema.ini File (Text File Driver)
PF>в schema.ini можешь описать каждый столбец для импорта. Если используешь только текст, то потом сам можешь в своей программе "читсить" данные.
PF>Peter
у меня нет MSDN-на 2004, у меня старенький, а пример того как schema.ini должна выглядеть и как потом используется хочется заиметь, так что может запостишь из этой статьи пример?
> Здравствуйте, Peter Fleischer, Вы писали:
...
> у меня нет MSDN-на 2004, у меня старенький, а пример того как
> schema.ini должна выглядеть и как потом используется хочется заиметь,
> так что может запостишь из этой статьи пример?
А что? Интернет у тебя не работает? Как же ты выходишь на rsdn?
Schema.ini File (Text File Driver) (Microsoft Open Database Connectivity (ODBC))
The Microsoft® Open Database Connectivity (ODBC) interface is a C programming language interface that makes it possible for applications to access data from a variety of database management systems (DBMSs).
http://msdn.microsoft.com/library/en-us/odbc/htm/odbcjetschema_ini_file.asp
Other Text File Driver Programming Details (Microsoft Open Database Connectivity (ODBC))
The Microsoft® Open Database Connectivity (ODBC) interface is a C programming language interface that makes it possible for applications to access data from a variety of database management systems (DBMSs).
http://msdn.microsoft.com/library/en-us/odbc/htm/odbcjetother_text_file_driver_programming_details.asp
149090 — ACC: How to Use Schema.ini for Accessing Text Data
This article show you how to use a Schema.ini file and Data Access Objects (DAO) to programmatically open or link to a text file. A Schema.ini file contains the specifics on how data is formatted in a particular text file and is used by the Text ISAM...
http://support.microsoft.com/default.aspx?scid=kb;en-us;149090
Peter
Posted via RSDN NNTP Server 1.8
Здравствуйте, Peter Fleischer, Вы писали:
>> Здравствуйте, Peter Fleischer, Вы писали:
PF>...
>> Я вижу два пути: 1 — попытаться как-то в SQL-запросе что-то такое
>> написать, чтобы все данные в строку конвертились, но этого мне пока
>> сделать не удалось в силу того, что запрос к xcl-файлу своеобразный и
>> отличается от обычного запроса; 2 — попытаться воспользоваться
>> OleDbDataReader-ом, пока не пробовал
Есть три опробованных варианта.
1. Экспортировать данные в CVS.
2. Работать с Excel через PIA (primary interop assembly:
http://www.microsoft.com/downloads/details.aspx?FamilyId=C41BD61E-3060-4F71-A6B4-01FEBA508E52&displaylang=en). Это наиболее гибкий, но тяжеловесный способ. Если на Office не установлен "Language Pack" для текущей локали, то у потока, работающего с Excel, нужно установить английскую локаль, иначе многие функции не будут работать.
CultureInfo oldCI = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = new CultureInfo( "en-US" );
try
{
}
finally
{
Thread.CurrentThread.CurrentCulture = oldCI;
}
Установка локали мне в основном помогла, но часть функций всёравно бросала такой же exception, что и до установки.
3. Обработать каждый XLS файл приведённым ниже макросом (выделить столбцы с данными и запустить макрос). В результате OLEDB провайдер будет распознавать данные как String, что даст возможность их распарсить самостоятельно ничего при этом не потеряв.
Public Sub SetAsText()
If Application.Selection Is Nothing Then
MsgBox "No columns are selected.", vbExclamation Or vbOKOnly, "Error"
Exit Sub
End If
Dim rngSel As Range: Set rngSel = Application.Selection
If rngSel.Columns.Count <> 1 Then
MsgBox "Select one column with prices.", vbExclamation Or vbOKOnly, "Error"
Exit Sub
Else
Dim i As Long, cntEmpty As Long: cntEmpty = 0
rngSel.Columns.EntireColumn.NumberFormat = "@"
With rngSel.Cells
For i = 1 To .Count
.Item(i).Value = CStr(.Item(i).Value)
If Len(.Item(i).Value) = 0 Then
cntEmpty = cntEmpty + 1
Else
cntEmpty = 0
End If
If cntEmpty > 10 Then Exit For
Next
End With
MsgBox "Column is updated.", vbInformation Or vbOKOnly, "Info"
End If
End Sub
Здравствуйте, Аноним, Вы писали:
А>Я вижу два пути: 1 — попытаться как-то в SQL-запросе что-то такое написать, чтобы все данные в строку конвертились, но этого мне пока сделать не удалось в силу того, что запрос к xcl-файлу своеобразный и отличается от обычного запроса;
А>2 — попытаться воспользоваться OleDbDataReader-ом, пока не пробовал
Сталкивался с такой ерундой — решается очень просто. Надо добавить к свойствам строки коннекта параметр MaxScanRows=0. То есть строка коннекта выглядит примерно так:
private string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%FILEPATH%;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1;MaxScanRows=0"""
Здравствуйте, Аноним, Вы писали:
А>Как можно работать с excell-ем из C#? в частности интересует как можно из excell-файла вытащить из каждой закладки DataTable с данными?
у нас классная статейка есть, на
http://www.pfsoft.com/new/book1.html