> Как можно работать с excell-ем из C#? в частности интересует как > можно из excell-файла вытащить из каждой закладки DataTable с > данными?
Как идею могу предложить решение на VB:
Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
Dim dset As New DataSet
Dim cmd1 As New System.Data.OleDb.OleDbCommand
Dim dadp As New System.Data.OleDb.OleDbDataAdapter
Dim dtbl As System.Data.DataTable = GetTables(ConExcelOleDb(TextBox1.Text))
For Each drow As DataRow In dtbl.Rows
Dim TabName As String = drow!Table_Name
With cmd1
.Connection = ConExcelOleDb(TextBox1.Text)
.CommandType = CommandType.Text
.CommandText = "SELECT * FROM [" & TabName & "]"
End With
With dadp
.SelectCommand = cmd1
Try
.Fill(dset, TabName)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End With
Next
DataGrid1.DataSource = dset
End Sub
Function ConExcelOleDb(ByVal strTextPath As String) As System.Data.OleDb.OleDbConnection
cnn = New System.Data.OleDb.OleDbConnection
Dim cmd1 As New System.Data.OleDb.OleDbCommand
Dim dadp As New System.Data.OleDb.OleDbDataAdapter
Dim dtbl As New System.Data.DataTable
With cnn
.ConnectionString = "provider=microsoft.jet.oledb.4.0;"
.ConnectionString &= "data source=" & strTextPath & ";"
.ConnectionString &= "Extended Properties = ""Excel 8.0"";"
End With
Return cnn
End Function
Public Function GetTables(ByVal conn As System.Data.OleDb.OleDbConnection) As System.Data.DataTable
Dim schemaTable As System.Data.DataTable
If conn Is Nothing Then
Return Nothing
End If
With conn
Try
If .State = ConnectionState.Closed Then .Open()
schemaTable = _
.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, _
New Object() {Nothing, Nothing, Nothing, "TABLE"})
.Close()
Return schemaTable
Catch ex As Exception
MessageBox.Show(ex.ToString)
Return Nothing
End Try
End With
End Function
Peter
Posted via RSDN NNTP Server 1.8
Re[2]: Работа с excell-ем из .NET
От:
Аноним
Дата:
10.06.04 09:01
Оценка:
Здравствуйте, Peter Fleischer, Вы писали:
Вобщем, данные удалось дастать через OledbConnection, как вы и писали, сначала возникла проблема смешения названия колонок и данных, то есть одни колонки назывались как им и положено F# (F с номером), а в наименования других запихивались почему-то данные из первой строки данных, но это удалось побороть добавлением в connectionString HDR=NO, то есть теперь connectionString имеет вид —
"Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + filePath + "; Jet OLEDB:Engine Type=5;"+
"Extended Properties=\"Excel 8.0;HDR=NO\""
Но теперь новая проблема открылась, данные из некоторой колонки пропадают и на их месте null, данные имеющие следующий вид
<--9166930615 остаются, а данные 89166316223 превращаются в DataTable в null, вопрос в том, как заставить считывать абсолютно все значения из любых колонок как строку? потому что есть подозрение, что OleDbDataAdapter при заполнении таблицы как-то некорректно их приводит к какому-то типу, который сам же и определеят
?????
Добавив в Reference соответствующий com-объект, что-то там Microsoft.Office object library,
увидишь неймспейс Microsoft.Office.Interop.Excel, далее можно делать все следуя VBA-шному API
Здравствуйте, Аноним, Вы писали:
А>Как можно работать с excell-ем из C#? в частности интересует как можно из excell-файла вытащить из каждой закладки DataTable с данными?
Попробуйте в ячейке, где пишется выбранное поле таблицы (A1 и е.д.) набрать слово (будет имя табл. в DataSet)
После набора должна выделиться вся таблица. Потом я делал DSN (Data Source Name из Administrative Tools) для текущего файла xsl. Затем создавайте Сonnection из сгенерированного DSN и вперёд. В Server Explorer увидите Таблицу.
Re[3]: Работа с excell-ем из .NET
От:
Аноним
Дата:
10.06.04 10:15
Оценка:
Здравствуйте, komaz, Вы писали:
K>Добавив в Reference соответствующий com-объект, что-то там Microsoft.Office object library, K>увидишь неймспейс Microsoft.Office.Interop.Excel, далее можно делать все следуя VBA-шному API
Зачем добалять Com, если я данные можно импортировать используя oleDB? у меняпроблема только с неправильной интерпритацией некоторых данных из ячеек, которые превоащаются в null, здесь мне com не поможет
komaz wrote: > Добавив в Reference соответствующий com-объект, что-то там > Microsoft.Office object library, увидишь неймспейс > Microsoft.Office.Interop.Excel, далее можно делать все следуя > VBA-шному API
> Здравствуйте, Peter Fleischer, Вы писали:
... > Но теперь новая проблема открылась, данные из некоторой колонки > пропадают и на их месте null, данные имеющие следующий вид > <--9166930615 остаются, а данные 89166316223 превращаются в DataTable > в null, вопрос в том, как заставить считывать абсолютно все значения > из любых колонок как строку? потому что есть подозрение, что > OleDbDataAdapter при заполнении таблицы как-то некорректно их > приводит к какому-то типу, который сам же и определеят ?????
Это нормально, когда информация в таблицах неоднородная. Jet определяет тип столбца на основании первых ячеек столбца. Если ниже появляется содержание, не подвергающее безошибочным преборазованием, то просто пишется DBNull. Есле тебе это не нравится, то надо идти другими путями. Какими, звависит от общего решения и требуемых преобразований.
Peter
Posted via RSDN NNTP Server 1.8
Re[4]: Работа с excell-ем из .NET
От:
Аноним
Дата:
10.06.04 11:00
Оценка:
Здравствуйте, Peter Fleischer, Вы писали:
PF>Это нормально, когда информация в таблицах неоднородная. Jet определяет тип столбца на основании первых ячеек столбца. Если ниже появляется содержание, не подвергающее безошибочным преборазованием, то просто пишется DBNull. Есле тебе это не нравится, то надо идти другими путями. Какими, звависит от общего решения и требуемых преобразований.
PF>Peter
Я вижу два пути: 1 — попытаться как-то в SQL-запросе что-то такое написать, чтобы все данные в строку конвертились, но этого мне пока сделать не удалось в силу того, что запрос к xcl-файлу своеобразный и отличается от обычного запроса;
2 — попытаться воспользоваться OleDbDataReader-ом, пока не пробовал
Re[5]: Работа с excell-ем из .NET
От:
Аноним
Дата:
10.06.04 11:03
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Peter Fleischer, Вы писали:
PF>>Это нормально, когда информация в таблицах неоднородная. Jet определяет тип столбца на основании первых ячеек столбца. Если ниже появляется содержание, не подвергающее безошибочным преборазованием, то просто пишется DBNull. Есле тебе это не нравится, то надо идти другими путями. Какими, звависит от общего решения и требуемых преобразований.
PF>>Peter А>Я вижу два пути: 1 — попытаться как-то в SQL-запросе что-то такое написать, чтобы все данные в строку конвертились, но этого мне пока сделать не удалось в силу того, что запрос к xcl-файлу своеобразный и отличается от обычного запроса; А>2 — попытаться воспользоваться OleDbDataReader-ом, пока не пробовал
сорри, xls-файл конечно же
Re[5]: Работа с excell-ем из .NET
От:
Аноним
Дата:
10.06.04 13:53
Оценка:
Здравствуйте, Аноним, Вы писали:
A>Я вижу два пути: 1 — попытаться как-то в SQL-запросе что-то такое написать, чтобы все данные в строку конвертились, но этого мне пока сделать не удалось в силу того, что запрос к xcl-файлу своеобразный и отличается от обычного запроса; А>2 — попытаться воспользоваться OleDbDataReader-ом, пока не пробовал
Короче говоря, OleDbDataReader тоже не помог, данные из колонки, которые проподают, сразу после вызова reader.Read() равны dbNull, как это побороть не знаю, вобщем для нормального считывания данных из xsl-файла необходимо чтобы данные в ячейках одной колонки были однородными, если это условие не выполняется, то данные некоторого типа, не соответствующего типу колонки (а тип колонки определяется исходя не понятно из чего, даже не по данным, хранящимся в первой ячейке колонки, это проверялось ), превращаются в dbNull
Здравствуйте, <Аноним>, Вы писали:
А>Короче говоря, OleDbDataReader тоже не помог, данные из колонки, которые проподают, сразу после вызова reader.Read() равны dbNull, как это побороть не знаю, вобщем для нормального считывания данных из xsl-файла необходимо чтобы данные в ячейках одной колонки были однородными, если это условие не выполняется, то данные некоторого типа, не соответствующего типу колонки (а тип колонки определяется исходя не понятно из чего, даже не по данным, хранящимся в первой ячейке колонки, это проверялось ), превращаются в dbNull
Поищи по форуму — уже проскакивало, что для корректной работы с файлами Excel'я надо использовать автоматизацию Excel'я (делать на него ссылку, и потом использовать его методы). Медленно, зато все данные воспринимаются корректно, чего иной раз не происходит при использовании ADO.NET, Ole Db и пр.
... << Rsdn@Home 1.1.4 beta 1 >>
Re[7]: Работа с excell-ем из .NET
От:
Аноним
Дата:
11.06.04 13:03
Оценка:
Здравствуйте, Ved, Вы писали:
Ved>Здравствуйте, <Аноним>, Вы писали: Ved>Поищи по форуму — уже проскакивало, что для корректной работы с файлами Excel'я надо использовать автоматизацию Excel'я (делать на него ссылку, и потом использовать его методы). Медленно, зато все данные воспринимаются корректно, чего иной раз не происходит при использовании ADO.NET, Ole Db и пр.
это понятно, но не хотелось для несчастного импорта данных из файла использовать автоматизацию, это громоздко, долго, плюс привязка к excel-ю, то есть будет требоваться наличие установленного excel-я на машине
Здравствуйте, Аноним, Вы писали:
А>Как можно работать с excell-ем из C#? в частности интересует как можно из excell-файла вытащить из каждой закладки DataTable с данными?
я делаю примерно так.
Здравствуйте, <Аноним>, Вы писали:
А>Здравствуйте, Ved, Вы писали:
Ved>>Здравствуйте, <Аноним>, Вы писали: Ved>>Поищи по форуму — уже проскакивало, что для корректной работы с файлами Excel'я надо использовать автоматизацию Excel'я (делать на него ссылку, и потом использовать его методы). Медленно, зато все данные воспринимаются корректно, чего иной раз не происходит при использовании ADO.NET, Ole Db и пр.
А>это понятно, но не хотелось для несчастного импорта данных из файла использовать автоматизацию, это громоздко, долго, плюс привязка к excel-ю, то есть будет требоваться наличие установленного excel-я на машине
Мне тоже в свое время не хотелось, но как понадобилось импортировать прайсы всякие, то уж лучше медленно, чем с потерей большинства данных. Есть конечно еще метод, но это уж слишком — брать и писать свой парсер XLS-файлов...
Здравствуйте, Ved, Вы писали:
Ved>Здравствуйте, <Аноним>, Вы писали:
Ved>Мне тоже в свое время не хотелось, но как понадобилось импортировать прайсы всякие, то уж лучше медленно, чем с потерей большинства данных. Есть конечно еще метод, но это уж слишком — брать и писать свой парсер XLS-файлов...
смотрите Syncfusion.ExcelRw
это отдельная либа — работает без наличия екселя на машине. Умеет почти все что умеет ексель... правда цена оставляет желать лучшего...
> Здравствуйте, Peter Fleischer, Вы писали:
... > Я вижу два пути: 1 — попытаться как-то в SQL-запросе что-то такое > написать, чтобы все данные в строку конвертились, но этого мне пока > сделать не удалось в силу того, что запрос к xcl-файлу своеобразный и > отличается от обычного запроса; 2 — попытаться воспользоваться > OleDbDataReader-ом, пока не пробовал
В SQL-запросы ты ничего не можешь делать.
OleDbDataReader тебе тоже не поможет.
Проблема в том, что Jet должна определить тип результирующего столбца. В екселе такой информации нет, поэтому Jet старается определить из первого найденного содержания тип столбца. Программно там никак нельзя воздействовать.
Если нельзя представить "чистые" таблицы, то имеются только два выхода: автоматизация Excel или представление таблицы в виде csv-file с последующей загрузкой в DataTable при использовании schema.ini. В обоих случаях можно брать содержание клетки как String и потом на собственное усмотрение проебразовать.
> Здравствуйте, Ved, Вы писали:
... > это понятно, но не хотелось для несчастного импорта данных из файла > использовать автоматизацию, это громоздко, долго, плюс привязка к > excel-ю, то есть будет требоваться наличие установленного excel-я на > машине
Тогда остается только путь через csv-file и schema.ini.
Здравствуйте, Аноним, Вы писали:
А>Зачем добалять Com, если я данные можно импортировать используя oleDB? у меняпроблема только с неправильной интерпритацией некоторых данных из ячеек, которые превоащаются в null, здесь мне com не поможет
F зачем вообще мучиться с Excel'ными файлами? Из предыдущего можно понять, что эти файлы приносятся откуда-то. В том числе на машины, на которых Excel нет. Тогда уж лучше приносить данные в каком-нить нормальном формате — CSV, XML и т.п.
А набитые руками (или без учёта типов данных) таблицы Excel при помощи OleDb импортировать нормально таки не получится. Только через COM.
Re[6]: Работа с excell-ем из .NET
От:
Аноним
Дата:
17.06.04 07:08
Оценка:
Здравствуйте, Peter Fleischer, Вы писали:
PF>Если нельзя представить "чистые" таблицы, то имеются только два выхода: автоматизация Excel или представление таблицы в виде csv-file с последующей загрузкой в DataTable при использовании schema.ini. В обоих случаях можно брать содержание клетки как String и потом на собственное усмотрение проебразовать.
а можно как-то по подробнее об schema.ini? что это такое? и как оным пользоваться?
Re[2]: Работа с excell-ем из .NET
От:
Аноним
Дата:
17.06.04 07:11
Оценка:
Здравствуйте, Ransom Stark, Вы писали:
RS>Здравствуйте, Аноним, Вы писали:
А>>Как можно работать с excell-ем из C#? в частности интересует как можно из excell-файла вытащить из каждой закладки DataTable с данными? RS>я делаю примерно так. RS>
можно-то можно, так и делается, только данные не всегда правильно интерпретируются, о чем собсно выше и написано
плюс данный код можно упростить, так как нет необходимости создавать DataSet в adapter.Fill можно и DataTable передавать
> Здравствуйте, Peter Fleischer, Вы писали: > > PF>Если нельзя представить "чистые" таблицы, то имеются только два > выхода: автоматизация Excel или представление таблицы в виде csv-file > с последующей загрузкой в DataTable при использовании schema.ini. В > обоих случаях можно брать содержание клетки как String и потом на > собственное усмотрение проебразовать. > > а можно как-то по подробнее об schema.ini? что это такое? и как оным > пользоваться?
в schema.ini можешь описать каждый столбец для импорта. Если используешь только текст, то потом сам можешь в своей программе "читсить" данные.
Peter
Posted via RSDN NNTP Server 1.8
Re[8]: Работа с excell-ем из .NET
От:
Аноним
Дата:
17.06.04 08:58
Оценка:
Здравствуйте, 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
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 Fleischer, Вы писали:
>> Здравствуйте, Peter Fleischer, Вы писали: PF>... >> Я вижу два пути: 1 — попытаться как-то в SQL-запросе что-то такое >> написать, чтобы все данные в строку конвертились, но этого мне пока >> сделать не удалось в силу того, что запрос к xcl-файлу своеобразный и >> отличается от обычного запроса; 2 — попытаться воспользоваться >> OleDbDataReader-ом, пока не пробовал
Установка локали мне в основном помогла, но часть функций всёравно бросала такой же 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"
Здравствуйте, Аноним, Вы писали:
А>Я вижу два пути: 1 — попытаться как-то в SQL-запросе что-то такое написать, чтобы все данные в строку конвертились, но этого мне пока сделать не удалось в силу того, что запрос к xcl-файлу своеобразный и отличается от обычного запроса; А>2 — попытаться воспользоваться OleDbDataReader-ом, пока не пробовал
Сталкивался с такой ерундой — решается очень просто. Надо добавить к свойствам строки коннекта параметр MaxScanRows=0. То есть строка коннекта выглядит примерно так:
Здравствуйте, Аноним, Вы писали:
А>Как можно работать с excell-ем из C#? в частности интересует как можно из excell-файла вытащить из каждой закладки DataTable с данными?
у нас классная статейка есть, на http://www.pfsoft.com/new/book1.html