> Как можно работать с 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? что это такое? и как оным пользоваться?