Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг Excel 
V
    Опции темы
Beltar
Дата 18.3.2008, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: нет
Всего: 7



Возможно, имеет смысл накидать простейшую софтину в Delphi\Builder\VS в которой просто открывать файл и указывать самому какие столбцы и с какой строчки импортировать и в какое поле БД. И пусть эта софтина все в базу кидает. Может этот процесс займет несколько минут, но ведь вы явно не по 50 файлов в день получаете. А пытаться все предусмотреть в том числе как будет названо поле с названием товара, например, "товар", "наименование" или даже "название фильма", если торгуете DVD-дисками, нереально.
Импорт в сам Excel текстовых файлов сделан именно так.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Magnifico
Дата 18.3.2008, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 10
Всего: 17



есть еще опции HDR=Yes;IMEX=1;

http://connectionstrings.com/?carrier=excel

"HDR=Yes; считает первую строку заголовком полей
"IMEX=1;" интерпретирует данные как текст


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Magnifico
Дата 18.3.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 10
Всего: 17



используй лучше оле дб он покорректней работает

Код

select * 
from openrowset('Microsoft.Jet.OLEDB.4.0'
, 'Excel 8.0; HDR=YES; IMEX=1;Database=C:\my.xls'
, [sheet1$])


Select *
FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', 'Data Source=C:\my.xls;
Extended Properties="Excel 8.0;HDR=Yes;"')...[sheet1$]



--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Itsys
Дата 18.3.2008, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



Сработало!!!!


Beltar, Обработка на perl уже написана, толь проблема в том, что грузится очень долго, вот и ищу возможность быстрее обработать данные.
PM MAIL WWW Skype   Вверх
Itsys
Дата 19.3.2008, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



Только обрадовался.... по условию я не знаю название листа, и мне надо выбрать первый из существующих. Как указать не название листа sheet1$, а его порядковый номер?
PM MAIL WWW Skype   Вверх
Magnifico
Дата 19.3.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 10
Всего: 17




Код

Sub ПеребратьИменаЛистов()
Dim XLSFile As String
Dim i As Integer
i = 1
XLSFile = "C:\files\namesw.xls"

Workbooks.Open XLSFile

Dim ws As Worksheet
For Each ws In Worksheets
    
    MsgBox "Имя " & i & " -го листа: " & ws.Name 
     
    Debug.Print "Имя " & i & " -го листа: " & ws.Name
     i = i + 1
Next ws
End Sub




--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Itsys
Дата 19.3.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



Вопрос только в том, как это запустить, а потом еще и желательнов запрос передать... мне сами именя листов не нужны, мне надо выбирать данные из первого листа в файле, может можно это как-нибудь задать не перебирая с помощью VB файл?

И так
Код

select * 
from openrowset('Microsoft.Jet.OLEDB.4.0'
, 'Excel 8.0; HDR=YES; IMEX=1;Database=C:\my.xls'
, [1])


и так
Код

select * 
from openrowset('Microsoft.Jet.OLEDB.4.0'
, 'Excel 8.0; HDR=YES; IMEX=1;Database=C:\my.xls'
, [sheet[1]$])

пробовал...
PM MAIL WWW Skype   Вверх
Magnifico
Дата 19.3.2008, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 10
Всего: 17



Цитата

Вопрос только в том, как это запустить

excel   -> (alt + F11)(Редактор VB) - > insert ->module ->копироватьКодСюда ->правим пути в коде ->RUN

Ole automation это единственный способ добраться к свойствам и методам Эксель
Все языки программирования интегрируются с Эксель именно  так, (и ничего другого кроме вышеприведенного кода не придумаешь)

Никаким запросом имена листов узнать невозможно
Эксель не база данных ,и нет возможности получить Информационную схему

Цитата

желательно в запрос передать

Если хочешь помучиться в 2000 есть расширенные хранимые процедуры на c++ (Visual Studio 6  )
(у меня на с++ "аллергия")

В БОЛЕ набрать OLE Automation там есть какие то методы работы , можно вызывать VBA методы и св-ва  (не разбирался) 
ищи хороший пример 

Или писать прогу на любом языке ,опять же интеграция с Эксель(код вверху)
подключение к sql server ->  передача параметров из встроенного VBA  в  хранимую процедуру (с openrowsetoM) 

Цитата

мне надо выбирать данные из первого листа в файле

Вот из за этой казалось мелочи придется сильно помучиться (от Vba не убежишь)


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Itsys
Дата 19.3.2008, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



В общем решил я отказаться от этой затеи, т.к. срорее всего никакого убыстрения по сравнению с существующей обработкой на Perl я не получу.

Еще раз спасибо.
PM MAIL WWW Skype   Вверх
Magnifico
Дата 19.3.2008, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 10
Всего: 17



в 2005 это работает:

Код

declare @file_name varchar(255), @h_application int, @hr int,@h_workbook int ,
@data varchar(255),@source varchar(255),@description varchar(255)

set @file_name = 'c:\files\serge.xls'

exec @hr = sp_OACreate 'Excel.Application', @h_application OUT

exec @hr = sp_OAMethod @h_application, 'Application.workbooks.Open', @h_workbook OUT , @file_name 
exec @hr = sp_OAGetProperty @h_application, 'Workbooks(1).Sheets(1).Name', @data OUT

SELECT @data as [dat]
exec sp_OAMethod @h_application, 'Quit'
exec @hr=sp_OADestroy @h_application

--set @data ='NewSheet1';

declare @SQL  nvarchar(4000)
set @SQL = 
'SELECT * FROM OPENROWSET(''Microsoft.Jet.OLEDB.4.0''' +','+'''Excel 8.0;HDR=Yes;IMEX=1;Database=C:\files\serge.xls'''+','+ '''Select * From ['+ @data +'$]'')'

exec(@sql)



--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Itsys
Дата 19.3.2008, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



Код

[quote=Magnifico, 19.3.2008,  23:11, post1447877]declare @file_name varchar(255), @h_application int, @hr int,@h_workbook int ,
@data varchar(255),@source varchar(255),@description varchar(255)

set @file_name = 'c:\files\serge.xls'

exec @hr = sp_OACreate 'Excel.Application', @h_application OUT

exec @hr = sp_OAMethod @h_application, 'Application.workbooks.Open', @h_workbook OUT , @file_name 
exec @hr = sp_OAGetProperty @h_application, 'Workbooks(1).Sheets(1).Name', @data OUT

SELECT @data as [dat]
exec sp_OAMethod @h_application, 'Quit'
exec @hr=sp_OADestroy @h_applicatio[/quote]


Насколько я понимаю, это все работает не очень быстро  smile 
PM MAIL WWW Skype   Вверх
Magnifico
  Дата 20.3.2008, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 10
Всего: 17



Это работает мгновенно! 
Получить имя первого листа  первой открытой книги- какая же здесь может быть нагрузка

Код

exec @hr = sp_OAGetProperty @h_application, 'Workbooks(1).Sheets(1).Name', @data OUT


я просто незнаю будет ли работать в 2000?

Что то ты рано сдался! Это то что доктор прописал !!!!!!!!!!!!!!!!

Одна тонкость Workbooks(1).Sheets(1).Name   -мы получаем имя первого листа  первой открытой книги,если будет открыта другая книга,
допустим локально , а потом будет выполнен этот запрос -то  подхватит именно эту книгу ,а
Код

exec @hr = sp_OAMethod @h_application, 'Application.workbooks.Open', @h_workbook OUT , @file_name

будет уже второй...
Из этого следует лучше обращаться к книге по имени (надюсь её название хотя бы известно или тоже скрипт писать ,перебирая все 
эксель файлы?  smile  )

Код

Workbooks("Names.xls").Sheets(1).Name


в 2000  OLE Automation должно как то включаться (поиск)


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Itsys
Дата 20.3.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 1
Всего: 34



Ну попробую.... насколько я знаю, OLE в принципе не самый быстрый способ, т.к. при его использовании загружается приложение сервер - это раз, считывается в память файл - это два и только потом можно из него чего-нибудь получить.
PM MAIL WWW Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.